mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 08:51:21 +00:00
[cfe] Pass references to lowered tear-offs
TEST=existing Change-Id: I7e2625f87b357ceec45ec2664f7444af38ec0cf1 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/215402 Commit-Queue: Johnni Winther <johnniwinther@google.com> Reviewed-by: Jens Johansen <jensj@google.com>
This commit is contained in:
parent
2b36a3945d
commit
3aaea30f10
|
@ -126,19 +126,24 @@ class SourceConstructorBuilder extends FunctionBuilderImpl
|
|||
int charOffset,
|
||||
this.charOpenParenOffset,
|
||||
int charEndOffset,
|
||||
Member? referenceFrom,
|
||||
Reference? constructorReference,
|
||||
Reference? tearOffReference,
|
||||
{String? nativeMethodName,
|
||||
required bool forAbstractClassOrEnum})
|
||||
: _constructor = new Constructor(new FunctionNode(null),
|
||||
name: new Name(name, compilationUnit.library),
|
||||
fileUri: compilationUnit.fileUri,
|
||||
reference: referenceFrom?.reference)
|
||||
reference: constructorReference)
|
||||
..startFileOffset = startCharOffset
|
||||
..fileOffset = charOffset
|
||||
..fileEndOffset = charEndOffset
|
||||
..isNonNullableByDefault = compilationUnit.isNonNullableByDefault,
|
||||
_constructorTearOff = createConstructorTearOffProcedure(
|
||||
name, compilationUnit, compilationUnit.fileUri, charOffset,
|
||||
name,
|
||||
compilationUnit,
|
||||
compilationUnit.fileUri,
|
||||
charOffset,
|
||||
tearOffReference,
|
||||
forAbstractClassOrEnum: forAbstractClassOrEnum),
|
||||
super(metadata, modifiers, returnType, name, typeVariables, formals,
|
||||
compilationUnit, charOffset, nativeMethodName);
|
||||
|
|
|
@ -40,6 +40,7 @@ import '../fasta_codes.dart'
|
|||
templateDuplicatedDeclarationSyntheticCause,
|
||||
templateEnumConstantSameNameAsEnclosing;
|
||||
|
||||
import '../kernel/constructor_tearoff_lowering.dart';
|
||||
import '../kernel/kernel_helper.dart';
|
||||
|
||||
import '../util/helpers.dart';
|
||||
|
@ -198,14 +199,17 @@ class EnumBuilder extends SourceClassBuilder {
|
|||
? referencesFromIndexed.library.reference
|
||||
: parent.library.reference);
|
||||
|
||||
Constructor? constructorReference;
|
||||
Reference? constructorReference;
|
||||
Reference? tearOffReference;
|
||||
Reference? toStringReference;
|
||||
Reference? valuesFieldReference;
|
||||
Reference? valuesGetterReference;
|
||||
Reference? valuesSetterReference;
|
||||
if (referencesFromIndexed != null) {
|
||||
constructorReference =
|
||||
referencesFromIndexed.lookupConstructor(new Name("")) as Constructor;
|
||||
referencesFromIndexed.lookupConstructorReference(new Name(""));
|
||||
tearOffReference = referencesFromIndexed.lookupGetterReference(
|
||||
constructorTearOffName("", referencesFromIndexed.library));
|
||||
toStringReference =
|
||||
referencesFromIndexed.lookupGetterReference(new Name("toString"));
|
||||
Name valuesName = new Name("values");
|
||||
|
@ -235,6 +239,7 @@ class EnumBuilder extends SourceClassBuilder {
|
|||
charOffset,
|
||||
charEndOffset,
|
||||
constructorReference,
|
||||
tearOffReference,
|
||||
forAbstractClassOrEnum: true);
|
||||
constructors[""] = constructorBuilder;
|
||||
FieldBuilder valuesBuilder = new SourceFieldBuilder(
|
||||
|
|
|
@ -66,6 +66,7 @@ class SourceFactoryBuilder extends FunctionBuilderImpl {
|
|||
this.charOpenParenOffset,
|
||||
int charEndOffset,
|
||||
Reference? procedureReference,
|
||||
Reference? tearOffReference,
|
||||
AsyncMarker asyncModifier,
|
||||
NameScheme nameScheme,
|
||||
{String? nativeMethodName})
|
||||
|
@ -79,8 +80,8 @@ class SourceFactoryBuilder extends FunctionBuilderImpl {
|
|||
..fileOffset = charOffset
|
||||
..fileEndOffset = charEndOffset
|
||||
..isNonNullableByDefault = libraryBuilder.isNonNullableByDefault,
|
||||
_factoryTearOff = createFactoryTearOffProcedure(
|
||||
name, libraryBuilder, libraryBuilder.fileUri, charOffset),
|
||||
_factoryTearOff = createFactoryTearOffProcedure(name, libraryBuilder,
|
||||
libraryBuilder.fileUri, charOffset, tearOffReference),
|
||||
super(metadata, modifiers, returnType, name, typeVariables, formals,
|
||||
libraryBuilder, charOffset, nativeMethodName) {
|
||||
this.asyncModifier = asyncModifier;
|
||||
|
@ -273,6 +274,7 @@ class RedirectingFactoryBuilder extends SourceFactoryBuilder {
|
|||
int charOpenParenOffset,
|
||||
int charEndOffset,
|
||||
Reference? procedureReference,
|
||||
Reference? tearOffReference,
|
||||
NameScheme nameScheme,
|
||||
String? nativeMethodName,
|
||||
this.redirectionTarget)
|
||||
|
@ -289,6 +291,7 @@ class RedirectingFactoryBuilder extends SourceFactoryBuilder {
|
|||
charOpenParenOffset,
|
||||
charEndOffset,
|
||||
procedureReference,
|
||||
tearOffReference,
|
||||
AsyncMarker.Sync,
|
||||
nameScheme,
|
||||
nativeMethodName: nativeMethodName);
|
||||
|
|
|
@ -97,8 +97,12 @@ bool isTypedefTearOffLowering(Procedure procedure) {
|
|||
/// the given [name] in [compilationUnit].
|
||||
///
|
||||
/// If constructor tear off lowering is not enabled, `null` is returned.
|
||||
Procedure? createConstructorTearOffProcedure(String name,
|
||||
SourceLibraryBuilder compilationUnit, Uri fileUri, int fileOffset,
|
||||
Procedure? createConstructorTearOffProcedure(
|
||||
String name,
|
||||
SourceLibraryBuilder compilationUnit,
|
||||
Uri fileUri,
|
||||
int fileOffset,
|
||||
Reference? reference,
|
||||
{required bool forAbstractClassOrEnum}) {
|
||||
if (!forAbstractClassOrEnum &&
|
||||
compilationUnit
|
||||
|
@ -107,7 +111,8 @@ Procedure? createConstructorTearOffProcedure(String name,
|
|||
compilationUnit,
|
||||
constructorTearOffName(name, compilationUnit.library),
|
||||
fileUri,
|
||||
fileOffset);
|
||||
fileOffset,
|
||||
reference);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
@ -116,15 +121,20 @@ Procedure? createConstructorTearOffProcedure(String name,
|
|||
/// the given [name] in [compilationUnit].
|
||||
///
|
||||
/// If constructor tear off lowering is not enabled, `null` is returned.
|
||||
Procedure? createFactoryTearOffProcedure(String name,
|
||||
SourceLibraryBuilder compilationUnit, Uri fileUri, int fileOffset) {
|
||||
Procedure? createFactoryTearOffProcedure(
|
||||
String name,
|
||||
SourceLibraryBuilder compilationUnit,
|
||||
Uri fileUri,
|
||||
int fileOffset,
|
||||
Reference? reference) {
|
||||
if (compilationUnit
|
||||
.loader.target.backendTarget.isFactoryTearOffLoweringEnabled) {
|
||||
return _createTearOffProcedure(
|
||||
compilationUnit,
|
||||
constructorTearOffName(name, compilationUnit.library),
|
||||
fileUri,
|
||||
fileOffset);
|
||||
fileOffset,
|
||||
reference);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
@ -132,13 +142,19 @@ Procedure? createFactoryTearOffProcedure(String name,
|
|||
/// Creates the [Procedure] for the lowering of a typedef tearoff of a
|
||||
/// constructor of the given [name] in with the typedef defined in
|
||||
/// [libraryBuilder].
|
||||
Procedure createTypedefTearOffProcedure(String typedefName, String name,
|
||||
SourceLibraryBuilder libraryBuilder, Uri fileUri, int fileOffset) {
|
||||
Procedure createTypedefTearOffProcedure(
|
||||
String typedefName,
|
||||
String name,
|
||||
SourceLibraryBuilder libraryBuilder,
|
||||
Uri fileUri,
|
||||
int fileOffset,
|
||||
Reference? reference) {
|
||||
return _createTearOffProcedure(
|
||||
libraryBuilder,
|
||||
typedefTearOffName(typedefName, name, libraryBuilder.library),
|
||||
fileUri,
|
||||
fileOffset);
|
||||
fileOffset,
|
||||
reference);
|
||||
}
|
||||
|
||||
/// Creates the parameters and body for [tearOff] based on [constructor] in
|
||||
|
@ -307,9 +323,9 @@ SynthesizedFunctionNode buildRedirectingFactoryTearOffBody(
|
|||
/// Creates the synthesized [Procedure] node for a tear off lowering by the
|
||||
/// given [name].
|
||||
Procedure _createTearOffProcedure(SourceLibraryBuilder libraryBuilder,
|
||||
Name name, Uri fileUri, int fileOffset) {
|
||||
Name name, Uri fileUri, int fileOffset, Reference? reference) {
|
||||
return new Procedure(name, ProcedureKind.Method, new FunctionNode(null),
|
||||
fileUri: fileUri, isStatic: true)
|
||||
fileUri: fileUri, isStatic: true, reference: reference)
|
||||
..startFileOffset = fileOffset
|
||||
..fileOffset = fileOffset
|
||||
..fileEndOffset = fileOffset
|
||||
|
|
|
@ -773,10 +773,13 @@ class KernelTarget extends TargetImplementation {
|
|||
}
|
||||
|
||||
IndexedClass? indexedClass = builder.referencesFromIndexed;
|
||||
Constructor? referenceFrom;
|
||||
Reference? constructorReference;
|
||||
Reference? tearOffReference;
|
||||
if (indexedClass != null) {
|
||||
referenceFrom =
|
||||
indexedClass.lookupConstructor(new Name("")) as Constructor?;
|
||||
constructorReference =
|
||||
indexedClass.lookupConstructorReference(new Name(""));
|
||||
tearOffReference = indexedClass.lookupGetterReference(
|
||||
constructorTearOffName("", indexedClass.library));
|
||||
}
|
||||
|
||||
/// From [Dart Programming Language Specification, 4th Edition](
|
||||
|
@ -784,8 +787,8 @@ class KernelTarget extends TargetImplementation {
|
|||
/// >Iff no constructor is specified for a class C, it implicitly has a
|
||||
/// >default constructor C() : super() {}, unless C is class Object.
|
||||
// The superinitializer is installed below in [finishConstructors].
|
||||
builder.addSyntheticConstructor(
|
||||
_makeDefaultConstructor(builder, referenceFrom));
|
||||
builder.addSyntheticConstructor(_makeDefaultConstructor(
|
||||
builder, constructorReference, tearOffReference));
|
||||
}
|
||||
|
||||
void installForwardingConstructors(SourceClassBuilder builder) {
|
||||
|
@ -828,10 +831,13 @@ class KernelTarget extends TargetImplementation {
|
|||
}
|
||||
|
||||
IndexedClass? indexedClass = builder.referencesFromIndexed;
|
||||
Constructor? referenceFrom;
|
||||
Reference? constructorReference;
|
||||
Reference? tearOffReference;
|
||||
if (indexedClass != null) {
|
||||
referenceFrom =
|
||||
indexedClass.lookupConstructor(new Name("")) as Constructor?;
|
||||
constructorReference =
|
||||
indexedClass.lookupConstructorReference(new Name(""));
|
||||
tearOffReference = indexedClass.lookupGetterReference(
|
||||
constructorTearOffName("", indexedClass.library));
|
||||
}
|
||||
|
||||
if (supertype is ClassBuilder) {
|
||||
|
@ -842,14 +848,21 @@ class KernelTarget extends TargetImplementation {
|
|||
void addSyntheticConstructor(String name, MemberBuilder memberBuilder) {
|
||||
if (memberBuilder.member is Constructor) {
|
||||
substitutionMap ??= builder.getSubstitutionMap(superclassBuilder.cls);
|
||||
Constructor? referenceFrom = indexedClass?.lookupConstructor(
|
||||
new Name(name, indexedClass.library)) as Constructor?;
|
||||
Reference? constructorReference;
|
||||
Reference? tearOffReference;
|
||||
if (indexedClass != null) {
|
||||
constructorReference = indexedClass.lookupConstructorReference(
|
||||
new Name(name, indexedClass.library));
|
||||
tearOffReference = indexedClass.lookupGetterReference(
|
||||
constructorTearOffName(name, indexedClass.library));
|
||||
}
|
||||
builder.addSyntheticConstructor(_makeMixinApplicationConstructor(
|
||||
builder,
|
||||
builder.cls.mixin,
|
||||
memberBuilder as MemberBuilderImpl,
|
||||
substitutionMap!,
|
||||
referenceFrom));
|
||||
constructorReference,
|
||||
tearOffReference));
|
||||
isConstructorAdded = true;
|
||||
}
|
||||
}
|
||||
|
@ -858,16 +871,16 @@ class KernelTarget extends TargetImplementation {
|
|||
includeInjectedConstructors: true);
|
||||
|
||||
if (!isConstructorAdded) {
|
||||
builder.addSyntheticConstructor(
|
||||
_makeDefaultConstructor(builder, referenceFrom));
|
||||
builder.addSyntheticConstructor(_makeDefaultConstructor(
|
||||
builder, constructorReference, tearOffReference));
|
||||
}
|
||||
} else if (supertype is InvalidTypeDeclarationBuilder ||
|
||||
supertype is TypeVariableBuilder ||
|
||||
supertype is DynamicTypeDeclarationBuilder ||
|
||||
supertype is VoidTypeDeclarationBuilder ||
|
||||
supertype is NeverTypeDeclarationBuilder) {
|
||||
builder.addSyntheticConstructor(
|
||||
_makeDefaultConstructor(builder, referenceFrom));
|
||||
builder.addSyntheticConstructor(_makeDefaultConstructor(
|
||||
builder, constructorReference, tearOffReference));
|
||||
} else {
|
||||
unhandled("${supertype.runtimeType}", "installForwardingConstructors",
|
||||
builder.charOffset, builder.fileUri);
|
||||
|
@ -879,7 +892,8 @@ class KernelTarget extends TargetImplementation {
|
|||
Class mixin,
|
||||
MemberBuilderImpl superConstructorBuilder,
|
||||
Map<TypeParameter, DartType> substitutionMap,
|
||||
Constructor? referenceFrom) {
|
||||
Reference? constructorReference,
|
||||
Reference? tearOffReference) {
|
||||
bool hasTypeDependency = false;
|
||||
Substitution substitution = Substitution.fromMap(substitutionMap);
|
||||
|
||||
|
@ -950,7 +964,7 @@ class KernelTarget extends TargetImplementation {
|
|||
initializers: <Initializer>[initializer],
|
||||
isSynthetic: true,
|
||||
isConst: isConst,
|
||||
reference: referenceFrom?.reference,
|
||||
reference: constructorReference,
|
||||
fileUri: cls.fileUri)
|
||||
// TODO(johnniwinther): Should we add file offsets to synthesized
|
||||
// constructors?
|
||||
|
@ -970,6 +984,7 @@ class KernelTarget extends TargetImplementation {
|
|||
classBuilder.library,
|
||||
cls.fileUri,
|
||||
cls.fileOffset,
|
||||
tearOffReference,
|
||||
forAbstractClassOrEnum: classBuilder.isAbstract);
|
||||
|
||||
if (constructorTearOff != null) {
|
||||
|
@ -996,14 +1011,16 @@ class KernelTarget extends TargetImplementation {
|
|||
}
|
||||
|
||||
SyntheticConstructorBuilder _makeDefaultConstructor(
|
||||
SourceClassBuilder classBuilder, Constructor? referenceFrom) {
|
||||
SourceClassBuilder classBuilder,
|
||||
Reference? constructorReference,
|
||||
Reference? tearOffReference) {
|
||||
Class enclosingClass = classBuilder.cls;
|
||||
Constructor constructor = new Constructor(
|
||||
new FunctionNode(new EmptyStatement(),
|
||||
returnType: makeConstructorReturnType(enclosingClass)),
|
||||
name: new Name(""),
|
||||
isSynthetic: true,
|
||||
reference: referenceFrom?.reference,
|
||||
reference: constructorReference,
|
||||
fileUri: enclosingClass.fileUri)
|
||||
..fileOffset = enclosingClass.fileOffset
|
||||
// TODO(johnniwinther): Should we add file end offsets to synthesized
|
||||
|
@ -1011,8 +1028,12 @@ class KernelTarget extends TargetImplementation {
|
|||
//..fileEndOffset = enclosingClass.fileOffset
|
||||
..isNonNullableByDefault =
|
||||
enclosingClass.enclosingLibrary.isNonNullableByDefault;
|
||||
Procedure? constructorTearOff = createConstructorTearOffProcedure('',
|
||||
classBuilder.library, enclosingClass.fileUri, enclosingClass.fileOffset,
|
||||
Procedure? constructorTearOff = createConstructorTearOffProcedure(
|
||||
'',
|
||||
classBuilder.library,
|
||||
enclosingClass.fileUri,
|
||||
enclosingClass.fileOffset,
|
||||
tearOffReference,
|
||||
forAbstractClassOrEnum:
|
||||
enclosingClass.isAbstract || enclosingClass.isEnum);
|
||||
if (constructorTearOff != null) {
|
||||
|
|
|
@ -82,6 +82,7 @@ import '../identifiers.dart' show QualifiedName, flattenName;
|
|||
import '../import.dart' show Import;
|
||||
|
||||
import '../kernel/class_hierarchy_builder.dart';
|
||||
import '../kernel/constructor_tearoff_lowering.dart';
|
||||
import '../kernel/implicit_field_type.dart';
|
||||
import '../kernel/internal_ast.dart';
|
||||
import '../kernel/load_library_builder.dart';
|
||||
|
@ -2352,10 +2353,14 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
|||
String? nativeMethodName,
|
||||
{Token? beginInitializers,
|
||||
required bool forAbstractClass}) {
|
||||
Member? referenceFrom;
|
||||
Reference? constructorReference;
|
||||
Reference? tearOffReference;
|
||||
if (_currentClassReferencesFromIndexed != null) {
|
||||
referenceFrom = _currentClassReferencesFromIndexed!.lookupConstructor(
|
||||
new Name(
|
||||
constructorReference = _currentClassReferencesFromIndexed!
|
||||
.lookupConstructorReference(new Name(
|
||||
constructorName, _currentClassReferencesFromIndexed!.library));
|
||||
tearOffReference = _currentClassReferencesFromIndexed!
|
||||
.lookupGetterReference(constructorTearOffName(
|
||||
constructorName, _currentClassReferencesFromIndexed!.library));
|
||||
}
|
||||
ConstructorBuilder constructorBuilder = new SourceConstructorBuilder(
|
||||
|
@ -2370,12 +2375,14 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
|||
charOffset,
|
||||
charOpenParenOffset,
|
||||
charEndOffset,
|
||||
referenceFrom,
|
||||
constructorReference,
|
||||
tearOffReference,
|
||||
nativeMethodName: nativeMethodName,
|
||||
forAbstractClassOrEnum: forAbstractClass);
|
||||
checkTypeVariables(typeVariables, constructorBuilder);
|
||||
// TODO(johnniwinther): There is no way to pass the tear off reference here.
|
||||
addBuilder(constructorName, constructorBuilder, charOffset,
|
||||
getterReference: referenceFrom?.reference);
|
||||
getterReference: constructorReference);
|
||||
if (nativeMethodName != null) {
|
||||
addNativeMethod(constructorBuilder);
|
||||
}
|
||||
|
@ -2538,10 +2545,16 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
|||
.reference
|
||||
: library.reference);
|
||||
|
||||
Reference? reference = _currentClassReferencesFromIndexed
|
||||
?.lookupConstructor(new Name(
|
||||
procedureName, _currentClassReferencesFromIndexed!.library))
|
||||
?.reference;
|
||||
Reference? constructorReference;
|
||||
Reference? tearOffReference;
|
||||
if (_currentClassReferencesFromIndexed != null) {
|
||||
constructorReference = _currentClassReferencesFromIndexed!
|
||||
.lookupConstructorReference(new Name(
|
||||
procedureName, _currentClassReferencesFromIndexed!.library));
|
||||
tearOffReference = _currentClassReferencesFromIndexed!
|
||||
.lookupGetterReference(constructorTearOffName(
|
||||
procedureName, _currentClassReferencesFromIndexed!.library));
|
||||
}
|
||||
|
||||
SourceFactoryBuilder procedureBuilder;
|
||||
if (redirectionTarget != null) {
|
||||
|
@ -2560,7 +2573,8 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
|||
charOffset,
|
||||
charOpenParenOffset,
|
||||
charEndOffset,
|
||||
reference,
|
||||
constructorReference,
|
||||
tearOffReference,
|
||||
procedureNameScheme,
|
||||
nativeMethodName,
|
||||
redirectionTarget);
|
||||
|
@ -2580,7 +2594,8 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
|||
charOffset,
|
||||
charOpenParenOffset,
|
||||
charEndOffset,
|
||||
reference,
|
||||
constructorReference,
|
||||
tearOffReference,
|
||||
asyncModifier,
|
||||
procedureNameScheme,
|
||||
nativeMethodName: nativeMethodName);
|
||||
|
@ -2598,7 +2613,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
|||
|
||||
factoryDeclaration.resolveTypes(procedureBuilder.typeVariables, this);
|
||||
addBuilder(procedureName, procedureBuilder, charOffset,
|
||||
getterReference: reference);
|
||||
getterReference: constructorReference);
|
||||
if (nativeMethodName != null) {
|
||||
addNativeMethod(procedureBuilder);
|
||||
}
|
||||
|
|
|
@ -320,9 +320,16 @@ class SourceTypeAliasBuilder extends TypeAliasBuilderImpl {
|
|||
}
|
||||
Name targetName =
|
||||
new Name(constructorName, declaration.library.library);
|
||||
Reference? tearOffReference;
|
||||
if (library.referencesFromIndexed != null) {
|
||||
tearOffReference = library.referencesFromIndexed!
|
||||
.lookupGetterReference(typedefTearOffName(name, constructorName,
|
||||
library.referencesFromIndexed!.library));
|
||||
}
|
||||
|
||||
Procedure tearOff = tearOffs![targetName] =
|
||||
createTypedefTearOffProcedure(name, constructorName, library,
|
||||
target.fileUri, target.fileOffset);
|
||||
target.fileUri, target.fileOffset, tearOffReference);
|
||||
_tearOffDependencies![tearOff] = target;
|
||||
|
||||
buildTypedefTearOffProcedure(tearOff, target, declaration.cls,
|
||||
|
|
79
pkg/front_end/testcases/incremental/constructor_change.yaml
Normal file
79
pkg/front_end/testcases/incremental/constructor_change.yaml
Normal file
|
@ -0,0 +1,79 @@
|
|||
# Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
|
||||
# for details. All rights reserved. Use of this source code is governed by a
|
||||
# BSD-style license that can be found in the LICENSE.md file.
|
||||
|
||||
# Compile an application, change a file, but don't change the outline.
|
||||
# Try to mess up the hierarchy.
|
||||
|
||||
type: newworld
|
||||
target: DDC
|
||||
worlds:
|
||||
- entry: main.dart
|
||||
experiments: alternative-invalidation-strategy
|
||||
sources:
|
||||
main.dart: |
|
||||
import "lib1.dart";
|
||||
import "lib2.dart";
|
||||
import "lib3.dart";
|
||||
|
||||
main() {
|
||||
Foo foo = new Bar();
|
||||
lib3Method(foo);
|
||||
}
|
||||
lib1.dart: |
|
||||
class Foo {
|
||||
void fooMethod() {
|
||||
// Not filled out.
|
||||
}
|
||||
}
|
||||
lib2.dart: |
|
||||
import "lib1.dart";
|
||||
class Bar extends Foo {
|
||||
void barMethod() {
|
||||
// Not filled out.
|
||||
}
|
||||
}
|
||||
lib3.dart: |
|
||||
import "lib1.dart";
|
||||
import "lib2.dart";
|
||||
void lib3Method(Foo foo) {
|
||||
var f = Bar.new;
|
||||
Foo bar = f();
|
||||
bool equal = foo == bar;
|
||||
print("foo == bar = $equal");
|
||||
}
|
||||
expectedLibraryCount: 4
|
||||
- entry: main.dart
|
||||
experiments: alternative-invalidation-strategy
|
||||
worldType: updated
|
||||
expectInitializeFromDill: false
|
||||
invalidate:
|
||||
- lib1.dart
|
||||
sources:
|
||||
lib1.dart: |
|
||||
class Foo {
|
||||
void fooMethod() {
|
||||
print("fooMethod");
|
||||
}
|
||||
}
|
||||
expectedLibraryCount: 4
|
||||
expectsRebuildBodiesOnly: true
|
||||
- entry: main.dart
|
||||
experiments: alternative-invalidation-strategy
|
||||
worldType: updated
|
||||
expectInitializeFromDill: false
|
||||
invalidate:
|
||||
- lib3.dart
|
||||
sources:
|
||||
lib3.dart: |
|
||||
import "lib1.dart";
|
||||
import "lib2.dart";
|
||||
void lib3Method(Foo foo) {
|
||||
var f = Bar.new;
|
||||
Foo bar = f();
|
||||
bool equal = foo == bar;
|
||||
print("foo == bar = $equal");
|
||||
print("Done!");
|
||||
}
|
||||
expectedLibraryCount: 4
|
||||
expectsRebuildBodiesOnly: true
|
|
@ -0,0 +1,51 @@
|
|||
main = main::main;
|
||||
library from "org-dartlang-test:///lib1.dart" as lib1 {
|
||||
|
||||
class Foo extends dart.core::Object {
|
||||
synthetic constructor •() → lib1::Foo
|
||||
: super dart.core::Object::•()
|
||||
;
|
||||
method fooMethod() → void {}
|
||||
static method _#new#tearOff() → lib1::Foo
|
||||
return new lib1::Foo::•();
|
||||
}
|
||||
}
|
||||
library from "org-dartlang-test:///lib2.dart" as lib2 {
|
||||
|
||||
import "org-dartlang-test:///lib1.dart";
|
||||
|
||||
class Bar extends lib1::Foo {
|
||||
synthetic constructor •() → lib2::Bar
|
||||
: super lib1::Foo::•()
|
||||
;
|
||||
method barMethod() → void {}
|
||||
static method _#new#tearOff() → lib2::Bar
|
||||
return new lib2::Bar::•();
|
||||
}
|
||||
}
|
||||
library from "org-dartlang-test:///lib3.dart" as lib3 {
|
||||
|
||||
import "org-dartlang-test:///lib1.dart";
|
||||
import "org-dartlang-test:///lib2.dart";
|
||||
|
||||
static method lib3Method(lib1::Foo foo) → void {
|
||||
() → lib2::Bar f = #C1;
|
||||
lib1::Foo bar = f(){() → lib2::Bar};
|
||||
dart.core::bool equal = foo =={dart.core::Object::==}{(dart.core::Object) → dart.core::bool} bar;
|
||||
dart.core::print("foo == bar = ${equal}");
|
||||
}
|
||||
}
|
||||
library from "org-dartlang-test:///main.dart" as main {
|
||||
|
||||
import "org-dartlang-test:///lib1.dart";
|
||||
import "org-dartlang-test:///lib2.dart";
|
||||
import "org-dartlang-test:///lib3.dart";
|
||||
|
||||
static method main() → dynamic {
|
||||
lib1::Foo foo = new lib2::Bar::•();
|
||||
lib3::lib3Method(foo);
|
||||
}
|
||||
}
|
||||
constants {
|
||||
#C1 = static-tearoff lib2::Bar::_#new#tearOff
|
||||
}
|
|
@ -0,0 +1,53 @@
|
|||
main = main::main;
|
||||
library from "org-dartlang-test:///lib1.dart" as lib1 {
|
||||
|
||||
class Foo extends dart.core::Object {
|
||||
synthetic constructor •() → lib1::Foo
|
||||
: super dart.core::Object::•()
|
||||
;
|
||||
method fooMethod() → void {
|
||||
dart.core::print("fooMethod");
|
||||
}
|
||||
static method _#new#tearOff() → lib1::Foo
|
||||
return new lib1::Foo::•();
|
||||
}
|
||||
}
|
||||
library from "org-dartlang-test:///lib2.dart" as lib2 {
|
||||
|
||||
import "org-dartlang-test:///lib1.dart";
|
||||
|
||||
class Bar extends lib1::Foo {
|
||||
synthetic constructor •() → lib2::Bar
|
||||
: super lib1::Foo::•()
|
||||
;
|
||||
method barMethod() → void {}
|
||||
static method _#new#tearOff() → lib2::Bar
|
||||
return new lib2::Bar::•();
|
||||
}
|
||||
}
|
||||
library from "org-dartlang-test:///lib3.dart" as lib3 {
|
||||
|
||||
import "org-dartlang-test:///lib1.dart";
|
||||
import "org-dartlang-test:///lib2.dart";
|
||||
|
||||
static method lib3Method(lib1::Foo foo) → void {
|
||||
() → lib2::Bar f = #C1;
|
||||
lib1::Foo bar = f(){() → lib2::Bar};
|
||||
dart.core::bool equal = foo =={dart.core::Object::==}{(dart.core::Object) → dart.core::bool} bar;
|
||||
dart.core::print("foo == bar = ${equal}");
|
||||
}
|
||||
}
|
||||
library from "org-dartlang-test:///main.dart" as main {
|
||||
|
||||
import "org-dartlang-test:///lib1.dart";
|
||||
import "org-dartlang-test:///lib2.dart";
|
||||
import "org-dartlang-test:///lib3.dart";
|
||||
|
||||
static method main() → dynamic {
|
||||
lib1::Foo foo = new lib2::Bar::•();
|
||||
lib3::lib3Method(foo);
|
||||
}
|
||||
}
|
||||
constants {
|
||||
#C1 = static-tearoff lib2::Bar::_#new#tearOff
|
||||
}
|
|
@ -0,0 +1,54 @@
|
|||
main = main::main;
|
||||
library from "org-dartlang-test:///lib1.dart" as lib1 {
|
||||
|
||||
class Foo extends dart.core::Object {
|
||||
synthetic constructor •() → lib1::Foo
|
||||
: super dart.core::Object::•()
|
||||
;
|
||||
method fooMethod() → void {
|
||||
dart.core::print("fooMethod");
|
||||
}
|
||||
static method _#new#tearOff() → lib1::Foo
|
||||
return new lib1::Foo::•();
|
||||
}
|
||||
}
|
||||
library from "org-dartlang-test:///lib2.dart" as lib2 {
|
||||
|
||||
import "org-dartlang-test:///lib1.dart";
|
||||
|
||||
class Bar extends lib1::Foo {
|
||||
synthetic constructor •() → lib2::Bar
|
||||
: super lib1::Foo::•()
|
||||
;
|
||||
method barMethod() → void {}
|
||||
static method _#new#tearOff() → lib2::Bar
|
||||
return new lib2::Bar::•();
|
||||
}
|
||||
}
|
||||
library from "org-dartlang-test:///lib3.dart" as lib3 {
|
||||
|
||||
import "org-dartlang-test:///lib1.dart";
|
||||
import "org-dartlang-test:///lib2.dart";
|
||||
|
||||
static method lib3Method(lib1::Foo foo) → void {
|
||||
() → lib2::Bar f = #C1;
|
||||
lib1::Foo bar = f(){() → lib2::Bar};
|
||||
dart.core::bool equal = foo =={dart.core::Object::==}{(dart.core::Object) → dart.core::bool} bar;
|
||||
dart.core::print("foo == bar = ${equal}");
|
||||
dart.core::print("Done!");
|
||||
}
|
||||
}
|
||||
library from "org-dartlang-test:///main.dart" as main {
|
||||
|
||||
import "org-dartlang-test:///lib1.dart";
|
||||
import "org-dartlang-test:///lib2.dart";
|
||||
import "org-dartlang-test:///lib3.dart";
|
||||
|
||||
static method main() → dynamic {
|
||||
lib1::Foo foo = new lib2::Bar::•();
|
||||
lib3::lib3Method(foo);
|
||||
}
|
||||
}
|
||||
constants {
|
||||
#C1 = static-tearoff lib2::Bar::_#new#tearOff
|
||||
}
|
|
@ -9,7 +9,6 @@ import "ast.dart"
|
|||
Extension,
|
||||
Field,
|
||||
Library,
|
||||
Member,
|
||||
Name,
|
||||
Procedure,
|
||||
ProcedureKind,
|
||||
|
@ -116,19 +115,19 @@ class IndexedLibrary extends IndexedContainer {
|
|||
|
||||
class IndexedClass extends IndexedContainer {
|
||||
final Class cls;
|
||||
final Map<Name, Member> _constructors = new Map<Name, Member>();
|
||||
final Map<Name, Reference> _constructors = new Map<Name, Reference>();
|
||||
@override
|
||||
final Library library;
|
||||
|
||||
IndexedClass._(this.cls, this.library) {
|
||||
for (int i = 0; i < cls.constructors.length; i++) {
|
||||
Constructor constructor = cls.constructors[i];
|
||||
_constructors[constructor.name] = constructor;
|
||||
_constructors[constructor.name] = constructor.reference;
|
||||
}
|
||||
for (int i = 0; i < cls.procedures.length; i++) {
|
||||
Procedure procedure = cls.procedures[i];
|
||||
if (procedure.isFactory) {
|
||||
_constructors[procedure.name] = procedure;
|
||||
_constructors[procedure.name] = procedure.reference;
|
||||
} else {
|
||||
_addProcedure(procedure);
|
||||
}
|
||||
|
@ -136,5 +135,5 @@ class IndexedClass extends IndexedContainer {
|
|||
_addFields(cls.fields);
|
||||
}
|
||||
|
||||
Member? lookupConstructor(Name name) => _constructors[name];
|
||||
Reference? lookupConstructorReference(Name name) => _constructors[name];
|
||||
}
|
||||
|
|
|
@ -526,7 +526,7 @@ class _FfiDefinitionTransformer extends FfiTransformer {
|
|||
"#typedDataBase",
|
||||
type: coreTypes.objectNonNullableRawType);
|
||||
final name = Name("#fromTypedDataBase");
|
||||
final referenceFrom = indexedClass?.lookupConstructor(name);
|
||||
final reference = indexedClass?.lookupConstructorReference(name);
|
||||
final Constructor ctor = Constructor(
|
||||
FunctionNode(EmptyStatement(),
|
||||
positionalParameters: [typedDataBase],
|
||||
|
@ -540,7 +540,7 @@ class _FfiDefinitionTransformer extends FfiTransformer {
|
|||
Arguments([VariableGet(typedDataBase)]))
|
||||
],
|
||||
fileUri: node.fileUri,
|
||||
reference: referenceFrom?.reference)
|
||||
reference: reference)
|
||||
..fileOffset = node.fileOffset
|
||||
..isNonNullableByDefault = node.enclosingLibrary.isNonNullableByDefault;
|
||||
|
||||
|
|
Loading…
Reference in a new issue