Version 2.12.0-201.0.dev
Merge commit 'dd5b455a0c1e282a28b2a4005059676c0f3a1847' into 'dev'
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d045819..0a97fcd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -158,7 +158,14 @@
* The `--server` option to `dart pub publish` and `dart pub uploader` have been
deprecated. Use `publish_to` in your `pubspec.yaml` or set the
`$PUB_HOSTED_URL` environment variable.
+* `pub global activate no longer re-precompiles if current global installed was
+ same version.
+* The Flutter SDK constraint upper bound is now ignored in pubspecs and
+ deprecated when publishing.
+ See: [flutter-upper-bound-deprecation][].
+
+[flutter-upper-bound-deprecation]: https://dart.dev/go/flutter-upper-bound-deprecation
[#44072]: https://github.com/dart-lang/sdk/issues/44072
[dart tool]: https://dart.dev/tools/dart-tool
diff --git a/DEPS b/DEPS
index 5b388d3..b61db7e 100644
--- a/DEPS
+++ b/DEPS
@@ -133,7 +133,7 @@
"ply_rev": "604b32590ffad5cbb82e4afef1d305512d06ae93",
"pool_rev": "7abe634002a1ba8a0928eded086062f1307ccfae",
"protobuf_rev": "0d03fd588df69e9863e2a2efc0059dee8f18d5b2",
- "pub_rev": "8ea96121dbb3f762f63e641d49141927dc30aac1",
+ "pub_rev": "392a3cb455af48f7ce8807a96174691945f97f0a",
"pub_semver_rev": "10569a1e867e909cf5db201f73118020453e5db8",
"resource_rev": "6b79867d0becf5395e5819a75720963b8298e9a7",
"root_certificates_rev": "7e5ec82c99677a2e5b95ce296c4d68b0d3378ed8",
diff --git a/pkg/compiler/lib/src/kernel/env.dart b/pkg/compiler/lib/src/kernel/env.dart
index bbad224..49c87e2 100644
--- a/pkg/compiler/lib/src/kernel/env.dart
+++ b/pkg/compiler/lib/src/kernel/env.dart
@@ -419,12 +419,15 @@
ir.Procedure existingSetter = existingSetters[field.name];
cls.addField(cloneVisitor.cloneField(
field, existingGetter?.reference, existingSetter?.reference));
+ // TODO(johnniwinther): We need to unbind the canonical names before
+ // serializing these references since the canonical names refer to
+ // @getters and @setters instead of @fields and @fields=. This will
+ // not be needed if stop using @fields/@fields= in favor of
+ // @getters/@setters in general.
if (existingGetter != null) {
- existingGetter.reference.canonicalName?.unbind();
cls.procedures.remove(existingGetter);
}
if (existingSetter != null) {
- existingSetter.reference.canonicalName?.unbind();
cls.procedures.remove(existingSetter);
}
continue;
@@ -444,7 +447,6 @@
? existingSetters[procedure.name]
: existingNonSetters[procedure.name];
if (existingProcedure != null) {
- existingProcedure.reference.canonicalName?.unbind();
cls.procedures.remove(existingProcedure);
}
cls.addProcedure(cloneVisitor.cloneProcedure(
diff --git a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
index 22df841..6920c7b 100644
--- a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
@@ -17,6 +17,7 @@
IntLiteral,
InterfaceType,
ListLiteral,
+ Name,
ProcedureKind,
PropertyGet,
Reference,
@@ -181,21 +182,24 @@
Reference valuesGetterReference;
Reference valuesSetterReference;
if (referencesFrom != null) {
- constructorReference = referencesFromIndexed.lookupConstructor("");
+ constructorReference =
+ referencesFromIndexed.lookupConstructor(new Name(""));
toStringReference =
- referencesFromIndexed.lookupGetterReference("toString");
+ referencesFromIndexed.lookupGetterReference(new Name("toString"));
+ Name indexName = new Name("index");
indexGetterReference =
- referencesFromIndexed.lookupGetterReference("index");
+ referencesFromIndexed.lookupGetterReference(indexName);
indexSetterReference =
- referencesFromIndexed.lookupSetterReference("index");
- _nameGetterReference =
- referencesFromIndexed.lookupGetterReference("_name");
- _nameSetterReference =
- referencesFromIndexed.lookupSetterReference("_name");
+ referencesFromIndexed.lookupSetterReference(indexName);
+ _nameGetterReference = referencesFromIndexed.lookupGetterReference(
+ new Name("_name", referencesFromIndexed.library));
+ _nameSetterReference = referencesFromIndexed.lookupSetterReference(
+ new Name("_name", referencesFromIndexed.library));
+ Name valuesName = new Name("values");
valuesGetterReference =
- referencesFromIndexed.lookupGetterReference("values");
+ referencesFromIndexed.lookupGetterReference(valuesName);
valuesSetterReference =
- referencesFromIndexed.lookupSetterReference("values");
+ referencesFromIndexed.lookupSetterReference(valuesName);
}
members["index"] = new SourceFieldBuilder(
@@ -309,10 +313,15 @@
name.length,
parent.fileUri);
}
- Reference getterReference =
- referencesFromIndexed?.lookupGetterReference(name);
- Reference setterReference =
- referencesFromIndexed?.lookupSetterReference(name);
+ Reference getterReference;
+ Reference setterReference;
+ if (referencesFromIndexed != null) {
+ Name nameName = new Name(name, referencesFromIndexed.library);
+ getterReference =
+ referencesFromIndexed.lookupGetterReference(nameName);
+ setterReference =
+ referencesFromIndexed.lookupSetterReference(nameName);
+ }
FieldBuilder fieldBuilder = new SourceFieldBuilder(
metadata,
selfType,
diff --git a/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart b/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
index fa09a80..6dfd603 100644
--- a/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
@@ -510,8 +510,8 @@
Class enclosingClass = classBuilder.cls;
Reference reference;
if (classBuilder.referencesFromIndexed != null) {
- reference = classBuilder.referencesFromIndexed
- .lookupGetterReference(member.name.text);
+ reference =
+ classBuilder.referencesFromIndexed.lookupGetterReference(member.name);
}
Uri fileUri;
int startFileOffset;
@@ -556,8 +556,8 @@
Class enclosingClass = classBuilder.cls;
Reference reference;
if (classBuilder.referencesFromIndexed != null) {
- reference = classBuilder.referencesFromIndexed
- .lookupSetterReference(member.name.text);
+ reference =
+ classBuilder.referencesFromIndexed.lookupSetterReference(member.name);
}
Uri fileUri;
int startFileOffset;
@@ -599,7 +599,7 @@
assert(copyLocation != null);
Class enclosingClass = classBuilder.cls;
Reference reference = classBuilder.referencesFromIndexed
- ?.lookupGetterReference(procedure.name.text);
+ ?.lookupGetterReference(procedure.name);
Uri fileUri;
int startFileOffset;
int fileOffset;
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 9d3f663..6ca84c6 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -640,7 +640,7 @@
IndexedClass indexedClass = builder.referencesFromIndexed;
Constructor referenceFrom;
if (indexedClass != null) {
- referenceFrom = indexedClass.lookupConstructor("");
+ referenceFrom = indexedClass.lookupConstructor(new Name(""));
}
/// From [Dart Programming Language Specification, 4th Edition](
@@ -691,7 +691,7 @@
IndexedClass indexedClass = builder.referencesFromIndexed;
Constructor referenceFrom;
if (indexedClass != null) {
- referenceFrom = indexedClass.lookupConstructor("");
+ referenceFrom = indexedClass.lookupConstructor(new Name(""));
}
if (supertype is ClassBuilder) {
@@ -702,7 +702,8 @@
void addSyntheticConstructor(String name, MemberBuilder memberBuilder) {
if (memberBuilder.member is Constructor) {
substitutionMap ??= builder.getSubstitutionMap(superclassBuilder.cls);
- Constructor referenceFrom = indexedClass?.lookupConstructor(name);
+ Constructor referenceFrom = indexedClass
+ ?.lookupConstructor(new Name(name, indexedClass.library));
builder.addSyntheticConstructor(_makeMixinApplicationConstructor(
builder,
builder.cls.mixin,
diff --git a/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart b/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart
index 88c5a6d..81ea7a7 100644
--- a/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart
@@ -52,7 +52,7 @@
String prefix = expression.import.name;
Name name = new Name('_#loadLibrary_$prefix', parent.library);
Reference reference =
- parent.referencesFromIndexed?.lookupGetterReference(name.text);
+ parent.referencesFromIndexed?.lookupGetterReference(name);
tearoff = new Procedure(
name,
ProcedureKind.Method,
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index a222357..6484fa9d 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -908,8 +908,9 @@
// is actually in the kernel tree. This call creates a StaticGet
// to [declaration.target] in a field `_redirecting#` which is
// only legal to do to things in the kernel tree.
- Reference getterReference = referencesFromIndexed
- ?.lookupGetterReference("_redirecting#");
+ Reference getterReference =
+ referencesFromIndexed?.lookupGetterReference(new Name(
+ "_redirecting#", referencesFromIndexed.library));
_addRedirectingConstructor(
declaration, library, getterReference);
}
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 0440125..9e90a19 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -979,9 +979,10 @@
library.procedures.sort(compareProcedures);
if (unserializableExports != null) {
+ Name fieldName = new Name("_exports#", library);
Reference getterReference =
- referencesFromIndexed?.lookupGetterReference("_exports#");
- library.addField(new Field.immutable(new Name("_exports#", library),
+ referencesFromIndexed?.lookupGetterReference(fieldName);
+ library.addField(new Field.immutable(fieldName,
initializer: new StringLiteral(jsonEncode(unserializableExports)),
isStatic: true,
isConst: true,
@@ -2170,10 +2171,11 @@
isSynthesized: fieldIsLateWithLowering);
IndexedContainer indexedContainer =
_currentClassReferencesFromIndexed ?? referencesFromIndexed;
+ Name nameToLookupName = new Name(nameToLookup, indexedContainer.library);
fieldGetterReference =
- indexedContainer.lookupGetterReference(nameToLookup);
+ indexedContainer.lookupGetterReference(nameToLookupName);
fieldSetterReference =
- indexedContainer.lookupSetterReference(nameToLookup);
+ indexedContainer.lookupSetterReference(nameToLookupName);
if (fieldIsLateWithLowering) {
String lateIsSetName = SourceFieldBuilder.createFieldName(
FieldNameType.IsSetField, name,
@@ -2182,24 +2184,28 @@
isExtensionMethod: isExtension,
extensionName: extensionName,
isSynthesized: fieldIsLateWithLowering);
+ Name lateIsSetNameName =
+ new Name(lateIsSetName, indexedContainer.library);
lateIsSetGetterReference =
- indexedContainer.lookupGetterReference(lateIsSetName);
+ indexedContainer.lookupGetterReference(lateIsSetNameName);
lateIsSetSetterReference =
- indexedContainer.lookupSetterReference(lateIsSetName);
- getterReference = indexedContainer.lookupGetterReference(
+ indexedContainer.lookupSetterReference(lateIsSetNameName);
+ getterReference = indexedContainer.lookupGetterReference(new Name(
SourceFieldBuilder.createFieldName(FieldNameType.Getter, name,
isInstanceMember: isInstanceMember,
className: className,
isExtensionMethod: isExtension,
extensionName: extensionName,
- isSynthesized: fieldIsLateWithLowering));
- setterReference = indexedContainer.lookupSetterReference(
+ isSynthesized: fieldIsLateWithLowering),
+ indexedContainer.library));
+ setterReference = indexedContainer.lookupSetterReference(new Name(
SourceFieldBuilder.createFieldName(FieldNameType.Setter, name,
isInstanceMember: isInstanceMember,
className: className,
isExtensionMethod: isExtension,
extensionName: extensionName,
- isSynthesized: fieldIsLateWithLowering));
+ isSynthesized: fieldIsLateWithLowering),
+ indexedContainer.library));
}
}
@@ -2252,8 +2258,9 @@
MetadataCollector metadataCollector = loader.target.metadataCollector;
Constructor referenceFrom;
if (_currentClassReferencesFromIndexed != null) {
- referenceFrom =
- _currentClassReferencesFromIndexed.lookupConstructor(constructorName);
+ referenceFrom = _currentClassReferencesFromIndexed.lookupConstructor(
+ new Name(
+ constructorName, _currentClassReferencesFromIndexed.library));
}
ConstructorBuilder constructorBuilder = new ConstructorBuilderImpl(
metadata,
@@ -2323,10 +2330,12 @@
if (_currentClassReferencesFromIndexed != null) {
if (kind == ProcedureKind.Setter) {
procedureReference =
- _currentClassReferencesFromIndexed.lookupSetterReference(name);
+ _currentClassReferencesFromIndexed.lookupSetterReference(
+ new Name(name, _currentClassReferencesFromIndexed.library));
} else {
procedureReference =
- _currentClassReferencesFromIndexed.lookupGetterReference(name);
+ _currentClassReferencesFromIndexed.lookupGetterReference(
+ new Name(name, _currentClassReferencesFromIndexed.library));
}
} else {
if (currentTypeParameterScopeBuilder.kind ==
@@ -2339,11 +2348,11 @@
currentTypeParameterScopeBuilder.name,
name);
if (extensionIsStatic && kind == ProcedureKind.Setter) {
- procedureReference =
- referencesFromIndexed.lookupSetterReference(nameToLookup);
+ procedureReference = referencesFromIndexed.lookupSetterReference(
+ new Name(nameToLookup, referencesFromIndexed.library));
} else {
- procedureReference =
- referencesFromIndexed.lookupGetterReference(nameToLookup);
+ procedureReference = referencesFromIndexed.lookupGetterReference(
+ new Name(nameToLookup, referencesFromIndexed.library));
}
if (kind == ProcedureKind.Method) {
String tearOffNameToLookup =
@@ -2353,16 +2362,16 @@
ProcedureKind.Getter,
currentTypeParameterScopeBuilder.name,
name);
- tearOffReference = referencesFromIndexed
- .lookupGetterReference(tearOffNameToLookup);
+ tearOffReference = referencesFromIndexed.lookupGetterReference(
+ new Name(tearOffNameToLookup, referencesFromIndexed.library));
}
} else {
if (kind == ProcedureKind.Setter) {
- procedureReference =
- referencesFromIndexed.lookupSetterReference(name);
+ procedureReference = referencesFromIndexed.lookupSetterReference(
+ new Name(name, referencesFromIndexed.library));
} else {
- procedureReference =
- referencesFromIndexed.lookupGetterReference(name);
+ procedureReference = referencesFromIndexed.lookupGetterReference(
+ new Name(name, referencesFromIndexed.library));
}
}
}
@@ -2427,8 +2436,9 @@
procedureName = name;
}
- Reference reference = _currentClassReferencesFromIndexed
- ?.lookupGetterReference(procedureName);
+ Reference reference =
+ _currentClassReferencesFromIndexed?.lookupGetterReference(new Name(
+ procedureName, _currentClassReferencesFromIndexed.library));
ProcedureBuilder procedureBuilder;
if (redirectionTarget != null) {
diff --git a/pkg/front_end/test/crashing_test_case_minimizer_impl.dart b/pkg/front_end/test/crashing_test_case_minimizer_impl.dart
index 328e3a7..22ffcf8 100644
--- a/pkg/front_end/test/crashing_test_case_minimizer_impl.dart
+++ b/pkg/front_end/test/crashing_test_case_minimizer_impl.dart
@@ -701,20 +701,20 @@
// TODO(jensj): don't use full uris.
print("""
- # Copyright (c) 2020, 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.
-
- # Reproduce a crash.
-
- type: newworld""");
+# Copyright (c) 2021, 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.
+
+# Reproduce a crash.
+
+type: newworld""");
if (_settings.widgetTransformation) {
print("trackWidgetCreation: true");
print("target: DDC # basically needed for widget creation to be run");
}
print("""
- worlds:
- - entry: $_mainUri""");
+worlds:
+ - entry: $_mainUri""");
if (_settings.experimentalInvalidation) {
print(" experiments: alternative-invalidation-strategy");
}
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt
index 74205c3..c2db70b 100644
--- a/pkg/front_end/test/spell_checking_list_tests.txt
+++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -606,6 +606,7 @@
scheduler
screen
scripts
+scroll
sdkroot
sdks
secondary
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/issue_44523.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/issue_44523.yaml
new file mode 100644
index 0000000..63f5ae4
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/issue_44523.yaml
@@ -0,0 +1,44 @@
+# Copyright (c) 2021, 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.
+
+# Reproduce a crash.
+
+type: newworld
+worlds:
+ - entry: app/main.dart
+ experiments: alternative-invalidation-strategy
+ sources:
+ app/.dart_tool/package_config.json: |
+ {
+ "configVersion": 2,
+ "packages": [
+ {
+ "name": "flutter",
+ "rootUri": "../../flutter",
+ "languageVersion": "2.12"
+ }
+ ]
+ }
+ app/main.dart: |
+ import "package:flutter/lib1.dart";
+ class _Bar extends RestorableProperty {}
+ flutter/lib1.dart: |
+ import "lib2.dart";
+ abstract class RestorableProperty extends ChangeNotifier {
+ bool _debugAssertNotDisposed() { return true; }
+ }
+ flutter/lib2.dart: |
+ class ChangeNotifier {
+ bool _debugAssertNotDisposed() { return true; }
+ }
+ expectedLibraryCount: 3
+
+ - entry: app/main.dart
+ experiments: alternative-invalidation-strategy
+ worldType: updated
+ expectInitializeFromDill: false
+ invalidate:
+ - app/main.dart
+ expectedLibraryCount: 3
+ expectsRebuildBodiesOnly: true
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/issue_44523.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/issue_44523.yaml.world.1.expect
new file mode 100644
index 0000000..fab130fd
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/issue_44523.yaml.world.1.expect
@@ -0,0 +1,47 @@
+main = <No Member>;
+library from "org-dartlang-test:///app/main.dart" as main {
+
+ import "package:flutter/lib1.dart";
+
+ class _Bar extends lib1::RestorableProperty {
+ synthetic constructor •() → main::_Bar*
+ : super lib1::RestorableProperty::•()
+ ;
+ abstract member-signature method _debugAssertNotDisposed() → dart.core::bool*; -> lib1::RestorableProperty::_debugAssertNotDisposed
+ abstract member-signature method _debugAssertNotDisposed() → dart.core::bool*; -> lib2::ChangeNotifier::_debugAssertNotDisposed
+ 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
+ }
+}
+library from "package:flutter/lib1.dart" as lib1 {
+
+ import "package:flutter/lib2.dart";
+
+ abstract class RestorableProperty extends lib2::ChangeNotifier {
+ synthetic constructor •() → lib1::RestorableProperty
+ : super lib2::ChangeNotifier::•()
+ ;
+ method _debugAssertNotDisposed() → dart.core::bool {
+ return true;
+ }
+ }
+}
+library from "package:flutter/lib2.dart" as lib2 {
+
+ class ChangeNotifier extends dart.core::Object {
+ synthetic constructor •() → lib2::ChangeNotifier
+ : super dart.core::Object::•()
+ ;
+ method _debugAssertNotDisposed() → dart.core::bool {
+ return true;
+ }
+ }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/issue_44523.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/issue_44523.yaml.world.2.expect
new file mode 100644
index 0000000..fab130fd
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/issue_44523.yaml.world.2.expect
@@ -0,0 +1,47 @@
+main = <No Member>;
+library from "org-dartlang-test:///app/main.dart" as main {
+
+ import "package:flutter/lib1.dart";
+
+ class _Bar extends lib1::RestorableProperty {
+ synthetic constructor •() → main::_Bar*
+ : super lib1::RestorableProperty::•()
+ ;
+ abstract member-signature method _debugAssertNotDisposed() → dart.core::bool*; -> lib1::RestorableProperty::_debugAssertNotDisposed
+ abstract member-signature method _debugAssertNotDisposed() → dart.core::bool*; -> lib2::ChangeNotifier::_debugAssertNotDisposed
+ 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
+ }
+}
+library from "package:flutter/lib1.dart" as lib1 {
+
+ import "package:flutter/lib2.dart";
+
+ abstract class RestorableProperty extends lib2::ChangeNotifier {
+ synthetic constructor •() → lib1::RestorableProperty
+ : super lib2::ChangeNotifier::•()
+ ;
+ method _debugAssertNotDisposed() → dart.core::bool {
+ return true;
+ }
+ }
+}
+library from "package:flutter/lib2.dart" as lib2 {
+
+ class ChangeNotifier extends dart.core::Object {
+ synthetic constructor •() → lib2::ChangeNotifier
+ : super dart.core::Object::•()
+ ;
+ method _debugAssertNotDisposed() → dart.core::bool {
+ return true;
+ }
+ }
+}
diff --git a/pkg/front_end/testcases/none/mixin_super.dart b/pkg/front_end/testcases/none/mixin_super.dart
new file mode 100644
index 0000000..5b90234
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_super.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2021, 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.
+
+mixin Diagnosticable {
+ void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
+}
+
+class DiagnosticPropertiesBuilder {}
+
+abstract class PointerEvent with Diagnosticable {}
+
+abstract class PointerSignalEvent extends PointerEvent {}
+
+mixin _PointerEventDescription on PointerEvent {
+ @override
+ void debugFillProperties(DiagnosticPropertiesBuilder properties) {
+ super.debugFillProperties(properties);
+ }
+}
+mixin _CopyPointerScrollEvent on PointerEvent {}
+
+class PointerScrollEvent extends PointerSignalEvent
+ with _PointerEventDescription, _CopyPointerScrollEvent {
+ @override
+ void debugFillProperties(DiagnosticPropertiesBuilder properties) {
+ super.debugFillProperties(properties);
+ }
+}
+
+main() {
+ new PointerScrollEvent()
+ .debugFillProperties(new DiagnosticPropertiesBuilder());
+}
diff --git a/pkg/front_end/testcases/none/mixin_super.dart.outline.expect b/pkg/front_end/testcases/none/mixin_super.dart.outline.expect
new file mode 100644
index 0000000..6e052ce
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_super.dart.outline.expect
@@ -0,0 +1,61 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class Diagnosticable extends core::Object /*isMixinDeclaration*/ {
+ method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+ ;
+}
+class DiagnosticPropertiesBuilder extends core::Object {
+ synthetic constructor •() → self::DiagnosticPropertiesBuilder
+ ;
+}
+abstract class _PointerEvent&Object&Diagnosticable = core::Object with self::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → self::_PointerEvent&Object&Diagnosticable
+ : super core::Object::•()
+ ;
+ mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+ return super.{self::Diagnosticable::debugFillProperties}(properties);
+}
+abstract class PointerEvent extends self::_PointerEvent&Object&Diagnosticable {
+ synthetic constructor •() → self::PointerEvent
+ ;
+}
+abstract class PointerSignalEvent extends self::PointerEvent {
+ synthetic constructor •() → self::PointerSignalEvent
+ ;
+}
+abstract class _PointerEventDescription extends self::PointerEvent /*isMixinDeclaration*/ {
+ @core::override
+ method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+ ;
+}
+abstract class _CopyPointerScrollEvent extends self::PointerEvent /*isMixinDeclaration*/ {
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription = self::PointerSignalEvent with self::_PointerEventDescription /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription
+ : super self::PointerSignalEvent::•()
+ ;
+ mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+ return super.{self::_PointerEventDescription::debugFillProperties}(properties);
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent = self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription with self::_CopyPointerScrollEvent /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent
+ : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::•()
+ ;
+}
+class PointerScrollEvent extends self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent {
+ synthetic constructor •() → self::PointerScrollEvent
+ ;
+ @core::override
+ method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+ ;
+}
+static method main() → dynamic
+ ;
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///mixin_super.dart:16:4 -> InstanceConstant(const _Override{})
+Evaluated: StaticGet @ org-dartlang-testcase:///mixin_super.dart:25:4 -> InstanceConstant(const _Override{})
+Extra constant evaluation: evaluated: 6, effectively constant: 2
diff --git a/pkg/front_end/testcases/none/mixin_super.dart.strong.expect b/pkg/front_end/testcases/none/mixin_super.dart.strong.expect
new file mode 100644
index 0000000..9929e69
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_super.dart.strong.expect
@@ -0,0 +1,65 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class Diagnosticable extends core::Object /*isMixinDeclaration*/ {
+ method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {}
+}
+class DiagnosticPropertiesBuilder extends core::Object {
+ synthetic constructor •() → self::DiagnosticPropertiesBuilder
+ : super core::Object::•()
+ ;
+}
+abstract class _PointerEvent&Object&Diagnosticable = core::Object with self::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → self::_PointerEvent&Object&Diagnosticable
+ : super core::Object::•()
+ ;
+ mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+ return super.{self::Diagnosticable::debugFillProperties}(properties);
+}
+abstract class PointerEvent extends self::_PointerEvent&Object&Diagnosticable {
+ synthetic constructor •() → self::PointerEvent
+ : super self::_PointerEvent&Object&Diagnosticable::•()
+ ;
+}
+abstract class PointerSignalEvent extends self::PointerEvent {
+ synthetic constructor •() → self::PointerSignalEvent
+ : super self::PointerEvent::•()
+ ;
+}
+abstract class _PointerEventDescription extends self::PointerEvent /*isMixinDeclaration*/ {
+ @#C1
+ method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
+ super.{self::_PointerEvent&Object&Diagnosticable::debugFillProperties}(properties);
+ }
+}
+abstract class _CopyPointerScrollEvent extends self::PointerEvent /*isMixinDeclaration*/ {
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription = self::PointerSignalEvent with self::_PointerEventDescription /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription
+ : super self::PointerSignalEvent::•()
+ ;
+ mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+ return super.{self::_PointerEventDescription::debugFillProperties}(properties);
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent = self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription with self::_CopyPointerScrollEvent /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent
+ : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::•()
+ ;
+}
+class PointerScrollEvent extends self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent {
+ synthetic constructor •() → self::PointerScrollEvent
+ : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent::•()
+ ;
+ @#C1
+ method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
+ super.{self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::debugFillProperties}(properties);
+ }
+}
+static method main() → dynamic {
+ new self::PointerScrollEvent::•().{self::PointerScrollEvent::debugFillProperties}(new self::DiagnosticPropertiesBuilder::•()){(self::DiagnosticPropertiesBuilder) → void};
+}
+
+constants {
+ #C1 = core::_Override {}
+}
diff --git a/pkg/front_end/testcases/none/mixin_super.dart.strong.transformed.expect b/pkg/front_end/testcases/none/mixin_super.dart.strong.transformed.expect
new file mode 100644
index 0000000..9929e69
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_super.dart.strong.transformed.expect
@@ -0,0 +1,65 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class Diagnosticable extends core::Object /*isMixinDeclaration*/ {
+ method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {}
+}
+class DiagnosticPropertiesBuilder extends core::Object {
+ synthetic constructor •() → self::DiagnosticPropertiesBuilder
+ : super core::Object::•()
+ ;
+}
+abstract class _PointerEvent&Object&Diagnosticable = core::Object with self::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → self::_PointerEvent&Object&Diagnosticable
+ : super core::Object::•()
+ ;
+ mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+ return super.{self::Diagnosticable::debugFillProperties}(properties);
+}
+abstract class PointerEvent extends self::_PointerEvent&Object&Diagnosticable {
+ synthetic constructor •() → self::PointerEvent
+ : super self::_PointerEvent&Object&Diagnosticable::•()
+ ;
+}
+abstract class PointerSignalEvent extends self::PointerEvent {
+ synthetic constructor •() → self::PointerSignalEvent
+ : super self::PointerEvent::•()
+ ;
+}
+abstract class _PointerEventDescription extends self::PointerEvent /*isMixinDeclaration*/ {
+ @#C1
+ method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
+ super.{self::_PointerEvent&Object&Diagnosticable::debugFillProperties}(properties);
+ }
+}
+abstract class _CopyPointerScrollEvent extends self::PointerEvent /*isMixinDeclaration*/ {
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription = self::PointerSignalEvent with self::_PointerEventDescription /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription
+ : super self::PointerSignalEvent::•()
+ ;
+ mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+ return super.{self::_PointerEventDescription::debugFillProperties}(properties);
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent = self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription with self::_CopyPointerScrollEvent /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent
+ : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::•()
+ ;
+}
+class PointerScrollEvent extends self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent {
+ synthetic constructor •() → self::PointerScrollEvent
+ : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent::•()
+ ;
+ @#C1
+ method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
+ super.{self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::debugFillProperties}(properties);
+ }
+}
+static method main() → dynamic {
+ new self::PointerScrollEvent::•().{self::PointerScrollEvent::debugFillProperties}(new self::DiagnosticPropertiesBuilder::•()){(self::DiagnosticPropertiesBuilder) → void};
+}
+
+constants {
+ #C1 = core::_Override {}
+}
diff --git a/pkg/front_end/testcases/none/mixin_super.dart.textual_outline.expect b/pkg/front_end/testcases/none/mixin_super.dart.textual_outline.expect
new file mode 100644
index 0000000..dd59658
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_super.dart.textual_outline.expect
@@ -0,0 +1,23 @@
+mixin Diagnosticable {
+ void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
+}
+
+class DiagnosticPropertiesBuilder {}
+
+abstract class PointerEvent with Diagnosticable {}
+
+abstract class PointerSignalEvent extends PointerEvent {}
+
+mixin _PointerEventDescription on PointerEvent {
+ @override
+ void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
+}
+mixin _CopyPointerScrollEvent on PointerEvent {}
+
+class PointerScrollEvent extends PointerSignalEvent
+ with _PointerEventDescription, _CopyPointerScrollEvent {
+ @override
+ void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/none/mixin_super.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/none/mixin_super.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..e011475
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_super.dart.textual_outline_modelled.expect
@@ -0,0 +1,21 @@
+abstract class PointerEvent with Diagnosticable {}
+
+abstract class PointerSignalEvent extends PointerEvent {}
+
+class DiagnosticPropertiesBuilder {}
+
+class PointerScrollEvent extends PointerSignalEvent
+ with _PointerEventDescription, _CopyPointerScrollEvent {
+ @override
+ void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
+}
+
+main() {}
+mixin Diagnosticable {
+ void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
+}
+mixin _CopyPointerScrollEvent on PointerEvent {}
+mixin _PointerEventDescription on PointerEvent {
+ @override
+ void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
+}
diff --git a/pkg/front_end/testcases/none/mixin_super.dart.weak.expect b/pkg/front_end/testcases/none/mixin_super.dart.weak.expect
new file mode 100644
index 0000000..9929e69
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_super.dart.weak.expect
@@ -0,0 +1,65 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class Diagnosticable extends core::Object /*isMixinDeclaration*/ {
+ method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {}
+}
+class DiagnosticPropertiesBuilder extends core::Object {
+ synthetic constructor •() → self::DiagnosticPropertiesBuilder
+ : super core::Object::•()
+ ;
+}
+abstract class _PointerEvent&Object&Diagnosticable = core::Object with self::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → self::_PointerEvent&Object&Diagnosticable
+ : super core::Object::•()
+ ;
+ mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+ return super.{self::Diagnosticable::debugFillProperties}(properties);
+}
+abstract class PointerEvent extends self::_PointerEvent&Object&Diagnosticable {
+ synthetic constructor •() → self::PointerEvent
+ : super self::_PointerEvent&Object&Diagnosticable::•()
+ ;
+}
+abstract class PointerSignalEvent extends self::PointerEvent {
+ synthetic constructor •() → self::PointerSignalEvent
+ : super self::PointerEvent::•()
+ ;
+}
+abstract class _PointerEventDescription extends self::PointerEvent /*isMixinDeclaration*/ {
+ @#C1
+ method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
+ super.{self::_PointerEvent&Object&Diagnosticable::debugFillProperties}(properties);
+ }
+}
+abstract class _CopyPointerScrollEvent extends self::PointerEvent /*isMixinDeclaration*/ {
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription = self::PointerSignalEvent with self::_PointerEventDescription /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription
+ : super self::PointerSignalEvent::•()
+ ;
+ mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+ return super.{self::_PointerEventDescription::debugFillProperties}(properties);
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent = self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription with self::_CopyPointerScrollEvent /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent
+ : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::•()
+ ;
+}
+class PointerScrollEvent extends self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent {
+ synthetic constructor •() → self::PointerScrollEvent
+ : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent::•()
+ ;
+ @#C1
+ method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
+ super.{self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::debugFillProperties}(properties);
+ }
+}
+static method main() → dynamic {
+ new self::PointerScrollEvent::•().{self::PointerScrollEvent::debugFillProperties}(new self::DiagnosticPropertiesBuilder::•()){(self::DiagnosticPropertiesBuilder) → void};
+}
+
+constants {
+ #C1 = core::_Override {}
+}
diff --git a/pkg/front_end/testcases/none/mixin_super.dart.weak.transformed.expect b/pkg/front_end/testcases/none/mixin_super.dart.weak.transformed.expect
new file mode 100644
index 0000000..9929e69
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_super.dart.weak.transformed.expect
@@ -0,0 +1,65 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class Diagnosticable extends core::Object /*isMixinDeclaration*/ {
+ method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {}
+}
+class DiagnosticPropertiesBuilder extends core::Object {
+ synthetic constructor •() → self::DiagnosticPropertiesBuilder
+ : super core::Object::•()
+ ;
+}
+abstract class _PointerEvent&Object&Diagnosticable = core::Object with self::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → self::_PointerEvent&Object&Diagnosticable
+ : super core::Object::•()
+ ;
+ mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+ return super.{self::Diagnosticable::debugFillProperties}(properties);
+}
+abstract class PointerEvent extends self::_PointerEvent&Object&Diagnosticable {
+ synthetic constructor •() → self::PointerEvent
+ : super self::_PointerEvent&Object&Diagnosticable::•()
+ ;
+}
+abstract class PointerSignalEvent extends self::PointerEvent {
+ synthetic constructor •() → self::PointerSignalEvent
+ : super self::PointerEvent::•()
+ ;
+}
+abstract class _PointerEventDescription extends self::PointerEvent /*isMixinDeclaration*/ {
+ @#C1
+ method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
+ super.{self::_PointerEvent&Object&Diagnosticable::debugFillProperties}(properties);
+ }
+}
+abstract class _CopyPointerScrollEvent extends self::PointerEvent /*isMixinDeclaration*/ {
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription = self::PointerSignalEvent with self::_PointerEventDescription /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription
+ : super self::PointerSignalEvent::•()
+ ;
+ mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+ return super.{self::_PointerEventDescription::debugFillProperties}(properties);
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent = self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription with self::_CopyPointerScrollEvent /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent
+ : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::•()
+ ;
+}
+class PointerScrollEvent extends self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent {
+ synthetic constructor •() → self::PointerScrollEvent
+ : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent::•()
+ ;
+ @#C1
+ method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
+ super.{self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::debugFillProperties}(properties);
+ }
+}
+static method main() → dynamic {
+ new self::PointerScrollEvent::•().{self::PointerScrollEvent::debugFillProperties}(new self::DiagnosticPropertiesBuilder::•()){(self::DiagnosticPropertiesBuilder) → void};
+}
+
+constants {
+ #C1 = core::_Override {}
+}
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index 2d00cd0..d84d3b9 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -181,6 +181,7 @@
none/operator: TypeCheckError
none/property_get: TypeCheckError
none/property_set: TypeCheckError
+none/mixin_super: TextSerializationFailure
none/tearoff_opt_out: TextSerializationFailure
rasta/abstract_constructor: RuntimeError
rasta/bad_constructor_redirection: RuntimeError
diff --git a/pkg/kernel/lib/reference_from_index.dart b/pkg/kernel/lib/reference_from_index.dart
index 6257e3d..fd99974 100644
--- a/pkg/kernel/lib/reference_from_index.dart
+++ b/pkg/kernel/lib/reference_from_index.dart
@@ -9,6 +9,7 @@
Extension,
Field,
Library,
+ Name,
Reference,
Procedure,
Typedef;
@@ -28,19 +29,23 @@
}
abstract class IndexedContainer {
- final Map<String, Reference> _getterReferences = new Map<String, Reference>();
- final Map<String, Reference> _setterReferences = new Map<String, Reference>();
+ final Map<Name, Reference> _getterReferences = new Map<Name, Reference>();
+ final Map<Name, Reference> _setterReferences = new Map<Name, Reference>();
- Reference lookupGetterReference(String name) => _getterReferences[name];
- Reference lookupSetterReference(String name) => _setterReferences[name];
+ Reference lookupGetterReference(Name name) => _getterReferences[name];
+ Reference lookupSetterReference(Name name) => _setterReferences[name];
+
+ Library get library;
void _addProcedures(List<Procedure> procedures) {
for (int i = 0; i < procedures.length; i++) {
Procedure procedure = procedures[i];
- String name = procedure.name.text;
+ Name name = procedure.name;
if (procedure.isSetter) {
+ assert(_setterReferences[name] == null);
_setterReferences[name] = procedure.reference;
} else {
+ assert(_getterReferences[name] == null);
_getterReferences[name] = procedure.reference;
}
}
@@ -49,9 +54,11 @@
void _addFields(List<Field> fields) {
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
- String name = field.name.text;
+ Name name = field.name;
+ assert(_getterReferences[name] == null);
_getterReferences[name] = field.getterReference;
if (field.hasSetter) {
+ assert(_setterReferences[name] == null);
_setterReferences[name] = field.setterReference;
}
}
@@ -64,19 +71,24 @@
final Map<String, IndexedClass> _indexedClasses =
new Map<String, IndexedClass>();
final Map<String, Extension> _extensions = new Map<String, Extension>();
+ final Library library;
- IndexedLibrary(Library library) {
+ IndexedLibrary(this.library) {
for (int i = 0; i < library.typedefs.length; i++) {
Typedef typedef = library.typedefs[i];
+ assert(_typedefs[typedef.name] == null);
_typedefs[typedef.name] = typedef;
}
for (int i = 0; i < library.classes.length; i++) {
Class c = library.classes[i];
+ assert(_classes[c.name] == null);
_classes[c.name] = c;
- _indexedClasses[c.name] = new IndexedClass._(c);
+ assert(_indexedClasses[c.name] == null);
+ _indexedClasses[c.name] = new IndexedClass._(c, library);
}
for (int i = 0; i < library.extensions.length; i++) {
Extension extension = library.extensions[i];
+ assert(_extensions[extension.name] == null);
_extensions[extension.name] = extension;
}
_addProcedures(library.procedures);
@@ -90,16 +102,17 @@
}
class IndexedClass extends IndexedContainer {
- final Map<String, Constructor> _constructors = new Map<String, Constructor>();
+ final Map<Name, Constructor> _constructors = new Map<Name, Constructor>();
+ final Library library;
- IndexedClass._(Class c) {
+ IndexedClass._(Class c, this.library) {
for (int i = 0; i < c.constructors.length; i++) {
Constructor constructor = c.constructors[i];
- _constructors[constructor.name.text] = constructor;
+ _constructors[constructor.name] = constructor;
}
_addProcedures(c.procedures);
_addFields(c.fields);
}
- Constructor lookupConstructor(String name) => _constructors[name];
+ Constructor lookupConstructor(Name name) => _constructors[name];
}
diff --git a/pkg/kernel/lib/transformations/mixin_full_resolution.dart b/pkg/kernel/lib/transformations/mixin_full_resolution.dart
index 92b0b16..6a9a8b8 100644
--- a/pkg/kernel/lib/transformations/mixin_full_resolution.dart
+++ b/pkg/kernel/lib/transformations/mixin_full_resolution.dart
@@ -119,9 +119,9 @@
for (var field in class_.mixin.fields) {
Reference getterReference =
- indexedClass?.lookupGetterReference(field.name.text);
+ indexedClass?.lookupGetterReference(field.name);
Reference setterReference =
- indexedClass?.lookupSetterReference(field.name.text);
+ indexedClass?.lookupSetterReference(field.name);
if (getterReference == null) {
getterReference = nonSetters[field.name]?.reference;
getterReference?.canonicalName?.unbind();
@@ -166,9 +166,9 @@
Reference reference;
if (procedure.isSetter) {
- reference = indexedClass?.lookupSetterReference(procedure.name.text);
+ reference = indexedClass?.lookupSetterReference(procedure.name);
} else {
- reference = indexedClass?.lookupGetterReference(procedure.name.text);
+ reference = indexedClass?.lookupGetterReference(procedure.name);
}
// Linear search for a forwarding stub with the same name.
diff --git a/pkg/vm/lib/transformations/ffi_definitions.dart b/pkg/vm/lib/transformations/ffi_definitions.dart
index fdaede1..6970c22 100644
--- a/pkg/vm/lib/transformations/ffi_definitions.dart
+++ b/pkg/vm/lib/transformations/ffi_definitions.dart
@@ -343,7 +343,7 @@
// C.#fromTypedDataBase(Object address) : super.fromPointer(address);
final VariableDeclaration pointer = new VariableDeclaration("#pointer");
final name = Name("#fromTypedDataBase");
- final referenceFrom = indexedClass?.lookupConstructor(name.text);
+ final referenceFrom = indexedClass?.lookupConstructor(name);
final Constructor ctor = Constructor(
FunctionNode(EmptyStatement(), positionalParameters: [pointer]),
name: name,
@@ -676,7 +676,7 @@
final Procedure getter = Procedure(field.name, ProcedureKind.Getter,
FunctionNode(getterStatement, returnType: field.type),
fileUri: field.fileUri,
- reference: indexedClass?.lookupGetterReference(field.name.text))
+ reference: indexedClass?.lookupGetterReference(field.name))
..fileOffset = field.fileOffset
..isNonNullableByDefault = field.isNonNullableByDefault;
@@ -693,7 +693,7 @@
FunctionNode(setterStatement,
returnType: VoidType(), positionalParameters: [argument]),
fileUri: field.fileUri,
- reference: indexedClass?.lookupSetterReference(field.name.text))
+ reference: indexedClass?.lookupSetterReference(field.name))
..fileOffset = field.fileOffset
..isNonNullableByDefault = field.isNonNullableByDefault;
}
@@ -709,7 +709,7 @@
void _replaceSizeOfMethod(
Class struct, Map<Abi, int> sizes, IndexedClass indexedClass) {
var name = Name("#sizeOf");
- var getterReference = indexedClass?.lookupGetterReference(name.text);
+ var getterReference = indexedClass?.lookupGetterReference(name);
final Field sizeOf = Field.immutable(name,
isStatic: true,
isFinal: true,
diff --git a/pkg/vm/lib/transformations/ffi_use_sites.dart b/pkg/vm/lib/transformations/ffi_use_sites.dart
index ae57831..3260c0a 100644
--- a/pkg/vm/lib/transformations/ffi_use_sites.dart
+++ b/pkg/vm/lib/transformations/ffi_use_sites.dart
@@ -337,7 +337,7 @@
final nativeFunctionType = InterfaceType(
nativeFunctionClass, Nullability.legacy, node.arguments.types);
var name = Name("_#ffiCallback${callbackCount++}", currentLibrary);
- var getterReference = currentLibraryIndex?.lookupGetterReference(name.text);
+ var getterReference = currentLibraryIndex?.lookupGetterReference(name);
final Field field = Field.immutable(name,
type: InterfaceType(
pointerClass, Nullability.legacy, [nativeFunctionType]),
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 4af9266..6e3de37 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -1252,10 +1252,14 @@
const Field& sentinel = Field::Handle(
zone, enum_cls.LookupStaticField(Symbols::_DeletedEnumSentinel()));
ASSERT(!sentinel.IsNull());
- sentinel.SetStaticValue(enum_value, true);
+
+ // The static const field contains `Object::null()` instead of
+ // `Object::sentinel()` - so it's not considered an initializing store.
+ sentinel.SetStaticConstFieldValue(enum_value,
+ /*assert_initializing_store*/ false);
ASSERT(enum_cls.kernel_offset() > 0);
- Error& error = Error::Handle(zone);
+ Object& error = Error::Handle(zone);
for (intptr_t i = 0; i < fields.Length(); i++) {
field = Field::RawCast(fields.At(i));
if (!field.is_static() || !field.is_const() ||
@@ -1265,11 +1269,9 @@
// Hot-reload expects the static const fields to be evaluated when
// performing a reload.
if (!FLAG_precompiled_mode) {
- if (field.IsUninitialized()) {
- error = field.InitializeStatic();
- if (!error.IsNull()) {
- ReportError(error);
- }
+ error = field.StaticConstFieldValue();
+ if (error.IsError()) {
+ ReportError(Error::Cast(error));
}
}
}
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index 6b778d7..70b1efa 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -1831,8 +1831,9 @@
// This cleans up references to field current and initial values.
if (field.is_static()) {
- field.SetStaticValue(Object::null_instance(),
- /*save_initial_value=*/true);
+ field.SetStaticValue(Object::null_instance());
+ field.SetStaticConstFieldValue(Object::null_instance(),
+ /*assert_initializing_store=*/false);
}
}
}
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index eb94c92..fd5cc1d 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -2582,7 +2582,8 @@
ASSERT(Class::Handle(field.Owner()).library() ==
Library::InternalLibrary() &&
Class::Handle(field.Owner()).Name() == Symbols::ClassID().raw());
- return Constant(Instance::ZoneHandle(Z, field.StaticValue()));
+ return Constant(Instance::ZoneHandle(
+ Z, Instance::RawCast(field.StaticConstFieldValue())));
} else {
const Class& owner = Class::Handle(Z, field.Owner());
const String& getter_name = H.DartGetterName(target);
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 5983ca2..7c0fab3 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -3433,8 +3433,11 @@
#endif
}
} else if (field.is_const()) {
- ASSERT(!field.IsUninitialized());
- body += Constant(Instance::ZoneHandle(Z, field.StaticValue()));
+ const auto& value = Object::Handle(Z, field.StaticConstFieldValue());
+ if (value.IsError()) {
+ Report::LongJump(Error::Cast(value));
+ }
+ body += Constant(Instance::ZoneHandle(Z, Instance::RawCast(value.raw())));
} else {
// Static fields
// - with trivial initializer
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index e862b759..3d52bb5 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -10571,9 +10571,8 @@
}
}
ASSERT(value.IsNull() || value.IsInstance());
- SetStaticValue(
- value.IsNull() ? Instance::null_instance() : Instance::Cast(value),
- is_const());
+ SetStaticValue(value.IsNull() ? Instance::null_instance()
+ : Instance::Cast(value));
return Error::null();
} else if (StaticValue() == Object::transition_sentinel().raw()) {
ASSERT(!is_late());
@@ -10586,6 +10585,42 @@
return Error::null();
}
+ObjectPtr Field::StaticConstFieldValue() const {
+ ASSERT(is_static() && is_const());
+
+ auto thread = Thread::Current();
+ auto zone = thread->zone();
+ auto initial_field_table = thread->isolate_group()->initial_field_table();
+
+ // We can safely cache the value of the static const field in the initial
+ // field table.
+ auto& value = Object::Handle(zone, initial_field_table->At(field_id()));
+ if (value.raw() == Object::sentinel().raw()) {
+ ASSERT(has_initializer());
+ value = EvaluateInitializer();
+ if (!value.IsError()) {
+ ASSERT(value.IsNull() || value.IsInstance());
+ SetStaticConstFieldValue(value.IsNull() ? Instance::null_instance()
+ : Instance::Cast(value));
+ }
+ }
+ return value.raw();
+}
+
+void Field::SetStaticConstFieldValue(const Instance& value,
+ bool assert_initializing_store) const {
+ auto thread = Thread::Current();
+ auto initial_field_table = thread->isolate_group()->initial_field_table();
+
+ SafepointWriteRwLocker ml(thread, thread->isolate_group()->program_lock());
+ ASSERT(initial_field_table->At(field_id()) == Object::sentinel().raw() ||
+ initial_field_table->At(field_id()) == value.raw() ||
+ !assert_initializing_store);
+ initial_field_table->SetAt(field_id(), value.IsNull()
+ ? Instance::null_instance().raw()
+ : Instance::Cast(value).raw());
+}
+
ObjectPtr Field::EvaluateInitializer() const {
Thread* const thread = Thread::Current();
ASSERT(thread->IsMutatorThread());
@@ -10788,8 +10823,7 @@
return false; // Not found.
}
-void Field::SetStaticValue(const Instance& value,
- bool save_initial_value) const {
+void Field::SetStaticValue(const Instance& value) const {
auto thread = Thread::Current();
ASSERT(thread->IsMutatorThread());
@@ -10799,16 +10833,6 @@
SafepointWriteRwLocker ml(thread, thread->isolate_group()->program_lock());
thread->isolate()->field_table()->SetAt(id, value.raw());
- if (save_initial_value) {
- // TODO(https://dartbug.com/36097): We should re-visit call-sites where
- // `save_initial_value == true` and try to have a different path. This
- // method should only modify the isolate-local field state and not modify
- // the initial field table.
-#if !defined(DART_PRECOMPILED_RUNTIME)
- thread->isolate_group()->initial_field_table()->SetAt(field_id(),
- value.raw());
-#endif
- }
}
static StaticTypeExactnessState TrivialTypeExactnessFor(const Class& cls) {
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 7cf19f6..67df8c9 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -4072,9 +4072,12 @@
inline intptr_t TargetOffset() const;
static inline intptr_t TargetOffsetOf(FieldPtr field);
+ ObjectPtr StaticConstFieldValue() const;
+ void SetStaticConstFieldValue(const Instance& value,
+ bool assert_initializing_store = true) const;
+
inline InstancePtr StaticValue() const;
- void SetStaticValue(const Instance& value,
- bool save_initial_value = false) const;
+ void SetStaticValue(const Instance& value) const;
inline intptr_t field_id() const;
inline void set_field_id(intptr_t field_id) const;
@@ -11171,8 +11174,7 @@
InstancePtr Field::StaticValue() const {
ASSERT(is_static()); // Valid only for static dart fields.
- return Isolate::Current()->field_table()->At(
- Smi::Value(raw_ptr()->host_offset_or_field_id()));
+ return Isolate::Current()->field_table()->At(field_id());
}
inline intptr_t Field::field_id() const {
diff --git a/runtime/vm/object_reload.cc b/runtime/vm/object_reload.cc
index 1620dcc..03f743b 100644
--- a/runtime/vm/object_reload.cc
+++ b/runtime/vm/object_reload.cc
@@ -344,17 +344,20 @@
// Enum instances are only held in static fields.
continue;
}
+ ASSERT(field.is_const());
if (enum_ident.Equals(Symbols::Values())) {
- old_enum_values = field.StaticValue();
+ old_enum_values = Instance::RawCast(field.StaticConstFieldValue());
// Non-enum instance.
continue;
}
if (enum_ident.Equals(Symbols::_DeletedEnumSentinel())) {
- old_deleted_enum_sentinel = field.StaticValue();
+ old_deleted_enum_sentinel =
+ Instance::RawCast(field.StaticConstFieldValue());
// Non-enum instance.
continue;
}
- old_enum_value = field.StaticValue();
+ old_enum_value = Instance::RawCast(field.StaticConstFieldValue());
+
ASSERT(!old_enum_value.IsNull());
VTIR_Print("Element %s being added to mapping\n", enum_ident.ToCString());
bool update = enum_map.UpdateOrInsert(enum_ident, old_enum_value);
@@ -378,17 +381,20 @@
// Enum instances are only held in static fields.
continue;
}
+ ASSERT(field.is_const());
if (enum_ident.Equals(Symbols::Values())) {
- enum_values = field.StaticValue();
+ enum_values = Instance::RawCast(field.StaticConstFieldValue());
// Non-enum instance.
continue;
}
if (enum_ident.Equals(Symbols::_DeletedEnumSentinel())) {
- deleted_enum_sentinel = field.StaticValue();
+ deleted_enum_sentinel =
+ Instance::RawCast(field.StaticConstFieldValue());
// Non-enum instance.
continue;
}
- enum_value = field.StaticValue();
+ enum_value = Instance::RawCast(field.StaticConstFieldValue());
+
ASSERT(!enum_value.IsNull());
old_enum_value ^= enum_map.GetOrNull(enum_ident);
if (old_enum_value.IsNull()) {
diff --git a/runtime/vm/regexp_assembler_ir.cc b/runtime/vm/regexp_assembler_ir.cc
index 8de3437..f01b655 100644
--- a/runtime/vm/regexp_assembler_ir.cc
+++ b/runtime/vm/regexp_assembler_ir.cc
@@ -376,18 +376,14 @@
ASSERT(!word_character_field.IsNull());
DEBUG_ASSERT(Thread::Current()->TopErrorHandlerIsSetJump());
- if (word_character_field.IsUninitialized()) {
- ASSERT(!Compiler::IsBackgroundCompilation());
- const Error& error =
- Error::Handle(Z, word_character_field.InitializeStatic());
- if (!error.IsNull()) {
- Report::LongJump(error);
- }
- }
- ASSERT(!word_character_field.IsUninitialized());
- return new (Z) ConstantInstr(
- Instance::ZoneHandle(Z, word_character_field.StaticValue()));
+ const auto& value =
+ Object::Handle(Z, word_character_field.StaticConstFieldValue());
+ if (value.IsError()) {
+ Report::LongJump(Error::Cast(value));
+ }
+ return new (Z)
+ ConstantInstr(Instance::ZoneHandle(Z, Instance::RawCast(value.raw())));
}
ComparisonInstr* IRRegExpMacroAssembler::Comparison(ComparisonKind kind,
diff --git a/tests/modular/mixin_super/main.dart b/tests/modular/mixin_super/main.dart
new file mode 100644
index 0000000..5b90234
--- /dev/null
+++ b/tests/modular/mixin_super/main.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2021, 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.
+
+mixin Diagnosticable {
+ void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
+}
+
+class DiagnosticPropertiesBuilder {}
+
+abstract class PointerEvent with Diagnosticable {}
+
+abstract class PointerSignalEvent extends PointerEvent {}
+
+mixin _PointerEventDescription on PointerEvent {
+ @override
+ void debugFillProperties(DiagnosticPropertiesBuilder properties) {
+ super.debugFillProperties(properties);
+ }
+}
+mixin _CopyPointerScrollEvent on PointerEvent {}
+
+class PointerScrollEvent extends PointerSignalEvent
+ with _PointerEventDescription, _CopyPointerScrollEvent {
+ @override
+ void debugFillProperties(DiagnosticPropertiesBuilder properties) {
+ super.debugFillProperties(properties);
+ }
+}
+
+main() {
+ new PointerScrollEvent()
+ .debugFillProperties(new DiagnosticPropertiesBuilder());
+}
diff --git a/tests/modular/mixin_super/modules.yaml b/tests/modular/mixin_super/modules.yaml
new file mode 100644
index 0000000..7313554
--- /dev/null
+++ b/tests/modular/mixin_super/modules.yaml
@@ -0,0 +1,6 @@
+# Copyright (c) 2021, 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 file.
+
+dependencies:
+ main: []
diff --git a/tools/VERSION b/tools/VERSION
index 09493fa..58124d3 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 12
PATCH 0
-PRERELEASE 200
+PRERELEASE 201
PRERELEASE_PATCH 0
\ No newline at end of file