[cfe] Merge KernelBodyBuilder into BodyBuilder

Change-Id: Ica7d23a54659606ef8d01c647dc8d89f10796bb3
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/109712
Reviewed-by: Dan Rubel <danrubel@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
This commit is contained in:
Johnni Winther 2019-07-23 08:02:18 +00:00 committed by commit-bot@chromium.org
parent 05b5883813
commit 0177076f2f
9 changed files with 52 additions and 112 deletions

View file

@ -104,6 +104,8 @@ import 'expression_generator.dart'
import 'expression_generator_helper.dart' show ExpressionGeneratorHelper;
import 'fangorn.dart' show Fangorn;
import 'forest.dart' show Forest;
import 'implicit_type_argument.dart' show ImplicitTypeArgument;
@ -134,8 +136,10 @@ const noLocation = null;
// has been enabled by default.
const invalidCollectionElement = const Object();
abstract class BodyBuilder extends ScopeListener<JumpTarget>
class BodyBuilder extends ScopeListener<JumpTarget>
implements ExpressionGeneratorHelper, EnsureLoaded {
final Forest forest;
// TODO(ahe): Rename [library] to 'part'.
@override
final KernelLibraryBuilder library;
@ -277,7 +281,8 @@ abstract class BodyBuilder extends ScopeListener<JumpTarget>
this.isInstanceMember,
this.uri,
this.typeInferrer)
: enableNative =
: forest = const Fangorn(),
enableNative =
library.loader.target.backendTarget.enableNative(library.uri),
stringExpectedAfterNative =
library.loader.target.backendTarget.nativeExtensionExpectsString,
@ -312,6 +317,25 @@ abstract class BodyBuilder extends ScopeListener<JumpTarget>
field.parent is KernelClassBuilder ? field.parent : null,
typeInferrer);
BodyBuilder.forOutlineExpression(
KernelLibraryBuilder library,
KernelClassBuilder classBuilder,
ModifierBuilder member,
Scope scope,
Uri fileUri)
: this(
library,
member,
scope,
null,
library.loader.hierarchy,
library.loader.coreTypes,
classBuilder,
member?.isInstanceMember ?? false,
fileUri,
library.loader.typeInferenceEngine?.createLocalTypeInferrer(
fileUri, classBuilder?.target?.thisType, library));
bool get inConstructor {
return functionNestingLevel == 0 && member is KernelConstructorBuilder;
}
@ -5358,9 +5382,11 @@ abstract class BodyBuilder extends ScopeListener<JumpTarget>
return new DeferredCheckJudgment(check, expression);
}
/// TODO(ahe): This method is temporarily implemented by subclasses. Once type
/// promotion is independent of shadow nodes, remove this method.
void enterThenForTypePromotion(Expression condition);
/// TODO(ahe): This method is temporarily implemented. Once type promotion is
/// independent of shadow nodes, remove this method.
void enterThenForTypePromotion(Expression condition) {
typePromoter?.enterThen(condition);
}
bool isErroneousNode(TreeNode node) {
return library.loader.handledErrors.isNotEmpty &&

View file

@ -1,69 +0,0 @@
// Copyright (c) 2018, 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 file.
library fasta.kernel_body_builder;
import 'package:kernel/ast.dart' show Expression;
import '../type_inference/type_inferrer.dart' show TypeInferrer;
import 'body_builder.dart' show BodyBuilder;
import 'fangorn.dart' show Fangorn;
import 'forest.dart' show Forest;
import 'kernel_api.dart' show ClassHierarchy, CoreTypes;
import 'kernel_builder.dart'
show KernelClassBuilder, KernelLibraryBuilder, ModifierBuilder, Scope;
class KernelBodyBuilder extends BodyBuilder {
@override
final Forest forest;
KernelBodyBuilder(
KernelLibraryBuilder library,
ModifierBuilder member,
Scope scope,
Scope formalParameterScope,
ClassHierarchy hierarchy,
CoreTypes coreTypes,
KernelClassBuilder classBuilder,
bool isInstanceMember,
Uri uri,
TypeInferrer typeInferrer)
: forest = const Fangorn(),
super(library, member, scope, formalParameterScope, hierarchy,
coreTypes, classBuilder, isInstanceMember, uri, typeInferrer);
KernelBodyBuilder.forField(ModifierBuilder member, TypeInferrer typeInferrer)
: forest = const Fangorn(),
super.forField(member, typeInferrer);
KernelBodyBuilder.forOutlineExpression(
KernelLibraryBuilder library,
KernelClassBuilder classBuilder,
ModifierBuilder member,
Scope scope,
Uri fileUri)
: forest = const Fangorn(),
super(
library,
member,
scope,
null,
library.loader.hierarchy,
library.loader.coreTypes,
classBuilder,
member?.isInstanceMember ?? false,
fileUri,
library.loader.typeInferenceEngine?.createLocalTypeInferrer(
fileUri, classBuilder?.target?.thisType, library));
@override
void enterThenForTypePromotion(Expression condition) {
typePromoter?.enterThen(condition);
}
}

View file

@ -29,7 +29,7 @@ import '../type_inference/type_inferrer.dart' show TypeInferrerImpl;
import '../type_inference/type_schema.dart' show UnknownType;
import 'kernel_body_builder.dart' show KernelBodyBuilder;
import 'body_builder.dart' show BodyBuilder;
import 'kernel_builder.dart'
show
@ -124,9 +124,8 @@ class KernelFieldBuilder extends FieldBuilder<Expression> {
classBuilder.hasConstConstructor)) &&
constInitializerToken != null) {
Scope scope = classBuilder?.scope ?? library.scope;
KernelBodyBuilder bodyBuilder =
new KernelBodyBuilder.forOutlineExpression(
library, classBuilder, this, scope, fileUri);
BodyBuilder bodyBuilder = new BodyBuilder.forOutlineExpression(
library, classBuilder, this, scope, fileUri);
bodyBuilder.constantContext =
isConst ? ConstantContext.inferred : ConstantContext.none;
initializer = bodyBuilder.parseFieldInitializer(constInitializerToken)
@ -172,8 +171,7 @@ class KernelFieldBuilder extends FieldBuilder<Expression> {
TypeInferrerImpl typeInferrer = library.loader.typeInferenceEngine
.createTopLevelTypeInferrer(
fileUri, field.enclosingClass?.thisType, null);
KernelBodyBuilder bodyBuilder =
new KernelBodyBuilder.forField(this, typeInferrer);
BodyBuilder bodyBuilder = new BodyBuilder.forField(this, typeInferrer);
bodyBuilder.constantContext =
isConst ? ConstantContext.inferred : ConstantContext.none;
initializer = bodyBuilder.parseFieldInitializer(type.initializerToken);

View file

@ -16,7 +16,7 @@ import '../scope.dart' show Scope;
import '../source/source_loader.dart' show SourceLoader;
import 'kernel_body_builder.dart' show KernelBodyBuilder;
import 'body_builder.dart' show BodyBuilder;
import 'kernel_builder.dart'
show
@ -109,9 +109,8 @@ class KernelFormalParameterBuilder extends FormalParameterBuilder<TypeBuilder> {
initializerToken != null) {
final ClassBuilder classBuilder = parent.parent;
Scope scope = classBuilder.scope;
KernelBodyBuilder bodyBuilder =
new KernelBodyBuilder.forOutlineExpression(
library, classBuilder, this, scope, fileUri);
BodyBuilder bodyBuilder = new BodyBuilder.forOutlineExpression(
library, classBuilder, this, scope, fileUri);
bodyBuilder.constantContext = ConstantContext.required;
target.initializer = bodyBuilder.parseFieldInitializer(initializerToken)
..parent = target;

View file

@ -6,7 +6,7 @@ library fasta.kernel_metadata_builder;
import 'package:kernel/ast.dart' show Annotatable, Class, Library;
import 'kernel_body_builder.dart' show KernelBodyBuilder;
import 'body_builder.dart' show BodyBuilder;
import 'kernel_builder.dart'
show
@ -37,7 +37,7 @@ class KernelMetadataBuilder extends MetadataBuilder {
Scope scope = parent is Library || parent is Class || classBuilder == null
? library.scope
: classBuilder.scope;
KernelBodyBuilder bodyBuilder = new KernelBodyBuilder.forOutlineExpression(
BodyBuilder bodyBuilder = new BodyBuilder.forOutlineExpression(
library, classBuilder, member, scope, fileUri);
for (int i = 0; i < metadata.length; ++i) {
KernelMetadataBuilder annotationBuilder = metadata[i];

View file

@ -62,7 +62,7 @@ import '../source/source_loader.dart' show SourceLoader;
import '../type_inference/type_inference_engine.dart'
show IncludesTypeParametersNonCovariantly, Variance;
import 'kernel_body_builder.dart' show KernelBodyBuilder;
import 'body_builder.dart' show BodyBuilder;
import 'kernel_builder.dart'
show
@ -520,9 +520,8 @@ class KernelConstructorBuilder extends KernelFunctionBuilder {
// for const constructors into the outline.
if (isConst && beginInitializers != null) {
ClassBuilder classBuilder = parent;
KernelBodyBuilder bodyBuilder =
new KernelBodyBuilder.forOutlineExpression(
library, classBuilder, this, classBuilder.scope, fileUri);
BodyBuilder bodyBuilder = new BodyBuilder.forOutlineExpression(
library, classBuilder, this, classBuilder.scope, fileUri);
bodyBuilder.constantContext = ConstantContext.inferred;
bodyBuilder.parseInitializers(beginInitializers);
if (library.loader is SourceLoader) {

View file

@ -37,7 +37,7 @@ import '../fasta_codes.dart'
import '../ignored_parser_errors.dart' show isIgnoredParserError;
import '../kernel/kernel_body_builder.dart' show KernelBodyBuilder;
import '../kernel/body_builder.dart' show BodyBuilder;
import '../kernel/kernel_builder.dart'
show KernelFormalParameterBuilder, KernelTypeAliasBuilder, TypeBuilder;
@ -619,17 +619,8 @@ class DietListener extends StackListener {
ConstantContext constantContext = builder.isConstructor && builder.isConst
? ConstantContext.inferred
: ConstantContext.none;
return new KernelBodyBuilder(
library,
builder,
memberScope,
formalParameterScope,
hierarchy,
coreTypes,
currentClass,
isInstanceMember,
uri,
typeInferrer)
return new BodyBuilder(library, builder, memberScope, formalParameterScope,
hierarchy, coreTypes, currentClass, isInstanceMember, uri, typeInferrer)
..constantContext = constantContext;
}

View file

@ -45,12 +45,9 @@ import 'package:front_end/src/fasta/kernel/kernel_target.dart'
import 'package:front_end/src/fasta/fasta_codes.dart'
show Message, templateUnspecified;
import 'package:front_end/src/fasta/kernel/expression_generator.dart' /*
show Generator*/
;
import 'package:front_end/src/fasta/kernel/expression_generator.dart';
import 'package:front_end/src/fasta/kernel/kernel_body_builder.dart'
show KernelBodyBuilder;
import 'package:front_end/src/fasta/kernel/body_builder.dart' show BodyBuilder;
import 'package:front_end/src/fasta/scanner.dart' show Token, scanString;
@ -98,7 +95,7 @@ main() {
new TypeParameter("T"), libraryBuilder);
VariableDeclaration variable = new VariableDeclaration(null);
KernelBodyBuilder helper = new KernelBodyBuilder(
BodyBuilder helper = new BodyBuilder(
libraryBuilder, null, null, null, null, null, null, false, uri, null);
Generator generator = new ThisAccessGenerator(helper, token, false, false);

View file

@ -21,8 +21,7 @@ import 'package:front_end/src/fasta/compiler_context.dart' show CompilerContext;
import 'package:front_end/src/fasta/dill/dill_target.dart' show DillTarget;
import 'package:front_end/src/fasta/kernel/kernel_body_builder.dart'
show KernelBodyBuilder;
import 'package:front_end/src/fasta/kernel/body_builder.dart' show BodyBuilder;
import 'package:front_end/src/fasta/kernel/kernel_builder.dart'
show KernelLibraryBuilder, KernelProcedureBuilder;
@ -61,7 +60,7 @@ class MockLibraryBuilder extends KernelLibraryBuilder {
}
}
class MockBodyBuilder extends KernelBodyBuilder {
class MockBodyBuilder extends BodyBuilder {
MockBodyBuilder.internal(
MockLibraryBuilder libraryBuilder, String name, Scope scope)
: super(libraryBuilder, libraryBuilder.mockProcedure(name), scope, scope,
@ -72,7 +71,7 @@ class MockBodyBuilder extends KernelBodyBuilder {
}
Expression compileExpression(String source) {
KernelBodyBuilder listener = new MockBodyBuilder(
BodyBuilder listener = new MockBodyBuilder(
Uri.parse("org-dartlang-test:my_library.dart"),
"<test>",
new UnlinkedScope());