Version 2.14.0-15.0.dev
Merge commit '44591f258d0c86158d4ca248c4ff1083384fdbeb' into 'dev'
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 4742d6f..cf7f639 100644
--- a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
@@ -126,6 +126,9 @@
Class referencesFrom,
IndexedClass referencesFromIndexed) {
assert(enumConstantInfos == null || enumConstantInfos.isNotEmpty);
+
+ Uri fileUri = parent.fileUri;
+
// TODO(ahe): These types shouldn't be looked up in scope, they come
// directly from dart:core.
TypeBuilder intType = new NamedTypeBuilder(
@@ -146,7 +149,8 @@
/* arguments = */ null,
/* fileUri = */ null,
/* charOffset = */ null);
- Class cls = new Class(name: name, reference: referencesFrom?.reference);
+ Class cls = new Class(
+ name: name, reference: referencesFrom?.reference, fileUri: fileUri);
Map<String, MemberBuilder> members = <String, MemberBuilder>{};
Map<String, MemberBuilder> constructors = <String, MemberBuilder>{};
NamedTypeBuilder selfType = new NamedTypeBuilder(
diff --git a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
index 087e96d..4b2720b 100644
--- a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
@@ -271,7 +271,8 @@
new FunctionNode(null),
isStatic: true,
isExtensionMember: true,
- reference: _tearOffReference)
+ reference: _tearOffReference,
+ fileUri: fileUri)
..isNonNullableByDefault = library.isNonNullableByDefault;
}
}
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index a25d4e1..b813027 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -1948,7 +1948,7 @@
Procedure procedure = new Procedure(
new Name(syntheticProcedureName), ProcedureKind.Method, parameters,
- isStatic: isStatic)
+ isStatic: isStatic, fileUri: debugLibrary.fileUri)
..isNonNullableByDefault = debugLibrary.isNonNullableByDefault;
parameters.body = new ReturnStatement(compiledExpression)
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 66d862b..3e30a03 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -772,9 +772,10 @@
initializers: <Initializer>[initializer],
isSynthetic: true,
isConst: isConst,
- reference: referenceFrom?.reference)
- ..isNonNullableByDefault = cls.enclosingLibrary.isNonNullableByDefault
- ..fileUri = cls.fileUri,
+ reference: referenceFrom?.reference,
+ fileUri: cls.fileUri)
+ ..isNonNullableByDefault =
+ cls.enclosingLibrary.isNonNullableByDefault,
// If the constructor is constant, the default values must be part of
// the outline expressions. We pass on the original constructor and
// cloned function nodes to ensure that the default values are computed
@@ -801,7 +802,8 @@
returnType: makeConstructorReturnType(enclosingClass)),
name: new Name(""),
isSynthetic: true,
- reference: referenceFrom?.reference)
+ reference: referenceFrom?.reference,
+ fileUri: enclosingClass.fileUri)
..isNonNullableByDefault =
enclosingClass.enclosingLibrary.isNonNullableByDefault);
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/utils.dart b/pkg/front_end/lib/src/fasta/kernel/utils.dart
index e55e325..917607e 100644
--- a/pkg/front_end/lib/src/fasta/kernel/utils.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/utils.dart
@@ -75,16 +75,17 @@
Component createExpressionEvaluationComponent(Procedure procedure) {
Library realLibrary = procedure.enclosingLibrary;
- Library fakeLibrary = new Library(new Uri(scheme: 'evaluate', path: 'source'))
+ Uri uri = new Uri(scheme: 'evaluate', path: 'source');
+ Library fakeLibrary = new Library(uri, fileUri: uri)
..setLanguageVersion(realLibrary.languageVersion)
..isNonNullableByDefault = realLibrary.isNonNullableByDefault
..nonNullableByDefaultCompiledMode =
realLibrary.nonNullableByDefaultCompiledMode;
- if (procedure.parent is Class) {
- Class realClass = procedure.parent;
-
- Class fakeClass = new Class(name: kDebugClassName)..parent = fakeLibrary;
+ TreeNode realClass = procedure.parent;
+ if (realClass is Class) {
+ Class fakeClass = new Class(name: kDebugClassName, fileUri: uri)
+ ..parent = fakeLibrary;
Map<TypeParameter, TypeParameter> typeParams =
<TypeParameter, TypeParameter>{};
Map<TypeParameter, DartType> typeSubstitution = <TypeParameter, DartType>{};
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 bf02502..7e453ba 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
@@ -68,7 +68,8 @@
name: name,
typeParameters:
TypeVariableBuilder.typeParametersFromBuilders(typeVariables),
- reference: referencesFrom?.reference);
+ reference: referencesFrom?.reference,
+ fileUri: parent.fileUri);
cls.fileUri ??= parent.fileUri;
if (cls.startFileOffset == TreeNode.noOffset) {
cls.startFileOffset = startCharOffset;
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 aca996f..26d0e70 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
@@ -1030,7 +1030,8 @@
initializer: new StringLiteral(jsonEncode(unserializableExports)),
isStatic: true,
isConst: true,
- getterReference: getterReference));
+ getterReference: getterReference,
+ fileUri: library.fileUri));
}
return library;
diff --git a/pkg/front_end/test/fasta/ambiguous_export_test.dart b/pkg/front_end/test/fasta/ambiguous_export_test.dart
index b1e492b..6fa366c 100644
--- a/pkg/front_end/test/fasta/ambiguous_export_test.dart
+++ b/pkg/front_end/test/fasta/ambiguous_export_test.dart
@@ -22,9 +22,11 @@
main() async {
await asyncTest(() async {
- Library library = new Library(Uri.parse("org.dartlang.fasta:library"));
+ Uri uri = Uri.parse("org.dartlang.fasta:library");
+ Library library = new Library(uri, fileUri: uri);
Field field = new Field.immutable(new Name("_exports#", library),
- initializer: new StringLiteral('{"main":"Problem with main"}'));
+ initializer: new StringLiteral('{"main":"Problem with main"}'),
+ fileUri: library.fileUri);
library.addField(field);
Component component = new Component(libraries: <Library>[library]);
await CompilerContext.runWithDefaultOptions((CompilerContext c) async {
diff --git a/pkg/front_end/test/fasta/generator_to_string_test.dart b/pkg/front_end/test/fasta/generator_to_string_test.dart
index c1d32eb..a1c3537 100644
--- a/pkg/front_end/test/fasta/generator_to_string_test.dart
+++ b/pkg/front_end/test/fasta/generator_to_string_test.dart
@@ -87,11 +87,14 @@
LoadLibraryBuilder loadLibraryBuilder =
new LoadLibraryBuilder(libraryBuilder, null, -1);
Procedure getter = new Procedure(
- new Name("myGetter"), ProcedureKind.Getter, new FunctionNode(null));
+ new Name("myGetter"), ProcedureKind.Getter, new FunctionNode(null),
+ fileUri: uri);
Procedure interfaceTarget = new Procedure(new Name("myInterfaceTarget"),
- ProcedureKind.Method, new FunctionNode(null));
+ ProcedureKind.Method, new FunctionNode(null),
+ fileUri: uri);
Procedure setter = new Procedure(
- new Name("mySetter"), ProcedureKind.Setter, new FunctionNode(null));
+ new Name("mySetter"), ProcedureKind.Setter, new FunctionNode(null),
+ fileUri: uri);
Message message = templateUnspecified.withArguments("My Message.");
Name binaryOperator = new Name("+");
Name name = new Name("bar");
@@ -110,8 +113,8 @@
Generator generator =
new ThisAccessGenerator(helper, token, false, false, false);
- Library library = new Library(uri);
- Class cls = new Class(name: 'foo');
+ Library library = new Library(uri, fileUri: uri);
+ Class cls = new Class(name: 'foo', fileUri: uri);
library.addClass(cls);
library.addProcedure(getter);
library.addProcedure(setter);
diff --git a/pkg/front_end/test/fasta/type_inference/type_inference_engine_test.dart b/pkg/front_end/test/fasta/type_inference/type_inference_engine_test.dart
index 1f063e3..83ba5fd 100644
--- a/pkg/front_end/test/fasta/type_inference/type_inference_engine_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_inference_engine_test.dart
@@ -121,7 +121,7 @@
}
void test_interface_type() {
- Class cls = new Class(name: 'C', typeParameters: [T, U]);
+ Class cls = new Class(name: 'C', typeParameters: [T, U], fileUri: dummyUri);
expect(
check(
new InterfaceType(cls, Nullability.legacy, [tpt(T), tpt(U)]), [T]),
@@ -187,7 +187,7 @@
// typedef U F<T, U>(T x);
var typedefNode = new Typedef(
'F', new FunctionType([tpt(T)], tpt(U), Nullability.legacy),
- typeParameters: [T, U]);
+ typeParameters: [T, U], fileUri: dummyUri);
expect(
check(
new TypedefType(typedefNode, Nullability.legacy,
diff --git a/pkg/front_end/test/fasta/type_inference/type_schema_test.dart b/pkg/front_end/test/fasta/type_inference/type_schema_test.dart
index bc794f0..141bcf0 100644
--- a/pkg/front_end/test/fasta/type_inference/type_schema_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_schema_test.dart
@@ -31,9 +31,9 @@
void test_isKnown() {
expect(isKnown(unknownType), isFalse);
expect(isKnown(const DynamicType()), isTrue);
- var classA = new Class(name: 'A');
+ var classA = new Class(name: 'A', fileUri: dummyUri);
var A = new InterfaceType(classA, Nullability.legacy);
- var typedefF = new Typedef('F', A);
+ var typedefF = new Typedef('F', A, fileUri: dummyUri);
expect(isKnown(A), isTrue);
expect(isKnown(new InterfaceType(classA, Nullability.legacy, [A])), isTrue);
expect(
diff --git a/pkg/front_end/test/incremental_suite.dart b/pkg/front_end/test/incremental_suite.dart
index 371df29..5c535ba 100644
--- a/pkg/front_end/test/incremental_suite.dart
+++ b/pkg/front_end/test/incremental_suite.dart
@@ -1923,7 +1923,8 @@
isFinal: true,
getterReference: lib.reference.canonicalName
?.getChildFromFieldWithName(fieldName)
- ?.reference);
+ ?.reference,
+ fileUri: lib.fileUri);
lib.addField(field);
for (Class c in lib.classes) {
if (c.fields
@@ -1935,7 +1936,8 @@
isFinal: true,
getterReference: c.reference.canonicalName
?.getChildFromFieldWithName(fieldName)
- ?.reference);
+ ?.reference,
+ fileUri: c.fileUri);
c.addField(field);
}
}
diff --git a/pkg/front_end/test/member_covariance_test.dart b/pkg/front_end/test/member_covariance_test.dart
index fee063f..aadc962 100644
--- a/pkg/front_end/test/member_covariance_test.dart
+++ b/pkg/front_end/test/member_covariance_test.dart
@@ -5,7 +5,7 @@
// @dart = 2.9
import 'package:expect/expect.dart';
-import 'package:front_end/src/fasta/kernel/kernel_ast_api.dart';
+import 'package:kernel/ast.dart';
import 'package:front_end/src/fasta/kernel/member_covariance.dart';
main() {
@@ -92,7 +92,8 @@
covariance.toString());
Procedure noParameterProcedure = new Procedure(
- new Name('foo'), ProcedureKind.Method, new FunctionNode(null));
+ new Name('foo'), ProcedureKind.Method, new FunctionNode(null),
+ fileUri: dummyUri);
Covariance noParameterProcedureCovariance =
new Covariance.fromMember(noParameterProcedure, forSetter: false);
Expect.isTrue(noParameterProcedureCovariance.isEmpty);
@@ -106,7 +107,8 @@
new Name('foo'),
ProcedureKind.Method,
new FunctionNode(null,
- positionalParameters: [new VariableDeclaration(null)]));
+ positionalParameters: [new VariableDeclaration(null)]),
+ fileUri: dummyUri);
Covariance oneParameterProcedureCovariance =
new Covariance.fromMember(oneParameterProcedure, forSetter: false);
Expect.isTrue(oneParameterProcedureCovariance.isEmpty);
@@ -127,7 +129,8 @@
new VariableDeclaration(null),
new VariableDeclaration(null),
new VariableDeclaration(null)
- ]));
+ ]),
+ fileUri: dummyUri);
Covariance positionalParametersProcedureCovariance =
new Covariance.fromMember(positionalParametersProcedure,
forSetter: false);
@@ -156,7 +159,8 @@
new VariableDeclaration('c'),
new VariableDeclaration('d'),
new VariableDeclaration('e')
- ]));
+ ]),
+ fileUri: dummyUri);
Covariance namedParametersProcedureCovariance =
new Covariance.fromMember(namedParametersProcedure, forSetter: false);
Expect.isTrue(namedParametersProcedureCovariance.isEmpty);
@@ -183,7 +187,8 @@
new TypeParameter(null),
new TypeParameter(null),
new TypeParameter(null),
- ]));
+ ]),
+ fileUri: dummyUri);
Covariance typeParametersProcedureCovariance =
new Covariance.fromMember(typeParametersProcedure, forSetter: false);
Expect.isTrue(typeParametersProcedureCovariance.isEmpty);
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 10f93ef..a7b97ca 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -365,6 +365,7 @@
effects
efficient
efficiently
+eighth
elem
eliminating
elt
@@ -1254,6 +1255,7 @@
tuple5
tuple6
tuple7
+tuple8
type1
type2
typeref
diff --git a/pkg/front_end/test/src/base/processed_options_test.dart b/pkg/front_end/test/src/base/processed_options_test.dart
index f8a87cb..9da4fd3 100644
--- a/pkg/front_end/test/src/base/processed_options_test.dart
+++ b/pkg/front_end/test/src/base/processed_options_test.dart
@@ -38,9 +38,12 @@
Component _mockOutline;
- Component get mockSummary => _mockOutline ??= new Component(
- libraries: [new Library(Uri.parse('org-dartlang-test:///a/b.dart'))])
- ..setMainMethodAndMode(null, false, NonNullableByDefaultCompiledMode.Weak);
+ Component get mockSummary => _mockOutline ??= new Component(libraries: [
+ new Library(Uri.parse('org-dartlang-test:///a/b.dart'),
+ fileUri: Uri.parse('org-dartlang-test:///a/b.dart'))
+ ])
+ ..setMainMethodAndMode(
+ null, false, NonNullableByDefaultCompiledMode.Weak);
test_compileSdk_false() {
for (var value in [false, true]) {
diff --git a/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart b/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
index a71ada8..b51b99d 100644
--- a/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
+++ b/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
@@ -303,7 +303,7 @@
}
void _testDeferredCheck() {
- Library library = new Library(dummyUri);
+ Library library = new Library(dummyUri, fileUri: dummyUri);
LibraryDependency dependency =
LibraryDependency.deferredImport(library, 'pre');
VariableDeclaration check =
@@ -313,11 +313,12 @@
}
void _testFactoryConstructorInvocationJudgment() {
- Library library = new Library(dummyUri);
- Class cls = new Class(name: 'Class');
+ Library library = new Library(dummyUri, fileUri: dummyUri);
+ Class cls = new Class(name: 'Class', fileUri: dummyUri);
library.addClass(cls);
Procedure factoryConstructor = new Procedure(
- new Name(''), ProcedureKind.Factory, new FunctionNode(null));
+ new Name(''), ProcedureKind.Factory, new FunctionNode(null),
+ fileUri: dummyUri);
cls.addProcedure(factoryConstructor);
testExpression(
@@ -525,7 +526,7 @@
}
void _testLoadLibraryImpl() {
- Library library = new Library(dummyUri);
+ Library library = new Library(dummyUri, fileUri: dummyUri);
LibraryDependency dependency =
LibraryDependency.deferredImport(library, 'pre');
testExpression(new LoadLibraryImpl(dependency, new ArgumentsImpl([])), '''
@@ -537,7 +538,7 @@
}
void _testLoadLibraryTearOff() {
- Library library = new Library(dummyUri);
+ Library library = new Library(dummyUri, fileUri: dummyUri);
LibraryDependency dependency =
LibraryDependency.deferredImport(library, 'pre');
@@ -545,7 +546,8 @@
pre.loadLibrary''');
Procedure procedure = new Procedure(new Name('get#loadLibrary'),
- ProcedureKind.Getter, new FunctionNode(new Block([])));
+ ProcedureKind.Getter, new FunctionNode(new Block([])),
+ fileUri: dummyUri);
testExpression(new LoadLibraryTearOff(dependency, procedure), '''
pre.loadLibrary''');
}
@@ -610,12 +612,15 @@
void _testSuperIndexSet() {}
void _testExtensionIndexSet() {
- Library library = new Library(dummyUri);
+ Library library = new Library(dummyUri, fileUri: dummyUri);
Extension extension = new Extension(
- name: 'Extension', typeParameters: [new TypeParameter('T')]);
+ name: 'Extension',
+ typeParameters: [new TypeParameter('T')],
+ fileUri: dummyUri);
library.addExtension(extension);
- Procedure setter =
- new Procedure(new Name(''), ProcedureKind.Method, new FunctionNode(null));
+ Procedure setter = new Procedure(
+ new Name(''), ProcedureKind.Method, new FunctionNode(null),
+ fileUri: dummyUri);
library.addProcedure(setter);
testExpression(
diff --git a/pkg/front_end/test/type_labeler_test.dart b/pkg/front_end/test/type_labeler_test.dart
index 8814e5e..3acfa34 100644
--- a/pkg/front_end/test/type_labeler_test.dart
+++ b/pkg/front_end/test/type_labeler_test.dart
@@ -31,32 +31,42 @@
}
// Library mocks
- Library dartCoreLib = new Library(new Uri(scheme: 'dart', path: 'core'));
- Library myLib = new Library(Uri.parse("org-dartlang-testcase:///mylib.dart"));
+ Uri dartCoreUri = new Uri(scheme: 'dart', path: 'core');
+ Library dartCoreLib = new Library(dartCoreUri, fileUri: dartCoreUri);
+ Uri myUri = Uri.parse("org-dartlang-testcase:///mylib.dart");
+ Library myLib = new Library(myUri, fileUri: myUri);
// Set up some classes
- Class objectClass = new Class(name: "Object")..parent = dartCoreLib;
+ Class objectClass = new Class(name: "Object", fileUri: dartCoreUri)
+ ..parent = dartCoreLib;
Supertype objectSuper = new Supertype(objectClass, []);
- Class boolClass = new Class(name: "bool", supertype: objectSuper)
- ..parent = dartCoreLib;
- Class numClass = new Class(name: "num", supertype: objectSuper)
- ..parent = dartCoreLib;
+ Class boolClass =
+ new Class(name: "bool", supertype: objectSuper, fileUri: dartCoreUri)
+ ..parent = dartCoreLib;
+ Class numClass =
+ new Class(name: "num", supertype: objectSuper, fileUri: dartCoreUri)
+ ..parent = dartCoreLib;
Supertype numSuper = new Supertype(numClass, []);
- Class intClass = new Class(name: "int", supertype: numSuper)
- ..parent = dartCoreLib;
- Class fooClass = new Class(name: "Foo", supertype: objectSuper)
- ..parent = myLib;
- Class foo2Class = new Class(name: "Foo", supertype: objectSuper)
- ..parent = myLib;
+ Class intClass =
+ new Class(name: "int", supertype: numSuper, fileUri: dartCoreUri)
+ ..parent = dartCoreLib;
+ Class fooClass =
+ new Class(name: "Foo", supertype: objectSuper, fileUri: myUri)
+ ..parent = myLib;
+ Class foo2Class =
+ new Class(name: "Foo", supertype: objectSuper, fileUri: myUri)
+ ..parent = myLib;
Class barClass = new Class(
name: "Bar",
supertype: objectSuper,
- typeParameters: [new TypeParameter("X")])
+ typeParameters: [new TypeParameter("X")],
+ fileUri: myUri)
..parent = myLib;
Class bazClass = new Class(
name: "Baz",
supertype: objectSuper,
- typeParameters: [new TypeParameter("X"), new TypeParameter("Y")])
+ typeParameters: [new TypeParameter("X"), new TypeParameter("Y")],
+ fileUri: myUri)
..parent = myLib;
// Test types
@@ -184,25 +194,30 @@
check({funGenericBar: "T Function<T extends Bar<T>>(T)"}, 1);
// Add some members for testing instance constants
- Field booField = new Field.immutable(new Name("boo"), type: boolType);
+ Field booField = new Field.immutable(new Name("boo"),
+ type: boolType, fileUri: fooClass.fileUri);
fooClass.fields.add(booField);
- Field valueField = new Field.immutable(new Name("value"), type: intType);
+ Field valueField = new Field.immutable(new Name("value"),
+ type: intType, fileUri: foo2Class.fileUri);
foo2Class.fields.add(valueField);
- Field nextField = new Field.immutable(new Name("next"), type: foo2);
+ Field nextField = new Field.immutable(new Name("next"),
+ type: foo2, fileUri: foo2Class.fileUri);
foo2Class.fields.add(nextField);
Field xField = new Field.immutable(new Name("x"),
- type: new TypeParameterType(
- bazClass.typeParameters[0], Nullability.legacy));
+ type:
+ new TypeParameterType(bazClass.typeParameters[0], Nullability.legacy),
+ fileUri: bazClass.fileUri);
bazClass.fields.add(xField);
Field yField = new Field.immutable(new Name("y"),
- type: new TypeParameterType(
- bazClass.typeParameters[1], Nullability.legacy));
+ type:
+ new TypeParameterType(bazClass.typeParameters[1], Nullability.legacy),
+ fileUri: bazClass.fileUri);
bazClass.fields.add(yField);
FunctionNode gooFunction = new FunctionNode(new EmptyStatement(),
typeParameters: [new TypeParameter("V")]);
Procedure gooMethod = new Procedure(
new Name("goo"), ProcedureKind.Method, gooFunction,
- isStatic: true)
+ isStatic: true, fileUri: fooClass.fileUri)
..parent = fooClass;
// Test constants
diff --git a/pkg/front_end/testcases/general/ambiguous_exports.dart.weak.expect b/pkg/front_end/testcases/general/ambiguous_exports.dart.weak.expect
index 3937612f..8155e8e 100644
--- a/pkg/front_end/testcases/general/ambiguous_exports.dart.weak.expect
+++ b/pkg/front_end/testcases/general/ambiguous_exports.dart.weak.expect
@@ -12,7 +12,7 @@
export "org-dartlang-testcase:///hello.dart" show main;
export "org-dartlang-testcase:///map.dart" show main;
-static const field dynamic _exports# = #C1 /* from null */;
+static const field dynamic _exports# = #C1;
library;
import self as self2;
diff --git a/pkg/front_end/testcases/general/ambiguous_exports.dart.weak.outline.expect b/pkg/front_end/testcases/general/ambiguous_exports.dart.weak.outline.expect
index 1c4f96d..8f8c65a 100644
--- a/pkg/front_end/testcases/general/ambiguous_exports.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/ambiguous_exports.dart.weak.outline.expect
@@ -11,7 +11,7 @@
export "org-dartlang-testcase:///hello.dart" show main;
export "org-dartlang-testcase:///map.dart" show main;
-static const field dynamic _exports# = "{\"main\":\"'main' is exported from both 'pkg/front_end/testcases/general/hello.dart' and 'pkg/front_end/testcases/general/map.dart'.\"}" /* from null */;
+static const field dynamic _exports# = "{\"main\":\"'main' is exported from both 'pkg/front_end/testcases/general/hello.dart' and 'pkg/front_end/testcases/general/map.dart'.\"}";
library;
import self as self2;
diff --git a/pkg/front_end/testcases/general/ambiguous_exports.dart.weak.transformed.expect b/pkg/front_end/testcases/general/ambiguous_exports.dart.weak.transformed.expect
index 3937612f..8155e8e 100644
--- a/pkg/front_end/testcases/general/ambiguous_exports.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/ambiguous_exports.dart.weak.transformed.expect
@@ -12,7 +12,7 @@
export "org-dartlang-testcase:///hello.dart" show main;
export "org-dartlang-testcase:///map.dart" show main;
-static const field dynamic _exports# = #C1 /* from null */;
+static const field dynamic _exports# = #C1;
library;
import self as self2;
diff --git a/pkg/front_end/testcases/incremental/changing_modules_3.yaml.world.1.expect b/pkg/front_end/testcases/incremental/changing_modules_3.yaml.world.1.expect
index 5a2b2fe..d25031d1 100644
--- a/pkg/front_end/testcases/incremental/changing_modules_3.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/changing_modules_3.yaml.world.1.expect
@@ -2,13 +2,13 @@
library from "package:foo/foo.dart" as foo {
static field dart.core::bool* foo = true;
- final field dynamic unique_SimulateTransformer /* from null */;
+ final field dynamic unique_SimulateTransformer;
}
library from "org-dartlang-test:///main.dart" as main {
import "package:foo/foo.dart";
- final field dynamic unique_SimulateTransformer /* from null */;
+ final field dynamic unique_SimulateTransformer;
static method main() → dynamic {
dart.core::print(foo::foo);
}
diff --git a/pkg/front_end/testcases/incremental/changing_modules_3.yaml.world.2.expect b/pkg/front_end/testcases/incremental/changing_modules_3.yaml.world.2.expect
index 404cb39..56379e6 100644
--- a/pkg/front_end/testcases/incremental/changing_modules_3.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/changing_modules_3.yaml.world.2.expect
@@ -2,13 +2,13 @@
library from "package:foo/foo.dart" as foo {
static field dart.core::bool* foo2 = true;
- final field dynamic unique_SimulateTransformer /* from null */;
+ final field dynamic unique_SimulateTransformer;
}
library from "org-dartlang-test:///main.dart" as main {
import "package:foo/foo.dart";
- final field dynamic unique_SimulateTransformer /* from null */;
+ final field dynamic unique_SimulateTransformer;
static method main() → dynamic {
dart.core::print(foo::foo2);
}
diff --git a/pkg/front_end/testcases/incremental/constant_exports_hash.yaml.world.1.expect b/pkg/front_end/testcases/incremental/constant_exports_hash.yaml.world.1.expect
index 98debfd..1e025c7 100644
--- a/pkg/front_end/testcases/incremental/constant_exports_hash.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/constant_exports_hash.yaml.world.1.expect
@@ -23,7 +23,7 @@
export "org-dartlang-test:///lib1.dart" show x;
export "org-dartlang-test:///lib2.dart" show x;
- static const field dynamic _exports# = #C1 /* from null */;
+ static const field dynamic _exports# = #C1;
static method main() → dynamic {
dart.core::print("exports");
}
diff --git a/pkg/front_end/testcases/incremental/constant_exports_hash.yaml.world.2.expect b/pkg/front_end/testcases/incremental/constant_exports_hash.yaml.world.2.expect
index 6d8b798..79292ff 100644
--- a/pkg/front_end/testcases/incremental/constant_exports_hash.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/constant_exports_hash.yaml.world.2.expect
@@ -23,7 +23,7 @@
export "org-dartlang-test:///lib1.dart" show x;
export "org-dartlang-test:///lib2.dart" show x;
- static const field dynamic _exports# = #C1 /* from null */;
+ static const field dynamic _exports# = #C1;
static method main() → dynamic {
dart.core::print("exports!");
}
diff --git a/pkg/front_end/testcases/incremental/flutter_widget_transform.yaml.world.1.expect b/pkg/front_end/testcases/incremental/flutter_widget_transform.yaml.world.1.expect
index 40e76bf..aaba95f 100644
--- a/pkg/front_end/testcases/incremental/flutter_widget_transform.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/flutter_widget_transform.yaml.world.1.expect
@@ -12,7 +12,7 @@
abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
}
abstract class Widget extends fra::Bar implements wid::_HasCreationLocation {
- final field wid::_Location* _location /* from null */;
+ final field wid::_Location* _location;
synthetic constructor •({wid::_Location* $creationLocationd_0dea112b090073317d4 = #C1}) → fra::Widget*
: super fra::Bar::•(), fra::Widget::_location = $creationLocationd_0dea112b090073317d4
;
diff --git a/pkg/front_end/testcases/incremental/flutter_widget_transform.yaml.world.2.expect b/pkg/front_end/testcases/incremental/flutter_widget_transform.yaml.world.2.expect
index 40e76bf..aaba95f 100644
--- a/pkg/front_end/testcases/incremental/flutter_widget_transform.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/flutter_widget_transform.yaml.world.2.expect
@@ -12,7 +12,7 @@
abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
}
abstract class Widget extends fra::Bar implements wid::_HasCreationLocation {
- final field wid::_Location* _location /* from null */;
+ final field wid::_Location* _location;
synthetic constructor •({wid::_Location* $creationLocationd_0dea112b090073317d4 = #C1}) → fra::Widget*
: super fra::Bar::•(), fra::Widget::_location = $creationLocationd_0dea112b090073317d4
;
diff --git a/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.1.expect b/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.1.expect
index d4fdb52..4d7e73b 100644
--- a/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.1.expect
@@ -7,7 +7,7 @@
;
}
abstract class Widget extends fra::Bar implements wid::_HasCreationLocation /*hasConstConstructor*/ {
- final field wid::_Location? _location /*isLegacy, from null */;
+ final field wid::_Location? _location /*isLegacy*/;
const constructor •({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → fra::Widget
: super fra::Bar::•(), fra::Widget::_location = $creationLocationd_0dea112b090073317d4
;
diff --git a/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.2.expect b/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.2.expect
index 5db0fd8..f3b9199 100644
--- a/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.2.expect
@@ -7,7 +7,7 @@
;
}
abstract class Widget extends fra::Bar implements wid::_HasCreationLocation /*hasConstConstructor*/ {
- final field wid::_Location? _location /*isLegacy, from null */;
+ final field wid::_Location? _location /*isLegacy*/;
const constructor •({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → fra::Widget
: super fra::Bar::•(), fra::Widget::_location = $creationLocationd_0dea112b090073317d4
;
diff --git a/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.3.expect b/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.3.expect
index d4fdb52..4d7e73b 100644
--- a/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.3.expect
@@ -7,7 +7,7 @@
;
}
abstract class Widget extends fra::Bar implements wid::_HasCreationLocation /*hasConstConstructor*/ {
- final field wid::_Location? _location /*isLegacy, from null */;
+ final field wid::_Location? _location /*isLegacy*/;
const constructor •({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → fra::Widget
: super fra::Bar::•(), fra::Widget::_location = $creationLocationd_0dea112b090073317d4
;
diff --git a/pkg/front_end/testcases/incremental/flutter_widget_transform_nnbd.yaml.world.1.expect b/pkg/front_end/testcases/incremental/flutter_widget_transform_nnbd.yaml.world.1.expect
index c896f26..bf659ac 100644
--- a/pkg/front_end/testcases/incremental/flutter_widget_transform_nnbd.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/flutter_widget_transform_nnbd.yaml.world.1.expect
@@ -7,7 +7,7 @@
;
}
abstract class Widget extends fra::Bar implements wid::_HasCreationLocation /*hasConstConstructor*/ {
- final field wid::_Location? _location /*isLegacy, from null */;
+ final field wid::_Location? _location /*isLegacy*/;
const constructor •({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → fra::Widget
: super fra::Bar::•(), fra::Widget::_location = $creationLocationd_0dea112b090073317d4
;
diff --git a/pkg/front_end/testcases/incremental/flutter_widget_transform_nnbd.yaml.world.2.expect b/pkg/front_end/testcases/incremental/flutter_widget_transform_nnbd.yaml.world.2.expect
index 23d9796..5a5826d 100644
--- a/pkg/front_end/testcases/incremental/flutter_widget_transform_nnbd.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/flutter_widget_transform_nnbd.yaml.world.2.expect
@@ -7,7 +7,7 @@
;
}
abstract class Widget extends fra::Bar implements wid::_HasCreationLocation /*hasConstConstructor*/ {
- final field wid::_Location? _location /*isLegacy, from null */;
+ final field wid::_Location? _location /*isLegacy*/;
const constructor •({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → fra::Widget
: super fra::Bar::•(), fra::Widget::_location = $creationLocationd_0dea112b090073317d4
;
diff --git a/pkg/front_end/testcases/incremental/flutter_widget_transformer_43371.yaml.world.1.expect b/pkg/front_end/testcases/incremental/flutter_widget_transformer_43371.yaml.world.1.expect
index b666fa7..2c443b6 100644
--- a/pkg/front_end/testcases/incremental/flutter_widget_transformer_43371.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/flutter_widget_transformer_43371.yaml.world.1.expect
@@ -8,7 +8,7 @@
}
abstract class Widget extends fra::Bar implements wid::_HasCreationLocation /*hasConstConstructor*/ {
final field dart.core::Object? key;
- final field wid::_Location? _location /*isLegacy, from null */;
+ final field wid::_Location? _location /*isLegacy*/;
const constructor •({dart.core::Object? key = #C1, wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → fra::Widget
: fra::Widget::key = key, super fra::Bar::•(), fra::Widget::_location = $creationLocationd_0dea112b090073317d4
;
diff --git a/pkg/front_end/testcases/incremental/flutter_widget_transformer_43371.yaml.world.2.expect b/pkg/front_end/testcases/incremental/flutter_widget_transformer_43371.yaml.world.2.expect
index 6d4e387..a13a232 100644
--- a/pkg/front_end/testcases/incremental/flutter_widget_transformer_43371.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/flutter_widget_transformer_43371.yaml.world.2.expect
@@ -8,7 +8,7 @@
}
abstract class Widget extends fra::Bar implements wid::_HasCreationLocation /*hasConstConstructor*/ {
final field dart.core::Object? key;
- final field wid::_Location? _location /*isLegacy, from null */;
+ final field wid::_Location? _location /*isLegacy*/;
const constructor •({dart.core::Object? key = #C1, wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → fra::Widget
: fra::Widget::key = key, super fra::Bar::•(), fra::Widget::_location = $creationLocationd_0dea112b090073317d4
;
diff --git a/pkg/front_end/testcases/incremental/flutter_widget_transformer_non_const.yaml.world.1.expect b/pkg/front_end/testcases/incremental/flutter_widget_transformer_non_const.yaml.world.1.expect
index 506067f..67d2066 100644
--- a/pkg/front_end/testcases/incremental/flutter_widget_transformer_non_const.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/flutter_widget_transformer_non_const.yaml.world.1.expect
@@ -7,7 +7,7 @@
;
}
abstract class Widget extends fra::Bar implements wid::_HasCreationLocation /*hasConstConstructor*/ {
- final field wid::_Location? _location /*isLegacy, from null */;
+ final field wid::_Location? _location /*isLegacy*/;
const constructor •({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → fra::Widget
: super fra::Bar::•(), fra::Widget::_location = $creationLocationd_0dea112b090073317d4
;
diff --git a/pkg/front_end/testcases/incremental/flutter_widget_transformer_non_const.yaml.world.2.expect b/pkg/front_end/testcases/incremental/flutter_widget_transformer_non_const.yaml.world.2.expect
index fda5bb6..ec9e667 100644
--- a/pkg/front_end/testcases/incremental/flutter_widget_transformer_non_const.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/flutter_widget_transformer_non_const.yaml.world.2.expect
@@ -7,7 +7,7 @@
;
}
abstract class Widget extends fra::Bar implements wid::_HasCreationLocation /*hasConstConstructor*/ {
- final field wid::_Location? _location /*isLegacy, from null */;
+ final field wid::_Location? _location /*isLegacy*/;
const constructor •({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → fra::Widget
: super fra::Bar::•(), fra::Widget::_location = $creationLocationd_0dea112b090073317d4
;
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_18.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_outline_change_18.yaml.world.1.expect
index baa6de2..bc3a9bc 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_18.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_18.yaml.world.1.expect
@@ -27,7 +27,7 @@
export "org-dartlang-test:///lib1.dart" show x;
export "org-dartlang-test:///lib2.dart" show x;
- static const field dynamic _exports# = #C1 /* from null */;
+ static const field dynamic _exports# = #C1;
static method main() → dynamic {
dart.core::print("exports");
}
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_18.yaml.world.2.expect b/pkg/front_end/testcases/incremental/no_outline_change_18.yaml.world.2.expect
index d40f10d..2387ec3 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_18.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_18.yaml.world.2.expect
@@ -27,7 +27,7 @@
export "org-dartlang-test:///lib1.dart" show x;
export "org-dartlang-test:///lib2.dart" show x;
- static const field dynamic _exports# = #C1 /* from null */;
+ static const field dynamic _exports# = #C1;
static method main() → dynamic {
dart.core::print("exports!");
}
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_44_flutter.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_outline_change_44_flutter.yaml.world.1.expect
index 1c83cc5..394b66f 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_44_flutter.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_44_flutter.yaml.world.1.expect
@@ -4,7 +4,7 @@
import "package:flutter/src/widgets/widget_inspector.dart";
abstract class Widget extends dart.core::Object implements wid::_HasCreationLocation {
- final field wid::_Location? _location /*isLegacy, from null */;
+ final field wid::_Location? _location /*isLegacy*/;
synthetic constructor •({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → fra::Widget
: super dart.core::Object::•(), fra::Widget::_location = $creationLocationd_0dea112b090073317d4
;
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_44_flutter.yaml.world.2.expect b/pkg/front_end/testcases/incremental/no_outline_change_44_flutter.yaml.world.2.expect
index 1c83cc5..394b66f 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_44_flutter.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_44_flutter.yaml.world.2.expect
@@ -4,7 +4,7 @@
import "package:flutter/src/widgets/widget_inspector.dart";
abstract class Widget extends dart.core::Object implements wid::_HasCreationLocation {
- final field wid::_Location? _location /*isLegacy, from null */;
+ final field wid::_Location? _location /*isLegacy*/;
synthetic constructor •({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → fra::Widget
: super dart.core::Object::•(), fra::Widget::_location = $creationLocationd_0dea112b090073317d4
;
diff --git a/pkg/front_end/testcases/nnbd/ambiguous_main_export.dart.strong.expect b/pkg/front_end/testcases/nnbd/ambiguous_main_export.dart.strong.expect
index 54558c4..02aa3e0 100644
--- a/pkg/front_end/testcases/nnbd/ambiguous_main_export.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/ambiguous_main_export.dart.strong.expect
@@ -19,7 +19,7 @@
export "org-dartlang-testcase:///ambiguous_main_export_lib1.dart";
export "org-dartlang-testcase:///ambiguous_main_export_lib2.dart";
-static const field dynamic _exports# = #C1 /*isLegacy, from null */;
+static const field dynamic _exports# = #C1 /*isLegacy*/;
library /*isNonNullableByDefault*/;
import self as self3;
diff --git a/pkg/front_end/testcases/nnbd/ambiguous_main_export.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/ambiguous_main_export.dart.strong.transformed.expect
index 54558c4..02aa3e0 100644
--- a/pkg/front_end/testcases/nnbd/ambiguous_main_export.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ambiguous_main_export.dart.strong.transformed.expect
@@ -19,7 +19,7 @@
export "org-dartlang-testcase:///ambiguous_main_export_lib1.dart";
export "org-dartlang-testcase:///ambiguous_main_export_lib2.dart";
-static const field dynamic _exports# = #C1 /*isLegacy, from null */;
+static const field dynamic _exports# = #C1 /*isLegacy*/;
library /*isNonNullableByDefault*/;
import self as self3;
diff --git a/pkg/front_end/testcases/nnbd/ambiguous_main_export.dart.weak.expect b/pkg/front_end/testcases/nnbd/ambiguous_main_export.dart.weak.expect
index 54558c4..02aa3e0 100644
--- a/pkg/front_end/testcases/nnbd/ambiguous_main_export.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/ambiguous_main_export.dart.weak.expect
@@ -19,7 +19,7 @@
export "org-dartlang-testcase:///ambiguous_main_export_lib1.dart";
export "org-dartlang-testcase:///ambiguous_main_export_lib2.dart";
-static const field dynamic _exports# = #C1 /*isLegacy, from null */;
+static const field dynamic _exports# = #C1 /*isLegacy*/;
library /*isNonNullableByDefault*/;
import self as self3;
diff --git a/pkg/front_end/testcases/nnbd/ambiguous_main_export.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/ambiguous_main_export.dart.weak.outline.expect
index efac096..35d6ebf 100644
--- a/pkg/front_end/testcases/nnbd/ambiguous_main_export.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/ambiguous_main_export.dart.weak.outline.expect
@@ -19,7 +19,7 @@
export "org-dartlang-testcase:///ambiguous_main_export_lib1.dart";
export "org-dartlang-testcase:///ambiguous_main_export_lib2.dart";
-static const field dynamic _exports# = "{\"main\":\"'main' is exported from both 'pkg/front_end/testcases/nnbd/ambiguous_main_export_lib1.dart' and 'pkg/front_end/testcases/nnbd/ambiguous_main_export_lib2.dart'.\"}" /*isLegacy, from null */;
+static const field dynamic _exports# = "{\"main\":\"'main' is exported from both 'pkg/front_end/testcases/nnbd/ambiguous_main_export_lib1.dart' and 'pkg/front_end/testcases/nnbd/ambiguous_main_export_lib2.dart'.\"}" /*isLegacy*/;
library /*isNonNullableByDefault*/;
import self as self3;
diff --git a/pkg/front_end/testcases/nnbd/ambiguous_main_export.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/ambiguous_main_export.dart.weak.transformed.expect
index 54558c4..02aa3e0 100644
--- a/pkg/front_end/testcases/nnbd/ambiguous_main_export.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ambiguous_main_export.dart.weak.transformed.expect
@@ -19,7 +19,7 @@
export "org-dartlang-testcase:///ambiguous_main_export_lib1.dart";
export "org-dartlang-testcase:///ambiguous_main_export_lib2.dart";
-static const field dynamic _exports# = #C1 /*isLegacy, from null */;
+static const field dynamic _exports# = #C1 /*isLegacy*/;
library /*isNonNullableByDefault*/;
import self as self3;
diff --git a/pkg/front_end/testcases/nnbd/duplicates_toplevel.dart.strong.expect b/pkg/front_end/testcases/nnbd/duplicates_toplevel.dart.strong.expect
index 1ad3410..3f6e28a 100644
--- a/pkg/front_end/testcases/nnbd/duplicates_toplevel.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/duplicates_toplevel.dart.strong.expect
@@ -176,7 +176,7 @@
static final field core::int topLevelDuplicateFieldAndSetter;
static final field core::int topLevelFieldAndDuplicateSetter = 1;
static final field core::int topLevelDuplicateFieldAndDuplicateSetter;
-static const field dynamic _exports# = #C1 /*isLegacy, from null */;
+static const field dynamic _exports# = #C1 /*isLegacy*/;
static method topLevelMethod() → core::int
return 1;
static get topLevelGetter() → core::int
diff --git a/pkg/front_end/testcases/nnbd/duplicates_toplevel.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/duplicates_toplevel.dart.strong.transformed.expect
index 1ad3410..3f6e28a 100644
--- a/pkg/front_end/testcases/nnbd/duplicates_toplevel.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/duplicates_toplevel.dart.strong.transformed.expect
@@ -176,7 +176,7 @@
static final field core::int topLevelDuplicateFieldAndSetter;
static final field core::int topLevelFieldAndDuplicateSetter = 1;
static final field core::int topLevelDuplicateFieldAndDuplicateSetter;
-static const field dynamic _exports# = #C1 /*isLegacy, from null */;
+static const field dynamic _exports# = #C1 /*isLegacy*/;
static method topLevelMethod() → core::int
return 1;
static get topLevelGetter() → core::int
diff --git a/pkg/front_end/testcases/nnbd/duplicates_toplevel.dart.weak.expect b/pkg/front_end/testcases/nnbd/duplicates_toplevel.dart.weak.expect
index 1ad3410..3f6e28a 100644
--- a/pkg/front_end/testcases/nnbd/duplicates_toplevel.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/duplicates_toplevel.dart.weak.expect
@@ -176,7 +176,7 @@
static final field core::int topLevelDuplicateFieldAndSetter;
static final field core::int topLevelFieldAndDuplicateSetter = 1;
static final field core::int topLevelDuplicateFieldAndDuplicateSetter;
-static const field dynamic _exports# = #C1 /*isLegacy, from null */;
+static const field dynamic _exports# = #C1 /*isLegacy*/;
static method topLevelMethod() → core::int
return 1;
static get topLevelGetter() → core::int
diff --git a/pkg/front_end/testcases/nnbd/duplicates_toplevel.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/duplicates_toplevel.dart.weak.outline.expect
index bf1599b..2540f70 100644
--- a/pkg/front_end/testcases/nnbd/duplicates_toplevel.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/duplicates_toplevel.dart.weak.outline.expect
@@ -124,7 +124,7 @@
static final field core::int topLevelDuplicateFieldAndSetter;
static final field core::int topLevelFieldAndDuplicateSetter;
static final field core::int topLevelDuplicateFieldAndDuplicateSetter;
-static const field dynamic _exports# = "{\"topLevelSetter\":\"'topLevelSetter' is exported from both 'pkg/front_end/testcases/nnbd/duplicates_toplevel.dart' and 'pkg/front_end/testcases/nnbd/duplicates_toplevel.dart'.\",\"topLevelFieldAndDuplicateSetter\":\"'topLevelFieldAndDuplicateSetter' is exported from both 'pkg/front_end/testcases/nnbd/duplicates_toplevel.dart' and 'pkg/front_end/testcases/nnbd/duplicates_toplevel.dart'.\",\"topLevelDuplicateFieldAndDuplicateSetter\":\"'topLevelDuplicateFieldAndDuplicateSetter' is exported from both 'pkg/front_end/testcases/nnbd/duplicates_toplevel.dart' and 'pkg/front_end/testcases/nnbd/duplicates_toplevel.dart'.\"}" /*isLegacy, from null */;
+static const field dynamic _exports# = "{\"topLevelSetter\":\"'topLevelSetter' is exported from both 'pkg/front_end/testcases/nnbd/duplicates_toplevel.dart' and 'pkg/front_end/testcases/nnbd/duplicates_toplevel.dart'.\",\"topLevelFieldAndDuplicateSetter\":\"'topLevelFieldAndDuplicateSetter' is exported from both 'pkg/front_end/testcases/nnbd/duplicates_toplevel.dart' and 'pkg/front_end/testcases/nnbd/duplicates_toplevel.dart'.\",\"topLevelDuplicateFieldAndDuplicateSetter\":\"'topLevelDuplicateFieldAndDuplicateSetter' is exported from both 'pkg/front_end/testcases/nnbd/duplicates_toplevel.dart' and 'pkg/front_end/testcases/nnbd/duplicates_toplevel.dart'.\"}" /*isLegacy*/;
static method topLevelMethod() → core::int
;
static get topLevelGetter() → core::int
diff --git a/pkg/front_end/testcases/nnbd/duplicates_toplevel.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/duplicates_toplevel.dart.weak.transformed.expect
index 1ad3410..3f6e28a 100644
--- a/pkg/front_end/testcases/nnbd/duplicates_toplevel.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/duplicates_toplevel.dart.weak.transformed.expect
@@ -176,7 +176,7 @@
static final field core::int topLevelDuplicateFieldAndSetter;
static final field core::int topLevelFieldAndDuplicateSetter = 1;
static final field core::int topLevelDuplicateFieldAndDuplicateSetter;
-static const field dynamic _exports# = #C1 /*isLegacy, from null */;
+static const field dynamic _exports# = #C1 /*isLegacy*/;
static method topLevelMethod() → core::int
return 1;
static get topLevelGetter() → core::int
diff --git a/pkg/front_end/testcases/nnbd/field_vs_setter.dart.strong.expect b/pkg/front_end/testcases/nnbd/field_vs_setter.dart.strong.expect
index 4827498..19a933b 100644
--- a/pkg/front_end/testcases/nnbd/field_vs_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/field_vs_setter.dart.strong.expect
@@ -1143,7 +1143,7 @@
static final field core::int? Extension|duplicateExtensionInstanceFieldAndStaticSetter2;
static field core::int? Extension|duplicateExtensionStaticFieldAndInstanceSetter1;
static final field core::int? Extension|duplicateExtensionStaticFieldAndInstanceSetter2;
-static const field dynamic _exports# = #C1 /*isLegacy, from null */;
+static const field dynamic _exports# = #C1 /*isLegacy*/;
static method test() → dynamic {
self::topLevelFieldAndSetter = self::topLevelFieldAndSetter;
self::topLevelFieldAndDuplicateSetter = self::topLevelFieldAndDuplicateSetter;
diff --git a/pkg/front_end/testcases/nnbd/field_vs_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/field_vs_setter.dart.strong.transformed.expect
index 4827498..19a933b 100644
--- a/pkg/front_end/testcases/nnbd/field_vs_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/field_vs_setter.dart.strong.transformed.expect
@@ -1143,7 +1143,7 @@
static final field core::int? Extension|duplicateExtensionInstanceFieldAndStaticSetter2;
static field core::int? Extension|duplicateExtensionStaticFieldAndInstanceSetter1;
static final field core::int? Extension|duplicateExtensionStaticFieldAndInstanceSetter2;
-static const field dynamic _exports# = #C1 /*isLegacy, from null */;
+static const field dynamic _exports# = #C1 /*isLegacy*/;
static method test() → dynamic {
self::topLevelFieldAndSetter = self::topLevelFieldAndSetter;
self::topLevelFieldAndDuplicateSetter = self::topLevelFieldAndDuplicateSetter;
diff --git a/pkg/front_end/testcases/nnbd/field_vs_setter.dart.weak.expect b/pkg/front_end/testcases/nnbd/field_vs_setter.dart.weak.expect
index 4827498..19a933b 100644
--- a/pkg/front_end/testcases/nnbd/field_vs_setter.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/field_vs_setter.dart.weak.expect
@@ -1143,7 +1143,7 @@
static final field core::int? Extension|duplicateExtensionInstanceFieldAndStaticSetter2;
static field core::int? Extension|duplicateExtensionStaticFieldAndInstanceSetter1;
static final field core::int? Extension|duplicateExtensionStaticFieldAndInstanceSetter2;
-static const field dynamic _exports# = #C1 /*isLegacy, from null */;
+static const field dynamic _exports# = #C1 /*isLegacy*/;
static method test() → dynamic {
self::topLevelFieldAndSetter = self::topLevelFieldAndSetter;
self::topLevelFieldAndDuplicateSetter = self::topLevelFieldAndDuplicateSetter;
diff --git a/pkg/front_end/testcases/nnbd/field_vs_setter.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/field_vs_setter.dart.weak.outline.expect
index 87c41fa..60a7204 100644
--- a/pkg/front_end/testcases/nnbd/field_vs_setter.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/field_vs_setter.dart.weak.outline.expect
@@ -774,7 +774,7 @@
static final field core::int? Extension|duplicateExtensionInstanceFieldAndStaticSetter2;
static field core::int? Extension|duplicateExtensionStaticFieldAndInstanceSetter1;
static final field core::int? Extension|duplicateExtensionStaticFieldAndInstanceSetter2;
-static const field dynamic _exports# = "{\"topLevelFieldAndDuplicateSetter\":\"'topLevelFieldAndDuplicateSetter' is exported from both 'pkg/front_end/testcases/nnbd/field_vs_setter.dart' and 'pkg/front_end/testcases/nnbd/field_vs_setter.dart'.\",\"topLevelLateFinalFieldAndDuplicateSetter\":\"'topLevelLateFinalFieldAndDuplicateSetter' is exported from both 'pkg/front_end/testcases/nnbd/field_vs_setter.dart' and 'pkg/front_end/testcases/nnbd/field_vs_setter.dart'.\"}" /*isLegacy, from null */;
+static const field dynamic _exports# = "{\"topLevelFieldAndDuplicateSetter\":\"'topLevelFieldAndDuplicateSetter' is exported from both 'pkg/front_end/testcases/nnbd/field_vs_setter.dart' and 'pkg/front_end/testcases/nnbd/field_vs_setter.dart'.\",\"topLevelLateFinalFieldAndDuplicateSetter\":\"'topLevelLateFinalFieldAndDuplicateSetter' is exported from both 'pkg/front_end/testcases/nnbd/field_vs_setter.dart' and 'pkg/front_end/testcases/nnbd/field_vs_setter.dart'.\"}" /*isLegacy*/;
static method test() → dynamic
;
static method main() → dynamic
diff --git a/pkg/front_end/testcases/nnbd/field_vs_setter.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/field_vs_setter.dart.weak.transformed.expect
index 4827498..19a933b 100644
--- a/pkg/front_end/testcases/nnbd/field_vs_setter.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/field_vs_setter.dart.weak.transformed.expect
@@ -1143,7 +1143,7 @@
static final field core::int? Extension|duplicateExtensionInstanceFieldAndStaticSetter2;
static field core::int? Extension|duplicateExtensionStaticFieldAndInstanceSetter1;
static final field core::int? Extension|duplicateExtensionStaticFieldAndInstanceSetter2;
-static const field dynamic _exports# = #C1 /*isLegacy, from null */;
+static const field dynamic _exports# = #C1 /*isLegacy*/;
static method test() → dynamic {
self::topLevelFieldAndSetter = self::topLevelFieldAndSetter;
self::topLevelFieldAndDuplicateSetter = self::topLevelFieldAndDuplicateSetter;
diff --git a/pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart.strong.expect b/pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart.strong.expect
index 5582fac..f59eb15 100644
--- a/pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart.strong.expect
@@ -165,7 +165,7 @@
static set extensionInstanceMethodAndStaticSetter = set self::Extension|extensionInstanceMethodAndStaticSetter;
set extensionStaticMethodAndInstanceSetter = self::Extension|set#extensionStaticMethodAndInstanceSetter;
}
-static const field dynamic _exports# = #C1 /*isLegacy, from null */;
+static const field dynamic _exports# = #C1 /*isLegacy*/;
static method topLevelMethodAndSetter() → dynamic {}
static set topLevelMethodAndSetter(dynamic value) → void {}
static set classAndSetter(dynamic value) → void {}
diff --git a/pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart.strong.transformed.expect
index 5582fac..f59eb15 100644
--- a/pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart.strong.transformed.expect
@@ -165,7 +165,7 @@
static set extensionInstanceMethodAndStaticSetter = set self::Extension|extensionInstanceMethodAndStaticSetter;
set extensionStaticMethodAndInstanceSetter = self::Extension|set#extensionStaticMethodAndInstanceSetter;
}
-static const field dynamic _exports# = #C1 /*isLegacy, from null */;
+static const field dynamic _exports# = #C1 /*isLegacy*/;
static method topLevelMethodAndSetter() → dynamic {}
static set topLevelMethodAndSetter(dynamic value) → void {}
static set classAndSetter(dynamic value) → void {}
diff --git a/pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart.weak.expect b/pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart.weak.expect
index 5582fac..f59eb15 100644
--- a/pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart.weak.expect
@@ -165,7 +165,7 @@
static set extensionInstanceMethodAndStaticSetter = set self::Extension|extensionInstanceMethodAndStaticSetter;
set extensionStaticMethodAndInstanceSetter = self::Extension|set#extensionStaticMethodAndInstanceSetter;
}
-static const field dynamic _exports# = #C1 /*isLegacy, from null */;
+static const field dynamic _exports# = #C1 /*isLegacy*/;
static method topLevelMethodAndSetter() → dynamic {}
static set topLevelMethodAndSetter(dynamic value) → void {}
static set classAndSetter(dynamic value) → void {}
diff --git a/pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart.weak.outline.expect
index f837d5e..9d670ab 100644
--- a/pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart.weak.outline.expect
@@ -138,7 +138,7 @@
static set extensionInstanceMethodAndStaticSetter = set self::Extension|extensionInstanceMethodAndStaticSetter;
set extensionStaticMethodAndInstanceSetter = self::Extension|set#extensionStaticMethodAndInstanceSetter;
}
-static const field dynamic _exports# = "{\"topLevelMethodAndSetter\":\"'topLevelMethodAndSetter' is exported from both 'pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart' and 'pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart'.\"}" /*isLegacy, from null */;
+static const field dynamic _exports# = "{\"topLevelMethodAndSetter\":\"'topLevelMethodAndSetter' is exported from both 'pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart' and 'pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart'.\"}" /*isLegacy*/;
static method topLevelMethodAndSetter() → dynamic
;
static set topLevelMethodAndSetter(dynamic value) → void
diff --git a/pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart.weak.transformed.expect
index 5582fac..f59eb15 100644
--- a/pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart.weak.transformed.expect
@@ -165,7 +165,7 @@
static set extensionInstanceMethodAndStaticSetter = set self::Extension|extensionInstanceMethodAndStaticSetter;
set extensionStaticMethodAndInstanceSetter = self::Extension|set#extensionStaticMethodAndInstanceSetter;
}
-static const field dynamic _exports# = #C1 /*isLegacy, from null */;
+static const field dynamic _exports# = #C1 /*isLegacy*/;
static method topLevelMethodAndSetter() → dynamic {}
static set topLevelMethodAndSetter(dynamic value) → void {}
static set classAndSetter(dynamic value) → void {}
diff --git a/pkg/frontend_server/test/src/javascript_bundle_test.dart b/pkg/frontend_server/test/src/javascript_bundle_test.dart
index 02cd813..898cbcc 100644
--- a/pkg/frontend_server/test/src/javascript_bundle_test.dart
+++ b/pkg/frontend_server/test/src/javascript_bundle_test.dart
@@ -63,14 +63,19 @@
};
final testCoreLibraries = [
for (String requiredLibrary in allRequiredLibraries)
- Library(Uri.parse(requiredLibrary), classes: [
- for (String requiredClass in allRequiredTypes[requiredLibrary] ?? [])
- Class(name: requiredClass),
- ], procedures: [
- for (var requiredMethod in requiredMethods[requiredLibrary] ?? [])
- Procedure(Name(requiredMethod), ProcedureKind.Method,
- FunctionNode(EmptyStatement())),
- ]),
+ Library(Uri.parse(requiredLibrary),
+ fileUri: Uri.parse(requiredLibrary),
+ classes: [
+ for (String requiredClass
+ in allRequiredTypes[requiredLibrary] ?? [])
+ Class(name: requiredClass, fileUri: Uri.parse(requiredLibrary)),
+ ],
+ procedures: [
+ for (var requiredMethod in requiredMethods[requiredLibrary] ?? [])
+ Procedure(Name(requiredMethod), ProcedureKind.Method,
+ FunctionNode(EmptyStatement()),
+ fileUri: Uri.parse(requiredLibrary)),
+ ]),
];
final packageConfig = PackageConfig.parseJson({
@@ -86,12 +91,14 @@
final multiRootScheme = 'org-dartlang-app';
test('compiles JavaScript code', () async {
+ final uri = Uri.file('/c.dart');
final library = Library(
- Uri.file('/c.dart'),
- fileUri: Uri.file('/c.dart'),
+ uri,
+ fileUri: uri,
procedures: [
Procedure(Name('ArbitrarilyChosen'), ProcedureKind.Method,
- FunctionNode(Block([])))
+ FunctionNode(Block([])),
+ fileUri: uri)
],
);
final testComponent = Component(libraries: [library, ...testCoreLibraries]);
@@ -141,7 +148,8 @@
fileUri: fileUri,
procedures: [
Procedure(Name('ArbitrarilyChosen'), ProcedureKind.Method,
- FunctionNode(Block([])))
+ FunctionNode(Block([])),
+ fileUri: fileUri)
],
);
@@ -182,7 +190,8 @@
fileUri: fileUri,
procedures: [
Procedure(Name('ArbitrarilyChosen'), ProcedureKind.Method,
- FunctionNode(Block([])))
+ FunctionNode(Block([])),
+ fileUri: fileUri)
],
);
@@ -222,15 +231,17 @@
final libraryB = Library(Uri.file('/b.dart'), fileUri: Uri.file('/b.dart'));
libraryC.dependencies.add(LibraryDependency.import(libraryB));
libraryB.dependencies.add(LibraryDependency.import(libraryC));
+ final uriA = Uri.file('/a.dart');
final libraryA = Library(
- Uri.file('/a.dart'),
- fileUri: Uri.file('/a.dart'),
+ uriA,
+ fileUri: uriA,
dependencies: [
LibraryDependency.import(libraryB),
],
procedures: [
Procedure(Name('ArbitrarilyChosen'), ProcedureKind.Method,
- FunctionNode(Block([])))
+ FunctionNode(Block([])),
+ fileUri: uriA)
],
);
final testComponent = Component(
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index 20ee23e..0e9346f 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -147,7 +147,7 @@
type ComponentFile {
UInt32 magic = 0x90ABCDEF;
- UInt32 formatVersion = 61;
+ UInt32 formatVersion = 62;
Byte[10] shortSdkHash;
List<String> problemsAsJson; // Described in problems.md.
Library[] libraries;
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 9e1ce0f..a473048 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -231,7 +231,7 @@
abstract class FileUriNode extends TreeNode {
/// The URI of the source file this node was loaded from.
// TODO(johnniwinther): Make this non-nullable.
- Uri? get fileUri;
+ Uri get fileUri;
}
abstract class Annotatable extends TreeNode {
@@ -256,7 +256,7 @@
/// The URI of the source file this library was loaded from.
@override
- Uri? fileUri;
+ Uri fileUri;
Version? _languageVersion;
Version get languageVersion => _languageVersion ?? defaultLanguageVersion;
@@ -359,9 +359,11 @@
List<Extension>? extensions,
List<Procedure>? procedures,
List<Field>? fields,
- this.fileUri,
+ required this.fileUri,
Reference? reference})
- : this.annotations = annotations ?? <Expression>[],
+ // ignore: unnecessary_null_comparison
+ : assert(fileUri != null),
+ this.annotations = annotations ?? <Expression>[],
this.dependencies = dependencies ?? <LibraryDependency>[],
this.parts = parts ?? <LibraryPart>[],
this.typedefs = typedefs ?? <Typedef>[],
@@ -769,7 +771,7 @@
class Typedef extends NamedNode implements FileUriNode, Annotatable {
/// The URI of the source file that contains the declaration of this typedef.
@override
- Uri? fileUri;
+ Uri fileUri;
@override
List<Expression> annotations = const <Expression>[];
@@ -789,12 +791,14 @@
Typedef(this.name, this.type,
{Reference? reference,
- this.fileUri,
+ required this.fileUri,
List<TypeParameter>? typeParameters,
List<TypeParameter>? typeParametersOfFunctionType,
List<VariableDeclaration>? positionalParameters,
List<VariableDeclaration>? namedParameters})
- : this.typeParameters = typeParameters ?? <TypeParameter>[],
+ // ignore: unnecessary_null_comparison
+ : assert(fileUri != null),
+ this.typeParameters = typeParameters ?? <TypeParameter>[],
this.typeParametersOfFunctionType =
typeParametersOfFunctionType ?? <TypeParameter>[],
this.positionalParameters =
@@ -853,7 +857,7 @@
@override
Location? _getLocationInEnclosingFile(int offset) {
- return _getLocationInComponent(enclosingComponent, fileUri!, offset);
+ return _getLocationInComponent(enclosingComponent, fileUri, offset);
}
@override
@@ -1037,7 +1041,7 @@
/// The URI of the source file this class was loaded from.
@override
- Uri? fileUri;
+ Uri fileUri;
final List<TypeParameter> typeParameters;
@@ -1146,10 +1150,12 @@
List<Procedure>? procedures,
List<Field>? fields,
List<RedirectingFactoryConstructor>? redirectingFactoryConstructors,
- this.fileUri,
+ required this.fileUri,
Reference? reference})
// ignore: unnecessary_null_comparison
: assert(name != null),
+ // ignore: unnecessary_null_comparison
+ assert(fileUri != null),
this.typeParameters = typeParameters ?? <TypeParameter>[],
this.implementedTypes = implementedTypes ?? <Supertype>[],
this.fieldsInternal = fields ?? <Field>[],
@@ -1413,7 +1419,7 @@
@override
Location? _getLocationInEnclosingFile(int offset) {
- return _getLocationInComponent(enclosingComponent, fileUri!, offset);
+ return _getLocationInComponent(enclosingComponent, fileUri, offset);
}
}
@@ -1429,7 +1435,7 @@
String name;
/// The URI of the source file this class was loaded from.
- Uri? fileUri;
+ Uri fileUri;
/// Type parameters declared on the extension.
final List<TypeParameter> typeParameters;
@@ -1466,10 +1472,12 @@
List<TypeParameter>? typeParameters,
DartType? onType,
List<ExtensionMemberDescriptor>? members,
- this.fileUri,
+ required this.fileUri,
Reference? reference})
// ignore: unnecessary_null_comparison
: assert(name != null),
+ // ignore: unnecessary_null_comparison
+ assert(fileUri != null),
this.typeParameters = typeParameters ?? <TypeParameter>[],
this.members = members ?? <ExtensionMemberDescriptor>[],
super(reference) {
@@ -1515,7 +1523,7 @@
@override
Location? _getLocationInEnclosingFile(int offset) {
- return _getLocationInComponent(enclosingComponent, fileUri!, offset);
+ return _getLocationInComponent(enclosingComponent, fileUri, offset);
}
@override
@@ -1621,7 +1629,7 @@
/// The URI of the source file this member was loaded from.
@override
- Uri? fileUri;
+ Uri fileUri;
/// Flags summarizing the kinds of AST nodes contained in this member, for
/// speeding up transformations that only affect certain types of nodes.
@@ -1643,6 +1651,8 @@
Member(this.name, this.fileUri, Reference? reference)
// ignore: unnecessary_null_comparison
: assert(name != null),
+ // ignore: unnecessary_null_comparison
+ assert(fileUri != null),
super(reference);
Class? get enclosingClass => parent is Class ? parent as Class : null;
@@ -1761,7 +1771,7 @@
bool isStatic: false,
bool isLate: false,
int transformerFlags: 0,
- Uri? fileUri,
+ required Uri fileUri,
Reference? getterReference,
Reference? setterReference})
: this.setterReference = setterReference ?? new Reference(),
@@ -1786,7 +1796,7 @@
bool isStatic: false,
bool isLate: false,
int transformerFlags: 0,
- Uri? fileUri,
+ required Uri fileUri,
Reference? getterReference})
: this.setterReference = null,
super(name, fileUri, getterReference) {
@@ -1959,7 +1969,7 @@
@override
Location? _getLocationInEnclosingFile(int offset) {
- return _getLocationInComponent(enclosingComponent, fileUri!, offset);
+ return _getLocationInComponent(enclosingComponent, fileUri, offset);
}
@override
@@ -2000,7 +2010,7 @@
bool isSynthetic: false,
List<Initializer>? initializers,
int transformerFlags: 0,
- Uri? fileUri,
+ required Uri fileUri,
Reference? reference})
: this.initializers = initializers ?? <Initializer>[],
// ignore: unnecessary_null_comparison
@@ -2116,7 +2126,7 @@
@override
Location? _getLocationInEnclosingFile(int offset) {
- return _getLocationInComponent(enclosingComponent, fileUri!, offset);
+ return _getLocationInComponent(enclosingComponent, fileUri, offset);
}
}
@@ -2180,7 +2190,7 @@
List<VariableDeclaration>? positionalParameters,
List<VariableDeclaration>? namedParameters,
int? requiredParameterCount,
- Uri? fileUri,
+ required Uri fileUri,
Reference? reference})
: this.typeArguments = typeArguments ?? <DartType>[],
this.typeParameters = typeParameters ?? <TypeParameter>[],
@@ -2291,7 +2301,7 @@
@override
Location? _getLocationInEnclosingFile(int offset) {
- return _getLocationInComponent(enclosingComponent, fileUri!, offset);
+ return _getLocationInComponent(enclosingComponent, fileUri, offset);
}
}
@@ -2546,7 +2556,7 @@
bool isExtensionMember: false,
bool isSynthetic: false,
int transformerFlags: 0,
- Uri? fileUri,
+ required Uri fileUri,
Reference? reference,
ProcedureStubKind stubKind: ProcedureStubKind.Regular,
Member? stubTarget})
@@ -2572,7 +2582,7 @@
bool isExtensionMember: false,
bool isSynthetic: false,
int transformerFlags: 0,
- Uri? fileUri,
+ required Uri fileUri,
Reference? reference,
this.stubKind: ProcedureStubKind.Regular,
this.stubTargetReference})
@@ -2796,7 +2806,7 @@
@override
Location? _getLocationInEnclosingFile(int offset) {
- return _getLocationInComponent(enclosingComponent, fileUri!, offset);
+ return _getLocationInComponent(enclosingComponent, fileUri, offset);
}
}
@@ -13589,7 +13599,7 @@
/// This is used as the removal sentinel in [RemovingTransformer] and can be
/// used for instance as a dummy initial value for the `List.filled`
/// constructor.
-final Library dummyLibrary = new Library(dummyUri);
+final Library dummyLibrary = new Library(dummyUri, fileUri: dummyUri);
/// Non-nullable [LibraryDependency] dummy value.
///
@@ -13618,7 +13628,7 @@
/// This is used as the removal sentinel in [RemovingTransformer] and can be
/// used for instance as a dummy initial value for the `List.filled`
/// constructor.
-final Class dummyClass = new Class(name: '');
+final Class dummyClass = new Class(name: '', fileUri: dummyUri);
/// Non-nullable [Constructor] dummy value.
///
@@ -13626,35 +13636,36 @@
/// used for instance as a dummy initial value for the `List.filled`
/// constructor.
final Constructor dummyConstructor =
- new Constructor(dummyFunctionNode, name: dummyName);
+ new Constructor(dummyFunctionNode, name: dummyName, fileUri: dummyUri);
/// Non-nullable [Extension] dummy value.
///
/// This is used as the removal sentinel in [RemovingTransformer] and can be
/// used for instance as a dummy initial value for the `List.filled`
/// constructor.
-final Extension dummyExtension = new Extension(name: '');
+final Extension dummyExtension = new Extension(name: '', fileUri: dummyUri);
/// Non-nullable [Member] dummy value.
///
/// This can be used for instance as a dummy initial value for the
/// `List.filled` constructor.
-final Member dummyMember = new Field.mutable(new _PublicName(''));
+final Member dummyMember = new Field.mutable(dummyName, fileUri: dummyUri);
/// Non-nullable [Procedure] dummy value.
///
/// This is used as the removal sentinel in [RemovingTransformer] and can be
/// used for instance as a dummy initial value for the `List.filled`
/// constructor.
-final Procedure dummyProcedure =
- new Procedure(dummyName, ProcedureKind.Method, dummyFunctionNode);
+final Procedure dummyProcedure = new Procedure(
+ dummyName, ProcedureKind.Method, dummyFunctionNode,
+ fileUri: dummyUri);
/// Non-nullable [Field] dummy value.
///
/// This is used as the removal sentinel in [RemovingTransformer] and can be
/// used for instance as a dummy initial value for the `List.filled`
/// constructor.
-final Field dummyField = new Field.mutable(dummyName);
+final Field dummyField = new Field.mutable(dummyName, fileUri: dummyUri);
/// Non-nullable [RedirectingFactoryConstructor] dummy value.
///
@@ -13662,14 +13673,14 @@
/// used for instance as a dummy initial value for the `List.filled`
/// constructor.
final RedirectingFactoryConstructor dummyRedirectingFactoryConstructor =
- new RedirectingFactoryConstructor(null, name: dummyName);
+ new RedirectingFactoryConstructor(null, name: dummyName, fileUri: dummyUri);
/// Non-nullable [Typedef] dummy value.
///
/// This is used as the removal sentinel in [RemovingTransformer] and can be
/// used for instance as a dummy initial value for the `List.filled`
/// constructor.
-final Typedef dummyTypedef = new Typedef('', null);
+final Typedef dummyTypedef = new Typedef('', null, fileUri: dummyUri);
/// Non-nullable [Initializer] dummy value.
///
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 0d99e60..7ed437e 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -469,8 +469,8 @@
growable: useGrowableLists);
}
- Uri? readUriReference() {
- return _sourceUriTable[readUInt30()];
+ Uri readUriReference() {
+ return _sourceUriTable[readUInt30()]!;
}
String readStringReference() {
@@ -1110,19 +1110,20 @@
CanonicalName canonicalName = readNonNullCanonicalNameReference();
Reference reference = canonicalName.reference;
Library? library = reference.node as Library?;
+ String? name = readStringOrNullIfEmpty();
+
+ // TODO(jensj): We currently save (almost the same) uri twice.
+ Uri fileUri = readUriReference();
+
if (alwaysCreateNewNamedNodes) {
library = null;
}
if (library == null) {
- library =
- new Library(Uri.parse(canonicalName.name), reference: reference);
+ library = new Library(Uri.parse(canonicalName.name),
+ reference: reference, fileUri: fileUri);
component.libraries.add(library..parent = component);
}
_currentLibrary = library;
- String? name = readStringOrNullIfEmpty();
-
- // TODO(jensj): We currently save (almost the same) uri twice.
- Uri? fileUri = readUriReference();
List<String>? problemsAsJson = readListOfStrings();
@@ -1245,11 +1246,11 @@
if (alwaysCreateNewNamedNodes) {
node = null;
}
- Uri? fileUri = readUriReference();
+ Uri fileUri = readUriReference();
int fileOffset = readOffset();
String name = readStringReference();
if (node == null) {
- node = new Typedef(name, null, reference: reference);
+ node = new Typedef(name, null, reference: reference, fileUri: fileUri);
}
node.annotations = readAnnotationList(node);
readAndPushTypeParameterList(node.typeParameters, node);
@@ -1293,14 +1294,15 @@
if (alwaysCreateNewNamedNodes) {
node = null;
}
- Uri? fileUri = readUriReference();
+ Uri fileUri = readUriReference();
int startFileOffset = readOffset();
int fileOffset = readOffset();
int fileEndOffset = readOffset();
int flags = readByte();
String name = readStringReference();
if (node == null) {
- node = new Class(name: name, reference: reference)..dirty = false;
+ node = new Class(name: name, reference: reference, fileUri: fileUri)
+ ..dirty = false;
}
node.startFileOffset = startFileOffset;
@@ -1351,17 +1353,21 @@
}
String name = readStringReference();
- if (node == null) {
- node = new Extension(name: name, reference: reference);
- }
assert(() {
debugPath.add(name);
return true;
}());
- node.annotations = readAnnotationList(node);
+ List<Expression> annotations = readAnnotationList();
- Uri? fileUri = readUriReference();
+ Uri fileUri = readUriReference();
+
+ if (node == null) {
+ node = new Extension(name: name, reference: reference, fileUri: fileUri);
+ }
+ node.annotations = annotations;
+ setParents(annotations, node);
+
node.fileOffset = readOffset();
readAndPushTypeParameterList(node.typeParameters, node);
@@ -1443,7 +1449,7 @@
if (alwaysCreateNewNamedNodes) {
node = null;
}
- Uri? fileUri = readUriReference();
+ Uri fileUri = readUriReference();
int fileOffset = readOffset();
int fileEndOffset = readOffset();
int flags = readUInt30();
@@ -1451,9 +1457,12 @@
if (node == null) {
if (setterReference != null) {
node = new Field.mutable(name,
- getterReference: getterReference, setterReference: setterReference);
+ getterReference: getterReference,
+ setterReference: setterReference,
+ fileUri: fileUri);
} else {
- node = new Field.immutable(name, getterReference: getterReference);
+ node = new Field.immutable(name,
+ getterReference: getterReference, fileUri: fileUri);
}
}
List<Expression> annotations = readAnnotationList(node);
@@ -1487,7 +1496,7 @@
if (alwaysCreateNewNamedNodes) {
node = null;
}
- Uri? fileUri = readUriReference();
+ Uri fileUri = readUriReference();
int startFileOffset = readOffset();
int fileOffset = readOffset();
int fileEndOffset = readOffset();
@@ -1500,7 +1509,8 @@
}());
FunctionNode function = readFunctionNode();
if (node == null) {
- node = new Constructor(function, reference: reference, name: name);
+ node = new Constructor(function,
+ reference: reference, name: name, fileUri: fileUri);
}
pushVariableDeclarations(function.positionalParameters);
pushVariableDeclarations(function.namedParameters);
@@ -1530,7 +1540,7 @@
if (alwaysCreateNewNamedNodes) {
node = null;
}
- Uri? fileUri = readUriReference();
+ Uri fileUri = readUriReference();
int startFileOffset = readOffset();
int fileOffset = readOffset();
int fileEndOffset = readOffset();
@@ -1553,7 +1563,8 @@
FunctionNode function = readFunctionNode(
lazyLoadBody: !readFunctionNodeNow, outerEndOffset: endOffset);
if (node == null) {
- node = new Procedure(name, kind, function, reference: reference);
+ node = new Procedure(name, kind, function,
+ reference: reference, fileUri: fileUri);
} else {
assert(node.kind == kind);
}
@@ -1590,14 +1601,14 @@
if (alwaysCreateNewNamedNodes) {
node = null;
}
- Uri? fileUri = readUriReference();
+ Uri fileUri = readUriReference();
int fileOffset = readOffset();
int fileEndOffset = readOffset();
int flags = readByte();
Name name = readName();
if (node == null) {
node = new RedirectingFactoryConstructor(null,
- reference: reference, name: name);
+ reference: reference, name: name, fileUri: fileUri);
}
List<Expression> annotations = readAnnotationList(node);
assert(() {
@@ -2315,7 +2326,7 @@
}
Expression _readFileUriExpression() {
- Uri fileUri = readUriReference()!;
+ Uri fileUri = readUriReference();
int offset = readOffset();
return new FileUriExpression(readExpression(), fileUri)
..fileOffset = offset;
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index e7271c5..3805110 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -274,7 +274,7 @@
}
// Returns the new active file uri.
- void writeUriReference(Uri? uri) {
+ void writeUriReference(Uri uri) {
final int index = _sourceUriIndexer.put(uri);
writeUInt30(index);
if (!_currentlyInNonimplementation) {
@@ -784,7 +784,7 @@
// Write data.
int i = 0;
Uint8List buffer = new Uint8List(1 << 16);
- for (Uri? uri in _sourceUriIndexer.index.keys) {
+ for (Uri uri in _sourceUriIndexer.index.keys) {
index[i] = getBufferOffset();
Source? source = uriToSource[uri];
if (source == null ||
@@ -795,7 +795,7 @@
<int>[], const <int>[], source?.importUri, source?.fileUri);
}
- String uriAsString = uri == null ? "" : "$uri";
+ String uriAsString = "$uri";
outputStringViaBuffer(uriAsString, buffer);
writeByteList(source.source);
@@ -2863,13 +2863,11 @@
class UriIndexer {
// Note that the iteration order is important.
- final Map<Uri?, int> index = new Map<Uri?, int>();
+ final Map<Uri, int> index = new Map<Uri, int>();
- UriIndexer() {
- put(null);
- }
+ UriIndexer();
- int put(Uri? uri) {
+ int put(Uri uri) {
int? result = index[uri];
if (result == null) {
result = index.length;
diff --git a/pkg/kernel/lib/binary/tag.dart b/pkg/kernel/lib/binary/tag.dart
index 523a5a2..752f84b 100644
--- a/pkg/kernel/lib/binary/tag.dart
+++ b/pkg/kernel/lib/binary/tag.dart
@@ -174,7 +174,7 @@
/// Internal version of kernel binary format.
/// Bump it when making incompatible changes in kernel binaries.
/// Keep in sync with runtime/vm/kernel_binary.h, pkg/kernel/binary.md.
- static const int BinaryFormatVersion = 61;
+ static const int BinaryFormatVersion = 62;
}
abstract class ConstantTag {
diff --git a/pkg/kernel/lib/clone.dart b/pkg/kernel/lib/clone.dart
index 6c76c2f..a399b3a 100644
--- a/pkg/kernel/lib/clone.dart
+++ b/pkg/kernel/lib/clone.dart
@@ -99,7 +99,9 @@
T clone<T extends TreeNode>(T node) {
final Uri? activeFileUriSaved = _activeFileUri;
- if (node is FileUriNode) _activeFileUri = node.fileUri ?? _activeFileUri;
+ if (node is FileUriNode) {
+ _activeFileUri = node.fileUri;
+ }
final TreeNode result = node.accept(this)
..fileOffset = _cloneFileOffset(node.fileOffset);
_activeFileUri = activeFileUriSaved;
@@ -109,7 +111,9 @@
T? cloneOptional<T extends TreeNode>(T? node) {
if (node == null) return null;
final Uri? activeFileUriSaved = _activeFileUri;
- if (node is FileUriNode) _activeFileUri = node.fileUri ?? _activeFileUri;
+ if (node is FileUriNode) {
+ _activeFileUri = node.fileUri;
+ }
TreeNode? result = node.accept(this);
if (result != null) result.fileOffset = _cloneFileOffset(node.fileOffset);
_activeFileUri = activeFileUriSaved;
@@ -128,8 +132,8 @@
Uri? _activeFileUriFromContext(TreeNode? node) {
while (node != null) {
- if (node is FileUriNode && node.fileUri != null) {
- return node.fileUri!;
+ if (node is FileUriNode) {
+ return node.fileUri;
}
node = node.parent;
}
@@ -754,7 +758,7 @@
Constructor cloneConstructor(Constructor node, Reference? reference) {
final Uri? activeFileUriSaved = _activeFileUri;
- _activeFileUri = node.fileUri ?? _activeFileUri;
+ _activeFileUri = node.fileUri;
Constructor result = new Constructor(
super.clone(node.function),
@@ -764,7 +768,7 @@
isSynthetic: node.isSynthetic,
initializers: node.initializers.map(super.clone).toList(),
transformerFlags: node.transformerFlags,
- fileUri: _activeFileUri,
+ fileUri: node.fileUri,
reference: reference,
)
..annotations = cloneAnnotations && !node.annotations.isEmpty
@@ -779,12 +783,12 @@
Procedure cloneProcedure(Procedure node, Reference? reference) {
final Uri? activeFileUriSaved = _activeFileUri;
- _activeFileUri = node.fileUri ?? _activeFileUri;
+ _activeFileUri = node.fileUri;
Procedure result = new Procedure(
node.name, node.kind, super.clone(node.function),
reference: reference,
transformerFlags: node.transformerFlags,
- fileUri: _activeFileUri,
+ fileUri: node.fileUri,
stubKind: node.stubKind,
stubTarget: node.stubTarget)
..annotations = cloneAnnotations && !node.annotations.isEmpty
@@ -802,7 +806,7 @@
Field cloneField(
Field node, Reference? getterReference, Reference? setterReference) {
final Uri? activeFileUriSaved = _activeFileUri;
- _activeFileUri = node.fileUri ?? _activeFileUri;
+ _activeFileUri = node.fileUri;
Field result;
if (node.hasSetter) {
@@ -810,7 +814,7 @@
type: visitType(node.type),
initializer: cloneOptional(node.initializer),
transformerFlags: node.transformerFlags,
- fileUri: _activeFileUri,
+ fileUri: node.fileUri,
getterReference: getterReference,
setterReference: setterReference);
} else {
@@ -822,7 +826,7 @@
type: visitType(node.type),
initializer: cloneOptional(node.initializer),
transformerFlags: node.transformerFlags,
- fileUri: _activeFileUri,
+ fileUri: node.fileUri,
getterReference: getterReference);
}
result
@@ -840,7 +844,7 @@
RedirectingFactoryConstructor cloneRedirectingFactoryConstructor(
RedirectingFactoryConstructor node, Reference? reference) {
final Uri? activeFileUriSaved = _activeFileUri;
- _activeFileUri = node.fileUri ?? _activeFileUri;
+ _activeFileUri = node.fileUri;
prepareTypeParameters(node.typeParameters);
RedirectingFactoryConstructor result = new RedirectingFactoryConstructor(
@@ -855,7 +859,7 @@
node.positionalParameters.map(super.clone).toList(),
namedParameters: node.namedParameters.map(super.clone).toList(),
requiredParameterCount: node.requiredParameterCount,
- fileUri: _activeFileUri,
+ fileUri: node.fileUri,
reference: reference)
..annotations = cloneAnnotations && !node.annotations.isEmpty
? node.annotations.map(super.clone).toList()
diff --git a/pkg/kernel/lib/testing/mock_sdk_component.dart b/pkg/kernel/lib/testing/mock_sdk_component.dart
index b317b60..4c444e2 100644
--- a/pkg/kernel/lib/testing/mock_sdk_component.dart
+++ b/pkg/kernel/lib/testing/mock_sdk_component.dart
@@ -9,17 +9,30 @@
/// Returns a [Component] object containing empty definitions of core SDK
/// classes.
Component createMockSdkComponent() {
- Library coreLib = new Library(Uri.parse('dart:core'), name: 'dart.core');
- Library asyncLib = new Library(Uri.parse('dart:async'), name: 'dart.async');
- Library internalLib =
- new Library(Uri.parse('dart:_internal'), name: 'dart._internal');
+ Library coreLib = new Library(Uri.parse('dart:core'),
+ name: 'dart.core', fileUri: Uri.parse('dart:core'));
+ Library asyncLib = new Library(Uri.parse('dart:async'),
+ name: 'dart.async', fileUri: Uri.parse('dart:async'));
+ Library internalLib = new Library(Uri.parse('dart:_internal'),
+ name: 'dart._internal', fileUri: Uri.parse('dart:_internal'));
- Class addClass(Library lib, Class c) {
+ Class objectClass = new Class(name: 'Object', fileUri: coreLib.fileUri);
+ coreLib.addClass(objectClass);
+
+ Class addClass(Library lib, String name,
+ {Supertype supertype,
+ List<TypeParameter> typeParameters,
+ List<Supertype> implementedTypes}) {
+ Class c = new Class(
+ name: name,
+ supertype: supertype ?? objectClass.asThisSupertype,
+ typeParameters: typeParameters,
+ implementedTypes: implementedTypes,
+ fileUri: lib.fileUri);
lib.addClass(c);
return c;
}
- Class objectClass = addClass(coreLib, new Class(name: 'Object'));
InterfaceType objectType =
new InterfaceType(objectClass, coreLib.nonNullable);
@@ -27,48 +40,33 @@
return new TypeParameter(name, bound ?? objectType);
}
- Class class_(String name,
- {Supertype supertype,
- List<TypeParameter> typeParameters,
- List<Supertype> implementedTypes}) {
- return new Class(
- name: name,
- supertype: supertype ?? objectClass.asThisSupertype,
- typeParameters: typeParameters,
- implementedTypes: implementedTypes);
- }
-
- addClass(coreLib, class_('Null'));
- addClass(coreLib, class_('bool'));
- Class num = addClass(coreLib, class_('num'));
- addClass(coreLib, class_('String'));
+ addClass(coreLib, 'Null');
+ addClass(coreLib, 'bool');
+ Class num = addClass(coreLib, 'num');
+ addClass(coreLib, 'String');
Class iterable =
- addClass(coreLib, class_('Iterable', typeParameters: [typeParam('T')]));
+ addClass(coreLib, 'Iterable', typeParameters: [typeParam('T')]);
{
TypeParameter T = typeParam('T');
- addClass(
- coreLib,
- class_('List', typeParameters: [
- T
- ], implementedTypes: [
- new Supertype(iterable, [
- new TypeParameterType.withDefaultNullabilityForLibrary(T, coreLib)
- ])
- ]));
+ addClass(coreLib, 'List', typeParameters: [
+ T
+ ], implementedTypes: [
+ new Supertype(iterable,
+ [new TypeParameterType.withDefaultNullabilityForLibrary(T, coreLib)])
+ ]);
}
- addClass(
- coreLib, class_('Map', typeParameters: [typeParam('K'), typeParam('V')]));
- addClass(coreLib, class_('int', supertype: num.asThisSupertype));
- addClass(coreLib, class_('double', supertype: num.asThisSupertype));
- addClass(coreLib, class_('Iterator', typeParameters: [typeParam('T')]));
- addClass(coreLib, class_('Symbol'));
- addClass(coreLib, class_('Type'));
- addClass(coreLib, class_('Function'));
- addClass(coreLib, class_('Invocation'));
- addClass(coreLib, class_('Future', typeParameters: [typeParam('T')]));
- addClass(asyncLib, class_('FutureOr', typeParameters: [typeParam('T')]));
- addClass(asyncLib, class_('Stream', typeParameters: [typeParam('T')]));
- addClass(internalLib, class_('Symbol'));
+ addClass(coreLib, 'Map', typeParameters: [typeParam('K'), typeParam('V')]);
+ addClass(coreLib, 'int', supertype: num.asThisSupertype);
+ addClass(coreLib, 'double', supertype: num.asThisSupertype);
+ addClass(coreLib, 'Iterator', typeParameters: [typeParam('T')]);
+ addClass(coreLib, 'Symbol');
+ addClass(coreLib, 'Type');
+ addClass(coreLib, 'Function');
+ addClass(coreLib, 'Invocation');
+ addClass(coreLib, 'Future', typeParameters: [typeParam('T')]);
+ addClass(asyncLib, 'FutureOr', typeParameters: [typeParam('T')]);
+ addClass(asyncLib, 'Stream', typeParameters: [typeParam('T')]);
+ addClass(internalLib, 'Symbol');
return new Component(libraries: [coreLib, asyncLib, internalLib]);
}
diff --git a/pkg/kernel/lib/testing/type_parser_environment.dart b/pkg/kernel/lib/testing/type_parser_environment.dart
index 2782dd1..691610d 100644
--- a/pkg/kernel/lib/testing/type_parser_environment.dart
+++ b/pkg/kernel/lib/testing/type_parser_environment.dart
@@ -501,8 +501,9 @@
..defaultType = type;
}
}
+ Uri uri = new Uri.file("test.lib");
List<DartType> defaultTypes = calculateBounds(typeParameters, objectClass,
- new Library(new Uri.file("test.lib"))..isNonNullableByDefault = true);
+ new Library(uri, fileUri: uri)..isNonNullableByDefault = true);
for (int i = 0; i < typeParameters.length; i++) {
typeParameters[i].defaultType = defaultTypes[i];
}
diff --git a/pkg/kernel/lib/text/serializer_combinators.dart b/pkg/kernel/lib/text/serializer_combinators.dart
index 7179336..7af498e 100644
--- a/pkg/kernel/lib/text/serializer_combinators.dart
+++ b/pkg/kernel/lib/text/serializer_combinators.dart
@@ -594,6 +594,69 @@
this.sixth, this.seventh);
}
+class Tuple8Serializer<T1, T2, T3, T4, T5, T6, T7, T8>
+ extends TextSerializer<Tuple8<T1, T2, T3, T4, T5, T6, T7, T8>> {
+ final TextSerializer<T1> first;
+ final TextSerializer<T2> second;
+ final TextSerializer<T3> third;
+ final TextSerializer<T4> fourth;
+ final TextSerializer<T5> fifth;
+ final TextSerializer<T6> sixth;
+ final TextSerializer<T7> seventh;
+ final TextSerializer<T8> eighth;
+
+ const Tuple8Serializer(this.first, this.second, this.third, this.fourth,
+ this.fifth, this.sixth, this.seventh, this.eighth);
+
+ Tuple8<T1, T2, T3, T4, T5, T6, T7, T8> readFrom(
+ Iterator<Object?> stream, DeserializationState? state) {
+ return new Tuple8(
+ first.readFrom(stream, state),
+ second.readFrom(stream, state),
+ third.readFrom(stream, state),
+ fourth.readFrom(stream, state),
+ fifth.readFrom(stream, state),
+ sixth.readFrom(stream, state),
+ seventh.readFrom(stream, state),
+ eighth.readFrom(stream, state));
+ }
+
+ void writeTo(
+ StringBuffer buffer,
+ Tuple8<T1, T2, T3, T4, T5, T6, T7, T8> object,
+ SerializationState? state) {
+ first.writeTo(buffer, object.first, state);
+ if (!second.isEmpty) buffer.write(' ');
+ second.writeTo(buffer, object.second, state);
+ if (!third.isEmpty) buffer.write(' ');
+ third.writeTo(buffer, object.third, state);
+ if (!fourth.isEmpty) buffer.write(' ');
+ fourth.writeTo(buffer, object.fourth, state);
+ if (!fifth.isEmpty) buffer.write(' ');
+ fifth.writeTo(buffer, object.fifth, state);
+ if (!sixth.isEmpty) buffer.write(' ');
+ sixth.writeTo(buffer, object.sixth, state);
+ if (!seventh.isEmpty) buffer.write(' ');
+ seventh.writeTo(buffer, object.seventh, state);
+ if (!eighth.isEmpty) buffer.write(' ');
+ eighth.writeTo(buffer, object.eighth, state);
+ }
+}
+
+class Tuple8<T1, T2, T3, T4, T5, T6, T7, T8> {
+ final T1 first;
+ final T2 second;
+ final T3 third;
+ final T4 fourth;
+ final T5 fifth;
+ final T6 sixth;
+ final T7 seventh;
+ final T8 eighth;
+
+ const Tuple8(this.first, this.second, this.third, this.fourth, this.fifth,
+ this.sixth, this.seventh, this.eighth);
+}
+
// A serializer/deserializer for lists.
class ListSerializer<T> extends TextSerializer<List<T>> {
final TextSerializer<T> elements;
diff --git a/pkg/kernel/lib/text/text_serializer.dart b/pkg/kernel/lib/text/text_serializer.dart
index f544010..5abc570 100644
--- a/pkg/kernel/lib/text/text_serializer.dart
+++ b/pkg/kernel/lib/text/text_serializer.dart
@@ -1966,83 +1966,93 @@
}
TextSerializer<Field> mutableFieldSerializer =
- Wrapped<Tuple4<Name, int, DartType, Expression?>, Field>(
- (w) => Tuple4(w.name, w.flags, w.type, w.initializer),
- (u) => Field.mutable(u.first, type: u.third, initializer: u.fourth)
+ Wrapped<Tuple5<Name, int, DartType, Expression?, Uri>, Field>(
+ (w) => Tuple5(w.name, w.flags, w.type, w.initializer, w.fileUri),
+ (u) => Field.mutable(u.first,
+ type: u.third, initializer: u.fourth, fileUri: u.fifth)
..flags = u.second,
- Tuple4Serializer(nameSerializer, fieldFlagsSerializer,
- dartTypeSerializer, nullableExpressionSerializer));
+ Tuple5Serializer(nameSerializer, fieldFlagsSerializer,
+ dartTypeSerializer, nullableExpressionSerializer, UriSerializer()));
TextSerializer<Field> immutableFieldSerializer =
- Wrapped<Tuple4<Name, int, DartType, Expression?>, Field>(
- (w) => Tuple4(w.name, w.flags, w.type, w.initializer),
- (u) => Field.immutable(u.first, type: u.third, initializer: u.fourth)
+ Wrapped<Tuple5<Name, int, DartType, Expression?, Uri>, Field>(
+ (w) => Tuple5(w.name, w.flags, w.type, w.initializer, w.fileUri),
+ (u) => Field.immutable(u.first,
+ type: u.third, initializer: u.fourth, fileUri: u.fifth)
..flags = u.second,
- Tuple4Serializer(nameSerializer, fieldFlagsSerializer,
- dartTypeSerializer, nullableExpressionSerializer));
+ Tuple5Serializer(nameSerializer, fieldFlagsSerializer,
+ dartTypeSerializer, nullableExpressionSerializer, UriSerializer()));
TextSerializer<Procedure> methodSerializer =
- Wrapped<Tuple3<Name, int, FunctionNode>, Procedure>(
- (w) => Tuple3(w.name, w.flags, w.function),
+ Wrapped<Tuple4<Name, int, FunctionNode, Uri>, Procedure>(
+ (w) => Tuple4(w.name, w.flags, w.function, w.fileUri),
(u) =>
- Procedure(u.first, ProcedureKind.Method, u.third)..flags = u.second,
- Tuple3Serializer(
- nameSerializer, procedureFlagsSerializer, functionNodeSerializer));
+ Procedure(u.first, ProcedureKind.Method, u.third, fileUri: u.fourth)
+ ..flags = u.second,
+ Tuple4Serializer(nameSerializer, procedureFlagsSerializer,
+ functionNodeSerializer, UriSerializer()));
TextSerializer<Procedure> getterSerializer =
- Wrapped<Tuple3<Name, int, FunctionNode>, Procedure>(
- (w) => Tuple3(w.name, w.flags, w.function),
+ Wrapped<Tuple4<Name, int, FunctionNode, Uri>, Procedure>(
+ (w) => Tuple4(w.name, w.flags, w.function, w.fileUri),
(u) =>
- Procedure(u.first, ProcedureKind.Getter, u.third)..flags = u.second,
- Tuple3Serializer(
- nameSerializer, procedureFlagsSerializer, functionNodeSerializer));
+ Procedure(u.first, ProcedureKind.Getter, u.third, fileUri: u.fourth)
+ ..flags = u.second,
+ Tuple4Serializer(nameSerializer, procedureFlagsSerializer,
+ functionNodeSerializer, UriSerializer()));
TextSerializer<Procedure> setterSerializer =
- Wrapped<Tuple3<Name, int, FunctionNode>, Procedure>(
- (w) => Tuple3(w.name, w.flags, w.function),
+ Wrapped<Tuple4<Name, int, FunctionNode, Uri>, Procedure>(
+ (w) => Tuple4(w.name, w.flags, w.function, w.fileUri),
(u) =>
- Procedure(u.first, ProcedureKind.Setter, u.third)..flags = u.second,
- Tuple3Serializer(
- nameSerializer, procedureFlagsSerializer, functionNodeSerializer));
+ Procedure(u.first, ProcedureKind.Setter, u.third, fileUri: u.fourth)
+ ..flags = u.second,
+ Tuple4Serializer(nameSerializer, procedureFlagsSerializer,
+ functionNodeSerializer, UriSerializer()));
TextSerializer<Procedure> operatorSerializer =
- Wrapped<Tuple3<Name, int, FunctionNode>, Procedure>(
- (w) => Tuple3(w.name, w.flags, w.function),
- (u) => Procedure(u.first, ProcedureKind.Operator, u.third)
+ Wrapped<Tuple4<Name, int, FunctionNode, Uri>, Procedure>(
+ (w) => Tuple4(w.name, w.flags, w.function, w.fileUri),
+ (u) => Procedure(u.first, ProcedureKind.Operator, u.third,
+ fileUri: u.fourth)
..flags = u.second,
- Tuple3Serializer(
- nameSerializer, procedureFlagsSerializer, functionNodeSerializer));
+ Tuple4Serializer(nameSerializer, procedureFlagsSerializer,
+ functionNodeSerializer, UriSerializer()));
-TextSerializer<Procedure> factorySerializer =
- Wrapped<Tuple3<Name, int, FunctionNode>, Procedure>(
- (w) => Tuple3(w.name, w.flags, w.function),
- (u) => Procedure(u.first, ProcedureKind.Factory, u.third)
- ..flags = u.second,
- Tuple3Serializer(
- nameSerializer, procedureFlagsSerializer, functionNodeSerializer));
+TextSerializer<Procedure> factorySerializer = Wrapped<
+ Tuple4<Name, int, FunctionNode, Uri>, Procedure>(
+ (w) => Tuple4(w.name, w.flags, w.function, w.fileUri),
+ (u) => Procedure(u.first, ProcedureKind.Factory, u.third, fileUri: u.fourth)
+ ..flags = u.second,
+ Tuple4Serializer(nameSerializer, procedureFlagsSerializer,
+ functionNodeSerializer, UriSerializer()));
TextSerializer<Constructor> constructorSerializer = Wrapped<
- Tuple3<Name, int, Tuple2<FunctionNode, List<Initializer>?>>,
+ Tuple4<Name, int, Tuple2<FunctionNode, List<Initializer>?>, Uri>,
Constructor>(
- (w) => Tuple3(w.name, w.flags, Tuple2(w.function, w.initializers)),
- (u) =>
- Constructor(u.third.first, name: u.first, initializers: u.third.second)
- ..flags = u.second,
- Tuple3Serializer(nameSerializer, constructorFlagsSerializer,
- functionNodeWithInitializersSerializer));
+ (w) =>
+ Tuple4(w.name, w.flags, Tuple2(w.function, w.initializers), w.fileUri),
+ (u) => Constructor(u.third.first,
+ name: u.first, initializers: u.third.second, fileUri: u.fourth)
+ ..flags = u.second,
+ Tuple4Serializer(nameSerializer, constructorFlagsSerializer,
+ functionNodeWithInitializersSerializer, UriSerializer()));
TextSerializer<RedirectingFactoryConstructor>
- redirectingFactoryConstructorSerializer = Wrapped<
- Tuple4<
+ redirectingFactoryConstructorSerializer
+ // Comment added to direct formatter.
+ = Wrapped<
+ Tuple5<
Name,
int,
CanonicalName,
Tuple2<
List<TypeParameter>,
Tuple4<List<VariableDeclaration>, List<VariableDeclaration>,
- List<VariableDeclaration>, List<DartType>>>>,
+ List<VariableDeclaration>, List<DartType>>>,
+ Uri>,
RedirectingFactoryConstructor>(
- (w) => Tuple4(
+ (w) => Tuple5(
w.name,
w.flags,
w.targetReference!.canonicalName!,
@@ -2056,7 +2066,8 @@
.skip(w.requiredParameterCount)
.toList(),
w.namedParameters,
- w.typeArguments))),
+ w.typeArguments)),
+ w.fileUri),
(u) => RedirectingFactoryConstructor(u.third.reference,
name: u.first,
typeParameters: u.fourth.first,
@@ -2064,9 +2075,10 @@
u.fourth.second.first + u.fourth.second.second,
requiredParameterCount: u.fourth.second.first.length,
namedParameters: u.fourth.second.third,
- typeArguments: u.fourth.second.fourth)
+ typeArguments: u.fourth.second.fourth,
+ fileUri: u.fifth)
..flags = u.second,
- Tuple4Serializer(
+ Tuple5Serializer(
nameSerializer,
redirectingFactoryConstructorFlagsSerializer,
CanonicalNameSerializer(),
@@ -2076,7 +2088,8 @@
ListSerializer(variableDeclarationSerializer),
ListSerializer(variableDeclarationSerializer),
ListSerializer(variableDeclarationSerializer),
- ListSerializer(dartTypeSerializer)))));
+ ListSerializer(dartTypeSerializer))),
+ UriSerializer()));
Case<Member> memberSerializer = new Case.uninitialized(const MemberTagger());
@@ -2117,11 +2130,11 @@
Case(LibraryFlagTagger(), convertFlagsMap(libraryFlagToName))));
TextSerializer<Library> librarySerializer = new Wrapped<
- Tuple7<Uri, int, List<LibraryPart>, List<Member>, List<Class>,
- List<Typedef>, List<Extension>>,
+ Tuple8<Uri, int, List<LibraryPart>, List<Member>, List<Class>,
+ List<Typedef>, List<Extension>, Uri>,
Library>(
- (w) => Tuple7(w.importUri, w.flags, w.parts, [...w.fields, ...w.procedures],
- w.classes, w.typedefs, w.extensions),
+ (w) => Tuple8(w.importUri, w.flags, w.parts, [...w.fields, ...w.procedures],
+ w.classes, w.typedefs, w.extensions, w.fileUri),
(u) => Library(u.first,
parts: u.third,
fields: u.fourth.where((m) => m is Field).cast<Field>().toList(),
@@ -2129,16 +2142,18 @@
u.fourth.where((m) => m is Procedure).cast<Procedure>().toList(),
classes: u.fifth,
typedefs: u.sixth,
- extensions: u.seventh)
+ extensions: u.seventh,
+ fileUri: u.eighth)
..flags = u.second,
- Tuple7Serializer(
+ Tuple8Serializer(
UriSerializer(),
libraryFlagsSerializer,
ListSerializer(libraryPartSerializer),
ListSerializer(memberSerializer),
ListSerializer(classSerializer),
ListSerializer(typedefSerializer),
- ListSerializer(extensionSerializer)),
+ ListSerializer(extensionSerializer),
+ UriSerializer()),
);
TextSerializer<Component> componentSerializer =
@@ -2387,43 +2402,47 @@
ListSerializer(Case(ClassFlagTagger(), convertFlagsMap(classFlagToName))));
TextSerializer<Class> classSerializer = Wrapped<
- Tuple3<
+ Tuple4<
String,
int,
+ Uri,
Tuple2<
List<TypeParameter>,
/* Comment added to guide formatting. */
Tuple4<Supertype?, Supertype?, List<Supertype>, List<Member>>>>,
Class>(
- (w) => Tuple3(
+ (w) => Tuple4(
w.name,
w.flags,
+ w.fileUri,
Tuple2(
w.typeParameters,
Tuple4(w.supertype, w.mixedInType, w.implementedTypes,
<Member>[...w.fields, ...w.constructors, ...w.procedures]))),
(u) => Class(
name: u.first,
- typeParameters: u.third.first,
- supertype: u.third.second.first,
- mixedInType: u.third.second.second,
- implementedTypes: u.third.second.third,
- fields: u.third.second.fourth
+ typeParameters: u.fourth.first,
+ supertype: u.fourth.second.first,
+ mixedInType: u.fourth.second.second,
+ implementedTypes: u.fourth.second.third,
+ fields: u.fourth.second.fourth
.where((m) => m is Field)
.cast<Field>()
.toList(),
- constructors: u.third.second.fourth
+ constructors: u.fourth.second.fourth
.where((m) => m is Constructor)
.cast<Constructor>()
.toList(),
- procedures: u.third.second.fourth
+ procedures: u.fourth.second.fourth
.where((m) => m is Procedure)
.cast<Procedure>()
- .toList())
+ .toList(),
+ fileUri: u.third)
..flags = u.second,
- Tuple3Serializer(
+ Tuple4Serializer(
DartString(),
classFlagsSerializer,
+ UriSerializer(),
Bind(
typeParametersSerializer,
Tuple4Serializer(
@@ -2432,13 +2451,13 @@
ListSerializer(supertypeSerializer),
ListSerializer(memberSerializer)))));
-TextSerializer<Typedef> typedefSerializer =
- Wrapped<Tuple2<String, Tuple2<List<TypeParameter>, DartType>>, Typedef>(
- (w) => Tuple2(w.name, Tuple2(w.typeParameters, w.type!)),
- (u) =>
- Typedef(u.first, u.second.second, typeParameters: u.second.first),
- Tuple2Serializer(
- DartString(), Bind(typeParametersSerializer, dartTypeSerializer)));
+TextSerializer<Typedef> typedefSerializer = Wrapped<
+ Tuple3<String, Tuple2<List<TypeParameter>, DartType>, Uri>, Typedef>(
+ (w) => Tuple3(w.name, Tuple2(w.typeParameters, w.type!), w.fileUri),
+ (u) => Typedef(u.first, u.second.second,
+ typeParameters: u.second.first, fileUri: u.third),
+ Tuple3Serializer(DartString(),
+ Bind(typeParametersSerializer, dartTypeSerializer), UriSerializer()));
const Map<int, String> extensionMemberDescriptorFlagToName = const {
ExtensionMemberDescriptor.FlagStatic: "static",
@@ -2498,19 +2517,22 @@
CanonicalNameSerializer()));
TextSerializer<Extension> extensionSerializer = Wrapped<
- Tuple3<String, Tuple2<List<TypeParameter>, DartType>,
- List<ExtensionMemberDescriptor>>,
+ Tuple4<String, Tuple2<List<TypeParameter>, DartType>,
+ List<ExtensionMemberDescriptor>, Uri>,
Extension>(
- (w) => Tuple3(w.name, Tuple2(w.typeParameters, w.onType), w.members),
+ (w) => Tuple4(
+ w.name, Tuple2(w.typeParameters, w.onType), w.members, w.fileUri),
(u) => Extension(
name: u.first,
typeParameters: u.second.first,
onType: u.second.second,
- members: u.third),
- Tuple3Serializer(
+ members: u.third,
+ fileUri: u.fourth),
+ Tuple4Serializer(
DartString(),
Bind(typeParametersSerializer, dartTypeSerializer),
- ListSerializer(extensionMemberDescriptorSerializer)));
+ ListSerializer(extensionMemberDescriptorSerializer),
+ UriSerializer()));
void initializeSerializers() {
expressionSerializer.registerTags({
diff --git a/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart b/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart
index 6538a7b..83bd899 100644
--- a/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart
+++ b/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart
@@ -390,7 +390,8 @@
isFinal: true,
getterReference: clazz.reference.canonicalName
?.getChildFromFieldWithName(fieldName)
- .reference);
+ .reference,
+ fileUri: clazz.fileUri);
clazz.addField(locationField);
final Set<Constructor> _handledConstructors =
diff --git a/pkg/kernel/test/binary/component_mode_test.dart b/pkg/kernel/test/binary/component_mode_test.dart
index b03ea0a..2358e2f 100644
--- a/pkg/kernel/test/binary/component_mode_test.dart
+++ b/pkg/kernel/test/binary/component_mode_test.dart
@@ -38,7 +38,8 @@
// Try individually.
List<int> c1Serialized;
{
- Library lib1 = new Library(Uri.parse("foo://bar.dart"))
+ Uri uri = Uri.parse("foo://bar.dart");
+ Library lib1 = new Library(uri, fileUri: uri)
..nonNullableByDefaultCompiledMode = c1Mode;
Component c1 = new Component(libraries: [lib1]);
setCompileMode(c1, c1Mode);
@@ -49,7 +50,8 @@
List<int> c2Serialized;
{
- Library lib2 = new Library(Uri.parse("foo://baz.dart"))
+ Uri uri = Uri.parse("foo://baz.dart");
+ Library lib2 = new Library(uri, fileUri: uri)
..nonNullableByDefaultCompiledMode = c2Mode;
Component c2 = new Component(libraries: [lib2]);
setCompileMode(c2, c2Mode);
diff --git a/pkg/kernel/test/binary/invalid_index_size.dart b/pkg/kernel/test/binary/invalid_index_size.dart
index 454ede6..2722ee4 100644
--- a/pkg/kernel/test/binary/invalid_index_size.dart
+++ b/pkg/kernel/test/binary/invalid_index_size.dart
@@ -9,7 +9,8 @@
import 'utils.dart';
main() {
- Library lib1 = new Library(Uri.parse("foo://bar.dart"));
+ Uri uri = Uri.parse("foo://bar.dart");
+ Library lib1 = new Library(uri, fileUri: uri);
Component c1 = new Component(libraries: [lib1]);
List<int> serialized = serializeComponent(c1);
// The last 4 bytes is the size entry in the index. Overwrite that with 0's.
diff --git a/pkg/kernel/test/binary/lazy_reading_test.dart b/pkg/kernel/test/binary/lazy_reading_test.dart
index 7edfda9..9d8d45c 100644
--- a/pkg/kernel/test/binary/lazy_reading_test.dart
+++ b/pkg/kernel/test/binary/lazy_reading_test.dart
@@ -13,21 +13,24 @@
{
/// Create a library with two classes (A and B) where class A - in its
/// constructor - invokes the constructor for B.
- lib = new Library(Uri.parse('org-dartlang:///lib.dart'));
- final Class classA = new Class(name: "A");
+ final Uri uri = Uri.parse('org-dartlang:///lib.dart');
+ lib = new Library(uri, fileUri: uri);
+ final Class classA = new Class(name: "A", fileUri: uri);
lib.addClass(classA);
- final Class classB = new Class(name: "B");
+ final Class classB = new Class(name: "B", fileUri: uri);
lib.addClass(classB);
final Constructor classBConstructor = new Constructor(
new FunctionNode(new EmptyStatement()),
- name: new Name(""));
+ name: new Name(""),
+ fileUri: uri);
classB.addConstructor(classBConstructor);
final Constructor classAConstructor = new Constructor(
new FunctionNode(new ExpressionStatement(new ConstructorInvocation(
classBConstructor, new Arguments.empty()))),
- name: new Name(""));
+ name: new Name(""),
+ fileUri: uri);
classA.addConstructor(classAConstructor);
}
Component c = new Component(libraries: [lib]);
diff --git a/pkg/kernel/test/binary/library_flags_test.dart b/pkg/kernel/test/binary/library_flags_test.dart
index 0f80d24..c930c3c 100644
--- a/pkg/kernel/test/binary/library_flags_test.dart
+++ b/pkg/kernel/test/binary/library_flags_test.dart
@@ -58,7 +58,8 @@
"isNonNullableByDefault: $isNonNullableByDefault; "
"nonNullableByDefaultCompiledMode:"
" $nonNullableByDefaultCompiledMode");
- Library lib = new Library(Uri.parse("foo://bar.dart"));
+ Uri uri = Uri.parse("foo://bar.dart");
+ Library lib = new Library(uri, fileUri: uri);
setSynthetic(lib, isSynthetic);
setNonNullableByDefault(lib, isNonNullableByDefault);
setNonNullableByDefaultCompiledMode(
diff --git a/pkg/kernel/test/binary_bench.dart b/pkg/kernel/test/binary_bench.dart
index be0a341..75834e6 100644
--- a/pkg/kernel/test/binary_bench.dart
+++ b/pkg/kernel/test/binary_bench.dart
@@ -16,7 +16,7 @@
import 'dart:typed_data';
final usage = '''
-Usage: binary_bench.dart [--golem] <Benchmark> <SourceDill>
+Usage: binary_bench.dart [--golem|--raw] <Benchmark> <SourceDill>
Benchmark can be one of: ${benchmarks.keys.join(', ')}
''';
@@ -38,6 +38,7 @@
Benchmark benchmark;
File sourceDill;
bool forGolem = false;
+bool forRaw = false;
main(List<String> args) async {
if (!_parseArgs(args)) {
@@ -119,7 +120,13 @@
final std =
sqrt(runsUs.map((v) => pow(v - avg, 2)).reduce(add) / runsUs.length);
- if (!forGolem) {
+ if (forGolem) {
+ print('${name}(RunTimeRaw): ${avg} us.');
+ print('${name}P50(RunTimeRaw): ${P(50)} us.');
+ print('${name}P90(RunTimeRaw): ${P(90)} us.');
+ } else if (forRaw) {
+ runsUs.forEach(print);
+ } else {
print('${name}Cold: ${coldRunUs} us');
print('${name}Warmup: ${warmupUs} us');
print('${name}: ${avg} us.');
@@ -128,10 +135,6 @@
print('${prefix}> Std Dev: ${std.toStringAsFixed(2)}');
print('${prefix}> 50th percentile: ${P(50)} us.');
print('${prefix}> 90th percentile: ${P(90)} us.');
- } else {
- print('${name}(RunTimeRaw): ${avg} us.');
- print('${name}P50(RunTimeRaw): ${P(50)} us.');
- print('${name}P90(RunTimeRaw): ${P(90)} us.');
}
}
}
@@ -147,6 +150,12 @@
}
forGolem = true;
args = args.skip(1).toList(growable: false);
+ } else if (args[0] == '--raw') {
+ if (args.length != 3) {
+ return false;
+ }
+ forRaw = true;
+ args = args.skip(1).toList(growable: false);
}
benchmark = benchmarks[args[0]];
diff --git a/pkg/kernel/test/class_hierarchy_test.dart b/pkg/kernel/test/class_hierarchy_test.dart
index 841f5b9..dc68f05 100644
--- a/pkg/kernel/test/class_hierarchy_test.dart
+++ b/pkg/kernel/test/class_hierarchy_test.dart
@@ -84,13 +84,14 @@
final Component component = createMockSdkComponent();
CoreTypes coreTypes;
- final Library library =
- new Library(Uri.parse('org-dartlang:///test.dart'), name: 'test');
+ Library library;
ClassHierarchy _hierarchy;
ClosedWorldClassHierarchyTest() {
coreTypes = new CoreTypes(component);
+ Uri uri = Uri.parse('org-dartlang:///test.dart');
+ library = new Library(uri, fileUri: uri, name: 'test');
library.parent = component;
component.libraries.add(library);
}
@@ -100,14 +101,16 @@
}
void test_applyTreeChanges() {
- Class a = addClass(new Class(name: 'A', supertype: objectSuper));
+ Class a = addClass(
+ new Class(name: 'A', supertype: objectSuper, fileUri: library.fileUri));
_assertLibraryText(library, '''
class A {}
''');
- Class b = new Class(name: 'B', supertype: a.asThisSupertype);
- Library libWithB =
- new Library(Uri.parse('org-dartlang:///test_b.dart'), name: 'test_b');
+ Uri uriB = Uri.parse('org-dartlang:///test_b.dart');
+ Class b = new Class(
+ name: 'B', supertype: a.asThisSupertype, fileUri: library.fileUri);
+ Library libWithB = new Library(uriB, fileUri: uriB, name: 'test_b');
libWithB.parent = component;
component.libraries.add(libWithB);
libWithB.addClass(b);
@@ -116,7 +119,8 @@
import self as self;
import "test.dart" as test;
-class B extends test::A {}
+class B extends test::A { // from org-dartlang:///test.dart
+}
''');
// No updated classes, the same hierarchy.
@@ -124,9 +128,10 @@
// Has updated classes, still the same hierarchy (instance). Can answer
// queries about the new classes.
- var c = new Class(name: 'C', supertype: a.asThisSupertype);
- Library libWithC =
- new Library(Uri.parse('org-dartlang:///test2.dart'), name: 'test2');
+ var c = new Class(
+ name: 'C', supertype: a.asThisSupertype, fileUri: library.fileUri);
+ Uri uriC = Uri.parse('org-dartlang:///test2.dart');
+ Library libWithC = new Library(uriC, fileUri: uriC, name: 'test2');
libWithC.parent = component;
component.libraries.add(libWithC);
libWithC.addClass(c);
@@ -147,9 +152,15 @@
var methodB1 = newEmptyMethod('memberB1');
var a = addClass(new Class(
- name: 'A', supertype: objectSuper, procedures: [methodA1, methodA2]));
+ name: 'A',
+ supertype: objectSuper,
+ procedures: [methodA1, methodA2],
+ fileUri: library.fileUri));
var b = addClass(new Class(
- name: 'B', supertype: a.asThisSupertype, procedures: [methodB1]));
+ name: 'B',
+ supertype: a.asThisSupertype,
+ procedures: [methodB1],
+ fileUri: library.fileUri));
_assertTestLibraryText('''
class A {
@@ -191,25 +202,34 @@
var methodInD = newEmptyMethod('foo');
var methodInE = newEmptyMethod('foo');
- var a = addClass(
- new Class(name: 'A', supertype: objectSuper, procedures: [methodInA]));
+ var a = addClass(new Class(
+ name: 'A',
+ supertype: objectSuper,
+ procedures: [methodInA],
+ fileUri: library.fileUri));
var b = addClass(new Class(
name: 'B',
isAbstract: true,
supertype: objectSuper,
- procedures: [methodInB]));
+ procedures: [methodInB],
+ fileUri: library.fileUri));
var c = addClass(new Class(
name: 'C',
supertype: b.asThisSupertype,
- implementedTypes: [a.asThisSupertype]));
+ implementedTypes: [a.asThisSupertype],
+ fileUri: library.fileUri));
addClass(new Class(
- name: 'D', supertype: b.asThisSupertype, procedures: [methodInD]));
+ name: 'D',
+ supertype: b.asThisSupertype,
+ procedures: [methodInD],
+ fileUri: library.fileUri));
addClass(new Class(
name: 'E',
isAbstract: true,
supertype: objectSuper,
implementedTypes: [c.asThisSupertype],
- procedures: [methodInE]));
+ procedures: [methodInE],
+ fileUri: library.fileUri));
_assertTestLibraryText('''
class A {
@@ -239,28 +259,36 @@
}
void test_getSubtypesOf() {
- var a = addClass(new Class(name: 'A', supertype: objectSuper));
- var b = addClass(new Class(name: 'B', supertype: objectSuper));
- var c = addClass(new Class(name: 'C', supertype: objectSuper));
+ var a = addClass(
+ new Class(name: 'A', supertype: objectSuper, fileUri: library.fileUri));
+ var b = addClass(
+ new Class(name: 'B', supertype: objectSuper, fileUri: library.fileUri));
+ var c = addClass(
+ new Class(name: 'C', supertype: objectSuper, fileUri: library.fileUri));
- var d = addClass(new Class(name: 'D', supertype: a.asThisSupertype));
+ var d = addClass(new Class(
+ name: 'D', supertype: a.asThisSupertype, fileUri: library.fileUri));
var e = addClass(new Class(
name: 'E',
supertype: b.asThisSupertype,
- implementedTypes: [c.asThisSupertype]));
+ implementedTypes: [c.asThisSupertype],
+ fileUri: library.fileUri));
var f = addClass(new Class(
name: 'F',
supertype: e.asThisSupertype,
- implementedTypes: [a.asThisSupertype]));
+ implementedTypes: [a.asThisSupertype],
+ fileUri: library.fileUri));
- var g = addClass(new Class(name: 'G', supertype: objectSuper));
+ var g = addClass(
+ new Class(name: 'G', supertype: objectSuper, fileUri: library.fileUri));
var h = addClass(new Class(
name: 'H',
supertype: g.asThisSupertype,
- implementedTypes: [c.asThisSupertype, a.asThisSupertype]));
+ implementedTypes: [c.asThisSupertype, a.asThisSupertype],
+ fileUri: library.fileUri));
_assertTestLibraryText('''
class A {}
@@ -324,7 +352,8 @@
name: name,
typeParameters: typeParameters,
supertype: supertype,
- implementedTypes: implementedTypes));
+ implementedTypes: implementedTypes,
+ fileUri: library.fileUri));
}
Procedure newEmptyGetter(String name,
@@ -332,14 +361,15 @@
var body =
isAbstract ? null : new Block([new ReturnStatement(new NullLiteral())]);
return new Procedure(new Name(name), ProcedureKind.Getter,
- new FunctionNode(body, returnType: returnType));
+ new FunctionNode(body, returnType: returnType),
+ fileUri: library.fileUri);
}
Procedure newEmptyMethod(String name, {bool isAbstract: false}) {
var body = isAbstract ? null : new Block([]);
return new Procedure(new Name(name), ProcedureKind.Method,
new FunctionNode(body, returnType: const VoidType()),
- isAbstract: isAbstract);
+ isAbstract: isAbstract, fileUri: library.fileUri);
}
Procedure newEmptySetter(String name,
@@ -350,7 +380,8 @@
ProcedureKind.Setter,
new FunctionNode(body,
returnType: const VoidType(),
- positionalParameters: [new VariableDeclaration('_', type: type)]));
+ positionalParameters: [new VariableDeclaration('_', type: type)]),
+ fileUri: library.fileUri);
}
/// 2. A non-abstract member is inherited from a superclass, and in the
@@ -360,21 +391,26 @@
var a = addClass(new Class(
name: 'A',
supertype: objectSuper,
- procedures: [newEmptyMethod('foo'), newEmptyMethod('bar')]));
+ procedures: [newEmptyMethod('foo'), newEmptyMethod('bar')],
+ fileUri: library.fileUri));
var b = addClass(new Class(
name: 'B',
supertype: a.asThisSupertype,
- procedures: [newEmptyMethod('foo', isAbstract: true)]));
+ procedures: [newEmptyMethod('foo', isAbstract: true)],
+ fileUri: library.fileUri));
var c = addClass(new Class(
name: 'C',
supertype: a.asThisSupertype,
- implementedTypes: [b.asThisSupertype]));
- var d = addClass(new Class(name: 'D', supertype: objectSuper));
+ implementedTypes: [b.asThisSupertype],
+ fileUri: library.fileUri));
+ var d = addClass(
+ new Class(name: 'D', supertype: objectSuper, fileUri: library.fileUri));
var e = addClass(new Class(
name: 'E',
supertype: d.asThisSupertype,
mixedInType: a.asThisSupertype,
- implementedTypes: [b.asThisSupertype]));
+ implementedTypes: [b.asThisSupertype],
+ fileUri: library.fileUri));
_assertTestLibraryText('''
class A {
@@ -399,18 +435,23 @@
var a = addClass(new Class(
name: 'A',
supertype: objectSuper,
- procedures: [newEmptyMethod('foo')]));
+ procedures: [newEmptyMethod('foo')],
+ fileUri: library.fileUri));
var b = addClass(new Class(
name: 'B',
supertype: a.asThisSupertype,
- procedures: [newEmptyMethod('foo', isAbstract: true)]));
+ procedures: [newEmptyMethod('foo', isAbstract: true)],
+ fileUri: library.fileUri));
var c = addClass(new Class(
name: 'C',
supertype: a.asThisSupertype,
procedures: [newEmptyMethod('foo', isAbstract: true)],
- isAbstract: true));
- var d = addClass(new Class(name: 'D', supertype: b.asThisSupertype));
- var e = addClass(new Class(name: 'E', supertype: c.asThisSupertype));
+ isAbstract: true,
+ fileUri: library.fileUri));
+ var d = addClass(new Class(
+ name: 'D', supertype: b.asThisSupertype, fileUri: library.fileUri));
+ var e = addClass(new Class(
+ name: 'E', supertype: c.asThisSupertype, fileUri: library.fileUri));
_assertTestLibraryText('''
class A {
@@ -438,11 +479,13 @@
var a = addClass(new Class(
name: 'A',
supertype: objectSuper,
- procedures: [newEmptyMethod('foo'), newEmptyMethod('bar')]));
+ procedures: [newEmptyMethod('foo'), newEmptyMethod('bar')],
+ fileUri: library.fileUri));
var b = addClass(new Class(
name: 'B',
supertype: a.asThisSupertype,
- procedures: [newEmptyMethod('foo', isAbstract: true)]));
+ procedures: [newEmptyMethod('foo', isAbstract: true)],
+ fileUri: library.fileUri));
_assertTestLibraryText('''
class A {
@@ -466,15 +509,18 @@
var a = addClass(new Class(
name: 'A',
supertype: objectSuper,
- procedures: [newEmptyMethod('foo'), newEmptyMethod('bar')]));
+ procedures: [newEmptyMethod('foo'), newEmptyMethod('bar')],
+ fileUri: library.fileUri));
var b = addClass(new Class(
name: 'B',
supertype: a.asThisSupertype,
- procedures: [newEmptyMethod('foo')]));
+ procedures: [newEmptyMethod('foo')],
+ fileUri: library.fileUri));
var c = addClass(new Class(
name: 'C',
supertype: b.asThisSupertype,
- procedures: [newEmptyMethod('bar')]));
+ procedures: [newEmptyMethod('bar')],
+ fileUri: library.fileUri));
_assertTestLibraryText('''
class A {
@@ -499,15 +545,18 @@
var a = addClass(new Class(
name: 'A',
supertype: objectSuper,
- procedures: [newEmptySetter('foo'), newEmptySetter('bar')]));
+ procedures: [newEmptySetter('foo'), newEmptySetter('bar')],
+ fileUri: library.fileUri));
var b = addClass(new Class(
name: 'B',
supertype: a.asThisSupertype,
- procedures: [newEmptySetter('foo')]));
+ procedures: [newEmptySetter('foo')],
+ fileUri: library.fileUri));
var c = addClass(new Class(
name: 'C',
supertype: b.asThisSupertype,
- procedures: [newEmptySetter('bar')]));
+ procedures: [newEmptySetter('bar')],
+ fileUri: library.fileUri));
_assertTestLibraryText('''
class A {
@@ -537,9 +586,13 @@
var b = addClass(new Class(
name: 'B',
typeParameters: [bT],
- supertype: new Supertype(a, [bTT, bool])));
+ supertype: new Supertype(a, [bTT, bool]),
+ fileUri: library.fileUri));
- var c = addClass(new Class(name: 'C', supertype: new Supertype(b, [int])));
+ var c = addClass(new Class(
+ name: 'C',
+ supertype: new Supertype(b, [int]),
+ fileUri: library.fileUri));
_assertTestLibraryText('''
class A<T*, U*> {}
@@ -568,12 +621,16 @@
supertype: objectSuper,
implementedTypes: [
new Supertype(a, [bTT, bool])
- ]));
+ ],
+ fileUri: library.fileUri));
- var c = addClass(
- new Class(name: 'C', supertype: objectSuper, implementedTypes: [
- new Supertype(b, [int])
- ]));
+ var c = addClass(new Class(
+ name: 'C',
+ supertype: objectSuper,
+ implementedTypes: [
+ new Supertype(b, [int])
+ ],
+ fileUri: library.fileUri));
_assertTestLibraryText('''
class A<T*, U*> {}
@@ -600,12 +657,14 @@
name: 'B',
typeParameters: [bT],
supertype: objectSuper,
- mixedInType: new Supertype(a, [bTT, bool])));
+ mixedInType: new Supertype(a, [bTT, bool]),
+ fileUri: library.fileUri));
var c = addClass(new Class(
name: 'C',
supertype: objectSuper,
- mixedInType: new Supertype(b, [int])));
+ mixedInType: new Supertype(b, [int]),
+ fileUri: library.fileUri));
_assertTestLibraryText('''
class A<T*, U*> {}
@@ -621,10 +680,14 @@
}
void test_getClassAsInstanceOf_notGeneric_extends() {
- var a = addClass(new Class(name: 'A', supertype: objectSuper));
- var b = addClass(new Class(name: 'B', supertype: a.asThisSupertype));
- var c = addClass(new Class(name: 'C', supertype: b.asThisSupertype));
- var z = addClass(new Class(name: 'Z', supertype: objectSuper));
+ var a = addClass(
+ new Class(name: 'A', supertype: objectSuper, fileUri: library.fileUri));
+ var b = addClass(new Class(
+ name: 'B', supertype: a.asThisSupertype, fileUri: library.fileUri));
+ var c = addClass(new Class(
+ name: 'C', supertype: b.asThisSupertype, fileUri: library.fileUri));
+ var z = addClass(
+ new Class(name: 'Z', supertype: objectSuper, fileUri: library.fileUri));
_assertTestLibraryText('''
class A {}
@@ -643,21 +706,27 @@
}
void test_getClassAsInstanceOf_notGeneric_implements() {
- var a = addClass(new Class(name: 'A', supertype: objectSuper));
- var b = addClass(new Class(name: 'B', supertype: objectSuper));
+ var a = addClass(
+ new Class(name: 'A', supertype: objectSuper, fileUri: library.fileUri));
+ var b = addClass(
+ new Class(name: 'B', supertype: objectSuper, fileUri: library.fileUri));
var c = addClass(new Class(
name: 'C',
supertype: objectSuper,
- implementedTypes: [a.asThisSupertype]));
+ implementedTypes: [a.asThisSupertype],
+ fileUri: library.fileUri));
var d = addClass(new Class(
name: 'D',
supertype: objectSuper,
- implementedTypes: [c.asThisSupertype]));
+ implementedTypes: [c.asThisSupertype],
+ fileUri: library.fileUri));
var e = addClass(new Class(
name: 'D',
supertype: a.asThisSupertype,
- implementedTypes: [b.asThisSupertype]));
- var z = addClass(new Class(name: 'Z', supertype: objectSuper));
+ implementedTypes: [b.asThisSupertype],
+ fileUri: library.fileUri));
+ var z = addClass(
+ new Class(name: 'Z', supertype: objectSuper, fileUri: library.fileUri));
_assertTestLibraryText('''
class A {}
@@ -677,10 +746,15 @@
}
void test_getClassAsInstanceOf_notGeneric_with() {
- var a = addClass(new Class(name: 'A', supertype: objectSuper));
+ var a = addClass(
+ new Class(name: 'A', supertype: objectSuper, fileUri: library.fileUri));
var b = addClass(new Class(
- name: 'B', supertype: objectSuper, mixedInType: a.asThisSupertype));
- var z = addClass(new Class(name: 'Z', supertype: objectSuper));
+ name: 'B',
+ supertype: objectSuper,
+ mixedInType: a.asThisSupertype,
+ fileUri: library.fileUri));
+ var z = addClass(
+ new Class(name: 'Z', supertype: objectSuper, fileUri: library.fileUri));
_assertTestLibraryText('''
class A {}
@@ -700,16 +774,15 @@
var abstractMethod = newEmptyMethod('abstractMethod', isAbstract: true);
var abstractGetter = newEmptyGetter('abstractGetter', isAbstract: true);
var abstractSetter = newEmptySetter('abstractSetter', isAbstract: true);
- var nonFinalField = new Field.mutable(new Name('nonFinalField'));
- var finalField = new Field.immutable(new Name('finalField'), isFinal: true);
+ var nonFinalField =
+ new Field.mutable(new Name('nonFinalField'), fileUri: library.fileUri);
+ var finalField = new Field.immutable(new Name('finalField'),
+ isFinal: true, fileUri: library.fileUri);
var a = addClass(new Class(
isAbstract: true,
name: 'A',
supertype: objectSuper,
- fields: [
- nonFinalField,
- finalField
- ],
+ fields: [nonFinalField, finalField],
procedures: [
method,
getter,
@@ -717,9 +790,13 @@
abstractMethod,
abstractGetter,
abstractSetter
- ]));
- var b = addClass(
- new Class(isAbstract: true, name: 'B', supertype: a.asThisSupertype));
+ ],
+ fileUri: library.fileUri));
+ var b = addClass(new Class(
+ isAbstract: true,
+ name: 'B',
+ supertype: a.asThisSupertype,
+ fileUri: library.fileUri));
_assertTestLibraryText('''
abstract class A {
@@ -759,12 +836,17 @@
var bMethod = newEmptyMethod('bMethod');
var bSetter = newEmptySetter('bSetter');
var a = addClass(new Class(
- name: 'A', supertype: objectSuper, procedures: [aMethod, aSetter]));
+ name: 'A',
+ supertype: objectSuper,
+ procedures: [aMethod, aSetter],
+ fileUri: library.fileUri));
var b = addClass(new Class(
name: 'B',
supertype: a.asThisSupertype,
- procedures: [bMethod, bSetter]));
- var c = addClass(new Class(name: 'C', supertype: b.asThisSupertype));
+ procedures: [bMethod, bSetter],
+ fileUri: library.fileUri));
+ var c = addClass(new Class(
+ name: 'C', supertype: b.asThisSupertype, fileUri: library.fileUri));
_assertTestLibraryText('''
class A {
@@ -805,13 +887,16 @@
isAbstract: true,
name: 'A',
supertype: objectSuper,
- procedures: [aFoo, aBar]));
+ procedures: [aFoo, aBar],
+ fileUri: library.fileUri));
var b = addClass(new Class(
isAbstract: true,
name: 'B',
supertype: a.asThisSupertype,
- procedures: [bFoo, bBar]));
- var c = addClass(new Class(name: 'C', supertype: b.asThisSupertype));
+ procedures: [bFoo, bBar],
+ fileUri: library.fileUri));
+ var c = addClass(new Class(
+ name: 'C', supertype: b.asThisSupertype, fileUri: library.fileUri));
_assertTestLibraryText('''
abstract class A {
@@ -840,12 +925,17 @@
var bMethod = newEmptyMethod('bMethod');
var bSetter = newEmptySetter('bSetter');
var a = addClass(new Class(
- name: 'A', supertype: objectSuper, procedures: [aMethod, aSetter]));
+ name: 'A',
+ supertype: objectSuper,
+ procedures: [aMethod, aSetter],
+ fileUri: library.fileUri));
var b = addClass(new Class(
name: 'B',
supertype: a.asThisSupertype,
- procedures: [bMethod, bSetter]));
- var c = addClass(new Class(name: 'C', supertype: b.asThisSupertype));
+ procedures: [bMethod, bSetter],
+ fileUri: library.fileUri));
+ var c = addClass(new Class(
+ name: 'C', supertype: b.asThisSupertype, fileUri: library.fileUri));
_assertTestLibraryText('''
class A {
@@ -883,16 +973,21 @@
var bMethod = newEmptyMethod('bMethod');
var bSetter = newEmptySetter('bSetter');
var a = addClass(new Class(
- name: 'A', supertype: objectSuper, procedures: [aMethod, aSetter]));
+ name: 'A',
+ supertype: objectSuper,
+ procedures: [aMethod, aSetter],
+ fileUri: library.fileUri));
var b = addClass(new Class(
name: 'B',
supertype: objectSuper,
implementedTypes: [a.asThisSupertype],
- procedures: [bMethod, bSetter]));
+ procedures: [bMethod, bSetter],
+ fileUri: library.fileUri));
var c = addClass(new Class(
name: 'C',
supertype: objectSuper,
- implementedTypes: [b.asThisSupertype]));
+ implementedTypes: [b.asThisSupertype],
+ fileUri: library.fileUri));
_assertTestLibraryText('''
class A {
@@ -931,16 +1026,15 @@
var abstractMethod = newEmptyMethod('abstractMethod', isAbstract: true);
var abstractGetter = newEmptyGetter('abstractGetter', isAbstract: true);
var abstractSetter = newEmptySetter('abstractSetter', isAbstract: true);
- var nonFinalField = new Field.mutable(new Name('nonFinalField'));
- var finalField = new Field.immutable(new Name('finalField'), isFinal: true);
+ var nonFinalField =
+ new Field.mutable(new Name('nonFinalField'), fileUri: library.fileUri);
+ var finalField = new Field.immutable(new Name('finalField'),
+ isFinal: true, fileUri: library.fileUri);
var a = addClass(new Class(
isAbstract: true,
name: 'A',
supertype: objectSuper,
- fields: [
- nonFinalField,
- finalField
- ],
+ fields: [nonFinalField, finalField],
procedures: [
method,
getter,
@@ -948,7 +1042,8 @@
abstractMethod,
abstractGetter,
abstractSetter
- ]));
+ ],
+ fileUri: library.fileUri));
_assertTestLibraryText('''
abstract class A {
@@ -986,28 +1081,37 @@
var abstractMethod = newEmptyMethod('abstractMethod', isAbstract: true);
var abstractGetter = newEmptyGetter('abstractGetter', isAbstract: true);
var abstractSetter = newEmptySetter('abstractSetter', isAbstract: true);
- var nonFinalField = new Field.mutable(new Name('nonFinalField'));
- var finalField = new Field.immutable(new Name('finalField'), isFinal: true);
+ var nonFinalField =
+ new Field.mutable(new Name('nonFinalField'), fileUri: library.fileUri);
+ var finalField = new Field.immutable(new Name('finalField'),
+ isFinal: true, fileUri: library.fileUri);
- var a = addClass(new Class(name: 'A', supertype: objectSuper, fields: [
- nonFinalField,
- finalField
- ], procedures: [
- method,
- getter,
- setter,
- abstractMethod,
- abstractGetter,
- abstractSetter
- ]));
- var b = addClass(new Class(name: 'B', supertype: a.asThisSupertype));
+ var a = addClass(new Class(
+ name: 'A',
+ supertype: objectSuper,
+ fields: [nonFinalField, finalField],
+ procedures: [
+ method,
+ getter,
+ setter,
+ abstractMethod,
+ abstractGetter,
+ abstractSetter
+ ],
+ fileUri: library.fileUri));
+ var b = addClass(new Class(
+ name: 'B', supertype: a.asThisSupertype, fileUri: library.fileUri));
var c = addClass(new Class(
isAbstract: true,
name: 'C',
supertype: objectSuper,
- implementedTypes: [a.asThisSupertype]));
+ implementedTypes: [a.asThisSupertype],
+ fileUri: library.fileUri));
var d = addClass(new Class(
- name: 'D', supertype: objectSuper, mixedInType: a.asThisSupertype));
+ name: 'D',
+ supertype: objectSuper,
+ mixedInType: a.asThisSupertype,
+ fileUri: library.fileUri));
_assertTestLibraryText('''
class A {
@@ -1051,31 +1155,36 @@
var method_a = newEmptyMethod('method');
var getter_a = newEmptyGetter('getter');
var setter_a = newEmptySetter('setter');
- var nonFinalField_a = new Field.mutable(new Name('nonFinalField'));
- var finalField_a =
- new Field.immutable(new Name('finalField'), isFinal: true);
+ var nonFinalField_a =
+ new Field.mutable(new Name('nonFinalField'), fileUri: library.fileUri);
+ var finalField_a = new Field.immutable(new Name('finalField'),
+ isFinal: true, fileUri: library.fileUri);
var method_b = newEmptyMethod('method');
var getter_b = newEmptyGetter('getter');
var setter_b = newEmptySetter('setter');
- var nonFinalField_b = new Field.mutable(new Name('nonFinalField'));
- var finalField_b =
- new Field.immutable(new Name('finalField'), isFinal: true);
+ var nonFinalField_b =
+ new Field.mutable(new Name('nonFinalField'), fileUri: library.fileUri);
+ var finalField_b = new Field.immutable(new Name('finalField'),
+ isFinal: true, fileUri: library.fileUri);
var a = addClass(new Class(
name: 'A',
supertype: objectSuper,
fields: [nonFinalField_a, finalField_a],
- procedures: [method_a, getter_a, setter_a]));
+ procedures: [method_a, getter_a, setter_a],
+ fileUri: library.fileUri));
var b = addClass(new Class(
name: 'B',
supertype: objectSuper,
fields: [nonFinalField_b, finalField_b],
- procedures: [method_b, getter_b, setter_b]));
+ procedures: [method_b, getter_b, setter_b],
+ fileUri: library.fileUri));
var c = addClass(new Class(
isAbstract: true,
name: 'C',
supertype: objectSuper,
- implementedTypes: [a.asThisSupertype, b.asThisSupertype]));
+ implementedTypes: [a.asThisSupertype, b.asThisSupertype],
+ fileUri: library.fileUri));
_assertTestLibraryText('''
class A {
@@ -1123,31 +1232,36 @@
var getter_a = newEmptyGetter('getter');
var setter_a = newEmptySetter('setter');
var nonShadowedSetter_a = newEmptySetter('nonShadowedSetter');
- var nonFinalField_a = new Field.mutable(new Name('nonFinalField'));
- var finalField_a =
- new Field.immutable(new Name('finalField'), isFinal: true);
+ var nonFinalField_a =
+ new Field.mutable(new Name('nonFinalField'), fileUri: library.fileUri);
+ var finalField_a = new Field.immutable(new Name('finalField'),
+ isFinal: true, fileUri: library.fileUri);
var method_b = newEmptyMethod('method');
var getter_b = newEmptyGetter('getter');
var setter_b = newEmptySetter('setter');
- var nonFinalField_b = new Field.mutable(new Name('nonFinalField'));
- var finalField_b =
- new Field.immutable(new Name('finalField'), isFinal: true);
+ var nonFinalField_b =
+ new Field.mutable(new Name('nonFinalField'), fileUri: library.fileUri);
+ var finalField_b = new Field.immutable(new Name('finalField'),
+ isFinal: true, fileUri: library.fileUri);
- var a = addClass(new Class(name: 'A', supertype: objectSuper, fields: [
- nonFinalField_a,
- finalField_a
- ], procedures: [
- method_a,
- nonShadowedMethod_a,
- getter_a,
- setter_a,
- nonShadowedSetter_a
- ]));
+ var a = addClass(new Class(
+ name: 'A',
+ supertype: objectSuper,
+ fields: [nonFinalField_a, finalField_a],
+ procedures: [
+ method_a,
+ nonShadowedMethod_a,
+ getter_a,
+ setter_a,
+ nonShadowedSetter_a
+ ],
+ fileUri: library.fileUri));
var b = addClass(new Class(
name: 'B',
supertype: a.asThisSupertype,
fields: [nonFinalField_b, finalField_b],
- procedures: [method_b, getter_b, setter_b]));
+ procedures: [method_b, getter_b, setter_b],
+ fileUri: library.fileUri));
_assertTestLibraryText('''
class A {
@@ -1186,9 +1300,12 @@
}
void test_getOrderedClasses() {
- var a = addClass(new Class(name: 'A', supertype: objectSuper));
- var b = addClass(new Class(name: 'B', supertype: a.asThisSupertype));
- var c = addClass(new Class(name: 'C', supertype: b.asThisSupertype));
+ var a = addClass(
+ new Class(name: 'A', supertype: objectSuper, fileUri: library.fileUri));
+ var b = addClass(new Class(
+ name: 'B', supertype: a.asThisSupertype, fileUri: library.fileUri));
+ var c = addClass(new Class(
+ name: 'C', supertype: b.asThisSupertype, fileUri: library.fileUri));
void assertOrderOfClasses(List<Class> unordered, List<Class> expected) {
var ordered = hierarchy.getOrderedClasses(unordered);
@@ -1215,7 +1332,8 @@
var b = addClass(new Class(
name: 'B',
typeParameters: [bT],
- supertype: new Supertype(a, [bTT, bool])));
+ supertype: new Supertype(a, [bTT, bool]),
+ fileUri: library.fileUri));
_assertTestLibraryText('''
class A<T*, U*> {}
diff --git a/pkg/kernel/test/convert_field_to_setter_getter.dart b/pkg/kernel/test/convert_field_to_setter_getter.dart
index fe37493..d7e7fd7 100644
--- a/pkg/kernel/test/convert_field_to_setter_getter.dart
+++ b/pkg/kernel/test/convert_field_to_setter_getter.dart
@@ -9,8 +9,9 @@
import 'binary/utils.dart';
main() {
- final Library lib1 = new Library(Uri.parse('org-dartlang:///lib.dart'));
- final Field field = new Field.mutable(new Name("f"));
+ final Uri lib1Uri = Uri.parse('org-dartlang:///lib.dart');
+ final Library lib1 = new Library(lib1Uri, fileUri: lib1Uri);
+ final Field field = new Field.mutable(new Name("f"), fileUri: lib1Uri);
lib1.addField(field);
final Block libProcedureBody = new Block([
new ExpressionStatement(new StaticSet(field, new IntLiteral(42))),
@@ -19,10 +20,12 @@
final Procedure libProcedure = new Procedure(
new Name("method"),
ProcedureKind.Method,
- new FunctionNode(libProcedureBody, returnType: new DynamicType()));
+ new FunctionNode(libProcedureBody, returnType: new DynamicType()),
+ fileUri: lib1Uri);
lib1.addProcedure(libProcedure);
- final Library lib2 = new Library(Uri.parse('org-dartlang:///lib2.dart'));
+ final Uri lib2Uri = Uri.parse('org-dartlang:///lib2.dart');
+ final Library lib2 = new Library(lib2Uri, fileUri: lib2Uri);
final Block lib2ProcedureBody = new Block([
new ExpressionStatement(new StaticSet(field, new IntLiteral(43))),
new ReturnStatement(new StaticGet(field)),
@@ -30,7 +33,8 @@
final Procedure lib2Procedure = new Procedure(
new Name("method"),
ProcedureKind.Method,
- new FunctionNode(lib2ProcedureBody, returnType: new DynamicType()));
+ new FunctionNode(lib2ProcedureBody, returnType: new DynamicType()),
+ fileUri: lib2Uri);
lib2.addProcedure(lib2Procedure);
verifyTargets(libProcedure, lib2Procedure, field, field);
@@ -53,7 +57,7 @@
FunctionNode getterFunction = new FunctionNode(new Block([]));
Procedure getter = new Procedure(
new Name("f"), ProcedureKind.Getter, getterFunction,
- reference: field.getterReference);
+ reference: field.getterReference, fileUri: lib1Uri);
// Important: Unbind any old canonical name
// (nulling out the canonical name is not enough because it leaves the old
// canonical name (which always stays alive) with a pointer to the reference,
@@ -68,7 +72,7 @@
positionalParameters: [new VariableDeclaration("foo")]);
Procedure setter = new Procedure(
new Name("f"), ProcedureKind.Setter, setterFunction,
- reference: field.setterReference);
+ reference: field.setterReference, fileUri: lib1Uri);
// Important: Unbind any old canonical name
// (nulling out the canonical name is not enough, see above).
field.setterReference?.canonicalName?.unbind();
@@ -101,7 +105,9 @@
lib1.procedures.remove(getter);
lib1.procedures.remove(setter);
final Field fieldReplacement = new Field.mutable(new Name("f"),
- getterReference: getter.reference, setterReference: setter.reference);
+ getterReference: getter.reference,
+ setterReference: setter.reference,
+ fileUri: lib1Uri);
// Important: Unbind any old canonical name
// (nulling out the canonical name is not enough, see above).
fieldReplacement.getterReference?.canonicalName?.unbind();
diff --git a/pkg/kernel/test/load_concat_dill_keeps_source_test.dart b/pkg/kernel/test/load_concat_dill_keeps_source_test.dart
index 60af31f..0c2dc97 100644
--- a/pkg/kernel/test/load_concat_dill_keeps_source_test.dart
+++ b/pkg/kernel/test/load_concat_dill_keeps_source_test.dart
@@ -16,14 +16,14 @@
Uri uri2 = Uri.parse("foo://lib2.dart");
main() {
- Library library1 = new Library(uri1)..fileUri = uri1;
- Library library2 = new Library(uri2)..fileUri = uri2;
+ Library library1 = new Library(uri1, fileUri: uri1);
+ Library library2 = new Library(uri2, fileUri: uri2);
Procedure p1 = new Procedure(new Name("p1"), ProcedureKind.Method,
- new FunctionNode(new ReturnStatement()))
- ..fileUri = uri2;
+ new FunctionNode(new ReturnStatement()),
+ fileUri: uri2);
Procedure p2 = new Procedure(new Name("p2"), ProcedureKind.Method,
- new FunctionNode(new ReturnStatement()))
- ..fileUri = uri1;
+ new FunctionNode(new ReturnStatement()),
+ fileUri: uri1);
library1.addProcedure(p1);
library2.addProcedure(p2);
diff --git a/pkg/kernel/test/relink_test.dart b/pkg/kernel/test/relink_test.dart
index b50be8e..3f4c9be 100644
--- a/pkg/kernel/test/relink_test.dart
+++ b/pkg/kernel/test/relink_test.dart
@@ -149,16 +149,19 @@
}
Component createComponent(int literal) {
- final Library lib = new Library(Uri.parse('org-dartlang:///lib.dart'));
+ final Uri libUri = Uri.parse('org-dartlang:///lib.dart');
+ final Library lib = new Library(libUri, fileUri: libUri);
final Block libProcedureBody =
new Block([new ReturnStatement(new IntLiteral(literal))]);
final Procedure libProcedure = new Procedure(
new Name("method"),
ProcedureKind.Method,
- new FunctionNode(libProcedureBody, returnType: new DynamicType()));
+ new FunctionNode(libProcedureBody, returnType: new DynamicType()),
+ fileUri: libUri);
lib.addProcedure(libProcedure);
- final Library main = new Library(Uri.parse('org-dartlang:///main.dart'));
+ final Uri mainUri = Uri.parse('org-dartlang:///main.dart');
+ final Library main = new Library(mainUri, fileUri: mainUri);
final Block mainProcedureBody = new Block([
new ReturnStatement(
new StaticInvocation(libProcedure, new Arguments.empty()))
@@ -166,7 +169,8 @@
final Procedure mainProcedure = new Procedure(
new Name("method"),
ProcedureKind.Method,
- new FunctionNode(mainProcedureBody, returnType: new DynamicType()));
+ new FunctionNode(mainProcedureBody, returnType: new DynamicType()),
+ fileUri: mainUri);
main.addProcedure(mainProcedure);
return new Component(libraries: [main, lib])
..setMainMethodAndMode(null, false, NonNullableByDefaultCompiledMode.Weak);
diff --git a/pkg/kernel/test/text_serializer_from_kernel_nodes_test.dart b/pkg/kernel/test/text_serializer_from_kernel_nodes_test.dart
index df7b9ff..ddc5c9f 100644
--- a/pkg/kernel/test/text_serializer_from_kernel_nodes_test.dart
+++ b/pkg/kernel/test/text_serializer_from_kernel_nodes_test.dart
@@ -122,11 +122,10 @@
serializer: statementSerializer);
}(),
() {
- Field field =
- new Field.immutable(new Name('field'), type: const DynamicType());
- Library library = new Library(
- new Uri(scheme: 'package', path: 'foo/bar.dart'),
- fields: <Field>[field]);
+ Uri uri = new Uri(scheme: 'package', path: 'foo/bar.dart');
+ Field field = new Field.immutable(new Name('field'),
+ type: const DynamicType(), fileUri: uri);
+ Library library = new Library(uri, fileUri: uri, fields: <Field>[field]);
Component component = new Component(libraries: <Library>[library]);
component.computeCanonicalNames();
return new TestCase<Statement>(
@@ -140,11 +139,10 @@
serializer: statementSerializer);
}(),
() {
- Field field =
- new Field.mutable(new Name('field'), type: const DynamicType());
- Library library = new Library(
- new Uri(scheme: 'package', path: 'foo/bar.dart'),
- fields: <Field>[field]);
+ Uri uri = new Uri(scheme: 'package', path: 'foo/bar.dart');
+ Field field = new Field.mutable(new Name('field'),
+ type: const DynamicType(), fileUri: uri);
+ Library library = new Library(uri, fileUri: uri, fields: <Field>[field]);
Component component = new Component(libraries: <Library>[library]);
component.computeCanonicalNames();
return new TestCase<Statement>(
@@ -158,11 +156,10 @@
serializer: statementSerializer);
}(),
() {
- Field field =
- new Field.mutable(new Name('field'), type: const DynamicType());
- Library library = new Library(
- new Uri(scheme: 'package', path: 'foo/bar.dart'),
- fields: <Field>[field]);
+ Uri uri = new Uri(scheme: 'package', path: 'foo/bar.dart');
+ Field field = new Field.mutable(new Name('field'),
+ type: const DynamicType(), fileUri: uri);
+ Library library = new Library(uri, fileUri: uri, fields: <Field>[field]);
Component component = new Component(libraries: <Library>[library]);
component.computeCanonicalNames();
return new TestCase<Statement>(
@@ -178,16 +175,17 @@
serializer: statementSerializer);
}(),
() {
+ Uri uri = new Uri(scheme: 'package', path: 'foo/bar.dart');
Procedure topLevelProcedure = new Procedure(
new Name('foo'),
ProcedureKind.Method,
new FunctionNode(null, positionalParameters: <VariableDeclaration>[
new VariableDeclaration('x', type: const DynamicType())
]),
- isStatic: true);
- Library library = new Library(
- new Uri(scheme: 'package', path: 'foo/bar.dart'),
- procedures: <Procedure>[topLevelProcedure]);
+ isStatic: true,
+ fileUri: uri);
+ Library library = new Library(uri,
+ fileUri: uri, procedures: <Procedure>[topLevelProcedure]);
Component component = new Component(libraries: <Library>[library]);
component.computeCanonicalNames();
return new TestCase<Statement>(
@@ -205,14 +203,13 @@
serializer: statementSerializer);
}(),
() {
+ Uri uri = new Uri(scheme: 'package', path: 'foo/bar.dart');
Procedure factoryConstructor = new Procedure(
new Name('foo'), ProcedureKind.Factory, new FunctionNode(null),
- isStatic: true, isConst: true);
- Class klass =
- new Class(name: 'A', procedures: <Procedure>[factoryConstructor]);
- Library library = new Library(
- new Uri(scheme: 'package', path: 'foo/bar.dart'),
- classes: <Class>[klass]);
+ isStatic: true, isConst: true, fileUri: uri);
+ Class klass = new Class(
+ name: 'A', procedures: <Procedure>[factoryConstructor], fileUri: uri);
+ Library library = new Library(uri, fileUri: uri, classes: <Class>[klass]);
Component component = new Component(libraries: <Library>[library]);
component.computeCanonicalNames();
return new TestCase<Statement>(
@@ -231,12 +228,11 @@
serializer: statementSerializer);
}(),
() {
- Field field =
- new Field.immutable(new Name('field'), type: const DynamicType());
- Class klass = new Class(name: 'A', fields: <Field>[field]);
- Library library = new Library(
- new Uri(scheme: 'package', path: 'foo/bar.dart'),
- classes: <Class>[klass]);
+ Uri uri = new Uri(scheme: 'package', path: 'foo/bar.dart');
+ Field field = new Field.immutable(new Name('field'),
+ type: const DynamicType(), fileUri: uri);
+ Class klass = new Class(name: 'A', fields: <Field>[field], fileUri: uri);
+ Library library = new Library(uri, fileUri: uri, classes: <Class>[klass]);
Component component = new Component(libraries: <Library>[library]);
component.computeCanonicalNames();
@@ -260,12 +256,11 @@
serializer: statementSerializer);
}(),
() {
- Field field =
- new Field.mutable(new Name('field'), type: const DynamicType());
- Class klass = new Class(name: 'A', fields: <Field>[field]);
- Library library = new Library(
- new Uri(scheme: 'package', path: 'foo/bar.dart'),
- classes: <Class>[klass]);
+ Uri uri = new Uri(scheme: 'package', path: 'foo/bar.dart');
+ Field field = new Field.mutable(new Name('field'),
+ type: const DynamicType(), fileUri: uri);
+ Class klass = new Class(name: 'A', fields: <Field>[field], fileUri: uri);
+ Library library = new Library(uri, fileUri: uri, classes: <Class>[klass]);
Component component = new Component(libraries: <Library>[library]);
component.computeCanonicalNames();
@@ -289,12 +284,11 @@
serializer: statementSerializer);
}(),
() {
- Field field =
- new Field.mutable(new Name('field'), type: const DynamicType());
- Class klass = new Class(name: 'A', fields: <Field>[field]);
- Library library = new Library(
- new Uri(scheme: 'package', path: 'foo/bar.dart'),
- classes: <Class>[klass]);
+ Uri uri = new Uri(scheme: 'package', path: 'foo/bar.dart');
+ Field field = new Field.mutable(new Name('field'),
+ type: const DynamicType(), fileUri: uri);
+ Class klass = new Class(name: 'A', fields: <Field>[field], fileUri: uri);
+ Library library = new Library(uri, fileUri: uri, classes: <Class>[klass]);
Component component = new Component(libraries: <Library>[library]);
component.computeCanonicalNames();
@@ -321,13 +315,13 @@
serializer: statementSerializer);
}(),
() {
+ Uri uri = new Uri(scheme: 'package', path: 'foo/bar.dart');
Procedure method = new Procedure(
new Name('foo'), ProcedureKind.Method, new FunctionNode(null),
- isStatic: true, isConst: true);
- Class klass = new Class(name: 'A', procedures: <Procedure>[method]);
- Library library = new Library(
- new Uri(scheme: 'package', path: 'foo/bar.dart'),
- classes: <Class>[klass]);
+ isStatic: true, isConst: true, fileUri: uri);
+ Class klass =
+ new Class(name: 'A', procedures: <Procedure>[method], fileUri: uri);
+ Library library = new Library(uri, fileUri: uri, classes: <Class>[klass]);
Component component = new Component(libraries: <Library>[library]);
component.computeCanonicalNames();
@@ -355,13 +349,12 @@
serializer: statementSerializer);
}(),
() {
- Constructor constructor =
- new Constructor(new FunctionNode(null), name: new Name('foo'));
- Class klass =
- new Class(name: 'A', constructors: <Constructor>[constructor]);
- Library library = new Library(
- new Uri(scheme: 'package', path: 'foo/bar.dart'),
- classes: <Class>[klass]);
+ Uri uri = new Uri(scheme: 'package', path: 'foo/bar.dart');
+ Constructor constructor = new Constructor(new FunctionNode(null),
+ name: new Name('foo'), fileUri: uri);
+ Class klass = new Class(
+ name: 'A', constructors: <Constructor>[constructor], fileUri: uri);
+ Library library = new Library(uri, fileUri: uri, classes: <Class>[klass]);
Component component = new Component(libraries: <Library>[library]);
component.computeCanonicalNames();
return new TestCase<Statement>(
@@ -378,13 +371,12 @@
serializer: statementSerializer);
}(),
() {
+ Uri uri = new Uri(scheme: 'package', path: 'foo/bar.dart');
Constructor constructor = new Constructor(new FunctionNode(null),
- name: new Name('foo'), isConst: true);
- Class klass =
- new Class(name: 'A', constructors: <Constructor>[constructor]);
- Library library = new Library(
- new Uri(scheme: 'package', path: 'foo/bar.dart'),
- classes: <Class>[klass]);
+ name: new Name('foo'), isConst: true, fileUri: uri);
+ Class klass = new Class(
+ name: 'A', constructors: <Constructor>[constructor], fileUri: uri);
+ Library library = new Library(uri, fileUri: uri, classes: <Class>[klass]);
Component component = new Component(libraries: <Library>[library]);
component.computeCanonicalNames();
return new TestCase<Statement>(
@@ -456,15 +448,16 @@
serializer: statementSerializer);
}(),
() {
+ Uri uri = Uri(scheme: 'package', path: 'foo/bar.dart');
VariableDeclaration x = VariableDeclaration('x', type: DynamicType());
Procedure foo = Procedure(
Name('foo'),
ProcedureKind.Method,
FunctionNode(ReturnStatement(VariableGet(x)),
positionalParameters: [x]),
- isStatic: true);
- Library library = Library(Uri(scheme: 'package', path: 'foo/bar.dart'),
- procedures: [foo]);
+ isStatic: true,
+ fileUri: uri);
+ Library library = Library(uri, fileUri: uri, procedures: [foo]);
Component component = Component(libraries: [library]);
component.computeCanonicalNames();
return new TestCase<Member>(
@@ -473,7 +466,8 @@
expectation: ''
'(method (public "foo") ((static))'
' (sync) () () () ("x^0" () (dynamic) _ ()) () ()'
- ' (dynamic) _ (ret (get-var "x^0" _)))',
+ ' (dynamic) _ (ret (get-var "x^0" _))'
+ ' "package:foo/bar.dart")',
makeSerializationState: () =>
new SerializationState(new SerializationEnvironment(null)),
makeDeserializationState: () => new DeserializationState(
@@ -481,6 +475,7 @@
serializer: memberSerializer);
}(),
() {
+ Uri uri = Uri(scheme: 'package', path: 'foo/bar.dart');
VariableDeclaration x1 = VariableDeclaration('x', type: DynamicType());
VariableDeclaration x2 = VariableDeclaration('x', type: DynamicType());
Procedure foo = Procedure(
@@ -488,7 +483,8 @@
ProcedureKind.Method,
FunctionNode(ReturnStatement(VariableGet(x1)),
positionalParameters: [x1]),
- isStatic: true);
+ isStatic: true,
+ fileUri: uri);
Procedure bar = Procedure(
Name('bar'),
ProcedureKind.Method,
@@ -496,9 +492,9 @@
ReturnStatement(
StaticInvocation(foo, Arguments([VariableGet(x2)]))),
positionalParameters: [x2]),
- isStatic: true);
- Library library = Library(Uri(scheme: 'package', path: 'foo/bar.dart'),
- procedures: [foo, bar]);
+ isStatic: true,
+ fileUri: uri);
+ Library library = Library(uri, fileUri: uri, procedures: [foo, bar]);
Component component = Component(libraries: [library]);
component.computeCanonicalNames();
return new TestCase<Library>(
@@ -509,19 +505,23 @@
''
' ((method (public "foo") ((static))'
' (sync) () () () ("x^0" () (dynamic) _ ()) () () (dynamic)'
- ' _ (ret (get-var "x^0" _)))'
+ ' _ (ret (get-var "x^0" _))'
+ ' "package:foo/bar.dart")'
''
' (method (public "bar") ((static))'
' (sync) () () () ("x^0" () (dynamic) _ ()) () () (dynamic)'
' _ (ret'
' (invoke-static "package:foo/bar.dart::@methods::foo"'
- ' () ((get-var "x^0" _)) ()))))'
+ ' () ((get-var "x^0" _)) ()))'
+ ' "package:foo/bar.dart"))'
''
' ()'
''
' ()'
''
- ' ()',
+ ' ()'
+ ''
+ ' "package:foo/bar.dart"',
makeSerializationState: () =>
new SerializationState(new SerializationEnvironment(null)),
makeDeserializationState: () => new DeserializationState(
@@ -529,15 +529,17 @@
serializer: librarySerializer);
}(),
() {
- Class a = Class(name: "A");
+ Uri uri = Uri(scheme: "package", path: "foo/bar.dart");
+ Class a = Class(name: "A", fileUri: uri);
Procedure foo = Procedure(
Name("foo"),
ProcedureKind.Method,
FunctionNode(ReturnStatement(NullLiteral()),
returnType: InterfaceType(a, Nullability.legacy)),
- isStatic: true);
- Library library = Library(Uri(scheme: "package", path: "foo/bar.dart"),
- classes: [a], procedures: [foo]);
+ isStatic: true,
+ fileUri: uri);
+ Library library =
+ Library(uri, fileUri: uri, classes: [a], procedures: [foo]);
Component component = Component(libraries: [library]);
component.computeCanonicalNames();
return new TestCase<Library>(
@@ -548,13 +550,16 @@
''
' ((method (public "foo") ((static))'
' (sync) () () () () () () (interface "package:foo/bar.dart::A" ())'
- ' _ (ret (null))))'
+ ' _ (ret (null))'
+ ' "package:foo/bar.dart"))'
''
- ' ("A" () () () () _ _ () ())'
+ ' ("A" () "package:foo/bar.dart" () () () _ _ () ())'
''
' ()'
''
- ' ()',
+ ' ()'
+ ''
+ ' "package:foo/bar.dart"',
makeSerializationState: () =>
new SerializationState(new SerializationEnvironment(null)),
makeDeserializationState: () => new DeserializationState(
@@ -579,8 +584,8 @@
if (roundTripInput != testCase.expectation) {
failures.add(''
"* initial serialization for test '${testCase.name}'"
- " gave output '${roundTripInput}'"
- " but expected '${testCase.expectation}'");
+ " gave output:\n ${roundTripInput}\n"
+ " but expected:\n ${testCase.expectation}");
}
TreeNode deserialized =
diff --git a/pkg/kernel/test/type_parser.dart b/pkg/kernel/test/type_parser.dart
index f2fac0e..67a4c05 100644
--- a/pkg/kernel/test/type_parser.dart
+++ b/pkg/kernel/test/type_parser.dart
@@ -326,7 +326,8 @@
final Component component = new Component();
LazyTypeEnvironment() {
- dummyLibrary = new Library(Uri.parse('file://dummy.dart'))
+ Uri uri = Uri.parse('file://dummy.dart');
+ dummyLibrary = new Library(uri, fileUri: uri)
..isNonNullableByDefault = true;
component.libraries.add(dummyLibrary..parent = component);
dummyLibrary.name = 'lib';
@@ -346,7 +347,7 @@
}
Class makeClass(String name) {
- var class_ = new Class(name: name);
+ var class_ = new Class(name: name, fileUri: dummyLibrary.fileUri);
dummyLibrary.addClass(class_);
return class_;
}
diff --git a/pkg/kernel/test/typedef_unalias_test.dart b/pkg/kernel/test/typedef_unalias_test.dart
index 18be629..aded3c3 100644
--- a/pkg/kernel/test/typedef_unalias_test.dart
+++ b/pkg/kernel/test/typedef_unalias_test.dart
@@ -18,7 +18,7 @@
main() {
harnessTest('`Foo` where typedef Foo = C', (TestHarness harness) {
- var foo = new Typedef('Foo', harness.otherLegacyRawType);
+ var foo = new Typedef('Foo', harness.otherLegacyRawType, fileUri: dummyUri);
harness.enclosingLibrary.addTypedef(foo);
var type = new TypedefType(foo, Nullability.legacy);
expect(type.unalias, equals(harness.otherLegacyRawType));
@@ -29,7 +29,8 @@
'Foo',
new InterfaceType(harness.otherClass, Nullability.legacy,
[new TypeParameterType(param, Nullability.legacy)]),
- typeParameters: [param]);
+ typeParameters: [param],
+ fileUri: dummyUri);
harness.enclosingLibrary.addTypedef(foo);
var input =
new TypedefType(foo, Nullability.legacy, [harness.objectLegacyRawType]);
@@ -44,13 +45,15 @@
'Foo',
new InterfaceType(harness.otherClass, Nullability.legacy,
[new TypeParameterType(fooParam, Nullability.legacy)]),
- typeParameters: [fooParam]);
+ typeParameters: [fooParam],
+ fileUri: dummyUri);
var barParam = harness.makeTypeParameter('T');
var bar = new Typedef(
'Bar',
new TypedefType(foo, Nullability.legacy,
[new TypeParameterType(barParam, Nullability.legacy)]),
- typeParameters: [barParam]);
+ typeParameters: [barParam],
+ fileUri: dummyUri);
harness.enclosingLibrary.addTypedef(foo);
harness.enclosingLibrary.addTypedef(bar);
var input =
@@ -66,7 +69,8 @@
'Foo',
new InterfaceType(harness.otherClass, Nullability.legacy,
[new TypeParameterType(param, Nullability.legacy)]),
- typeParameters: [param]);
+ typeParameters: [param],
+ fileUri: dummyUri);
harness.enclosingLibrary.addTypedef(foo);
var input = new TypedefType(foo, Nullability.legacy, [
new TypedefType(foo, Nullability.legacy, [harness.objectLegacyRawType])
diff --git a/pkg/kernel/test/verify_test.dart b/pkg/kernel/test/verify_test.dart
index f8b1718..9803f71 100644
--- a/pkg/kernel/test/verify_test.dart
+++ b/pkg/kernel/test/verify_test.dart
@@ -77,12 +77,13 @@
negative1Test(
'Member redeclared',
(TestHarness test) {
- Field field =
- new Field.mutable(new Name('field'), initializer: new NullLiteral());
+ Field field = new Field.mutable(new Name('field'),
+ initializer: new NullLiteral(), fileUri: dummyUri);
test.addNode(Class(
name: 'Test',
supertype: test.objectClass.asRawSupertype,
- fields: [field, field]));
+ fields: [field, field],
+ fileUri: dummyUri));
return field;
},
(Node node) => "Member '$node' has been declared more than once.",
@@ -104,7 +105,8 @@
test.addNode(Class(
name: 'Test',
supertype: test.objectClass.asRawSupertype,
- typeParameters: [parameter, parameter]));
+ typeParameters: [parameter, parameter],
+ fileUri: dummyUri));
return parameter;
},
(Node node) => "Type parameter '$node' redeclared.",
@@ -117,7 +119,8 @@
new Name('bar'),
ProcedureKind.Method,
new FunctionNode(new ReturnStatement(new NullLiteral()),
- typeParameters: [parameter, parameter])));
+ typeParameters: [parameter, parameter]),
+ fileUri: dummyUri));
return parameter;
},
@@ -156,7 +159,8 @@
ProcedureKind.Method,
new FunctionNode(new ReturnStatement(new TypeLiteral(
new TypeParameterType(node, Nullability.legacy)))),
- isStatic: true));
+ isStatic: true,
+ fileUri: dummyUri));
return [node, test.enclosingClass];
},
@@ -171,7 +175,8 @@
test.addNode(Field.mutable(new Name('field'),
initializer:
new TypeLiteral(new TypeParameterType(node, Nullability.legacy)),
- isStatic: true));
+ isStatic: true,
+ fileUri: dummyUri));
return [node, test.enclosingClass];
},
(Node node, Node parent) =>
@@ -188,13 +193,16 @@
name: 'Test',
supertype: test.objectClass.asRawSupertype,
procedures: [
- new Procedure(new Name('generic'), ProcedureKind.Method, parent),
+ new Procedure(new Name('generic'), ProcedureKind.Method, parent,
+ fileUri: dummyUri),
new Procedure(
new Name('use'),
ProcedureKind.Method,
new FunctionNode(new ReturnStatement(new TypeLiteral(
- new TypeParameterType(parameter, Nullability.legacy)))))
- ]));
+ new TypeParameterType(parameter, Nullability.legacy)))),
+ fileUri: dummyUri)
+ ],
+ fileUri: dummyUri));
return [parameter, parent];
},
@@ -227,7 +235,7 @@
negative1Test(
'Dangling interface type',
(TestHarness test) {
- Class orphan = new Class(name: 'Class');
+ Class orphan = new Class(name: 'Class', fileUri: dummyUri);
test.addNode(
new TypeLiteral(new InterfaceType(orphan, Nullability.legacy)));
return orphan;
@@ -237,7 +245,7 @@
negative1Test(
'Dangling field get',
(TestHarness test) {
- Field orphan = new Field.mutable(new Name('foo'));
+ Field orphan = new Field.mutable(new Name('foo'), fileUri: dummyUri);
test.addNode(new PropertyGet(new NullLiteral(), orphan.name, orphan));
return orphan;
},
@@ -259,7 +267,8 @@
" expected 'Procedure', but found: 'Null'.",
(TestHarness test) {
var procedure = new Procedure(
- new Name('bar'), ProcedureKind.Method, dummyFunctionNode);
+ new Name('bar'), ProcedureKind.Method, dummyFunctionNode,
+ fileUri: dummyUri);
procedure.function = new FunctionNode(new EmptyStatement());
test.addNode(procedure);
},
@@ -272,7 +281,8 @@
ProcedureKind.Method,
new FunctionNode(new EmptyStatement(),
positionalParameters: [new VariableDeclaration('p')]),
- isStatic: true);
+ isStatic: true,
+ fileUri: dummyUri);
test.enclosingClass.addProcedure(method);
test.addNode(
StaticInvocation(method, new Arguments([new NullLiteral()])));
@@ -283,7 +293,7 @@
(TestHarness test) {
var method = new Procedure(new Name('bar'), ProcedureKind.Method,
new FunctionNode(new EmptyStatement()),
- isStatic: true);
+ isStatic: true, fileUri: dummyUri);
test.enclosingClass.addProcedure(method);
test.addNode(
StaticInvocation(method, new Arguments([new NullLiteral()])));
@@ -300,7 +310,8 @@
ProcedureKind.Method,
new FunctionNode(new EmptyStatement(),
positionalParameters: [new VariableDeclaration('p')]),
- isStatic: true);
+ isStatic: true,
+ fileUri: dummyUri);
test.enclosingClass.addProcedure(method);
test.addNode(StaticInvocation(method, new Arguments.empty()));
return method;
@@ -312,7 +323,7 @@
(TestHarness test) {
var method = new Procedure(new Name('bar'), ProcedureKind.Method,
new FunctionNode(new EmptyStatement()),
- isStatic: true);
+ isStatic: true, fileUri: dummyUri);
test.enclosingClass.addProcedure(method);
test.addNode(StaticInvocation(
method,
@@ -331,7 +342,8 @@
ProcedureKind.Method,
new FunctionNode(new EmptyStatement(),
typeParameters: [test.makeTypeParameter()]),
- isStatic: true);
+ isStatic: true,
+ fileUri: dummyUri);
test.enclosingClass.addProcedure(method);
test.addNode(StaticInvocation(method, new Arguments.empty()));
return method;
@@ -343,7 +355,7 @@
'ConstructorInvocation with missing type argument',
(TestHarness test) {
var constructor = new Constructor(new FunctionNode(new EmptyStatement()),
- name: new Name('foo'));
+ name: new Name('foo'), fileUri: dummyUri);
test.enclosingClass.addConstructor(constructor);
test.addNode(ConstructorInvocation(constructor, new Arguments.empty()));
return constructor;
@@ -358,7 +370,8 @@
var typedef_ = new Typedef(
'Foo',
new FunctionType(
- [test.otherLegacyRawType], const VoidType(), Nullability.legacy));
+ [test.otherLegacyRawType], const VoidType(), Nullability.legacy),
+ fileUri: dummyUri);
test.addNode(typedef_);
},
);
@@ -368,15 +381,16 @@
var typedef_ = new Typedef(
'Foo',
new InterfaceType(
- test.otherClass, Nullability.legacy, [const DynamicType()]));
+ test.otherClass, Nullability.legacy, [const DynamicType()]),
+ fileUri: dummyUri);
test.addNode(typedef_);
},
);
positiveTest(
'Valid typedefs Foo = Bar, Bar = C',
(TestHarness test) {
- var foo = new Typedef('Foo', null);
- var bar = new Typedef('Bar', null);
+ var foo = new Typedef('Foo', null, fileUri: dummyUri);
+ var bar = new Typedef('Bar', null, fileUri: dummyUri);
foo.type = new TypedefType(bar, Nullability.legacy);
bar.type = test.otherLegacyRawType;
test.enclosingLibrary.addTypedef(foo);
@@ -386,8 +400,8 @@
positiveTest(
'Valid typedefs Foo = C<Bar>, Bar = C',
(TestHarness test) {
- var foo = new Typedef('Foo', null);
- var bar = new Typedef('Bar', null);
+ var foo = new Typedef('Foo', null, fileUri: dummyUri);
+ var bar = new Typedef('Bar', null, fileUri: dummyUri);
foo.type = new InterfaceType(test.otherClass, Nullability.legacy,
[new TypedefType(bar, Nullability.legacy)]);
bar.type = test.otherLegacyRawType;
@@ -401,9 +415,12 @@
var typedef_ = new Typedef(
'Foo',
new FunctionType(
- [test.otherLegacyRawType], const VoidType(), Nullability.legacy));
+ [test.otherLegacyRawType], const VoidType(), Nullability.legacy),
+ fileUri: dummyUri);
var field = new Field.mutable(new Name('field'),
- type: new TypedefType(typedef_, Nullability.legacy), isStatic: true);
+ type: new TypedefType(typedef_, Nullability.legacy),
+ isStatic: true,
+ fileUri: dummyUri);
test.enclosingLibrary.addTypedef(typedef_);
test.enclosingLibrary.addField(field);
},
@@ -411,7 +428,7 @@
negative1Test(
'Invalid typedef Foo = Foo',
(TestHarness test) {
- var typedef_ = new Typedef('Foo', null);
+ var typedef_ = new Typedef('Foo', null, fileUri: dummyUri);
typedef_.type = new TypedefType(typedef_, Nullability.legacy);
test.addNode(typedef_);
return typedef_;
@@ -421,7 +438,7 @@
negative1Test(
'Invalid typedef Foo = `(Foo) => void`',
(TestHarness test) {
- var typedef_ = new Typedef('Foo', null);
+ var typedef_ = new Typedef('Foo', null, fileUri: dummyUri);
typedef_.type = new FunctionType(
[new TypedefType(typedef_, Nullability.legacy)],
const VoidType(),
@@ -434,7 +451,7 @@
negative1Test(
'Invalid typedef Foo = `() => Foo`',
(TestHarness test) {
- var typedef_ = new Typedef('Foo', null);
+ var typedef_ = new Typedef('Foo', null, fileUri: dummyUri);
typedef_.type = new FunctionType([],
new TypedefType(typedef_, Nullability.legacy), Nullability.legacy);
test.addNode(typedef_);
@@ -445,7 +462,7 @@
negative1Test(
'Invalid typedef Foo = C<Foo>',
(TestHarness test) {
- var typedef_ = new Typedef('Foo', null);
+ var typedef_ = new Typedef('Foo', null, fileUri: dummyUri);
typedef_.type = new InterfaceType(test.otherClass, Nullability.legacy,
[new TypedefType(typedef_, Nullability.legacy)]);
test.addNode(typedef_);
@@ -456,8 +473,8 @@
negative1Test(
'Invalid typedefs Foo = Bar, Bar = Foo',
(TestHarness test) {
- var foo = new Typedef('Foo', null);
- var bar = new Typedef('Bar', null);
+ var foo = new Typedef('Foo', null, fileUri: dummyUri);
+ var bar = new Typedef('Bar', null, fileUri: dummyUri);
foo.type = new TypedefType(bar, Nullability.legacy);
bar.type = new TypedefType(foo, Nullability.legacy);
test.enclosingLibrary.addTypedef(foo);
@@ -469,8 +486,8 @@
negative1Test(
'Invalid typedefs Foo = Bar, Bar = C<Foo>',
(TestHarness test) {
- var foo = new Typedef('Foo', null);
- var bar = new Typedef('Bar', null);
+ var foo = new Typedef('Foo', null, fileUri: dummyUri);
+ var bar = new Typedef('Bar', null, fileUri: dummyUri);
foo.type = new TypedefType(bar, Nullability.legacy);
bar.type = new InterfaceType(test.otherClass, Nullability.legacy,
[new TypedefType(foo, Nullability.legacy)]);
@@ -483,8 +500,8 @@
negative1Test(
'Invalid typedefs Foo = C<Bar>, Bar = C<Foo>',
(TestHarness test) {
- var foo = new Typedef('Foo', null);
- var bar = new Typedef('Bar', null);
+ var foo = new Typedef('Foo', null, fileUri: dummyUri);
+ var bar = new Typedef('Bar', null, fileUri: dummyUri);
foo.type = new InterfaceType(test.otherClass, Nullability.legacy,
[new TypedefType(bar, Nullability.legacy)]);
bar.type = new InterfaceType(test.otherClass, Nullability.legacy,
@@ -498,11 +515,12 @@
positiveTest(
'Valid long typedefs C20 = C19 = ... = C1 = C0 = dynamic',
(TestHarness test) {
- var typedef_ = new Typedef('C0', const DynamicType());
+ var typedef_ = new Typedef('C0', const DynamicType(), fileUri: dummyUri);
test.enclosingLibrary.addTypedef(typedef_);
for (int i = 1; i < 20; ++i) {
- typedef_ =
- new Typedef('C$i', new TypedefType(typedef_, Nullability.legacy));
+ typedef_ = new Typedef(
+ 'C$i', new TypedefType(typedef_, Nullability.legacy),
+ fileUri: dummyUri);
test.enclosingLibrary.addTypedef(typedef_);
}
},
@@ -510,13 +528,14 @@
negative1Test(
'Invalid long typedefs C20 = C19 = ... = C1 = C0 = C20',
(TestHarness test) {
- Typedef firstTypedef = new Typedef('C0', null);
+ Typedef firstTypedef = new Typedef('C0', null, fileUri: dummyUri);
Typedef typedef_ = firstTypedef;
test.enclosingLibrary.addTypedef(typedef_);
var first = typedef_;
for (int i = 1; i < 20; ++i) {
- typedef_ =
- new Typedef('C$i', new TypedefType(typedef_, Nullability.legacy));
+ typedef_ = new Typedef(
+ 'C$i', new TypedefType(typedef_, Nullability.legacy),
+ fileUri: dummyUri);
test.enclosingLibrary.addTypedef(typedef_);
}
first.type = new TypedefType(typedef_, Nullability.legacy);
@@ -532,7 +551,8 @@
'Foo',
new InterfaceType(test.otherClass, Nullability.legacy,
[new TypeParameterType(param, Nullability.legacy)]),
- typeParameters: [param]);
+ typeParameters: [param],
+ fileUri: dummyUri);
test.addNode(foo);
},
);
@@ -546,7 +566,8 @@
'Foo',
new InterfaceType(test.otherClass, Nullability.legacy,
[new TypeParameterType(param, Nullability.legacy)]),
- typeParameters: [param]);
+ typeParameters: [param],
+ fileUri: dummyUri);
test.addNode(foo);
},
);
@@ -554,8 +575,8 @@
'Valid typedef Foo<T> = dynamic, Bar<T extends Foo<T>> = C<T>',
(TestHarness test) {
var fooParam = test.makeTypeParameter('T');
- var foo =
- new Typedef('Foo', const DynamicType(), typeParameters: [fooParam]);
+ var foo = new Typedef('Foo', const DynamicType(),
+ typeParameters: [fooParam], fileUri: dummyUri);
var barParam = new TypeParameter('T', null);
barParam.bound = new TypedefType(foo, Nullability.legacy,
[new TypeParameterType(barParam, Nullability.legacy)]);
@@ -563,7 +584,8 @@
'Bar',
new InterfaceType(test.otherClass, Nullability.legacy,
[new TypeParameterType(barParam, Nullability.legacy)]),
- typeParameters: [barParam]);
+ typeParameters: [barParam],
+ fileUri: dummyUri);
test.enclosingLibrary.addTypedef(foo);
test.enclosingLibrary.addTypedef(bar);
},
@@ -572,8 +594,8 @@
'Invalid typedefs Foo<T extends Bar<T>>, Bar<T extends Foo<T>>',
(TestHarness test) {
var fooParam = test.makeTypeParameter('T');
- var foo =
- new Typedef('Foo', const DynamicType(), typeParameters: [fooParam]);
+ var foo = new Typedef('Foo', const DynamicType(),
+ typeParameters: [fooParam], fileUri: dummyUri);
var barParam = new TypeParameter('T', null);
barParam.bound = new TypedefType(foo, Nullability.legacy,
[new TypeParameterType(barParam, Nullability.legacy)]);
@@ -581,7 +603,8 @@
'Bar',
new InterfaceType(test.otherClass, Nullability.legacy,
[new TypeParameterType(barParam, Nullability.legacy)]),
- typeParameters: [barParam]);
+ typeParameters: [barParam],
+ fileUri: dummyUri);
fooParam.bound = new TypedefType(bar, Nullability.legacy,
[new TypeParameterType(fooParam, Nullability.legacy)]);
test.enclosingLibrary.addTypedef(foo);
@@ -598,7 +621,8 @@
'Foo',
new InterfaceType(test.otherClass, Nullability.legacy,
[new TypeParameterType(param, Nullability.legacy)]),
- typeParameters: [param]);
+ typeParameters: [param],
+ fileUri: dummyUri);
param.bound =
new TypedefType(foo, Nullability.legacy, [const DynamicType()]);
test.addNode(foo);
@@ -610,11 +634,11 @@
'Typedef arity error',
(TestHarness test) {
var param = test.makeTypeParameter('T');
- var foo =
- new Typedef('Foo', test.otherLegacyRawType, typeParameters: [param]);
+ var foo = new Typedef('Foo', test.otherLegacyRawType,
+ typeParameters: [param], fileUri: dummyUri);
var typedefType = new TypedefType(foo, Nullability.legacy, []);
var field = new Field.mutable(new Name('field'),
- type: typedefType, isStatic: true);
+ type: typedefType, isStatic: true, fileUri: dummyUri);
test.enclosingLibrary.addTypedef(foo);
test.enclosingLibrary.addField(field);
return typedefType;
@@ -626,9 +650,12 @@
negative1Test(
'Dangling typedef reference',
(TestHarness test) {
- var foo = new Typedef('Foo', test.otherLegacyRawType, typeParameters: []);
+ var foo = new Typedef('Foo', test.otherLegacyRawType,
+ typeParameters: [], fileUri: dummyUri);
var field = new Field.mutable(new Name('field'),
- type: new TypedefType(foo, Nullability.legacy, []), isStatic: true);
+ type: new TypedefType(foo, Nullability.legacy, []),
+ isStatic: true,
+ fileUri: dummyUri);
test.enclosingLibrary.addField(field);
return foo;
},
@@ -637,7 +664,7 @@
negative1Test(
'Non-static top-level field',
(TestHarness test) {
- var field = new Field.mutable(new Name('field'));
+ var field = new Field.mutable(new Name('field'), fileUri: dummyUri);
test.enclosingLibrary.addField(field);
return null;
},
@@ -739,31 +766,36 @@
void setupComponent() {
component = new Component();
- stubLibrary = new Library(Uri.parse('dart:core'));
+ Uri dartCoreUri = Uri.parse('dart:core');
+ stubLibrary = new Library(dartCoreUri, fileUri: dartCoreUri);
component.libraries.add(stubLibrary..parent = component);
stubLibrary.name = 'dart.core';
- objectClass = new Class(name: 'Object');
+ objectClass = new Class(name: 'Object', fileUri: dartCoreUri);
objectLegacyRawType =
new InterfaceType(objectClass, Nullability.legacy, const <DartType>[]);
stubLibrary.addClass(objectClass);
- enclosingLibrary = new Library(Uri.parse('file://test.dart'));
+ Uri testUri = Uri.parse('file://test.dart');
+ enclosingLibrary = new Library(testUri, fileUri: testUri);
component.libraries.add(enclosingLibrary..parent = component);
enclosingLibrary.name = 'test_lib';
classTypeParameter = makeTypeParameter('T');
enclosingClass = new Class(
name: 'TestClass',
typeParameters: [classTypeParameter],
- supertype: objectClass.asRawSupertype);
+ supertype: objectClass.asRawSupertype,
+ fileUri: testUri);
enclosingLegacyRawType = new InterfaceType(enclosingClass,
Nullability.legacy, const <DartType>[const DynamicType()]);
enclosingLibrary.addClass(enclosingClass);
enclosingMember = new Procedure(new Name('test'), ProcedureKind.Method,
- new FunctionNode(new EmptyStatement()));
+ new FunctionNode(new EmptyStatement()),
+ fileUri: dummyUri);
enclosingClass.addProcedure(enclosingMember);
otherClass = new Class(
name: 'OtherClass',
typeParameters: [makeTypeParameter('OtherT')],
- supertype: objectClass.asRawSupertype);
+ supertype: objectClass.asRawSupertype,
+ fileUri: testUri);
otherLegacyRawType = new InterfaceType(
otherClass, Nullability.legacy, const <DartType>[const DynamicType()]);
enclosingLibrary.addClass(otherClass);
diff --git a/pkg/vm/lib/transformations/type_flow/analysis.dart b/pkg/vm/lib/transformations/type_flow/analysis.dart
index b22fa57..502fe14 100644
--- a/pkg/vm/lib/transformations/type_flow/analysis.dart
+++ b/pkg/vm/lib/transformations/type_flow/analysis.dart
@@ -374,7 +374,8 @@
/// Marker for noSuchMethod() invocation in the map of invocation targets.
static final Member kNoSuchMethodMarker = new Procedure(
- new Name('noSuchMethod&&'), ProcedureKind.Method, new FunctionNode(null));
+ new Name('noSuchMethod&&'), ProcedureKind.Method, new FunctionNode(null),
+ fileUri: dummyUri);
_DispatchableInvocation(Selector selector, Args<Type> args)
: super(selector, args) {
diff --git a/pkg/vm/test/transformations/type_flow/types_test.dart b/pkg/vm/test/transformations/type_flow/types_test.dart
index b848dc8..0945917 100644
--- a/pkg/vm/test/transformations/type_flow/types_test.dart
+++ b/pkg/vm/test/transformations/type_flow/types_test.dart
@@ -54,9 +54,11 @@
final CoreTypes coreTypes = new CoreTypes(component);
test('types-builder', () {
- final Class c1 = new Class(name: 'C1');
- final Class c2 =
- new Class(name: 'C2', typeParameters: [new TypeParameter('E')]);
+ final Class c1 = new Class(name: 'C1', fileUri: dummyUri);
+ final Class c2 = new Class(
+ name: 'C2',
+ typeParameters: [new TypeParameter('E')],
+ fileUri: dummyUri);
final TypesBuilder tb = new TestTypeHierarchy(coreTypes, {}, {});
final tfc1 = tb.getTFClass(c1);
@@ -100,10 +102,10 @@
test('union-intersection', () {
// T1 <: T3, T2 <: T3
- final c1 = new Class(name: 'T1');
- final c2 = new Class(name: 'T2');
- final c3 = new Class(name: 'T3');
- final c4 = new Class(name: 'T4');
+ final c1 = new Class(name: 'T1', fileUri: dummyUri);
+ final c2 = new Class(name: 'T2', fileUri: dummyUri);
+ final c3 = new Class(name: 'T3', fileUri: dummyUri);
+ final c4 = new Class(name: 'T4', fileUri: dummyUri);
final tfc1 = new TFClass(1, c1);
final tfc2 = new TFClass(2, c2);
@@ -291,9 +293,9 @@
});
test('hashcode-equals', () {
- final c1 = new Class(name: 'C1');
- final c2 = new Class(name: 'C2');
- final c3 = new Class(name: 'C3');
+ final c1 = new Class(name: 'C1', fileUri: dummyUri);
+ final c2 = new Class(name: 'C2', fileUri: dummyUri);
+ final c3 = new Class(name: 'C3', fileUri: dummyUri);
final tfc1 = new TFClass(1, c1);
final tfc2 = new TFClass(2, c2);
diff --git a/runtime/vm/compiler/compiler_sources.gni b/runtime/vm/compiler/compiler_sources.gni
index 9135f50..1b237e9 100644
--- a/runtime/vm/compiler/compiler_sources.gni
+++ b/runtime/vm/compiler/compiler_sources.gni
@@ -175,6 +175,7 @@
"backend/typed_data_aot_test.cc",
"backend/yield_position_test.cc",
"cha_test.cc",
+ "relocation_test.cc",
"ffi/native_type_vm_test.cc",
"frontend/kernel_binary_flowgraph_test.cc",
"write_barrier_elimination_test.cc",
diff --git a/runtime/vm/compiler/relocation.cc b/runtime/vm/compiler/relocation.cc
index ff5ea61..e2f44aa 100644
--- a/runtime/vm/compiler/relocation.cc
+++ b/runtime/vm/compiler/relocation.cc
@@ -20,6 +20,47 @@
false,
"Generate always trampolines (for testing purposes).");
+DEFINE_FLAG(int,
+ lower_tail_pc_relative_call_distance,
+ -1,
+ "Lower tail call distance.");
+DEFINE_FLAG(int,
+ upper_tail_pc_relative_call_distance,
+ -1,
+ "Upper tail call distance.");
+DEFINE_FLAG(int, lower_pc_relative_call_distance, -1, "Lower call distance.");
+DEFINE_FLAG(int, upper_pc_relative_call_distance, -1, "Upper call distance.");
+
+struct TailCallDistanceLimits {
+ static intptr_t Lower() {
+ if (FLAG_lower_tail_pc_relative_call_distance != -1) {
+ return FLAG_lower_tail_pc_relative_call_distance;
+ }
+ return PcRelativeTailCallPattern::kLowerCallingRange;
+ }
+ static intptr_t Upper() {
+ if (FLAG_upper_tail_pc_relative_call_distance != -1) {
+ return FLAG_upper_tail_pc_relative_call_distance;
+ }
+ return PcRelativeTailCallPattern::kUpperCallingRange;
+ }
+};
+
+struct CallDistanceLimits {
+ static intptr_t Lower() {
+ if (FLAG_lower_pc_relative_call_distance != -1) {
+ return FLAG_lower_pc_relative_call_distance;
+ }
+ return PcRelativeCallPattern::kLowerCallingRange;
+ }
+ static intptr_t Upper() {
+ if (FLAG_upper_pc_relative_call_distance != -1) {
+ return FLAG_upper_pc_relative_call_distance;
+ }
+ return PcRelativeCallPattern::kUpperCallingRange;
+ }
+};
+
const intptr_t kTrampolineSize =
Utils::RoundUp(PcRelativeTrampolineJumpPattern::kLengthInBytes,
compiler::target::Instructions::kBarePayloadAlignment);
@@ -46,7 +87,7 @@
// * the maximum number of calls
// * the maximum offset into a target instruction
//
- FindInstructionAndCallLimits();
+ FindLargestInstruction();
// Emit all instructions and do relocations on the way.
for (intptr_t i = 0; i < code_objects_->length(); ++i) {
@@ -65,7 +106,8 @@
// If we have forward/backwards calls which are almost out-of-range, we'll
// create trampolines now.
- BuildTrampolinesForAlmostOutOfRangeCalls();
+ BuildTrampolinesForAlmostOutOfRangeCalls(
+ /*force=*/(i == (code_objects_->length() - 1)));
}
// We're guaranteed to have all calls resolved, since
@@ -101,7 +143,7 @@
// however we might need it to write information into V8 snapshot profile.
}
-void CodeRelocator::FindInstructionAndCallLimits() {
+void CodeRelocator::FindLargestInstruction() {
auto zone = thread_->zone();
auto& current_caller = Code::Handle(zone);
auto& call_targets = Array::Handle(zone);
@@ -122,48 +164,10 @@
kind_type_and_offset_ = call.Get<Code::kSCallTableKindAndOffset>();
const auto kind =
Code::KindField::decode(kind_type_and_offset_.Value());
- const auto return_pc_offset =
- Code::OffsetField::decode(kind_type_and_offset_.Value());
- const auto call_entry_point =
- Code::EntryPointField::decode(kind_type_and_offset_.Value());
-
if (kind == Code::kCallViaCode) {
continue;
}
-
- destination_ = GetTarget(call);
num_calls++;
-
- // A call site can decide to jump not to the beginning of a function but
- // rather jump into it at a certain (positive) offset.
- int32_t offset_into_target = 0;
- if (kind == Code::kPcRelativeCall || kind == Code::kPcRelativeTTSCall) {
- const intptr_t call_instruction_offset =
- return_pc_offset - PcRelativeCallPattern::kLengthInBytes;
- PcRelativeCallPattern call(current_caller.PayloadStart() +
- call_instruction_offset);
- ASSERT(call.IsValid());
- offset_into_target = call.distance();
- } else {
- ASSERT(kind == Code::kPcRelativeTailCall);
- const intptr_t call_instruction_offset =
- return_pc_offset - PcRelativeTailCallPattern::kLengthInBytes;
- PcRelativeTailCallPattern call(current_caller.PayloadStart() +
- call_instruction_offset);
- ASSERT(call.IsValid());
- offset_into_target = call.distance();
- }
-
- const uword destination_payload = destination_.PayloadStart();
- const uword entry_point = call_entry_point == Code::kUncheckedEntry
- ? destination_.UncheckedEntryPoint()
- : destination_.EntryPoint();
-
- offset_into_target += (entry_point - destination_payload);
-
- if (offset_into_target > max_offset_into_target_) {
- max_offset_into_target_ = offset_into_target;
- }
}
if (num_calls > max_calls_) {
@@ -323,8 +327,11 @@
auto map_entry = text_offsets_.Lookup(callee);
if (map_entry == nullptr) return false;
- ResolveCall(unresolved_call);
- return true;
+ if (IsTargetInRangeFor(unresolved_call, map_entry->value)) {
+ ResolveCall(unresolved_call);
+ return true;
+ }
+ return false;
}
void CodeRelocator::ResolveUnresolvedCallsTargeting(
@@ -411,11 +418,11 @@
const auto forward_distance =
target_text_offset - unresolved_call->text_offset;
if (unresolved_call->is_tail_call) {
- return PcRelativeTailCallPattern::kLowerCallingRange < forward_distance &&
- forward_distance < PcRelativeTailCallPattern::kUpperCallingRange;
+ return TailCallDistanceLimits::Lower() < forward_distance &&
+ forward_distance < TailCallDistanceLimits::Upper();
} else {
- return PcRelativeCallPattern::kLowerCallingRange < forward_distance &&
- forward_distance < PcRelativeCallPattern::kUpperCallingRange;
+ return CallDistanceLimits::Lower() < forward_distance &&
+ forward_distance < CallDistanceLimits::Upper();
}
}
@@ -471,7 +478,7 @@
return destination_.ptr();
}
-void CodeRelocator::BuildTrampolinesForAlmostOutOfRangeCalls() {
+void CodeRelocator::BuildTrampolinesForAlmostOutOfRangeCalls(bool force) {
while (!all_unresolved_calls_.IsEmpty()) {
UnresolvedCall* unresolved_call = all_unresolved_calls_.First();
@@ -484,7 +491,7 @@
kTrampolineSize *
(unresolved_calls_by_destination_.Length() + max_calls_);
if (IsTargetInRangeFor(unresolved_call, future_boundary) &&
- !FLAG_always_generate_trampolines_for_testing) {
+ !FLAG_always_generate_trampolines_for_testing && !force) {
break;
}
diff --git a/runtime/vm/compiler/relocation.h b/runtime/vm/compiler/relocation.h
index 948dffc..bd9cc15 100644
--- a/runtime/vm/compiler/relocation.h
+++ b/runtime/vm/compiler/relocation.h
@@ -161,7 +161,7 @@
void Relocate(bool is_vm_isolate);
- void FindInstructionAndCallLimits();
+ void FindLargestInstruction();
bool AddInstructionsToText(CodePtr code);
void ScanCallTargets(const Code& code,
@@ -183,7 +183,7 @@
intptr_t destination_text);
void ResolveTrampoline(UnresolvedTrampoline* unresolved_trampoline);
- void BuildTrampolinesForAlmostOutOfRangeCalls();
+ void BuildTrampolinesForAlmostOutOfRangeCalls(bool force);
intptr_t FindDestinationInText(const InstructionsPtr destination,
intptr_t offset_into_target);
@@ -207,7 +207,6 @@
intptr_t max_instructions_size_ = 0;
// The maximum number of pc-relative calls in an instructions object.
intptr_t max_calls_ = 0;
- intptr_t max_offset_into_target_ = 0;
// Data structures used for relocation.
intptr_t next_text_offset_ = 0;
diff --git a/runtime/vm/compiler/relocation_test.cc b/runtime/vm/compiler/relocation_test.cc
new file mode 100644
index 0000000..9e101cb
--- /dev/null
+++ b/runtime/vm/compiler/relocation_test.cc
@@ -0,0 +1,406 @@
+// 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.
+
+#include "platform/assert.h"
+
+#include "vm/allocation.h"
+#include "vm/code_patcher.h"
+#include "vm/compiler/assembler/assembler.h"
+#include "vm/compiler/relocation.h"
+#include "vm/instructions.h"
+#include "vm/longjump.h"
+#include "vm/unit_test.h"
+
+#define __ assembler->
+
+namespace dart {
+
+#if defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_IA32)
+
+DECLARE_FLAG(bool, dual_map_code);
+DECLARE_FLAG(int, lower_pc_relative_call_distance);
+DECLARE_FLAG(int, upper_pc_relative_call_distance);
+
+struct RelocatorTestHelper {
+ explicit RelocatorTestHelper(Thread* thread)
+ : thread(thread),
+ locker(thread, thread->isolate_group()->program_lock()),
+ safepoint_and_growth_scope(thread) {
+ // So the relocator uses the correct instruction size layout.
+ FLAG_precompiled_mode = true;
+ FLAG_use_bare_instructions = true;
+
+ FLAG_lower_pc_relative_call_distance = -128;
+ FLAG_upper_pc_relative_call_distance = 128;
+ }
+ ~RelocatorTestHelper() {
+ FLAG_use_bare_instructions = false;
+ FLAG_precompiled_mode = false;
+ }
+
+ void CreateInstructions(std::initializer_list<intptr_t> sizes) {
+ for (auto size : sizes) {
+ codes.Add(&Code::Handle(AllocationInstruction(size)));
+ }
+ }
+
+ CodePtr AllocationInstruction(uintptr_t size) {
+ const auto& instructions = Instructions::Handle(
+ Instructions::New(size, /*has_monomorphic=*/false));
+
+ uword addr = instructions.PayloadStart();
+ for (uintptr_t i = 0; i < (size / 4); ++i) {
+ *reinterpret_cast<uint32_t*>(addr + 4 * i) =
+ static_cast<uint32_t>(kBreakInstructionFiller);
+ }
+
+ const auto& code = Code::Handle(Code::New(0));
+ code.SetActiveInstructions(instructions, 0);
+ code.set_instructions(instructions);
+ return code.ptr();
+ }
+
+ void EmitPcRelativeCallFunction(intptr_t idx, intptr_t to_idx) {
+ const Code& code = *codes[idx];
+ const Code& target = *codes[to_idx];
+
+ EmitCodeFor(code, [&](compiler::Assembler* assembler) {
+#if defined(TARGET_ARCH_ARM64)
+ __ SetupDartSP();
+ __ EnterFrame(0);
+#elif defined(TARGET_ARCH_ARM)
+ SPILLS_RETURN_ADDRESS_FROM_LR_TO_REGISTER(
+ __ EnterFrame((1 << LR), 0));
+#endif
+ __ GenerateUnRelocatedPcRelativeCall();
+ AddPcRelativeCallTargetAt(__ CodeSize(), code, target);
+#if defined(TARGET_ARCH_ARM64)
+ __ LeaveFrame();
+#elif defined(TARGET_ARCH_ARM)
+ RESTORES_RETURN_ADDRESS_FROM_REGISTER_TO_LR(
+ __ LeaveFrame((1 << LR)));
+#endif
+ __ Ret();
+ });
+ }
+
+ void EmitReturn42Function(intptr_t idx) {
+ const Code& code = *codes[idx];
+ EmitCodeFor(code, [&](compiler::Assembler* assembler) {
+#if defined(TARGET_ARCH_X64)
+ __ LoadImmediate(RAX, 42);
+#elif defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_ARM64)
+ __ LoadImmediate(R0, 42);
+#endif
+ __ Ret();
+ });
+ }
+
+ void EmitCodeFor(const Code& code,
+ std::function<void(compiler::Assembler* assembler)> fun) {
+ const auto& inst = Instructions::Handle(code.instructions());
+
+ compiler::Assembler assembler(nullptr);
+ fun(&assembler);
+
+ const uword addr = inst.PayloadStart();
+ memmove(reinterpret_cast<void*>(addr),
+ reinterpret_cast<void*>(assembler.CodeAddress(0)),
+ assembler.CodeSize());
+
+ if (FLAG_write_protect_code && FLAG_dual_map_code) {
+ auto& instructions = Instructions::Handle(code.instructions());
+ instructions ^= OldPage::ToExecutable(instructions.ptr());
+ code.set_instructions(instructions);
+ }
+ }
+
+ void AddPcRelativeCallTargetAt(intptr_t offset,
+ const Code& code,
+ const Code& target) {
+ const auto& kind_and_offset = Smi::Handle(
+ Smi::New(Code::KindField::encode(Code::kPcRelativeCall) |
+ Code::EntryPointField::encode(Code::kDefaultEntry) |
+ Code::OffsetField::encode(offset)));
+ AddCall(code, target, kind_and_offset);
+ }
+
+ void AddCall(const Code& code,
+ const Code& target,
+ const Smi& kind_and_offset) {
+ auto& call_targets = Array::Handle(code.static_calls_target_table());
+ if (call_targets.IsNull()) {
+ call_targets = Array::New(Code::kSCallTableEntryLength);
+ } else {
+ call_targets = Array::Grow(
+ call_targets, call_targets.Length() + Code::kSCallTableEntryLength);
+ }
+
+ StaticCallsTable table(call_targets);
+ auto entry = table[table.Length() - 1];
+ entry.Set<Code::kSCallTableKindAndOffset>(kind_and_offset);
+ entry.Set<Code::kSCallTableCodeOrTypeTarget>(target);
+ entry.Set<Code::kSCallTableFunctionTarget>(
+ Function::Handle(Function::null()));
+ code.set_static_calls_target_table(call_targets);
+ }
+
+ void BuildImageAndRunTest(
+ std::function<void(const GrowableArray<ImageWriterCommand>&, uword*)>
+ fun) {
+ auto& image = Instructions::Handle();
+ uword entrypoint = 0;
+ {
+ GrowableArray<CodePtr> raw_codes;
+ for (auto code : codes) {
+ raw_codes.Add(code->ptr());
+ }
+
+ GrowableArray<ImageWriterCommand> commands;
+ CodeRelocator::Relocate(thread, &raw_codes, &commands,
+ /*is_vm_isolate=*/false);
+
+ uword expected_offset = 0;
+ fun(commands, &expected_offset);
+
+ image = BuildImage(&commands);
+ entrypoint = image.EntryPoint() + expected_offset;
+
+ for (intptr_t i = 0; i < commands.length(); ++i) {
+ if (commands[i].op == ImageWriterCommand::InsertBytesOfTrampoline) {
+ delete[] commands[i].insert_trampoline_bytes.buffer;
+ commands[i].insert_trampoline_bytes.buffer = nullptr;
+ }
+ }
+ }
+ typedef intptr_t (*Fun)() DART_UNUSED;
+#if defined(TARGET_ARCH_X64)
+ EXPECT_EQ(42, reinterpret_cast<Fun>(entrypoint)());
+#elif defined(TARGET_ARCH_ARM)
+ EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Fun, entrypoint));
+#elif defined(TARGET_ARCH_ARM64)
+ EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Fun, entrypoint));
+#endif
+ }
+
+ InstructionsPtr BuildImage(GrowableArray<ImageWriterCommand>* commands) {
+ intptr_t size = 0;
+ for (intptr_t i = 0; i < commands->length(); ++i) {
+ switch ((*commands)[i].op) {
+ case ImageWriterCommand::InsertBytesOfTrampoline:
+ size += (*commands)[i].insert_trampoline_bytes.buffer_length;
+ break;
+ case ImageWriterCommand::InsertInstructionOfCode:
+ size += ImageWriter::SizeInSnapshot(Code::InstructionsOf(
+ (*commands)[i].insert_instruction_of_code.code));
+ break;
+ }
+ }
+
+ auto& instructions = Instructions::Handle(
+ Instructions::New(size, /*has_monomorphic=*/false));
+ {
+ uword addr = instructions.PayloadStart();
+ for (intptr_t i = 0; i < commands->length(); ++i) {
+ switch ((*commands)[i].op) {
+ case ImageWriterCommand::InsertBytesOfTrampoline: {
+ const auto entry = (*commands)[i].insert_trampoline_bytes;
+ const auto current_size = entry.buffer_length;
+ memmove(reinterpret_cast<void*>(addr), entry.buffer, current_size);
+ addr += current_size;
+ break;
+ }
+ case ImageWriterCommand::InsertInstructionOfCode: {
+ const auto entry = (*commands)[i].insert_instruction_of_code;
+ const auto current_size =
+ ImageWriter::SizeInSnapshot(Code::InstructionsOf(entry.code));
+ const auto alias_offset =
+ OldPage::Of(Code::InstructionsOf(entry.code))->AliasOffset();
+ memmove(
+ reinterpret_cast<void*>(addr),
+ reinterpret_cast<void*>(Instructions::PayloadStart(
+ Code::InstructionsOf(entry.code)) -
+ alias_offset),
+ current_size);
+ addr += current_size;
+ break;
+ }
+ }
+ }
+
+ if (FLAG_write_protect_code) {
+ const uword address = UntaggedObject::ToAddr(instructions.ptr());
+ const auto size = instructions.ptr()->untag()->HeapSize();
+ instructions =
+ Instructions::RawCast(OldPage::ToExecutable(instructions.ptr()));
+
+ const auto prot = FLAG_dual_map_code ? VirtualMemory::kReadOnly
+ : VirtualMemory::kReadExecute;
+ VirtualMemory::Protect(reinterpret_cast<void*>(address), size, prot);
+ }
+ CPU::FlushICache(instructions.PayloadStart(), instructions.Size());
+ }
+ return instructions.ptr();
+ }
+
+ Thread* thread;
+ SafepointWriteRwLocker locker;
+ ForceGrowthSafepointOperationScope safepoint_and_growth_scope;
+ GrowableArray<const Code*> codes;
+};
+
+ISOLATE_UNIT_TEST_CASE(CodeRelocator_DirectForwardCall) {
+ RelocatorTestHelper helper(thread);
+ helper.CreateInstructions({32, 36, 32});
+ helper.EmitPcRelativeCallFunction(0, 2);
+ helper.EmitReturn42Function(2);
+ helper.BuildImageAndRunTest(
+ [&](const GrowableArray<ImageWriterCommand>& commands,
+ uword* entry_point) {
+ EXPECT_EQ(3, commands.length());
+
+ // This makes an in-range forward call.
+ EXPECT_EQ(ImageWriterCommand::InsertInstructionOfCode, commands[0].op);
+ EXPECT_EQ(ImageWriterCommand::InsertInstructionOfCode, commands[1].op);
+ // This is is the target of the forwards call.
+ EXPECT_EQ(ImageWriterCommand::InsertInstructionOfCode, commands[2].op);
+
+ *entry_point = commands[0].expected_offset;
+ });
+}
+
+ISOLATE_UNIT_TEST_CASE(CodeRelocator_OutOfRangeForwardCall) {
+ RelocatorTestHelper helper(thread);
+ helper.CreateInstructions(
+ {32, FLAG_upper_pc_relative_call_distance - 32 + 4, 32});
+ helper.EmitPcRelativeCallFunction(0, 2);
+ helper.EmitReturn42Function(2);
+ helper.BuildImageAndRunTest([&](const GrowableArray<ImageWriterCommand>&
+ commands,
+ uword* entry_point) {
+ EXPECT_EQ(4, commands.length());
+
+ // This makes an out-of-range forward call.
+ EXPECT_EQ(ImageWriterCommand::InsertInstructionOfCode, commands[0].op);
+ // This is the last change the relocator thinks it can ensure the
+ // out-of-range call above can call a trampoline - so it injets it here and
+ // no later.
+ EXPECT_EQ(ImageWriterCommand::InsertBytesOfTrampoline, commands[1].op);
+ EXPECT_EQ(ImageWriterCommand::InsertInstructionOfCode, commands[2].op);
+ // This is the target of the forwwards call.
+ EXPECT_EQ(ImageWriterCommand::InsertInstructionOfCode, commands[3].op);
+
+ *entry_point = commands[0].expected_offset;
+ });
+}
+
+ISOLATE_UNIT_TEST_CASE(CodeRelocator_DirectBackwardCall) {
+ RelocatorTestHelper helper(thread);
+ helper.CreateInstructions({32, 32, 32});
+ helper.EmitReturn42Function(0);
+ helper.EmitPcRelativeCallFunction(2, 0);
+ helper.BuildImageAndRunTest(
+ [&](const GrowableArray<ImageWriterCommand>& commands,
+ uword* entry_point) {
+ EXPECT_EQ(3, commands.length());
+
+ // This is the backwards call target.
+ EXPECT_EQ(ImageWriterCommand::InsertInstructionOfCode, commands[0].op);
+ EXPECT_EQ(ImageWriterCommand::InsertInstructionOfCode, commands[1].op);
+ // This makes an in-range backwards call.
+ EXPECT_EQ(ImageWriterCommand::InsertInstructionOfCode, commands[2].op);
+
+ *entry_point = commands[2].expected_offset;
+ });
+}
+
+ISOLATE_UNIT_TEST_CASE(CodeRelocator_OutOfRangeBackwardCall) {
+ RelocatorTestHelper helper(thread);
+ helper.CreateInstructions({32, 32, 32, 32 + 4, 32, 32, 32, 32, 32});
+ helper.EmitReturn42Function(0);
+ helper.EmitPcRelativeCallFunction(4, 0);
+ helper.BuildImageAndRunTest([&](const GrowableArray<ImageWriterCommand>&
+ commands,
+ uword* entry_point) {
+ EXPECT_EQ(10, commands.length());
+
+ // This is the backwards call target.
+ EXPECT_EQ(ImageWriterCommand::InsertInstructionOfCode, commands[0].op);
+ EXPECT_EQ(ImageWriterCommand::InsertInstructionOfCode, commands[1].op);
+ EXPECT_EQ(ImageWriterCommand::InsertInstructionOfCode, commands[2].op);
+ EXPECT_EQ(ImageWriterCommand::InsertInstructionOfCode, commands[3].op);
+ // This makes an out-of-range backwards call. The relocator will make the
+ // call go to a trampoline instead. It will delay insertion of the
+ // trampoline until it almost becomes out-of-range.
+ EXPECT_EQ(ImageWriterCommand::InsertInstructionOfCode, commands[4].op);
+ EXPECT_EQ(ImageWriterCommand::InsertInstructionOfCode, commands[5].op);
+ EXPECT_EQ(ImageWriterCommand::InsertInstructionOfCode, commands[6].op);
+ // This is the last change the relocator thinks it can ensure the
+ // out-of-range call above can call a trampoline - so it injets it here and
+ // no later.
+ EXPECT_EQ(ImageWriterCommand::InsertBytesOfTrampoline, commands[7].op);
+ EXPECT_EQ(ImageWriterCommand::InsertInstructionOfCode, commands[8].op);
+ EXPECT_EQ(ImageWriterCommand::InsertInstructionOfCode, commands[9].op);
+
+ *entry_point = commands[4].expected_offset;
+ });
+}
+
+ISOLATE_UNIT_TEST_CASE(CodeRelocator_OutOfRangeBackwardCall2) {
+ RelocatorTestHelper helper(thread);
+ helper.CreateInstructions({32, 32, 32, 32 + 4, 32});
+ helper.EmitReturn42Function(0);
+ helper.EmitPcRelativeCallFunction(4, 0);
+ helper.BuildImageAndRunTest(
+ [&](const GrowableArray<ImageWriterCommand>& commands,
+ uword* entry_point) {
+ EXPECT_EQ(6, commands.length());
+
+ // This is the backwards call target.
+ EXPECT_EQ(ImageWriterCommand::InsertInstructionOfCode, commands[0].op);
+ EXPECT_EQ(ImageWriterCommand::InsertInstructionOfCode, commands[1].op);
+ EXPECT_EQ(ImageWriterCommand::InsertInstructionOfCode, commands[2].op);
+ EXPECT_EQ(ImageWriterCommand::InsertInstructionOfCode, commands[3].op);
+ // This makes an out-of-range backwards call. The relocator will make
+ // the call go to a trampoline instead. It will delay insertion of the
+ // trampoline until it almost becomes out-of-range.
+ EXPECT_EQ(ImageWriterCommand::InsertInstructionOfCode, commands[4].op);
+ // There's no other instructions coming, so the relocator will resolve
+ // any pending out-of-range calls by inserting trampolines at the end.
+ EXPECT_EQ(ImageWriterCommand::InsertBytesOfTrampoline, commands[5].op);
+
+ *entry_point = commands[4].expected_offset;
+ });
+}
+
+UNIT_TEST_CASE(PCRelativeCallPatterns) {
+ {
+ uint8_t instruction[PcRelativeCallPattern::kLengthInBytes];
+
+ PcRelativeCallPattern pattern(reinterpret_cast<uword>(&instruction));
+
+ pattern.set_distance(PcRelativeCallPattern::kLowerCallingRange);
+ EXPECT_EQ(PcRelativeCallPattern::kLowerCallingRange, pattern.distance());
+
+ pattern.set_distance(PcRelativeCallPattern::kUpperCallingRange);
+ EXPECT_EQ(PcRelativeCallPattern::kUpperCallingRange, pattern.distance());
+ }
+ {
+ uint8_t instruction[PcRelativeTailCallPattern::kLengthInBytes];
+
+ PcRelativeTailCallPattern pattern(reinterpret_cast<uword>(&instruction));
+
+ pattern.set_distance(PcRelativeTailCallPattern::kLowerCallingRange);
+ EXPECT_EQ(PcRelativeTailCallPattern::kLowerCallingRange,
+ pattern.distance());
+
+ pattern.set_distance(PcRelativeTailCallPattern::kUpperCallingRange);
+ EXPECT_EQ(PcRelativeTailCallPattern::kUpperCallingRange,
+ pattern.distance());
+ }
+}
+
+#endif // defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_IA32)
+
+} // namespace dart
diff --git a/runtime/vm/instructions_arm.h b/runtime/vm/instructions_arm.h
index a1e1f9b..5bfc9bd 100644
--- a/runtime/vm/instructions_arm.h
+++ b/runtime/vm/instructions_arm.h
@@ -193,8 +193,10 @@
class PcRelativeCallPatternBase : public ValueObject {
public:
// 24 bit signed integer which will get multiplied by 4.
- static const intptr_t kLowerCallingRange = -(1 << 25) + Instr::kPCReadOffset;
- static const intptr_t kUpperCallingRange = (1 << 25) - 1;
+ static constexpr intptr_t kLowerCallingRange =
+ -(1 << 25) + Instr::kPCReadOffset;
+ static constexpr intptr_t kUpperCallingRange =
+ (1 << 25) - Instr::kInstrSize + Instr::kPCReadOffset;
explicit PcRelativeCallPatternBase(uword pc) : pc_(pc) {}
diff --git a/runtime/vm/instructions_arm64.h b/runtime/vm/instructions_arm64.h
index b450522..ecfecb6 100644
--- a/runtime/vm/instructions_arm64.h
+++ b/runtime/vm/instructions_arm64.h
@@ -203,8 +203,8 @@
class PcRelativePatternBase : public ValueObject {
public:
// 26 bit signed integer which will get multiplied by 4.
- static const intptr_t kLowerCallingRange = -(1 << 27);
- static const intptr_t kUpperCallingRange = (1 << 27) - 1;
+ static constexpr intptr_t kLowerCallingRange = -(1 << 27);
+ static constexpr intptr_t kUpperCallingRange = (1 << 27) - Instr::kInstrSize;
explicit PcRelativePatternBase(uword pc) : pc_(pc) {}
diff --git a/runtime/vm/instructions_x64.h b/runtime/vm/instructions_x64.h
index efc8abd..ce23054 100644
--- a/runtime/vm/instructions_x64.h
+++ b/runtime/vm/instructions_x64.h
@@ -110,8 +110,8 @@
// callq *[rip+offset]
class PcRelativeCallPattern : public InstructionPattern<PcRelativeCallPattern> {
public:
- static const intptr_t kLowerCallingRange = -(DART_UINT64_C(1) << 31);
- static const intptr_t kUpperCallingRange = (DART_UINT64_C(1) << 31) - 1;
+ static constexpr intptr_t kLowerCallingRange = -(DART_UINT64_C(1) << 31);
+ static constexpr intptr_t kUpperCallingRange = (DART_UINT64_C(1) << 31) - 1;
explicit PcRelativeCallPattern(uword pc) : InstructionPattern(pc) {}
@@ -169,11 +169,11 @@
kLengthInBytes;
}
- void set_distance(int32_t distance) {
+ void set_distance(intptr_t distance) {
// [distance] is relative to the start of the instruction, x64 considers the
// offset relative to next PC.
StoreUnaligned(reinterpret_cast<int32_t*>(pattern_start_ + 1),
- distance - kLengthInBytes);
+ static_cast<int32_t>(distance - kLengthInBytes));
}
bool IsValid() const {
@@ -187,8 +187,8 @@
class PcRelativeTailCallPattern : public PcRelativeTrampolineJumpPattern {
public:
- static const intptr_t kLowerCallingRange = -(1ul << 31) + kLengthInBytes;
- static const intptr_t kUpperCallingRange = (1ul << 31) - 1;
+ static constexpr intptr_t kLowerCallingRange = -(1ul << 31) + kLengthInBytes;
+ static constexpr intptr_t kUpperCallingRange = (1ul << 31) - 1;
explicit PcRelativeTailCallPattern(uword pc)
: PcRelativeTrampolineJumpPattern(pc) {}
diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h
index 2a78176..6259fe8 100644
--- a/runtime/vm/kernel_binary.h
+++ b/runtime/vm/kernel_binary.h
@@ -20,8 +20,8 @@
static const uint32_t kMagicProgramFile = 0x90ABCDEFu;
// Both version numbers are inclusive.
-static const uint32_t kMinSupportedKernelFormatVersion = 61;
-static const uint32_t kMaxSupportedKernelFormatVersion = 61;
+static const uint32_t kMinSupportedKernelFormatVersion = 62;
+static const uint32_t kMaxSupportedKernelFormatVersion = 62;
// Keep in sync with package:kernel/lib/binary/tag.dart
#define KERNEL_TAG_LIST(V) \
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 9eb6bed..b936691 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -5343,6 +5343,8 @@
void set_stats(CodeStatistics* stats) const;
private:
+ friend struct RelocatorTestHelper;
+
void SetSize(intptr_t value) const {
ASSERT(value >= 0);
StoreNonPointer(&untag()->size_and_flags_,
@@ -6500,6 +6502,8 @@
friend class UntaggedObject; // For UntaggedObject::SizeFromClass().
friend class UntaggedCode;
+ friend struct RelocatorTestHelper;
+
enum {
kOptimizedBit = 0,
kForceOptimizedBit = 1,
diff --git a/tools/VERSION b/tools/VERSION
index cde3d7a..b42b43f 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 14
PATCH 0
-PRERELEASE 14
+PRERELEASE 15
PRERELEASE_PATCH 0
\ No newline at end of file