Version 2.11.0-214.0.dev

Merge commit '7964e404293ca2c3fc14e42eec25cebace2a7712' into 'dev'
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
index e36d001..306517a 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
@@ -187,6 +187,9 @@
   }
 
   void addMember(Member member) {
+    if (member.isExtensionMember) {
+      return null;
+    }
     String name = member.name.text;
     if (name == "_exports#") {
       Field field = member;
@@ -210,6 +213,7 @@
   @override
   Builder addBuilder(String name, Builder declaration, int charOffset) {
     if (name == null || name.isEmpty) return null;
+
     bool isSetter = declaration.isSetter;
     if (isSetter) {
       scopeBuilder.addSetter(name, declaration);
@@ -219,7 +223,7 @@
     if (declaration.isExtension) {
       scopeBuilder.addExtension(declaration);
     }
-    if (!name.startsWith("_")) {
+    if (!name.startsWith("_") && !name.contains('#')) {
       if (isSetter) {
         exportScopeBuilder.addSetter(name, declaration);
       } else {
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 2cfabbe..6ec08ea 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -60,6 +60,8 @@
 
 import 'builder/class_builder.dart' show ClassBuilder;
 
+import 'builder/field_builder.dart' show FieldBuilder;
+
 import 'builder/library_builder.dart' show LibraryBuilder;
 
 import 'builder/name_iterator.dart' show NameIterator;
@@ -388,6 +390,8 @@
       // We suppress finalization errors because they have already been
       // reported.
       await dillLoadedData.buildOutlines(suppressFinalizationErrors: true);
+      assert(_checkEquivalentScopes(
+          userCode.loader.builders, dillLoadedData.loader.builders));
 
       if (experimentalInvalidation != null) {
         /// If doing experimental invalidation that means that some of the old
@@ -432,6 +436,80 @@
     return newDillLibraryBuilders;
   }
 
+  bool _checkEquivalentScopes(Map<Uri, LibraryBuilder> sourceLibraries,
+      Map<Uri, LibraryBuilder> dillLibraries) {
+    sourceLibraries.forEach((Uri uri, LibraryBuilder sourceLibraryBuilder) {
+      if (sourceLibraryBuilder is SourceLibraryBuilder) {
+        DillLibraryBuilder dillLibraryBuilder = dillLibraries[uri];
+        assert(
+            _hasEquivalentScopes(sourceLibraryBuilder, dillLibraryBuilder) ==
+                null,
+            _hasEquivalentScopes(sourceLibraryBuilder, dillLibraryBuilder));
+      }
+    });
+    return true;
+  }
+
+  String _hasEquivalentScopes(SourceLibraryBuilder sourceLibraryBuilder,
+      DillLibraryBuilder dillLibraryBuilder) {
+    bool isEquivalent = true;
+    StringBuffer sb = new StringBuffer();
+    sb.writeln('Mismatch on ${sourceLibraryBuilder.importUri}:');
+    sourceLibraryBuilder.exportScope
+        .forEachLocalMember((String name, Builder sourceBuilder) {
+      Builder dillBuilder =
+          dillLibraryBuilder.exportScope.lookupLocalMember(name, setter: false);
+      if (dillBuilder == null) {
+        if ((name == 'dynamic' || name == 'Never') &&
+            sourceLibraryBuilder.importUri == Uri.parse('dart:core')) {
+          // The source library builder for dart:core has synthetically
+          // injected builders for `dynamic` and `Never` which do not have
+          // corresponding classes in the AST.
+          return;
+        }
+        sb.writeln('No dill builder for ${name}: $sourceBuilder');
+        isEquivalent = false;
+      }
+    });
+    dillLibraryBuilder.exportScope
+        .forEachLocalMember((String name, Builder dillBuilder) {
+      Builder sourceBuilder = sourceLibraryBuilder.exportScope
+          .lookupLocalMember(name, setter: false);
+      if (sourceBuilder == null) {
+        sb.writeln('No source builder for ${name}: $dillBuilder');
+        isEquivalent = false;
+      }
+    });
+    sourceLibraryBuilder.exportScope
+        .forEachLocalSetter((String name, Builder sourceBuilder) {
+      Builder dillBuilder =
+          dillLibraryBuilder.exportScope.lookupLocalMember(name, setter: true);
+      if (dillBuilder == null) {
+        sb.writeln('No dill builder for ${name}=: $sourceBuilder');
+        isEquivalent = false;
+      }
+    });
+    dillLibraryBuilder.exportScope
+        .forEachLocalSetter((String name, Builder dillBuilder) {
+      Builder sourceBuilder = sourceLibraryBuilder.exportScope
+          .lookupLocalMember(name, setter: true);
+      if (sourceBuilder == null) {
+        sourceBuilder = sourceLibraryBuilder.exportScope
+            .lookupLocalMember(name, setter: false);
+        if (sourceBuilder is FieldBuilder && sourceBuilder.isAssignable) {
+          // Assignable fields can be lowered into a getter and setter.
+          return;
+        }
+        sb.writeln('No source builder for ${name}=: $dillBuilder');
+        isEquivalent = false;
+      }
+    });
+    if (isEquivalent) {
+      return null;
+    }
+    return sb.toString();
+  }
+
   /// Compute which libraries to output and which (previous) errors/warnings we
   /// have to reissue. In the process do some cleanup too.
   List<Library> calculateOutputLibrariesAndIssueLibraryProblems(
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_34.yaml.world.4.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_34.yaml.world.4.expect
index 22ff40c..3e4120d 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_34.yaml.world.4.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_34.yaml.world.4.expect
@@ -1,8 +1,6 @@
 main = <No Member>;
 library from "org-dartlang-test:///lib1.dart" as lib1 {
-additionalExports = (main::Extension|get#method,
-  main::Extension|method,
-  main::main,
+additionalExports = (main::main,
   main::Class,
   main::Extension)
 
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml
new file mode 100644
index 0000000..df6b22b
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml
@@ -0,0 +1,80 @@
+# Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
+
+# Compile an application, change a file, but don't change the outline.
+# Mixin something from the same file.
+
+type: newworld
+worlds:
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy
+    sources:
+      lib1.dart: |
+        import 'main.dart';
+        extension Extension1 on A {
+          baz() => 42;
+        }
+      lib2.dart: |
+        import 'main.dart';
+        import 'lib1.dart';
+        export 'main.dart';
+        export 'lib1.dart';
+        method(A a) {
+          a.baz();
+          a.boz();
+        }
+      main.dart: |
+        import 'lib1.dart';
+        import 'lib2.dart';
+        class A {
+          foo() {}
+        }
+        main() {
+          method(new A());
+        }
+        extension Extension2 on A {
+          boz() => 87;
+        }
+    expectedLibraryCount: 3
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - lib2.dart
+    sources:
+      lib2.dart: |
+        import 'main.dart';
+        import 'lib1.dart';
+        export 'main.dart';
+        export 'lib1.dart';
+        method(A a) {
+          a.baz();
+          a.boz();
+          a.baz();
+        }
+    expectedLibraryCount: 3
+    expectsRebuildBodiesOnly: true
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - main.dart
+    sources:
+      main.dart: |
+        import 'lib1.dart';
+        import 'lib2.dart';
+        class A {
+          foo() {}
+        }
+        main() {
+          method(new A());
+        }
+        extension Extension2 on A {
+          boz() => 123;
+        }
+    expectedLibraryCount: 3
+    expectsRebuildBodiesOnly: true
+
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.1.expect
new file mode 100644
index 0000000..febfb9f
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.1.expect
@@ -0,0 +1,63 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib1.dart" as lib1 {
+
+  import "org-dartlang-test:///main.dart";
+
+  extension Extension1 on main::A* {
+    method baz = lib1::Extension1|baz;
+    tearoff baz = lib1::Extension1|get#baz;
+  }
+  static method Extension1|baz(final main::A* #this) → dynamic
+    return 42;
+  static method Extension1|get#baz(final main::A* #this) → () →* dynamic
+    return () → dynamic => lib1::Extension1|baz(#this);
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+additionalExports = (lib1::Extension1,
+  main::main,
+  main::A,
+  main::Extension2)
+
+  import "org-dartlang-test:///main.dart";
+  import "org-dartlang-test:///lib1.dart";
+  export "org-dartlang-test:///main.dart";
+  export "org-dartlang-test:///lib1.dart";
+
+  static method method(main::A* a) → dynamic {
+    lib1::Extension1|baz(a);
+    main::Extension2|boz(a);
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib1.dart";
+  import "org-dartlang-test:///lib2.dart";
+
+  class A extends dart.core::Object {
+    synthetic constructor •() → main::A*
+      : super dart.core::Object::•()
+      ;
+    method foo() → dynamic {}
+    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
+    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
+    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
+    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
+    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
+    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
+    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+  }
+  extension Extension2 on main::A* {
+    method boz = main::Extension2|boz;
+    tearoff boz = main::Extension2|get#boz;
+  }
+  static method main() → dynamic {
+    lib2::method(new main::A::•());
+  }
+  static method Extension2|boz(final main::A* #this) → dynamic
+    return 87;
+  static method Extension2|get#boz(final main::A* #this) → () →* dynamic
+    return () → dynamic => main::Extension2|boz(#this);
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.2.expect
new file mode 100644
index 0000000..761a2dc
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.2.expect
@@ -0,0 +1,64 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib1.dart" as lib1 {
+
+  import "org-dartlang-test:///main.dart";
+
+  extension Extension1 on main::A* {
+    method baz = lib1::Extension1|baz;
+    tearoff baz = lib1::Extension1|get#baz;
+  }
+  static method Extension1|baz(final main::A* #this) → dynamic
+    return 42;
+  static method Extension1|get#baz(final main::A* #this) → () →* dynamic
+    return () → dynamic => lib1::Extension1|baz(#this);
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+additionalExports = (lib1::Extension1,
+  main::main,
+  main::A,
+  main::Extension2)
+
+  import "org-dartlang-test:///main.dart";
+  import "org-dartlang-test:///lib1.dart";
+  export "org-dartlang-test:///main.dart";
+  export "org-dartlang-test:///lib1.dart";
+
+  static method method(main::A* a) → dynamic {
+    lib1::Extension1|baz(a);
+    main::Extension2|boz(a);
+    lib1::Extension1|baz(a);
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib1.dart";
+  import "org-dartlang-test:///lib2.dart";
+
+  class A extends dart.core::Object {
+    synthetic constructor •() → main::A*
+      : super dart.core::Object::•()
+      ;
+    method foo() → dynamic {}
+    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
+    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
+    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
+    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
+    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
+    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
+    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+  }
+  extension Extension2 on main::A* {
+    method boz = main::Extension2|boz;
+    tearoff boz = main::Extension2|get#boz;
+  }
+  static method main() → dynamic {
+    lib2::method(new main::A::•());
+  }
+  static method Extension2|boz(final main::A* #this) → dynamic
+    return 87;
+  static method Extension2|get#boz(final main::A* #this) → () →* dynamic
+    return () → dynamic => main::Extension2|boz(#this);
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.3.expect
new file mode 100644
index 0000000..dd33640
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.3.expect
@@ -0,0 +1,64 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib1.dart" as lib1 {
+
+  import "org-dartlang-test:///main.dart";
+
+  extension Extension1 on main::A* {
+    method baz = lib1::Extension1|baz;
+    tearoff baz = lib1::Extension1|get#baz;
+  }
+  static method Extension1|baz(final main::A* #this) → dynamic
+    return 42;
+  static method Extension1|get#baz(final main::A* #this) → () →* dynamic
+    return () → dynamic => lib1::Extension1|baz(#this);
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+additionalExports = (lib1::Extension1,
+  main::main,
+  main::A,
+  main::Extension2)
+
+  import "org-dartlang-test:///main.dart";
+  import "org-dartlang-test:///lib1.dart";
+  export "org-dartlang-test:///main.dart";
+  export "org-dartlang-test:///lib1.dart";
+
+  static method method(main::A* a) → dynamic {
+    lib1::Extension1|baz(a);
+    main::Extension2|boz(a);
+    lib1::Extension1|baz(a);
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib1.dart";
+  import "org-dartlang-test:///lib2.dart";
+
+  class A extends dart.core::Object {
+    synthetic constructor •() → main::A*
+      : super dart.core::Object::•()
+      ;
+    method foo() → dynamic {}
+    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
+    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
+    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
+    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
+    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
+    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
+    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+  }
+  extension Extension2 on main::A* {
+    method boz = main::Extension2|boz;
+    tearoff boz = main::Extension2|get#boz;
+  }
+  static method main() → dynamic {
+    lib2::method(new main::A::•());
+  }
+  static method Extension2|boz(final main::A* #this) → dynamic
+    return 123;
+  static method Extension2|get#boz(final main::A* #this) → () →* dynamic
+    return () → dynamic => main::Extension2|boz(#this);
+}
diff --git a/tools/VERSION b/tools/VERSION
index b99084c..a42d119 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 11
 PATCH 0
-PRERELEASE 213
+PRERELEASE 214
 PRERELEASE_PATCH 0
\ No newline at end of file