[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:
Johnni Winther 2021-10-05 09:20:41 +00:00 committed by commit-bot@chromium.org
parent 2b36a3945d
commit 3aaea30f10
13 changed files with 367 additions and 59 deletions

View file

@ -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);

View file

@ -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(

View file

@ -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);

View file

@ -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

View file

@ -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) {

View file

@ -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);
}

View file

@ -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,

View 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

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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];
}

View file

@ -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;