Skip to content

Commit b9828b5

Browse files
johnniwinthercommit-bot@chromium.org
authored andcommitted
[cfe] Merge KernelFormalParameterBuilder into FormalParameterBuilder
Change-Id: I1904b14aa78f7cbadf61a3542e5146c4c7bf4a07 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/109961 Reviewed-by: Dan Rubel <[email protected]>
1 parent 58453dc commit b9828b5

13 files changed

+181
-209
lines changed

pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart

Lines changed: 121 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,58 @@ import '../parser/formal_parameter_kind.dart'
1515
import 'builder.dart'
1616
show LibraryBuilder, MetadataBuilder, ModifierBuilder, TypeBuilder;
1717

18-
abstract class FormalParameterBuilder<T extends TypeBuilder>
19-
extends ModifierBuilder {
18+
import 'package:kernel/ast.dart' show VariableDeclaration;
19+
20+
import '../constant_context.dart' show ConstantContext;
21+
22+
import '../modifier.dart' show finalMask, initializingFormalMask;
23+
24+
import '../scanner.dart' show Token;
25+
26+
import '../scope.dart' show Scope;
27+
28+
import '../source/source_loader.dart' show SourceLoader;
29+
30+
import '../kernel/body_builder.dart' show BodyBuilder;
31+
32+
import '../kernel/kernel_builder.dart'
33+
show
34+
ClassBuilder,
35+
Declaration,
36+
KernelConstructorBuilder,
37+
KernelFieldBuilder,
38+
KernelLibraryBuilder,
39+
LibraryBuilder,
40+
MetadataBuilder,
41+
TypeBuilder;
42+
43+
import '../kernel/kernel_shadow_ast.dart' show VariableDeclarationJudgment;
44+
45+
/// A builder for a formal parameter, i.e. a parameter on a method or
46+
/// constructor.
47+
class FormalParameterBuilder extends ModifierBuilder {
48+
/// List of metadata builders for the metadata declared on this parameter.
2049
final List<MetadataBuilder> metadata;
2150

2251
final int modifiers;
2352

24-
final T type;
53+
final TypeBuilder type;
2554

2655
final String name;
2756

57+
/// The kind of this parameter, i.e. if it's required, positional optional,
58+
/// or named optional.
2859
FormalParameterKind kind = FormalParameterKind.mandatory;
2960

61+
/// The variable declaration created for this formal parameter.
62+
VariableDeclaration declaration;
63+
64+
/// The first token of the default value, if any.
65+
///
66+
/// This is stored until outlines have been built through
67+
/// [buildOutlineExpressions].
68+
Token initializerToken;
69+
3070
FormalParameterBuilder(this.metadata, this.modifiers, this.type, this.name,
3171
LibraryBuilder compilationUnit, int charOffset)
3272
: super(compilationUnit, charOffset);
@@ -49,7 +89,83 @@ abstract class FormalParameterBuilder<T extends TypeBuilder>
4989
@override
5090
String get fullNameForErrors => name;
5191

52-
FormalParameterBuilder forFormalParameterInitializerScope();
92+
VariableDeclaration get target => declaration;
93+
94+
VariableDeclaration build(
95+
KernelLibraryBuilder library, int functionNestingLevel) {
96+
if (declaration == null) {
97+
declaration = new VariableDeclarationJudgment(name, functionNestingLevel,
98+
type: type?.build(library),
99+
isFinal: isFinal,
100+
isConst: isConst,
101+
isFieldFormal: isInitializingFormal,
102+
isCovariant: isCovariant)
103+
..fileOffset = charOffset;
104+
}
105+
return declaration;
106+
}
53107

54-
void buildOutlineExpressions(LibraryBuilder library);
108+
FormalParameterBuilder clone(List<TypeBuilder> newTypes) {
109+
// TODO(dmitryas): It's not clear how [metadata] is used currently, and
110+
// how it should be cloned. Consider cloning it instead of reusing it.
111+
return new FormalParameterBuilder(
112+
metadata, modifiers, type?.clone(newTypes), name, parent, charOffset)
113+
..kind = kind;
114+
}
115+
116+
FormalParameterBuilder forFormalParameterInitializerScope() {
117+
assert(declaration != null);
118+
return !isInitializingFormal
119+
? this
120+
: (new FormalParameterBuilder(
121+
metadata,
122+
modifiers | finalMask | initializingFormalMask,
123+
type,
124+
name,
125+
null,
126+
charOffset)
127+
..parent = parent
128+
..declaration = declaration);
129+
}
130+
131+
void finalizeInitializingFormal() {
132+
Object cls = parent.parent;
133+
if (cls is ClassBuilder) {
134+
Declaration field = cls.scope.lookup(name, charOffset, fileUri);
135+
if (field is KernelFieldBuilder) {
136+
target.type = field.target.type;
137+
}
138+
}
139+
}
140+
141+
/// Builds the default value from this [initializerToken] if this is a
142+
/// formal parameter on a const constructor or instance method.
143+
void buildOutlineExpressions(LibraryBuilder library) {
144+
// For modular compilation we need to include initializers for optional
145+
// and named parameters of const constructors into the outline - to enable
146+
// constant evaluation. Similarly we need to include initializers for
147+
// optional and named parameters of instance methods because these might be
148+
// needed to generated noSuchMethod forwarders.
149+
final bool isConstConstructorParameter =
150+
(parent is KernelConstructorBuilder && parent.target.isConst);
151+
if ((isConstConstructorParameter || parent.isInstanceMember) &&
152+
initializerToken != null) {
153+
final ClassBuilder classBuilder = parent.parent;
154+
Scope scope = classBuilder.scope;
155+
BodyBuilder bodyBuilder = new BodyBuilder.forOutlineExpression(
156+
library, classBuilder, this, scope, fileUri);
157+
bodyBuilder.constantContext = ConstantContext.required;
158+
target.initializer = bodyBuilder.parseFieldInitializer(initializerToken)
159+
..parent = target;
160+
bodyBuilder.typeInferrer?.inferParameterInitializer(
161+
bodyBuilder, target.initializer, target.type);
162+
if (library.loader is SourceLoader) {
163+
SourceLoader loader = library.loader;
164+
loader.transformPostInference(target, bodyBuilder.transformSetLiterals,
165+
bodyBuilder.transformCollections);
166+
}
167+
bodyBuilder.resolveRedirectingFactoryTargets();
168+
}
169+
initializerToken = null;
170+
}
55171
}

pkg/front_end/lib/src/fasta/builder/function_type_builder.dart

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import '../problems.dart' show unsupported;
2424
import '../kernel/kernel_builder.dart'
2525
show
2626
FormalParameterBuilder,
27-
KernelFormalParameterBuilder,
2827
KernelTypeVariableBuilder,
2928
LibraryBuilder,
3029
TypeBuilder,
@@ -33,7 +32,7 @@ import '../kernel/kernel_builder.dart'
3332
class FunctionTypeBuilder extends TypeBuilder {
3433
final TypeBuilder returnType;
3534
final List<TypeVariableBuilder> typeVariables;
36-
final List<FormalParameterBuilder<TypeBuilder>> formals;
35+
final List<FormalParameterBuilder> formals;
3736

3837
FunctionTypeBuilder(this.returnType, this.typeVariables, this.formals);
3938

@@ -82,7 +81,7 @@ class FunctionTypeBuilder extends TypeBuilder {
8281
List<NamedType> namedParameters;
8382
int requiredParameterCount = 0;
8483
if (formals != null) {
85-
for (KernelFormalParameterBuilder formal in formals) {
84+
for (FormalParameterBuilder formal in formals) {
8685
DartType type = formal.type?.build(library) ?? const DynamicType();
8786
if (formal.isPositional) {
8887
positionalParameters.add(type);
@@ -139,7 +138,7 @@ class FunctionTypeBuilder extends TypeBuilder {
139138
if (formals != null) {
140139
clonedFormals = new List<FormalParameterBuilder>(formals.length);
141140
for (int i = 0; i < clonedFormals.length; i++) {
142-
KernelFormalParameterBuilder formal = formals[i];
141+
FormalParameterBuilder formal = formals[i];
143142
clonedFormals[i] = formal.clone(newTypes);
144143
}
145144
}

pkg/front_end/lib/src/fasta/kernel/body_builder.dart

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -673,7 +673,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
673673
if (member is KernelConstructorBuilder) {
674674
member.prepareInitializers();
675675
if (member.formals != null) {
676-
for (KernelFormalParameterBuilder formal in member.formals) {
676+
for (FormalParameterBuilder formal in member.formals) {
677677
if (formal.isInitializingFormal) {
678678
Initializer initializer;
679679
if (member.isExternal) {
@@ -784,7 +784,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
784784
KernelFunctionBuilder builder = member;
785785
if (formals?.parameters != null) {
786786
for (int i = 0; i < formals.parameters.length; i++) {
787-
KernelFormalParameterBuilder parameter = formals.parameters[i];
787+
FormalParameterBuilder parameter = formals.parameters[i];
788788
Expression initializer = parameter.target.initializer;
789789
if (parameter.isOptional || initializer != null) {
790790
VariableDeclaration realParameter = builder.formals[i].target;
@@ -887,7 +887,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
887887
// Illegal parameters were removed by the function builder.
888888
// Add them as local variable to put them in scope of the body.
889889
List<Statement> statements = <Statement>[];
890-
for (KernelFormalParameterBuilder parameter in builder.formals) {
890+
for (FormalParameterBuilder parameter in builder.formals) {
891891
statements.add(parameter.target);
892892
}
893893
statements.add(body);
@@ -1169,14 +1169,14 @@ class BodyBuilder extends ScopeListener<JumpTarget>
11691169
}
11701170
enterFunctionTypeScope(typeParameterBuilders);
11711171

1172-
List<KernelFormalParameterBuilder> formals =
1172+
List<FormalParameterBuilder> formals =
11731173
parameters.positionalParameters.length == 0
11741174
? null
1175-
: new List<KernelFormalParameterBuilder>(
1175+
: new List<FormalParameterBuilder>(
11761176
parameters.positionalParameters.length);
11771177
for (int i = 0; i < parameters.positionalParameters.length; i++) {
11781178
VariableDeclaration formal = parameters.positionalParameters[i];
1179-
formals[i] = new KernelFormalParameterBuilder(
1179+
formals[i] = new FormalParameterBuilder(
11801180
null, 0, null, formal.name, library, formal.fileOffset)
11811181
..declaration = formal;
11821182
}
@@ -3005,7 +3005,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
30053005
return;
30063006
}
30073007
Identifier name = nameNode;
3008-
KernelFormalParameterBuilder parameter;
3008+
FormalParameterBuilder parameter;
30093009
if (!inCatchClause &&
30103010
functionNestingLevel == 0 &&
30113011
memberKind != MemberKind.GeneralizedFunctionType) {
@@ -3016,8 +3016,8 @@ class BodyBuilder extends ScopeListener<JumpTarget>
30163016
return;
30173017
}
30183018
} else {
3019-
parameter = new KernelFormalParameterBuilder(null, modifiers,
3020-
type?.builder, name?.name, library, offsetForToken(nameToken));
3019+
parameter = new FormalParameterBuilder(null, modifiers, type?.builder,
3020+
name?.name, library, offsetForToken(nameToken));
30213021
}
30223022
VariableDeclaration variable =
30233023
parameter.build(library, functionNestingLevel);
@@ -3058,13 +3058,12 @@ class BodyBuilder extends ScopeListener<JumpTarget>
30583058
// 0. It might be simpler if the parser didn't call this method in that
30593059
// case, however, then [beginOptionalFormalParameters] wouldn't always be
30603060
// matched by this method.
3061-
List<KernelFormalParameterBuilder> parameters =
3062-
const FixedNullableList<KernelFormalParameterBuilder>()
3063-
.pop(stack, count);
3061+
List<FormalParameterBuilder> parameters =
3062+
const FixedNullableList<FormalParameterBuilder>().pop(stack, count);
30643063
if (parameters == null) {
30653064
push(new ParserRecovery(offsetForToken(beginToken)));
30663065
} else {
3067-
for (KernelFormalParameterBuilder parameter in parameters) {
3066+
for (FormalParameterBuilder parameter in parameters) {
30683067
parameter.kind = kind;
30693068
}
30703069
push(parameters);
@@ -3135,15 +3134,15 @@ class BodyBuilder extends ScopeListener<JumpTarget>
31353134
void endFormalParameters(
31363135
int count, Token beginToken, Token endToken, MemberKind kind) {
31373136
debugEvent("FormalParameters");
3138-
List<KernelFormalParameterBuilder> optionals;
3137+
List<FormalParameterBuilder> optionals;
31393138
int optionalsCount = 0;
3140-
if (count > 0 && peek() is List<KernelFormalParameterBuilder>) {
3139+
if (count > 0 && peek() is List<FormalParameterBuilder>) {
31413140
optionals = pop();
31423141
count--;
31433142
optionalsCount = optionals.length;
31443143
}
3145-
List<KernelFormalParameterBuilder> parameters =
3146-
const FixedNullableList<KernelFormalParameterBuilder>()
3144+
List<FormalParameterBuilder> parameters =
3145+
const FixedNullableList<FormalParameterBuilder>()
31473146
.popPadded(stack, count, optionalsCount);
31483147
if (optionals != null && parameters != null) {
31493148
parameters.setRange(count, count + optionalsCount, optionals);
@@ -3187,8 +3186,8 @@ class BodyBuilder extends ScopeListener<JumpTarget>
31873186
FormalParameters catchParameters = popIfNotNull(catchKeyword);
31883187
DartType exceptionType =
31893188
buildDartType(popIfNotNull(onKeyword)) ?? const DynamicType();
3190-
KernelFormalParameterBuilder exception;
3191-
KernelFormalParameterBuilder stackTrace;
3189+
FormalParameterBuilder exception;
3190+
FormalParameterBuilder stackTrace;
31923191
List<Statement> compileTimeErrors;
31933192
if (catchParameters?.parameters != null) {
31943193
int parameterCount = catchParameters.parameters.length;
@@ -3205,8 +3204,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
32053204
// If parameterCount is 0, the parser reported an error already.
32063205
if (parameterCount != 0) {
32073206
for (int i = 2; i < parameterCount; i++) {
3208-
KernelFormalParameterBuilder parameter =
3209-
catchParameters.parameters[i];
3207+
FormalParameterBuilder parameter = catchParameters.parameters[i];
32103208
compileTimeErrors ??= <Statement>[];
32113209
compileTimeErrors.add(buildProblemStatement(
32123210
fasta.messageCatchSyntaxExtraParameters, parameter.charOffset,
@@ -5628,7 +5626,7 @@ class LabelTarget extends Declaration implements JumpTarget {
56285626
}
56295627

56305628
class FormalParameters {
5631-
final List<KernelFormalParameterBuilder> parameters;
5629+
final List<FormalParameterBuilder> parameters;
56325630
final int charOffset;
56335631
final int length;
56345632
final Uri uri;
@@ -5651,7 +5649,7 @@ class FormalParameters {
56515649
List<VariableDeclaration> positionalParameters = <VariableDeclaration>[];
56525650
List<VariableDeclaration> namedParameters = <VariableDeclaration>[];
56535651
if (parameters != null) {
5654-
for (KernelFormalParameterBuilder parameter in parameters) {
5652+
for (FormalParameterBuilder parameter in parameters) {
56555653
if (parameter.isNamed) {
56565654
namedParameters.add(parameter.target);
56575655
} else {
@@ -5689,7 +5687,7 @@ class FormalParameters {
56895687
assert(parameters.isNotEmpty);
56905688
Map<String, Declaration> local = <String, Declaration>{};
56915689

5692-
for (KernelFormalParameterBuilder parameter in parameters) {
5690+
for (FormalParameterBuilder parameter in parameters) {
56935691
Declaration existing = local[parameter.name];
56945692
if (existing != null) {
56955693
helper.reportDuplicatedDeclaration(

pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -745,7 +745,7 @@ class ClassHierarchyNodeBuilder {
745745
bType = substitution.substituteType(bType);
746746
}
747747
if (aType != bType) {
748-
FormalParameterBuilder<TypeBuilder> parameter;
748+
FormalParameterBuilder parameter;
749749
for (int i = aPositional.length; i < a.formals.length; ++i) {
750750
if (a.formals[i].name == name) {
751751
parameter = a.formals[i];
@@ -2482,7 +2482,7 @@ bool isAbstract(Declaration declaration) {
24822482
bool inferParameterType(
24832483
KernelClassBuilder cls,
24842484
KernelProcedureBuilder member,
2485-
FormalParameterBuilder<TypeBuilder> parameter,
2485+
FormalParameterBuilder parameter,
24862486
DartType type,
24872487
bool hadTypesInferred,
24882488
ClassHierarchyBuilder hierarchy) {
@@ -2499,11 +2499,8 @@ bool inferParameterType(
24992499
return result;
25002500
}
25012501

2502-
void reportCantInferParameterType(
2503-
KernelClassBuilder cls,
2504-
MemberBuilder member,
2505-
FormalParameterBuilder<TypeBuilder> parameter,
2506-
ClassHierarchyBuilder hierarchy) {
2502+
void reportCantInferParameterType(KernelClassBuilder cls, MemberBuilder member,
2503+
FormalParameterBuilder parameter, ClassHierarchyBuilder hierarchy) {
25072504
String name = parameter.name;
25082505
cls.addProblem(
25092506
templateCantInferTypeDueToInconsistentOverrides.withArguments(name),

pkg/front_end/lib/src/fasta/kernel/kernel_builder.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ export 'kernel_enum_builder.dart' show KernelEnumBuilder;
2727

2828
export 'kernel_field_builder.dart' show KernelFieldBuilder;
2929

30-
export 'kernel_formal_parameter_builder.dart' show KernelFormalParameterBuilder;
31-
3230
export 'kernel_invalid_type_builder.dart' show KernelInvalidTypeBuilder;
3331

3432
export 'kernel_library_builder.dart' show KernelLibraryBuilder;

pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ import 'kernel_builder.dart'
5353
KernelClassBuilder,
5454
KernelConstructorBuilder,
5555
KernelFieldBuilder,
56-
KernelFormalParameterBuilder,
5756
KernelLibraryBuilder,
5857
NamedTypeBuilder,
5958
KernelProcedureBuilder,
@@ -141,10 +140,10 @@ class KernelEnumBuilder extends SourceClassBuilder
141140
"",
142141
null,
143142
<FormalParameterBuilder>[
144-
new KernelFormalParameterBuilder(null, initializingFormalMask,
145-
intType, "index", parent, charOffset),
146-
new KernelFormalParameterBuilder(null, initializingFormalMask,
147-
stringType, "_name", parent, charOffset)
143+
new FormalParameterBuilder(null, initializingFormalMask, intType,
144+
"index", parent, charOffset),
145+
new FormalParameterBuilder(null, initializingFormalMask, stringType,
146+
"_name", parent, charOffset)
148147
],
149148
parent,
150149
charOffset,

0 commit comments

Comments
 (0)