Files
sdk/pkg/front_end/parser_testcases/patterns/functionExpression_allowed_insideSwitchStatementInWhenClause.dart.intertwined.expect
T
Paul Berry 104ac30cf4 Parser: clean up handling of variable patterns.
The listener API for variable patterns is split into three separate
functions, to handle the three separate behaviors:

- `handleAssignedVariablePattern` for variable names appearing in an
  assignment context (these assign to an existing variable upon a
  successful match).

- `handleDeclaredVariablePattern` for variable declarations appearing
  in a declaration or matching context (these cause a new variable
  name to come into scope).

- `handleWildcardPattern` for wildcards in any context (these don't
  capture the matched value).

Also, responsibility is shifted to the parser for reporting the
following error conditions:

- VariablePatternKeywordInDeclarationContext (e.g.
  `var (var x) = ...;`)

- PatternAssignmentDeclaresVariable (e.g. `[x, var y] = ...;`)

Previously these errors were detected by the implementations, and
weren't fully covering all possible error scenarios.

In the case of VariablePatternKeywordInDeclarationContext, the
listener method `handleDeclaredVariablePattern` is called instead of
`handleAssignedVariablePattern`.  This ensures that no tokens are
dropped from the analyzer AST.  The CFE uses the `inAssignmentPattern`
argument of `handleDeclaredVariablePattern` to distinguish this error
recovery case from a legitimate declared variable pattern.

Fixes #51868.

Bug: https://github.com/dart-lang/sdk/issues/51868
Change-Id: I28ec679b73d64033166721c6460be35f15e23171
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/291583
Reviewed-by: Jens Johansen <jensj@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2023-03-30 14:12:03 +00:00

155 lines
9.2 KiB
Plaintext

parseUnit(f)
skipErrorTokens(f)
listener: beginCompilationUnit(f)
syntheticPreviousToken(f)
parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
parseMetadataStar()
listener: beginMetadataStar(f)
listener: endMetadataStar(0)
parseTopLevelMemberImpl()
listener: beginTopLevelMember(f)
isReservedKeyword(()
parseTopLevelMethod(, null, null, , Instance of 'NoType', null, f, false)
listener: beginTopLevelMethod(, null, null)
listener: handleNoType()
ensureIdentifierPotentiallyRecovered(, topLevelFunctionDeclaration, false)
listener: handleIdentifier(f, topLevelFunctionDeclaration)
parseMethodTypeVar(f)
listener: handleNoTypeVariables(()
parseGetterOrFormalParameters(f, f, false, MemberKind.TopLevelMethod)
parseFormalParameters(f, MemberKind.TopLevelMethod)
parseFormalParametersRest((, MemberKind.TopLevelMethod)
listener: beginFormalParameters((, MemberKind.TopLevelMethod)
parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod)
parseMetadataStar(()
listener: beginMetadataStar(x)
listener: endMetadataStar(0)
listener: beginFormalParameter(x, MemberKind.TopLevelMethod, null, null, null)
listener: handleNoType(()
ensureIdentifier((, formalParameterDeclaration)
listener: handleIdentifier(x, formalParameterDeclaration)
listener: handleFormalParameterWithoutValue(,)
listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod)
parseFormalParameter(,, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod)
parseMetadataStar(,)
listener: beginMetadataStar(y)
listener: endMetadataStar(0)
listener: beginFormalParameter(y, MemberKind.TopLevelMethod, null, null, null)
listener: handleNoType(,)
ensureIdentifier(,, formalParameterDeclaration)
listener: handleIdentifier(y, formalParameterDeclaration)
listener: handleFormalParameterWithoutValue())
listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod)
listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
parseAsyncModifierOpt())
listener: handleAsyncModifier(null, null)
inPlainSync()
parseFunctionBody(), false, false)
listener: beginBlockFunctionBody({)
notEofOrValue(}, switch)
parseStatement({)
parseStatementX({)
parseSwitchStatement({)
listener: beginSwitchStatement(switch)
ensureParenthesizedCondition(switch, allowCase: false)
parseExpressionInParenthesisRest((, allowCase: false)
parseExpression(()
looksLikeOuterPatternEquals(()
skipOuterPattern(()
skipObjectPatternRest(x)
parsePrecedenceExpression((, 1, true, ConstantPatternContext.none)
parseUnaryExpression((, true, ConstantPatternContext.none)
parsePrimary((, expression, ConstantPatternContext.none)
parseSendOrFunctionLiteral((, expression, ConstantPatternContext.none)
parseSend((, expression, ConstantPatternContext.none)
isNextIdentifier(()
ensureIdentifier((, expression)
listener: handleIdentifier(x, expression)
listener: handleNoTypeArguments())
parseArgumentsOpt(x)
listener: handleNoArguments())
listener: handleSend(x, ))
ensureCloseParen(x, ()
listener: handleParenthesizedCondition((, null, null)
parseSwitchBlock())
ensureBlock(), null, switch statement)
listener: beginSwitchBlock({)
notEofOrValue(}, case)
peekPastLabels(case)
listener: beginCaseExpression(case)
parsePattern(case, PatternContext.matching, precedence: 1)
parsePrimaryPattern(case, PatternContext.matching)
parseVariablePattern(case, PatternContext.matching, typeInfo: Instance of 'NoType')
listener: handleNoType(_)
listener: handleWildcardPattern(null, _)
listener: beginSwitchCaseWhenClause(when)
parseExpression(when)
looksLikeOuterPatternEquals(when)
skipOuterPattern(when)
skipObjectPatternRest(y)
parsePrecedenceExpression(when, 1, true, ConstantPatternContext.none)
parseUnaryExpression(when, true, ConstantPatternContext.none)
parsePrimary(when, expression, ConstantPatternContext.none)
parseSendOrFunctionLiteral(when, expression, ConstantPatternContext.none)
parseSend(when, expression, ConstantPatternContext.none)
isNextIdentifier(when)
ensureIdentifier(when, expression)
listener: handleIdentifier(y, expression)
listener: handleNoTypeArguments(+)
parseArgumentsOpt(y)
listener: handleNoArguments(+)
listener: handleSend(y, +)
listener: beginBinaryExpression(+)
parsePrecedenceExpression(+, 14, true, ConstantPatternContext.none)
parseUnaryExpression(+, true, ConstantPatternContext.none)
parsePrimary(+, expression, ConstantPatternContext.none)
parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(+, ConstantPatternContext.none)
listener: handleNoTypeVariables(()
parseFunctionExpression(+)
listener: beginFunctionExpression(()
parseFormalParametersRequiredOpt(+, MemberKind.Local)
parseFormalParametersRest((, MemberKind.Local)
listener: beginFormalParameters((, MemberKind.Local)
listener: endFormalParameters(0, (, ), MemberKind.Local)
parseAsyncOptBody(), true, false)
parseAsyncModifierOpt())
listener: handleAsyncModifier(null, null)
inPlainSync()
parseFunctionBody(), true, false)
parseExpressionFunctionBody(=>, true)
parseExpression(=>)
looksLikeOuterPatternEquals(=>)
skipOuterPattern(=>)
parsePrecedenceExpression(=>, 1, true, ConstantPatternContext.none)
parseUnaryExpression(=>, true, ConstantPatternContext.none)
parsePrimary(=>, expression, ConstantPatternContext.none)
parseLiteralInt(=>)
listener: handleLiteralInt(0)
listener: handleExpressionFunctionBody(=>, null)
inGenerator()
listener: endFunctionExpression((, :)
listener: endBinaryExpression(+)
listener: endSwitchCaseWhenClause(0)
ensureColon(0)
listener: endCaseExpression(case, when, :)
peekPastLabels(break)
parseStatementsInSwitchCase(:, break, case, 0, 1, null, null)
listener: beginSwitchCase(0, 1, case)
parseStatement(:)
parseStatementX(:)
parseBreakStatement(:)
isBreakAllowed()
ensureSemicolon(break)
listener: handleBreakStatement(false, break, ;)
peekPastLabels(})
listener: endSwitchCase(0, 1, null, null, 1, case, })
notEofOrValue(}, })
listener: endSwitchBlock(1, {, })
listener: endSwitchStatement(switch, })
notEofOrValue(}, })
listener: endBlockFunctionBody(1, {, })
listener: endTopLevelMethod(f, null, })
listener: endTopLevelDeclaration()
reportAllErrorTokens(f)
listener: endCompilationUnit(1, )