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