Skip to content

Commit ef73551

Browse files
johnniwintherCommit Queue
authored andcommitted
[cfe] Add Resolver
This adds a Resolver class that encapsulates all use of the BodyBuilder. Furthermore, the external interface of BodyBuilder is extracted into the BodyBuilder interface and the BodyBuilderImpl implementation. This is a step towards separating the BodyBuilder from the TypeInferrer. In future CLs the inferrer will be removed from BodyBuilder and Resolved will be responsible for first calling the BodyBuilder to create the uninferred AST nodes and then call the TypeInferrer to created the inferred and lowered AST nodes. Change-Id: I198e2a65400555878d7b6c330fc6ef23be88851d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/449321 Reviewed-by: Jens Johansen <[email protected]> Commit-Queue: Johnni Winther <[email protected]>
1 parent 4df2a95 commit ef73551

37 files changed

+1328
-802
lines changed

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

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,12 @@ import 'package:kernel/ast.dart'
1515
VariableDeclaration;
1616
import 'package:kernel/class_hierarchy.dart';
1717

18-
import '../base/constant_context.dart' show ConstantContext;
1918
import '../base/lookup_result.dart';
2019
import '../base/modifiers.dart';
2120
import '../base/scope.dart' show LookupScope;
22-
import '../kernel/body_builder.dart' show BodyBuilder;
2321
import '../kernel/body_builder_context.dart';
2422
import '../kernel/internal_ast.dart' show VariableDeclarationImpl;
23+
import '../kernel/resolver.dart';
2524
import '../kernel/wildcard_lowering.dart';
2625
import '../source/fragment_factory.dart';
2726
import '../source/source_constructor_builder.dart';
@@ -296,32 +295,22 @@ class FormalParameterBuilder extends NamedBuilderImpl
296295
declarationBuilder,
297296
this,
298297
);
299-
BodyBuilder bodyBuilder = libraryBuilder.loader
300-
.createBodyBuilderForOutlineExpression(
301-
libraryBuilder,
302-
bodyBuilderContext,
303-
scope,
304-
fileUri,
305-
);
306-
ConstantContext constantContext = ConstantContext.required;
307-
bodyBuilder.constantContext = constantContext;
308298
assert(!initializerWasInferred);
309-
Expression initializer = bodyBuilder.parseFieldInitializer(
310-
initializerToken!,
311-
);
312-
initializer = bodyBuilder.typeInferrer.inferParameterInitializer(
299+
Resolver resolver = libraryBuilder.loader.createResolver();
300+
Expression initializer = resolver.buildParameterInitializer(
301+
libraryBuilder: libraryBuilder,
302+
bodyBuilderContext: bodyBuilderContext,
303+
scope: scope,
313304
fileUri: fileUri,
314-
initializer: initializer,
305+
initializerToken: initializerToken!,
315306
declaredType: variable!.type,
316307
hasDeclaredInitializer: hasDeclaredInitializer,
317-
constantContext: constantContext,
318308
);
319309
variable!.initializer = initializer..parent = variable;
320310
if (initializer is InvalidExpression) {
321311
variable!.isErroneouslyInitialized = true;
322312
}
323313
initializerWasInferred = true;
324-
bodyBuilder.performBacklogComputations();
325314
} else if (kind.isOptional) {
326315
// As done by BodyBuilder.endFormalParameter.
327316
variable!.initializer = new NullLiteral()..parent = variable;

pkg/front_end/lib/src/builder/metadata_builder.dart

Lines changed: 36 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,29 @@ import 'package:kernel/clone.dart';
99

1010
import '../base/loader.dart';
1111
import '../base/scope.dart' show LookupScope;
12-
import '../kernel/body_builder.dart' show BodyBuilder;
1312
import '../kernel/body_builder_context.dart';
1413
import '../kernel/macro/metadata.dart';
1514
import '../source/source_library_builder.dart' show SourceLibraryBuilder;
1615

1716
bool computeSharedExpressionForTesting = false;
1817
bool delaySharedExpressionLookupForTesting = false;
1918

19+
class Annotation {
20+
final MetadataBuilder metadataBuilder;
21+
22+
final Token atToken;
23+
final bool createFileUriExpression;
24+
25+
Annotation(
26+
this.metadataBuilder,
27+
this.atToken, {
28+
required this.createFileUriExpression,
29+
});
30+
31+
late int annotationIndex;
32+
late Expression expression;
33+
}
34+
2035
class MetadataBuilder {
2136
/// Token for `@` for annotations that have not yet been parsed.
2237
Token? _atToken;
@@ -56,30 +71,23 @@ class MetadataBuilder {
5671
required Annotatable annotatable,
5772
required Uri annotatableFileUri,
5873
required List<MetadataBuilder>? metadata,
74+
required Uri annotationsFileUri,
5975
required BodyBuilderContext bodyBuilderContext,
6076
required SourceLibraryBuilder libraryBuilder,
6177
required LookupScope scope,
6278
}) {
6379
if (metadata == null) return;
6480

65-
// [BodyBuilder] used to build annotations from [Token]s.
66-
BodyBuilder? bodyBuilder;
6781
// Cloner used to clone already parsed annotations.
6882
CloneVisitorNotMembers? cloner;
6983

70-
// Map from annotation builder of parsed annotations to the index of the
71-
// corresponding annotation in `parent.annotations`.
72-
//
73-
// This is used to read the fully inferred annotation from [parent] and
74-
// store it in `_expression` of the corresponding [MetadataBuilder].
75-
Map<MetadataBuilder, int> parsedAnnotationBuilders = {};
76-
77-
List<int> indicesOfAnnotationsToBeInferred = [];
84+
List<Annotation> annotations = [];
7885
for (int i = 0; i < metadata.length; ++i) {
7986
MetadataBuilder annotationBuilder = metadata[i];
8087
bool createFileUriExpression =
8188
annotatableFileUri != annotationBuilder.fileUri;
8289
Token? beginToken = annotationBuilder._atToken;
90+
annotationBuilder._atToken = null;
8391
if (beginToken != null) {
8492
if (computeSharedExpressionForTesting) {
8593
// Coverage-ignore-block(suite): Not run.
@@ -102,29 +110,13 @@ class MetadataBuilder {
102110
);
103111
}
104112
}
105-
106-
bodyBuilder ??= libraryBuilder.loader
107-
.createBodyBuilderForOutlineExpression(
108-
libraryBuilder,
109-
bodyBuilderContext,
110-
scope,
111-
annotationBuilder.fileUri,
112-
);
113-
Expression annotation = bodyBuilder.parseAnnotation(beginToken);
114-
annotationBuilder._atToken = null;
115-
if (createFileUriExpression) {
116-
annotation = new FileUriExpression(
117-
annotation,
118-
annotationBuilder.fileUri,
119-
)..fileOffset = annotationBuilder.atOffset;
120-
}
121-
// Record the index of [annotation] in `parent.annotations`.
122-
int annotationIndex = annotatable.annotations.length;
123-
parsedAnnotationBuilders[annotationBuilder] = annotationIndex;
124-
indicesOfAnnotationsToBeInferred.add(annotationIndex);
125-
// It is important for the inference and backlog computations that the
126-
// annotation is already a child of [parent].
127-
annotatable.addAnnotation(annotation);
113+
annotations.add(
114+
new Annotation(
115+
annotationBuilder,
116+
beginToken,
117+
createFileUriExpression: createFileUriExpression,
118+
),
119+
);
128120
} else {
129121
// The annotation is needed for multiple declarations so we need to
130122
// clone the expression to use it more than once. For instance
@@ -157,19 +149,16 @@ class MetadataBuilder {
157149
annotatable.addAnnotation(annotation);
158150
}
159151
}
160-
if (bodyBuilder != null) {
161-
bodyBuilder.inferAnnotations(
162-
annotatable,
163-
annotatable.annotations,
164-
indices: indicesOfAnnotationsToBeInferred,
165-
);
166-
bodyBuilder.performBacklogComputations();
167-
for (MapEntry<MetadataBuilder, int> entry
168-
in parsedAnnotationBuilders.entries) {
169-
MetadataBuilder annotationBuilder = entry.key;
170-
int index = entry.value;
171-
annotationBuilder._expression = annotatable.annotations[index];
172-
}
152+
libraryBuilder.loader.createResolver().buildAnnotations(
153+
libraryBuilder: libraryBuilder,
154+
bodyBuilderContext: bodyBuilderContext,
155+
annotationsFileUri: annotationsFileUri,
156+
scope: scope,
157+
annotatable: annotatable,
158+
annotations: annotations,
159+
);
160+
for (Annotation annotation in annotations) {
161+
annotation.metadataBuilder._expression = annotation.expression;
173162
}
174163
}
175164
}

pkg/front_end/lib/src/fragment/class/declaration.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ class RegularClassDeclaration implements ClassDeclaration {
8181
annotatable: annotatable,
8282
annotatableFileUri: annotatableFileUri,
8383
metadata: _fragment.metadata,
84+
annotationsFileUri: _fragment.fileUri,
8485
bodyBuilderContext: bodyBuilderContext,
8586
libraryBuilder: libraryBuilder,
8687
scope: _fragment.enclosingScope,
@@ -147,6 +148,7 @@ class EnumDeclaration implements ClassDeclaration {
147148
annotatable: annotatable,
148149
annotatableFileUri: annotatableFileUri,
149150
metadata: _fragment.metadata,
151+
annotationsFileUri: _fragment.fileUri,
150152
bodyBuilderContext: bodyBuilderContext,
151153
libraryBuilder: libraryBuilder,
152154
scope: _fragment.enclosingScope,
@@ -214,6 +216,7 @@ class NamedMixinApplication implements ClassDeclaration {
214216
annotatable: annotatable,
215217
annotatableFileUri: annotatableFileUri,
216218
metadata: _fragment.metadata,
219+
annotationsFileUri: _fragment.fileUri,
217220
bodyBuilderContext: bodyBuilderContext,
218221
libraryBuilder: libraryBuilder,
219222
scope: _fragment.enclosingScope,
@@ -340,6 +343,7 @@ class MixinDeclaration implements ClassDeclaration {
340343
annotatable: annotatable,
341344
annotatableFileUri: annotatableFileUri,
342345
metadata: _fragment.metadata,
346+
annotationsFileUri: _fragment.fileUri,
343347
bodyBuilderContext: bodyBuilderContext,
344348
libraryBuilder: libraryBuilder,
345349
scope: _fragment.enclosingScope,

pkg/front_end/lib/src/fragment/constructor/declaration.dart

Lines changed: 20 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import 'package:kernel/class_hierarchy.dart';
99
import 'package:kernel/type_algebra.dart';
1010
import 'package:kernel/type_environment.dart';
1111

12-
import '../../base/constant_context.dart';
1312
import '../../base/identifiers.dart';
1413
import '../../base/local_scope.dart';
1514
import '../../base/messages.dart';
@@ -23,9 +22,9 @@ import '../../builder/metadata_builder.dart';
2322
import '../../builder/omitted_type_builder.dart';
2423
import '../../builder/type_builder.dart';
2524
import '../../builder/variable_builder.dart';
26-
import '../../kernel/body_builder.dart';
2725
import '../../kernel/body_builder_context.dart';
2826
import '../../kernel/kernel_helper.dart';
27+
import '../../kernel/resolver.dart';
2928
import '../../kernel/type_algorithms.dart';
3029
import '../../source/check_helper.dart';
3130
import '../../source/name_scheme.dart';
@@ -244,19 +243,14 @@ mixin _ConstructorDeclarationMixin
244243
List<Initializer>? initializers;
245244
Token? beginInitializers = this._beginInitializers;
246245
if (beginInitializers != null) {
247-
BodyBuilder bodyBuilder = libraryBuilder.loader
248-
.createBodyBuilderForOutlineExpression(
249-
libraryBuilder,
250-
createBodyBuilderContext(constructorBuilder),
251-
_typeParameterScope,
252-
fileUri,
253-
);
254-
if (isConst) {
255-
bodyBuilder.constantContext = ConstantContext.required;
256-
}
257-
initializers = bodyBuilder.parseInitializers(
258-
beginInitializers,
259-
doFinishConstructor: false,
246+
Resolver resolver = libraryBuilder.loader.createResolver();
247+
initializers = resolver.buildInitializersUnfinished(
248+
libraryBuilder: libraryBuilder,
249+
bodyBuilderContext: createBodyBuilderContext(constructorBuilder),
250+
typeParameterScope: _typeParameterScope,
251+
fileUri: fileUri,
252+
beginInitializers: beginInitializers,
253+
isConst: isConst,
260254
);
261255
}
262256
_finalizeSuperInitializingFormals(
@@ -575,23 +569,17 @@ mixin _ConstructorDeclarationMixin
575569
} else {
576570
formalParameterScope = null;
577571
}
578-
BodyBuilder bodyBuilder = libraryBuilder.loader
579-
.createBodyBuilderForOutlineExpression(
580-
libraryBuilder,
581-
createBodyBuilderContext(constructorBuilder),
582-
_typeParameterScope,
583-
fileUri,
584-
formalParameterScope: formalParameterScope,
585-
);
586-
if (isConst) {
587-
bodyBuilder.constantContext = ConstantContext.required;
588-
}
589-
constructorBuilder.inferFormalTypes(bodyBuilder.hierarchy);
590-
bodyBuilder.parseInitializers(
591-
_beginInitializers!,
592-
doFinishConstructor: isConst,
572+
Resolver resolver = libraryBuilder.loader.createResolver();
573+
resolver.buildInitializers(
574+
libraryBuilder: libraryBuilder,
575+
constructorBuilder: constructorBuilder,
576+
typeParameterScope: _typeParameterScope,
577+
formalParameterScope: formalParameterScope,
578+
bodyBuilderContext: createBodyBuilderContext(constructorBuilder),
579+
fileUri: fileUri,
580+
beginInitializers: _beginInitializers!,
581+
isConst: isConst,
593582
);
594-
bodyBuilder.performBacklogComputations();
595583
}
596584
}
597585

@@ -998,6 +986,7 @@ class RegularConstructorDeclaration
998986
annotatable: annotatable,
999987
annotatableFileUri: annotatablesFileUri,
1000988
metadata: _fragment.metadata,
989+
annotationsFileUri: _fragment.fileUri,
1001990
bodyBuilderContext: bodyBuilderContext,
1002991
libraryBuilder: libraryBuilder,
1003992
scope: _fragment.enclosingScope,

0 commit comments

Comments
 (0)