[cfe][InternalNodes] Use InternalPattern in PatternForInElement

This changes PatternForInElement to use InternalPattern. With this change InternalPattern is now detached from Pattern and used exclusively as the input to inference.

Change-Id: I62e4255a0f981784fef07ac91f283161f02e3d31
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/509940
Reviewed-by: Chloe Stefantsova <cstefantsova@google.com>
This commit is contained in:
Johnni Winther
2026-06-08 05:45:44 -07:00
committed by dart-scoped@luci-project-accounts.iam.gserviceaccount.com
parent 95b8f52f9f
commit 8492bfd7ac
8 changed files with 221 additions and 208 deletions
+23 -27
View File
@@ -1471,7 +1471,7 @@ class BodyBuilderImpl extends StackListenerImpl
);
Object? value = pop();
if (value is Pattern) {
if (value is InternalPattern) {
push(value);
} else {
push(toValue(value));
@@ -1877,7 +1877,7 @@ class BodyBuilderImpl extends StackListenerImpl
if (scopeKind != LocalScopeKind.orPatternRight &&
enclosingScopeIsPatternScope) {
if (pattern is InternalPattern) {
for (InternalVariable variable in pattern.internalDeclaredVariables) {
for (InternalVariable variable in pattern.declaredVariables) {
declareVariable(variable, _localScope);
}
}
@@ -1949,11 +1949,10 @@ class BodyBuilderImpl extends StackListenerImpl
break;
case '||':
Map<String, InternalVariable> leftVariablesByName = {
for (InternalVariable leftVariable in left.internalDeclaredVariables)
for (InternalVariable leftVariable in left.declaredVariables)
leftVariable.cosmeticName!: leftVariable,
};
for (InternalVariable rightVariable
in right.internalDeclaredVariables) {
for (InternalVariable rightVariable in right.declaredVariables) {
if (!leftVariablesByName.containsKey(rightVariable.cosmeticName)) {
addProblem(
diag.missingVariablePattern.withArguments(
@@ -1965,11 +1964,10 @@ class BodyBuilderImpl extends StackListenerImpl
}
}
Map<String, InternalVariable> rightVariablesByName = {
for (InternalVariable rightVariable
in right.internalDeclaredVariables)
for (InternalVariable rightVariable in right.declaredVariables)
rightVariable.cosmeticName!: rightVariable,
};
for (InternalVariable leftVariable in left.internalDeclaredVariables) {
for (InternalVariable leftVariable in left.declaredVariables) {
if (!rightVariablesByName.containsKey(leftVariable.cosmeticName)) {
addProblem(
diag.missingVariablePattern.withArguments(
@@ -1981,7 +1979,7 @@ class BodyBuilderImpl extends StackListenerImpl
}
}
List<InternalVariable> jointVariables = [
for (InternalVariable leftVariable in left.internalDeclaredVariables)
for (InternalVariable leftVariable in left.declaredVariables)
intern.createSyntheticVariable(
isClosureContextLoweringEnabled: isClosureContextLoweringEnabled,
name: leftVariable.cosmeticName!,
@@ -3203,7 +3201,7 @@ class BodyBuilderImpl extends StackListenerImpl
InternalPattern pattern = toPattern(peek());
createAndEnterLocalScope(kind: LocalScopeKind.ifCaseHead);
for (InternalVariable variable in pattern.internalDeclaredVariables) {
for (InternalVariable variable in pattern.declaredVariables) {
declareVariable(variable, _localScope);
}
}
@@ -3236,7 +3234,7 @@ class BodyBuilderImpl extends StackListenerImpl
if (patternGuard != null) {
createAndEnterLocalScope(kind: LocalScopeKind.ifCaseHead);
InternalPattern pattern = patternGuard.pattern;
for (InternalVariable variable in pattern.internalDeclaredVariables) {
for (InternalVariable variable in pattern.declaredVariables) {
declareVariable(variable, _localScope);
}
LocalScope thenScope = _localScope.createNestedScope(
@@ -3826,7 +3824,7 @@ class BodyBuilderImpl extends StackListenerImpl
if (pattern is InternalPattern) {
pop(); // Metadata.
for (InternalVariable variable in pattern.internalDeclaredVariables) {
for (InternalVariable variable in pattern.declaredVariables) {
declareVariable(variable, _localScope);
}
LocalScope forScope = _localScope.createNestedScope(
@@ -3842,7 +3840,7 @@ class BodyBuilderImpl extends StackListenerImpl
// using the variables with the same name within the same block.
List<InternalVariable> intermediateVariables = [];
List<InternalVariable> internalVariables = [];
for (InternalVariable variable in pattern.internalDeclaredVariables) {
for (InternalVariable variable in pattern.declaredVariables) {
variable.isFinal |= isFinal;
// TODO(johnniwinther): Can we avoid creating synthetic variables here?
@@ -7263,7 +7261,7 @@ class BodyBuilderImpl extends StackListenerImpl
} else {
createAndEnterLocalScope(kind: LocalScopeKind.ifCaseHead);
InternalPattern pattern = patternGuard.pattern;
for (InternalVariable variable in pattern.internalDeclaredVariables) {
for (InternalVariable variable in pattern.declaredVariables) {
declareVariable(variable, _localScope);
}
LocalScope thenScope = _localScope.createNestedScope(
@@ -8295,7 +8293,7 @@ class BodyBuilderImpl extends StackListenerImpl
if (pattern is InternalPattern) {
pop(); // Metadata.
bool isFinal = patternKeyword?.lexeme == 'final';
for (InternalVariable variable in pattern.internalDeclaredVariables) {
for (InternalVariable variable in pattern.declaredVariables) {
variable.isFinal |= isFinal;
declareVariable(variable, _localScope);
}
@@ -8447,7 +8445,7 @@ class BodyBuilderImpl extends StackListenerImpl
/// }
///
return lvalue.buildForInElement(inOffset: inToken.offset);
} else if (lvalue is Pattern) {
} else if (lvalue is InternalPattern) {
/// We are in the case where `lvalue` is a pattern:
///
/// for (pattern in expression) body
@@ -8966,8 +8964,7 @@ class BodyBuilderImpl extends StackListenerImpl
InternalPattern pattern = patternGuard.pattern;
if (jointPatternVariables == null) {
jointPatternVariables = [
for (InternalVariable variable
in pattern.internalDeclaredVariables)
for (InternalVariable variable in pattern.declaredVariables)
intern.createSyntheticVariable(
isClosureContextLoweringEnabled:
isClosureContextLoweringEnabled,
@@ -8985,8 +8982,7 @@ class BodyBuilderImpl extends StackListenerImpl
}
} else {
Map<String, InternalVariable> patternVariablesByName = {
for (InternalVariable variable
in pattern.internalDeclaredVariables)
for (InternalVariable variable in pattern.declaredVariables)
variable.cosmeticName!: variable,
};
for (InternalVariable jointVariable in jointPatternVariables) {
@@ -9089,7 +9085,7 @@ class BodyBuilderImpl extends StackListenerImpl
// makes the variables visible in the 'when' clause of the head.
Object? pattern = peek();
if (pattern is InternalPattern) {
for (InternalVariable variable in pattern.internalDeclaredVariables) {
for (InternalVariable variable in pattern.declaredVariables) {
declareVariable(variable, _localScope);
}
}
@@ -9128,7 +9124,7 @@ class BodyBuilderImpl extends StackListenerImpl
// body of the case.
Object? pattern = peek();
if (pattern is InternalPattern) {
for (InternalVariable variable in pattern.internalDeclaredVariables) {
for (InternalVariable variable in pattern.declaredVariables) {
declareVariable(variable, _localScope);
}
}
@@ -9261,7 +9257,7 @@ class BodyBuilderImpl extends StackListenerImpl
expressionsOrPatternGuards.first.patternGuard;
if (patternGuard != null) {
InternalPattern pattern = patternGuard.pattern;
for (InternalVariable variable in pattern.internalDeclaredVariables) {
for (InternalVariable variable in pattern.declaredVariables) {
String variableName = variable.cosmeticName!;
if (usedNamesOffsets[variableName] case [int offset, ...]) {
addProblem(
@@ -9445,7 +9441,7 @@ class BodyBuilderImpl extends StackListenerImpl
Object? pattern = pop();
createAndEnterLocalScope(kind: LocalScopeKind.caseHead);
if (pattern is InternalPattern) {
for (InternalVariable variable in pattern.internalDeclaredVariables) {
for (InternalVariable variable in pattern.declaredVariables) {
declareVariable(variable, _localScope);
}
}
@@ -10862,7 +10858,7 @@ class BodyBuilderImpl extends StackListenerImpl
if (field is InternalNamedPattern) {
(fields ??= []).add(field);
} else {
Pattern pattern = toPattern(field);
InternalPattern pattern = toPattern(field);
if (pattern is! InternalInvalidPattern) {
addProblem(
diag.unnamedObjectPatternField,
@@ -11082,7 +11078,7 @@ class BodyBuilderImpl extends StackListenerImpl
assert(variable.lexeme != '_');
TypeBuilder? type = pop(NullValues.TypeBuilder) as TypeBuilder?;
DartType? patternType = type?.build(libraryBuilder, TypeUse.variableType);
Pattern pattern;
InternalPattern pattern;
if (inAssignmentPattern) {
// Error has already been reported.
pattern = intern.createInvalidPattern(
@@ -11203,7 +11199,7 @@ class BodyBuilderImpl extends StackListenerImpl
Expression initializer = popForValue();
InternalPattern pattern = toPattern(pop());
bool isFinal = keyword.lexeme == 'final';
for (InternalVariable variable in pattern.internalDeclaredVariables) {
for (InternalVariable variable in pattern.declaredVariables) {
variable.isFinal = isFinal;
variable.hasDeclaredInitializer = true;
declareVariable(variable, _localScope);
@@ -391,7 +391,7 @@ abstract class Generator {
///
/// If this generator is not for an assignable variable, an error is reported
/// and an invalid pattern is returned.
Pattern buildPatternAssignment(Token token) {
InternalPattern buildPatternAssignment(Token token) {
return intern.createInvalidPattern(
problemReporting.buildProblem(
compilerContext: compilerContext,
@@ -601,8 +601,8 @@ class VariableUseGenerator extends Generator {
}
@override
Pattern buildPatternAssignment(Token token) {
Pattern pattern = intern.createAssignedVariablePattern(
InternalPattern buildPatternAssignment(Token token) {
InternalPattern pattern = intern.createAssignedVariablePattern(
token.charOffset,
variable,
);
@@ -5323,7 +5323,7 @@ abstract class AbstractReadOnlyAccessGenerator extends Generator {
}
@override
Pattern buildPatternAssignment(Token token) {
InternalPattern buildPatternAssignment(Token token) {
return intern.createInvalidPattern(
_makeInvalidWrite(),
declaredVariables: [],
+52 -43
View File
@@ -41,7 +41,7 @@ import 'external_ast_helper.dart' as extern;
/// @docImport 'package:_fe_analyzer_shared/src/flow_analysis/flow_analysis.dart';
typedef SharedMatchContext =
shared.MatchContext<TreeNode, Expression, Pattern, Variable>;
shared.MatchContext<TreeNode, Expression, InternalPattern, Variable>;
mixin InternalTreeNode implements TreeNode {
@override
@@ -6247,7 +6247,7 @@ class UnassignableForInElement extends _BaseForInElement {
/// For-in element for a pattern variable declaration.
class PatternForInElement extends InternalForInElement {
/// The pattern used in the variable declaration.
final Pattern pattern;
final InternalPattern pattern;
/// The file offset of the `in` keyword.
final int inOffset;
@@ -6982,13 +6982,30 @@ class InternalFunctionDeclaration extends InternalStatement {
}
// Coverage-ignore(suite): Not run.
sealed class InternalPattern extends AuxiliaryPattern {
List<InternalVariable> get internalDeclaredVariables;
sealed class InternalPattern extends TreeNode with InternalTreeNode {
/// Returns the variable name that this pattern defines, if any.
///
/// This is used to derive an implicit variable name from a pattern to use
/// on object patterns. For instance
///
/// if (o case Foo(:var bar, :var baz!)) { ... }
///
/// the getter names 'bar' and 'baz' are implicitly defined by the patterns.
String? get variableName => null;
/// Variable declarations induced by nested variable patterns.
///
/// These variables are initialized to the values captured by the variable
/// patterns nested in the pattern.
List<InternalVariable> get declaredVariables;
@override
@Deprecated('Use internalDeclaredVariables instead')
List<Variable> get declaredVariables =>
unsupported("${runtimeType}.declaredVariables", -1, null);
R accept<R>(TreeVisitor<R> v) =>
unsupported("${runtimeType}.accept", -1, null);
@override
R accept1<R, A>(TreeVisitor1<R, A> v, A arg) =>
unsupported("${runtimeType}.accept", -1, null);
@override
void replaceChild(TreeNode child, TreeNode replacement) {
@@ -7022,8 +7039,7 @@ class InternalOrPattern extends InternalPattern {
final List<InternalVariable> orPatternJointVariables;
@override
List<InternalVariable> get internalDeclaredVariables =>
orPatternJointVariables;
List<InternalVariable> get declaredVariables => orPatternJointVariables;
new(
this.left,
@@ -7064,9 +7080,9 @@ class InternalAndPattern extends InternalPattern {
final InternalPattern right;
@override
List<InternalVariable> get internalDeclaredVariables => [
...left.internalDeclaredVariables,
...right.internalDeclaredVariables,
List<InternalVariable> get declaredVariables => [
...left.declaredVariables,
...right.declaredVariables,
];
new(this.left, this.right, {required int fileOffset}) {
@@ -7107,7 +7123,7 @@ class InternalConstantPattern extends InternalPattern {
}
@override
List<InternalVariable> get internalDeclaredVariables => const [];
List<InternalVariable> get declaredVariables => const [];
@override
shared.PatternResult acceptInference(
@@ -7137,7 +7153,7 @@ class InternalAssignedVariablePattern extends InternalPattern {
}
@override
List<InternalVariable> get internalDeclaredVariables => const [];
List<InternalVariable> get declaredVariables => const [];
@override
String get variableName => variable.cosmeticName!;
@@ -7176,8 +7192,7 @@ class InternalCastPattern extends InternalPattern {
String? get variableName => pattern.variableName;
@override
List<InternalVariable> get internalDeclaredVariables =>
pattern.internalDeclaredVariables;
List<InternalVariable> get declaredVariables => pattern.declaredVariables;
@override
shared.PatternResult acceptInference(
@@ -7205,11 +7220,11 @@ class InternalInvalidPattern extends InternalPattern {
final Expression invalidExpression;
@override
final List<InternalVariable> internalDeclaredVariables;
final List<InternalVariable> declaredVariables;
new({
required this.invalidExpression,
required this.internalDeclaredVariables,
required this.declaredVariables,
required int fileOffset,
}) {
invalidExpression.parent = this;
@@ -7244,9 +7259,8 @@ class InternalListPattern extends InternalPattern {
List<InternalPattern> patterns;
@override
List<InternalVariable> get internalDeclaredVariables => [
for (InternalPattern pattern in patterns)
...pattern.internalDeclaredVariables,
List<InternalVariable> get declaredVariables => [
for (InternalPattern pattern in patterns) ...pattern.declaredVariables,
];
new({
@@ -7276,7 +7290,7 @@ class InternalListPattern extends InternalPattern {
}
printer.write('[');
String comma = '';
for (Pattern pattern in patterns) {
for (InternalPattern pattern in patterns) {
printer.write(comma);
pattern.toTextInternal(printer);
comma = ', ';
@@ -7300,10 +7314,10 @@ class InternalMapPattern extends InternalPattern {
final List<InternalMapPatternEntry> entries;
@override
List<InternalVariable> get internalDeclaredVariables => [
List<InternalVariable> get declaredVariables => [
for (InternalMapPatternEntry entry in entries)
if (entry is! InternalMapPatternRestEntry)
...entry.value.internalDeclaredVariables,
...entry.value.declaredVariables,
];
new({
@@ -7421,8 +7435,7 @@ class InternalNamedPattern extends InternalPattern {
final InternalPattern pattern;
@override
List<InternalVariable> get internalDeclaredVariables =>
pattern.internalDeclaredVariables;
List<InternalVariable> get declaredVariables => pattern.declaredVariables;
new({required this.name, required this.pattern, required int fileOffset}) {
pattern.parent = this;
@@ -7468,8 +7481,7 @@ class InternalNullAssertPattern extends InternalPattern {
String? get variableName => pattern.variableName;
@override
List<InternalVariable> get internalDeclaredVariables =>
pattern.internalDeclaredVariables;
List<InternalVariable> get declaredVariables => pattern.declaredVariables;
@override
shared.PatternResult acceptInference(
@@ -7505,8 +7517,7 @@ class InternalNullCheckPattern extends InternalPattern {
String? get variableName => pattern.variableName;
@override
List<InternalVariable> get internalDeclaredVariables =>
pattern.internalDeclaredVariables;
List<InternalVariable> get declaredVariables => pattern.declaredVariables;
@override
shared.PatternResult acceptInference(
@@ -7555,10 +7566,9 @@ class InternalObjectPattern extends InternalPattern {
}
@override
List<InternalVariable> get internalDeclaredVariables {
List<InternalVariable> get declaredVariables {
return [
for (InternalNamedPattern field in fields)
...field.internalDeclaredVariables,
for (InternalNamedPattern field in fields) ...field.declaredVariables,
];
}
@@ -7576,7 +7586,7 @@ class InternalObjectPattern extends InternalPattern {
printer.writeType(requiredType);
printer.write('(');
String comma = '';
for (Pattern field in fields) {
for (InternalPattern field in fields) {
printer.write(comma);
field.toTextInternal(printer);
comma = ', ';
@@ -7594,9 +7604,8 @@ class InternalRecordPattern extends InternalPattern {
final List<InternalPattern> patterns;
@override
List<InternalVariable> get internalDeclaredVariables => [
for (InternalPattern pattern in patterns)
...pattern.internalDeclaredVariables,
List<InternalVariable> get declaredVariables => [
for (InternalPattern pattern in patterns) ...pattern.declaredVariables,
];
new({required this.patterns, required int fileOffset}) {
@@ -7617,7 +7626,7 @@ class InternalRecordPattern extends InternalPattern {
void toTextInternal(AstPrinter printer) {
printer.write('(');
String comma = '';
for (Pattern pattern in patterns) {
for (InternalPattern pattern in patterns) {
printer.write(comma);
pattern.toTextInternal(printer);
comma = ', ';
@@ -7643,7 +7652,7 @@ class InternalRelationalPattern extends InternalPattern {
}
@override
List<InternalVariable> get internalDeclaredVariables => const [];
List<InternalVariable> get declaredVariables => const [];
@override
shared.PatternResult acceptInference(
@@ -7694,8 +7703,8 @@ class InternalRestPattern extends InternalPattern {
}
@override
List<InternalVariable> get internalDeclaredVariables =>
subPattern?.internalDeclaredVariables ?? const [];
List<InternalVariable> get declaredVariables =>
subPattern?.declaredVariables ?? const [];
@override
shared.PatternResult acceptInference(
@@ -7730,7 +7739,7 @@ class InternalVariablePattern extends InternalPattern {
final InternalVariable variable;
@override
List<InternalVariable> get internalDeclaredVariables => [variable];
List<InternalVariable> get declaredVariables => [variable];
new({required this.type, required this.variable, required int fileOffset}) {
variable.parent = this;
@@ -7773,7 +7782,7 @@ class InternalWildcardPattern extends InternalPattern {
this.fileOffset = fileOffset;
}
@override
List<InternalVariable> get internalDeclaredVariables => const [];
List<InternalVariable> get declaredVariables => const [];
@override
shared.PatternResult acceptInference(
@@ -31,7 +31,7 @@ Expression checkLibraryIsLoaded(int fileOffset, LibraryDependency dependency) {
return new CheckLibraryIsLoaded(dependency)..fileOffset = fileOffset;
}
Pattern createAndPattern(
InternalPattern createAndPattern(
int fileOffset,
InternalPattern left,
InternalPattern right,
@@ -97,7 +97,7 @@ AssertStatement createAssertStatement(
)..fileOffset = fileOffset;
}
Pattern createAssignedVariablePattern(
InternalPattern createAssignedVariablePattern(
int fileOffset,
InternalVariable variable,
) {
@@ -163,7 +163,7 @@ Statement createBreakStatement(int fileOffset, Object? label) {
..target = label is LabeledStatement ? label : dummyLabeledStatement;
}
Pattern createCastPattern(
InternalPattern createCastPattern(
int fileOffset,
InternalPattern pattern,
DartType type,
@@ -607,13 +607,13 @@ Expression createIntLiteralLarge(
return new LargeIntLiteral(strippedLiteral, literal, fileOffset: fileOffset);
}
Pattern createInvalidPattern(
InternalPattern createInvalidPattern(
Expression expression, {
required List<InternalVariable> declaredVariables,
}) {
return new InternalInvalidPattern(
invalidExpression: expression,
internalDeclaredVariables: declaredVariables,
declaredVariables: declaredVariables,
fileOffset: expression.fileOffset,
);
}
@@ -729,7 +729,7 @@ ListLiteral createListLiteral(
)..fileOffset = fileOffset;
}
Pattern createListPattern(
InternalPattern createListPattern(
int fileOffset,
DartType? typeArgument,
List<InternalPattern> patterns,
@@ -867,7 +867,7 @@ MapLiteralEntry createMapLiteralEntry(
return new MapLiteralEntry(key, value)..fileOffset = fileOffset;
}
Pattern createMapPattern(
InternalPattern createMapPattern(
int fileOffset,
DartType? keyType,
DartType? valueType,
@@ -980,7 +980,7 @@ InternalVariable createNamedParameter({
}
}
Pattern createNamedPattern(
InternalPattern createNamedPattern(
int fileOffset,
String name,
InternalPattern pattern,
@@ -996,7 +996,10 @@ Expression createNot(int fileOffset, Expression operand) {
return new Not(operand)..fileOffset = fileOffset;
}
Pattern createNullAssertPattern(int fileOffset, InternalPattern pattern) {
InternalPattern createNullAssertPattern(
int fileOffset,
InternalPattern pattern,
) {
return new InternalNullAssertPattern(
pattern: pattern,
fileOffset: fileOffset,
@@ -1031,7 +1034,10 @@ NullCheck createNullCheck(int fileOffset, Expression expression) {
return new NullCheck(expression)..fileOffset = fileOffset;
}
Pattern createNullCheckPattern(int fileOffset, InternalPattern pattern) {
InternalPattern createNullCheckPattern(
int fileOffset,
InternalPattern pattern,
) {
return new InternalNullCheckPattern(pattern: pattern, fileOffset: fileOffset);
}
@@ -1040,7 +1046,7 @@ NullLiteral createNullLiteral(int fileOffset) {
return new NullLiteral()..fileOffset = fileOffset;
}
Pattern createOrPattern(
InternalPattern createOrPattern(
int fileOffset,
InternalPattern left,
InternalPattern right, {
@@ -1054,7 +1060,7 @@ Pattern createOrPattern(
);
}
Pattern createObjectPattern({
InternalPattern createObjectPattern({
required DartType requiredType,
required List<InternalNamedPattern> fields,
required Typedef? typedef,
@@ -1275,7 +1281,10 @@ Expression createPropertySet(
)..fileOffset = fileOffset;
}
Pattern createRecordPattern(int fileOffset, List<InternalPattern> patterns) {
InternalPattern createRecordPattern(
int fileOffset,
List<InternalPattern> patterns,
) {
return new InternalRecordPattern(patterns: patterns, fileOffset: fileOffset);
}
@@ -1287,7 +1296,7 @@ RedirectingFactoryTearOff createRedirectingFactoryTearOff(
return new RedirectingFactoryTearOff(procedure)..fileOffset = fileOffset;
}
Pattern createRelationalPattern(
InternalPattern createRelationalPattern(
int fileOffset,
RelationalPatternKind kind,
Expression expression,
@@ -1299,7 +1308,7 @@ Pattern createRelationalPattern(
);
}
Pattern createRestPattern(int fileOffset, InternalPattern? subPattern) {
InternalPattern createRestPattern(int fileOffset, InternalPattern? subPattern) {
return new InternalRestPattern(
subPattern: subPattern,
fileOffset: fileOffset,
@@ -1625,7 +1634,7 @@ InternalVariableGet createVariableGet(
return new InternalVariableGet(variable)..fileOffset = fileOffset;
}
Pattern createVariablePattern(
InternalPattern createVariablePattern(
int fileOffset,
DartType? type,
InternalVariable variable,
@@ -1663,7 +1672,7 @@ Statement createWhileStatement(
return new WhileStatement(condition, body)..fileOffset = fileOffset;
}
Pattern createWildcardPattern(int fileOffset, DartType? type) {
InternalPattern createWildcardPattern(int fileOffset, DartType? type) {
return new InternalWildcardPattern(type: type, fileOffset: fileOffset);
}
@@ -131,7 +131,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
Statement,
Expression,
Variable,
Pattern,
InternalPattern,
InvalidExpression,
TypeDeclarationType,
TypeDeclaration
@@ -3305,7 +3305,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
@override
PatternForInData inferPatternForInHeader({
required TreeNode node,
required Pattern pattern,
required InternalPattern pattern,
required Expression iterable,
required bool isAsync,
required int inOffset,
@@ -3338,12 +3338,9 @@ class InferenceVisitorImpl extends InferenceVisitorBase
]),
);
Object? rewrite = popRewrite();
if (!identical(rewrite, pattern)) {
pattern = rewrite as Pattern;
}
Pattern outputPattern = popRewrite() as Pattern;
rewrite = popRewrite();
Object? rewrite = popRewrite();
if (!identical(rewrite, iterable)) {
iterable = rewrite as Expression;
}
@@ -3370,13 +3367,16 @@ class InferenceVisitorImpl extends InferenceVisitorBase
loopVariable: loopVariable,
iterable: iterable,
computePatternVariableDeclaration: () =>
new PatternVariableDeclaration(
pattern,
extern.createVariableGet(loopVariable, fileOffset: inOffset),
isFinal: false,
)
..fileOffset = inOffset
..matchedValueType = matchedValueType,
extern.createPatternVariableDeclaration(
pattern: outputPattern,
initializer: extern.createVariableGet(
loopVariable,
fileOffset: inOffset,
),
isFinal: false,
fileOffset: inOffset,
matchedValueType: matchedValueType,
),
);
}
@@ -3873,7 +3873,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
node.otherwise,
{
for (InternalVariable variable
in node.patternGuard.pattern.internalDeclaredVariables)
in node.patternGuard.pattern.declaredVariables)
variable.cosmeticName!: variable.astVariable,
},
);
@@ -4289,21 +4289,21 @@ class InferenceVisitorImpl extends InferenceVisitorBase
inferredSpreadTypes: inferredSpreadTypes,
inferredConditionTypes: inferredConditionTypes,
);
IfCaseStatementResult<InvalidExpression>
analysisResult = analyzeIfCaseElement(
node: element,
expression: element.expression,
pattern: element.internalPatternGuard.pattern,
variables: {
for (InternalVariable variable
in element.internalPatternGuard.pattern.internalDeclaredVariables)
variable.cosmeticName!: variable.astVariable,
},
guard: element.internalPatternGuard.guard,
ifTrue: element.then,
ifFalse: element.otherwise,
context: context,
);
IfCaseStatementResult<InvalidExpression> analysisResult =
analyzeIfCaseElement(
node: element,
expression: element.expression,
pattern: element.internalPatternGuard.pattern,
variables: {
for (InternalVariable variable
in element.internalPatternGuard.pattern.declaredVariables)
variable.cosmeticName!: variable.astVariable,
},
guard: element.internalPatternGuard.guard,
ifTrue: element.then,
ifFalse: element.otherwise,
context: context,
);
element.matchedValueType = analysisResult.matchedExpressionType
.unwrapTypeView();
@@ -7416,7 +7416,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
pattern: entry.internalPatternGuard.pattern,
variables: {
for (InternalVariable variable
in entry.internalPatternGuard.pattern.internalDeclaredVariables)
in entry.internalPatternGuard.pattern.declaredVariables)
variable.cosmeticName!: variable.astVariable,
},
guard: entry.internalPatternGuard.guard,
@@ -14454,16 +14454,16 @@ class InferenceVisitorImpl extends InferenceVisitorBase
return analyzeLogicalOrPatternSchema(node.left, node.right);
case InternalRecordPattern():
return analyzeRecordPatternSchema(
fields: <RecordPatternField<TreeNode, Pattern>>[
fields: <RecordPatternField<TreeNode, InternalPattern>>[
for (InternalPattern element in node.patterns)
if (element is InternalNamedPattern)
new RecordPatternField<TreeNode, Pattern>(
new RecordPatternField<TreeNode, InternalPattern>(
node: element,
name: element.name,
pattern: element.pattern,
)
else
new RecordPatternField<TreeNode, Pattern>(
new RecordPatternField<TreeNode, InternalPattern>(
node: element,
name: null,
pattern: element,
@@ -14725,8 +14725,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
(node as InternalSwitchExpression).cases[index];
InternalPattern pattern = switchExpressionCase.patternGuard.pattern;
Map<String, Variable> variables = {
for (InternalVariable declaredVariable
in pattern.internalDeclaredVariables)
for (InternalVariable declaredVariable in pattern.declaredVariables)
declaredVariable.cosmeticName!: declaredVariable.astVariable,
};
return new SwitchExpressionMemberInfo<TreeNode, Expression, Variable>(
@@ -14769,7 +14768,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
guard: patternGuard.guard,
variables: {
for (InternalVariable variable
in patternGuard.pattern.internalDeclaredVariables)
in patternGuard.pattern.declaredVariables)
variable.cosmeticName!: variable.astVariable,
},
),
@@ -15025,7 +15024,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
// Coverage-ignore-block(suite): Not run.
replacement = extern.createInvalidPattern(
error: error,
declaredVariables: node.internalDeclaredVariables,
declaredVariables: node.declaredVariables,
);
}
@@ -15070,7 +15069,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
// Coverage-ignore-block(suite): Not run.
replacement = extern.createInvalidPattern(
error: error,
declaredVariables: node.internalDeclaredVariables,
declaredVariables: node.declaredVariables,
);
}
@@ -15103,7 +15102,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
if (error != null) {
replacement = extern.createInvalidPattern(
error: error,
declaredVariables: node.internalDeclaredVariables,
declaredVariables: node.declaredVariables,
);
}
@@ -15173,17 +15172,8 @@ class InferenceVisitorImpl extends InferenceVisitorBase
]),
);
Object? rewrite = popRewrite();
Pattern right = node.right;
if (!identical(rewrite, node.right)) {
right = rewrite as Pattern;
}
rewrite = popRewrite();
Pattern left = node.left;
if (!identical(rewrite, node.left)) {
left = rewrite as Pattern;
}
Pattern right = popRewrite() as Pattern;
Pattern left = popRewrite() as Pattern;
pushRewrite(
extern.createAndPattern(
@@ -15222,32 +15212,22 @@ class InferenceVisitorImpl extends InferenceVisitorBase
// Coverage-ignore-block(suite): Not run.
replacement = extern.createInvalidPattern(
error: error,
declaredVariables: node.internalDeclaredVariables,
declaredVariables: node.declaredVariables,
);
}
Object? rewrite = popRewrite();
Pattern right = node.right;
if (!identical(rewrite, node.right)) {
right = rewrite as Pattern;
}
rewrite = popRewrite();
Pattern left = node.left;
if (!identical(rewrite, node.left)) {
left = rewrite as Pattern;
}
Pattern right = popRewrite() as Pattern;
Pattern left = popRewrite() as Pattern;
Map<String, Variable> leftDeclaredVariablesByName = {
for (InternalVariable variable in node.left.internalDeclaredVariables)
for (InternalVariable variable in node.left.declaredVariables)
variable.cosmeticName!: variable.astVariable,
};
Map<String, Variable> jointVariableNames = {
for (InternalVariable variable in node.orPatternJointVariables)
variable.cosmeticName!: variable.astVariable,
};
for (InternalVariable rightVariable
in node.right.internalDeclaredVariables) {
for (InternalVariable rightVariable in node.right.declaredVariables) {
String rightVariableName = rightVariable.cosmeticName!;
Variable? leftVariable = leftDeclaredVariablesByName[rightVariableName];
Variable? jointVariable = jointVariableNames[rightVariableName];
@@ -15300,11 +15280,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
checkStack(node, stackBase, [/* subpattern = */ ValueKinds.Pattern]),
);
Object? rewrite = popRewrite();
Pattern pattern = node.pattern;
if (!identical(rewrite, node.pattern)) {
pattern = rewrite as Pattern;
}
Pattern pattern = popRewrite() as Pattern;
pushRewrite(
extern.createCastPattern(
@@ -15345,7 +15321,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
// Coverage-ignore-block(suite): Not run.
replacement = extern.createInvalidPattern(
error: error,
declaredVariables: node.internalDeclaredVariables,
declaredVariables: node.declaredVariables,
);
}
@@ -15428,7 +15404,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
if (error != null) {
replacement = extern.createInvalidPattern(
error: error,
declaredVariables: node.internalDeclaredVariables,
declaredVariables: node.declaredVariables,
);
}
@@ -15442,7 +15418,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
if (error != null) {
patterns[i] = extern.createInvalidPattern(
error: error,
declaredVariables: node.patterns[i].internalDeclaredVariables,
declaredVariables: node.patterns[i].declaredVariables,
);
} else {
patterns[i] = rewrite as Pattern;
@@ -15635,7 +15611,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
analyzeObjectPattern(
context,
node,
fields: <RecordPatternField<TreeNode, Pattern>>[
fields: <RecordPatternField<TreeNode, InternalPattern>>[
for (InternalNamedPattern field in node.fields)
new RecordPatternField(
node: field,
@@ -15667,7 +15643,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
// Coverage-ignore-block(suite): Not run.
replacement = extern.createInvalidPattern(
error: error,
declaredVariables: node.internalDeclaredVariables,
declaredVariables: node.declaredVariables,
);
}
@@ -15686,7 +15662,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
fieldName: new Name(field.name, libraryBuilder.library),
pattern: extern.createInvalidPattern(
error: error,
declaredVariables: field.pattern.internalDeclaredVariables,
declaredVariables: field.pattern.declaredVariables,
),
fileOffset: field.fileOffset,
);
@@ -15850,7 +15826,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
pushRewrite(
extern.createInvalidPattern(
error: node.invalidExpression,
declaredVariables: node.internalDeclaredVariables,
declaredVariables: node.declaredVariables,
),
);
@@ -15887,7 +15863,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
if (error != null) {
replacement = extern.createInvalidPattern(
error: error,
declaredVariables: node.internalDeclaredVariables,
declaredVariables: node.declaredVariables,
);
}
@@ -15967,7 +15943,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
name,
isExpressionInvocation: false,
),
declaredVariables: node.internalDeclaredVariables,
declaredVariables: node.declaredVariables,
);
break;
case ObjectAccessTargetKind.objectMember:
@@ -16062,7 +16038,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
// Coverage-ignore-block(suite): Not run.
replacement = extern.createInvalidPattern(
error: error,
declaredVariables: node.internalDeclaredVariables,
declaredVariables: node.declaredVariables,
);
}
@@ -16070,7 +16046,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
if (error != null) {
replacement = extern.createInvalidPattern(
error: error,
declaredVariables: node.internalDeclaredVariables,
declaredVariables: node.declaredVariables,
);
}
@@ -16155,7 +16131,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
if (insertionIndex == 0) {
replacement ??= extern.createInvalidPattern(
error: firstError!,
declaredVariables: node.internalDeclaredVariables,
declaredVariables: node.declaredVariables,
fileOffset: node.fileOffset,
);
}
@@ -16190,7 +16166,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
int? stackBase;
assert(checkStackBase(node, stackBase = stackHeight));
List<RecordPatternField<TreeNode, Pattern>> fields = [
List<RecordPatternField<TreeNode, InternalPattern>> fields = [
for (InternalPattern fieldPattern in node.patterns)
new RecordPatternField(
node: fieldPattern,
@@ -16223,7 +16199,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
if (error != null) {
replacement = extern.createInvalidPattern(
error: error,
declaredVariables: node.internalDeclaredVariables,
declaredVariables: node.declaredVariables,
);
}
@@ -16360,7 +16336,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
fileOffset: node.fileOffset,
length: node.variableName.length,
),
declaredVariables: node.internalDeclaredVariables,
declaredVariables: node.declaredVariables,
);
}
} else if (variable.isStaticLate) {
@@ -16375,7 +16351,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
fileOffset: node.fileOffset,
length: node.variableName.length,
),
declaredVariables: node.internalDeclaredVariables,
declaredVariables: node.declaredVariables,
);
}
} else if (variable.isFinal &&
@@ -16392,7 +16368,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
fileOffset: node.fileOffset,
length: node.variableName.length,
),
declaredVariables: node.internalDeclaredVariables,
declaredVariables: node.declaredVariables,
);
}
@@ -16417,7 +16393,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
if (error != null) {
replacement ??= extern.createInvalidPattern(
error: error,
declaredVariables: node.internalDeclaredVariables,
declaredVariables: node.declaredVariables,
);
}
@@ -16616,9 +16592,9 @@ class InferenceVisitorImpl extends InferenceVisitorBase
@override
(Member?, SharedTypeView) resolveObjectPatternPropertyGet({
required Pattern objectPattern,
required InternalPattern objectPattern,
required SharedTypeView receiverType,
required shared.RecordPatternField<TreeNode, Pattern> field,
required shared.RecordPatternField<TreeNode, InternalPattern> field,
}) {
String fieldName = field.name!;
ObjectAccessTarget fieldAccessTarget = findInterfaceMember(
@@ -16660,7 +16636,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
}
@override
Pattern? getRestPatternElementPattern(TreeNode node) {
InternalPattern? getRestPatternElementPattern(TreeNode node) {
if (node is InternalMapPatternRestEntry) {
return null;
} else {
@@ -16669,7 +16645,10 @@ class InferenceVisitorImpl extends InferenceVisitorBase
}
@override
void handleListPatternRestElement(Pattern container, TreeNode restElement) {
void handleListPatternRestElement(
InternalPattern container,
TreeNode restElement,
) {
InternalRestPattern restPattern = restElement as InternalRestPattern;
int? stackBase;
Pattern? subPattern;
@@ -16704,21 +16683,24 @@ class InferenceVisitorImpl extends InferenceVisitorBase
}
@override
void handleMapPatternRestElement(Pattern container, TreeNode restElement) {
void handleMapPatternRestElement(
InternalPattern container,
TreeNode restElement,
) {
pushRewrite(
extern.createMapPatternRestEntry(fileOffset: container.fileOffset),
);
}
@override
shared.MapPatternEntry<Expression, Pattern>? getMapPatternEntry(
shared.MapPatternEntry<Expression, InternalPattern>? getMapPatternEntry(
TreeNode element,
) {
element as InternalMapPatternEntry;
if (element is InternalMapPatternRestEntry) {
return null;
} else {
return new shared.MapPatternEntry<Expression, Pattern>(
return new shared.MapPatternEntry<Expression, InternalPattern>(
key: element.key,
value: element.value,
);
@@ -16727,7 +16709,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
@override
void handleMapPatternEntry(
Pattern container,
InternalPattern container,
covariant InternalMapPatternEntry entryElement,
SharedTypeView keyType,
) {
@@ -4692,7 +4692,7 @@ abstract class InferenceVisitorBase implements InferenceVisitor {
/// given [iterable].
PatternForInData inferPatternForInHeader({
required TreeNode node,
required Pattern pattern,
required InternalPattern pattern,
required Expression iterable,
required bool isAsync,
required int inOffset,
@@ -24,7 +24,7 @@ class SharedTypeAnalyzerErrors
Statement,
Expression,
Variable,
Pattern,
InternalPattern,
InvalidExpression
> {
final InferenceVisitorImpl visitor;
@@ -76,8 +76,8 @@ class SharedTypeAnalyzerErrors
@override
InvalidExpression duplicateAssignmentPatternVariable({
required Variable variable,
required Pattern original,
required Pattern duplicate,
required InternalPattern original,
required InternalPattern duplicate,
}) {
return problemReporting.buildProblem(
compilerContext: compilerContext,
@@ -99,10 +99,10 @@ class SharedTypeAnalyzerErrors
@override
InvalidExpression duplicateRecordPatternField({
required Pattern objectOrRecordPattern,
required InternalPattern objectOrRecordPattern,
required String name,
required RecordPatternField<TreeNode, Pattern> original,
required RecordPatternField<TreeNode, Pattern> duplicate,
required RecordPatternField<TreeNode, InternalPattern> original,
required RecordPatternField<TreeNode, InternalPattern> duplicate,
}) {
return problemReporting.buildProblem(
compilerContext: compilerContext,
@@ -122,7 +122,7 @@ class SharedTypeAnalyzerErrors
@override
InvalidExpression duplicateRestPattern({
required Pattern mapOrListPattern,
required InternalPattern mapOrListPattern,
required TreeNode original,
required TreeNode duplicate,
}) {
@@ -143,7 +143,7 @@ class SharedTypeAnalyzerErrors
}
@override
InvalidExpression emptyMapPattern({required Pattern pattern}) {
InvalidExpression emptyMapPattern({required InternalPattern pattern}) {
return problemReporting.buildProblem(
compilerContext: compilerContext,
message: diag.emptyMapPattern,
@@ -170,7 +170,7 @@ class SharedTypeAnalyzerErrors
@override
InvalidExpression? matchedTypeIsStrictlyNonNullable({
required Pattern pattern,
required InternalPattern pattern,
required SharedTypeView matchedType,
}) {
// These are only warnings, so we don't report anything.
@@ -179,7 +179,7 @@ class SharedTypeAnalyzerErrors
@override
void matchedTypeIsSubtypeOfRequired({
required Pattern pattern,
required InternalPattern pattern,
required SharedTypeView matchedType,
required SharedTypeView requiredType,
}) {
@@ -217,7 +217,7 @@ class SharedTypeAnalyzerErrors
@override
InvalidExpression patternTypeMismatchInIrrefutableContext({
required Pattern pattern,
required InternalPattern pattern,
required TreeNode context,
required SharedTypeView matchedType,
required SharedTypeView requiredType,
@@ -236,7 +236,7 @@ class SharedTypeAnalyzerErrors
@override
InvalidExpression refutablePatternInIrrefutableContext({
required covariant Pattern pattern,
required covariant InternalPattern pattern,
required TreeNode context,
}) {
return problemReporting.buildProblem(
@@ -268,7 +268,7 @@ class SharedTypeAnalyzerErrors
@override
InvalidExpression relationalPatternOperatorReturnTypeNotAssignableToBool({
required Pattern pattern,
required InternalPattern pattern,
required SharedTypeView returnType,
}) {
return problemReporting.buildProblem(
@@ -285,7 +285,7 @@ class SharedTypeAnalyzerErrors
@override
InvalidExpression restPatternInMap({
required Pattern node,
required InternalPattern node,
required TreeNode element,
}) {
return problemReporting.buildProblem(
@@ -313,7 +313,7 @@ class SharedTypeAnalyzerErrors
@override
void unnecessaryWildcardPattern({
required Pattern pattern,
required InternalPattern pattern,
required UnnecessaryWildcardKind kind,
}) {
// TODO(scheglov): implement unnecessaryWildcardPattern
@@ -411,10 +411,27 @@ for (void e in null) {}''',
testStatement(
new InternalForInStatement(
new PatternForInElement(
pattern: new RecordPattern([
new VariablePattern(const VoidType(), new LegacyVariable('a')),
new VariablePattern(null, new LegacyVariable('b')),
]),
pattern: new InternalRecordPattern(
patterns: [
new InternalVariablePattern(
type: const VoidType(),
variable: new VariableDeclarationImpl(
'a',
fileOffset: TreeNode.noOffset,
),
fileOffset: TreeNode.noOffset,
),
new InternalVariablePattern(
type: null,
variable: new VariableDeclarationImpl(
'b',
fileOffset: TreeNode.noOffset,
),
fileOffset: TreeNode.noOffset,
),
],
fileOffset: TreeNode.noOffset,
),
inOffset: -1,
),
new NullLiteral(),