Add support for the manifest checks in analyzer_cli

Change-Id: I8d2670cca509cf2229f5475e355e3b85b1ca2f30
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/99220
Commit-Queue: Keerti Parthasarathy <keertip@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index 7e910dc..44e1838 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -24,6 +24,7 @@
 import 'package:analyzer/src/generated/utilities_general.dart'
     show PerformanceTag;
 import 'package:analyzer/src/plugin/resolver_provider.dart';
+import 'package:analyzer/src/manifest/manifest_validator.dart';
 import 'package:analyzer/src/pubspec/pubspec_validator.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/source/path_filter.dart';
@@ -378,6 +379,25 @@
           } catch (exception) {
             // If the file cannot be analyzed, ignore it.
           }
+        } else if (shortName == AnalysisEngine.ANDROID_MANIFEST_FILE) {
+          try {
+            File file = resourceProvider.getFile(path);
+            String content = file.readAsStringSync();
+            ManifestValidator validator =
+                new ManifestValidator(file.createSource());
+            LineInfo lineInfo = new LineInfo.fromContent(content);
+            List<AnalysisError> errors = validator.validate(
+                content, analysisDriver.analysisOptions.chromeOsManifestChecks);
+            formatter
+                .formatErrors([new AnalysisErrorInfoImpl(errors, lineInfo)]);
+            for (AnalysisError error in errors) {
+              ErrorSeverity severity = determineProcessedSeverity(
+                  error, options, analysisDriver.analysisOptions);
+              allResult = allResult.max(severity);
+            }
+          } catch (exception) {
+            // If the file cannot be analyzed, ignore it.
+          }
         } else {
           dartFiles.add(path);
           var file = analysisDriver.fsState.getFileForPath(path);
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index aa44888..385f323 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -806,6 +806,32 @@
       expect(exitCode, 0);
     });
   }
+
+  test_manifestFileChecks() async {
+    await withTempDirAsync((tempDir) async {
+      String filePath =
+          path.join(tempDir, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
+      new File(filePath).writeAsStringSync('''
+analyzer:
+  optional-checks:
+    chrome-os-manifest-checks: true
+''');
+      String manifestPath =
+          path.join(tempDir, AnalysisEngine.ANDROID_MANIFEST_FILE);
+      new File(manifestPath).writeAsStringSync('''
+<manifest
+    xmlns:android="http://schemas.android.com/apk/res/android">
+    <uses-feature android:name="android.software.home_screen" />
+</manifest>
+''');
+      await drive(manifestPath, options: filePath);
+      expect(
+          bulletToDash(outSink),
+          contains(
+              "warning - This hardware feature is not supported on Chrome OS"));
+      expect(exitCode, 0);
+    });
+  }
 }
 
 @reflectiveTest