From 8492bfd7aca31d51ba60d8849d576956695bfcaf Mon Sep 17 00:00:00 2001 From: Johnni Winther Date: Mon, 8 Jun 2026 05:45:44 -0700 Subject: [PATCH] [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 --- .../lib/src/kernel/body_builder.dart | 50 +++-- .../lib/src/kernel/expression_generator.dart | 8 +- .../lib/src/kernel/internal_ast.dart | 95 +++++----- .../lib/src/kernel/internal_ast_helper.dart | 43 +++-- .../src/type_inference/inference_visitor.dart | 176 ++++++++---------- .../inference_visitor_base.dart | 2 +- .../type_inference/shared_type_analyzer.dart | 30 +-- ...internal_ast_text_representation_test.dart | 25 ++- 8 files changed, 221 insertions(+), 208 deletions(-) diff --git a/pkg/front_end/lib/src/kernel/body_builder.dart b/pkg/front_end/lib/src/kernel/body_builder.dart index 5161b92e5ef..4b14c732a0d 100644 --- a/pkg/front_end/lib/src/kernel/body_builder.dart +++ b/pkg/front_end/lib/src/kernel/body_builder.dart @@ -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 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 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 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 intermediateVariables = []; List 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 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); diff --git a/pkg/front_end/lib/src/kernel/expression_generator.dart b/pkg/front_end/lib/src/kernel/expression_generator.dart index 40c9eb3c0be..413f32a1488 100644 --- a/pkg/front_end/lib/src/kernel/expression_generator.dart +++ b/pkg/front_end/lib/src/kernel/expression_generator.dart @@ -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: [], diff --git a/pkg/front_end/lib/src/kernel/internal_ast.dart b/pkg/front_end/lib/src/kernel/internal_ast.dart index 74f5921220a..36e9aa1b5b5 100644 --- a/pkg/front_end/lib/src/kernel/internal_ast.dart +++ b/pkg/front_end/lib/src/kernel/internal_ast.dart @@ -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; + shared.MatchContext; 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 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 get declaredVariables; @override - @Deprecated('Use internalDeclaredVariables instead') - List get declaredVariables => - unsupported("${runtimeType}.declaredVariables", -1, null); + R accept(TreeVisitor v) => + unsupported("${runtimeType}.accept", -1, null); + + @override + R accept1(TreeVisitor1 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 orPatternJointVariables; @override - List get internalDeclaredVariables => - orPatternJointVariables; + List get declaredVariables => orPatternJointVariables; new( this.left, @@ -7064,9 +7080,9 @@ class InternalAndPattern extends InternalPattern { final InternalPattern right; @override - List get internalDeclaredVariables => [ - ...left.internalDeclaredVariables, - ...right.internalDeclaredVariables, + List get declaredVariables => [ + ...left.declaredVariables, + ...right.declaredVariables, ]; new(this.left, this.right, {required int fileOffset}) { @@ -7107,7 +7123,7 @@ class InternalConstantPattern extends InternalPattern { } @override - List get internalDeclaredVariables => const []; + List get declaredVariables => const []; @override shared.PatternResult acceptInference( @@ -7137,7 +7153,7 @@ class InternalAssignedVariablePattern extends InternalPattern { } @override - List get internalDeclaredVariables => const []; + List get declaredVariables => const []; @override String get variableName => variable.cosmeticName!; @@ -7176,8 +7192,7 @@ class InternalCastPattern extends InternalPattern { String? get variableName => pattern.variableName; @override - List get internalDeclaredVariables => - pattern.internalDeclaredVariables; + List get declaredVariables => pattern.declaredVariables; @override shared.PatternResult acceptInference( @@ -7205,11 +7220,11 @@ class InternalInvalidPattern extends InternalPattern { final Expression invalidExpression; @override - final List internalDeclaredVariables; + final List 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 patterns; @override - List get internalDeclaredVariables => [ - for (InternalPattern pattern in patterns) - ...pattern.internalDeclaredVariables, + List 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 entries; @override - List get internalDeclaredVariables => [ + List 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 get internalDeclaredVariables => - pattern.internalDeclaredVariables; + List 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 get internalDeclaredVariables => - pattern.internalDeclaredVariables; + List get declaredVariables => pattern.declaredVariables; @override shared.PatternResult acceptInference( @@ -7505,8 +7517,7 @@ class InternalNullCheckPattern extends InternalPattern { String? get variableName => pattern.variableName; @override - List get internalDeclaredVariables => - pattern.internalDeclaredVariables; + List get declaredVariables => pattern.declaredVariables; @override shared.PatternResult acceptInference( @@ -7555,10 +7566,9 @@ class InternalObjectPattern extends InternalPattern { } @override - List get internalDeclaredVariables { + List 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 patterns; @override - List get internalDeclaredVariables => [ - for (InternalPattern pattern in patterns) - ...pattern.internalDeclaredVariables, + List 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 get internalDeclaredVariables => const []; + List get declaredVariables => const []; @override shared.PatternResult acceptInference( @@ -7694,8 +7703,8 @@ class InternalRestPattern extends InternalPattern { } @override - List get internalDeclaredVariables => - subPattern?.internalDeclaredVariables ?? const []; + List get declaredVariables => + subPattern?.declaredVariables ?? const []; @override shared.PatternResult acceptInference( @@ -7730,7 +7739,7 @@ class InternalVariablePattern extends InternalPattern { final InternalVariable variable; @override - List get internalDeclaredVariables => [variable]; + List 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 get internalDeclaredVariables => const []; + List get declaredVariables => const []; @override shared.PatternResult acceptInference( diff --git a/pkg/front_end/lib/src/kernel/internal_ast_helper.dart b/pkg/front_end/lib/src/kernel/internal_ast_helper.dart index 65126c146d9..b002fe286ee 100644 --- a/pkg/front_end/lib/src/kernel/internal_ast_helper.dart +++ b/pkg/front_end/lib/src/kernel/internal_ast_helper.dart @@ -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 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 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 fields, required Typedef? typedef, @@ -1275,7 +1281,10 @@ Expression createPropertySet( )..fileOffset = fileOffset; } -Pattern createRecordPattern(int fileOffset, List patterns) { +InternalPattern createRecordPattern( + int fileOffset, + List 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); } diff --git a/pkg/front_end/lib/src/type_inference/inference_visitor.dart b/pkg/front_end/lib/src/type_inference/inference_visitor.dart index 931df56bf53..f23f4ce2bb6 100644 --- a/pkg/front_end/lib/src/type_inference/inference_visitor.dart +++ b/pkg/front_end/lib/src/type_inference/inference_visitor.dart @@ -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 - 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 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: >[ + fields: >[ for (InternalPattern element in node.patterns) if (element is InternalNamedPattern) - new RecordPatternField( + new RecordPatternField( node: element, name: element.name, pattern: element.pattern, ) else - new RecordPatternField( + new RecordPatternField( 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 variables = { - for (InternalVariable declaredVariable - in pattern.internalDeclaredVariables) + for (InternalVariable declaredVariable in pattern.declaredVariables) declaredVariable.cosmeticName!: declaredVariable.astVariable, }; return new SwitchExpressionMemberInfo( @@ -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 leftDeclaredVariablesByName = { - for (InternalVariable variable in node.left.internalDeclaredVariables) + for (InternalVariable variable in node.left.declaredVariables) variable.cosmeticName!: variable.astVariable, }; Map 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: >[ + fields: >[ 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> fields = [ + List> 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 field, + required shared.RecordPatternField 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? getMapPatternEntry( + shared.MapPatternEntry? getMapPatternEntry( TreeNode element, ) { element as InternalMapPatternEntry; if (element is InternalMapPatternRestEntry) { return null; } else { - return new shared.MapPatternEntry( + return new shared.MapPatternEntry( 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, ) { diff --git a/pkg/front_end/lib/src/type_inference/inference_visitor_base.dart b/pkg/front_end/lib/src/type_inference/inference_visitor_base.dart index 7e115524575..36d54609694 100644 --- a/pkg/front_end/lib/src/type_inference/inference_visitor_base.dart +++ b/pkg/front_end/lib/src/type_inference/inference_visitor_base.dart @@ -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, diff --git a/pkg/front_end/lib/src/type_inference/shared_type_analyzer.dart b/pkg/front_end/lib/src/type_inference/shared_type_analyzer.dart index a1c3c15f9d8..c69e5c53edb 100644 --- a/pkg/front_end/lib/src/type_inference/shared_type_analyzer.dart +++ b/pkg/front_end/lib/src/type_inference/shared_type_analyzer.dart @@ -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 original, - required RecordPatternField duplicate, + required RecordPatternField original, + required RecordPatternField 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 diff --git a/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart b/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart index f02e55d17bb..c5f403e1997 100644 --- a/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart +++ b/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart @@ -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(),