[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:
committed by
dart-scoped@luci-project-accounts.iam.gserviceaccount.com
parent
a3deacfd58
commit
a6ec5cee79
@@ -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
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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}}";
|
||||
|
||||
Reference in New Issue
Block a user