3a1f732c0f
This CL:
* Changes the events so beginX and endX events always comes in pairs
(though technically not right as some specific events can be beginX
endY --- but in those cases it is at least documented and used in code
that actually tests it).
-> This entails adding some events and converting something from
"beginX" to "handleX" instead.
* Adds a utility that can generate an AST of sorts directly from the
parser via a listener using the begin/end matching (and knowing of the
specific ones that doesn't match directly).
* Adds a test that checks that - at least for all tested (50,000+) files
- the AST actually generate "correctly", i.e. matches up begin/ends
and ends up with a single top entry "CompilationUnit".
* Adds a different visualization to the parser listener events by
displaying the "AST directly from the parser" in a UI that can be
navigated. The visualization may not be the best, but it's certainly
a stepping stone.
Change-Id: I9b27f7bbf3be442adc92f357c7b3c46da6f84cf7
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/159664
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
507 lines
28 KiB
Plaintext
507 lines
28 KiB
Plaintext
parseUnit(main)
|
|
skipErrorTokens(main)
|
|
listener: beginCompilationUnit(main)
|
|
syntheticPreviousToken(main)
|
|
parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
|
|
parseMetadataStar()
|
|
listener: beginMetadataStar(main)
|
|
listener: endMetadataStar(0)
|
|
parseTopLevelMemberImpl()
|
|
listener: beginTopLevelMember(main)
|
|
isReservedKeyword(()
|
|
parseTopLevelMethod(, null, , Instance of 'NoType', null, main, false)
|
|
listener: beginTopLevelMethod(, null)
|
|
listener: handleNoType()
|
|
ensureIdentifierPotentiallyRecovered(, topLevelFunctionDeclaration, false)
|
|
listener: handleIdentifier(main, topLevelFunctionDeclaration)
|
|
parseMethodTypeVar(main)
|
|
listener: handleNoTypeVariables(()
|
|
parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
|
|
parseFormalParameters(main, MemberKind.TopLevelMethod)
|
|
parseFormalParametersRest((, MemberKind.TopLevelMethod)
|
|
listener: beginFormalParameters((, MemberKind.TopLevelMethod)
|
|
listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
|
|
parseAsyncModifierOpt())
|
|
listener: handleAsyncModifier(null, null)
|
|
inPlainSync()
|
|
parseFunctionBody(), false, false)
|
|
listener: beginBlockFunctionBody({)
|
|
notEofOrValue(}, dynamic)
|
|
parseStatement({)
|
|
parseStatementX({)
|
|
parseExpressionStatementOrDeclaration({, false)
|
|
parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
|
|
looksLikeLocalFunction(foo)
|
|
listener: beginMetadataStar(dynamic)
|
|
listener: endMetadataStar(0)
|
|
listener: handleIdentifier(dynamic, typeReference)
|
|
listener: handleNoTypeArguments(foo)
|
|
listener: handleType(dynamic, null)
|
|
listener: beginVariablesDeclaration(foo, null, null)
|
|
parseVariablesDeclarationRest(dynamic, true)
|
|
parseOptionallyInitializedIdentifier(dynamic)
|
|
ensureIdentifier(dynamic, localVariableDeclaration)
|
|
listener: handleIdentifier(foo, localVariableDeclaration)
|
|
listener: beginInitializedIdentifier(foo)
|
|
parseVariableInitializerOpt(foo)
|
|
listener: beginVariableInitializer(=)
|
|
parseExpression(=)
|
|
parsePrecedenceExpression(=, 1, true)
|
|
parseUnaryExpression(=, true)
|
|
parsePrimary(=, expression)
|
|
parseNewExpression(=)
|
|
listener: beginNewExpression(new)
|
|
parseConstructorReference(new, null)
|
|
ensureIdentifier(new, constructorReference)
|
|
listener: handleIdentifier(X, constructorReference)
|
|
listener: beginConstructorReference(X)
|
|
parseQualifiedRestOpt(X, constructorReferenceContinuation)
|
|
listener: handleNoTypeArguments(()
|
|
listener: handleNoConstructorReferenceContinuationAfterTypeArguments(()
|
|
listener: endConstructorReference(X, null, ()
|
|
parseConstructorInvocationArguments(X)
|
|
parseArgumentsRest(()
|
|
listener: beginArguments(()
|
|
listener: endArguments(0, (, ))
|
|
listener: endNewExpression(new)
|
|
listener: endVariableInitializer(=)
|
|
listener: endInitializedIdentifier(foo)
|
|
ensureSemicolon())
|
|
listener: endVariablesDeclaration(1, ;)
|
|
notEofOrValue(}, var)
|
|
parseStatement(;)
|
|
parseStatementX(;)
|
|
parseExpressionStatementOrDeclarationAfterModifiers(var, ;, null, var, null, false)
|
|
looksLikeLocalFunction(bar)
|
|
listener: beginMetadataStar(var)
|
|
listener: endMetadataStar(0)
|
|
listener: handleNoType(var)
|
|
listener: beginVariablesDeclaration(bar, null, var)
|
|
parseVariablesDeclarationRest(var, true)
|
|
parseOptionallyInitializedIdentifier(var)
|
|
ensureIdentifier(var, localVariableDeclaration)
|
|
listener: handleIdentifier(bar, localVariableDeclaration)
|
|
listener: beginInitializedIdentifier(bar)
|
|
parseVariableInitializerOpt(bar)
|
|
listener: beginVariableInitializer(=)
|
|
parseExpression(=)
|
|
parsePrecedenceExpression(=, 1, true)
|
|
parseUnaryExpression(=, true)
|
|
parsePrimary(=, expression)
|
|
parseSendOrFunctionLiteral(=, expression)
|
|
parseSend(=, expression)
|
|
ensureIdentifier(=, expression)
|
|
listener: handleIdentifier(foo, expression)
|
|
listener: handleNoTypeArguments(.)
|
|
parseArgumentsOpt(foo)
|
|
listener: handleNoArguments(.)
|
|
listener: handleSend(foo, .)
|
|
parsePrimary(., expressionContinuation)
|
|
inPlainSync()
|
|
parseSendOrFunctionLiteral(., expressionContinuation)
|
|
parseSend(., expressionContinuation)
|
|
ensureIdentifier(., expressionContinuation)
|
|
inPlainSync()
|
|
listener: handleIdentifier(late, expressionContinuation)
|
|
listener: handleNoTypeArguments(;)
|
|
parseArgumentsOpt(late)
|
|
listener: handleNoArguments(;)
|
|
listener: handleSend(late, ;)
|
|
listener: handleEndingBinaryExpression(.)
|
|
listener: endVariableInitializer(=)
|
|
listener: endInitializedIdentifier(bar)
|
|
ensureSemicolon(late)
|
|
listener: endVariablesDeclaration(1, ;)
|
|
notEofOrValue(}, late)
|
|
parseStatement(;)
|
|
parseStatementX(;)
|
|
parseExpressionStatementOrDeclaration(;, false)
|
|
parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
|
|
looksLikeLocalFunction(late)
|
|
parseExpressionStatement(;)
|
|
parseExpression(;)
|
|
parsePrecedenceExpression(;, 1, true)
|
|
parseUnaryExpression(;, true)
|
|
parsePrimary(;, expression)
|
|
inPlainSync()
|
|
parseSendOrFunctionLiteral(;, expression)
|
|
looksLikeFunctionBody(;)
|
|
parseSend(;, expression)
|
|
ensureIdentifier(;, expression)
|
|
inPlainSync()
|
|
listener: handleIdentifier(late, expression)
|
|
listener: handleNoTypeArguments(()
|
|
parseArgumentsOpt(late)
|
|
parseArguments(late)
|
|
parseArgumentsRest(()
|
|
listener: beginArguments(()
|
|
listener: endArguments(0, (, ))
|
|
listener: handleSend(late, ;)
|
|
ensureSemicolon())
|
|
listener: handleExpressionStatement(;)
|
|
notEofOrValue(}, bar)
|
|
parseStatement(;)
|
|
parseStatementX(;)
|
|
parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
|
|
looksLikeLocalFunction(bar)
|
|
parseExpressionStatement(;)
|
|
parseExpression(;)
|
|
parsePrecedenceExpression(;, 1, true)
|
|
parseUnaryExpression(;, true)
|
|
parsePrimary(;, expression)
|
|
parseSendOrFunctionLiteral(;, expression)
|
|
looksLikeFunctionBody(;)
|
|
parseSend(;, expression)
|
|
ensureIdentifier(;, expression)
|
|
listener: handleIdentifier(bar, expression)
|
|
listener: handleNoTypeArguments(()
|
|
parseArgumentsOpt(bar)
|
|
parseArguments(bar)
|
|
parseArgumentsRest(()
|
|
listener: beginArguments(()
|
|
listener: endArguments(0, (, ))
|
|
listener: handleSend(bar, ;)
|
|
ensureSemicolon())
|
|
listener: handleExpressionStatement(;)
|
|
notEofOrValue(}, new)
|
|
parseStatement(;)
|
|
parseStatementX(;)
|
|
parseExpressionStatementOrDeclaration(;, false)
|
|
parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
|
|
looksLikeLocalFunction(new)
|
|
parseExpressionStatement(;)
|
|
parseExpression(;)
|
|
parsePrecedenceExpression(;, 1, true)
|
|
parseUnaryExpression(;, true)
|
|
parsePrimary(;, expression)
|
|
parseNewExpression(;)
|
|
listener: beginNewExpression(new)
|
|
parseConstructorReference(new, null)
|
|
ensureIdentifier(new, constructorReference)
|
|
listener: handleIdentifier(X, constructorReference)
|
|
listener: beginConstructorReference(X)
|
|
parseQualifiedRestOpt(X, constructorReferenceContinuation)
|
|
listener: handleNoTypeArguments(()
|
|
listener: handleNoConstructorReferenceContinuationAfterTypeArguments(()
|
|
listener: endConstructorReference(X, null, ()
|
|
parseConstructorInvocationArguments(X)
|
|
parseArgumentsRest(()
|
|
listener: beginArguments(()
|
|
listener: endArguments(0, (, ))
|
|
listener: endNewExpression(new)
|
|
parsePrimary(., expressionContinuation)
|
|
inPlainSync()
|
|
parseSendOrFunctionLiteral(., expressionContinuation)
|
|
looksLikeFunctionBody(;)
|
|
parseSend(., expressionContinuation)
|
|
ensureIdentifier(., expressionContinuation)
|
|
inPlainSync()
|
|
listener: handleIdentifier(late, expressionContinuation)
|
|
listener: handleNoTypeArguments(()
|
|
parseArgumentsOpt(late)
|
|
parseArguments(late)
|
|
parseArgumentsRest(()
|
|
listener: beginArguments(()
|
|
listener: endArguments(0, (, ))
|
|
listener: handleSend(late, ;)
|
|
listener: handleEndingBinaryExpression(.)
|
|
ensureSemicolon())
|
|
listener: handleExpressionStatement(;)
|
|
notEofOrValue(}, new)
|
|
parseStatement(;)
|
|
parseStatementX(;)
|
|
parseExpressionStatementOrDeclaration(;, false)
|
|
parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
|
|
looksLikeLocalFunction(new)
|
|
parseExpressionStatement(;)
|
|
parseExpression(;)
|
|
parsePrecedenceExpression(;, 1, true)
|
|
parseUnaryExpression(;, true)
|
|
parsePrimary(;, expression)
|
|
parseNewExpression(;)
|
|
listener: beginNewExpression(new)
|
|
parseConstructorReference(new, null)
|
|
ensureIdentifier(new, constructorReference)
|
|
listener: handleIdentifier(Y, constructorReference)
|
|
listener: beginConstructorReference(Y)
|
|
parseQualifiedRestOpt(Y, constructorReferenceContinuation)
|
|
listener: handleNoTypeArguments(()
|
|
listener: handleNoConstructorReferenceContinuationAfterTypeArguments(()
|
|
listener: endConstructorReference(Y, null, ()
|
|
parseConstructorInvocationArguments(Y)
|
|
parseArgumentsRest(()
|
|
listener: beginArguments(()
|
|
listener: endArguments(0, (, ))
|
|
listener: endNewExpression(new)
|
|
parsePrimary(., expressionContinuation)
|
|
inPlainSync()
|
|
parseSendOrFunctionLiteral(., expressionContinuation)
|
|
parseSend(., expressionContinuation)
|
|
ensureIdentifier(., expressionContinuation)
|
|
inPlainSync()
|
|
listener: handleIdentifier(late, expressionContinuation)
|
|
listener: handleNoTypeArguments(;)
|
|
parseArgumentsOpt(late)
|
|
listener: handleNoArguments(;)
|
|
listener: handleSend(late, ;)
|
|
listener: handleEndingBinaryExpression(.)
|
|
ensureSemicolon(late)
|
|
listener: handleExpressionStatement(;)
|
|
notEofOrValue(}, late)
|
|
parseStatement(;)
|
|
parseStatementX(;)
|
|
parseExpressionStatementOrDeclaration(;, false)
|
|
parseExpressionStatementOrDeclarationAfterModifiers(late, ;, late, null, null, false)
|
|
looksLikeLocalFunction(foo)
|
|
listener: beginMetadataStar(late)
|
|
listener: endMetadataStar(0)
|
|
listener: handleIdentifier(int, typeReference)
|
|
listener: handleNoTypeArguments(foo)
|
|
listener: handleType(int, null)
|
|
listener: beginVariablesDeclaration(foo, late, null)
|
|
parseVariablesDeclarationRest(int, true)
|
|
parseOptionallyInitializedIdentifier(int)
|
|
ensureIdentifier(int, localVariableDeclaration)
|
|
listener: handleIdentifier(foo, localVariableDeclaration)
|
|
listener: beginInitializedIdentifier(foo)
|
|
parseVariableInitializerOpt(foo)
|
|
listener: handleNoVariableInitializer(foo)
|
|
listener: endInitializedIdentifier(foo)
|
|
ensureSemicolon(foo)
|
|
listener: endVariablesDeclaration(1, ;)
|
|
notEofOrValue(}, foo)
|
|
parseStatement(;)
|
|
parseStatementX(;)
|
|
parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
|
|
looksLikeLocalFunction(foo)
|
|
parseExpressionStatement(;)
|
|
parseExpression(;)
|
|
parsePrecedenceExpression(;, 1, true)
|
|
parseUnaryExpression(;, true)
|
|
parsePrimary(;, expression)
|
|
parseSendOrFunctionLiteral(;, expression)
|
|
parseSend(;, expression)
|
|
ensureIdentifier(;, expression)
|
|
listener: handleIdentifier(foo, expression)
|
|
listener: handleNoTypeArguments(=)
|
|
parseArgumentsOpt(foo)
|
|
listener: handleNoArguments(=)
|
|
listener: handleSend(foo, =)
|
|
parsePrecedenceExpression(=, 1, true)
|
|
parseUnaryExpression(=, true)
|
|
parsePrimary(=, expression)
|
|
parseLiteralInt(=)
|
|
listener: handleLiteralInt(42)
|
|
listener: handleAssignmentExpression(=)
|
|
ensureSemicolon(42)
|
|
listener: handleExpressionStatement(;)
|
|
notEofOrValue(}, })
|
|
listener: endBlockFunctionBody(8, {, })
|
|
listener: endTopLevelMethod(main, null, })
|
|
listener: endTopLevelDeclaration(late)
|
|
parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
|
|
parseMetadataStar(})
|
|
listener: beginMetadataStar(late)
|
|
listener: endMetadataStar(0)
|
|
parseTopLevelMemberImpl(})
|
|
listener: beginTopLevelMember(late)
|
|
isReservedKeyword(()
|
|
parseTopLevelMethod(}, null, }, Instance of 'NoType', null, late, false)
|
|
listener: beginTopLevelMethod(}, null)
|
|
listener: handleNoType(})
|
|
ensureIdentifierPotentiallyRecovered(}, topLevelFunctionDeclaration, false)
|
|
listener: handleIdentifier(late, topLevelFunctionDeclaration)
|
|
parseMethodTypeVar(late)
|
|
listener: handleNoTypeVariables(()
|
|
parseGetterOrFormalParameters(late, late, false, MemberKind.TopLevelMethod)
|
|
parseFormalParameters(late, MemberKind.TopLevelMethod)
|
|
parseFormalParametersRest((, MemberKind.TopLevelMethod)
|
|
listener: beginFormalParameters((, MemberKind.TopLevelMethod)
|
|
listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
|
|
parseAsyncModifierOpt())
|
|
listener: handleAsyncModifier(null, null)
|
|
inPlainSync()
|
|
parseFunctionBody(), false, false)
|
|
listener: beginBlockFunctionBody({)
|
|
notEofOrValue(}, print)
|
|
parseStatement({)
|
|
parseStatementX({)
|
|
parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
|
|
looksLikeLocalFunction(print)
|
|
parseExpressionStatement({)
|
|
parseExpression({)
|
|
parsePrecedenceExpression({, 1, true)
|
|
parseUnaryExpression({, true)
|
|
parsePrimary({, expression)
|
|
parseSendOrFunctionLiteral({, expression)
|
|
looksLikeFunctionBody(;)
|
|
parseSend({, expression)
|
|
ensureIdentifier({, expression)
|
|
listener: handleIdentifier(print, expression)
|
|
listener: handleNoTypeArguments(()
|
|
parseArgumentsOpt(print)
|
|
parseArguments(print)
|
|
parseArgumentsRest(()
|
|
listener: beginArguments(()
|
|
parseExpression(()
|
|
parsePrecedenceExpression((, 1, true)
|
|
parseUnaryExpression((, true)
|
|
parsePrimary((, expression)
|
|
parseLiteralString(()
|
|
parseSingleLiteralString(()
|
|
listener: beginLiteralString("hello")
|
|
listener: endLiteralString(0, ))
|
|
listener: endArguments(1, (, ))
|
|
listener: handleSend(print, ;)
|
|
ensureSemicolon())
|
|
listener: handleExpressionStatement(;)
|
|
notEofOrValue(}, })
|
|
listener: endBlockFunctionBody(1, {, })
|
|
listener: endTopLevelMethod(late, null, })
|
|
listener: endTopLevelDeclaration(class)
|
|
parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
|
|
parseMetadataStar(})
|
|
listener: beginMetadataStar(class)
|
|
listener: endMetadataStar(0)
|
|
parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
|
|
parseClassDeclarationModifiers(}, class)
|
|
parseClassOrNamedMixinApplication(null, class)
|
|
listener: beginClassOrNamedMixinApplicationPrelude(class)
|
|
ensureIdentifier(class, classOrMixinDeclaration)
|
|
listener: handleIdentifier(X, classOrMixinDeclaration)
|
|
listener: handleNoTypeVariables({)
|
|
listener: beginClassDeclaration(class, null, X)
|
|
parseClass(X, class, class, X)
|
|
parseClassHeaderOpt(X, class, class)
|
|
parseClassExtendsOpt(X)
|
|
listener: handleNoType(X)
|
|
listener: handleClassExtends(null, 1)
|
|
parseWithClauseOpt(X)
|
|
listener: handleClassNoWithClause()
|
|
parseClassOrMixinImplementsOpt(X)
|
|
listener: handleClassOrMixinImplements(null, 0)
|
|
listener: handleClassHeader(class, class, null)
|
|
parseClassOrMixinOrExtensionBody(X, DeclarationKind.Class, X)
|
|
listener: beginClassOrMixinBody(DeclarationKind.Class, {)
|
|
notEofOrValue(}, late)
|
|
parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, X)
|
|
parseMetadataStar({)
|
|
listener: beginMetadataStar(late)
|
|
listener: endMetadataStar(0)
|
|
listener: beginMember()
|
|
parseMethod({, null, null, null, null, null, null, {, Instance of 'NoType', null, late, DeclarationKind.Class, X, false)
|
|
listener: beginMethod(null, null, null, null, null, late)
|
|
listener: handleNoType({)
|
|
ensureIdentifierPotentiallyRecovered({, methodDeclaration, false)
|
|
listener: handleIdentifier(late, methodDeclaration)
|
|
parseQualifiedRestOpt(late, methodDeclarationContinuation)
|
|
parseMethodTypeVar(late)
|
|
listener: handleNoTypeVariables(()
|
|
parseGetterOrFormalParameters(late, late, false, MemberKind.NonStaticMethod)
|
|
parseFormalParameters(late, MemberKind.NonStaticMethod)
|
|
parseFormalParametersRest((, MemberKind.NonStaticMethod)
|
|
listener: beginFormalParameters((, MemberKind.NonStaticMethod)
|
|
listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
|
|
parseInitializersOpt())
|
|
listener: handleNoInitializers()
|
|
parseAsyncModifierOpt())
|
|
listener: handleAsyncModifier(null, null)
|
|
inPlainSync()
|
|
inPlainSync()
|
|
parseFunctionBody(), false, true)
|
|
listener: beginBlockFunctionBody({)
|
|
notEofOrValue(}, print)
|
|
parseStatement({)
|
|
parseStatementX({)
|
|
parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
|
|
looksLikeLocalFunction(print)
|
|
parseExpressionStatement({)
|
|
parseExpression({)
|
|
parsePrecedenceExpression({, 1, true)
|
|
parseUnaryExpression({, true)
|
|
parsePrimary({, expression)
|
|
parseSendOrFunctionLiteral({, expression)
|
|
looksLikeFunctionBody(;)
|
|
parseSend({, expression)
|
|
ensureIdentifier({, expression)
|
|
listener: handleIdentifier(print, expression)
|
|
listener: handleNoTypeArguments(()
|
|
parseArgumentsOpt(print)
|
|
parseArguments(print)
|
|
parseArgumentsRest(()
|
|
listener: beginArguments(()
|
|
parseExpression(()
|
|
parsePrecedenceExpression((, 1, true)
|
|
parseUnaryExpression((, true)
|
|
parsePrimary((, expression)
|
|
parseLiteralString(()
|
|
parseSingleLiteralString(()
|
|
listener: beginLiteralString("hello")
|
|
listener: endLiteralString(0, ))
|
|
listener: endArguments(1, (, ))
|
|
listener: handleSend(print, ;)
|
|
ensureSemicolon())
|
|
listener: handleExpressionStatement(;)
|
|
notEofOrValue(}, })
|
|
listener: endBlockFunctionBody(1, {, })
|
|
listener: endClassMethod(null, late, (, null, })
|
|
listener: endMember()
|
|
notEofOrValue(}, })
|
|
listener: endClassOrMixinBody(DeclarationKind.Class, 1, {, })
|
|
listener: endClassDeclaration(class, })
|
|
listener: endTopLevelDeclaration(class)
|
|
parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
|
|
parseMetadataStar(})
|
|
listener: beginMetadataStar(class)
|
|
listener: endMetadataStar(0)
|
|
parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
|
|
parseClassDeclarationModifiers(}, class)
|
|
parseClassOrNamedMixinApplication(null, class)
|
|
listener: beginClassOrNamedMixinApplicationPrelude(class)
|
|
ensureIdentifier(class, classOrMixinDeclaration)
|
|
listener: handleIdentifier(Y, classOrMixinDeclaration)
|
|
listener: handleNoTypeVariables({)
|
|
listener: beginClassDeclaration(class, null, Y)
|
|
parseClass(Y, class, class, Y)
|
|
parseClassHeaderOpt(Y, class, class)
|
|
parseClassExtendsOpt(Y)
|
|
listener: handleNoType(Y)
|
|
listener: handleClassExtends(null, 1)
|
|
parseWithClauseOpt(Y)
|
|
listener: handleClassNoWithClause()
|
|
parseClassOrMixinImplementsOpt(Y)
|
|
listener: handleClassOrMixinImplements(null, 0)
|
|
listener: handleClassHeader(class, class, null)
|
|
parseClassOrMixinOrExtensionBody(Y, DeclarationKind.Class, Y)
|
|
listener: beginClassOrMixinBody(DeclarationKind.Class, {)
|
|
notEofOrValue(}, int)
|
|
parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Y)
|
|
parseMetadataStar({)
|
|
listener: beginMetadataStar(int)
|
|
listener: endMetadataStar(0)
|
|
listener: beginMember()
|
|
parseFields({, null, null, null, null, null, null, {, Instance of 'SimpleType', late, DeclarationKind.Class, Y, false)
|
|
listener: beginFields({)
|
|
listener: handleIdentifier(int, typeReference)
|
|
listener: handleNoTypeArguments(late)
|
|
listener: handleType(int, null)
|
|
ensureIdentifierPotentiallyRecovered(int, fieldDeclaration, false)
|
|
listener: handleIdentifier(late, fieldDeclaration)
|
|
parseFieldInitializerOpt(late, late, null, null, null, null, DeclarationKind.Class, Y)
|
|
listener: beginFieldInitializer(=)
|
|
parseExpression(=)
|
|
parsePrecedenceExpression(=, 1, true)
|
|
parseUnaryExpression(=, true)
|
|
parsePrimary(=, expression)
|
|
parseLiteralInt(=)
|
|
listener: handleLiteralInt(42)
|
|
listener: endFieldInitializer(=, ;)
|
|
listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
|
|
listener: endMember()
|
|
notEofOrValue(}, })
|
|
listener: endClassOrMixinBody(DeclarationKind.Class, 1, {, })
|
|
listener: endClassDeclaration(class, })
|
|
listener: endTopLevelDeclaration()
|
|
reportAllErrorTokens(main)
|
|
listener: endCompilationUnit(4, )
|