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>
344 lines
19 KiB
Plaintext
344 lines
19 KiB
Plaintext
parseUnit(bool)
|
|
skipErrorTokens(bool)
|
|
listener: beginCompilationUnit(bool)
|
|
syntheticPreviousToken(bool)
|
|
parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
|
|
parseMetadataStar()
|
|
listener: beginMetadataStar(bool)
|
|
listener: endMetadataStar(0)
|
|
parseTopLevelMemberImpl()
|
|
listener: beginTopLevelMember(bool)
|
|
parseFields(, null, null, null, null, null, null, , Instance of 'SimpleType', x, DeclarationKind.TopLevel, null, false)
|
|
listener: beginFields()
|
|
listener: handleIdentifier(bool, typeReference)
|
|
listener: handleNoTypeArguments(x)
|
|
listener: handleType(bool, null)
|
|
ensureIdentifierPotentiallyRecovered(bool, topLevelVariableDeclaration, false)
|
|
listener: handleIdentifier(x, topLevelVariableDeclaration)
|
|
parseFieldInitializerOpt(x, x, null, null, null, null, DeclarationKind.TopLevel, null)
|
|
listener: handleNoFieldInitializer(;)
|
|
listener: endTopLevelFields(null, null, null, null, null, 1, bool, ;)
|
|
listener: endTopLevelDeclaration(bool)
|
|
parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
|
|
parseMetadataStar(;)
|
|
listener: beginMetadataStar(bool)
|
|
listener: endMetadataStar(0)
|
|
parseTopLevelMemberImpl(;)
|
|
listener: beginTopLevelMember(bool)
|
|
parseFields(;, null, null, null, null, null, null, ;, Instance of 'SimpleType', x, DeclarationKind.TopLevel, null, false)
|
|
listener: beginFields(;)
|
|
listener: handleIdentifier(bool, typeReference)
|
|
listener: handleNoTypeArguments(x)
|
|
listener: handleType(bool, null)
|
|
ensureIdentifierPotentiallyRecovered(bool, topLevelVariableDeclaration, false)
|
|
listener: handleIdentifier(x, topLevelVariableDeclaration)
|
|
parseFieldInitializerOpt(x, x, null, null, null, null, DeclarationKind.TopLevel, null)
|
|
listener: handleNoFieldInitializer(;)
|
|
listener: endTopLevelFields(null, null, null, null, null, 1, bool, ;)
|
|
listener: endTopLevelDeclaration(errors)
|
|
parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
|
|
parseMetadataStar(;)
|
|
listener: beginMetadataStar(errors)
|
|
listener: endMetadataStar(0)
|
|
parseTopLevelMemberImpl(;)
|
|
listener: beginTopLevelMember(errors)
|
|
isReservedKeyword(()
|
|
parseTopLevelMethod(;, null, ;, Instance of 'NoType', null, errors, false)
|
|
listener: beginTopLevelMethod(;, null)
|
|
listener: handleNoType(;)
|
|
ensureIdentifierPotentiallyRecovered(;, topLevelFunctionDeclaration, false)
|
|
listener: handleIdentifier(errors, topLevelFunctionDeclaration)
|
|
parseMethodTypeVar(errors)
|
|
listener: handleNoTypeVariables(()
|
|
parseGetterOrFormalParameters(errors, errors, false, MemberKind.TopLevelMethod)
|
|
parseFormalParameters(errors, 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)
|
|
parseSendOrFunctionLiteral((, expression)
|
|
parseSend((, expression)
|
|
ensureIdentifier((, expression)
|
|
listener: handleIdentifier(x, expression)
|
|
listener: handleNoTypeArguments())
|
|
parseArgumentsOpt(x)
|
|
listener: handleNoArguments())
|
|
listener: handleSend(x, ))
|
|
listener: endArguments(1, (, ))
|
|
listener: handleSend(print, ;)
|
|
ensureSemicolon())
|
|
listener: handleExpressionStatement(;)
|
|
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)
|
|
parseSendOrFunctionLiteral((, expression)
|
|
parseSend((, expression)
|
|
ensureIdentifier((, expression)
|
|
listener: handleIdentifier(x, expression)
|
|
listener: handleNoTypeArguments(!)
|
|
parseArgumentsOpt(x)
|
|
listener: handleNoArguments(!)
|
|
listener: handleSend(x, !)
|
|
listener: handleNonNullAssertExpression(!)
|
|
listener: endArguments(1, (, ))
|
|
listener: handleSend(print, ;)
|
|
ensureSemicolon())
|
|
listener: handleExpressionStatement(;)
|
|
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)
|
|
parsePrecedenceExpression(!, 16, true)
|
|
parseUnaryExpression(!, true)
|
|
parsePrimary(!, expression)
|
|
parseSendOrFunctionLiteral(!, expression)
|
|
parseSend(!, expression)
|
|
ensureIdentifier(!, expression)
|
|
listener: handleIdentifier(x, expression)
|
|
listener: handleNoTypeArguments())
|
|
parseArgumentsOpt(x)
|
|
listener: handleNoArguments())
|
|
listener: handleSend(x, ))
|
|
listener: handleUnaryPrefixExpression(!)
|
|
listener: endArguments(1, (, ))
|
|
listener: handleSend(print, ;)
|
|
ensureSemicolon())
|
|
listener: handleExpressionStatement(;)
|
|
notEofOrValue(}, })
|
|
listener: endBlockFunctionBody(3, {, })
|
|
listener: endTopLevelMethod(errors, 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(C, classOrMixinDeclaration)
|
|
listener: handleNoTypeVariables({)
|
|
listener: beginClassDeclaration(class, null, C)
|
|
parseClass(C, class, class, C)
|
|
parseClassHeaderOpt(C, class, class)
|
|
parseClassExtendsOpt(C)
|
|
listener: handleNoType(C)
|
|
listener: handleClassExtends(null, 1)
|
|
parseWithClauseOpt(C)
|
|
listener: handleClassNoWithClause()
|
|
parseClassOrMixinImplementsOpt(C)
|
|
listener: handleClassOrMixinImplements(null, 0)
|
|
listener: handleClassHeader(class, class, null)
|
|
parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
|
|
listener: beginClassOrMixinBody(DeclarationKind.Class, {)
|
|
notEofOrValue(}, C)
|
|
parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
|
|
parseMetadataStar({)
|
|
listener: beginMetadataStar(C)
|
|
listener: endMetadataStar(0)
|
|
listener: beginMember()
|
|
isReservedKeyword(.)
|
|
parseMethod({, null, null, null, null, null, null, {, Instance of 'NoType', null, C, DeclarationKind.Class, C, false)
|
|
listener: beginMethod(null, null, null, null, null, C)
|
|
listener: handleNoType({)
|
|
ensureIdentifierPotentiallyRecovered({, methodDeclaration, false)
|
|
listener: handleIdentifier(C, methodDeclaration)
|
|
parseQualifiedRestOpt(C, methodDeclarationContinuation)
|
|
parseQualifiedRest(C, methodDeclarationContinuation)
|
|
ensureIdentifier(., methodDeclarationContinuation)
|
|
listener: handleIdentifier(c0, methodDeclarationContinuation)
|
|
listener: handleQualified(.)
|
|
parseMethodTypeVar(c0)
|
|
listener: handleNoTypeVariables(()
|
|
parseGetterOrFormalParameters(c0, C, false, MemberKind.NonStaticMethod)
|
|
parseFormalParameters(c0, MemberKind.NonStaticMethod)
|
|
parseFormalParametersRest((, MemberKind.NonStaticMethod)
|
|
listener: beginFormalParameters((, MemberKind.NonStaticMethod)
|
|
listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
|
|
parseInitializersOpt())
|
|
parseInitializers(:)
|
|
listener: beginInitializers(:)
|
|
parseInitializer(:)
|
|
listener: beginInitializer(super)
|
|
parseSuperInitializerExpression(:)
|
|
parseInitializerExpressionRest(:)
|
|
parseExpression(:)
|
|
parsePrecedenceExpression(:, 1, true)
|
|
parseUnaryExpression(:, true)
|
|
parsePrimary(:, expression)
|
|
parseSuperExpression(:, expression)
|
|
listener: handleSuperExpression(super, expression)
|
|
listener: handleNoTypeArguments(()
|
|
parseArguments(super)
|
|
parseArgumentsRest(()
|
|
listener: beginArguments(()
|
|
listener: endArguments(0, (, ))
|
|
listener: handleSend(super, ;)
|
|
listener: endInitializer(;)
|
|
listener: endInitializers(1, :, ;)
|
|
parseAsyncModifierOpt())
|
|
listener: handleAsyncModifier(null, null)
|
|
inPlainSync()
|
|
inPlainSync()
|
|
parseFunctionBody(), false, true)
|
|
listener: handleEmptyFunctionBody(;)
|
|
listener: endClassConstructor(null, C, (, :, ;)
|
|
listener: endMember()
|
|
notEofOrValue(}, C)
|
|
parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
|
|
parseMetadataStar(;)
|
|
listener: beginMetadataStar(C)
|
|
listener: endMetadataStar(0)
|
|
listener: beginMember()
|
|
isReservedKeyword(.)
|
|
parseMethod(;, null, null, null, null, null, null, ;, Instance of 'NoType', null, C, DeclarationKind.Class, C, false)
|
|
listener: beginMethod(null, null, null, null, null, C)
|
|
listener: handleNoType(;)
|
|
ensureIdentifierPotentiallyRecovered(;, methodDeclaration, false)
|
|
listener: handleIdentifier(C, methodDeclaration)
|
|
parseQualifiedRestOpt(C, methodDeclarationContinuation)
|
|
parseQualifiedRest(C, methodDeclarationContinuation)
|
|
ensureIdentifier(., methodDeclarationContinuation)
|
|
listener: handleIdentifier(c1, methodDeclarationContinuation)
|
|
listener: handleQualified(.)
|
|
parseMethodTypeVar(c1)
|
|
listener: handleNoTypeVariables(()
|
|
parseGetterOrFormalParameters(c1, C, false, MemberKind.NonStaticMethod)
|
|
parseFormalParameters(c1, MemberKind.NonStaticMethod)
|
|
parseFormalParametersRest((, MemberKind.NonStaticMethod)
|
|
listener: beginFormalParameters((, MemberKind.NonStaticMethod)
|
|
listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
|
|
parseInitializersOpt())
|
|
parseInitializers(:)
|
|
listener: beginInitializers(:)
|
|
parseInitializer(:)
|
|
listener: beginInitializer(super)
|
|
parseSuperInitializerExpression(:)
|
|
parseInitializerExpressionRest(:)
|
|
parseExpression(:)
|
|
parsePrecedenceExpression(:, 1, true)
|
|
parseUnaryExpression(:, true)
|
|
parsePrimary(:, expression)
|
|
parseSuperExpression(:, expression)
|
|
listener: handleSuperExpression(super, expression)
|
|
listener: handleNoTypeArguments(()
|
|
parseArguments(super)
|
|
parseArgumentsRest(()
|
|
listener: beginArguments(()
|
|
listener: endArguments(0, (, ))
|
|
listener: handleSend(super, !)
|
|
listener: handleNonNullAssertExpression(!)
|
|
listener: endInitializer(;)
|
|
listener: endInitializers(1, :, ;)
|
|
parseAsyncModifierOpt(!)
|
|
listener: handleAsyncModifier(null, null)
|
|
inPlainSync()
|
|
inPlainSync()
|
|
parseFunctionBody(!, false, true)
|
|
listener: handleEmptyFunctionBody(;)
|
|
listener: endClassConstructor(null, C, (, :, ;)
|
|
listener: endMember()
|
|
notEofOrValue(}, })
|
|
listener: endClassOrMixinBody(DeclarationKind.Class, 2, {, })
|
|
listener: endClassDeclaration(class, })
|
|
listener: endTopLevelDeclaration(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(}, })
|
|
listener: endBlockFunctionBody(0, {, })
|
|
listener: endTopLevelMethod(main, null, })
|
|
listener: endTopLevelDeclaration()
|
|
reportAllErrorTokens(bool)
|
|
listener: endCompilationUnit(5, )
|