| // 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. |
| |
| import 'package:analyzer/dart/ast/token.dart'; |
| 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(TopLevelParserTest); |
| defineReflectiveTests(UpdateNodeTextExpectations); |
| }); |
| } |
| |
| /// Tests which exercise the parser using a complete compilation unit or |
| /// compilation unit member. |
| @reflectiveTest |
| class TopLevelParserTest extends ParserDiagnosticsTest { |
| void test_function_literal_allowed_at_toplevel() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| var x = () {}; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| TopLevelVariableDeclaration |
| variables: VariableDeclarationList |
| keyword: var |
| variables |
| VariableDeclaration |
| name: x |
| equals: = |
| initializer: FunctionExpression |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| body: BlockFunctionBody |
| block: Block |
| leftBracket: { |
| rightBracket: } |
| semicolon: ; |
| '''); |
| } |
| |
| void |
| test_function_literal_allowed_in_ArgumentList_in_ConstructorFieldInitializer() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| class C { |
| C() : a = f(() {}); |
| } |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassDeclaration |
| classKeyword: class |
| namePart: NameWithTypeParameters |
| typeName: C |
| body: BlockClassBody |
| leftBracket: { |
| members |
| ConstructorDeclaration |
| typeName: SimpleIdentifier |
| token: C |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| separator: : |
| initializers |
| ConstructorFieldInitializer |
| fieldName: SimpleIdentifier |
| token: a |
| equals: = |
| expression: MethodInvocation |
| methodName: SimpleIdentifier |
| token: f |
| argumentList: ArgumentList |
| leftParenthesis: ( |
| arguments |
| FunctionExpression |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| body: BlockFunctionBody |
| block: Block |
| leftBracket: { |
| rightBracket: } |
| rightParenthesis: ) |
| body: EmptyFunctionBody |
| semicolon: ; |
| rightBracket: } |
| '''); |
| } |
| |
| void |
| test_function_literal_allowed_in_IndexExpression_in_ConstructorFieldInitializer() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| class C { |
| C() : a = x[() {}]; |
| } |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassDeclaration |
| classKeyword: class |
| namePart: NameWithTypeParameters |
| typeName: C |
| body: BlockClassBody |
| leftBracket: { |
| members |
| ConstructorDeclaration |
| typeName: SimpleIdentifier |
| token: C |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| separator: : |
| initializers |
| ConstructorFieldInitializer |
| fieldName: SimpleIdentifier |
| token: a |
| equals: = |
| expression: IndexExpression |
| target: SimpleIdentifier |
| token: x |
| leftBracket: [ |
| index: FunctionExpression |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| body: BlockFunctionBody |
| block: Block |
| leftBracket: { |
| rightBracket: } |
| rightBracket: ] |
| body: EmptyFunctionBody |
| semicolon: ; |
| rightBracket: } |
| '''); |
| } |
| |
| void |
| test_function_literal_allowed_in_ListLiteral_in_ConstructorFieldInitializer() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| class C { |
| C() : a = [() {}]; |
| } |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassDeclaration |
| classKeyword: class |
| namePart: NameWithTypeParameters |
| typeName: C |
| body: BlockClassBody |
| leftBracket: { |
| members |
| ConstructorDeclaration |
| typeName: SimpleIdentifier |
| token: C |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| separator: : |
| initializers |
| ConstructorFieldInitializer |
| fieldName: SimpleIdentifier |
| token: a |
| equals: = |
| expression: ListLiteral |
| leftBracket: [ |
| elements |
| FunctionExpression |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| body: BlockFunctionBody |
| block: Block |
| leftBracket: { |
| rightBracket: } |
| rightBracket: ] |
| body: EmptyFunctionBody |
| semicolon: ; |
| rightBracket: } |
| '''); |
| } |
| |
| void |
| test_function_literal_allowed_in_MapLiteral_in_ConstructorFieldInitializer() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| class C { |
| C() : a = {'key': () {}}; |
| } |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassDeclaration |
| classKeyword: class |
| namePart: NameWithTypeParameters |
| typeName: C |
| body: BlockClassBody |
| leftBracket: { |
| members |
| ConstructorDeclaration |
| typeName: SimpleIdentifier |
| token: C |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| separator: : |
| initializers |
| ConstructorFieldInitializer |
| fieldName: SimpleIdentifier |
| token: a |
| equals: = |
| expression: SetOrMapLiteral |
| leftBracket: { |
| elements |
| MapLiteralEntry |
| key: SimpleStringLiteral |
| literal: 'key' |
| separator: : |
| value: FunctionExpression |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| body: BlockFunctionBody |
| block: Block |
| leftBracket: { |
| rightBracket: } |
| rightBracket: } |
| isMap: false |
| body: EmptyFunctionBody |
| semicolon: ; |
| rightBracket: } |
| '''); |
| } |
| |
| void |
| test_function_literal_allowed_in_ParenthesizedExpression_in_ConstructorFieldInitializer() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| class C { |
| C() : a = (() {}); |
| } |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassDeclaration |
| classKeyword: class |
| namePart: NameWithTypeParameters |
| typeName: C |
| body: BlockClassBody |
| leftBracket: { |
| members |
| ConstructorDeclaration |
| typeName: SimpleIdentifier |
| token: C |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| separator: : |
| initializers |
| ConstructorFieldInitializer |
| fieldName: SimpleIdentifier |
| token: a |
| equals: = |
| expression: ParenthesizedExpression |
| leftParenthesis: ( |
| expression: FunctionExpression |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| body: BlockFunctionBody |
| block: Block |
| leftBracket: { |
| rightBracket: } |
| rightParenthesis: ) |
| body: EmptyFunctionBody |
| semicolon: ; |
| rightBracket: } |
| '''); |
| } |
| |
| void |
| test_function_literal_allowed_in_StringInterpolation_in_ConstructorFieldInitializer() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| class C { |
| C() : a = "${() {}}"; |
| } |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassDeclaration |
| classKeyword: class |
| namePart: NameWithTypeParameters |
| typeName: C |
| body: BlockClassBody |
| leftBracket: { |
| members |
| ConstructorDeclaration |
| typeName: SimpleIdentifier |
| token: C |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| separator: : |
| initializers |
| ConstructorFieldInitializer |
| fieldName: SimpleIdentifier |
| token: a |
| equals: = |
| expression: StringInterpolation |
| elements |
| InterpolationString |
| contents: " |
| InterpolationExpression |
| leftBracket: ${ |
| expression: FunctionExpression |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| body: BlockFunctionBody |
| block: Block |
| leftBracket: { |
| rightBracket: } |
| rightBracket: } |
| InterpolationString |
| contents: " |
| stringValue: null |
| body: EmptyFunctionBody |
| semicolon: ; |
| rightBracket: } |
| '''); |
| } |
| |
| void test_import_as_show() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| import 'dart:math' as M show E; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| ImportDirective |
| importKeyword: import |
| uri: SimpleStringLiteral |
| literal: 'dart:math' |
| asKeyword: as |
| prefix: SimpleIdentifier |
| token: M |
| combinators |
| ShowCombinator |
| keyword: show |
| shownNames |
| SimpleIdentifier |
| token: E |
| semicolon: ; |
| '''); |
| } |
| |
| void test_import_show_hide() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| import 'import1_lib.dart' show hide, show hide ugly; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| ImportDirective |
| importKeyword: import |
| uri: SimpleStringLiteral |
| literal: 'import1_lib.dart' |
| combinators |
| ShowCombinator |
| keyword: show |
| shownNames |
| SimpleIdentifier |
| token: hide |
| SimpleIdentifier |
| token: show |
| HideCombinator |
| keyword: hide |
| hiddenNames |
| SimpleIdentifier |
| token: ugly |
| semicolon: ; |
| '''); |
| } |
| |
| void test_import_withDocComment() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| /// Doc |
| import "foo.dart"; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| ImportDirective |
| documentationComment: Comment |
| tokens |
| /// Doc |
| importKeyword: import |
| uri: SimpleStringLiteral |
| literal: "foo.dart" |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parse_missing_type_in_list_at_eof() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| Future<List<>> |
| // ^^ |
| // [diag.expectedTypeName] Expected a type name. |
| // ^ |
| // [diag.expectedToken] Expected to find ';'. |
| // ^ |
| // [diag.missingIdentifier][column 15][length 0] Expected an identifier. |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| TopLevelVariableDeclaration |
| variables: VariableDeclarationList |
| type: NamedType |
| name: Future |
| typeArguments: TypeArgumentList |
| leftBracket: < |
| arguments |
| NamedType |
| name: List |
| typeArguments: TypeArgumentList |
| leftBracket: < |
| arguments |
| NamedType |
| name: <empty> <synthetic> |
| rightBracket: > |
| rightBracket: > |
| variables |
| VariableDeclaration |
| name: <empty> <synthetic> |
| semicolon: ; <synthetic> |
| '''); |
| } |
| |
| void test_parseClassDeclaration_abstract() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| abstract class A {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassDeclaration |
| abstractKeyword: abstract |
| classKeyword: class |
| namePart: NameWithTypeParameters |
| typeName: A |
| body: BlockClassBody |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseClassDeclaration_empty() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| class A {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassDeclaration |
| classKeyword: class |
| namePart: NameWithTypeParameters |
| typeName: A |
| body: BlockClassBody |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseClassDeclaration_extends() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| class A extends B {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassDeclaration |
| classKeyword: class |
| namePart: NameWithTypeParameters |
| typeName: A |
| extendsClause: ExtendsClause |
| extendsKeyword: extends |
| superclass: NamedType |
| name: B |
| body: BlockClassBody |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseClassDeclaration_extendsAndImplements() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| class A extends B implements C {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassDeclaration |
| classKeyword: class |
| namePart: NameWithTypeParameters |
| typeName: A |
| extendsClause: ExtendsClause |
| extendsKeyword: extends |
| superclass: NamedType |
| name: B |
| implementsClause: ImplementsClause |
| implementsKeyword: implements |
| interfaces |
| NamedType |
| name: C |
| body: BlockClassBody |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseClassDeclaration_extendsAndWith() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| class A extends B with C {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassDeclaration |
| classKeyword: class |
| namePart: NameWithTypeParameters |
| typeName: A |
| extendsClause: ExtendsClause |
| extendsKeyword: extends |
| superclass: NamedType |
| name: B |
| withClause: WithClause |
| withKeyword: with |
| mixinTypes |
| NamedType |
| name: C |
| body: BlockClassBody |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseClassDeclaration_extendsAndWithAndImplements() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| class A extends B with C implements D {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassDeclaration |
| classKeyword: class |
| namePart: NameWithTypeParameters |
| typeName: A |
| extendsClause: ExtendsClause |
| extendsKeyword: extends |
| superclass: NamedType |
| name: B |
| withClause: WithClause |
| withKeyword: with |
| mixinTypes |
| NamedType |
| name: C |
| implementsClause: ImplementsClause |
| implementsKeyword: implements |
| interfaces |
| NamedType |
| name: D |
| body: BlockClassBody |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseClassDeclaration_implements() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| class A implements C {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassDeclaration |
| classKeyword: class |
| namePart: NameWithTypeParameters |
| typeName: A |
| implementsClause: ImplementsClause |
| implementsKeyword: implements |
| interfaces |
| NamedType |
| name: C |
| body: BlockClassBody |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseClassDeclaration_metadata() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| @A |
| @B(2) |
| @C.foo(3) |
| @d.E.bar(4, 5) |
| class X {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassDeclaration |
| metadata |
| Annotation |
| atSign: @ |
| name: SimpleIdentifier |
| token: A |
| Annotation |
| atSign: @ |
| name: SimpleIdentifier |
| token: B |
| arguments: ArgumentList |
| leftParenthesis: ( |
| arguments |
| IntegerLiteral |
| literal: 2 |
| rightParenthesis: ) |
| Annotation |
| atSign: @ |
| name: PrefixedIdentifier |
| prefix: SimpleIdentifier |
| token: C |
| period: . |
| identifier: SimpleIdentifier |
| token: foo |
| arguments: ArgumentList |
| leftParenthesis: ( |
| arguments |
| IntegerLiteral |
| literal: 3 |
| rightParenthesis: ) |
| Annotation |
| atSign: @ |
| name: PrefixedIdentifier |
| prefix: SimpleIdentifier |
| token: d |
| period: . |
| identifier: SimpleIdentifier |
| token: E |
| period: . |
| constructorName: SimpleIdentifier |
| token: bar |
| arguments: ArgumentList |
| leftParenthesis: ( |
| arguments |
| IntegerLiteral |
| literal: 4 |
| IntegerLiteral |
| literal: 5 |
| rightParenthesis: ) |
| classKeyword: class |
| namePart: NameWithTypeParameters |
| typeName: X |
| body: BlockClassBody |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseClassDeclaration_native() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| class A native "nativeValue" {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassDeclaration |
| classKeyword: class |
| namePart: NameWithTypeParameters |
| typeName: A |
| nativeClause: NativeClause |
| nativeKeyword: native |
| name: SimpleStringLiteral |
| literal: "nativeValue" |
| body: BlockClassBody |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseClassDeclaration_native_allowedWithFields() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| class A native 'something' { |
| final int x; |
| A() {} |
| } |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassDeclaration |
| classKeyword: class |
| namePart: NameWithTypeParameters |
| typeName: A |
| nativeClause: NativeClause |
| nativeKeyword: native |
| name: SimpleStringLiteral |
| literal: 'something' |
| body: BlockClassBody |
| leftBracket: { |
| members |
| FieldDeclaration |
| fields: VariableDeclarationList |
| keyword: final |
| type: NamedType |
| name: int |
| variables |
| VariableDeclaration |
| name: x |
| semicolon: ; |
| ConstructorDeclaration |
| typeName: SimpleIdentifier |
| token: A |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| body: BlockFunctionBody |
| block: Block |
| leftBracket: { |
| rightBracket: } |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseClassDeclaration_native_missing_literal() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| class A native {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassDeclaration |
| classKeyword: class |
| namePart: NameWithTypeParameters |
| typeName: A |
| nativeClause: NativeClause |
| nativeKeyword: native |
| body: BlockClassBody |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseClassDeclaration_nonEmpty() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| class A { |
| var f; |
| } |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassDeclaration |
| classKeyword: class |
| namePart: NameWithTypeParameters |
| typeName: A |
| body: BlockClassBody |
| leftBracket: { |
| members |
| FieldDeclaration |
| fields: VariableDeclarationList |
| keyword: var |
| variables |
| VariableDeclaration |
| name: f |
| semicolon: ; |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseClassDeclaration_typeAlias_implementsC() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| class A = Object with B implements C; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassTypeAlias |
| typedefKeyword: class |
| name: A |
| equals: = |
| superclass: NamedType |
| name: Object |
| withClause: WithClause |
| withKeyword: with |
| mixinTypes |
| NamedType |
| name: B |
| implementsClause: ImplementsClause |
| implementsKeyword: implements |
| interfaces |
| NamedType |
| name: C |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseClassDeclaration_typeAlias_withB() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| class A = Object with B; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassTypeAlias |
| typedefKeyword: class |
| name: A |
| equals: = |
| superclass: NamedType |
| name: Object |
| withClause: WithClause |
| withKeyword: with |
| mixinTypes |
| NamedType |
| name: B |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseClassDeclaration_typeParameters() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| class A<B> {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassDeclaration |
| classKeyword: class |
| namePart: NameWithTypeParameters |
| typeName: A |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: B |
| rightBracket: > |
| body: BlockClassBody |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseClassDeclaration_typeParameters_extends_void() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| class C<T extends void>{} |
| // ^^^^ |
| // [diag.expectedTypeName] Expected a type name. |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassDeclaration |
| classKeyword: class |
| namePart: NameWithTypeParameters |
| typeName: C |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: T |
| extendsKeyword: extends |
| bound: NamedType |
| name: void |
| rightBracket: > |
| body: BlockClassBody |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseClassDeclaration_withDocumentationComment() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| /// Doc |
| class C {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassDeclaration |
| documentationComment: Comment |
| tokens |
| /// Doc |
| classKeyword: class |
| namePart: NameWithTypeParameters |
| typeName: C |
| body: BlockClassBody |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseClassTypeAlias_withDocumentationComment() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| /// Doc |
| class C = D with E; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassTypeAlias |
| documentationComment: Comment |
| tokens |
| /// Doc |
| typedefKeyword: class |
| name: C |
| equals: = |
| superclass: NamedType |
| name: D |
| withClause: WithClause |
| withKeyword: with |
| mixinTypes |
| NamedType |
| name: E |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnit_abstractAsPrefix_parameterized() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| abstract<dynamic> _abstract = new abstract.A(); |
| // [diag.builtInIdentifierAsType][column 1][length 8] The built-in identifier 'abstract' can't be used as a type. |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| TopLevelVariableDeclaration |
| variables: VariableDeclarationList |
| type: NamedType |
| name: abstract |
| typeArguments: TypeArgumentList |
| leftBracket: < |
| arguments |
| NamedType |
| name: dynamic |
| rightBracket: > |
| variables |
| VariableDeclaration |
| name: _abstract |
| equals: = |
| initializer: InstanceCreationExpression |
| keyword: new |
| constructorName: ConstructorName |
| type: NamedType |
| importPrefix: ImportPrefixReference |
| name: abstract |
| period: . |
| name: A |
| argumentList: ArgumentList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnit_builtIn_asFunctionName() { |
| for (Keyword keyword in Keyword.values) { |
| if (keyword.isBuiltIn || keyword.isPseudo) { |
| String lexeme = keyword.lexeme; |
| if (lexeme == 'Function') continue; |
| parseTestCodeWithDiagnostics('$lexeme(x) => 0;'); |
| parseTestCodeWithDiagnostics('class C {$lexeme(x) => 0;}'); |
| } |
| } |
| } |
| |
| void test_parseCompilationUnit_builtIn_asFunctionName_withTypeParameter() { |
| for (Keyword keyword in Keyword.values) { |
| if (keyword.isBuiltIn || keyword.isPseudo) { |
| String lexeme = keyword.lexeme; |
| if (lexeme == 'Function') continue; |
| // The fasta type resolution phase will report an error |
| // on type arguments on `dynamic` (e.g. `dynamic<int>`). |
| parseTestCodeWithDiagnostics('$lexeme<T>(x) => 0;'); |
| parseTestCodeWithDiagnostics('class C {$lexeme<T>(x) => 0;}'); |
| } |
| } |
| } |
| |
| void test_parseCompilationUnit_builtIn_asGetter() { |
| for (Keyword keyword in Keyword.values) { |
| if (keyword.isBuiltIn || keyword.isPseudo) { |
| String lexeme = keyword.lexeme; |
| parseTestCodeWithDiagnostics('get $lexeme => 0;'); |
| parseTestCodeWithDiagnostics('class C {get $lexeme => 0;}'); |
| } |
| } |
| } |
| |
| void test_parseCompilationUnit_directives_multiple() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| library l; |
| |
| part 'a.dart'; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| LibraryDirective |
| libraryKeyword: library |
| name: DottedName |
| tokens |
| l |
| semicolon: ; |
| PartDirective |
| partKeyword: part |
| uri: SimpleStringLiteral |
| literal: 'a.dart' |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnit_directives_single() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| library l; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| LibraryDirective |
| libraryKeyword: library |
| name: DottedName |
| tokens |
| l |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnit_empty() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| '''); |
| } |
| |
| void test_parseCompilationUnit_exportAsPrefix() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| export.A _export = new export.A(); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| TopLevelVariableDeclaration |
| variables: VariableDeclarationList |
| type: NamedType |
| importPrefix: ImportPrefixReference |
| name: export |
| period: . |
| name: A |
| variables |
| VariableDeclaration |
| name: _export |
| equals: = |
| initializer: InstanceCreationExpression |
| keyword: new |
| constructorName: ConstructorName |
| type: NamedType |
| importPrefix: ImportPrefixReference |
| name: export |
| period: . |
| name: A |
| argumentList: ArgumentList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnit_exportAsPrefix_parameterized() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| export<dynamic> _export = new export.A(); |
| // [diag.builtInIdentifierAsType][column 1][length 6] The built-in identifier 'export' can't be used as a type. |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| TopLevelVariableDeclaration |
| variables: VariableDeclarationList |
| type: NamedType |
| name: export |
| typeArguments: TypeArgumentList |
| leftBracket: < |
| arguments |
| NamedType |
| name: dynamic |
| rightBracket: > |
| variables |
| VariableDeclaration |
| name: _export |
| equals: = |
| initializer: InstanceCreationExpression |
| keyword: new |
| constructorName: ConstructorName |
| type: NamedType |
| importPrefix: ImportPrefixReference |
| name: export |
| period: . |
| name: A |
| argumentList: ArgumentList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnit_operatorAsPrefix_parameterized() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| operator<dynamic> _operator = new operator.A(); |
| // [diag.builtInIdentifierAsType][column 1][length 8] The built-in identifier 'operator' can't be used as a type. |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| TopLevelVariableDeclaration |
| variables: VariableDeclarationList |
| type: NamedType |
| name: operator |
| typeArguments: TypeArgumentList |
| leftBracket: < |
| arguments |
| NamedType |
| name: dynamic |
| rightBracket: > |
| variables |
| VariableDeclaration |
| name: _operator |
| equals: = |
| initializer: InstanceCreationExpression |
| keyword: new |
| constructorName: ConstructorName |
| type: NamedType |
| importPrefix: ImportPrefixReference |
| name: operator |
| period: . |
| name: A |
| argumentList: ArgumentList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnit_pseudo_asNamedType() { |
| for (Keyword keyword in Keyword.values) { |
| if (keyword.isPseudo) { |
| String lexeme = keyword.lexeme; |
| parseTestCodeWithDiagnostics('$lexeme f;'); |
| parseTestCodeWithDiagnostics('class C {$lexeme f;}'); |
| parseTestCodeWithDiagnostics('f($lexeme g) {}'); |
| parseTestCodeWithDiagnostics('f() {$lexeme g;}'); |
| } |
| } |
| } |
| |
| void test_parseCompilationUnit_pseudo_prefixed() { |
| for (Keyword keyword in Keyword.values) { |
| if (keyword.isPseudo) { |
| String lexeme = keyword.lexeme; |
| parseTestCodeWithDiagnostics('M.$lexeme f;'); |
| parseTestCodeWithDiagnostics('class C {M.$lexeme f;}'); |
| } |
| } |
| } |
| |
| void test_parseCompilationUnit_script() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| #! /bin/dart |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| scriptTag: ScriptTag |
| scriptTag: #! /bin/dart |
| '''); |
| } |
| |
| void test_parseCompilationUnit_skipFunctionBody_withInterpolation() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| f() { |
| "${n}"; |
| } |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionDeclaration |
| name: f |
| functionExpression: FunctionExpression |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| body: BlockFunctionBody |
| block: Block |
| leftBracket: { |
| statements |
| ExpressionStatement |
| expression: StringInterpolation |
| elements |
| InterpolationString |
| contents: " |
| InterpolationExpression |
| leftBracket: ${ |
| expression: SimpleIdentifier |
| token: n |
| rightBracket: } |
| InterpolationString |
| contents: " |
| stringValue: null |
| semicolon: ; |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseCompilationUnit_topLevelDeclaration() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| class A {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassDeclaration |
| classKeyword: class |
| namePart: NameWithTypeParameters |
| typeName: A |
| body: BlockClassBody |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseCompilationUnit_typedefAsPrefix() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef.A _typedef = new typedef.A(); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| TopLevelVariableDeclaration |
| variables: VariableDeclarationList |
| type: NamedType |
| importPrefix: ImportPrefixReference |
| name: typedef |
| period: . |
| name: A |
| variables |
| VariableDeclaration |
| name: _typedef |
| equals: = |
| initializer: InstanceCreationExpression |
| keyword: new |
| constructorName: ConstructorName |
| type: NamedType |
| importPrefix: ImportPrefixReference |
| name: typedef |
| period: . |
| name: A |
| argumentList: ArgumentList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_abstractAsPrefix() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| abstract.A _abstract = new abstract.A(); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| TopLevelVariableDeclaration |
| variables: VariableDeclarationList |
| type: NamedType |
| importPrefix: ImportPrefixReference |
| name: abstract |
| period: . |
| name: A |
| variables |
| VariableDeclaration |
| name: _abstract |
| equals: = |
| initializer: InstanceCreationExpression |
| keyword: new |
| constructorName: ConstructorName |
| type: NamedType |
| importPrefix: ImportPrefixReference |
| name: abstract |
| period: . |
| name: A |
| argumentList: ArgumentList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_class() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| class A {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassDeclaration |
| classKeyword: class |
| namePart: NameWithTypeParameters |
| typeName: A |
| body: BlockClassBody |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_classTypeAlias() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| abstract class A = B with C; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassTypeAlias |
| abstractKeyword: abstract |
| typedefKeyword: class |
| name: A |
| equals: = |
| superclass: NamedType |
| name: B |
| withClause: WithClause |
| withKeyword: with |
| mixinTypes |
| NamedType |
| name: C |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_constVariable() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| const int x = 0; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| TopLevelVariableDeclaration |
| variables: VariableDeclarationList |
| keyword: const |
| type: NamedType |
| name: int |
| variables |
| VariableDeclaration |
| name: x |
| equals: = |
| initializer: IntegerLiteral |
| literal: 0 |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_expressionFunctionBody_tokens() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| f() => 0; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionDeclaration |
| name: f |
| functionExpression: FunctionExpression |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| body: ExpressionFunctionBody |
| functionDefinition: => |
| expression: IntegerLiteral |
| literal: 0 |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_finalVariable() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| final x = 0; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| TopLevelVariableDeclaration |
| variables: VariableDeclarationList |
| keyword: final |
| variables |
| VariableDeclaration |
| name: x |
| equals: = |
| initializer: IntegerLiteral |
| literal: 0 |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_function_external_noType() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| external f(); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionDeclaration |
| externalKeyword: external |
| name: f |
| functionExpression: FunctionExpression |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| body: EmptyFunctionBody |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_function_external_type() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| external int f(); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionDeclaration |
| externalKeyword: external |
| returnType: NamedType |
| name: int |
| name: f |
| functionExpression: FunctionExpression |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| body: EmptyFunctionBody |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_function_generic_noReturnType() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| f<E>() {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionDeclaration |
| name: f |
| functionExpression: FunctionExpression |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: E |
| rightBracket: > |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| body: BlockFunctionBody |
| block: Block |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void |
| test_parseCompilationUnitMember_function_generic_noReturnType_annotated() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| f<@a E>() {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionDeclaration |
| name: f |
| functionExpression: FunctionExpression |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| metadata |
| Annotation |
| atSign: @ |
| name: SimpleIdentifier |
| token: a |
| name: E |
| rightBracket: > |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| body: BlockFunctionBody |
| block: Block |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_function_generic_returnType() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| E f<E>() {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionDeclaration |
| returnType: NamedType |
| name: E |
| name: f |
| functionExpression: FunctionExpression |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: E |
| rightBracket: > |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| body: BlockFunctionBody |
| block: Block |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_function_generic_void() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| void f<T>(T t) {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionDeclaration |
| returnType: NamedType |
| name: void |
| name: f |
| functionExpression: FunctionExpression |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: T |
| rightBracket: > |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: T |
| name: t |
| rightParenthesis: ) |
| body: BlockFunctionBody |
| block: Block |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_function_gftReturnType() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| void Function<A>(core.List<core.int> x) f() => null; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionDeclaration |
| returnType: GenericFunctionType |
| returnType: NamedType |
| name: void |
| functionKeyword: Function |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: A |
| rightBracket: > |
| parameters: 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: f |
| functionExpression: FunctionExpression |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| body: ExpressionFunctionBody |
| functionDefinition: => |
| expression: NullLiteral |
| literal: null |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_function_noReturnType() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| Function<A>(core.List<core.int> x) f() => null; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionDeclaration |
| returnType: GenericFunctionType |
| functionKeyword: Function |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: A |
| rightBracket: > |
| parameters: 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: f |
| functionExpression: FunctionExpression |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| body: ExpressionFunctionBody |
| functionDefinition: => |
| expression: NullLiteral |
| literal: null |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_function_noType() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| f() {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionDeclaration |
| name: f |
| functionExpression: FunctionExpression |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| body: BlockFunctionBody |
| block: Block |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_function_type() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| int f() {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionDeclaration |
| returnType: NamedType |
| name: int |
| name: f |
| functionExpression: FunctionExpression |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| body: BlockFunctionBody |
| block: Block |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_function_void() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| void f() {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionDeclaration |
| returnType: NamedType |
| name: void |
| name: f |
| functionExpression: FunctionExpression |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| body: BlockFunctionBody |
| block: Block |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_getter_external_noType() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| external get p; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionDeclaration |
| externalKeyword: external |
| propertyKeyword: get |
| name: p |
| functionExpression: FunctionExpression |
| body: EmptyFunctionBody |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_getter_external_type() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| external int get p; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionDeclaration |
| externalKeyword: external |
| returnType: NamedType |
| name: int |
| propertyKeyword: get |
| name: p |
| functionExpression: FunctionExpression |
| body: EmptyFunctionBody |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_getter_noType() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| get p => 0; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionDeclaration |
| propertyKeyword: get |
| name: p |
| functionExpression: FunctionExpression |
| body: ExpressionFunctionBody |
| functionDefinition: => |
| expression: IntegerLiteral |
| literal: 0 |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_getter_type() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| int get p => 0; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionDeclaration |
| returnType: NamedType |
| name: int |
| propertyKeyword: get |
| name: p |
| functionExpression: FunctionExpression |
| body: ExpressionFunctionBody |
| functionDefinition: => |
| expression: IntegerLiteral |
| literal: 0 |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_setter_external_noType() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| external set p(v); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionDeclaration |
| externalKeyword: external |
| propertyKeyword: set |
| name: p |
| functionExpression: FunctionExpression |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| parameter: RegularFormalParameter |
| name: v |
| rightParenthesis: ) |
| body: EmptyFunctionBody |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_setter_external_type() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| external void set p(int v); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionDeclaration |
| externalKeyword: external |
| returnType: NamedType |
| name: void |
| propertyKeyword: set |
| name: p |
| functionExpression: FunctionExpression |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: int |
| name: v |
| rightParenthesis: ) |
| body: EmptyFunctionBody |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_setter_noType() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| set p(v) {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionDeclaration |
| propertyKeyword: set |
| name: p |
| functionExpression: FunctionExpression |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| parameter: RegularFormalParameter |
| name: v |
| rightParenthesis: ) |
| body: BlockFunctionBody |
| block: Block |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_setter_type() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| void set p(int v) {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionDeclaration |
| returnType: NamedType |
| name: void |
| propertyKeyword: set |
| name: p |
| functionExpression: FunctionExpression |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: int |
| name: v |
| rightParenthesis: ) |
| body: BlockFunctionBody |
| block: Block |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_typeAlias_abstract() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| abstract class C = S with M; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassTypeAlias |
| abstractKeyword: abstract |
| typedefKeyword: class |
| name: C |
| equals: = |
| superclass: NamedType |
| name: S |
| withClause: WithClause |
| withKeyword: with |
| mixinTypes |
| NamedType |
| name: M |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_typeAlias_generic() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| class C<E> = S<E> with M<E> implements I<E>; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassTypeAlias |
| typedefKeyword: class |
| name: C |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: E |
| rightBracket: > |
| equals: = |
| superclass: NamedType |
| name: S |
| typeArguments: TypeArgumentList |
| leftBracket: < |
| arguments |
| NamedType |
| name: E |
| rightBracket: > |
| withClause: WithClause |
| withKeyword: with |
| mixinTypes |
| NamedType |
| name: M |
| typeArguments: TypeArgumentList |
| leftBracket: < |
| arguments |
| NamedType |
| name: E |
| rightBracket: > |
| implementsClause: ImplementsClause |
| implementsKeyword: implements |
| interfaces |
| NamedType |
| name: I |
| typeArguments: TypeArgumentList |
| leftBracket: < |
| arguments |
| NamedType |
| name: E |
| rightBracket: > |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_typeAlias_implements() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| class C = S with M implements I; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassTypeAlias |
| typedefKeyword: class |
| name: C |
| equals: = |
| superclass: NamedType |
| name: S |
| withClause: WithClause |
| withKeyword: with |
| mixinTypes |
| NamedType |
| name: M |
| implementsClause: ImplementsClause |
| implementsKeyword: implements |
| interfaces |
| NamedType |
| name: I |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_typeAlias_noImplements() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| class C = S with M; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassTypeAlias |
| typedefKeyword: class |
| name: C |
| equals: = |
| superclass: NamedType |
| name: S |
| withClause: WithClause |
| withKeyword: with |
| mixinTypes |
| NamedType |
| name: M |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_typedef() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef F(); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionTypeAlias |
| typedefKeyword: typedef |
| name: F |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_typedef_withDocComment() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| /// Doc |
| typedef F(); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionTypeAlias |
| documentationComment: Comment |
| tokens |
| /// Doc |
| typedefKeyword: typedef |
| name: F |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_typedVariable() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| int x = 0; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| TopLevelVariableDeclaration |
| variables: VariableDeclarationList |
| type: NamedType |
| name: int |
| variables |
| VariableDeclaration |
| name: x |
| equals: = |
| initializer: IntegerLiteral |
| literal: 0 |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_variable() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| var x = 0; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| TopLevelVariableDeclaration |
| variables: VariableDeclarationList |
| keyword: var |
| variables |
| VariableDeclaration |
| name: x |
| equals: = |
| initializer: IntegerLiteral |
| literal: 0 |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_variable_gftType_gftReturnType() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| Function(int) Function(String) v; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| TopLevelVariableDeclaration |
| variables: VariableDeclarationList |
| type: GenericFunctionType |
| returnType: GenericFunctionType |
| functionKeyword: Function |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: int |
| rightParenthesis: ) |
| functionKeyword: Function |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: String |
| rightParenthesis: ) |
| variables |
| VariableDeclaration |
| name: v |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_variable_gftType_noReturnType() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| Function(int, String) v; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| TopLevelVariableDeclaration |
| variables: VariableDeclarationList |
| type: GenericFunctionType |
| functionKeyword: Function |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: int |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: String |
| rightParenthesis: ) |
| variables |
| VariableDeclaration |
| name: v |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_variable_withDocumentationComment() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| /// Doc |
| var x = 0; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| TopLevelVariableDeclaration |
| documentationComment: Comment |
| tokens |
| /// Doc |
| variables: VariableDeclarationList |
| keyword: var |
| variables |
| VariableDeclaration |
| name: x |
| equals: = |
| initializer: IntegerLiteral |
| literal: 0 |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_variableGet() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| String get = null; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| TopLevelVariableDeclaration |
| variables: VariableDeclarationList |
| type: NamedType |
| name: String |
| variables |
| VariableDeclaration |
| name: get |
| equals: = |
| initializer: NullLiteral |
| literal: null |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseCompilationUnitMember_variableSet() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| String set = null; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| TopLevelVariableDeclaration |
| variables: VariableDeclarationList |
| type: NamedType |
| name: String |
| variables |
| VariableDeclaration |
| name: set |
| equals: = |
| initializer: NullLiteral |
| literal: null |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseDirective_export() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| export 'lib/lib.dart'; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| ExportDirective |
| exportKeyword: export |
| uri: SimpleStringLiteral |
| literal: 'lib/lib.dart' |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseDirective_export_withDocComment() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| /// Doc |
| export 'foo.dart'; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| ExportDirective |
| documentationComment: Comment |
| tokens |
| /// Doc |
| exportKeyword: export |
| uri: SimpleStringLiteral |
| literal: 'foo.dart' |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseDirective_import() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| import 'lib/lib.dart'; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| ImportDirective |
| importKeyword: import |
| uri: SimpleStringLiteral |
| literal: 'lib/lib.dart' |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseDirective_library() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| library l; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| LibraryDirective |
| libraryKeyword: library |
| name: DottedName |
| tokens |
| l |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseDirective_library_1_component() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| library a; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| LibraryDirective |
| libraryKeyword: library |
| name: DottedName |
| tokens |
| a |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseDirective_library_2_components() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| library a.b; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| LibraryDirective |
| libraryKeyword: library |
| name: DottedName |
| tokens |
| a |
| . |
| b |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseDirective_library_3_components() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| library a.b.c; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| LibraryDirective |
| libraryKeyword: library |
| name: DottedName |
| tokens |
| a |
| . |
| b |
| . |
| c |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseDirective_library_annotation() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| @A |
| library l; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| LibraryDirective |
| metadata |
| Annotation |
| atSign: @ |
| name: SimpleIdentifier |
| token: A |
| libraryKeyword: library |
| name: DottedName |
| tokens |
| l |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseDirective_library_annotation2() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| @A |
| library l; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| LibraryDirective |
| metadata |
| Annotation |
| atSign: @ |
| name: SimpleIdentifier |
| token: A |
| libraryKeyword: library |
| name: DottedName |
| tokens |
| l |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseDirective_library_unnamed() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| library; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| LibraryDirective |
| libraryKeyword: library |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseDirective_library_withDocumentationComment() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| /// Doc |
| library l; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| LibraryDirective |
| documentationComment: Comment |
| tokens |
| /// Doc |
| libraryKeyword: library |
| name: DottedName |
| tokens |
| l |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseDirective_part() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| part 'lib/lib.dart'; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| PartDirective |
| partKeyword: part |
| uri: SimpleStringLiteral |
| literal: 'lib/lib.dart' |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseDirective_part_of_1_component() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| part of a; |
| // ^ |
| // [diag.partOfName] The 'part of' directive can't use a name with the enhanced-parts feature. |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| PartOfDirective |
| partKeyword: part |
| ofKeyword: of |
| libraryName: DottedName |
| tokens |
| a |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseDirective_part_of_2_components() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| part of a.b; |
| // ^^^ |
| // [diag.partOfName] The 'part of' directive can't use a name with the enhanced-parts feature. |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| PartOfDirective |
| partKeyword: part |
| ofKeyword: of |
| libraryName: DottedName |
| tokens |
| a |
| . |
| b |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseDirective_part_of_3_components() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| part of a.b.c; |
| // ^^^^^ |
| // [diag.partOfName] The 'part of' directive can't use a name with the enhanced-parts feature. |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| PartOfDirective |
| partKeyword: part |
| ofKeyword: of |
| libraryName: DottedName |
| tokens |
| a |
| . |
| b |
| . |
| c |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseDirective_part_of_withDocumentationComment() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| /// Doc |
| part of a; |
| // ^ |
| // [diag.partOfName] The 'part of' directive can't use a name with the enhanced-parts feature. |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| PartOfDirective |
| documentationComment: Comment |
| tokens |
| /// Doc |
| partKeyword: part |
| ofKeyword: of |
| libraryName: DottedName |
| tokens |
| a |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseDirective_part_withDocumentationComment() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| /// Doc |
| part 'lib.dart'; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| PartDirective |
| documentationComment: Comment |
| tokens |
| /// Doc |
| partKeyword: part |
| uri: SimpleStringLiteral |
| literal: 'lib.dart' |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseDirective_partOf() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| part of l; |
| // ^ |
| // [diag.partOfName] The 'part of' directive can't use a name with the enhanced-parts feature. |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| PartOfDirective |
| partKeyword: part |
| ofKeyword: of |
| libraryName: DottedName |
| tokens |
| l |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseDirectives_annotations() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| @A |
| library l; |
| |
| @B |
| import 'foo.dart'; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| LibraryDirective |
| metadata |
| Annotation |
| atSign: @ |
| name: SimpleIdentifier |
| token: A |
| libraryKeyword: library |
| name: DottedName |
| tokens |
| l |
| semicolon: ; |
| ImportDirective |
| metadata |
| Annotation |
| atSign: @ |
| name: SimpleIdentifier |
| token: B |
| importKeyword: import |
| uri: SimpleStringLiteral |
| literal: 'foo.dart' |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseDirectives_complete() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| #! /bin/dart |
| |
| library l; |
| |
| class A {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| scriptTag: ScriptTag |
| scriptTag: #! /bin/dart |
| directives |
| LibraryDirective |
| libraryKeyword: library |
| name: DottedName |
| tokens |
| l |
| semicolon: ; |
| declarations |
| ClassDeclaration |
| classKeyword: class |
| namePart: NameWithTypeParameters |
| typeName: A |
| body: BlockClassBody |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseDirectives_empty() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| '''); |
| } |
| |
| void test_parseDirectives_mixed() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| library l; class A {} part 'foo.dart'; |
| // ^^^^ |
| // [diag.directiveAfterDeclaration] Directives must appear before any declarations. |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| LibraryDirective |
| libraryKeyword: library |
| name: DottedName |
| tokens |
| l |
| semicolon: ; |
| PartDirective |
| partKeyword: part |
| uri: SimpleStringLiteral |
| literal: 'foo.dart' |
| semicolon: ; |
| declarations |
| ClassDeclaration |
| classKeyword: class |
| namePart: NameWithTypeParameters |
| typeName: A |
| body: BlockClassBody |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseDirectives_multiple() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| library l; |
| |
| part 'a.dart'; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| LibraryDirective |
| libraryKeyword: library |
| name: DottedName |
| tokens |
| l |
| semicolon: ; |
| PartDirective |
| partKeyword: part |
| uri: SimpleStringLiteral |
| literal: 'a.dart' |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseDirectives_script() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| #! /bin/dart |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| scriptTag: ScriptTag |
| scriptTag: #! /bin/dart |
| '''); |
| } |
| |
| void test_parseDirectives_single() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| library l; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| LibraryDirective |
| libraryKeyword: library |
| name: DottedName |
| tokens |
| l |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseDirectives_topLevelDeclaration() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| class A {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassDeclaration |
| classKeyword: class |
| namePart: NameWithTypeParameters |
| typeName: A |
| body: BlockClassBody |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseEnumDeclaration_one() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| enum E { ONE } |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| EnumDeclaration |
| enumKeyword: enum |
| namePart: NameWithTypeParameters |
| typeName: E |
| body: BlockEnumBody |
| leftBracket: { |
| constants |
| EnumConstantDeclaration |
| name: ONE |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseEnumDeclaration_trailingComma() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| enum E { ONE } |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| EnumDeclaration |
| enumKeyword: enum |
| namePart: NameWithTypeParameters |
| typeName: E |
| body: BlockEnumBody |
| leftBracket: { |
| constants |
| EnumConstantDeclaration |
| name: ONE |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseEnumDeclaration_two() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| enum E { ONE, TWO } |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| EnumDeclaration |
| enumKeyword: enum |
| namePart: NameWithTypeParameters |
| typeName: E |
| body: BlockEnumBody |
| leftBracket: { |
| constants |
| EnumConstantDeclaration |
| name: ONE |
| EnumConstantDeclaration |
| name: TWO |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseEnumDeclaration_withDocComment_onEnum() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| /// Doc |
| enum E { ONE } |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| EnumDeclaration |
| documentationComment: Comment |
| tokens |
| /// Doc |
| enumKeyword: enum |
| namePart: NameWithTypeParameters |
| typeName: E |
| body: BlockEnumBody |
| leftBracket: { |
| constants |
| EnumConstantDeclaration |
| name: ONE |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseEnumDeclaration_withDocComment_onValue() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| enum E { |
| /// Doc |
| ONE, |
| } |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| EnumDeclaration |
| enumKeyword: enum |
| namePart: NameWithTypeParameters |
| typeName: E |
| body: BlockEnumBody |
| leftBracket: { |
| constants |
| EnumConstantDeclaration |
| documentationComment: Comment |
| tokens |
| /// Doc |
| name: ONE |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseEnumDeclaration_withDocComment_onValue_annotated() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| enum E { |
| /// Doc |
| @annotation |
| ONE, |
| } |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| EnumDeclaration |
| enumKeyword: enum |
| namePart: NameWithTypeParameters |
| typeName: E |
| body: BlockEnumBody |
| leftBracket: { |
| constants |
| EnumConstantDeclaration |
| documentationComment: Comment |
| tokens |
| /// Doc |
| metadata |
| Annotation |
| atSign: @ |
| name: SimpleIdentifier |
| token: annotation |
| name: ONE |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseExportDirective_configuration_multiple() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| export 'lib/lib.dart' if (a) 'b.dart' if (c) 'd.dart'; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| ExportDirective |
| exportKeyword: export |
| uri: SimpleStringLiteral |
| literal: 'lib/lib.dart' |
| configurations |
| Configuration |
| ifKeyword: if |
| leftParenthesis: ( |
| name: DottedName |
| tokens |
| a |
| rightParenthesis: ) |
| uri: SimpleStringLiteral |
| literal: 'b.dart' |
| resolvedUri: <null> |
| Configuration |
| ifKeyword: if |
| leftParenthesis: ( |
| name: DottedName |
| tokens |
| c |
| rightParenthesis: ) |
| uri: SimpleStringLiteral |
| literal: 'd.dart' |
| resolvedUri: <null> |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseExportDirective_configuration_single() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| export 'lib/lib.dart' if (a.b == 'c.dart') ''; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| ExportDirective |
| exportKeyword: export |
| uri: SimpleStringLiteral |
| literal: 'lib/lib.dart' |
| configurations |
| Configuration |
| ifKeyword: if |
| leftParenthesis: ( |
| name: DottedName |
| tokens |
| a |
| . |
| b |
| equalToken: == |
| value: SimpleStringLiteral |
| literal: 'c.dart' |
| rightParenthesis: ) |
| uri: SimpleStringLiteral |
| literal: '' |
| resolvedUri: <null> |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseExportDirective_hide() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| export 'lib/lib.dart' hide A, B; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| ExportDirective |
| exportKeyword: export |
| uri: SimpleStringLiteral |
| literal: 'lib/lib.dart' |
| combinators |
| HideCombinator |
| keyword: hide |
| hiddenNames |
| SimpleIdentifier |
| token: A |
| SimpleIdentifier |
| token: B |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseExportDirective_hide_show() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| export 'lib/lib.dart' hide A show B; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| ExportDirective |
| exportKeyword: export |
| uri: SimpleStringLiteral |
| literal: 'lib/lib.dart' |
| combinators |
| HideCombinator |
| keyword: hide |
| hiddenNames |
| SimpleIdentifier |
| token: A |
| ShowCombinator |
| keyword: show |
| shownNames |
| SimpleIdentifier |
| token: B |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseExportDirective_noCombinator() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| export 'lib/lib.dart'; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| ExportDirective |
| exportKeyword: export |
| uri: SimpleStringLiteral |
| literal: 'lib/lib.dart' |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseExportDirective_show() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| export 'lib/lib.dart' show A, B; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| ExportDirective |
| exportKeyword: export |
| uri: SimpleStringLiteral |
| literal: 'lib/lib.dart' |
| combinators |
| ShowCombinator |
| keyword: show |
| shownNames |
| SimpleIdentifier |
| token: A |
| SimpleIdentifier |
| token: B |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseExportDirective_show_hide() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| export 'lib/lib.dart' show B hide A; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| ExportDirective |
| exportKeyword: export |
| uri: SimpleStringLiteral |
| literal: 'lib/lib.dart' |
| combinators |
| ShowCombinator |
| keyword: show |
| shownNames |
| SimpleIdentifier |
| token: B |
| HideCombinator |
| keyword: hide |
| hiddenNames |
| SimpleIdentifier |
| token: A |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseFunctionDeclaration_function() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| /// Doc |
| T f() {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionDeclaration |
| documentationComment: Comment |
| tokens |
| /// Doc |
| returnType: NamedType |
| name: T |
| name: f |
| functionExpression: FunctionExpression |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| body: BlockFunctionBody |
| block: Block |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseFunctionDeclaration_functionWithTypeParameters() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| /// Doc |
| T f<E>() {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionDeclaration |
| documentationComment: Comment |
| tokens |
| /// Doc |
| returnType: NamedType |
| name: T |
| name: f |
| functionExpression: FunctionExpression |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: E |
| rightBracket: > |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| body: BlockFunctionBody |
| block: Block |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseFunctionDeclaration_getter() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| /// Doc |
| T get p => 0; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionDeclaration |
| documentationComment: Comment |
| tokens |
| /// Doc |
| returnType: NamedType |
| name: T |
| propertyKeyword: get |
| name: p |
| functionExpression: FunctionExpression |
| body: ExpressionFunctionBody |
| functionDefinition: => |
| expression: IntegerLiteral |
| literal: 0 |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseFunctionDeclaration_metadata() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| T f(@A a, @B(2) Foo b, {@C.foo(3) c: 0, @d.E.bar(4, 5) x: 0}) {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionDeclaration |
| returnType: NamedType |
| name: T |
| name: f |
| functionExpression: FunctionExpression |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| parameter: RegularFormalParameter |
| metadata |
| Annotation |
| atSign: @ |
| name: SimpleIdentifier |
| token: A |
| name: a |
| parameter: RegularFormalParameter |
| metadata |
| Annotation |
| atSign: @ |
| name: SimpleIdentifier |
| token: B |
| arguments: ArgumentList |
| leftParenthesis: ( |
| arguments |
| IntegerLiteral |
| literal: 2 |
| rightParenthesis: ) |
| type: NamedType |
| name: Foo |
| name: b |
| leftDelimiter: { |
| parameter: RegularFormalParameter |
| metadata |
| Annotation |
| atSign: @ |
| name: PrefixedIdentifier |
| prefix: SimpleIdentifier |
| token: C |
| period: . |
| identifier: SimpleIdentifier |
| token: foo |
| arguments: ArgumentList |
| leftParenthesis: ( |
| arguments |
| IntegerLiteral |
| literal: 3 |
| rightParenthesis: ) |
| name: c |
| defaultClause: FormalParameterDefaultClause |
| separator: : |
| value: IntegerLiteral |
| literal: 0 |
| parameter: RegularFormalParameter |
| metadata |
| Annotation |
| atSign: @ |
| name: PrefixedIdentifier |
| prefix: SimpleIdentifier |
| token: d |
| period: . |
| identifier: SimpleIdentifier |
| token: E |
| period: . |
| constructorName: SimpleIdentifier |
| token: bar |
| arguments: ArgumentList |
| leftParenthesis: ( |
| arguments |
| IntegerLiteral |
| literal: 4 |
| IntegerLiteral |
| literal: 5 |
| rightParenthesis: ) |
| name: x |
| defaultClause: FormalParameterDefaultClause |
| separator: : |
| value: IntegerLiteral |
| literal: 0 |
| rightDelimiter: } |
| rightParenthesis: ) |
| body: BlockFunctionBody |
| block: Block |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseFunctionDeclaration_setter() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| /// Doc |
| T set p(v) {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionDeclaration |
| documentationComment: Comment |
| tokens |
| /// Doc |
| returnType: NamedType |
| name: T |
| propertyKeyword: set |
| name: p |
| functionExpression: FunctionExpression |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| parameter: RegularFormalParameter |
| name: v |
| rightParenthesis: ) |
| body: BlockFunctionBody |
| block: Block |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseGenericTypeAlias_noTypeParameters() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef F = int Function(int); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| GenericTypeAlias |
| typedefKeyword: typedef |
| name: F |
| equals: = |
| type: GenericFunctionType |
| returnType: NamedType |
| name: int |
| functionKeyword: Function |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: int |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseGenericTypeAlias_typeParameters() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef F<T> = T Function(T); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| GenericTypeAlias |
| typedefKeyword: typedef |
| name: F |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: T |
| rightBracket: > |
| equals: = |
| type: GenericFunctionType |
| returnType: NamedType |
| name: T |
| functionKeyword: Function |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: T |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseGenericTypeAlias_typeParameters2() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef F<T> = T Function(T); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| GenericTypeAlias |
| typedefKeyword: typedef |
| name: F |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: T |
| rightBracket: > |
| equals: = |
| type: GenericFunctionType |
| returnType: NamedType |
| name: T |
| functionKeyword: Function |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: T |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseGenericTypeAlias_typeParameters3() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef F<A, B, C> = Function(A a, B b, C c); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| GenericTypeAlias |
| typedefKeyword: typedef |
| name: F |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: A |
| TypeParameter |
| name: B |
| TypeParameter |
| name: C |
| rightBracket: > |
| equals: = |
| type: GenericFunctionType |
| functionKeyword: Function |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: A |
| name: a |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: B |
| name: b |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: C |
| name: c |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseGenericTypeAlias_typeParameters3_gtEq() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef F<A, B, C> = Function(A a, B b, C c); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| GenericTypeAlias |
| typedefKeyword: typedef |
| name: F |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: A |
| TypeParameter |
| name: B |
| TypeParameter |
| name: C |
| rightBracket: > |
| equals: = |
| type: GenericFunctionType |
| functionKeyword: Function |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: A |
| name: a |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: B |
| name: b |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: C |
| name: c |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseGenericTypeAlias_typeParameters_extends() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef F<A, B, C extends D<E>> = Function(A a, B b, C c); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| GenericTypeAlias |
| typedefKeyword: typedef |
| name: F |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: A |
| TypeParameter |
| name: B |
| TypeParameter |
| name: C |
| extendsKeyword: extends |
| bound: NamedType |
| name: D |
| typeArguments: TypeArgumentList |
| leftBracket: < |
| arguments |
| NamedType |
| name: E |
| rightBracket: > |
| rightBracket: > |
| equals: = |
| type: GenericFunctionType |
| functionKeyword: Function |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: A |
| name: a |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: B |
| name: b |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: C |
| name: c |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseGenericTypeAlias_typeParameters_extends3() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef F<A, B, C extends D<E, G, H>> = Function(A a, B b, C c); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| GenericTypeAlias |
| typedefKeyword: typedef |
| name: F |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: A |
| TypeParameter |
| name: B |
| TypeParameter |
| name: C |
| extendsKeyword: extends |
| bound: NamedType |
| name: D |
| typeArguments: TypeArgumentList |
| leftBracket: < |
| arguments |
| NamedType |
| name: E |
| NamedType |
| name: G |
| NamedType |
| name: H |
| rightBracket: > |
| rightBracket: > |
| equals: = |
| type: GenericFunctionType |
| functionKeyword: Function |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: A |
| name: a |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: B |
| name: b |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: C |
| name: c |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseGenericTypeAlias_typeParameters_extends3_gtGtEq() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef F<A, B, C extends D<E, G, H>> = Function(A a, B b, C c); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| GenericTypeAlias |
| typedefKeyword: typedef |
| name: F |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: A |
| TypeParameter |
| name: B |
| TypeParameter |
| name: C |
| extendsKeyword: extends |
| bound: NamedType |
| name: D |
| typeArguments: TypeArgumentList |
| leftBracket: < |
| arguments |
| NamedType |
| name: E |
| NamedType |
| name: G |
| NamedType |
| name: H |
| rightBracket: > |
| rightBracket: > |
| equals: = |
| type: GenericFunctionType |
| functionKeyword: Function |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: A |
| name: a |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: B |
| name: b |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: C |
| name: c |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseGenericTypeAlias_typeParameters_extends_gtGtEq() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef F<A, B, C extends D<E>> = Function(A a, B b, C c); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| GenericTypeAlias |
| typedefKeyword: typedef |
| name: F |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: A |
| TypeParameter |
| name: B |
| TypeParameter |
| name: C |
| extendsKeyword: extends |
| bound: NamedType |
| name: D |
| typeArguments: TypeArgumentList |
| leftBracket: < |
| arguments |
| NamedType |
| name: E |
| rightBracket: > |
| rightBracket: > |
| equals: = |
| type: GenericFunctionType |
| functionKeyword: Function |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: A |
| name: a |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: B |
| name: b |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: C |
| name: c |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseGenericTypeAlias_TypeParametersInProgress1() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef F< = int Function(int); |
| // ^ |
| // [diag.missingIdentifier] Expected an identifier. |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| GenericTypeAlias |
| typedefKeyword: typedef |
| name: F |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: <empty> <synthetic> |
| rightBracket: > <synthetic> |
| equals: = |
| type: GenericFunctionType |
| returnType: NamedType |
| name: int |
| functionKeyword: Function |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: int |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseGenericTypeAlias_TypeParametersInProgress2() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef F<>= int Function(int); |
| // ^^ |
| // [diag.missingIdentifier] Expected an identifier. |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| GenericTypeAlias |
| typedefKeyword: typedef |
| name: F |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: <empty> <synthetic> |
| rightBracket: > |
| equals: = |
| type: GenericFunctionType |
| returnType: NamedType |
| name: int |
| functionKeyword: Function |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: int |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseGenericTypeAlias_TypeParametersInProgress3() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef F<> = int Function(int); |
| // ^ |
| // [diag.missingIdentifier] Expected an identifier. |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| GenericTypeAlias |
| typedefKeyword: typedef |
| name: F |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: <empty> <synthetic> |
| rightBracket: > |
| equals: = |
| type: GenericFunctionType |
| returnType: NamedType |
| name: int |
| functionKeyword: Function |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: int |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseImportDirective_configuration_multiple() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| import 'lib/lib.dart' if (a) 'b.dart' if (c) 'd.dart'; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| ImportDirective |
| importKeyword: import |
| uri: SimpleStringLiteral |
| literal: 'lib/lib.dart' |
| configurations |
| Configuration |
| ifKeyword: if |
| leftParenthesis: ( |
| name: DottedName |
| tokens |
| a |
| rightParenthesis: ) |
| uri: SimpleStringLiteral |
| literal: 'b.dart' |
| resolvedUri: <null> |
| Configuration |
| ifKeyword: if |
| leftParenthesis: ( |
| name: DottedName |
| tokens |
| c |
| rightParenthesis: ) |
| uri: SimpleStringLiteral |
| literal: 'd.dart' |
| resolvedUri: <null> |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseImportDirective_configuration_single() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| import 'lib/lib.dart' if (a.b == 'c.dart') ''; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| ImportDirective |
| importKeyword: import |
| uri: SimpleStringLiteral |
| literal: 'lib/lib.dart' |
| configurations |
| Configuration |
| ifKeyword: if |
| leftParenthesis: ( |
| name: DottedName |
| tokens |
| a |
| . |
| b |
| equalToken: == |
| value: SimpleStringLiteral |
| literal: 'c.dart' |
| rightParenthesis: ) |
| uri: SimpleStringLiteral |
| literal: '' |
| resolvedUri: <null> |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseImportDirective_deferred() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| import 'lib/lib.dart' deferred as a; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| ImportDirective |
| importKeyword: import |
| uri: SimpleStringLiteral |
| literal: 'lib/lib.dart' |
| deferredKeyword: deferred |
| asKeyword: as |
| prefix: SimpleIdentifier |
| token: a |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseImportDirective_hide() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| import 'lib/lib.dart' hide A, B; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| ImportDirective |
| importKeyword: import |
| uri: SimpleStringLiteral |
| literal: 'lib/lib.dart' |
| combinators |
| HideCombinator |
| keyword: hide |
| hiddenNames |
| SimpleIdentifier |
| token: A |
| SimpleIdentifier |
| token: B |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseImportDirective_noCombinator() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| import 'lib/lib.dart'; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| ImportDirective |
| importKeyword: import |
| uri: SimpleStringLiteral |
| literal: 'lib/lib.dart' |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseImportDirective_prefix() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| import 'lib/lib.dart' as a; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| ImportDirective |
| importKeyword: import |
| uri: SimpleStringLiteral |
| literal: 'lib/lib.dart' |
| asKeyword: as |
| prefix: SimpleIdentifier |
| token: a |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseImportDirective_prefix_hide_show() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| import 'lib/lib.dart' as a hide A show B; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| ImportDirective |
| importKeyword: import |
| uri: SimpleStringLiteral |
| literal: 'lib/lib.dart' |
| asKeyword: as |
| prefix: SimpleIdentifier |
| token: a |
| combinators |
| HideCombinator |
| keyword: hide |
| hiddenNames |
| SimpleIdentifier |
| token: A |
| ShowCombinator |
| keyword: show |
| shownNames |
| SimpleIdentifier |
| token: B |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseImportDirective_prefix_show_hide() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| import 'lib/lib.dart' as a show B hide A; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| ImportDirective |
| importKeyword: import |
| uri: SimpleStringLiteral |
| literal: 'lib/lib.dart' |
| asKeyword: as |
| prefix: SimpleIdentifier |
| token: a |
| combinators |
| ShowCombinator |
| keyword: show |
| shownNames |
| SimpleIdentifier |
| token: B |
| HideCombinator |
| keyword: hide |
| hiddenNames |
| SimpleIdentifier |
| token: A |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseImportDirective_show() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| import 'lib/lib.dart' show A, B; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| ImportDirective |
| importKeyword: import |
| uri: SimpleStringLiteral |
| literal: 'lib/lib.dart' |
| combinators |
| ShowCombinator |
| keyword: show |
| shownNames |
| SimpleIdentifier |
| token: A |
| SimpleIdentifier |
| token: B |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseLibraryDirective() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| library l; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| LibraryDirective |
| libraryKeyword: library |
| name: DottedName |
| tokens |
| l |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseMixinDeclaration_empty() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| mixin A {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| MixinDeclaration |
| mixinKeyword: mixin |
| name: A |
| body: BlockClassBody |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseMixinDeclaration_implements() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| mixin A implements B {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| MixinDeclaration |
| mixinKeyword: mixin |
| name: A |
| implementsClause: ImplementsClause |
| implementsKeyword: implements |
| interfaces |
| NamedType |
| name: B |
| body: BlockClassBody |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseMixinDeclaration_implements2() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| mixin A implements B<T>, C {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| MixinDeclaration |
| mixinKeyword: mixin |
| name: A |
| implementsClause: ImplementsClause |
| implementsKeyword: implements |
| interfaces |
| NamedType |
| name: B |
| typeArguments: TypeArgumentList |
| leftBracket: < |
| arguments |
| NamedType |
| name: T |
| rightBracket: > |
| NamedType |
| name: C |
| body: BlockClassBody |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseMixinDeclaration_metadata() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| @Z |
| mixin A {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| MixinDeclaration |
| metadata |
| Annotation |
| atSign: @ |
| name: SimpleIdentifier |
| token: Z |
| mixinKeyword: mixin |
| name: A |
| body: BlockClassBody |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseMixinDeclaration_on() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| mixin A on B {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| MixinDeclaration |
| mixinKeyword: mixin |
| name: A |
| onClause: MixinOnClause |
| onKeyword: on |
| superclassConstraints |
| NamedType |
| name: B |
| body: BlockClassBody |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseMixinDeclaration_on2() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| mixin A on B, C<T> {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| MixinDeclaration |
| mixinKeyword: mixin |
| name: A |
| onClause: MixinOnClause |
| onKeyword: on |
| superclassConstraints |
| NamedType |
| name: B |
| NamedType |
| name: C |
| typeArguments: TypeArgumentList |
| leftBracket: < |
| arguments |
| NamedType |
| name: T |
| rightBracket: > |
| body: BlockClassBody |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseMixinDeclaration_onAndImplements() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| mixin A on B implements C {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| MixinDeclaration |
| mixinKeyword: mixin |
| name: A |
| onClause: MixinOnClause |
| onKeyword: on |
| superclassConstraints |
| NamedType |
| name: B |
| implementsClause: ImplementsClause |
| implementsKeyword: implements |
| interfaces |
| NamedType |
| name: C |
| body: BlockClassBody |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseMixinDeclaration_simple() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| mixin A { |
| int f; |
| int get g => f; |
| set s(int v) { |
| f = v; |
| } |
| |
| int add(int v) => f = f + v; |
| } |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| MixinDeclaration |
| mixinKeyword: mixin |
| name: A |
| body: BlockClassBody |
| leftBracket: { |
| members |
| FieldDeclaration |
| fields: VariableDeclarationList |
| type: NamedType |
| name: int |
| variables |
| VariableDeclaration |
| name: f |
| semicolon: ; |
| MethodDeclaration |
| returnType: NamedType |
| name: int |
| propertyKeyword: get |
| name: g |
| body: ExpressionFunctionBody |
| functionDefinition: => |
| expression: SimpleIdentifier |
| token: f |
| semicolon: ; |
| MethodDeclaration |
| propertyKeyword: set |
| name: s |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: int |
| name: v |
| rightParenthesis: ) |
| body: BlockFunctionBody |
| block: Block |
| leftBracket: { |
| statements |
| ExpressionStatement |
| expression: AssignmentExpression |
| leftHandSide: SimpleIdentifier |
| token: f |
| operator: = |
| rightHandSide: SimpleIdentifier |
| token: v |
| semicolon: ; |
| rightBracket: } |
| MethodDeclaration |
| returnType: NamedType |
| name: int |
| name: add |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: int |
| name: v |
| rightParenthesis: ) |
| body: ExpressionFunctionBody |
| functionDefinition: => |
| expression: AssignmentExpression |
| leftHandSide: SimpleIdentifier |
| token: f |
| operator: = |
| rightHandSide: BinaryExpression |
| leftOperand: SimpleIdentifier |
| token: f |
| operator: + |
| rightOperand: SimpleIdentifier |
| token: v |
| semicolon: ; |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parseMixinDeclaration_withDocumentationComment() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| /// Doc |
| mixin M {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| MixinDeclaration |
| documentationComment: Comment |
| tokens |
| /// Doc |
| mixinKeyword: mixin |
| name: M |
| body: BlockClassBody |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| |
| void test_parsePartDirective() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| part 'lib/lib.dart'; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| PartDirective |
| partKeyword: part |
| uri: SimpleStringLiteral |
| literal: 'lib/lib.dart' |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parsePartOfDirective_name() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| part of l; |
| // ^ |
| // [diag.partOfName] The 'part of' directive can't use a name with the enhanced-parts feature. |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| PartOfDirective |
| partKeyword: part |
| ofKeyword: of |
| libraryName: DottedName |
| tokens |
| l |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parsePartOfDirective_uri() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| part of 'lib.dart'; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| directives |
| PartOfDirective |
| partKeyword: part |
| ofKeyword: of |
| uri: SimpleStringLiteral |
| literal: 'lib.dart' |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseTopLevelVariable_external() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| external int i; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| TopLevelVariableDeclaration |
| externalKeyword: external |
| variables: VariableDeclarationList |
| type: NamedType |
| name: int |
| variables |
| VariableDeclaration |
| name: i |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseTopLevelVariable_external_late() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| external late int? i; |
| // [diag.externalLateField][column 1][length 8] External fields cannot be late. |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| TopLevelVariableDeclaration |
| externalKeyword: external |
| variables: VariableDeclarationList |
| lateKeyword: late |
| type: NamedType |
| name: int |
| question: ? |
| variables |
| VariableDeclaration |
| name: i |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseTopLevelVariable_external_late_final() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| external late final int? i; |
| // [diag.externalLateField][column 1][length 8] External fields cannot be late. |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| TopLevelVariableDeclaration |
| externalKeyword: external |
| variables: VariableDeclarationList |
| lateKeyword: late |
| keyword: final |
| type: NamedType |
| name: int |
| question: ? |
| variables |
| VariableDeclaration |
| name: i |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseTopLevelVariable_final_late() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| final late a; |
| // ^^^^ |
| // [diag.modifierOutOfOrder] The modifier 'late' should be before the modifier 'final'. |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| TopLevelVariableDeclaration |
| variables: VariableDeclarationList |
| lateKeyword: late |
| keyword: final |
| variables |
| VariableDeclaration |
| name: a |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseTopLevelVariable_late() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| late a; |
| // ^ |
| // [diag.missingConstFinalVarOrType] Variables must be declared using the keywords 'const', 'final', 'var' or a type name. |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| TopLevelVariableDeclaration |
| variables: VariableDeclarationList |
| lateKeyword: late |
| variables |
| VariableDeclaration |
| name: a |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseTopLevelVariable_late_final() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| late final a; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| TopLevelVariableDeclaration |
| variables: VariableDeclarationList |
| lateKeyword: late |
| keyword: final |
| variables |
| VariableDeclaration |
| name: a |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseTopLevelVariable_late_init() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| late a = 0; |
| // ^ |
| // [diag.missingConstFinalVarOrType] Variables must be declared using the keywords 'const', 'final', 'var' or a type name. |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| TopLevelVariableDeclaration |
| variables: VariableDeclarationList |
| lateKeyword: late |
| variables |
| VariableDeclaration |
| name: a |
| equals: = |
| initializer: IntegerLiteral |
| literal: 0 |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseTopLevelVariable_late_type() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| late A a; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| TopLevelVariableDeclaration |
| variables: VariableDeclarationList |
| lateKeyword: late |
| type: NamedType |
| name: A |
| variables |
| VariableDeclaration |
| name: a |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseTopLevelVariable_non_external() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| int i; |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| TopLevelVariableDeclaration |
| variables: VariableDeclarationList |
| type: NamedType |
| name: int |
| variables |
| VariableDeclaration |
| name: i |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseTypeAlias_function_noParameters() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef bool F(); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionTypeAlias |
| typedefKeyword: typedef |
| returnType: NamedType |
| name: bool |
| name: F |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseTypeAlias_function_noReturnType() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef F(); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionTypeAlias |
| typedefKeyword: typedef |
| name: F |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseTypeAlias_function_parameterizedReturnType() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef A<B> F(); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionTypeAlias |
| typedefKeyword: typedef |
| returnType: NamedType |
| name: A |
| typeArguments: TypeArgumentList |
| leftBracket: < |
| arguments |
| NamedType |
| name: B |
| rightBracket: > |
| name: F |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseTypeAlias_function_parameters() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef bool F(Object value); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionTypeAlias |
| typedefKeyword: typedef |
| returnType: NamedType |
| name: bool |
| name: F |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: Object |
| name: value |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseTypeAlias_function_typeParameters() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef bool F<E>(); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionTypeAlias |
| typedefKeyword: typedef |
| returnType: NamedType |
| name: bool |
| name: F |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: E |
| rightBracket: > |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseTypeAlias_function_voidReturnType() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef void F(); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| FunctionTypeAlias |
| typedefKeyword: typedef |
| returnType: NamedType |
| name: void |
| name: F |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseTypeAlias_genericFunction_noParameters() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef F = bool Function(); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| GenericTypeAlias |
| typedefKeyword: typedef |
| name: F |
| equals: = |
| type: GenericFunctionType |
| returnType: NamedType |
| name: bool |
| functionKeyword: Function |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseTypeAlias_genericFunction_noReturnType() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef F = Function(); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| GenericTypeAlias |
| typedefKeyword: typedef |
| name: F |
| equals: = |
| type: GenericFunctionType |
| functionKeyword: Function |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseTypeAlias_genericFunction_parameterizedReturnType() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef F = A<B> Function(); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| GenericTypeAlias |
| typedefKeyword: typedef |
| name: F |
| equals: = |
| type: GenericFunctionType |
| returnType: NamedType |
| name: A |
| typeArguments: TypeArgumentList |
| leftBracket: < |
| arguments |
| NamedType |
| name: B |
| rightBracket: > |
| functionKeyword: Function |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseTypeAlias_genericFunction_parameters() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef F = bool Function(Object value); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| GenericTypeAlias |
| typedefKeyword: typedef |
| name: F |
| equals: = |
| type: GenericFunctionType |
| returnType: NamedType |
| name: bool |
| functionKeyword: Function |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: Object |
| name: value |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseTypeAlias_genericFunction_typeParameters() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef F = bool Function<E>(); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| GenericTypeAlias |
| typedefKeyword: typedef |
| name: F |
| equals: = |
| type: GenericFunctionType |
| returnType: NamedType |
| name: bool |
| functionKeyword: Function |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: E |
| rightBracket: > |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseTypeAlias_genericFunction_typeParameters_noParameters() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef F<T> = bool Function(); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| GenericTypeAlias |
| typedefKeyword: typedef |
| name: F |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: T |
| rightBracket: > |
| equals: = |
| type: GenericFunctionType |
| returnType: NamedType |
| name: bool |
| functionKeyword: Function |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseTypeAlias_genericFunction_typeParameters_noReturnType() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef F<T> = Function(); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| GenericTypeAlias |
| typedefKeyword: typedef |
| name: F |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: T |
| rightBracket: > |
| equals: = |
| type: GenericFunctionType |
| functionKeyword: Function |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void |
| test_parseTypeAlias_genericFunction_typeParameters_parameterizedReturnType() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef F<T> = A<B> Function(); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| GenericTypeAlias |
| typedefKeyword: typedef |
| name: F |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: T |
| rightBracket: > |
| equals: = |
| type: GenericFunctionType |
| returnType: NamedType |
| name: A |
| typeArguments: TypeArgumentList |
| leftBracket: < |
| arguments |
| NamedType |
| name: B |
| rightBracket: > |
| functionKeyword: Function |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseTypeAlias_genericFunction_typeParameters_parameters() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef F<T> = bool Function(Object value); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| GenericTypeAlias |
| typedefKeyword: typedef |
| name: F |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: T |
| rightBracket: > |
| equals: = |
| type: GenericFunctionType |
| returnType: NamedType |
| name: bool |
| functionKeyword: Function |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| parameter: RegularFormalParameter |
| type: NamedType |
| name: Object |
| name: value |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseTypeAlias_genericFunction_typeParameters_typeParameters() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef F<T> = bool Function<E>(); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| GenericTypeAlias |
| typedefKeyword: typedef |
| name: F |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: T |
| rightBracket: > |
| equals: = |
| type: GenericFunctionType |
| returnType: NamedType |
| name: bool |
| functionKeyword: Function |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: E |
| rightBracket: > |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseTypeAlias_genericFunction_typeParameters_voidReturnType() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef F<T> = void Function(); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| GenericTypeAlias |
| typedefKeyword: typedef |
| name: F |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: T |
| rightBracket: > |
| equals: = |
| type: GenericFunctionType |
| returnType: NamedType |
| name: void |
| functionKeyword: Function |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseTypeAlias_genericFunction_voidReturnType() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| typedef F = void Function(); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| GenericTypeAlias |
| typedefKeyword: typedef |
| name: F |
| equals: = |
| type: GenericFunctionType |
| returnType: NamedType |
| name: void |
| functionKeyword: Function |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseTypeAlias_genericFunction_withDocComment() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| /// Doc |
| typedef F = bool Function(); |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| GenericTypeAlias |
| documentationComment: Comment |
| tokens |
| /// Doc |
| typedefKeyword: typedef |
| name: F |
| equals: = |
| type: GenericFunctionType |
| returnType: NamedType |
| name: bool |
| functionKeyword: Function |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| semicolon: ; |
| '''); |
| } |
| |
| void test_parseTypeVariable_withDocumentationComment() { |
| var parseResult = parseTestCodeWithDiagnostics(r''' |
| class A< |
| /// Doc |
| B |
| > {} |
| '''); |
| var node = parseResult.findNode.unit; |
| assertParsedNodeText(node, r''' |
| CompilationUnit |
| declarations |
| ClassDeclaration |
| classKeyword: class |
| namePart: NameWithTypeParameters |
| typeName: A |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| documentationComment: Comment |
| tokens |
| /// Doc |
| name: B |
| rightBracket: > |
| body: BlockClassBody |
| leftBracket: { |
| rightBracket: } |
| '''); |
| } |
| } |