diff --git a/pkg/front_end/lib/src/base/incremental_compiler.dart b/pkg/front_end/lib/src/base/incremental_compiler.dart index cd974d1fd21..7c7a9f3518f 100644 --- a/pkg/front_end/lib/src/base/incremental_compiler.dart +++ b/pkg/front_end/lib/src/base/incremental_compiler.dart @@ -54,8 +54,6 @@ import 'package:kernel/kernel.dart' TypeParameter, TypeParameterType, VariableDeclaration, - VariableGet, - VariableSet, VisitorDefault, VisitorVoidMixin; import 'package:kernel/kernel.dart' as kernel show Combinator; @@ -93,7 +91,12 @@ import '../dill/dill_target.dart' show DillTarget; import '../kernel/benchmarker.dart' show BenchmarkPhases, Benchmarker; import '../kernel/dart_scope_calculator.dart' show DartScope, DartScopeBuilder2; import '../kernel/hierarchy/hierarchy_builder.dart' show ClassHierarchyBuilder; -import '../kernel/internal_ast.dart' show VariableDeclarationImpl; +import '../kernel/internal_ast.dart' + show + VariableDeclarationImpl, + InternalVariableGet, + InternalVariableSet, + InternalVariable; import '../kernel/kernel_target.dart' show BuildResult, KernelTarget; import '../source/check_helper.dart'; import '../source/source_compilation_unit.dart' show SourceCompilationUnitImpl; @@ -2537,7 +2540,7 @@ class IncrementalCompiler implements IncrementalKernelGenerator { // Coverage-ignore(suite): Not run. class ExpressionEvaluationHelperImpl implements ExpressionEvaluationHelper { - final Set knownButUnavailable = {}; + final Set knownButUnavailable = {}; final ClassHierarchy hierarchy; ExpressionEvaluationHelperImpl( @@ -2555,8 +2558,8 @@ class ExpressionEvaluationHelperImpl implements ExpressionEvaluationHelper { } @override - ExpressionInferenceResult? visitVariableGet( - VariableGet node, + ExpressionInferenceResult? visitInternalVariableGet( + InternalVariableGet node, DartType typeContext, ProblemReporting problemReporting, CompilerContext compilerContext, @@ -2575,8 +2578,8 @@ class ExpressionEvaluationHelperImpl implements ExpressionEvaluationHelper { } @override - ExpressionInferenceResult? visitVariableSet( - VariableSet node, + ExpressionInferenceResult? visitInternalVariableSet( + InternalVariableSet node, DartType typeContext, ProblemReporting problemReporting, CompilerContext compilerContext, @@ -2596,7 +2599,7 @@ class ExpressionEvaluationHelperImpl implements ExpressionEvaluationHelper { ExpressionInferenceResult _returnKnownVariableUnavailable( Expression node, - VariableDeclaration variable, + InternalVariable variable, ProblemReporting problemReporting, CompilerContext compilerContext, Uri fileUri, diff --git a/pkg/front_end/lib/src/kernel/body_builder.dart b/pkg/front_end/lib/src/kernel/body_builder.dart index 5a165410283..7353b4f852b 100644 --- a/pkg/front_end/lib/src/kernel/body_builder.dart +++ b/pkg/front_end/lib/src/kernel/body_builder.dart @@ -1130,8 +1130,7 @@ class BodyBuilderImpl extends StackListenerImpl initializers = createFieldInitializer( formal.name, formal.fileOffset, - new VariableGet(formal.variable) - ..fileOffset = formal.fileOffset, + intern.createVariableGet(formal.fileOffset, formal.variable), formal: formal, ); } @@ -2522,9 +2521,12 @@ class BodyBuilderImpl extends StackListenerImpl /// Helper method to create a [VariableGet] of the [variable] using /// [charOffset] as the file offset. @override - VariableGet createVariableGet(VariableDeclaration variable, int charOffset) { + InternalVariableGet createVariableGet( + VariableDeclaration variable, + int charOffset, + ) { registerVariableRead(variable); - return new VariableGet(variable)..fileOffset = charOffset; + return intern.createVariableGet(charOffset, variable); } /// Helper method to create a [ReadOnlyAccessGenerator] on the [variable] @@ -3841,6 +3843,7 @@ class BodyBuilderImpl extends StackListenerImpl for (VariableDeclaration variable in pattern.declaredVariables) { variable.isFinal |= isFinal; + // TODO(johnniwinther): Can we avoid creating synthetic variables here? VariableDeclaration intermediateVariable = intern .createVariableDeclarationForValue( intern.createVariableGet(variable.fileOffset, variable), diff --git a/pkg/front_end/lib/src/kernel/expression_generator.dart b/pkg/front_end/lib/src/kernel/expression_generator.dart index 93168b392de..0a1f2e21156 100644 --- a/pkg/front_end/lib/src/kernel/expression_generator.dart +++ b/pkg/front_end/lib/src/kernel/expression_generator.dart @@ -479,7 +479,7 @@ class VariableUseGenerator extends Generator { Expression _createWrite(int offset, Expression value) { _checkAssignment(offset); _helper.registerVariableAssignment(variable); - return new VariableSet(variable, value)..fileOffset = offset; + return intern.createVariableSet(offset, variable, value); } @override diff --git a/pkg/front_end/lib/src/kernel/internal_ast.dart b/pkg/front_end/lib/src/kernel/internal_ast.dart index 9a1139500dc..d44dd0a4d6a 100644 --- a/pkg/front_end/lib/src/kernel/internal_ast.dart +++ b/pkg/front_end/lib/src/kernel/internal_ast.dart @@ -210,8 +210,9 @@ abstract class InternalExpression extends AuxiliaryExpression { unsupported("${runtimeType}.transformChildren", -1, null); @override - void transformOrRemoveChildren(RemovingTransformer v) => - unsupported("${runtimeType}.transformOrRemoveChildren", -1, null); + void transformOrRemoveChildren(RemovingTransformer v) { + unsupported("${runtimeType}.transformOrRemoveChildren", -1, null); + } ExpressionInferenceResult acceptInference( InferenceVisitorImpl visitor, @@ -1127,7 +1128,6 @@ class InternalLocalVariable extends TreeNode int fileEqualsOffset = TreeNode.noOffset; @override - // Coverage-ignore(suite): Not run. VariableDeclaration get variable => this; @override @@ -6524,3 +6524,61 @@ class InternalForInStatement extends InternalStatement return "$runtimeType(${toStringInternal()})"; } } + +class InternalVariableGet extends InternalExpression { + /// The target variable. + final InternalVariable variable; + + InternalVariableGet(this.variable); + + @override + ExpressionInferenceResult acceptInference( + InferenceVisitorImpl visitor, + DartType typeContext, + ) { + return visitor.visitInternalVariableGet(this, typeContext); + } + + @override + // Coverage-ignore(suite): Not run. + void toTextInternal(AstPrinter printer) { + printer.write(variable.cosmeticName ?? ''); + } + + @override + String toString() { + return "InternalVariableGet(${toStringInternal()})"; + } +} + +class InternalVariableSet extends InternalExpression { + /// The target variable. + final InternalVariable variable; + + Expression value; + + InternalVariableSet(this.variable, this.value) { + value.parent = this; + } + + @override + ExpressionInferenceResult acceptInference( + InferenceVisitorImpl visitor, + DartType typeContext, + ) { + return visitor.visitInternalVariableSet(this, typeContext); + } + + @override + // Coverage-ignore(suite): Not run. + void toTextInternal(AstPrinter printer) { + printer.write(variable.cosmeticName ?? ''); + printer.write(' = '); + printer.writeExpression(value); + } + + @override + String toString() { + return "InternalVariableSet(${toStringInternal()})"; + } +} diff --git a/pkg/front_end/lib/src/kernel/internal_ast_helper.dart b/pkg/front_end/lib/src/kernel/internal_ast_helper.dart index c28ee95280e..8516a856b16 100644 --- a/pkg/front_end/lib/src/kernel/internal_ast_helper.dart +++ b/pkg/front_end/lib/src/kernel/internal_ast_helper.dart @@ -838,8 +838,21 @@ IndexSet createIndexSet( )..fileOffset = fileOffset; } -VariableGet createVariableGet(int fileOffset, VariableDeclaration variable) { - return new VariableGet(variable)..fileOffset = fileOffset; +InternalVariableGet createVariableGet( + int fileOffset, + VariableDeclaration variable, +) { + return new InternalVariableGet(variable as InternalVariable) + ..fileOffset = fileOffset; +} + +InternalVariableSet createVariableSet( + int fileOffset, + VariableDeclaration variable, + Expression value, +) { + return new InternalVariableSet(variable as InternalVariable, value) + ..fileOffset = fileOffset; } EqualsExpression createEquals( diff --git a/pkg/front_end/lib/src/kernel/resolver.dart b/pkg/front_end/lib/src/kernel/resolver.dart index 50b1032e56e..0890e8e5f9c 100644 --- a/pkg/front_end/lib/src/kernel/resolver.dart +++ b/pkg/front_end/lib/src/kernel/resolver.dart @@ -1234,7 +1234,7 @@ class Resolver { /// Helper method to create a [VariableGet] of the [variable] using /// [fileOffset] as the file offset. - VariableGet _createVariableGet({ + Expression _createVariableGet({ required AssignedVariables assignedVariables, required InternalVariable variable, required int fileOffset, @@ -1242,8 +1242,10 @@ class Resolver { if (!variable.isLocalFunction && !variable.isWildcard) { assignedVariables.read(variable.astVariable); } - return new VariableGet(variable.asExpressionVariable) - ..fileOffset = fileOffset; + return intern.createVariableGet( + fileOffset, + variable as VariableDeclaration, + ); } void _declareFormals({ diff --git a/pkg/front_end/lib/src/kernel/resolver_helpers.dart b/pkg/front_end/lib/src/kernel/resolver_helpers.dart index 767a21b49f4..751d3853d09 100644 --- a/pkg/front_end/lib/src/kernel/resolver_helpers.dart +++ b/pkg/front_end/lib/src/kernel/resolver_helpers.dart @@ -300,10 +300,14 @@ class _InitializerBuilder { _bodyBuilderContext.formals!; ActualArguments arguments = initializer.arguments; List enumSyntheticArguments = [ - new VariableGet(formals[0].variable) - ..parent = initializer.arguments, - new VariableGet(formals[1].variable) - ..parent = initializer.arguments, + intern.createVariableGet( + formals[0].fileOffset, + formals[0].variable, + )..parent = initializer.arguments, + intern.createVariableGet( + formals[1].fileOffset, + formals[1].variable, + )..parent = initializer.arguments, ]; arguments.prependArguments([ new PositionalArgument(enumSyntheticArguments[0]), @@ -646,8 +650,14 @@ class _InitializerBuilder { formals[0].name == "#index" && formals[1].name == "#name", ); - Expression indexExpression = new VariableGet(formals[0].variable); - Expression nameExpression = new VariableGet(formals[1].variable); + Expression indexExpression = intern.createVariableGet( + formals[0].fileOffset, + formals[0].variable, + ); + Expression nameExpression = intern.createVariableGet( + formals[1].fileOffset, + formals[1].variable, + ); (argumentsOriginalOrder ??= []).insertAll(0, [ new PositionalArgument(indexExpression), new PositionalArgument(nameExpression), diff --git a/pkg/front_end/lib/src/type_inference/inference_visitor.dart b/pkg/front_end/lib/src/type_inference/inference_visitor.dart index 6f61cc2365a..eb85e71d815 100644 --- a/pkg/front_end/lib/src/type_inference/inference_visitor.dart +++ b/pkg/front_end/lib/src/type_inference/inference_visitor.dart @@ -4256,13 +4256,11 @@ class InferenceVisitorImpl extends InferenceVisitorBase Object? rewrite = popRewrite(NullValues.Expression); if (!identical(element.otherwise, rewrite)) { - // Coverage-ignore-block(suite): Not run. element.otherwise = (rewrite as Expression?)?..parent = element; } rewrite = popRewrite(); if (!identical(element.then, rewrite)) { - // Coverage-ignore-block(suite): Not run. element.then = (rewrite as Expression)..parent = element; } @@ -4293,7 +4291,6 @@ class InferenceVisitorImpl extends InferenceVisitorBase rewrite = popRewrite(); if (!identical(element.expression, rewrite)) { - // Coverage-ignore-block(suite): Not run. element.expression = (rewrite as Expression)..parent = patternGuard; } @@ -4359,7 +4356,16 @@ class InferenceVisitorImpl extends InferenceVisitorBase assert(declaredVariables.length == element.variableInitializations.length); for (int i = 0; i < declaredVariables.length; i++) { DartType type = declaredVariables[i].type; - element.intermediateVariables[i].type = type; + + VariableDeclaration intermediateVariable = + element.intermediateVariables[i]; + intermediateVariable.initializer = inferExpression( + intermediateVariable.initializer!, + type, + isVoidAllowed: true, + ).expression..parent = intermediateVariable; + intermediateVariable.type = type; + element.variableInitializations[i].type = type; } @@ -7422,7 +7428,6 @@ class InferenceVisitorImpl extends InferenceVisitorBase rewrite = popRewrite(); if (!identical(entry.expression, rewrite)) { - // Coverage-ignore-block(suite): Not run. entry.expression = (rewrite as Expression)..parent = patternGuard; } @@ -7482,7 +7487,15 @@ class InferenceVisitorImpl extends InferenceVisitorBase assert(declaredVariables.length == entry.variables.length); for (int i = 0; i < declaredVariables.length; i++) { DartType type = declaredVariables[i].type; - entry.intermediateVariables[i].type = type; + + VariableDeclaration intermediateVariable = entry.intermediateVariables[i]; + intermediateVariable.initializer = inferExpression( + intermediateVariable.initializer!, + type, + isVoidAllowed: true, + ).expression..parent = intermediateVariable; + intermediateVariable.type = type; + entry.variables[i].type = type; } @@ -12955,7 +12968,6 @@ class InferenceVisitorImpl extends InferenceVisitorBase Object? rewrite = popRewrite(); if (!identical(expression, rewrite)) { - // Coverage-ignore-block(suite): Not run. expression = rewrite as Expression; node.expression = expression..parent = node; } @@ -13305,14 +13317,22 @@ class InferenceVisitorImpl extends InferenceVisitorBase } @override + // Coverage-ignore(suite): Not run. ExpressionInferenceResult visitVariableSet( VariableSet node, DartType typeContext, + ) { + _unhandledExpression(node, typeContext); + } + + ExpressionInferenceResult visitInternalVariableSet( + InternalVariableSet node, + DartType typeContext, ) { if (expressionEvaluationHelper != null) { // Coverage-ignore-block(suite): Not run. ExpressionInferenceResult? result = expressionEvaluationHelper - ?.visitVariableSet( + ?.visitInternalVariableSet( node, typeContext, problemReporting, @@ -13323,7 +13343,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase return result; } } - InternalVariable variable = node.variable as InternalVariable; + InternalVariable variable = node.variable; var (DartType variableType, DartType writeContext) = computeVariableSetTypeAndWriteContext(variable); ExpressionInferenceResult rhsResult = inferExpression( @@ -13331,14 +13351,17 @@ class InferenceVisitorImpl extends InferenceVisitorBase writeContext, isVoidAllowed: true, ); - return inferVariableSet( + ExpressionInferenceResult result = inferVariableSet( variable: variable, variableType: variableType, rhsResult: rhsResult, assignOffset: node.fileOffset, nameOffset: node.fileOffset, - node: node, ); + libraryBuilder.loader.dataForTesting + // Coverage-ignore(suite): Not run. + ?.registerAlias(node, result.expression); + return result; } @override @@ -13389,14 +13412,22 @@ class InferenceVisitorImpl extends InferenceVisitorBase } @override + // Coverage-ignore(suite): Not run. ExpressionInferenceResult visitVariableGet( VariableGet node, DartType typeContext, + ) { + _unhandledExpression(node, typeContext); + } + + ExpressionInferenceResult visitInternalVariableGet( + InternalVariableGet node, + DartType typeContext, ) { if (expressionEvaluationHelper != null) { // Coverage-ignore-block(suite): Not run. ExpressionInferenceResult? result = expressionEvaluationHelper - ?.visitVariableGet( + ?.visitInternalVariableGet( node, typeContext, problemReporting, @@ -13407,12 +13438,15 @@ class InferenceVisitorImpl extends InferenceVisitorBase return result; } } - return inferVariableGet( - variable: node.variable as InternalVariable, + ExpressionInferenceResult result = inferVariableGet( + variable: node.variable, typeContext: typeContext, nameOffset: node.fileOffset, - node: node, ); + libraryBuilder.loader.dataForTesting + // Coverage-ignore(suite): Not run. + ?.registerAlias(node, result.expression); + return result; } @override @@ -17079,16 +17113,16 @@ class MapEntryInferenceContext extends CollectionElementInferenceContext { } abstract class ExpressionEvaluationHelper { - ExpressionInferenceResult? visitVariableGet( - VariableGet node, + ExpressionInferenceResult? visitInternalVariableGet( + InternalVariableGet node, DartType typeContext, ProblemReporting problemReporting, CompilerContext compilerContext, Uri fileUri, ); - ExpressionInferenceResult? visitVariableSet( - VariableSet node, + ExpressionInferenceResult? visitInternalVariableSet( + InternalVariableSet node, DartType typeContext, ProblemReporting problemReporting, CompilerContext compilerContext, diff --git a/pkg/front_end/lib/src/type_inference/inference_visitor_base.dart b/pkg/front_end/lib/src/type_inference/inference_visitor_base.dart index 935dfaffbb6..ee171e9d5ae 100644 --- a/pkg/front_end/lib/src/type_inference/inference_visitor_base.dart +++ b/pkg/front_end/lib/src/type_inference/inference_visitor_base.dart @@ -4221,9 +4221,9 @@ abstract class InferenceVisitorBase implements InferenceVisitor { required InternalVariable variable, required DartType typeContext, required int nameOffset, - VariableGet? node, }) { - node ??= new VariableGet(variable.astVariable)..fileOffset = nameOffset; + VariableGet result = new VariableGet(variable.astVariable) + ..fileOffset = nameOffset; DartType? promotedType; DartType declaredOrInferredType = variable.lateType ?? variable.type; ExpressionInfo? expressionInfo; @@ -4240,27 +4240,27 @@ abstract class InferenceVisitorBase implements InferenceVisitor { ); promotedType = wrappedPromotedType?.unwrapTypeView(); } - flowAnalysis.storeExpressionInfo(node, expressionInfo); - node.promotedType = promotedType; + flowAnalysis.storeExpressionInfo(result, expressionInfo); + result.promotedType = promotedType; DartType resultType = promotedType ?? declaredOrInferredType; Expression resultExpression; if (variable.isLocalFunction) { - return instantiateTearOff(resultType, typeContext, node); + return instantiateTearOff(resultType, typeContext, result); } else if (variable.lateGetter != null) { resultExpression = new LocalFunctionInvocation( variable.lateGetter!, - new Arguments([])..fileOffset = node.fileOffset, + new Arguments([])..fileOffset = result.fileOffset, functionType: variable.lateGetter!.type as FunctionType, - )..fileOffset = node.fileOffset; + )..fileOffset = result.fileOffset; // Future calls to flow analysis will be using `resultExpression` to refer // to the variable get, so instruct flow analysis to forward the // expression information. flowAnalysis.storeExpressionInfo( resultExpression, - flowAnalysis.getExpressionInfo(node), + flowAnalysis.getExpressionInfo(result), ); } else { - resultExpression = node..variable = variable.astVariable; + resultExpression = result..variable = variable.astVariable; } bool isUnassigned = !flowAnalysis.isAssigned(variable.astVariable); @@ -4269,7 +4269,7 @@ abstract class InferenceVisitorBase implements InferenceVisitor { // Coverage-ignore(suite): Not run. ?.flowAnalysisResult // Coverage-ignore(suite): Not run. .potentiallyUnassignedNodes // Coverage-ignore(suite): Not run. - .add(node); + .add(result); } bool isDefinitelyUnassigned = flowAnalysis.isUnassigned( variable.astVariable, @@ -4279,7 +4279,7 @@ abstract class InferenceVisitorBase implements InferenceVisitor { // Coverage-ignore(suite): Not run. ?.flowAnalysisResult // Coverage-ignore(suite): Not run. .definitelyUnassignedNodes // Coverage-ignore(suite): Not run. - .add(node); + .add(result); } // Synthetic variables, local functions, and variables with // invalid types aren't checked. @@ -4298,7 +4298,7 @@ abstract class InferenceVisitorBase implements InferenceVisitor { variableName: name, ), fileUri: fileUri, - fileOffset: node.fileOffset, + fileOffset: result.fileOffset, length: name.length, ), ); @@ -4312,11 +4312,11 @@ abstract class InferenceVisitorBase implements InferenceVisitor { compilerContext: compilerContext, expression: resultExpression, message: diag.finalNotAssignedError.withArguments( - variableName: node.variable.cosmeticName!, + variableName: result.variable.cosmeticName!, ), fileUri: fileUri, - fileOffset: node.fileOffset, - length: node.variable.cosmeticName!.length, + fileOffset: result.fileOffset, + length: result.variable.cosmeticName!.length, ), ); } else if (declaredOrInferredType.isPotentiallyNonNullable) { @@ -4326,11 +4326,11 @@ abstract class InferenceVisitorBase implements InferenceVisitor { compilerContext: compilerContext, expression: resultExpression, message: diag.nonNullableNotAssignedError.withArguments( - variableName: node.variable.cosmeticName!, + variableName: result.variable.cosmeticName!, ), fileUri: fileUri, - fileOffset: node.fileOffset, - length: node.variable.cosmeticName!.length, + fileOffset: result.fileOffset, + length: result.variable.cosmeticName!.length, ), ); } @@ -4363,7 +4363,6 @@ abstract class InferenceVisitorBase implements InferenceVisitor { required ExpressionInferenceResult rhsResult, required int assignOffset, required int nameOffset, - VariableSet? node, }) { bool isDefinitelyAssigned = flowAnalysis.isAssigned(variable.astVariable); bool isDefinitelyUnassigned = flowAnalysis.isUnassigned( @@ -4376,12 +4375,12 @@ abstract class InferenceVisitorBase implements InferenceVisitor { isVoidAllowed: variableType is VoidType, ); Expression rhs = rhsResult.expression; - node ??= new VariableSet(variable.astVariable, rhs) + VariableSet result = new VariableSet(variable.astVariable, rhs) ..fileOffset = nameOffset; flowAnalysis.storeExpressionInfo( - node, + result, flowAnalysis.write( - node, + result, variable.astVariable, new SharedTypeView(rhsResult.inferredType), flowAnalysis.getExpressionInfo(rhsResult.expression), @@ -4392,19 +4391,19 @@ abstract class InferenceVisitorBase implements InferenceVisitor { if (variable.lateSetter != null) { resultExpression = new LocalFunctionInvocation( variable.lateSetter!, - new Arguments([rhs])..fileOffset = node.fileOffset, + new Arguments([rhs])..fileOffset = result.fileOffset, functionType: variable.lateSetter!.type as FunctionType, - )..fileOffset = node.fileOffset; + )..fileOffset = result.fileOffset; // Future calls to flow analysis will be using `resultExpression` to refer // to the variable set, so instruct flow analysis to forward the // expression information. flowAnalysis.storeExpressionInfo( resultExpression, - flowAnalysis.getExpressionInfo(node), + flowAnalysis.getExpressionInfo(result), ); } else { - node.value = rhs..parent = node; - resultExpression = node..variable = variable.astVariable; + result.value = rhs..parent = result; + resultExpression = result..variable = variable.astVariable; } // Synthetic variables, local functions, and variables with // invalid types aren't checked. @@ -4420,11 +4419,11 @@ abstract class InferenceVisitorBase implements InferenceVisitor { compilerContext: compilerContext, expression: resultExpression, message: diag.lateDefinitelyAssignedError.withArguments( - variableName: node.variable.cosmeticName!, + variableName: result.variable.cosmeticName!, ), fileUri: fileUri, - fileOffset: node.fileOffset, - length: node.variable.cosmeticName!.length, + fileOffset: result.fileOffset, + length: result.variable.cosmeticName!.length, ), ); } @@ -4436,11 +4435,11 @@ abstract class InferenceVisitorBase implements InferenceVisitor { compilerContext: compilerContext, expression: resultExpression, message: diag.finalPossiblyAssignedError.withArguments( - variableName: node.variable.cosmeticName!, + variableName: result.variable.cosmeticName!, ), fileUri: fileUri, - fileOffset: node.fileOffset, - length: node.variable.cosmeticName!.length, + fileOffset: result.fileOffset, + length: result.variable.cosmeticName!.length, ), ); } diff --git a/pkg/front_end/lib/src/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/type_inference/type_inferrer.dart index ee2ed8c6592..44c6405ce66 100644 --- a/pkg/front_end/lib/src/type_inference/type_inferrer.dart +++ b/pkg/front_end/lib/src/type_inference/type_inferrer.dart @@ -13,6 +13,7 @@ import '../base/extension_scope.dart'; import '../kernel/assigned_variables_impl.dart'; import '../kernel/benchmarker.dart' show BenchmarkSubdivides, Benchmarker; import '../kernel/internal_ast.dart'; +import '../kernel/internal_ast_helper.dart' as intern; import '../source/source_constructor_builder.dart'; import '../source/source_library_builder.dart' show SourceLibraryBuilder; import '../source/stack_listener_impl.dart' show AsyncModifier; @@ -341,14 +342,15 @@ class TypeInferrerImpl implements TypeInferrer { ); Expression variableGet; if (isClosureContextLoweringEnabled) { - variableGet = new VariableGet( + variableGet = intern.createVariableGet( + parameter.fileOffset, new InternalPositionalParameter( astVariable: parameter as PositionalParameter, isImplicitlyTyped: false, ), )..fileOffset = parameter.fileOffset; } else { - variableGet = new VariableGet(parameter); + variableGet = intern.createVariableGet(parameter.fileOffset, parameter); } arguments.add(new PositionalArgument(variableGet)); positionalCount++; @@ -364,7 +366,8 @@ class TypeInferrerImpl implements TypeInferrer { if (isClosureContextLoweringEnabled) { namedExpression = new NamedExpression( parameter.name!, - new VariableGet( + intern.createVariableGet( + parameter.fileOffset, new InternalNamedParameter( astVariable: parameter as NamedParameter, isImplicitlyTyped: false, @@ -374,7 +377,7 @@ class TypeInferrerImpl implements TypeInferrer { } else { namedExpression = new NamedExpression( parameter.name!, - new VariableGet(parameter), + intern.createVariableGet(parameter.fileOffset, parameter), ); } arguments.add(new NamedArgument(namedExpression)); diff --git a/pkg/front_end/test/id_tests/definite_assignment_test.dart b/pkg/front_end/test/id_tests/definite_assignment_test.dart index e2ae5965707..28de773ecb9 100644 --- a/pkg/front_end/test/id_tests/definite_assignment_test.dart +++ b/pkg/front_end/test/id_tests/definite_assignment_test.dart @@ -6,7 +6,6 @@ import 'dart:io' show Directory, Platform; import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id; import 'package:_fe_analyzer_shared/src/testing/id_testing.dart'; -import 'package:front_end/src/source/source_loader.dart'; import 'package:front_end/src/source/source_member_builder.dart'; import 'package:front_end/src/testing/id_testing_helper.dart'; import 'package:front_end/src/testing/id_testing_utils.dart'; @@ -66,22 +65,18 @@ class DefiniteAssignmentDataComputer extends CfeDataComputer { } class DefiniteAssignmentDataExtractor extends CfeDataExtractor { - final SourceLoaderDataForTesting _sourceLoaderDataForTesting; final FlowAnalysisResult _flowResult; DefiniteAssignmentDataExtractor( InternalCompilerResult compilerResult, Map> actualMap, this._flowResult, - ) : _sourceLoaderDataForTesting = - compilerResult.kernelTargetForTesting!.loader.dataForTesting!, - super(compilerResult, actualMap); + ) : super(compilerResult, actualMap); @override String? computeNodeValue(Id id, TreeNode node) { if (node is VariableGet) { - TreeNode alias = _sourceLoaderDataForTesting.toOriginal(node); - if (_flowResult.potentiallyUnassignedNodes.contains(alias)) { + if (_flowResult.potentiallyUnassignedNodes.contains(node)) { return 'unassigned'; } } diff --git a/pkg/front_end/test/id_tests/definite_unassignment_test.dart b/pkg/front_end/test/id_tests/definite_unassignment_test.dart index 377d1b0a1b2..a862e1b44b7 100644 --- a/pkg/front_end/test/id_tests/definite_unassignment_test.dart +++ b/pkg/front_end/test/id_tests/definite_unassignment_test.dart @@ -6,7 +6,6 @@ import 'dart:io' show Directory, Platform; import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id; import 'package:_fe_analyzer_shared/src/testing/id_testing.dart'; -import 'package:front_end/src/source/source_loader.dart'; import 'package:front_end/src/source/source_member_builder.dart'; import 'package:front_end/src/testing/id_testing_helper.dart'; import 'package:front_end/src/testing/id_testing_utils.dart'; @@ -66,22 +65,18 @@ class DefiniteUnassignmentDataComputer extends CfeDataComputer { } class DefiniteUnassignmentDataExtractor extends CfeDataExtractor { - final SourceLoaderDataForTesting _sourceLoaderDataForTesting; final FlowAnalysisResult _flowResult; DefiniteUnassignmentDataExtractor( InternalCompilerResult compilerResult, Map> actualMap, this._flowResult, - ) : _sourceLoaderDataForTesting = - compilerResult.kernelTargetForTesting!.loader.dataForTesting!, - super(compilerResult, actualMap); + ) : super(compilerResult, actualMap); @override String? computeNodeValue(Id id, TreeNode node) { if (node is VariableGet) { - TreeNode alias = _sourceLoaderDataForTesting.toOriginal(node); - if (_flowResult.definitelyUnassignedNodes.contains(alias)) { + if (_flowResult.definitelyUnassignedNodes.contains(node)) { return 'unassigned'; } } diff --git a/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.expect b/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.expect index b61269a697e..9b2a743ca0e 100644 --- a/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.expect +++ b/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.expect @@ -8,7 +8,7 @@ import "dart:core" as core; [232] enum-element static const field self::E c = [232] [232] #C9; [222] static const field core::List values = [-1] [-1] #C10; [222] const synthetic constructor [222] [222] •([222] core::int #index, [222] core::String #name) → self::E - : [222] super core::_Enum::• [222]([-1] #index, [-1] #name) + : [222] super core::_Enum::• [222]([222] #index, [222] #name) [-1] ; [222] method [222] [222] core::_enumToString() → core::String [-1] return [-1] [-1] "E.${[-1] [-1] [-1] [-1] this.{core::_Enum::_name}{core::String}}"; diff --git a/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.modular.expect b/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.modular.expect index b61269a697e..9b2a743ca0e 100644 --- a/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.modular.expect +++ b/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.modular.expect @@ -8,7 +8,7 @@ import "dart:core" as core; [232] enum-element static const field self::E c = [232] [232] #C9; [222] static const field core::List values = [-1] [-1] #C10; [222] const synthetic constructor [222] [222] •([222] core::int #index, [222] core::String #name) → self::E - : [222] super core::_Enum::• [222]([-1] #index, [-1] #name) + : [222] super core::_Enum::• [222]([222] #index, [222] #name) [-1] ; [222] method [222] [222] core::_enumToString() → core::String [-1] return [-1] [-1] "E.${[-1] [-1] [-1] [-1] this.{core::_Enum::_name}{core::String}}"; diff --git a/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.outline.expect b/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.outline.expect index be94d1c3f4f..bf5cf9d91fb 100644 --- a/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.outline.expect +++ b/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.outline.expect @@ -8,7 +8,7 @@ import "dart:core" as core; [232] enum-element static const field self::E c = [232] [232] const self::E::• [-1]([-1] 2, [-1] "c"); [222] static const field core::List values = [-1] [-1] const [[-1] self::E::a, [-1] self::E::b, [-1] self::E::c]; [222] const synthetic constructor [222] [222] •([222] core::int #index, [222] core::String #name) → self::E - : [222] super core::_Enum::• [222]([-1] #index, [-1] #name) + : [222] super core::_Enum::• [222]([222] #index, [222] #name) [-1] ; [222] method [222] [222] core::_enumToString() → core::String [-1] return [-1] [-1] "E.${[-1] [-1] [-1] [-1] this.{core::_Enum::_name}{core::String}}"; diff --git a/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.transformed.expect b/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.transformed.expect index 13ccd0922ba..3fff1eca144 100644 --- a/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.transformed.expect @@ -8,7 +8,7 @@ import "dart:core" as core; [232] enum-element static const field self::E c = [232] [232] #C9; [222] static const field core::List values = [-1] [-1] #C10; [222] const synthetic constructor [222] [222] •([222] core::int #index, [222] core::String #name) → self::E - : [222] super core::_Enum::• [222]([-1] #index, [-1] #name) + : [222] super core::_Enum::• [222]([222] #index, [222] #name) [-1] ; [222] method [222] [222] core::_enumToString() → core::String [-1] return [-1] [-1] "E.${[-1] [-1] [-1] [-1] this.{core::_Enum::_name}{core::String}}";