Version 1.22.0-dev.10.4

Cherry-pick 955a45b06ed7c512142ec4979f24ffd64b5eaa0b into dev
Cherry-pick 167107e94c7b02272f1e316d4d06c9c66b9a6bbe into dev
diff --git a/DEPS b/DEPS
index bdfb97e..156d98c 100644
--- a/DEPS
+++ b/DEPS
@@ -59,7 +59,7 @@
   "csslib_tag" : "@0.13.2",
   "dart2js_info_tag" : "@0.5.0",
   "dart_services_rev" : "@7aea2574e6f3924bf409a80afb8ad52aa2be4f97",
-  "dart_style_tag": "@0.2.15",
+  "dart_style_tag": "@0.2.16",
   "dartdoc_tag" : "@v0.9.8+1",
   "fixnum_tag": "@0.10.5",
   "func_tag": "@0.1.0",
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index e77699f..cab1e4c 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -33,7 +33,6 @@
 import 'package:analyzer/src/generated/utilities_general.dart'
     show PerformanceTag;
 import 'package:analyzer/src/lint/registry.dart';
-import 'package:analyzer/src/services/lint.dart';
 import 'package:analyzer/src/source/source_resource.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
@@ -361,25 +360,30 @@
   /// Decide on the appropriate method for resolving URIs based on the given
   /// [options] and [customUrlMappings] settings, and return a
   /// [SourceFactory] that has been configured accordingly.
+  /// When [includeSdkResolver] is `false`, return a temporary [SourceFactory]
+  /// for the purpose of resolved analysis options file `include:` directives.
+  /// In this situation, [analysisOptions] is ignored and can be `null`.
   SourceFactory _chooseUriResolutionPolicy(
       CommandLineOptions options,
       Map<file_system.Folder, YamlMap> embedderMap,
       _PackageInfo packageInfo,
-      SummaryDataStore summaryDataStore) {
+      SummaryDataStore summaryDataStore,
+      bool includeSdkResolver,
+      AnalysisOptions analysisOptions) {
     // Create a custom package resolver if one has been specified.
     if (packageResolverProvider != null) {
       file_system.Folder folder = resourceProvider.getResource('.');
       UriResolver resolver = packageResolverProvider(folder);
       if (resolver != null) {
-        UriResolver sdkResolver = new DartUriResolver(sdk);
-
         // TODO(brianwilkerson) This doesn't handle sdk extensions.
-        List<UriResolver> resolvers = <UriResolver>[
-          sdkResolver,
-          new InSummaryUriResolver(resourceProvider, summaryDataStore),
-          resolver,
-          new file_system.ResourceUriResolver(resourceProvider)
-        ];
+        List<UriResolver> resolvers = <UriResolver>[];
+        if (includeSdkResolver) {
+          resolvers.add(new DartUriResolver(sdk));
+        }
+        resolvers
+            .add(new InSummaryUriResolver(resourceProvider, summaryDataStore));
+        resolvers.add(resolver);
+        resolvers.add(new file_system.ResourceUriResolver(resourceProvider));
         return new SourceFactory(resolvers);
       }
     }
@@ -421,16 +425,18 @@
     // 'dart:' URIs come first.
 
     // Setup embedding.
-    EmbedderSdk embedderSdk = new EmbedderSdk(resourceProvider, embedderMap);
-    if (embedderSdk.libraryMap.size() == 0) {
-      // The embedder uri resolver has no mappings. Use the default Dart SDK
-      // uri resolver.
-      resolvers.add(new DartUriResolver(sdk));
-    } else {
-      // The embedder uri resolver has mappings, use it instead of the default
-      // Dart SDK uri resolver.
-      embedderSdk.analysisOptions = _context.analysisOptions;
-      resolvers.add(new DartUriResolver(embedderSdk));
+    if (includeSdkResolver) {
+      EmbedderSdk embedderSdk = new EmbedderSdk(resourceProvider, embedderMap);
+      if (embedderSdk.libraryMap.size() == 0) {
+        // The embedder uri resolver has no mappings. Use the default Dart SDK
+        // uri resolver.
+        resolvers.add(new DartUriResolver(sdk));
+      } else {
+        // The embedder uri resolver has mappings, use it instead of the default
+        // Dart SDK uri resolver.
+        embedderSdk.analysisOptions = analysisOptions;
+        resolvers.add(new DartUriResolver(embedderSdk));
+      }
     }
 
     // Next SdkExts.
@@ -506,9 +512,6 @@
       _analyzedFileCount += _context.sources.length;
     }
 
-    // Create a context.
-    _context = AnalysisEngine.instance.createAnalysisContext();
-
     // Find package info.
     _PackageInfo packageInfo = _findPackages(options);
 
@@ -531,8 +534,18 @@
     SummaryDataStore summaryDataStore = new SummaryDataStore(
         useSummaries ? options.buildSummaryInputs : <String>[]);
 
+    // Create a temporary source factory without an SDK resolver
+    // for resolving "include:" directives in analysis options files.
+    SourceFactory tempSourceFactory = _chooseUriResolutionPolicy(
+        options, embedderMap, packageInfo, summaryDataStore, false, null);
+
+    AnalysisOptionsImpl analysisOptions =
+        createAnalysisOptions(resourceProvider, tempSourceFactory, options);
+    analysisOptions.analyzeFunctionBodiesPredicate =
+        _chooseDietParsingPolicy(options);
+
     // Once options and embedders are processed, setup the SDK.
-    _setupSdk(options, useSummaries);
+    _setupSdk(options, useSummaries, analysisOptions);
 
     PackageBundle sdkBundle = sdk.getLinkedBundle();
     if (sdkBundle != null) {
@@ -541,17 +554,12 @@
 
     // Choose a package resolution policy and a diet parsing policy based on
     // the command-line options.
-    SourceFactory sourceFactory = _chooseUriResolutionPolicy(
-        options, embedderMap, packageInfo, summaryDataStore);
+    SourceFactory sourceFactory = _chooseUriResolutionPolicy(options,
+        embedderMap, packageInfo, summaryDataStore, true, analysisOptions);
 
-    AnalyzeFunctionBodiesPredicate dietParsingPolicy =
-        _chooseDietParsingPolicy(options);
-    setAnalysisContextOptions(
-        resourceProvider, sourceFactory, _context, options,
-        (AnalysisOptionsImpl contextOptions) {
-      contextOptions.analyzeFunctionBodiesPredicate = dietParsingPolicy;
-    });
-
+    // Create a context.
+    _context = AnalysisEngine.instance.createAnalysisContext();
+    setupAnalysisContext(_context, options, analysisOptions);
     _context.sourceFactory = sourceFactory;
 
     if (options.enableNewAnalysisDriver) {
@@ -683,7 +691,8 @@
     return errorSeverity;
   }
 
-  void _setupSdk(CommandLineOptions options, bool useSummaries) {
+  void _setupSdk(CommandLineOptions options, bool useSummaries,
+      AnalysisOptions analysisOptions) {
     if (sdk == null) {
       if (options.dartSdkSummaryPath != null) {
         sdk = new SummaryBasedDartSdk(
@@ -698,8 +707,7 @@
               sourcePath = path.normalize(sourcePath);
               return !path.isWithin(dartSdkPath, sourcePath);
             });
-
-        dartSdk.analysisOptions = context.analysisOptions;
+        dartSdk.analysisOptions = analysisOptions;
         sdk = dartSdk;
       }
     }
@@ -722,12 +730,34 @@
     return contextOptions;
   }
 
+  static AnalysisOptionsImpl createAnalysisOptions(
+      file_system.ResourceProvider resourceProvider,
+      SourceFactory sourceFactory,
+      CommandLineOptions options) {
+    // Prepare context options.
+    AnalysisOptionsImpl analysisOptions =
+        createAnalysisOptionsForCommandLineOptions(options);
+
+    // Process analysis options file (and notify all interested parties).
+    _processAnalysisOptions(
+        resourceProvider, sourceFactory, analysisOptions, options);
+    return analysisOptions;
+  }
+
   static void setAnalysisContextOptions(
       file_system.ResourceProvider resourceProvider,
       SourceFactory sourceFactory,
       AnalysisContext context,
       CommandLineOptions options,
       void configureContextOptions(AnalysisOptionsImpl contextOptions)) {
+    AnalysisOptionsImpl analysisOptions =
+        createAnalysisOptions(resourceProvider, sourceFactory, options);
+    configureContextOptions(analysisOptions);
+    setupAnalysisContext(context, options, analysisOptions);
+  }
+
+  static void setupAnalysisContext(AnalysisContext context,
+      CommandLineOptions options, AnalysisOptionsImpl analysisOptions) {
     Map<String, String> definedVariables = options.definedVariables;
     if (definedVariables.isNotEmpty) {
       DeclaredVariables declaredVariables = context.declaredVariables;
@@ -740,16 +770,8 @@
       AnalysisEngine.instance.logger = new StdLogger();
     }
 
-    // Prepare context options.
-    AnalysisOptionsImpl contextOptions =
-        createAnalysisOptionsForCommandLineOptions(options);
-    configureContextOptions(contextOptions);
-
     // Set context options.
-    context.analysisOptions = contextOptions;
-
-    // Process analysis options file (and notify all interested parties).
-    _processAnalysisOptions(resourceProvider, sourceFactory, context, options);
+    context.analysisOptions = analysisOptions;
   }
 
   /// Perform a deep comparison of two string lists.
@@ -807,7 +829,7 @@
   static void _processAnalysisOptions(
       file_system.ResourceProvider resourceProvider,
       SourceFactory sourceFactory,
-      AnalysisContext context,
+      AnalysisOptionsImpl analysisOptions,
       CommandLineOptions options) {
     file_system.File file = _getOptionsFile(resourceProvider, options);
 
@@ -819,12 +841,12 @@
     // Fill in lint rule defaults in case lints are enabled and rules are
     // not specified in an options file.
     if (options.lints && !containsLintRuleEntry(optionMap)) {
-      setLints(context, Registry.ruleRegistry.defaultRules);
+      analysisOptions.lintRules = Registry.ruleRegistry.defaultRules;
     }
 
     // Ask engine to further process options.
     if (optionMap != null) {
-      applyToAnalysisOptions(context.analysisOptions, optionMap);
+      applyToAnalysisOptions(analysisOptions, optionMap);
     }
   }
 }
diff --git a/pkg/analyzer_cli/test/data/strong_sdk/main.dart b/pkg/analyzer_cli/test/data/strong_sdk/main.dart
new file mode 100644
index 0000000..34b0c4c
--- /dev/null
+++ b/pkg/analyzer_cli/test/data/strong_sdk/main.dart
@@ -0,0 +1,7 @@
+import 'dart:js';
+
+typedef dynamic Func(String x, String y);
+
+Func bar(Func f) {
+  return allowInterop(f);
+}
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index ca07498..0a379c4 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -322,6 +322,14 @@
         expect(outSink.toString(), contains('isn\'t defined'));
         expect(outSink.toString(), contains('Avoid empty else statements.'));
       });
+
+      test('test strong SDK', () async {
+        String testDir = path.join(testDirectory, 'data', 'strong_sdk');
+        await drive(path.join(testDir, 'main.dart'), args: ['--strong']);
+        expect(driver.context.analysisOptions.strongMode, isTrue);
+        expect(outSink.toString(), contains('No issues found'));
+        expect(exitCode, 0);
+      });
     });
 
     void createTests(String designator, String optionsFileName) {
diff --git a/pkg/analyzer_cli/test/embedder_test.dart b/pkg/analyzer_cli/test/embedder_test.dart
index eaa790a..37b1d767 100644
--- a/pkg/analyzer_cli/test/embedder_test.dart
+++ b/pkg/analyzer_cli/test/embedder_test.dart
@@ -73,7 +73,7 @@
         print('stderr:');
         print(errorSink);
       }
-      throw e;
+      rethrow;
     }
   };
 }
diff --git a/tools/VERSION b/tools/VERSION
index e45ee0b..130540a 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -28,4 +28,4 @@
 MINOR 22
 PATCH 0
 PRERELEASE 10
-PRERELEASE_PATCH 3
+PRERELEASE_PATCH 4