[cfe][InternalNodes] Add InternalVariableGet/Set

This adds internal AST nodes for VariableGet/Set. This is a step towards separating VariableDeclarationImpl from VariableDeclaration.

Change-Id: If85d8917225fdbd1b2411ef5c2493e8e6258e6be
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/500800
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Chloe Stefantsova <cstefantsova@google.com>
This commit is contained in:
Johnni Winther
2026-05-07 03:46:06 -07:00
committed by dart-scoped@luci-project-accounts.iam.gserviceaccount.com
parent a3deacfd58
commit a6ec5cee79
16 changed files with 217 additions and 102 deletions
@@ -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<VariableDeclarationImpl> knownButUnavailable = {};
final Set<InternalVariable> 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,
@@ -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),
@@ -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
+61 -3
View File
@@ -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 ?? '<unnamed-variable>');
}
@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 ?? '<unnamed-variable>');
printer.write(' = ');
printer.writeExpression(value);
}
@override
String toString() {
return "InternalVariableSet(${toStringInternal()})";
}
}
@@ -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(
+5 -3
View File
@@ -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({
@@ -300,10 +300,14 @@ class _InitializerBuilder {
_bodyBuilderContext.formals!;
ActualArguments arguments = initializer.arguments;
List<Expression> 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),
@@ -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,
@@ -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(<Expression>[])..fileOffset = node.fileOffset,
new Arguments(<Expression>[])..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(<Expression>[rhs])..fileOffset = node.fileOffset,
new Arguments(<Expression>[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,
),
);
}
@@ -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));
@@ -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<String> {
}
class DefiniteAssignmentDataExtractor extends CfeDataExtractor<String> {
final SourceLoaderDataForTesting _sourceLoaderDataForTesting;
final FlowAnalysisResult _flowResult;
DefiniteAssignmentDataExtractor(
InternalCompilerResult compilerResult,
Map<Id, ActualData<String>> 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';
}
}
@@ -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<String> {
}
class DefiniteUnassignmentDataExtractor extends CfeDataExtractor<String> {
final SourceLoaderDataForTesting _sourceLoaderDataForTesting;
final FlowAnalysisResult _flowResult;
DefiniteUnassignmentDataExtractor(
InternalCompilerResult compilerResult,
Map<Id, ActualData<String>> 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';
}
}
@@ -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<self::E> 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}}";
@@ -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<self::E> 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}}";
@@ -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<self::E> values = [-1] [-1] const <self::E>[[-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}}";
@@ -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<self::E> 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}}";