| // Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| /// @docImport 'complex_parser_test.dart'; | |
| library; | |
| import 'package:test_reflective_loader/test_reflective_loader.dart'; | |
| import '../src/dart/resolution/node_text_expectations.dart'; | |
| import '../src/diagnostics/parser_diagnostics.dart'; | |
| main() { | |
| defineReflectiveSuite(() { | |
| defineReflectiveTests(SimpleParserTest); | |
| defineReflectiveTests(UpdateNodeTextExpectations); | |
| }); | |
| } | |
| /// Parser tests that test individual parsing methods. The code fragments should | |
| /// be as minimal as possible in order to test the method, but should not test | |
| /// the interactions between the method under test and other methods. | |
| /// | |
| /// More complex tests should be defined in the class [ComplexParserTest]. | |
| @reflectiveTest | |
| class SimpleParserTest extends ParserDiagnosticsTest { | |
| void test_classDeclaration_complexTypeParam() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| class C<@Foo.bar(const [], const [1], const {"": r""}, 0xFF + 2, .3, 4.5) T> {} | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| ClassDeclaration | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: C | |
| typeParameters: TypeParameterList | |
| leftBracket: < | |
| typeParameters | |
| TypeParameter | |
| metadata | |
| Annotation | |
| atSign: @ | |
| expression: ConstructorInvocation | |
| constructorReference: ConstructorReference2 | |
| typeReference: ConstructorTypeReference | |
| importPrefix: ImportPrefixReference | |
| name: Foo | |
| period: . | |
| name: bar | |
| argumentList: ArgumentList | |
| leftParenthesis: ( | |
| arguments2 | |
| ListLiteral | |
| constKeyword: const | |
| leftBracket: [ | |
| rightBracket: ] | |
| ListLiteral | |
| constKeyword: const | |
| leftBracket: [ | |
| elements2 | |
| IntegerLiteral | |
| literal: 1 | |
| rightBracket: ] | |
| SetOrMapLiteral | |
| constKeyword: const | |
| leftBracket: { | |
| elements2 | |
| MapLiteralEntry | |
| key2: SimpleStringLiteral | |
| literal: "" | |
| separator: : | |
| value2: SimpleStringLiteral | |
| literal: r"" | |
| rightBracket: } | |
| isMap: false | |
| BinaryOperatorInvocation | |
| leftOperand: IntegerLiteral | |
| literal: 0xFF | |
| operator: + | |
| rightOperand: IntegerLiteral | |
| literal: 2 | |
| binaryOperator: add | |
| DoubleLiteral | |
| literal: .3 | |
| DoubleLiteral | |
| literal: 4.5 | |
| arguments(v1) | |
| ListLiteral | |
| constKeyword: const | |
| leftBracket: [ | |
| rightBracket: ] | |
| ListLiteral | |
| constKeyword: const | |
| leftBracket: [ | |
| elements | |
| IntegerLiteral | |
| literal: 1 | |
| rightBracket: ] | |
| SetOrMapLiteral | |
| constKeyword: const | |
| leftBracket: { | |
| elements | |
| MapLiteralEntry | |
| key: SimpleStringLiteral | |
| literal: "" | |
| separator: : | |
| value: SimpleStringLiteral | |
| literal: r"" | |
| rightBracket: } | |
| isMap: false | |
| BinaryExpression | |
| leftOperand: IntegerLiteral | |
| literal: 0xFF | |
| operator: + | |
| rightOperand: IntegerLiteral | |
| literal: 2 | |
| DoubleLiteral | |
| literal: .3 | |
| DoubleLiteral | |
| literal: 4.5 | |
| rightParenthesis: ) | |
| name: PrefixedIdentifier | |
| prefix: SimpleIdentifier | |
| token: Foo | |
| period: . | |
| identifier: SimpleIdentifier | |
| token: bar | |
| arguments: ArgumentList | |
| leftParenthesis: ( | |
| arguments | |
| ListLiteral | |
| constKeyword: const | |
| leftBracket: [ | |
| rightBracket: ] | |
| ListLiteral | |
| constKeyword: const | |
| leftBracket: [ | |
| elements | |
| IntegerLiteral | |
| literal: 1 | |
| rightBracket: ] | |
| SetOrMapLiteral | |
| constKeyword: const | |
| leftBracket: { | |
| elements | |
| MapLiteralEntry | |
| key: SimpleStringLiteral | |
| literal: "" | |
| separator: : | |
| value: SimpleStringLiteral | |
| literal: r"" | |
| rightBracket: } | |
| isMap: false | |
| BinaryExpression | |
| leftOperand: IntegerLiteral | |
| literal: 0xFF | |
| operator: + | |
| rightOperand: IntegerLiteral | |
| literal: 2 | |
| DoubleLiteral | |
| literal: .3 | |
| DoubleLiteral | |
| literal: 4.5 | |
| rightParenthesis: ) | |
| name: T | |
| rightBracket: > | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_classDeclaration_invalid_super() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| class C { | |
| C() : super.const(); | |
| // ^^^^^ | |
| // [diag.invalidSuperInInitializer] Can only use 'super' in an initializer for calling the superclass constructor (e.g. 'super()' or 'super.namedConstructor()') | |
| // ^^^^^ | |
| // [diag.expectedIdentifierButGotKeyword] 'const' can't be used as an identifier because it's a keyword. | |
| // [diag.missingIdentifier] Expected an identifier. | |
| } | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| ClassDeclaration | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: C | |
| body: BlockClassBody | |
| leftBracket: { | |
| members | |
| ConstructorDeclaration | |
| typeName2: C | |
| typeName(v1): SimpleIdentifier | |
| token: C | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| rightParenthesis: ) | |
| separator: : | |
| initializers | |
| SuperConstructorInvocation | |
| superKeyword: super | |
| argumentList: ArgumentList | |
| leftParenthesis: ( <synthetic> | |
| rightParenthesis: ) <synthetic> | |
| body: EmptyFunctionBody | |
| semicolon: ; | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_classDeclaration_invalid_this() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| class C { | |
| C() : this.const(); | |
| // ^^^^ | |
| // [diag.missingAssignmentInInitializer] Expected an assignment after the field name. | |
| // ^^^^^ | |
| // [diag.missingIdentifier] Expected an identifier. | |
| // [diag.missingFunctionBody] A function body must be provided. | |
| // [diag.constMethod] Getters, setters and methods can't be declared to be 'const'. | |
| // ^ | |
| // [diag.missingIdentifier] Expected an identifier. | |
| } | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| ClassDeclaration | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: C | |
| body: BlockClassBody | |
| leftBracket: { | |
| members | |
| ConstructorDeclaration | |
| typeName2: C | |
| typeName(v1): SimpleIdentifier | |
| token: C | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| rightParenthesis: ) | |
| separator: : | |
| initializers | |
| ConstructorFieldInitializer | |
| fieldName2: <empty> <synthetic> | |
| fieldName(v1): SimpleIdentifier | |
| token: <empty> <synthetic> | |
| equals: = <synthetic> | |
| expression2: ReceiverPropertyExtraction | |
| receiver: ThisExpression | |
| thisKeyword: this | |
| operator: . | |
| name: <empty> <synthetic> | |
| expression(v1): PropertyAccess | |
| target: ThisExpression | |
| thisKeyword: this | |
| operator: . | |
| propertyName: SimpleIdentifier | |
| token: <empty> <synthetic> | |
| body: BlockFunctionBody | |
| block: Block | |
| leftBracket: { <synthetic> | |
| rightBracket: } <synthetic> | |
| MethodDeclaration | |
| name: <empty> <synthetic> | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| rightParenthesis: ) | |
| body: EmptyFunctionBody | |
| semicolon: ; | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_method_name_notNull_37733() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| class C { | |
| f(<T>()); | |
| // ^ | |
| // [diag.missingIdentifier] Expected an identifier. | |
| } | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| ClassDeclaration | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: C | |
| body: BlockClassBody | |
| leftBracket: { | |
| members | |
| MethodDeclaration | |
| name: f | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| requiredPositionalFormalParameters | |
| RegularFormalParameter | |
| name: <empty> <synthetic> | |
| functionTypedSuffix: FunctionTypedFormalParameterSuffix | |
| typeParameters: TypeParameterList | |
| leftBracket: < | |
| typeParameters | |
| TypeParameter | |
| name: T | |
| rightBracket: > | |
| formalParameters: FormalParameterList | |
| leftParenthesis: ( | |
| rightParenthesis: ) | |
| rightParenthesis: ) | |
| parameters(v1): FormalParameterList | |
| leftParenthesis: ( | |
| parameter: RegularFormalParameter | |
| name: <empty> <synthetic> | |
| functionTypedSuffix: FunctionTypedFormalParameterSuffix | |
| typeParameters: TypeParameterList | |
| leftBracket: < | |
| typeParameters | |
| TypeParameter | |
| name: T | |
| rightBracket: > | |
| formalParameters: FormalParameterList | |
| leftParenthesis: ( | |
| rightParenthesis: ) | |
| rightParenthesis: ) | |
| body: EmptyFunctionBody | |
| semicolon: ; | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseAnnotation_n1() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| @A | |
| class C {} | |
| '''); | |
| var node = parseResult.findNode.singleAnnotation; | |
| assertParsedNodeText(node, r''' | |
| Annotation | |
| atSign: @ | |
| expression: ParsedUnqualifiedName | |
| name: A | |
| name: SimpleIdentifier | |
| token: A | |
| '''); | |
| } | |
| void test_parseAnnotation_n1_a() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| @A(x, y) | |
| class C {} | |
| '''); | |
| var node = parseResult.findNode.singleAnnotation; | |
| assertParsedNodeText(node, r''' | |
| Annotation | |
| atSign: @ | |
| expression: ConstructorInvocation | |
| constructorReference: ConstructorReference2 | |
| typeReference: ConstructorTypeReference | |
| name: A | |
| argumentList: ArgumentList | |
| leftParenthesis: ( | |
| arguments2 | |
| ParsedUnqualifiedName | |
| name: x | |
| ParsedUnqualifiedName | |
| name: y | |
| arguments(v1) | |
| SimpleIdentifier | |
| token: x | |
| SimpleIdentifier | |
| token: y | |
| rightParenthesis: ) | |
| name: SimpleIdentifier | |
| token: A | |
| arguments: ArgumentList | |
| leftParenthesis: ( | |
| arguments | |
| SimpleIdentifier | |
| token: x | |
| SimpleIdentifier | |
| token: y | |
| rightParenthesis: ) | |
| '''); | |
| } | |
| void test_parseAnnotation_n2() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| @A.B | |
| class C {} | |
| '''); | |
| var node = parseResult.findNode.singleAnnotation; | |
| assertParsedNodeText(node, r''' | |
| Annotation | |
| atSign: @ | |
| expression: ParsedNameAccess | |
| operand: ParsedUnqualifiedName | |
| name: A | |
| operator: . | |
| name: B | |
| name: PrefixedIdentifier | |
| prefix: SimpleIdentifier | |
| token: A | |
| period: . | |
| identifier: SimpleIdentifier | |
| token: B | |
| '''); | |
| } | |
| void test_parseAnnotation_n2_a() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| @A.B(x, y) | |
| class C {} | |
| '''); | |
| var node = parseResult.findNode.singleAnnotation; | |
| assertParsedNodeText(node, r''' | |
| Annotation | |
| atSign: @ | |
| expression: ConstructorInvocation | |
| constructorReference: ConstructorReference2 | |
| typeReference: ConstructorTypeReference | |
| importPrefix: ImportPrefixReference | |
| name: A | |
| period: . | |
| name: B | |
| argumentList: ArgumentList | |
| leftParenthesis: ( | |
| arguments2 | |
| ParsedUnqualifiedName | |
| name: x | |
| ParsedUnqualifiedName | |
| name: y | |
| arguments(v1) | |
| SimpleIdentifier | |
| token: x | |
| SimpleIdentifier | |
| token: y | |
| rightParenthesis: ) | |
| name: PrefixedIdentifier | |
| prefix: SimpleIdentifier | |
| token: A | |
| period: . | |
| identifier: SimpleIdentifier | |
| token: B | |
| arguments: ArgumentList | |
| leftParenthesis: ( | |
| arguments | |
| SimpleIdentifier | |
| token: x | |
| SimpleIdentifier | |
| token: y | |
| rightParenthesis: ) | |
| '''); | |
| } | |
| void test_parseAnnotation_n3() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| @A.B.C | |
| class C {} | |
| '''); | |
| var node = parseResult.findNode.singleAnnotation; | |
| assertParsedNodeText(node, r''' | |
| Annotation | |
| atSign: @ | |
| expression: ParsedNameAccess | |
| operand: ParsedNameAccess | |
| operand: ParsedUnqualifiedName | |
| name: A | |
| operator: . | |
| name: B | |
| operator: . | |
| name: C | |
| name: PrefixedIdentifier | |
| prefix: SimpleIdentifier | |
| token: A | |
| period: . | |
| identifier: SimpleIdentifier | |
| token: B | |
| period: . | |
| constructorName: SimpleIdentifier | |
| token: C | |
| '''); | |
| } | |
| void test_parseAnnotation_n3_a() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| @A.B.C(x, y) | |
| class C {} | |
| '''); | |
| var node = parseResult.findNode.singleAnnotation; | |
| assertParsedNodeText(node, r''' | |
| Annotation | |
| atSign: @ | |
| expression: ConstructorInvocation | |
| constructorReference: ConstructorReference2 | |
| typeReference: ConstructorTypeReference | |
| importPrefix: ImportPrefixReference | |
| name: A | |
| period: . | |
| name: B | |
| selector: ConstructorSelector | |
| period: . | |
| name2: C | |
| argumentList: ArgumentList | |
| leftParenthesis: ( | |
| arguments2 | |
| ParsedUnqualifiedName | |
| name: x | |
| ParsedUnqualifiedName | |
| name: y | |
| arguments(v1) | |
| SimpleIdentifier | |
| token: x | |
| SimpleIdentifier | |
| token: y | |
| rightParenthesis: ) | |
| name: PrefixedIdentifier | |
| prefix: SimpleIdentifier | |
| token: A | |
| period: . | |
| identifier: SimpleIdentifier | |
| token: B | |
| period: . | |
| constructorName: SimpleIdentifier | |
| token: C | |
| arguments: ArgumentList | |
| leftParenthesis: ( | |
| arguments | |
| SimpleIdentifier | |
| token: x | |
| SimpleIdentifier | |
| token: y | |
| rightParenthesis: ) | |
| '''); | |
| } | |
| test_parseArgument() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| var v = m(3); | |
| '''); | |
| var node = parseResult.findNode.singleArgumentList.arguments2[0]; | |
| assertParsedNodeText(node, r''' | |
| IntegerLiteral | |
| literal: 3 | |
| '''); | |
| } | |
| test_parseArgument_named() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| var v = m(foo: "a"); | |
| '''); | |
| var node = parseResult.findNode.singleArgumentList.arguments2[0]; | |
| assertParsedNodeText(node, r''' | |
| NamedArgument | |
| name: foo | |
| colon: : | |
| argumentExpression2: SimpleStringLiteral | |
| literal: "a" | |
| '''); | |
| } | |
| void test_parseArgumentList_empty() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| var v = m(); | |
| '''); | |
| var node = parseResult.findNode.argumentList('('); | |
| assertParsedNodeText(node, r''' | |
| ArgumentList | |
| leftParenthesis: ( | |
| rightParenthesis: ) | |
| '''); | |
| } | |
| void test_parseArgumentList_mixed() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| var v = m(w, x, y: y, z: z); | |
| '''); | |
| var node = parseResult.findNode.argumentList('('); | |
| assertParsedNodeText(node, r''' | |
| ArgumentList | |
| leftParenthesis: ( | |
| arguments2 | |
| ParsedUnqualifiedName | |
| name: w | |
| ParsedUnqualifiedName | |
| name: x | |
| NamedArgument | |
| name: y | |
| colon: : | |
| argumentExpression2: ParsedUnqualifiedName | |
| name: y | |
| argumentExpression(v1): SimpleIdentifier | |
| token: y | |
| NamedArgument | |
| name: z | |
| colon: : | |
| argumentExpression2: ParsedUnqualifiedName | |
| name: z | |
| argumentExpression(v1): SimpleIdentifier | |
| token: z | |
| arguments(v1) | |
| SimpleIdentifier | |
| token: w | |
| SimpleIdentifier | |
| token: x | |
| NamedArgument | |
| name: y | |
| colon: : | |
| argumentExpression: SimpleIdentifier | |
| token: y | |
| NamedArgument | |
| name: z | |
| colon: : | |
| argumentExpression: SimpleIdentifier | |
| token: z | |
| rightParenthesis: ) | |
| '''); | |
| } | |
| void test_parseArgumentList_noNamed() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| var v = m(x, y, z); | |
| '''); | |
| var node = parseResult.findNode.argumentList('('); | |
| assertParsedNodeText(node, r''' | |
| ArgumentList | |
| leftParenthesis: ( | |
| arguments2 | |
| ParsedUnqualifiedName | |
| name: x | |
| ParsedUnqualifiedName | |
| name: y | |
| ParsedUnqualifiedName | |
| name: z | |
| arguments(v1) | |
| SimpleIdentifier | |
| token: x | |
| SimpleIdentifier | |
| token: y | |
| SimpleIdentifier | |
| token: z | |
| rightParenthesis: ) | |
| '''); | |
| } | |
| void test_parseArgumentList_onlyNamed() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| var v = m(x: x, y: y); | |
| '''); | |
| var node = parseResult.findNode.argumentList('('); | |
| assertParsedNodeText(node, r''' | |
| ArgumentList | |
| leftParenthesis: ( | |
| arguments2 | |
| NamedArgument | |
| name: x | |
| colon: : | |
| argumentExpression2: ParsedUnqualifiedName | |
| name: x | |
| argumentExpression(v1): SimpleIdentifier | |
| token: x | |
| NamedArgument | |
| name: y | |
| colon: : | |
| argumentExpression2: ParsedUnqualifiedName | |
| name: y | |
| argumentExpression(v1): SimpleIdentifier | |
| token: y | |
| rightParenthesis: ) | |
| '''); | |
| } | |
| void test_parseArgumentList_trailing_comma() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| var v = m(x, y, z); | |
| '''); | |
| var node = parseResult.findNode.argumentList('('); | |
| assertParsedNodeText(node, r''' | |
| ArgumentList | |
| leftParenthesis: ( | |
| arguments2 | |
| ParsedUnqualifiedName | |
| name: x | |
| ParsedUnqualifiedName | |
| name: y | |
| ParsedUnqualifiedName | |
| name: z | |
| arguments(v1) | |
| SimpleIdentifier | |
| token: x | |
| SimpleIdentifier | |
| token: y | |
| SimpleIdentifier | |
| token: z | |
| rightParenthesis: ) | |
| '''); | |
| } | |
| void test_parseArgumentList_typeArguments() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| var v = m(a<b, c>(d)); | |
| '''); | |
| var node = parseResult.findNode.argumentList('(a'); | |
| assertParsedNodeText(node, r''' | |
| ArgumentList | |
| leftParenthesis: ( | |
| arguments2 | |
| ParsedValueArguments | |
| operand: ParsedTypeArguments | |
| operand: ParsedUnqualifiedName | |
| name: a | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: b | |
| NamedType | |
| name: c | |
| rightBracket: > | |
| argumentList: ArgumentList | |
| leftParenthesis: ( | |
| arguments2 | |
| ParsedUnqualifiedName | |
| name: d | |
| arguments(v1) | |
| SimpleIdentifier | |
| token: d | |
| rightParenthesis: ) | |
| arguments(v1) | |
| MethodInvocation | |
| methodName: SimpleIdentifier | |
| token: a | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: b | |
| NamedType | |
| name: c | |
| rightBracket: > | |
| argumentList: ArgumentList | |
| leftParenthesis: ( | |
| arguments | |
| SimpleIdentifier | |
| token: d | |
| rightParenthesis: ) | |
| rightParenthesis: ) | |
| '''); | |
| } | |
| void test_parseArgumentList_typeArguments_none() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| var v = m(a < b, p.q.c > (d)); | |
| '''); | |
| var node = parseResult.findNode.argumentList('(a'); | |
| assertParsedNodeText(node, r''' | |
| ArgumentList | |
| leftParenthesis: ( | |
| arguments2 | |
| BinaryOperatorInvocation | |
| leftOperand: ParsedUnqualifiedName | |
| name: a | |
| operator: < | |
| rightOperand: ParsedUnqualifiedName | |
| name: b | |
| binaryOperator: lessThan | |
| BinaryOperatorInvocation | |
| leftOperand: ParsedNameAccess | |
| operand: ParsedNameAccess | |
| operand: ParsedUnqualifiedName | |
| name: p | |
| operator: . | |
| name: q | |
| operator: . | |
| name: c | |
| operator: > | |
| rightOperand: ParenthesizedExpression | |
| leftParenthesis: ( | |
| expression2: ParsedUnqualifiedName | |
| name: d | |
| expression(v1): SimpleIdentifier | |
| token: d | |
| rightParenthesis: ) | |
| binaryOperator: greaterThan | |
| arguments(v1) | |
| BinaryExpression | |
| leftOperand: SimpleIdentifier | |
| token: a | |
| operator: < | |
| rightOperand: SimpleIdentifier | |
| token: b | |
| BinaryExpression | |
| leftOperand: PropertyAccess | |
| target: PrefixedIdentifier | |
| prefix: SimpleIdentifier | |
| token: p | |
| period: . | |
| identifier: SimpleIdentifier | |
| token: q | |
| operator: . | |
| propertyName: SimpleIdentifier | |
| token: c | |
| operator: > | |
| rightOperand: ParenthesizedExpression | |
| leftParenthesis: ( | |
| expression: SimpleIdentifier | |
| token: d | |
| rightParenthesis: ) | |
| rightParenthesis: ) | |
| '''); | |
| } | |
| void test_parseArgumentList_typeArguments_prefixed() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| var v = m(a<b, p.c>(d)); | |
| '''); | |
| var node = parseResult.findNode.argumentList('(a'); | |
| assertParsedNodeText(node, r''' | |
| ArgumentList | |
| leftParenthesis: ( | |
| arguments2 | |
| ParsedValueArguments | |
| operand: ParsedTypeArguments | |
| operand: ParsedUnqualifiedName | |
| name: a | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: b | |
| NamedType | |
| importPrefix: ImportPrefixReference | |
| name: p | |
| period: . | |
| name: c | |
| rightBracket: > | |
| argumentList: ArgumentList | |
| leftParenthesis: ( | |
| arguments2 | |
| ParsedUnqualifiedName | |
| name: d | |
| arguments(v1) | |
| SimpleIdentifier | |
| token: d | |
| rightParenthesis: ) | |
| arguments(v1) | |
| MethodInvocation | |
| methodName: SimpleIdentifier | |
| token: a | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: b | |
| NamedType | |
| importPrefix: ImportPrefixReference | |
| name: p | |
| period: . | |
| name: c | |
| rightBracket: > | |
| argumentList: ArgumentList | |
| leftParenthesis: ( | |
| arguments | |
| SimpleIdentifier | |
| token: d | |
| rightParenthesis: ) | |
| rightParenthesis: ) | |
| '''); | |
| } | |
| void test_parseCombinators_h() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| import 'a.dart' hide a; | |
| '''); | |
| var node = parseResult.findNode.singleImportDirective; | |
| assertParsedNodeText(node, r''' | |
| ImportDirective | |
| importKeyword: import | |
| uri: SimpleStringLiteral | |
| literal: 'a.dart' | |
| combinators | |
| HideCombinator | |
| keyword: hide | |
| names | |
| CombinatorName | |
| name: a | |
| hiddenNames | |
| SimpleIdentifier | |
| token: a | |
| semicolon: ; | |
| '''); | |
| } | |
| void test_parseCombinators_hs() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| import 'a.dart' hide a show b; | |
| // ^^^^ | |
| // [diag.multipleCombinators] At most one 'show' or 'hide' combinator can be used on an import or export directive. | |
| '''); | |
| var node = parseResult.findNode.singleImportDirective; | |
| assertParsedNodeText(node, r''' | |
| ImportDirective | |
| importKeyword: import | |
| uri: SimpleStringLiteral | |
| literal: 'a.dart' | |
| combinators | |
| HideCombinator | |
| keyword: hide | |
| names | |
| CombinatorName | |
| name: a | |
| hiddenNames | |
| SimpleIdentifier | |
| token: a | |
| ShowCombinator | |
| keyword: show | |
| names | |
| CombinatorName | |
| name: b | |
| shownNames | |
| SimpleIdentifier | |
| token: b | |
| semicolon: ; | |
| '''); | |
| } | |
| void test_parseCombinators_hshs() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| import 'a.dart' hide a show b hide c show d; | |
| // ^^^^ | |
| // [diag.multipleCombinators] At most one 'show' or 'hide' combinator can be used on an import or export directive. | |
| // ^^^^ | |
| // [diag.multipleCombinators] At most one 'show' or 'hide' combinator can be used on an import or export directive. | |
| // ^^^^ | |
| // [diag.multipleCombinators] At most one 'show' or 'hide' combinator can be used on an import or export directive. | |
| '''); | |
| var node = parseResult.findNode.singleImportDirective; | |
| assertParsedNodeText(node, r''' | |
| ImportDirective | |
| importKeyword: import | |
| uri: SimpleStringLiteral | |
| literal: 'a.dart' | |
| combinators | |
| HideCombinator | |
| keyword: hide | |
| names | |
| CombinatorName | |
| name: a | |
| hiddenNames | |
| SimpleIdentifier | |
| token: a | |
| ShowCombinator | |
| keyword: show | |
| names | |
| CombinatorName | |
| name: b | |
| shownNames | |
| SimpleIdentifier | |
| token: b | |
| HideCombinator | |
| keyword: hide | |
| names | |
| CombinatorName | |
| name: c | |
| hiddenNames | |
| SimpleIdentifier | |
| token: c | |
| ShowCombinator | |
| keyword: show | |
| names | |
| CombinatorName | |
| name: d | |
| shownNames | |
| SimpleIdentifier | |
| token: d | |
| semicolon: ; | |
| '''); | |
| } | |
| void test_parseCombinators_s() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| import 'a.dart' show a; | |
| '''); | |
| var node = parseResult.findNode.singleImportDirective; | |
| assertParsedNodeText(node, r''' | |
| ImportDirective | |
| importKeyword: import | |
| uri: SimpleStringLiteral | |
| literal: 'a.dart' | |
| combinators | |
| ShowCombinator | |
| keyword: show | |
| names | |
| CombinatorName | |
| name: a | |
| shownNames | |
| SimpleIdentifier | |
| token: a | |
| semicolon: ; | |
| '''); | |
| } | |
| void test_parseCommentAndMetadata_c() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| /** 1 */ | |
| class C {} | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| ClassDeclaration | |
| documentationComment: Comment | |
| tokens | |
| /** 1 */ | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: C | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseCommentAndMetadata_cmc() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| /** 1 */ | |
| @A | |
| /** 2 */ | |
| class C {} | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| ClassDeclaration | |
| documentationComment: Comment | |
| tokens | |
| /** 2 */ | |
| metadata | |
| Annotation | |
| atSign: @ | |
| expression: ParsedUnqualifiedName | |
| name: A | |
| name: SimpleIdentifier | |
| token: A | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: C | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseCommentAndMetadata_cmcm() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| /** 1 */ | |
| @A | |
| /** 2 */ | |
| @B | |
| class C {} | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| ClassDeclaration | |
| documentationComment: Comment | |
| tokens | |
| /** 2 */ | |
| metadata | |
| Annotation | |
| atSign: @ | |
| expression: ParsedUnqualifiedName | |
| name: A | |
| name: SimpleIdentifier | |
| token: A | |
| Annotation | |
| atSign: @ | |
| expression: ParsedUnqualifiedName | |
| name: B | |
| name: SimpleIdentifier | |
| token: B | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: C | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseCommentAndMetadata_cmm() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| /** 1 */ | |
| @A | |
| @B | |
| class C {} | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| ClassDeclaration | |
| documentationComment: Comment | |
| tokens | |
| /** 1 */ | |
| metadata | |
| Annotation | |
| atSign: @ | |
| expression: ParsedUnqualifiedName | |
| name: A | |
| name: SimpleIdentifier | |
| token: A | |
| Annotation | |
| atSign: @ | |
| expression: ParsedUnqualifiedName | |
| name: B | |
| name: SimpleIdentifier | |
| token: B | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: C | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseCommentAndMetadata_m() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| @A | |
| class C {} | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| ClassDeclaration | |
| metadata | |
| Annotation | |
| atSign: @ | |
| expression: ParsedUnqualifiedName | |
| name: A | |
| name: SimpleIdentifier | |
| token: A | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: C | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseCommentAndMetadata_mcm() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| @A | |
| /** 1 */ | |
| @B | |
| class C {} | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| ClassDeclaration | |
| documentationComment: Comment | |
| tokens | |
| /** 1 */ | |
| metadata | |
| Annotation | |
| atSign: @ | |
| expression: ParsedUnqualifiedName | |
| name: A | |
| name: SimpleIdentifier | |
| token: A | |
| Annotation | |
| atSign: @ | |
| expression: ParsedUnqualifiedName | |
| name: B | |
| name: SimpleIdentifier | |
| token: B | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: C | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseCommentAndMetadata_mcmc() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| @A | |
| /** 1 */ | |
| @B | |
| /** 2 */ | |
| class C {} | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| ClassDeclaration | |
| documentationComment: Comment | |
| tokens | |
| /** 2 */ | |
| metadata | |
| Annotation | |
| atSign: @ | |
| expression: ParsedUnqualifiedName | |
| name: A | |
| name: SimpleIdentifier | |
| token: A | |
| Annotation | |
| atSign: @ | |
| expression: ParsedUnqualifiedName | |
| name: B | |
| name: SimpleIdentifier | |
| token: B | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: C | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseCommentAndMetadata_mix1() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| /** | |
| * aaa | |
| */ | |
| /** | |
| * bbb | |
| */ | |
| class A {} | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| ClassDeclaration | |
| documentationComment: Comment | |
| tokens | |
| /** | |
| * bbb | |
| */ | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: A | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseCommentAndMetadata_mix2() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| /** | |
| * aaa | |
| */ | |
| /// bbb | |
| /// ccc | |
| class B {} | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| ClassDeclaration | |
| documentationComment: Comment | |
| tokens | |
| /// bbb | |
| /// ccc | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: B | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseCommentAndMetadata_mix3() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| /// aaa | |
| /// bbb | |
| /** | |
| * ccc | |
| */ | |
| class C {} | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| ClassDeclaration | |
| documentationComment: Comment | |
| tokens | |
| /** | |
| * ccc | |
| */ | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: C | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| test_parseCommentAndMetadata_mix4() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| /// aaa | |
| /// bbb | |
| /** | |
| * ccc | |
| */ | |
| /// ddd | |
| class D {} | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| ClassDeclaration | |
| documentationComment: Comment | |
| tokens | |
| /// ddd | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: D | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| test_parseCommentAndMetadata_mix5() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| /** | |
| * aaa | |
| */ | |
| // bbb | |
| class E {} | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| ClassDeclaration | |
| documentationComment: Comment | |
| tokens | |
| /** | |
| * aaa | |
| */ | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: E | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseCommentAndMetadata_mm() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| @A | |
| @B(x) | |
| class C {} | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| ClassDeclaration | |
| metadata | |
| Annotation | |
| atSign: @ | |
| expression: ParsedUnqualifiedName | |
| name: A | |
| name: SimpleIdentifier | |
| token: A | |
| Annotation | |
| atSign: @ | |
| expression: ConstructorInvocation | |
| constructorReference: ConstructorReference2 | |
| typeReference: ConstructorTypeReference | |
| name: B | |
| argumentList: ArgumentList | |
| leftParenthesis: ( | |
| arguments2 | |
| ParsedUnqualifiedName | |
| name: x | |
| arguments(v1) | |
| SimpleIdentifier | |
| token: x | |
| rightParenthesis: ) | |
| name: SimpleIdentifier | |
| token: B | |
| arguments: ArgumentList | |
| leftParenthesis: ( | |
| arguments | |
| SimpleIdentifier | |
| token: x | |
| rightParenthesis: ) | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: C | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseCommentAndMetadata_none() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| class C {} | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| ClassDeclaration | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: C | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseCommentAndMetadata_singleLine() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| /// 1 | |
| /// 2 | |
| class C {} | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| ClassDeclaration | |
| documentationComment: Comment | |
| tokens | |
| /// 1 | |
| /// 2 | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: C | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseCommentReferences_notClosed_noIdentifier() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| /** [ some text */ | |
| class C {} | |
| '''); | |
| var node = parseResult.findNode.singleClassDeclaration; | |
| assertParsedNodeText(node, r''' | |
| ClassDeclaration | |
| documentationComment: Comment | |
| references | |
| CommentReference | |
| components | |
| CommentReferenceComponent | |
| name: <empty> <synthetic> | |
| expression: SimpleIdentifier | |
| token: <empty> <synthetic> | |
| tokens | |
| /** [ some text */ | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: C | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseConfiguration_noOperator_dottedIdentifier() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| import 'a.dart' if (a.b) 'c.dart'; | |
| '''); | |
| var node = parseResult.findNode.singleConfiguration; | |
| assertParsedNodeText(node, r''' | |
| Configuration | |
| ifKeyword: if | |
| leftParenthesis: ( | |
| name: DottedName | |
| tokens | |
| a | |
| . | |
| b | |
| rightParenthesis: ) | |
| uri: SimpleStringLiteral | |
| literal: 'c.dart' | |
| resolvedUri: <null> | |
| '''); | |
| } | |
| void test_parseConfiguration_noOperator_simpleIdentifier() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| import 'a.dart' if (a) 'b.dart'; | |
| '''); | |
| var node = parseResult.findNode.singleConfiguration; | |
| assertParsedNodeText(node, r''' | |
| Configuration | |
| ifKeyword: if | |
| leftParenthesis: ( | |
| name: DottedName | |
| tokens | |
| a | |
| rightParenthesis: ) | |
| uri: SimpleStringLiteral | |
| literal: 'b.dart' | |
| resolvedUri: <null> | |
| '''); | |
| } | |
| void test_parseConfiguration_operator_dottedIdentifier() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| import 'a.dart' if (a.b == 'c') 'd.dart'; | |
| '''); | |
| var node = parseResult.findNode.singleConfiguration; | |
| assertParsedNodeText(node, r''' | |
| Configuration | |
| ifKeyword: if | |
| leftParenthesis: ( | |
| name: DottedName | |
| tokens | |
| a | |
| . | |
| b | |
| equalToken: == | |
| value: SimpleStringLiteral | |
| literal: 'c' | |
| rightParenthesis: ) | |
| uri: SimpleStringLiteral | |
| literal: 'd.dart' | |
| resolvedUri: <null> | |
| '''); | |
| } | |
| void test_parseConfiguration_operator_simpleIdentifier() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| import 'a.dart' if (a == 'b') 'c.dart'; | |
| '''); | |
| var node = parseResult.findNode.singleConfiguration; | |
| assertParsedNodeText(node, r''' | |
| Configuration | |
| ifKeyword: if | |
| leftParenthesis: ( | |
| name: DottedName | |
| tokens | |
| a | |
| equalToken: == | |
| value: SimpleStringLiteral | |
| literal: 'b' | |
| rightParenthesis: ) | |
| uri: SimpleStringLiteral | |
| literal: 'c.dart' | |
| resolvedUri: <null> | |
| '''); | |
| } | |
| void test_parseConstructorName_named_noPrefix() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| var v = new A.n(); | |
| '''); | |
| var node = | |
| parseResult.findNode.singleConstructorInvocation.constructorReference; | |
| assertParsedNodeText(node, r''' | |
| ConstructorReference2 | |
| typeReference: ConstructorTypeReference | |
| importPrefix: ImportPrefixReference | |
| name: A | |
| period: . | |
| name: n | |
| '''); | |
| } | |
| void test_parseConstructorName_named_prefixed() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| var v = new p.A.n(); | |
| '''); | |
| var node = | |
| parseResult.findNode.singleConstructorInvocation.constructorReference; | |
| assertParsedNodeText(node, r''' | |
| ConstructorReference2 | |
| typeReference: ConstructorTypeReference | |
| importPrefix: ImportPrefixReference | |
| name: p | |
| period: . | |
| name: A | |
| selector: ConstructorSelector | |
| period: . | |
| name2: n | |
| '''); | |
| } | |
| void test_parseConstructorName_unnamed_noPrefix() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| var v = new A(); | |
| '''); | |
| var node = | |
| parseResult.findNode.singleConstructorInvocation.constructorReference; | |
| assertParsedNodeText(node, r''' | |
| ConstructorReference2 | |
| typeReference: ConstructorTypeReference | |
| name: A | |
| '''); | |
| } | |
| void test_parseConstructorName_unnamed_prefixed() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| var v = new p.A(); | |
| '''); | |
| var node = | |
| parseResult.findNode.singleConstructorInvocation.constructorReference; | |
| assertParsedNodeText(node, r''' | |
| ConstructorReference2 | |
| typeReference: ConstructorTypeReference | |
| importPrefix: ImportPrefixReference | |
| name: p | |
| period: . | |
| name: A | |
| '''); | |
| } | |
| void test_parseDocumentationComment_block() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| /** */ | |
| class C {} | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| ClassDeclaration | |
| documentationComment: Comment | |
| tokens | |
| /** */ | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: C | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseDocumentationComment_block_withReference() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| /** [a] */ | |
| class C {} | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| ClassDeclaration | |
| documentationComment: Comment | |
| references | |
| CommentReference | |
| components | |
| CommentReferenceComponent | |
| name: a | |
| expression: SimpleIdentifier | |
| token: a | |
| tokens | |
| /** [a] */ | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: C | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseDocumentationComment_endOfLine() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| /// | |
| /// | |
| class C {} | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| ClassDeclaration | |
| documentationComment: Comment | |
| tokens | |
| /// | |
| /// | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: C | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseExtendsClause() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| class TestClass extends B {} | |
| '''); | |
| var node = parseResult.findNode.singleClassDeclaration; | |
| assertParsedNodeText(node, r''' | |
| ClassDeclaration | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: TestClass | |
| extendsClause: ExtendsClause | |
| extendsKeyword: extends | |
| superclass: NamedType | |
| name: B | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseFunctionBody_block() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f() {} | |
| '''); | |
| var node = | |
| parseResult.findNode.singleFunctionDeclaration.functionExpression.body; | |
| assertParsedNodeText(node, r''' | |
| BlockFunctionBody | |
| block: Block | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseFunctionBody_block_async() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f() async {} | |
| '''); | |
| var node = | |
| parseResult.findNode.singleFunctionDeclaration.functionExpression.body; | |
| assertParsedNodeText(node, r''' | |
| BlockFunctionBody | |
| keyword: async | |
| block: Block | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseFunctionBody_block_asyncGenerator() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f() async* {} | |
| '''); | |
| var node = | |
| parseResult.findNode.singleFunctionDeclaration.functionExpression.body; | |
| assertParsedNodeText(node, r''' | |
| BlockFunctionBody | |
| keyword: async | |
| star: * | |
| block: Block | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseFunctionBody_block_syncGenerator() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f() sync* {} | |
| '''); | |
| var node = | |
| parseResult.findNode.singleFunctionDeclaration.functionExpression.body; | |
| assertParsedNodeText(node, r''' | |
| BlockFunctionBody | |
| keyword: sync | |
| star: * | |
| block: Block | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseFunctionBody_empty() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f() ; | |
| '''); | |
| var node = parseResult.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| FunctionDeclaration | |
| returnType: NamedType | |
| name: void | |
| name: f | |
| functionExpression: FunctionExpression | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| rightParenthesis: ) | |
| body: EmptyFunctionBody | |
| semicolon: ; | |
| '''); | |
| } | |
| void test_parseFunctionBody_empty_beforeAugmentations() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| // %before-language-feature: augmentations | |
| void f() ; | |
| // ^ | |
| // [diag.missingFunctionBody] A function body must be provided. | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| FunctionDeclaration | |
| returnType: NamedType | |
| name: void | |
| name: f | |
| functionExpression: FunctionExpression | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| rightParenthesis: ) | |
| body: EmptyFunctionBody | |
| semicolon: ; | |
| '''); | |
| } | |
| void test_parseFunctionBody_expression() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f() => y; | |
| '''); | |
| var node = | |
| parseResult.findNode.singleFunctionDeclaration.functionExpression.body; | |
| assertParsedNodeText(node, r''' | |
| ExpressionFunctionBody | |
| functionDefinition: => | |
| expression2: ParsedUnqualifiedName | |
| name: y | |
| expression(v1): SimpleIdentifier | |
| token: y | |
| semicolon: ; | |
| '''); | |
| } | |
| void test_parseFunctionBody_expression_async() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f() async => y; | |
| '''); | |
| var node = | |
| parseResult.findNode.singleFunctionDeclaration.functionExpression.body; | |
| assertParsedNodeText(node, r''' | |
| ExpressionFunctionBody | |
| keyword: async | |
| functionDefinition: => | |
| expression2: ParsedUnqualifiedName | |
| name: y | |
| expression(v1): SimpleIdentifier | |
| token: y | |
| semicolon: ; | |
| '''); | |
| } | |
| void test_parseIdentifierList_multiple() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| import 'a.dart' show a, b, c; | |
| '''); | |
| var node = parseResult.findNode.singleImportDirective; | |
| assertParsedNodeText(node, r''' | |
| ImportDirective | |
| importKeyword: import | |
| uri: SimpleStringLiteral | |
| literal: 'a.dart' | |
| combinators | |
| ShowCombinator | |
| keyword: show | |
| names | |
| CombinatorName | |
| name: a | |
| CombinatorName | |
| name: b | |
| CombinatorName | |
| name: c | |
| shownNames | |
| SimpleIdentifier | |
| token: a | |
| SimpleIdentifier | |
| token: b | |
| SimpleIdentifier | |
| token: c | |
| semicolon: ; | |
| '''); | |
| } | |
| void test_parseIdentifierList_single() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| import 'a.dart' show a; | |
| '''); | |
| var node = parseResult.findNode.singleImportDirective; | |
| assertParsedNodeText(node, r''' | |
| ImportDirective | |
| importKeyword: import | |
| uri: SimpleStringLiteral | |
| literal: 'a.dart' | |
| combinators | |
| ShowCombinator | |
| keyword: show | |
| names | |
| CombinatorName | |
| name: a | |
| shownNames | |
| SimpleIdentifier | |
| token: a | |
| semicolon: ; | |
| '''); | |
| } | |
| void test_parseImplementsClause_multiple() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| class TestClass implements A, B, C {} | |
| '''); | |
| var node = parseResult.findNode.singleClassDeclaration; | |
| assertParsedNodeText(node, r''' | |
| ClassDeclaration | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: TestClass | |
| implementsClause: ImplementsClause | |
| implementsKeyword: implements | |
| interfaces | |
| NamedType | |
| name: A | |
| NamedType | |
| name: B | |
| NamedType | |
| name: C | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseImplementsClause_single() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| class TestClass implements A {} | |
| '''); | |
| var node = parseResult.findNode.singleClassDeclaration; | |
| assertParsedNodeText(node, r''' | |
| ClassDeclaration | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: TestClass | |
| implementsClause: ImplementsClause | |
| implementsKeyword: implements | |
| interfaces | |
| NamedType | |
| name: A | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseInstanceCreation_keyword_33647() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| var c = new Future<int>.sync(() => 3).then<int>((e) => e); | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| TopLevelVariableDeclaration | |
| variables: VariableDeclarationList | |
| keyword: var | |
| variables | |
| VariableDeclaration | |
| name: c | |
| equals: = | |
| initializer2: ParsedValueArguments | |
| operand: ParsedTypeArguments | |
| operand: ParsedNameAccess | |
| operand: ConstructorInvocation | |
| keyword: new | |
| constructorReference: ConstructorReference2 | |
| typeReference: ConstructorTypeReference | |
| name: Future | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: int | |
| rightBracket: > | |
| selector: ConstructorSelector | |
| period: . | |
| name2: sync | |
| argumentList: ArgumentList | |
| leftParenthesis: ( | |
| arguments2 | |
| FunctionExpression | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| rightParenthesis: ) | |
| body: ExpressionFunctionBody | |
| functionDefinition: => | |
| expression2: IntegerLiteral | |
| literal: 3 | |
| rightParenthesis: ) | |
| operator: . | |
| name: then | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: int | |
| rightBracket: > | |
| argumentList: ArgumentList | |
| leftParenthesis: ( | |
| arguments2 | |
| FunctionExpression | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| requiredPositionalFormalParameters | |
| RegularFormalParameter | |
| name: e | |
| rightParenthesis: ) | |
| parameters(v1): FormalParameterList | |
| leftParenthesis: ( | |
| parameter: RegularFormalParameter | |
| name: e | |
| rightParenthesis: ) | |
| body: ExpressionFunctionBody | |
| functionDefinition: => | |
| expression2: ParsedUnqualifiedName | |
| name: e | |
| expression(v1): SimpleIdentifier | |
| token: e | |
| rightParenthesis: ) | |
| initializer(v1): MethodInvocation | |
| target: InstanceCreationExpression | |
| keyword: new | |
| constructorName: ConstructorName | |
| type: NamedType | |
| name: Future | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: int | |
| rightBracket: > | |
| period: . | |
| name: SimpleIdentifier | |
| token: sync | |
| argumentList: ArgumentList | |
| leftParenthesis: ( | |
| arguments | |
| FunctionExpression | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| rightParenthesis: ) | |
| body: ExpressionFunctionBody | |
| functionDefinition: => | |
| expression: IntegerLiteral | |
| literal: 3 | |
| rightParenthesis: ) | |
| operator: . | |
| methodName: SimpleIdentifier | |
| token: then | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: int | |
| rightBracket: > | |
| argumentList: ArgumentList | |
| leftParenthesis: ( | |
| arguments | |
| FunctionExpression | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| parameter: RegularFormalParameter | |
| name: e | |
| rightParenthesis: ) | |
| body: ExpressionFunctionBody | |
| functionDefinition: => | |
| expression: SimpleIdentifier | |
| token: e | |
| rightParenthesis: ) | |
| semicolon: ; | |
| '''); | |
| } | |
| void test_parseInstanceCreation_noKeyword_33647() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| var c = Future<int>.sync(() => 3).then<int>((e) => e); | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| TopLevelVariableDeclaration | |
| variables: VariableDeclarationList | |
| keyword: var | |
| variables | |
| VariableDeclaration | |
| name: c | |
| equals: = | |
| initializer2: ParsedValueArguments | |
| operand: ParsedTypeArguments | |
| operand: ParsedNameAccess | |
| operand: ParsedValueArguments | |
| operand: ParsedNameAccess | |
| operand: ParsedTypeArguments | |
| operand: ParsedUnqualifiedName | |
| name: Future | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: int | |
| rightBracket: > | |
| operator: . | |
| name: sync | |
| argumentList: ArgumentList | |
| leftParenthesis: ( | |
| arguments2 | |
| FunctionExpression | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| rightParenthesis: ) | |
| body: ExpressionFunctionBody | |
| functionDefinition: => | |
| expression2: IntegerLiteral | |
| literal: 3 | |
| rightParenthesis: ) | |
| operator: . | |
| name: then | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: int | |
| rightBracket: > | |
| argumentList: ArgumentList | |
| leftParenthesis: ( | |
| arguments2 | |
| FunctionExpression | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| requiredPositionalFormalParameters | |
| RegularFormalParameter | |
| name: e | |
| rightParenthesis: ) | |
| parameters(v1): FormalParameterList | |
| leftParenthesis: ( | |
| parameter: RegularFormalParameter | |
| name: e | |
| rightParenthesis: ) | |
| body: ExpressionFunctionBody | |
| functionDefinition: => | |
| expression2: ParsedUnqualifiedName | |
| name: e | |
| expression(v1): SimpleIdentifier | |
| token: e | |
| rightParenthesis: ) | |
| initializer(v1): MethodInvocation | |
| target: InstanceCreationExpression | |
| constructorName: ConstructorName | |
| type: NamedType | |
| name: Future | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: int | |
| rightBracket: > | |
| period: . | |
| name: SimpleIdentifier | |
| token: sync | |
| argumentList: ArgumentList | |
| leftParenthesis: ( | |
| arguments | |
| FunctionExpression | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| rightParenthesis: ) | |
| body: ExpressionFunctionBody | |
| functionDefinition: => | |
| expression: IntegerLiteral | |
| literal: 3 | |
| rightParenthesis: ) | |
| operator: . | |
| methodName: SimpleIdentifier | |
| token: then | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: int | |
| rightBracket: > | |
| argumentList: ArgumentList | |
| leftParenthesis: ( | |
| arguments | |
| FunctionExpression | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| parameter: RegularFormalParameter | |
| name: e | |
| rightParenthesis: ) | |
| body: ExpressionFunctionBody | |
| functionDefinition: => | |
| expression: SimpleIdentifier | |
| token: e | |
| rightParenthesis: ) | |
| semicolon: ; | |
| '''); | |
| } | |
| void test_parseInstanceCreation_noKeyword_noPrefix() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| f() => C<E>.n(); | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| FunctionDeclaration | |
| name: f | |
| functionExpression: FunctionExpression | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| rightParenthesis: ) | |
| body: ExpressionFunctionBody | |
| functionDefinition: => | |
| expression2: ParsedValueArguments | |
| operand: ParsedNameAccess | |
| operand: ParsedTypeArguments | |
| operand: ParsedUnqualifiedName | |
| name: C | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: E | |
| rightBracket: > | |
| operator: . | |
| name: n | |
| argumentList: ArgumentList | |
| leftParenthesis: ( | |
| rightParenthesis: ) | |
| expression(v1): InstanceCreationExpression | |
| constructorName: ConstructorName | |
| type: NamedType | |
| name: C | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: E | |
| rightBracket: > | |
| period: . | |
| name: SimpleIdentifier | |
| token: n | |
| argumentList: ArgumentList | |
| leftParenthesis: ( | |
| rightParenthesis: ) | |
| semicolon: ; | |
| '''); | |
| } | |
| void test_parseInstanceCreation_noKeyword_noPrefix_34403() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| f() => C<E>.n<B>(); | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| FunctionDeclaration | |
| name: f | |
| functionExpression: FunctionExpression | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| rightParenthesis: ) | |
| body: ExpressionFunctionBody | |
| functionDefinition: => | |
| expression2: ParsedValueArguments | |
| operand: ParsedTypeArguments | |
| operand: ParsedNameAccess | |
| operand: ParsedTypeArguments | |
| operand: ParsedUnqualifiedName | |
| name: C | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: E | |
| rightBracket: > | |
| operator: . | |
| name: n | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: B | |
| rightBracket: > | |
| argumentList: ArgumentList | |
| leftParenthesis: ( | |
| rightParenthesis: ) | |
| expression(v1): MethodInvocation | |
| target: FunctionReference | |
| function: SimpleIdentifier | |
| token: C | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: E | |
| rightBracket: > | |
| operator: . | |
| methodName: SimpleIdentifier | |
| token: n | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: B | |
| rightBracket: > | |
| argumentList: ArgumentList | |
| leftParenthesis: ( | |
| rightParenthesis: ) | |
| semicolon: ; | |
| '''); | |
| } | |
| void test_parseInstanceCreation_noKeyword_prefix() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| f() => p.C<E>.n(); | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| FunctionDeclaration | |
| name: f | |
| functionExpression: FunctionExpression | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| rightParenthesis: ) | |
| body: ExpressionFunctionBody | |
| functionDefinition: => | |
| expression2: ParsedValueArguments | |
| operand: ParsedNameAccess | |
| operand: ParsedTypeArguments | |
| operand: ParsedNameAccess | |
| operand: ParsedUnqualifiedName | |
| name: p | |
| operator: . | |
| name: C | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: E | |
| rightBracket: > | |
| operator: . | |
| name: n | |
| argumentList: ArgumentList | |
| leftParenthesis: ( | |
| rightParenthesis: ) | |
| expression(v1): InstanceCreationExpression | |
| constructorName: ConstructorName | |
| type: NamedType | |
| importPrefix: ImportPrefixReference | |
| name: p | |
| period: . | |
| name: C | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: E | |
| rightBracket: > | |
| period: . | |
| name: SimpleIdentifier | |
| token: n | |
| argumentList: ArgumentList | |
| leftParenthesis: ( | |
| rightParenthesis: ) | |
| semicolon: ; | |
| '''); | |
| } | |
| void test_parseInstanceCreation_noKeyword_varInit() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| class C<T, S> {} | |
| void main() { | |
| final c = C<int, int Function(String)>(); | |
| } | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| ClassDeclaration | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: C | |
| typeParameters: TypeParameterList | |
| leftBracket: < | |
| typeParameters | |
| TypeParameter | |
| name: T | |
| TypeParameter | |
| name: S | |
| rightBracket: > | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| FunctionDeclaration | |
| returnType: NamedType | |
| name: void | |
| name: main | |
| functionExpression: FunctionExpression | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| rightParenthesis: ) | |
| body: BlockFunctionBody | |
| block: Block | |
| leftBracket: { | |
| statements | |
| VariableDeclarationStatement | |
| variables: VariableDeclarationList | |
| keyword: final | |
| variables | |
| VariableDeclaration | |
| name: c | |
| equals: = | |
| initializer2: ParsedValueArguments | |
| operand: ParsedTypeArguments | |
| operand: ParsedUnqualifiedName | |
| name: C | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: int | |
| GenericFunctionType | |
| returnType: NamedType | |
| name: int | |
| functionKeyword: Function | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| requiredPositionalFormalParameters | |
| RegularFormalParameter | |
| type: NamedType | |
| name: String | |
| rightParenthesis: ) | |
| parameters(v1): FormalParameterList | |
| leftParenthesis: ( | |
| parameter: RegularFormalParameter | |
| type: NamedType | |
| name: String | |
| rightParenthesis: ) | |
| rightBracket: > | |
| argumentList: ArgumentList | |
| leftParenthesis: ( | |
| rightParenthesis: ) | |
| initializer(v1): MethodInvocation | |
| methodName: SimpleIdentifier | |
| token: C | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: int | |
| GenericFunctionType | |
| returnType: NamedType | |
| name: int | |
| functionKeyword: Function | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| parameter: RegularFormalParameter | |
| type: NamedType | |
| name: String | |
| rightParenthesis: ) | |
| rightBracket: > | |
| argumentList: ArgumentList | |
| leftParenthesis: ( | |
| rightParenthesis: ) | |
| semicolon: ; | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseLibraryIdentifier_builtin() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| library $name; | |
| '''); | |
| var node = parseResult.findNode.singleLibraryDirective; | |
| assertParsedNodeText(node, r''' | |
| LibraryDirective | |
| libraryKeyword: library | |
| name: DottedName | |
| tokens | |
| $name | |
| semicolon: ; | |
| '''); | |
| } | |
| void test_parseLibraryIdentifier_invalid() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| library <myLibId>; | |
| // [diag.missingFunctionParameters][column 1][length 7] Functions must have an explicit list of parameters. | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| FunctionDeclaration | |
| name: library | |
| functionExpression: FunctionExpression | |
| typeParameters: TypeParameterList | |
| leftBracket: < | |
| typeParameters | |
| TypeParameter | |
| name: myLibId | |
| rightBracket: > | |
| parameters: FormalParameterList | |
| leftParenthesis: ( <synthetic> | |
| rightParenthesis: ) <synthetic> | |
| body: EmptyFunctionBody | |
| semicolon: ; | |
| '''); | |
| } | |
| void test_parseLibraryIdentifier_multiple() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| library $name; | |
| '''); | |
| var node = parseResult.findNode.singleLibraryDirective; | |
| assertParsedNodeText(node, r''' | |
| LibraryDirective | |
| libraryKeyword: library | |
| name: DottedName | |
| tokens | |
| $name | |
| semicolon: ; | |
| '''); | |
| } | |
| void test_parseLibraryIdentifier_pseudo() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| library $name; | |
| '''); | |
| var node = parseResult.findNode.singleLibraryDirective; | |
| assertParsedNodeText(node, r''' | |
| LibraryDirective | |
| libraryKeyword: library | |
| name: DottedName | |
| tokens | |
| $name | |
| semicolon: ; | |
| '''); | |
| } | |
| void test_parseLibraryIdentifier_single() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| library $name; | |
| '''); | |
| var node = parseResult.findNode.singleLibraryDirective; | |
| assertParsedNodeText(node, r''' | |
| LibraryDirective | |
| libraryKeyword: library | |
| name: DottedName | |
| tokens | |
| $name | |
| semicolon: ; | |
| '''); | |
| } | |
| void test_parseOptionalReturnType() { | |
| // TODO(brianwilkerson): Implement tests for this method. | |
| } | |
| void test_parseReturnStatement_noValue() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f() { | |
| return; | |
| } | |
| '''); | |
| var node = parseResult.findNode.firstBlock.statements[0]; | |
| assertParsedNodeText(node, r''' | |
| ReturnStatement | |
| returnKeyword: return | |
| semicolon: ; | |
| '''); | |
| } | |
| void test_parseReturnStatement_value() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f() { | |
| return x; | |
| } | |
| '''); | |
| var node = parseResult.findNode.firstBlock.statements[0]; | |
| assertParsedNodeText(node, r''' | |
| ReturnStatement | |
| returnKeyword: return | |
| expression2: ParsedUnqualifiedName | |
| name: x | |
| expression(v1): SimpleIdentifier | |
| token: x | |
| semicolon: ; | |
| '''); | |
| } | |
| void test_parseStatement_function_noReturnType() { | |
| var parseResult = parseTestCodeWithDiagnostics(''' | |
| void f() { | |
| Function<A>(core.List<core.int> x) m() => null; | |
| } | |
| '''); | |
| var node = parseResult.findNode.firstBlock.statements[0]; | |
| assertParsedNodeText(node, ''' | |
| FunctionDeclarationStatement | |
| functionDeclaration: FunctionDeclaration | |
| returnType: GenericFunctionType | |
| functionKeyword: Function | |
| typeParameters: TypeParameterList | |
| leftBracket: < | |
| typeParameters | |
| TypeParameter | |
| name: A | |
| rightBracket: > | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| requiredPositionalFormalParameters | |
| RegularFormalParameter | |
| type: NamedType | |
| importPrefix: ImportPrefixReference | |
| name: core | |
| period: . | |
| name: List | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| importPrefix: ImportPrefixReference | |
| name: core | |
| period: . | |
| name: int | |
| rightBracket: > | |
| name: x | |
| rightParenthesis: ) | |
| parameters(v1): FormalParameterList | |
| leftParenthesis: ( | |
| parameter: RegularFormalParameter | |
| type: NamedType | |
| importPrefix: ImportPrefixReference | |
| name: core | |
| period: . | |
| name: List | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| importPrefix: ImportPrefixReference | |
| name: core | |
| period: . | |
| name: int | |
| rightBracket: > | |
| name: x | |
| rightParenthesis: ) | |
| name: m | |
| functionExpression: FunctionExpression | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| rightParenthesis: ) | |
| body: ExpressionFunctionBody | |
| functionDefinition: => | |
| expression2: NullLiteral | |
| literal: null | |
| semicolon: ; | |
| '''); | |
| } | |
| void test_parseStatements_multiple() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f() { | |
| return; | |
| return; | |
| } | |
| '''); | |
| var node = parseResult.findNode.firstBlock; | |
| assertParsedNodeText(node, r''' | |
| Block | |
| leftBracket: { | |
| statements | |
| ReturnStatement | |
| returnKeyword: return | |
| semicolon: ; | |
| ReturnStatement | |
| returnKeyword: return | |
| semicolon: ; | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseStatements_single() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f() { | |
| return; | |
| } | |
| '''); | |
| var node = parseResult.findNode.firstBlock; | |
| assertParsedNodeText(node, r''' | |
| Block | |
| leftBracket: { | |
| statements | |
| ReturnStatement | |
| returnKeyword: return | |
| semicolon: ; | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseTypeAnnotation_function_noReturnType_noParameters() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f(Function() x) {} | |
| '''); | |
| var node = parseResult.findNode.firstFormalParameter; | |
| assertParsedNodeText(node, r''' | |
| RegularFormalParameter | |
| type: GenericFunctionType | |
| functionKeyword: Function | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| rightParenthesis: ) | |
| name: x | |
| '''); | |
| } | |
| void test_parseTypeAnnotation_function_noReturnType_parameters() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f(Function(int, int) x) {} | |
| '''); | |
| var node = parseResult.findNode.firstFormalParameter; | |
| assertParsedNodeText(node, r''' | |
| RegularFormalParameter | |
| type: GenericFunctionType | |
| functionKeyword: Function | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| requiredPositionalFormalParameters | |
| RegularFormalParameter | |
| type: NamedType | |
| name: int | |
| RegularFormalParameter | |
| type: NamedType | |
| name: int | |
| rightParenthesis: ) | |
| parameters(v1): FormalParameterList | |
| leftParenthesis: ( | |
| parameter: RegularFormalParameter | |
| type: NamedType | |
| name: int | |
| parameter: RegularFormalParameter | |
| type: NamedType | |
| name: int | |
| rightParenthesis: ) | |
| name: x | |
| '''); | |
| } | |
| void test_parseTypeAnnotation_function_noReturnType_typeParameters() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f(Function<S, T>() x) {} | |
| '''); | |
| var node = parseResult.findNode.firstFormalParameter; | |
| assertParsedNodeText(node, r''' | |
| RegularFormalParameter | |
| type: GenericFunctionType | |
| functionKeyword: Function | |
| typeParameters: TypeParameterList | |
| leftBracket: < | |
| typeParameters | |
| TypeParameter | |
| name: S | |
| TypeParameter | |
| name: T | |
| rightBracket: > | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| rightParenthesis: ) | |
| name: x | |
| '''); | |
| } | |
| void | |
| test_parseTypeAnnotation_function_noReturnType_typeParameters_parameters() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f(Function<T>(String, {T t}) x) {} | |
| '''); | |
| var node = parseResult.findNode.firstFormalParameter; | |
| assertParsedNodeText(node, r''' | |
| RegularFormalParameter | |
| type: GenericFunctionType | |
| functionKeyword: Function | |
| typeParameters: TypeParameterList | |
| leftBracket: < | |
| typeParameters | |
| TypeParameter | |
| name: T | |
| rightBracket: > | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| requiredPositionalFormalParameters | |
| RegularFormalParameter | |
| type: NamedType | |
| name: String | |
| delimitedFormalParameters: DelimitedFormalParameters | |
| leftDelimiter: { | |
| formalParameters | |
| RegularFormalParameter | |
| type: NamedType | |
| name: T | |
| name: t | |
| rightDelimiter: } | |
| rightParenthesis: ) | |
| parameters(v1): FormalParameterList | |
| leftParenthesis: ( | |
| parameter: RegularFormalParameter | |
| type: NamedType | |
| name: String | |
| leftDelimiter: { | |
| parameter: RegularFormalParameter | |
| type: NamedType | |
| name: T | |
| name: t | |
| rightDelimiter: } | |
| rightParenthesis: ) | |
| name: x | |
| '''); | |
| } | |
| void test_parseTypeAnnotation_function_returnType_classFunction() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f(Function x) {} | |
| '''); | |
| var node = parseResult.findNode.firstFormalParameter; | |
| assertParsedNodeText(node, r''' | |
| RegularFormalParameter | |
| type: NamedType | |
| name: Function | |
| name: x | |
| '''); | |
| } | |
| void test_parseTypeAnnotation_function_returnType_function() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f(A Function(B, C) Function(D) x) {} | |
| '''); | |
| var node = parseResult.findNode.firstFormalParameter; | |
| assertParsedNodeText(node, r''' | |
| RegularFormalParameter | |
| type: GenericFunctionType | |
| returnType: GenericFunctionType | |
| returnType: NamedType | |
| name: A | |
| functionKeyword: Function | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| requiredPositionalFormalParameters | |
| RegularFormalParameter | |
| type: NamedType | |
| name: B | |
| RegularFormalParameter | |
| type: NamedType | |
| name: C | |
| rightParenthesis: ) | |
| parameters(v1): FormalParameterList | |
| leftParenthesis: ( | |
| parameter: RegularFormalParameter | |
| type: NamedType | |
| name: B | |
| parameter: RegularFormalParameter | |
| type: NamedType | |
| name: C | |
| rightParenthesis: ) | |
| functionKeyword: Function | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| requiredPositionalFormalParameters | |
| RegularFormalParameter | |
| type: NamedType | |
| name: D | |
| rightParenthesis: ) | |
| parameters(v1): FormalParameterList | |
| leftParenthesis: ( | |
| parameter: RegularFormalParameter | |
| type: NamedType | |
| name: D | |
| rightParenthesis: ) | |
| name: x | |
| '''); | |
| } | |
| void test_parseTypeAnnotation_function_returnType_noParameters() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f(List<int> Function() x) {} | |
| '''); | |
| var node = parseResult.findNode.firstFormalParameter; | |
| assertParsedNodeText(node, r''' | |
| RegularFormalParameter | |
| type: GenericFunctionType | |
| returnType: NamedType | |
| name: List | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: int | |
| rightBracket: > | |
| functionKeyword: Function | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| rightParenthesis: ) | |
| name: x | |
| '''); | |
| } | |
| void test_parseTypeAnnotation_function_returnType_parameters() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f(List<int> Function(String s, int i) x) {} | |
| '''); | |
| var node = parseResult.findNode.firstFormalParameter; | |
| assertParsedNodeText(node, r''' | |
| RegularFormalParameter | |
| type: GenericFunctionType | |
| returnType: NamedType | |
| name: List | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: int | |
| rightBracket: > | |
| functionKeyword: Function | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| requiredPositionalFormalParameters | |
| RegularFormalParameter | |
| type: NamedType | |
| name: String | |
| name: s | |
| RegularFormalParameter | |
| type: NamedType | |
| name: int | |
| name: i | |
| rightParenthesis: ) | |
| parameters(v1): FormalParameterList | |
| leftParenthesis: ( | |
| parameter: RegularFormalParameter | |
| type: NamedType | |
| name: String | |
| name: s | |
| parameter: RegularFormalParameter | |
| type: NamedType | |
| name: int | |
| name: i | |
| rightParenthesis: ) | |
| name: x | |
| '''); | |
| } | |
| void test_parseTypeAnnotation_function_returnType_simple() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f(A Function(B, C) x) {} | |
| '''); | |
| var node = parseResult.findNode.firstFormalParameter; | |
| assertParsedNodeText(node, r''' | |
| RegularFormalParameter | |
| type: GenericFunctionType | |
| returnType: NamedType | |
| name: A | |
| functionKeyword: Function | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| requiredPositionalFormalParameters | |
| RegularFormalParameter | |
| type: NamedType | |
| name: B | |
| RegularFormalParameter | |
| type: NamedType | |
| name: C | |
| rightParenthesis: ) | |
| parameters(v1): FormalParameterList | |
| leftParenthesis: ( | |
| parameter: RegularFormalParameter | |
| type: NamedType | |
| name: B | |
| parameter: RegularFormalParameter | |
| type: NamedType | |
| name: C | |
| rightParenthesis: ) | |
| name: x | |
| '''); | |
| } | |
| void test_parseTypeAnnotation_function_returnType_typeParameters() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f(List<T> Function<T>() x) {} | |
| '''); | |
| var node = parseResult.findNode.firstFormalParameter; | |
| assertParsedNodeText(node, r''' | |
| RegularFormalParameter | |
| type: GenericFunctionType | |
| returnType: NamedType | |
| name: List | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: T | |
| rightBracket: > | |
| functionKeyword: Function | |
| typeParameters: TypeParameterList | |
| leftBracket: < | |
| typeParameters | |
| TypeParameter | |
| name: T | |
| rightBracket: > | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| rightParenthesis: ) | |
| name: x | |
| '''); | |
| } | |
| void | |
| test_parseTypeAnnotation_function_returnType_typeParameters_parameters() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f(List<T> Function<T>(String s, [T]) x) {} | |
| '''); | |
| var node = parseResult.findNode.firstFormalParameter; | |
| assertParsedNodeText(node, r''' | |
| RegularFormalParameter | |
| type: GenericFunctionType | |
| returnType: NamedType | |
| name: List | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: T | |
| rightBracket: > | |
| functionKeyword: Function | |
| typeParameters: TypeParameterList | |
| leftBracket: < | |
| typeParameters | |
| TypeParameter | |
| name: T | |
| rightBracket: > | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| requiredPositionalFormalParameters | |
| RegularFormalParameter | |
| type: NamedType | |
| name: String | |
| name: s | |
| delimitedFormalParameters: DelimitedFormalParameters | |
| leftDelimiter: [ | |
| formalParameters | |
| RegularFormalParameter | |
| type: NamedType | |
| name: T | |
| rightDelimiter: ] | |
| rightParenthesis: ) | |
| parameters(v1): FormalParameterList | |
| leftParenthesis: ( | |
| parameter: RegularFormalParameter | |
| type: NamedType | |
| name: String | |
| name: s | |
| leftDelimiter: [ | |
| parameter: RegularFormalParameter | |
| type: NamedType | |
| name: T | |
| rightDelimiter: ] | |
| rightParenthesis: ) | |
| name: x | |
| '''); | |
| } | |
| void test_parseTypeAnnotation_function_returnType_withArguments() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f(A<B> Function(C) x) {} | |
| '''); | |
| var node = parseResult.findNode.firstFormalParameter; | |
| assertParsedNodeText(node, r''' | |
| RegularFormalParameter | |
| type: GenericFunctionType | |
| returnType: NamedType | |
| name: A | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: B | |
| rightBracket: > | |
| functionKeyword: Function | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| requiredPositionalFormalParameters | |
| RegularFormalParameter | |
| type: NamedType | |
| name: C | |
| rightParenthesis: ) | |
| parameters(v1): FormalParameterList | |
| leftParenthesis: ( | |
| parameter: RegularFormalParameter | |
| type: NamedType | |
| name: C | |
| rightParenthesis: ) | |
| name: x | |
| '''); | |
| } | |
| void test_parseTypeAnnotation_named() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f(A<B> x) {} | |
| '''); | |
| var node = parseResult.findNode.firstFormalParameter; | |
| assertParsedNodeText(node, r''' | |
| RegularFormalParameter | |
| type: NamedType | |
| name: A | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: B | |
| rightBracket: > | |
| name: x | |
| '''); | |
| } | |
| void test_parseTypeArgumentList_empty() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f( | |
| C<> x, | |
| // ^ | |
| // [diag.expectedTypeName] Expected a type name. | |
| ) {} | |
| '''); | |
| var node = parseResult.findNode.firstFormalParameter; | |
| assertParsedNodeText(node, r''' | |
| RegularFormalParameter | |
| type: NamedType | |
| name: C | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: <empty> <synthetic> | |
| rightBracket: > | |
| name: x | |
| '''); | |
| } | |
| void test_parseTypeArgumentList_multiple() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f(C<int, int, int> x) {} | |
| '''); | |
| var node = parseResult.findNode.firstFormalParameter; | |
| assertParsedNodeText(node, r''' | |
| RegularFormalParameter | |
| type: NamedType | |
| name: C | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: int | |
| NamedType | |
| name: int | |
| NamedType | |
| name: int | |
| rightBracket: > | |
| name: x | |
| '''); | |
| } | |
| void test_parseTypeArgumentList_nested() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f(C<A<B>> x) {} | |
| '''); | |
| var node = parseResult.findNode.firstFormalParameter; | |
| assertParsedNodeText(node, r''' | |
| RegularFormalParameter | |
| type: NamedType | |
| name: C | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: A | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: B | |
| rightBracket: > | |
| rightBracket: > | |
| name: x | |
| '''); | |
| } | |
| void test_parseTypeArgumentList_nested_withComment_double() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f(C<A<B /* 0 */>> x) {} | |
| '''); | |
| var node = parseResult.findNode.firstFormalParameter; | |
| assertParsedNodeText(node, r''' | |
| RegularFormalParameter | |
| type: NamedType | |
| name: C | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: A | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: B | |
| rightBracket: > | |
| rightBracket: > | |
| name: x | |
| '''); | |
| } | |
| void test_parseTypeArgumentList_nested_withComment_tripple() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f(C<A<B<C /* 0 */>>> x) {} | |
| '''); | |
| var node = parseResult.findNode.firstFormalParameter; | |
| assertParsedNodeText(node, r''' | |
| RegularFormalParameter | |
| type: NamedType | |
| name: C | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: A | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: B | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: C | |
| rightBracket: > | |
| rightBracket: > | |
| rightBracket: > | |
| name: x | |
| '''); | |
| } | |
| void test_parseTypeArgumentList_single() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f(C<int> x) {} | |
| '''); | |
| var node = parseResult.findNode.firstFormalParameter; | |
| assertParsedNodeText(node, r''' | |
| RegularFormalParameter | |
| type: NamedType | |
| name: C | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: int | |
| rightBracket: > | |
| name: x | |
| '''); | |
| } | |
| void test_parseTypeName_parameterized() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f(List<int> x) {} | |
| '''); | |
| var node = parseResult.findNode.firstFormalParameter; | |
| assertParsedNodeText(node, r''' | |
| RegularFormalParameter | |
| type: NamedType | |
| name: List | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: int | |
| rightBracket: > | |
| name: x | |
| '''); | |
| } | |
| void test_parseTypeName_simple() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f(int x) {} | |
| '''); | |
| var node = parseResult.findNode.firstFormalParameter; | |
| assertParsedNodeText(node, r''' | |
| RegularFormalParameter | |
| type: NamedType | |
| name: int | |
| name: x | |
| '''); | |
| } | |
| void test_parseTypeParameter_bounded_functionType_noReturn() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| class C<A extends Function(int)> {} | |
| '''); | |
| var node = parseResult.findNode.singleClassDeclaration; | |
| assertParsedNodeText(node, r''' | |
| ClassDeclaration | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: C | |
| typeParameters: TypeParameterList | |
| leftBracket: < | |
| typeParameters | |
| TypeParameter | |
| name: A | |
| extendsKeyword: extends | |
| bound: GenericFunctionType | |
| functionKeyword: Function | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| requiredPositionalFormalParameters | |
| RegularFormalParameter | |
| type: NamedType | |
| name: int | |
| rightParenthesis: ) | |
| parameters(v1): FormalParameterList | |
| leftParenthesis: ( | |
| parameter: RegularFormalParameter | |
| type: NamedType | |
| name: int | |
| rightParenthesis: ) | |
| rightBracket: > | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseTypeParameter_bounded_functionType_return() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| class C<A extends String Function(int)> {} | |
| '''); | |
| var node = parseResult.findNode.singleClassDeclaration; | |
| assertParsedNodeText(node, r''' | |
| ClassDeclaration | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: C | |
| typeParameters: TypeParameterList | |
| leftBracket: < | |
| typeParameters | |
| TypeParameter | |
| name: A | |
| extendsKeyword: extends | |
| bound: GenericFunctionType | |
| returnType: NamedType | |
| name: String | |
| functionKeyword: Function | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| requiredPositionalFormalParameters | |
| RegularFormalParameter | |
| type: NamedType | |
| name: int | |
| rightParenthesis: ) | |
| parameters(v1): FormalParameterList | |
| leftParenthesis: ( | |
| parameter: RegularFormalParameter | |
| type: NamedType | |
| name: int | |
| rightParenthesis: ) | |
| rightBracket: > | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseTypeParameter_bounded_generic() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| class C<A extends B<C>> {} | |
| '''); | |
| var node = parseResult.findNode.singleClassDeclaration; | |
| assertParsedNodeText(node, r''' | |
| ClassDeclaration | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: C | |
| typeParameters: TypeParameterList | |
| leftBracket: < | |
| typeParameters | |
| TypeParameter | |
| name: A | |
| extendsKeyword: extends | |
| bound: NamedType | |
| name: B | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: C | |
| rightBracket: > | |
| rightBracket: > | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseTypeParameter_bounded_simple() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| class C<A extends B> {} | |
| '''); | |
| var node = parseResult.findNode.singleClassDeclaration; | |
| assertParsedNodeText(node, r''' | |
| ClassDeclaration | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: C | |
| typeParameters: TypeParameterList | |
| leftBracket: < | |
| typeParameters | |
| TypeParameter | |
| name: A | |
| extendsKeyword: extends | |
| bound: NamedType | |
| name: B | |
| rightBracket: > | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseTypeParameter_simple() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| class C<A> {} | |
| '''); | |
| var node = parseResult.findNode.singleClassDeclaration; | |
| assertParsedNodeText(node, r''' | |
| ClassDeclaration | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: C | |
| typeParameters: TypeParameterList | |
| leftBracket: < | |
| typeParameters | |
| TypeParameter | |
| name: A | |
| rightBracket: > | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseTypeParameterList_multiple() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| class C<A, B extends C, D> {} | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| ClassDeclaration | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: C | |
| typeParameters: TypeParameterList | |
| leftBracket: < | |
| typeParameters | |
| TypeParameter | |
| name: A | |
| TypeParameter | |
| name: B | |
| extendsKeyword: extends | |
| bound: NamedType | |
| name: C | |
| TypeParameter | |
| name: D | |
| rightBracket: > | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseTypeParameterList_parameterizedWithTrailingEquals() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| class C<A extends B<E>>= {} | |
| // ^ | |
| // [diag.expectedToken] Expected to find ';'. | |
| // ^ | |
| // [diag.expectedTypeName] Expected a type name. | |
| // [diag.expectedToken] Expected to find 'with'. | |
| // [diag.expectedExecutable] Expected a method, getter, setter or operator declaration. | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| ClassTypeAlias | |
| typedefKeyword: class | |
| name: C | |
| typeParameters: TypeParameterList | |
| leftBracket: < | |
| typeParameters | |
| TypeParameter | |
| name: A | |
| extendsKeyword: extends | |
| bound: NamedType | |
| name: B | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: E | |
| rightBracket: > | |
| rightBracket: > | |
| equals: = | |
| superclass: NamedType | |
| name: <empty> <synthetic> | |
| withClause: WithClause | |
| withKeyword: with <synthetic> | |
| mixinTypes | |
| NamedType | |
| name: <empty> <synthetic> | |
| semicolon: ; <synthetic> | |
| '''); | |
| } | |
| void test_parseTypeParameterList_parameterizedWithTrailingEquals2() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| class C<A extends B<E /* foo */ >>= {} | |
| // ^ | |
| // [diag.expectedToken] Expected to find ';'. | |
| // ^ | |
| // [diag.expectedTypeName] Expected a type name. | |
| // [diag.expectedToken] Expected to find 'with'. | |
| // [diag.expectedExecutable] Expected a method, getter, setter or operator declaration. | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| ClassTypeAlias | |
| typedefKeyword: class | |
| name: C | |
| typeParameters: TypeParameterList | |
| leftBracket: < | |
| typeParameters | |
| TypeParameter | |
| name: A | |
| extendsKeyword: extends | |
| bound: NamedType | |
| name: B | |
| typeArguments: TypeArgumentList | |
| leftBracket: < | |
| arguments | |
| NamedType | |
| name: E | |
| rightBracket: > | |
| rightBracket: > | |
| equals: = | |
| superclass: NamedType | |
| name: <empty> <synthetic> | |
| withClause: WithClause | |
| withKeyword: with <synthetic> | |
| mixinTypes | |
| NamedType | |
| name: <empty> <synthetic> | |
| semicolon: ; <synthetic> | |
| '''); | |
| } | |
| void test_parseTypeParameterList_single() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| class C<<A> {} | |
| // ^ | |
| // [diag.expectedClassBody] A class declaration must have a body, even if it is empty. | |
| // ^^ | |
| // [diag.expectedExecutable] Expected a method, getter, setter or operator declaration. | |
| // ^ | |
| // [diag.missingConstFinalVarOrType] Variables must be declared using the keywords 'const', 'final', 'var' or a type name. | |
| // [diag.expectedToken] Expected to find ';'. | |
| // ^ | |
| // [diag.expectedExecutable] Expected a method, getter, setter or operator declaration. | |
| // ^ | |
| // [diag.expectedExecutable] Expected a method, getter, setter or operator declaration. | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| ClassDeclaration | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: C | |
| body: BlockClassBody | |
| leftBracket: { <synthetic> | |
| rightBracket: } <synthetic> | |
| TopLevelVariableDeclaration | |
| variables: VariableDeclarationList | |
| variables | |
| VariableDeclaration | |
| name: A | |
| semicolon: ; <synthetic> | |
| '''); | |
| } | |
| void test_parseTypeParameterList_withTrailingEquals() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| class C<A>= {} | |
| // ^ | |
| // [diag.expectedToken] Expected to find ';'. | |
| // ^ | |
| // [diag.expectedTypeName] Expected a type name. | |
| // [diag.expectedToken] Expected to find 'with'. | |
| // [diag.expectedExecutable] Expected a method, getter, setter or operator declaration. | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| ClassTypeAlias | |
| typedefKeyword: class | |
| name: C | |
| typeParameters: TypeParameterList | |
| leftBracket: < | |
| typeParameters | |
| TypeParameter | |
| name: A | |
| rightBracket: > | |
| equals: = | |
| superclass: NamedType | |
| name: <empty> <synthetic> | |
| withClause: WithClause | |
| withKeyword: with <synthetic> | |
| mixinTypes | |
| NamedType | |
| name: <empty> <synthetic> | |
| semicolon: ; <synthetic> | |
| '''); | |
| } | |
| void test_parseVariableDeclaration_equals() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| var a = b; | |
| '''); | |
| var node = parseResult.findNode.singleVariableDeclaration; | |
| assertParsedNodeText(node, r''' | |
| VariableDeclaration | |
| name: a | |
| equals: = | |
| initializer2: ParsedUnqualifiedName | |
| name: b | |
| initializer(v1): SimpleIdentifier | |
| token: b | |
| '''); | |
| } | |
| void test_parseVariableDeclaration_final_late() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f() { | |
| final late a; | |
| // ^^^^ | |
| // [diag.modifierOutOfOrder] The modifier 'late' should be before the modifier 'final'. | |
| } | |
| '''); | |
| var node = parseResult.findNode.firstBlock.statements[0]; | |
| assertParsedNodeText(node, r''' | |
| VariableDeclarationStatement | |
| variables: VariableDeclarationList | |
| lateKeyword: late | |
| keyword: final | |
| variables | |
| VariableDeclaration | |
| name: a | |
| semicolon: ; | |
| '''); | |
| } | |
| void test_parseVariableDeclaration_late() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f() { | |
| late a; | |
| // ^ | |
| // [diag.missingConstFinalVarOrType] Variables must be declared using the keywords 'const', 'final', 'var' or a type name. | |
| } | |
| '''); | |
| var node = parseResult.findNode.firstBlock.statements[0]; | |
| assertParsedNodeText(node, r''' | |
| VariableDeclarationStatement | |
| variables: VariableDeclarationList | |
| lateKeyword: late | |
| variables | |
| VariableDeclaration | |
| name: a | |
| semicolon: ; | |
| '''); | |
| } | |
| void test_parseVariableDeclaration_late_final() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f() { | |
| late final a; | |
| } | |
| '''); | |
| var node = parseResult.findNode.firstBlock.statements[0]; | |
| assertParsedNodeText(node, r''' | |
| VariableDeclarationStatement | |
| variables: VariableDeclarationList | |
| lateKeyword: late | |
| keyword: final | |
| variables | |
| VariableDeclaration | |
| name: a | |
| semicolon: ; | |
| '''); | |
| } | |
| void test_parseVariableDeclaration_late_init() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f() { | |
| late a = 0; | |
| // ^ | |
| // [diag.missingConstFinalVarOrType] Variables must be declared using the keywords 'const', 'final', 'var' or a type name. | |
| } | |
| '''); | |
| var node = parseResult.findNode.firstBlock.statements[0]; | |
| assertParsedNodeText(node, r''' | |
| VariableDeclarationStatement | |
| variables: VariableDeclarationList | |
| lateKeyword: late | |
| variables | |
| VariableDeclaration | |
| name: a | |
| equals: = | |
| initializer2: IntegerLiteral | |
| literal: 0 | |
| semicolon: ; | |
| '''); | |
| } | |
| void test_parseVariableDeclaration_late_type() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f() { | |
| late A a; | |
| } | |
| '''); | |
| var node = parseResult.findNode.firstBlock.statements[0]; | |
| assertParsedNodeText(node, r''' | |
| VariableDeclarationStatement | |
| variables: VariableDeclarationList | |
| lateKeyword: late | |
| type: NamedType | |
| name: A | |
| variables | |
| VariableDeclaration | |
| name: a | |
| semicolon: ; | |
| '''); | |
| } | |
| void test_parseVariableDeclaration_late_var() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f() { | |
| late var a; | |
| } | |
| '''); | |
| var node = parseResult.findNode.firstBlock.statements[0]; | |
| assertParsedNodeText(node, r''' | |
| VariableDeclarationStatement | |
| variables: VariableDeclarationList | |
| lateKeyword: late | |
| keyword: var | |
| variables | |
| VariableDeclaration | |
| name: a | |
| semicolon: ; | |
| '''); | |
| } | |
| void test_parseVariableDeclaration_late_var_init() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| void f() { | |
| late var a = 0; | |
| } | |
| '''); | |
| var node = parseResult.findNode.firstBlock.statements[0]; | |
| assertParsedNodeText(node, r''' | |
| VariableDeclarationStatement | |
| variables: VariableDeclarationList | |
| lateKeyword: late | |
| keyword: var | |
| variables | |
| VariableDeclaration | |
| name: a | |
| equals: = | |
| initializer2: IntegerLiteral | |
| literal: 0 | |
| semicolon: ; | |
| '''); | |
| } | |
| void test_parseVariableDeclaration_noEquals() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| var a; | |
| '''); | |
| var node = parseResult.findNode.singleVariableDeclaration; | |
| assertParsedNodeText(node, r''' | |
| VariableDeclaration | |
| name: a | |
| '''); | |
| } | |
| void test_parseWithClause_multiple() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| class TestClass extends Object with A, B, C {} | |
| '''); | |
| var node = parseResult.findNode.singleClassDeclaration; | |
| assertParsedNodeText(node, r''' | |
| ClassDeclaration | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: TestClass | |
| extendsClause: ExtendsClause | |
| extendsKeyword: extends | |
| superclass: NamedType | |
| name: Object | |
| withClause: WithClause | |
| withKeyword: with | |
| mixinTypes | |
| NamedType | |
| name: A | |
| NamedType | |
| name: B | |
| NamedType | |
| name: C | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_parseWithClause_single() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| class TestClass extends Object with M {} | |
| '''); | |
| var node = parseResult.findNode.singleClassDeclaration; | |
| assertParsedNodeText(node, r''' | |
| ClassDeclaration | |
| classKeyword: class | |
| namePart: NameWithTypeParameters | |
| typeName: TestClass | |
| extendsClause: ExtendsClause | |
| extendsKeyword: extends | |
| superclass: NamedType | |
| name: Object | |
| withClause: WithClause | |
| withKeyword: with | |
| mixinTypes | |
| NamedType | |
| name: M | |
| body: BlockClassBody | |
| leftBracket: { | |
| rightBracket: } | |
| '''); | |
| } | |
| void test_typeAlias_37733() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| typedef K=Function(<>($ | |
| // ^ | |
| // [diag.invalidInlineFunctionType] Inline function types can't be used for parameters in a generic function type. | |
| // [diag.missingIdentifier] Expected an identifier. | |
| // ^ | |
| // [diag.missingIdentifier] Expected an identifier. | |
| // ^ | |
| // [diag.expectedToken] Expected to find ';'. | |
| // [diag.expectedToken][column 24][length 1] Expected to find ')'. | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| GenericTypeAlias | |
| typedefKeyword: typedef | |
| name: K | |
| equals: = | |
| type: GenericFunctionType | |
| functionKeyword: Function | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| requiredPositionalFormalParameters | |
| RegularFormalParameter | |
| name: <empty> <synthetic> | |
| functionTypedSuffix: FunctionTypedFormalParameterSuffix | |
| typeParameters: TypeParameterList | |
| leftBracket: < | |
| typeParameters | |
| TypeParameter | |
| name: <empty> <synthetic> | |
| rightBracket: > | |
| formalParameters: FormalParameterList | |
| leftParenthesis: ( | |
| requiredPositionalFormalParameters | |
| RegularFormalParameter | |
| name: $ | |
| rightParenthesis: ) <synthetic> | |
| formalParameters(v1): FormalParameterList | |
| leftParenthesis: ( | |
| parameter: RegularFormalParameter | |
| name: $ | |
| rightParenthesis: ) <synthetic> | |
| rightParenthesis: ) <synthetic> | |
| parameters(v1): FormalParameterList | |
| leftParenthesis: ( | |
| parameter: RegularFormalParameter | |
| name: <empty> <synthetic> | |
| functionTypedSuffix: FunctionTypedFormalParameterSuffix | |
| typeParameters: TypeParameterList | |
| leftBracket: < | |
| typeParameters | |
| TypeParameter | |
| name: <empty> <synthetic> | |
| rightBracket: > | |
| formalParameters: FormalParameterList | |
| leftParenthesis: ( | |
| parameter: RegularFormalParameter | |
| name: $ | |
| rightParenthesis: ) <synthetic> | |
| rightParenthesis: ) <synthetic> | |
| semicolon: ; <synthetic> | |
| '''); | |
| } | |
| void test_typeAlias_parameter_missingIdentifier_37733() { | |
| var parseResult = parseTestCodeWithDiagnostics(r''' | |
| typedef T=Function(<S>()); | |
| // ^ | |
| // [diag.invalidInlineFunctionType] Inline function types can't be used for parameters in a generic function type. | |
| // [diag.missingIdentifier] Expected an identifier. | |
| '''); | |
| var node = parseResult.findNode.unit; | |
| assertParsedNodeText(node, r''' | |
| CompilationUnit | |
| declarations2 | |
| GenericTypeAlias | |
| typedefKeyword: typedef | |
| name: T | |
| equals: = | |
| type: GenericFunctionType | |
| functionKeyword: Function | |
| parameters: FormalParameterList | |
| leftParenthesis: ( | |
| requiredPositionalFormalParameters | |
| RegularFormalParameter | |
| name: <empty> <synthetic> | |
| functionTypedSuffix: FunctionTypedFormalParameterSuffix | |
| typeParameters: TypeParameterList | |
| leftBracket: < | |
| typeParameters | |
| TypeParameter | |
| name: S | |
| rightBracket: > | |
| formalParameters: FormalParameterList | |
| leftParenthesis: ( | |
| rightParenthesis: ) | |
| rightParenthesis: ) | |
| parameters(v1): FormalParameterList | |
| leftParenthesis: ( | |
| parameter: RegularFormalParameter | |
| name: <empty> <synthetic> | |
| functionTypedSuffix: FunctionTypedFormalParameterSuffix | |
| typeParameters: TypeParameterList | |
| leftBracket: < | |
| typeParameters | |
| TypeParameter | |
| name: S | |
| rightBracket: > | |
| formalParameters: FormalParameterList | |
| leftParenthesis: ( | |
| rightParenthesis: ) | |
| rightParenthesis: ) | |
| semicolon: ; | |
| '''); | |
| } | |
| } |