[cfe] Add DillProcedureBuilder implementing ProcedureBuilder
This adds a DillProcedureBuilder superclass to DillMethodBuilder, DillOperatorBuilder, DillGetterBuilder, DillSetterBuilder and DillFactoryBuilder by which they implement a cleaned up ProcedureBuilder. Includes cleanup made possible by this change and by the previous change to make DillConstructorBuilder implement ConstructorBuilder. Change-Id: Ieb835dc2788065a06b7f3eda1ccc34ccd1788c28 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/226081 Reviewed-by: Chloe Stefantsova <cstefantsova@google.com> Commit-Queue: Johnni Winther <johnniwinther@google.com>
This commit is contained in:
committed by
Commit Bot
parent
f999e15653
commit
bd460ca605
@@ -31,7 +31,6 @@ import 'package:kernel/type_algebra.dart' show Substitution, substitute;
|
||||
import 'package:kernel/type_environment.dart'
|
||||
show SubtypeCheckMode, TypeEnvironment;
|
||||
|
||||
import '../dill/dill_member_builder.dart';
|
||||
import '../fasta_codes.dart';
|
||||
import '../kernel/kernel_helper.dart';
|
||||
import '../kernel/redirecting_factory_body.dart' show RedirectingFactoryBody;
|
||||
@@ -877,28 +876,6 @@ abstract class ClassBuilderImpl extends DeclarationBuilderImpl
|
||||
if (targetBuilder == null) return null;
|
||||
if (targetBuilder is FunctionBuilder) {
|
||||
targetNode = targetBuilder.function;
|
||||
} else if (targetBuilder is DillConstructorBuilder) {
|
||||
// It seems that the [redirectionTarget.target] is an instance of
|
||||
// [DillMemberBuilder] whenever the redirectee is an implicit constructor,
|
||||
// e.g.
|
||||
//
|
||||
// class A {
|
||||
// factory A() = B;
|
||||
// }
|
||||
// class B implements A {}
|
||||
//
|
||||
targetNode = targetBuilder.constructor.function;
|
||||
} else if (targetBuilder is DillFactoryBuilder) {
|
||||
// It seems that the [redirectionTarget.target] is an instance of
|
||||
// [DillMemberBuilder] whenever the redirectee is an implicit constructor,
|
||||
// e.g.
|
||||
//
|
||||
// class A {
|
||||
// factory A() = B;
|
||||
// }
|
||||
// class B implements A {}
|
||||
//
|
||||
targetNode = targetBuilder.procedure.function;
|
||||
} else if (targetBuilder is AmbiguousBuilder) {
|
||||
// Multiple definitions with the same name: An error has already been
|
||||
// issued.
|
||||
|
||||
@@ -7,26 +7,8 @@ import 'package:kernel/ast.dart';
|
||||
import 'function_builder.dart';
|
||||
|
||||
abstract class ProcedureBuilder implements FunctionBuilder {
|
||||
int get charOpenParenOffset;
|
||||
|
||||
ProcedureBuilder? get patchForTesting;
|
||||
|
||||
AsyncMarker get actualAsyncModifier;
|
||||
|
||||
Procedure get procedure;
|
||||
|
||||
@override
|
||||
ProcedureKind get kind;
|
||||
|
||||
Procedure get actualProcedure;
|
||||
|
||||
@override
|
||||
ProcedureBuilder get origin;
|
||||
|
||||
void set asyncModifier(AsyncMarker newModifier);
|
||||
|
||||
bool get isEligibleForTopLevelInference;
|
||||
|
||||
/// Returns `true` if this procedure is declared in an extension declaration.
|
||||
bool get isExtensionMethod;
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ import '../builder/builder.dart';
|
||||
import '../builder/constructor_builder.dart';
|
||||
import '../builder/member_builder.dart';
|
||||
|
||||
import '../builder/procedure_builder.dart';
|
||||
import '../kernel/hierarchy/class_member.dart' show ClassMember;
|
||||
import '../kernel/hierarchy/members_builder.dart' show ClassMembersBuilder;
|
||||
import '../kernel/member_covariance.dart';
|
||||
@@ -64,12 +65,6 @@ abstract class DillMemberBuilder extends MemberBuilderImpl {
|
||||
@override
|
||||
bool get isFactory => identical(ProcedureKind.Factory, kind);
|
||||
|
||||
/*@override
|
||||
bool get isRedirectingGenerativeConstructor {
|
||||
return isConstructor &&
|
||||
isRedirectingGenerativeConstructorImplementation(member as Constructor);
|
||||
}*/
|
||||
|
||||
@override
|
||||
bool get isSynthetic {
|
||||
final Member member = this.member;
|
||||
@@ -79,12 +74,6 @@ abstract class DillMemberBuilder extends MemberBuilderImpl {
|
||||
@override
|
||||
bool get isAssignable => false;
|
||||
|
||||
/*@override
|
||||
void buildMembers(
|
||||
LibraryBuilder library, void Function(Member, BuiltMemberKind) f) {
|
||||
throw new UnsupportedError('DillMemberBuilder.buildMembers');
|
||||
}*/
|
||||
|
||||
List<ClassMember>? _localMembers;
|
||||
List<ClassMember>? _localSetters;
|
||||
|
||||
@@ -124,10 +113,23 @@ class DillFieldBuilder extends DillMemberBuilder {
|
||||
bool get isAssignable => field.hasSetter;
|
||||
}
|
||||
|
||||
class DillGetterBuilder extends DillMemberBuilder {
|
||||
abstract class DillProcedureBuilder extends DillMemberBuilder
|
||||
implements ProcedureBuilder {
|
||||
@override
|
||||
final Procedure procedure;
|
||||
|
||||
DillGetterBuilder(this.procedure, Builder parent)
|
||||
DillProcedureBuilder(this.procedure, Builder parent)
|
||||
: super(procedure, parent);
|
||||
|
||||
@override
|
||||
ProcedureKind get kind => procedure.kind;
|
||||
|
||||
@override
|
||||
FunctionNode get function => procedure.function;
|
||||
}
|
||||
|
||||
class DillGetterBuilder extends DillProcedureBuilder {
|
||||
DillGetterBuilder(Procedure procedure, Builder parent)
|
||||
: assert(procedure.kind == ProcedureKind.Getter),
|
||||
super(procedure, parent);
|
||||
|
||||
@@ -144,10 +146,8 @@ class DillGetterBuilder extends DillMemberBuilder {
|
||||
Member get invokeTarget => procedure;
|
||||
}
|
||||
|
||||
class DillSetterBuilder extends DillMemberBuilder {
|
||||
final Procedure procedure;
|
||||
|
||||
DillSetterBuilder(this.procedure, Builder parent)
|
||||
class DillSetterBuilder extends DillProcedureBuilder {
|
||||
DillSetterBuilder(Procedure procedure, Builder parent)
|
||||
: assert(procedure.kind == ProcedureKind.Setter),
|
||||
super(procedure, parent);
|
||||
|
||||
@@ -164,10 +164,8 @@ class DillSetterBuilder extends DillMemberBuilder {
|
||||
Member? get invokeTarget => null;
|
||||
}
|
||||
|
||||
class DillMethodBuilder extends DillMemberBuilder {
|
||||
final Procedure procedure;
|
||||
|
||||
DillMethodBuilder(this.procedure, Builder parent)
|
||||
class DillMethodBuilder extends DillProcedureBuilder {
|
||||
DillMethodBuilder(Procedure procedure, Builder parent)
|
||||
: assert(procedure.kind == ProcedureKind.Method),
|
||||
super(procedure, parent);
|
||||
|
||||
@@ -184,10 +182,8 @@ class DillMethodBuilder extends DillMemberBuilder {
|
||||
Member get invokeTarget => procedure;
|
||||
}
|
||||
|
||||
class DillOperatorBuilder extends DillMemberBuilder {
|
||||
final Procedure procedure;
|
||||
|
||||
DillOperatorBuilder(this.procedure, Builder parent)
|
||||
class DillOperatorBuilder extends DillProcedureBuilder {
|
||||
DillOperatorBuilder(Procedure procedure, Builder parent)
|
||||
: assert(procedure.kind == ProcedureKind.Operator),
|
||||
super(procedure, parent);
|
||||
|
||||
@@ -204,11 +200,10 @@ class DillOperatorBuilder extends DillMemberBuilder {
|
||||
Member get invokeTarget => procedure;
|
||||
}
|
||||
|
||||
class DillFactoryBuilder extends DillMemberBuilder {
|
||||
final Procedure procedure;
|
||||
class DillFactoryBuilder extends DillProcedureBuilder {
|
||||
final Procedure? _factoryTearOff;
|
||||
|
||||
DillFactoryBuilder(this.procedure, this._factoryTearOff, Builder parent)
|
||||
DillFactoryBuilder(Procedure procedure, this._factoryTearOff, Builder parent)
|
||||
: super(procedure, parent);
|
||||
|
||||
@override
|
||||
|
||||
@@ -40,7 +40,6 @@ import '../builder/type_variable_builder.dart';
|
||||
import '../builder/void_type_declaration_builder.dart';
|
||||
import '../compiler_context.dart' show CompilerContext;
|
||||
import '../crash.dart' show withCrashReporting;
|
||||
import '../dill/dill_member_builder.dart' show DillMemberBuilder;
|
||||
import '../dill/dill_target.dart' show DillTarget;
|
||||
import '../kernel/constructor_tearoff_lowering.dart';
|
||||
import '../loader.dart' show Loader;
|
||||
@@ -517,11 +516,7 @@ class KernelTarget extends TargetImplementation {
|
||||
declaration = problem.getFirstDeclaration();
|
||||
}
|
||||
if (declaration is ProcedureBuilder) {
|
||||
mainReference = declaration.actualProcedure.reference;
|
||||
} else if (declaration is DillMemberBuilder) {
|
||||
if (declaration.member is Procedure) {
|
||||
mainReference = declaration.member.reference;
|
||||
}
|
||||
mainReference = declaration.procedure.reference;
|
||||
}
|
||||
}
|
||||
component.setMainMethodAndMode(mainReference, true, compiledMode);
|
||||
|
||||
@@ -569,7 +569,7 @@ class SourceClassBuilder extends ClassBuilderImpl
|
||||
} else {
|
||||
assert(
|
||||
// This is a synthesized constructor.
|
||||
builder is DillConstructorBuilder,
|
||||
builder is SyntheticSourceConstructorBuilder,
|
||||
"Unexpected constructor: $builder.");
|
||||
}
|
||||
}, includeInjectedConstructors: true);
|
||||
|
||||
@@ -245,8 +245,7 @@ class DeclaredSourceConstructorBuilder extends SourceFunctionBuilderImpl
|
||||
_hasFormalsInferred = true;
|
||||
}
|
||||
|
||||
/* ConstructorBuilder | DillConstructorBuilder */
|
||||
Object? _computeSuperTargetBuilder() {
|
||||
ConstructorBuilder? _computeSuperTargetBuilder() {
|
||||
Constructor superTarget;
|
||||
ClassBuilder superclassBuilder;
|
||||
|
||||
@@ -280,8 +279,6 @@ class DeclaredSourceConstructorBuilder extends SourceFunctionBuilderImpl
|
||||
.lookup("", charOffset, library.fileUri);
|
||||
if (memberBuilder is ConstructorBuilder) {
|
||||
superTarget = memberBuilder.constructor;
|
||||
} else if (memberBuilder is DillConstructorBuilder) {
|
||||
superTarget = memberBuilder.constructor;
|
||||
} else {
|
||||
// The error in this case should be reported elsewhere.
|
||||
return null;
|
||||
@@ -291,10 +288,7 @@ class DeclaredSourceConstructorBuilder extends SourceFunctionBuilderImpl
|
||||
MemberBuilder? constructorBuilder =
|
||||
superclassBuilder.findConstructorOrFactory(
|
||||
superTarget.name.text, charOffset, library.fileUri, library);
|
||||
return constructorBuilder is ConstructorBuilder ||
|
||||
constructorBuilder is DillConstructorBuilder
|
||||
? constructorBuilder
|
||||
: null;
|
||||
return constructorBuilder is ConstructorBuilder ? constructorBuilder : null;
|
||||
}
|
||||
|
||||
void finalizeSuperInitializingFormals(ClassHierarchy classHierarchy,
|
||||
@@ -310,7 +304,7 @@ class DeclaredSourceConstructorBuilder extends SourceFunctionBuilderImpl
|
||||
}
|
||||
}
|
||||
|
||||
Object? superTargetBuilder = _computeSuperTargetBuilder();
|
||||
ConstructorBuilder? superTargetBuilder = _computeSuperTargetBuilder();
|
||||
Constructor superTarget;
|
||||
List<FormalParameterBuilder>? superFormals;
|
||||
if (superTargetBuilder is DeclaredSourceConstructorBuilder) {
|
||||
@@ -459,7 +453,7 @@ class DeclaredSourceConstructorBuilder extends SourceFunctionBuilderImpl
|
||||
|
||||
void addSuperParameterDefaultValueCloners(
|
||||
List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
|
||||
Object? superTargetBuilder = _computeSuperTargetBuilder();
|
||||
ConstructorBuilder? superTargetBuilder = _computeSuperTargetBuilder();
|
||||
if (superTargetBuilder is DeclaredSourceConstructorBuilder) {
|
||||
superTargetBuilder
|
||||
.addSuperParameterDefaultValueCloners(synthesizedFunctionNodes);
|
||||
|
||||
@@ -24,10 +24,8 @@ import 'source_member_builder.dart';
|
||||
|
||||
class SourceProcedureBuilder extends SourceFunctionBuilderImpl
|
||||
implements ProcedureBuilder {
|
||||
@override
|
||||
final int charOpenParenOffset;
|
||||
|
||||
@override
|
||||
AsyncMarker actualAsyncModifier = AsyncMarker.Sync;
|
||||
|
||||
@override
|
||||
@@ -106,7 +104,6 @@ class SourceProcedureBuilder extends SourceFunctionBuilderImpl
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
ProcedureBuilder? get patchForTesting =>
|
||||
dataForTesting?.patchForTesting as ProcedureBuilder?;
|
||||
|
||||
@@ -121,14 +118,12 @@ class SourceProcedureBuilder extends SourceFunctionBuilderImpl
|
||||
return bodyInternal;
|
||||
}
|
||||
|
||||
@override
|
||||
void set asyncModifier(AsyncMarker newModifier) {
|
||||
actualAsyncModifier = newModifier;
|
||||
function.asyncMarker = actualAsyncModifier;
|
||||
function.dartAsyncMarker = actualAsyncModifier;
|
||||
}
|
||||
|
||||
@override
|
||||
bool get isEligibleForTopLevelInference {
|
||||
if (isDeclarationInstanceMember) {
|
||||
if (returnType == null) return true;
|
||||
@@ -141,7 +136,6 @@ class SourceProcedureBuilder extends SourceFunctionBuilderImpl
|
||||
return false;
|
||||
}
|
||||
|
||||
@override
|
||||
bool get isExtensionMethod {
|
||||
return parent is ExtensionBuilder;
|
||||
}
|
||||
@@ -155,7 +149,6 @@ class SourceProcedureBuilder extends SourceFunctionBuilderImpl
|
||||
@override
|
||||
Procedure get procedure => isPatch ? origin.procedure : _procedure;
|
||||
|
||||
@override
|
||||
Procedure get actualProcedure => _procedure;
|
||||
|
||||
@override
|
||||
|
||||
Reference in New Issue
Block a user