| // Copyright (c) 2024, 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:test/test.dart'; |
| import 'package:test_reflective_loader/test_reflective_loader.dart'; |
| |
| import '../../dart/resolution/node_text_expectations.dart'; |
| import '../elements_base.dart'; |
| |
| main() { |
| defineReflectiveSuite(() { |
| defineReflectiveTests(MetadataElementTest_keepLinking); |
| defineReflectiveTests(MetadataElementTest_fromBytes); |
| defineReflectiveTests(UpdateNodeTextExpectations); |
| }); |
| } |
| |
| abstract class MetadataElementTest extends ElementsBaseTest { |
| test_annotationArgument_recordLiteral() async { |
| var library = await buildLibrary(''' |
| @A((2, a: 3)) |
| class C {} |
| class A { |
| const A(o); |
| } |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class C (nameOffset:20) (firstTokenOffset:0) (offset:20) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| #F3 class A (nameOffset:31) (firstTokenOffset:25) (offset:31) |
| element: <testLibrary>::@class::A |
| constructors |
| #F4 const new (nameOffset:<null>) (firstTokenOffset:37) (offset:43) |
| element: <testLibrary>::@class::A::@constructor::new |
| typeName: A |
| typeNameOffset: 43 |
| formalParameters |
| #F5 o (nameOffset:45) (firstTokenOffset:45) (offset:45) |
| element: <testLibrary>::@class::A::@constructor::new::@formalParameter::o |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| class A |
| reference: <testLibrary>::@class::A |
| firstFragment: #F3 |
| constructors |
| const new |
| reference: <testLibrary>::@class::A::@constructor::new |
| firstFragment: #F4 |
| formalParameters |
| #E0 requiredPositional hasImplicitType o |
| firstFragment: #F5 |
| type: dynamic |
| '''); |
| } |
| |
| test_annotationArgument_recordLiteral_withConst() async { |
| var library = await buildLibrary(''' |
| @A(const ('',)) |
| class C {} |
| class A { |
| const A(o); |
| } |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class C (nameOffset:22) (firstTokenOffset:0) (offset:22) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| #F3 class A (nameOffset:33) (firstTokenOffset:27) (offset:33) |
| element: <testLibrary>::@class::A |
| constructors |
| #F4 const new (nameOffset:<null>) (firstTokenOffset:39) (offset:45) |
| element: <testLibrary>::@class::A::@constructor::new |
| typeName: A |
| typeNameOffset: 45 |
| formalParameters |
| #F5 o (nameOffset:47) (firstTokenOffset:47) (offset:47) |
| element: <testLibrary>::@class::A::@constructor::new::@formalParameter::o |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| class A |
| reference: <testLibrary>::@class::A |
| firstFragment: #F3 |
| constructors |
| const new |
| reference: <testLibrary>::@class::A::@constructor::new |
| firstFragment: #F4 |
| formalParameters |
| #E0 requiredPositional hasImplicitType o |
| firstFragment: #F5 |
| type: dynamic |
| '''); |
| } |
| |
| test_invalid_annotation_prefixed_constructor() async { |
| newFile('$testPackageLibPath/a.dart', r''' |
| class A { |
| const A.named(); |
| } |
| '''); |
| var library = await buildLibrary(''' |
| import "a.dart" as a; |
| @a.A.named |
| class C {} |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| libraryImports |
| package:test/a.dart as a (nameOffset:19) (firstTokenOffset:<null>) (offset:19) |
| prefixes |
| <testLibraryFragment>::@prefix2::a |
| fragments: @19 |
| classes |
| #F1 class C (nameOffset:39) (firstTokenOffset:22) (offset:39) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| '''); |
| } |
| |
| test_invalid_annotation_unprefixed_constructor() async { |
| newFile('$testPackageLibPath/a.dart', r''' |
| class A { |
| const A.named(); |
| } |
| '''); |
| var library = await buildLibrary(''' |
| import "a.dart"; |
| @A.named |
| class C {} |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| libraryImports |
| package:test/a.dart |
| classes |
| #F1 class C (nameOffset:32) (firstTokenOffset:17) (offset:32) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| '''); |
| } |
| |
| test_metadata_class_field_first() async { |
| var library = await buildLibrary(r''' |
| const a = 0; |
| class C { |
| @a |
| int x = 0; |
| } |
| '''); |
| // Check metadata without asking any other properties. |
| var x = library.getClass('C')!.getField('x')!; |
| expect(x.metadata.annotations, hasLength(1)); |
| // Check details. |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class C (nameOffset:19) (firstTokenOffset:13) (offset:19) |
| element: <testLibrary>::@class::C |
| fields |
| #F2 hasInitializer x (nameOffset:34) (firstTokenOffset:34) (offset:34) |
| element: <testLibrary>::@class::C::@field::x |
| constructors |
| #F3 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| getters |
| #F4 synthetic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34) |
| element: <testLibrary>::@class::C::@getter::x |
| setters |
| #F5 synthetic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34) |
| element: <testLibrary>::@class::C::@setter::x |
| formalParameters |
| #F6 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34) |
| element: <testLibrary>::@class::C::@setter::x::@formalParameter::value |
| topLevelVariables |
| #F7 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| IntegerLiteral |
| literal: 0 @10 |
| staticType: int |
| getters |
| #F8 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| classes |
| hasNonFinalField class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| fields |
| hasInitializer x |
| reference: <testLibrary>::@class::C::@field::x |
| firstFragment: #F2 |
| type: int |
| getter: <testLibrary>::@class::C::@getter::x |
| setter: <testLibrary>::@class::C::@setter::x |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F3 |
| getters |
| synthetic x |
| reference: <testLibrary>::@class::C::@getter::x |
| firstFragment: #F4 |
| returnType: int |
| variable: <testLibrary>::@class::C::@field::x |
| setters |
| synthetic x |
| reference: <testLibrary>::@class::C::@setter::x |
| firstFragment: #F5 |
| formalParameters |
| #E0 requiredPositional value |
| firstFragment: #F6 |
| type: int |
| returnType: void |
| variable: <testLibrary>::@class::C::@field::x |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F7 |
| type: int |
| constantInitializer |
| fragment: #F7 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F8 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::a |
| '''); |
| } |
| |
| test_metadata_class_scope() async { |
| var library = await buildLibrary(r''' |
| const foo = 0; |
| |
| @foo |
| class C<@foo T> { |
| static const foo = 1; |
| @foo |
| void bar() {} |
| } |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class C (nameOffset:27) (firstTokenOffset:16) (offset:27) |
| element: <testLibrary>::@class::C |
| typeParameters |
| #F2 T (nameOffset:34) (firstTokenOffset:29) (offset:34) |
| element: #E0 T |
| metadata |
| Annotation |
| atSign: @ @29 |
| name: SimpleIdentifier |
| token: foo @30 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| fields |
| #F3 hasInitializer foo (nameOffset:54) (firstTokenOffset:54) (offset:54) |
| element: <testLibrary>::@class::C::@field::foo |
| initializer: expression_0 |
| IntegerLiteral |
| literal: 1 @60 |
| staticType: int |
| constructors |
| #F4 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| getters |
| #F5 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:54) |
| element: <testLibrary>::@class::C::@getter::foo |
| methods |
| #F6 bar (nameOffset:77) (firstTokenOffset:65) (offset:77) |
| element: <testLibrary>::@class::C::@method::bar |
| metadata |
| Annotation |
| atSign: @ @65 |
| name: SimpleIdentifier |
| token: foo @66 |
| element: <testLibrary>::@class::C::@getter::foo |
| staticType: null |
| element: <testLibrary>::@class::C::@getter::foo |
| topLevelVariables |
| #F7 hasInitializer foo (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::foo |
| initializer: expression_1 |
| IntegerLiteral |
| literal: 0 @12 |
| staticType: int |
| getters |
| #F8 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::foo |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| typeParameters |
| #E0 T |
| firstFragment: #F2 |
| metadata |
| Annotation |
| atSign: @ @29 |
| name: SimpleIdentifier |
| token: foo @30 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| fields |
| static const hasInitializer foo |
| reference: <testLibrary>::@class::C::@field::foo |
| firstFragment: #F3 |
| type: int |
| constantInitializer |
| fragment: #F3 |
| expression: expression_0 |
| getter: <testLibrary>::@class::C::@getter::foo |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F4 |
| getters |
| synthetic static foo |
| reference: <testLibrary>::@class::C::@getter::foo |
| firstFragment: #F5 |
| returnType: int |
| variable: <testLibrary>::@class::C::@field::foo |
| methods |
| bar |
| reference: <testLibrary>::@class::C::@method::bar |
| firstFragment: #F6 |
| metadata |
| Annotation |
| atSign: @ @65 |
| name: SimpleIdentifier |
| token: foo @66 |
| element: <testLibrary>::@class::C::@getter::foo |
| staticType: null |
| element: <testLibrary>::@class::C::@getter::foo |
| returnType: void |
| topLevelVariables |
| const hasInitializer foo |
| reference: <testLibrary>::@topLevelVariable::foo |
| firstFragment: #F7 |
| type: int |
| constantInitializer |
| fragment: #F7 |
| expression: expression_1 |
| getter: <testLibrary>::@getter::foo |
| getters |
| synthetic static foo |
| reference: <testLibrary>::@getter::foo |
| firstFragment: #F8 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::foo |
| '''); |
| } |
| |
| test_metadata_classDeclaration() async { |
| var library = await buildLibrary(r''' |
| const a = null; |
| const b = null; |
| @a |
| @b |
| class C {}'''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class C (nameOffset:44) (firstTokenOffset:32) (offset:44) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| topLevelVariables |
| #F3 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| NullLiteral |
| literal: null @10 |
| staticType: Null |
| #F4 hasInitializer b (nameOffset:22) (firstTokenOffset:22) (offset:22) |
| element: <testLibrary>::@topLevelVariable::b |
| initializer: expression_1 |
| NullLiteral |
| literal: null @26 |
| staticType: Null |
| getters |
| #F5 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| #F6 synthetic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22) |
| element: <testLibrary>::@getter::b |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F3 |
| type: dynamic |
| constantInitializer |
| fragment: #F3 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| const hasInitializer b |
| reference: <testLibrary>::@topLevelVariable::b |
| firstFragment: #F4 |
| type: dynamic |
| constantInitializer |
| fragment: #F4 |
| expression: expression_1 |
| getter: <testLibrary>::@getter::b |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F5 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::a |
| synthetic static b |
| reference: <testLibrary>::@getter::b |
| firstFragment: #F6 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::b |
| '''); |
| } |
| |
| test_metadata_classTypeAlias() async { |
| var library = await buildLibrary( |
| 'const a = null; @a class C = D with E; class D {} class E {}', |
| ); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class C (nameOffset:25) (firstTokenOffset:16) (offset:25) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| #F3 class D (nameOffset:45) (firstTokenOffset:39) (offset:45) |
| element: <testLibrary>::@class::D |
| constructors |
| #F4 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:45) |
| element: <testLibrary>::@class::D::@constructor::new |
| typeName: D |
| #F5 class E (nameOffset:56) (firstTokenOffset:50) (offset:56) |
| element: <testLibrary>::@class::E |
| constructors |
| #F6 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:56) |
| element: <testLibrary>::@class::E::@constructor::new |
| typeName: E |
| topLevelVariables |
| #F7 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| NullLiteral |
| literal: null @10 |
| staticType: Null |
| getters |
| #F8 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| classes |
| class alias C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| supertype: D |
| mixins |
| E |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| constantInitializers |
| SuperConstructorInvocation |
| superKeyword: super @0 |
| argumentList: ArgumentList |
| leftParenthesis: ( @0 |
| rightParenthesis: ) @0 |
| element: <testLibrary>::@class::D::@constructor::new |
| superConstructor: <testLibrary>::@class::D::@constructor::new |
| class D |
| reference: <testLibrary>::@class::D |
| firstFragment: #F3 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::D::@constructor::new |
| firstFragment: #F4 |
| class E |
| reference: <testLibrary>::@class::E |
| firstFragment: #F5 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::E::@constructor::new |
| firstFragment: #F6 |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F7 |
| type: dynamic |
| constantInitializer |
| fragment: #F7 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F8 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::a |
| '''); |
| } |
| |
| test_metadata_constructor_call_named() async { |
| var library = await buildLibrary(''' |
| class A { |
| const A.named(int _); |
| } |
| @A.named(0) |
| class C {} |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6) |
| element: <testLibrary>::@class::A |
| constructors |
| #F2 const named (nameOffset:20) (firstTokenOffset:12) (offset:20) |
| element: <testLibrary>::@class::A::@constructor::named |
| typeName: A |
| typeNameOffset: 18 |
| periodOffset: 19 |
| formalParameters |
| #F3 _ (nameOffset:30) (firstTokenOffset:26) (offset:30) |
| element: <testLibrary>::@class::A::@constructor::named::@formalParameter::_ |
| #F4 class C (nameOffset:54) (firstTokenOffset:36) (offset:54) |
| element: <testLibrary>::@class::C |
| constructors |
| #F5 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:54) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class A |
| reference: <testLibrary>::@class::A |
| firstFragment: #F1 |
| constructors |
| const named |
| reference: <testLibrary>::@class::A::@constructor::named |
| firstFragment: #F2 |
| formalParameters |
| #E0 requiredPositional _ |
| firstFragment: #F3 |
| type: int |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F4 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F5 |
| '''); |
| } |
| |
| test_metadata_constructor_call_named_generic_inference() async { |
| var library = await buildLibrary(''' |
| class A<T> { |
| const A.named(T _); |
| } |
| |
| @A.named(0) |
| class C {} |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6) |
| element: <testLibrary>::@class::A |
| typeParameters |
| #F2 T (nameOffset:8) (firstTokenOffset:8) (offset:8) |
| element: #E0 T |
| constructors |
| #F3 const named (nameOffset:23) (firstTokenOffset:15) (offset:23) |
| element: <testLibrary>::@class::A::@constructor::named |
| typeName: A |
| typeNameOffset: 21 |
| periodOffset: 22 |
| formalParameters |
| #F4 _ (nameOffset:31) (firstTokenOffset:29) (offset:31) |
| element: <testLibrary>::@class::A::@constructor::named::@formalParameter::_ |
| #F5 class C (nameOffset:56) (firstTokenOffset:38) (offset:56) |
| element: <testLibrary>::@class::C |
| constructors |
| #F6 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:56) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class A |
| reference: <testLibrary>::@class::A |
| firstFragment: #F1 |
| typeParameters |
| #E0 T |
| firstFragment: #F2 |
| constructors |
| const named |
| reference: <testLibrary>::@class::A::@constructor::named |
| firstFragment: #F3 |
| formalParameters |
| #E1 requiredPositional _ |
| firstFragment: #F4 |
| type: T |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F5 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F6 |
| '''); |
| } |
| |
| test_metadata_constructor_call_named_generic_typeArguments() async { |
| var library = await buildLibrary(''' |
| class A<T> { |
| const A.named(); |
| } |
| |
| @A<int>.named() |
| class C {} |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6) |
| element: <testLibrary>::@class::A |
| typeParameters |
| #F2 T (nameOffset:8) (firstTokenOffset:8) (offset:8) |
| element: #E0 T |
| constructors |
| #F3 const named (nameOffset:23) (firstTokenOffset:15) (offset:23) |
| element: <testLibrary>::@class::A::@constructor::named |
| typeName: A |
| typeNameOffset: 21 |
| periodOffset: 22 |
| #F4 class C (nameOffset:57) (firstTokenOffset:35) (offset:57) |
| element: <testLibrary>::@class::C |
| constructors |
| #F5 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:57) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class A |
| reference: <testLibrary>::@class::A |
| firstFragment: #F1 |
| typeParameters |
| #E0 T |
| firstFragment: #F2 |
| constructors |
| const named |
| reference: <testLibrary>::@class::A::@constructor::named |
| firstFragment: #F3 |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F4 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F5 |
| '''); |
| } |
| |
| test_metadata_constructor_call_named_generic_typeArguments_disabledGenericMetadata() async { |
| var library = await buildLibrary(''' |
| class A<T> { |
| const A.named(); |
| } |
| |
| @A<int>.named() |
| class C {} |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6) |
| element: <testLibrary>::@class::A |
| typeParameters |
| #F2 T (nameOffset:8) (firstTokenOffset:8) (offset:8) |
| element: #E0 T |
| constructors |
| #F3 const named (nameOffset:23) (firstTokenOffset:15) (offset:23) |
| element: <testLibrary>::@class::A::@constructor::named |
| typeName: A |
| typeNameOffset: 21 |
| periodOffset: 22 |
| #F4 class C (nameOffset:57) (firstTokenOffset:35) (offset:57) |
| element: <testLibrary>::@class::C |
| constructors |
| #F5 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:57) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class A |
| reference: <testLibrary>::@class::A |
| firstFragment: #F1 |
| typeParameters |
| #E0 T |
| firstFragment: #F2 |
| constructors |
| const named |
| reference: <testLibrary>::@class::A::@constructor::named |
| firstFragment: #F3 |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F4 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F5 |
| '''); |
| } |
| |
| test_metadata_constructor_call_named_prefixed() async { |
| newFile('$testPackageLibPath/foo.dart', ''' |
| class A { |
| const A.named(int _); |
| } |
| '''); |
| var library = await buildLibrary(''' |
| import 'foo.dart' as foo; |
| @foo.A.named(0) |
| class C {} |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| libraryImports |
| package:test/foo.dart as foo (nameOffset:21) (firstTokenOffset:<null>) (offset:21) |
| prefixes |
| <testLibraryFragment>::@prefix2::foo |
| fragments: @21 |
| classes |
| #F1 class C (nameOffset:48) (firstTokenOffset:26) (offset:48) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| '''); |
| } |
| |
| test_metadata_constructor_call_named_prefixed_generic_inference() async { |
| newFile('$testPackageLibPath/foo.dart', ''' |
| class A<T> { |
| const A.named(T _); |
| } |
| '''); |
| var library = await buildLibrary(''' |
| import "foo.dart" as foo; |
| @foo.A.named(0) |
| class C {} |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| libraryImports |
| package:test/foo.dart as foo (nameOffset:21) (firstTokenOffset:<null>) (offset:21) |
| prefixes |
| <testLibraryFragment>::@prefix2::foo |
| fragments: @21 |
| classes |
| #F1 class C (nameOffset:48) (firstTokenOffset:26) (offset:48) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| '''); |
| } |
| |
| test_metadata_constructor_call_named_prefixed_generic_typeArguments() async { |
| newFile('$testPackageLibPath/foo.dart', ''' |
| class A<T> { |
| const A.named(); |
| } |
| '''); |
| var library = await buildLibrary(''' |
| import "foo.dart" as foo; |
| @foo.A<int>.named() |
| class C {} |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| libraryImports |
| package:test/foo.dart as foo (nameOffset:21) (firstTokenOffset:<null>) (offset:21) |
| prefixes |
| <testLibraryFragment>::@prefix2::foo |
| fragments: @21 |
| classes |
| #F1 class C (nameOffset:52) (firstTokenOffset:26) (offset:52) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:52) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| '''); |
| } |
| |
| test_metadata_constructor_call_named_synthetic_ofClassAlias_generic() async { |
| var library = await buildLibrary(''' |
| class A { |
| const A.named(); |
| } |
| |
| mixin B {} |
| |
| class C<T> = A with B; |
| |
| @C.named() |
| class D {} |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6) |
| element: <testLibrary>::@class::A |
| constructors |
| #F2 const named (nameOffset:20) (firstTokenOffset:12) (offset:20) |
| element: <testLibrary>::@class::A::@constructor::named |
| typeName: A |
| typeNameOffset: 18 |
| periodOffset: 19 |
| #F3 class C (nameOffset:50) (firstTokenOffset:44) (offset:50) |
| element: <testLibrary>::@class::C |
| typeParameters |
| #F4 T (nameOffset:52) (firstTokenOffset:52) (offset:52) |
| element: #E0 T |
| constructors |
| #F5 synthetic const named (nameOffset:<null>) (firstTokenOffset:<null>) (offset:50) |
| element: <testLibrary>::@class::C::@constructor::named |
| typeName: C |
| #F6 class D (nameOffset:85) (firstTokenOffset:68) (offset:85) |
| element: <testLibrary>::@class::D |
| constructors |
| #F7 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:85) |
| element: <testLibrary>::@class::D::@constructor::new |
| typeName: D |
| mixins |
| #F8 mixin B (nameOffset:38) (firstTokenOffset:32) (offset:38) |
| element: <testLibrary>::@mixin::B |
| classes |
| class A |
| reference: <testLibrary>::@class::A |
| firstFragment: #F1 |
| constructors |
| const named |
| reference: <testLibrary>::@class::A::@constructor::named |
| firstFragment: #F2 |
| class alias C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F3 |
| typeParameters |
| #E0 T |
| firstFragment: #F4 |
| supertype: A |
| mixins |
| B |
| constructors |
| synthetic const named |
| reference: <testLibrary>::@class::C::@constructor::named |
| firstFragment: #F5 |
| constantInitializers |
| SuperConstructorInvocation |
| superKeyword: super @0 |
| period: . @0 |
| constructorName: SimpleIdentifier |
| token: named @-1 |
| element: <testLibrary>::@class::A::@constructor::named |
| staticType: null |
| argumentList: ArgumentList |
| leftParenthesis: ( @0 |
| rightParenthesis: ) @0 |
| element: <testLibrary>::@class::A::@constructor::named |
| superConstructor: <testLibrary>::@class::A::@constructor::named |
| class D |
| reference: <testLibrary>::@class::D |
| firstFragment: #F6 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::D::@constructor::new |
| firstFragment: #F7 |
| mixins |
| mixin B |
| reference: <testLibrary>::@mixin::B |
| firstFragment: #F8 |
| superclassConstraints |
| Object |
| '''); |
| } |
| |
| test_metadata_constructor_call_unnamed() async { |
| var library = await buildLibrary(''' |
| class A { |
| const A(int _); |
| } |
| @A(0) |
| class C {} |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6) |
| element: <testLibrary>::@class::A |
| constructors |
| #F2 const new (nameOffset:<null>) (firstTokenOffset:12) (offset:18) |
| element: <testLibrary>::@class::A::@constructor::new |
| typeName: A |
| typeNameOffset: 18 |
| formalParameters |
| #F3 _ (nameOffset:24) (firstTokenOffset:20) (offset:24) |
| element: <testLibrary>::@class::A::@constructor::new::@formalParameter::_ |
| #F4 class C (nameOffset:42) (firstTokenOffset:30) (offset:42) |
| element: <testLibrary>::@class::C |
| constructors |
| #F5 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class A |
| reference: <testLibrary>::@class::A |
| firstFragment: #F1 |
| constructors |
| const new |
| reference: <testLibrary>::@class::A::@constructor::new |
| firstFragment: #F2 |
| formalParameters |
| #E0 requiredPositional _ |
| firstFragment: #F3 |
| type: int |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F4 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F5 |
| '''); |
| } |
| |
| test_metadata_constructor_call_unnamed_generic_inference() async { |
| var library = await buildLibrary(''' |
| class A<T> { |
| const A(T _); |
| } |
| |
| @A(0) |
| class C {} |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6) |
| element: <testLibrary>::@class::A |
| typeParameters |
| #F2 T (nameOffset:8) (firstTokenOffset:8) (offset:8) |
| element: #E0 T |
| constructors |
| #F3 const new (nameOffset:<null>) (firstTokenOffset:15) (offset:21) |
| element: <testLibrary>::@class::A::@constructor::new |
| typeName: A |
| typeNameOffset: 21 |
| formalParameters |
| #F4 _ (nameOffset:25) (firstTokenOffset:23) (offset:25) |
| element: <testLibrary>::@class::A::@constructor::new::@formalParameter::_ |
| #F5 class C (nameOffset:44) (firstTokenOffset:32) (offset:44) |
| element: <testLibrary>::@class::C |
| constructors |
| #F6 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class A |
| reference: <testLibrary>::@class::A |
| firstFragment: #F1 |
| typeParameters |
| #E0 T |
| firstFragment: #F2 |
| constructors |
| const new |
| reference: <testLibrary>::@class::A::@constructor::new |
| firstFragment: #F3 |
| formalParameters |
| #E1 requiredPositional _ |
| firstFragment: #F4 |
| type: T |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F5 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F6 |
| '''); |
| } |
| |
| test_metadata_constructor_call_unnamed_generic_typeArguments() async { |
| var library = await buildLibrary(''' |
| class A<T> { |
| const A(); |
| } |
| |
| @A<int>() |
| class C {} |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6) |
| element: <testLibrary>::@class::A |
| typeParameters |
| #F2 T (nameOffset:8) (firstTokenOffset:8) (offset:8) |
| element: #E0 T |
| constructors |
| #F3 const new (nameOffset:<null>) (firstTokenOffset:15) (offset:21) |
| element: <testLibrary>::@class::A::@constructor::new |
| typeName: A |
| typeNameOffset: 21 |
| #F4 class C (nameOffset:45) (firstTokenOffset:29) (offset:45) |
| element: <testLibrary>::@class::C |
| constructors |
| #F5 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:45) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class A |
| reference: <testLibrary>::@class::A |
| firstFragment: #F1 |
| typeParameters |
| #E0 T |
| firstFragment: #F2 |
| constructors |
| const new |
| reference: <testLibrary>::@class::A::@constructor::new |
| firstFragment: #F3 |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F4 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F5 |
| '''); |
| } |
| |
| test_metadata_constructor_call_unnamed_prefixed() async { |
| newFile('$testPackageLibPath/foo.dart', 'class A { const A(_); }'); |
| var library = await buildLibrary( |
| 'import "foo.dart" as foo; @foo.A(0) class C {}', |
| ); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| libraryImports |
| package:test/foo.dart as foo (nameOffset:21) (firstTokenOffset:<null>) (offset:21) |
| prefixes |
| <testLibraryFragment>::@prefix2::foo |
| fragments: @21 |
| classes |
| #F1 class C (nameOffset:42) (firstTokenOffset:26) (offset:42) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| '''); |
| } |
| |
| test_metadata_constructor_call_unnamed_prefixed_generic_inference() async { |
| newFile('$testPackageLibPath/foo.dart', ''' |
| class A<T> { |
| const A(T _); |
| } |
| '''); |
| var library = await buildLibrary(''' |
| import "foo.dart" as foo; |
| @foo.A(0) |
| class C {} |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| libraryImports |
| package:test/foo.dart as foo (nameOffset:21) (firstTokenOffset:<null>) (offset:21) |
| prefixes |
| <testLibraryFragment>::@prefix2::foo |
| fragments: @21 |
| classes |
| #F1 class C (nameOffset:42) (firstTokenOffset:26) (offset:42) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| '''); |
| } |
| |
| test_metadata_constructor_call_unnamed_prefixed_generic_typeArguments() async { |
| newFile('$testPackageLibPath/foo.dart', ''' |
| class A<T> { |
| const A(); |
| } |
| '''); |
| var library = await buildLibrary(''' |
| import "foo.dart" as foo; |
| @foo.A<int>() |
| class C {} |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| libraryImports |
| package:test/foo.dart as foo (nameOffset:21) (firstTokenOffset:<null>) (offset:21) |
| prefixes |
| <testLibraryFragment>::@prefix2::foo |
| fragments: @21 |
| classes |
| #F1 class C (nameOffset:46) (firstTokenOffset:26) (offset:46) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:46) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| '''); |
| } |
| |
| test_metadata_constructor_call_unnamed_synthetic_ofClassAlias_generic() async { |
| var library = await buildLibrary(''' |
| class A { |
| const A(); |
| } |
| |
| mixin B {} |
| |
| class C<T> = A with B; |
| |
| @C() |
| class D {} |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6) |
| element: <testLibrary>::@class::A |
| constructors |
| #F2 const new (nameOffset:<null>) (firstTokenOffset:12) (offset:18) |
| element: <testLibrary>::@class::A::@constructor::new |
| typeName: A |
| typeNameOffset: 18 |
| #F3 class C (nameOffset:44) (firstTokenOffset:38) (offset:44) |
| element: <testLibrary>::@class::C |
| typeParameters |
| #F4 T (nameOffset:46) (firstTokenOffset:46) (offset:46) |
| element: #E0 T |
| constructors |
| #F5 synthetic const new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| #F6 class D (nameOffset:73) (firstTokenOffset:62) (offset:73) |
| element: <testLibrary>::@class::D |
| constructors |
| #F7 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:73) |
| element: <testLibrary>::@class::D::@constructor::new |
| typeName: D |
| mixins |
| #F8 mixin B (nameOffset:32) (firstTokenOffset:26) (offset:32) |
| element: <testLibrary>::@mixin::B |
| classes |
| class A |
| reference: <testLibrary>::@class::A |
| firstFragment: #F1 |
| constructors |
| const new |
| reference: <testLibrary>::@class::A::@constructor::new |
| firstFragment: #F2 |
| class alias C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F3 |
| typeParameters |
| #E0 T |
| firstFragment: #F4 |
| supertype: A |
| mixins |
| B |
| constructors |
| synthetic const new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F5 |
| constantInitializers |
| SuperConstructorInvocation |
| superKeyword: super @0 |
| argumentList: ArgumentList |
| leftParenthesis: ( @0 |
| rightParenthesis: ) @0 |
| element: <testLibrary>::@class::A::@constructor::new |
| superConstructor: <testLibrary>::@class::A::@constructor::new |
| class D |
| reference: <testLibrary>::@class::D |
| firstFragment: #F6 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::D::@constructor::new |
| firstFragment: #F7 |
| mixins |
| mixin B |
| reference: <testLibrary>::@mixin::B |
| firstFragment: #F8 |
| superclassConstraints |
| Object |
| '''); |
| } |
| |
| test_metadata_constructor_call_with_args() async { |
| var library = await buildLibrary( |
| 'class A { const A(x); } @A(null) class C {}', |
| ); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6) |
| element: <testLibrary>::@class::A |
| constructors |
| #F2 const new (nameOffset:<null>) (firstTokenOffset:10) (offset:16) |
| element: <testLibrary>::@class::A::@constructor::new |
| typeName: A |
| typeNameOffset: 16 |
| formalParameters |
| #F3 x (nameOffset:18) (firstTokenOffset:18) (offset:18) |
| element: <testLibrary>::@class::A::@constructor::new::@formalParameter::x |
| #F4 class C (nameOffset:39) (firstTokenOffset:24) (offset:39) |
| element: <testLibrary>::@class::C |
| constructors |
| #F5 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class A |
| reference: <testLibrary>::@class::A |
| firstFragment: #F1 |
| constructors |
| const new |
| reference: <testLibrary>::@class::A::@constructor::new |
| firstFragment: #F2 |
| formalParameters |
| #E0 requiredPositional hasImplicitType x |
| firstFragment: #F3 |
| type: dynamic |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F4 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F5 |
| '''); |
| } |
| |
| test_metadata_constructor_namedArgument() async { |
| newFile('$testPackageLibPath/a.dart', r''' |
| class A { |
| const A({required int value}); |
| } |
| '''); |
| |
| var library = await buildLibrary(r''' |
| import 'a.dart'; |
| @A(value: 42) |
| void f() {} |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| libraryImports |
| package:test/a.dart |
| functions |
| #F1 f (nameOffset:36) (firstTokenOffset:17) (offset:36) |
| element: <testLibrary>::@function::f |
| metadata |
| Annotation |
| atSign: @ @17 |
| name: SimpleIdentifier |
| token: A @18 |
| element: package:test/a.dart::@class::A |
| staticType: null |
| arguments: ArgumentList |
| leftParenthesis: ( @19 |
| arguments |
| NamedExpression |
| name: Label |
| label: SimpleIdentifier |
| token: value @20 |
| element: package:test/a.dart::@class::A::@constructor::new::@formalParameter::value |
| staticType: null |
| colon: : @25 |
| expression: IntegerLiteral |
| literal: 42 @27 |
| staticType: int |
| rightParenthesis: ) @29 |
| element: package:test/a.dart::@class::A::@constructor::new |
| functions |
| f |
| reference: <testLibrary>::@function::f |
| firstFragment: #F1 |
| metadata |
| Annotation |
| atSign: @ @17 |
| name: SimpleIdentifier |
| token: A @18 |
| element: package:test/a.dart::@class::A |
| staticType: null |
| arguments: ArgumentList |
| leftParenthesis: ( @19 |
| arguments |
| NamedExpression |
| name: Label |
| label: SimpleIdentifier |
| token: value @20 |
| element: package:test/a.dart::@class::A::@constructor::new::@formalParameter::value |
| staticType: null |
| colon: : @25 |
| expression: IntegerLiteral |
| literal: 42 @27 |
| staticType: int |
| rightParenthesis: ) @29 |
| element: package:test/a.dart::@class::A::@constructor::new |
| returnType: void |
| '''); |
| } |
| |
| test_metadata_constructorDeclaration_named() async { |
| var library = await buildLibrary( |
| 'const a = null; class C { @a C.named(); }', |
| ); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class C (nameOffset:22) (firstTokenOffset:16) (offset:22) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 named (nameOffset:31) (firstTokenOffset:26) (offset:31) |
| element: <testLibrary>::@class::C::@constructor::named |
| metadata |
| Annotation |
| atSign: @ @26 |
| name: SimpleIdentifier |
| token: a @27 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| typeName: C |
| typeNameOffset: 29 |
| periodOffset: 30 |
| topLevelVariables |
| #F3 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| NullLiteral |
| literal: null @10 |
| staticType: Null |
| getters |
| #F4 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| named |
| reference: <testLibrary>::@class::C::@constructor::named |
| firstFragment: #F2 |
| metadata |
| Annotation |
| atSign: @ @26 |
| name: SimpleIdentifier |
| token: a @27 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F3 |
| type: dynamic |
| constantInitializer |
| fragment: #F3 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F4 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::a |
| '''); |
| } |
| |
| test_metadata_constructorDeclaration_unnamed() async { |
| var library = await buildLibrary('const a = null; class C { @a C(); }'); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class C (nameOffset:22) (firstTokenOffset:16) (offset:22) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 new (nameOffset:<null>) (firstTokenOffset:26) (offset:29) |
| element: <testLibrary>::@class::C::@constructor::new |
| metadata |
| Annotation |
| atSign: @ @26 |
| name: SimpleIdentifier |
| token: a @27 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| typeName: C |
| typeNameOffset: 29 |
| topLevelVariables |
| #F3 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| NullLiteral |
| literal: null @10 |
| staticType: Null |
| getters |
| #F4 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| metadata |
| Annotation |
| atSign: @ @26 |
| name: SimpleIdentifier |
| token: a @27 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F3 |
| type: dynamic |
| constantInitializer |
| fragment: #F3 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F4 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::a |
| '''); |
| } |
| |
| test_metadata_exportDirective() async { |
| newFile('$testPackageLibPath/foo.dart', ''); |
| |
| var library = await buildLibrary(''' |
| @a |
| export 'foo.dart'; |
| const a = 0; |
| '''); |
| |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| metadata |
| Annotation |
| atSign: @ @0 |
| name: SimpleIdentifier |
| token: a @1 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| libraryExports |
| package:test/foo.dart |
| metadata |
| Annotation |
| atSign: @ @0 |
| name: SimpleIdentifier |
| token: a @1 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| topLevelVariables |
| #F1 hasInitializer a (nameOffset:28) (firstTokenOffset:28) (offset:28) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| IntegerLiteral |
| literal: 0 @32 |
| staticType: int |
| getters |
| #F2 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28) |
| element: <testLibrary>::@getter::a |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F1 |
| type: int |
| constantInitializer |
| fragment: #F1 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F2 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::a |
| '''); |
| } |
| |
| test_metadata_fieldDeclaration() async { |
| var library = await buildLibrary('const a = null; class C { @a int x; }'); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class C (nameOffset:22) (firstTokenOffset:16) (offset:22) |
| element: <testLibrary>::@class::C |
| fields |
| #F2 x (nameOffset:33) (firstTokenOffset:33) (offset:33) |
| element: <testLibrary>::@class::C::@field::x |
| constructors |
| #F3 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| getters |
| #F4 synthetic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33) |
| element: <testLibrary>::@class::C::@getter::x |
| setters |
| #F5 synthetic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33) |
| element: <testLibrary>::@class::C::@setter::x |
| formalParameters |
| #F6 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33) |
| element: <testLibrary>::@class::C::@setter::x::@formalParameter::value |
| topLevelVariables |
| #F7 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| NullLiteral |
| literal: null @10 |
| staticType: Null |
| getters |
| #F8 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| classes |
| hasNonFinalField class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| fields |
| x |
| reference: <testLibrary>::@class::C::@field::x |
| firstFragment: #F2 |
| type: int |
| getter: <testLibrary>::@class::C::@getter::x |
| setter: <testLibrary>::@class::C::@setter::x |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F3 |
| getters |
| synthetic x |
| reference: <testLibrary>::@class::C::@getter::x |
| firstFragment: #F4 |
| returnType: int |
| variable: <testLibrary>::@class::C::@field::x |
| setters |
| synthetic x |
| reference: <testLibrary>::@class::C::@setter::x |
| firstFragment: #F5 |
| formalParameters |
| #E0 requiredPositional value |
| firstFragment: #F6 |
| type: int |
| returnType: void |
| variable: <testLibrary>::@class::C::@field::x |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F7 |
| type: dynamic |
| constantInitializer |
| fragment: #F7 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F8 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::a |
| '''); |
| } |
| |
| test_metadata_fieldFormalParameter() async { |
| var library = await buildLibrary(''' |
| const a = null; |
| class C { |
| var x; |
| C(@a this.x); |
| } |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class C (nameOffset:22) (firstTokenOffset:16) (offset:22) |
| element: <testLibrary>::@class::C |
| fields |
| #F2 x (nameOffset:32) (firstTokenOffset:32) (offset:32) |
| element: <testLibrary>::@class::C::@field::x |
| constructors |
| #F3 new (nameOffset:<null>) (firstTokenOffset:37) (offset:37) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| typeNameOffset: 37 |
| formalParameters |
| #F4 this.x (nameOffset:47) (firstTokenOffset:39) (offset:47) |
| element: <testLibrary>::@class::C::@constructor::new::@formalParameter::x |
| metadata |
| Annotation |
| atSign: @ @39 |
| name: SimpleIdentifier |
| token: a @40 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| getters |
| #F5 synthetic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32) |
| element: <testLibrary>::@class::C::@getter::x |
| setters |
| #F6 synthetic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32) |
| element: <testLibrary>::@class::C::@setter::x |
| formalParameters |
| #F7 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32) |
| element: <testLibrary>::@class::C::@setter::x::@formalParameter::value |
| topLevelVariables |
| #F8 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| NullLiteral |
| literal: null @10 |
| staticType: Null |
| getters |
| #F9 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| classes |
| hasNonFinalField class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| fields |
| x |
| reference: <testLibrary>::@class::C::@field::x |
| firstFragment: #F2 |
| type: dynamic |
| getter: <testLibrary>::@class::C::@getter::x |
| setter: <testLibrary>::@class::C::@setter::x |
| constructors |
| new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F3 |
| formalParameters |
| #E0 requiredPositional final hasImplicitType x |
| firstFragment: #F4 |
| type: dynamic |
| metadata |
| Annotation |
| atSign: @ @39 |
| name: SimpleIdentifier |
| token: a @40 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| getters |
| synthetic x |
| reference: <testLibrary>::@class::C::@getter::x |
| firstFragment: #F5 |
| returnType: dynamic |
| variable: <testLibrary>::@class::C::@field::x |
| setters |
| synthetic x |
| reference: <testLibrary>::@class::C::@setter::x |
| firstFragment: #F6 |
| formalParameters |
| #E1 requiredPositional value |
| firstFragment: #F7 |
| type: dynamic |
| returnType: void |
| variable: <testLibrary>::@class::C::@field::x |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F8 |
| type: dynamic |
| constantInitializer |
| fragment: #F8 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F9 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::a |
| '''); |
| } |
| |
| test_metadata_fieldFormalParameter_withDefault() async { |
| var library = await buildLibrary( |
| 'const a = null; class C { var x; C([@a this.x = null]); }', |
| ); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class C (nameOffset:22) (firstTokenOffset:16) (offset:22) |
| element: <testLibrary>::@class::C |
| fields |
| #F2 x (nameOffset:30) (firstTokenOffset:30) (offset:30) |
| element: <testLibrary>::@class::C::@field::x |
| constructors |
| #F3 new (nameOffset:<null>) (firstTokenOffset:33) (offset:33) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| typeNameOffset: 33 |
| formalParameters |
| #F4 this.x (nameOffset:44) (firstTokenOffset:36) (offset:44) |
| element: <testLibrary>::@class::C::@constructor::new::@formalParameter::x |
| metadata |
| Annotation |
| atSign: @ @36 |
| name: SimpleIdentifier |
| token: a @37 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| initializer: expression_0 |
| NullLiteral |
| literal: null @48 |
| staticType: Null |
| getters |
| #F5 synthetic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30) |
| element: <testLibrary>::@class::C::@getter::x |
| setters |
| #F6 synthetic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30) |
| element: <testLibrary>::@class::C::@setter::x |
| formalParameters |
| #F7 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30) |
| element: <testLibrary>::@class::C::@setter::x::@formalParameter::value |
| topLevelVariables |
| #F8 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_1 |
| NullLiteral |
| literal: null @10 |
| staticType: Null |
| getters |
| #F9 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| classes |
| hasNonFinalField class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| fields |
| x |
| reference: <testLibrary>::@class::C::@field::x |
| firstFragment: #F2 |
| type: dynamic |
| getter: <testLibrary>::@class::C::@getter::x |
| setter: <testLibrary>::@class::C::@setter::x |
| constructors |
| new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F3 |
| formalParameters |
| #E0 optionalPositional final hasImplicitType x |
| firstFragment: #F4 |
| type: dynamic |
| metadata |
| Annotation |
| atSign: @ @36 |
| name: SimpleIdentifier |
| token: a @37 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| constantInitializer |
| fragment: #F4 |
| expression: expression_0 |
| getters |
| synthetic x |
| reference: <testLibrary>::@class::C::@getter::x |
| firstFragment: #F5 |
| returnType: dynamic |
| variable: <testLibrary>::@class::C::@field::x |
| setters |
| synthetic x |
| reference: <testLibrary>::@class::C::@setter::x |
| firstFragment: #F6 |
| formalParameters |
| #E1 requiredPositional value |
| firstFragment: #F7 |
| type: dynamic |
| returnType: void |
| variable: <testLibrary>::@class::C::@field::x |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F8 |
| type: dynamic |
| constantInitializer |
| fragment: #F8 |
| expression: expression_1 |
| getter: <testLibrary>::@getter::a |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F9 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::a |
| '''); |
| } |
| |
| test_metadata_functionDeclaration_function() async { |
| var library = await buildLibrary(''' |
| const a = null; |
| @a |
| f() {} |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| topLevelVariables |
| #F1 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| NullLiteral |
| literal: null @10 |
| staticType: Null |
| getters |
| #F2 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| functions |
| #F3 f (nameOffset:19) (firstTokenOffset:16) (offset:19) |
| element: <testLibrary>::@function::f |
| metadata |
| Annotation |
| atSign: @ @16 |
| name: SimpleIdentifier |
| token: a @17 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F1 |
| type: dynamic |
| constantInitializer |
| fragment: #F1 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F2 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::a |
| functions |
| f |
| reference: <testLibrary>::@function::f |
| firstFragment: #F3 |
| metadata |
| Annotation |
| atSign: @ @16 |
| name: SimpleIdentifier |
| token: a @17 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| returnType: dynamic |
| '''); |
| } |
| |
| test_metadata_functionDeclaration_getter() async { |
| var library = await buildLibrary('const a = null; @a get f => null;'); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| topLevelVariables |
| #F1 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| NullLiteral |
| literal: null @10 |
| staticType: Null |
| #F2 synthetic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23) |
| element: <testLibrary>::@topLevelVariable::f |
| getters |
| #F3 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| #F4 f (nameOffset:23) (firstTokenOffset:16) (offset:23) |
| element: <testLibrary>::@getter::f |
| metadata |
| Annotation |
| atSign: @ @16 |
| name: SimpleIdentifier |
| token: a @17 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F1 |
| type: dynamic |
| constantInitializer |
| fragment: #F1 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| synthetic f |
| reference: <testLibrary>::@topLevelVariable::f |
| firstFragment: #F2 |
| type: dynamic |
| getter: <testLibrary>::@getter::f |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F3 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::a |
| static f |
| reference: <testLibrary>::@getter::f |
| firstFragment: #F4 |
| metadata |
| Annotation |
| atSign: @ @16 |
| name: SimpleIdentifier |
| token: a @17 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::f |
| '''); |
| } |
| |
| test_metadata_functionDeclaration_setter() async { |
| var library = await buildLibrary('const a = null; @a set f(value) {}'); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| topLevelVariables |
| #F1 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| NullLiteral |
| literal: null @10 |
| staticType: Null |
| #F2 synthetic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23) |
| element: <testLibrary>::@topLevelVariable::f |
| getters |
| #F3 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| setters |
| #F4 f (nameOffset:23) (firstTokenOffset:16) (offset:23) |
| element: <testLibrary>::@setter::f |
| metadata |
| Annotation |
| atSign: @ @16 |
| name: SimpleIdentifier |
| token: a @17 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| formalParameters |
| #F5 value (nameOffset:25) (firstTokenOffset:25) (offset:25) |
| element: <testLibrary>::@setter::f::@formalParameter::value |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F1 |
| type: dynamic |
| constantInitializer |
| fragment: #F1 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| synthetic f |
| reference: <testLibrary>::@topLevelVariable::f |
| firstFragment: #F2 |
| type: dynamic |
| setter: <testLibrary>::@setter::f |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F3 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::a |
| setters |
| static f |
| reference: <testLibrary>::@setter::f |
| firstFragment: #F4 |
| metadata |
| Annotation |
| atSign: @ @16 |
| name: SimpleIdentifier |
| token: a @17 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| formalParameters |
| #E0 requiredPositional hasImplicitType value |
| firstFragment: #F5 |
| type: dynamic |
| returnType: void |
| variable: <testLibrary>::@topLevelVariable::f |
| '''); |
| } |
| |
| test_metadata_functionTypeAlias() async { |
| var library = await buildLibrary('const a = null; @a typedef F();'); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| typeAliases |
| #F1 F (nameOffset:27) (firstTokenOffset:16) (offset:27) |
| element: <testLibrary>::@typeAlias::F |
| metadata |
| Annotation |
| atSign: @ @16 |
| name: SimpleIdentifier |
| token: a @17 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| topLevelVariables |
| #F2 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| NullLiteral |
| literal: null @10 |
| staticType: Null |
| getters |
| #F3 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| typeAliases |
| F |
| reference: <testLibrary>::@typeAlias::F |
| firstFragment: #F1 |
| metadata |
| Annotation |
| atSign: @ @16 |
| name: SimpleIdentifier |
| token: a @17 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| aliasedType: dynamic Function() |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F2 |
| type: dynamic |
| constantInitializer |
| fragment: #F2 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F3 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::a |
| '''); |
| } |
| |
| test_metadata_functionTypedFormalParameter() async { |
| var library = await buildLibrary('const a = null; f(@a g()) {}'); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| topLevelVariables |
| #F1 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| NullLiteral |
| literal: null @10 |
| staticType: Null |
| getters |
| #F2 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| functions |
| #F3 f (nameOffset:16) (firstTokenOffset:16) (offset:16) |
| element: <testLibrary>::@function::f |
| formalParameters |
| #F4 g (nameOffset:21) (firstTokenOffset:18) (offset:21) |
| element: <testLibrary>::@function::f::@formalParameter::g |
| metadata |
| Annotation |
| atSign: @ @18 |
| name: SimpleIdentifier |
| token: a @19 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F1 |
| type: dynamic |
| constantInitializer |
| fragment: #F1 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F2 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::a |
| functions |
| f |
| reference: <testLibrary>::@function::f |
| firstFragment: #F3 |
| formalParameters |
| #E0 requiredPositional g |
| firstFragment: #F4 |
| type: dynamic Function() |
| metadata |
| Annotation |
| atSign: @ @18 |
| name: SimpleIdentifier |
| token: a @19 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| returnType: dynamic |
| '''); |
| } |
| |
| test_metadata_functionTypedFormalParameter_withDefault() async { |
| var library = await buildLibrary('const a = null; f([@a g() = null]) {}'); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| topLevelVariables |
| #F1 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| NullLiteral |
| literal: null @10 |
| staticType: Null |
| getters |
| #F2 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| functions |
| #F3 f (nameOffset:16) (firstTokenOffset:16) (offset:16) |
| element: <testLibrary>::@function::f |
| formalParameters |
| #F4 g (nameOffset:22) (firstTokenOffset:19) (offset:22) |
| element: <testLibrary>::@function::f::@formalParameter::g |
| metadata |
| Annotation |
| atSign: @ @19 |
| name: SimpleIdentifier |
| token: a @20 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| initializer: expression_1 |
| NullLiteral |
| literal: null @28 |
| staticType: Null |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F1 |
| type: dynamic |
| constantInitializer |
| fragment: #F1 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F2 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::a |
| functions |
| f |
| reference: <testLibrary>::@function::f |
| firstFragment: #F3 |
| formalParameters |
| #E0 optionalPositional g |
| firstFragment: #F4 |
| type: dynamic Function() |
| metadata |
| Annotation |
| atSign: @ @19 |
| name: SimpleIdentifier |
| token: a @20 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| constantInitializer |
| fragment: #F4 |
| expression: expression_1 |
| returnType: dynamic |
| '''); |
| } |
| |
| test_metadata_genericTypeAlias() async { |
| var library = await buildLibrary(r''' |
| const a = null; |
| const b = null; |
| @a |
| @b |
| typedef F = void Function();'''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| typeAliases |
| #F1 F (nameOffset:46) (firstTokenOffset:32) (offset:46) |
| element: <testLibrary>::@typeAlias::F |
| metadata |
| Annotation |
| atSign: @ @32 |
| name: SimpleIdentifier |
| token: a @33 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| Annotation |
| atSign: @ @35 |
| name: SimpleIdentifier |
| token: b @36 |
| element: <testLibrary>::@getter::b |
| staticType: null |
| element: <testLibrary>::@getter::b |
| topLevelVariables |
| #F2 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| NullLiteral |
| literal: null @10 |
| staticType: Null |
| #F3 hasInitializer b (nameOffset:22) (firstTokenOffset:22) (offset:22) |
| element: <testLibrary>::@topLevelVariable::b |
| initializer: expression_1 |
| NullLiteral |
| literal: null @26 |
| staticType: Null |
| getters |
| #F4 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| #F5 synthetic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22) |
| element: <testLibrary>::@getter::b |
| typeAliases |
| F |
| reference: <testLibrary>::@typeAlias::F |
| firstFragment: #F1 |
| metadata |
| Annotation |
| atSign: @ @32 |
| name: SimpleIdentifier |
| token: a @33 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| Annotation |
| atSign: @ @35 |
| name: SimpleIdentifier |
| token: b @36 |
| element: <testLibrary>::@getter::b |
| staticType: null |
| element: <testLibrary>::@getter::b |
| aliasedType: void Function() |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F2 |
| type: dynamic |
| constantInitializer |
| fragment: #F2 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| const hasInitializer b |
| reference: <testLibrary>::@topLevelVariable::b |
| firstFragment: #F3 |
| type: dynamic |
| constantInitializer |
| fragment: #F3 |
| expression: expression_1 |
| getter: <testLibrary>::@getter::b |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F4 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::a |
| synthetic static b |
| reference: <testLibrary>::@getter::b |
| firstFragment: #F5 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::b |
| '''); |
| } |
| |
| test_metadata_importDirective() async { |
| newFile('$testPackageLibPath/foo.dart', ''); |
| |
| var library = await buildLibrary(''' |
| @a |
| import 'foo.dart'; |
| const a = 0; |
| '''); |
| |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| metadata |
| Annotation |
| atSign: @ @0 |
| name: SimpleIdentifier |
| token: a @1 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| libraryImports |
| package:test/foo.dart |
| metadata |
| Annotation |
| atSign: @ @0 |
| name: SimpleIdentifier |
| token: a @1 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| topLevelVariables |
| #F1 hasInitializer a (nameOffset:28) (firstTokenOffset:28) (offset:28) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| IntegerLiteral |
| literal: 0 @32 |
| staticType: int |
| getters |
| #F2 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28) |
| element: <testLibrary>::@getter::a |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F1 |
| type: int |
| constantInitializer |
| fragment: #F1 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F2 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::a |
| '''); |
| } |
| |
| test_metadata_inAliasedElement_formalParameter() async { |
| var library = await buildLibrary(''' |
| const a = 42; |
| typedef F = void Function(@a int first) |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| typeAliases |
| #F1 F (nameOffset:22) (firstTokenOffset:14) (offset:22) |
| element: <testLibrary>::@typeAlias::F |
| topLevelVariables |
| #F2 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| IntegerLiteral |
| literal: 42 @10 |
| staticType: int |
| getters |
| #F3 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| typeAliases |
| F |
| reference: <testLibrary>::@typeAlias::F |
| firstFragment: #F1 |
| aliasedType: void Function(int) |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F2 |
| type: int |
| constantInitializer |
| fragment: #F2 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F3 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::a |
| '''); |
| } |
| |
| test_metadata_inAliasedElement_formalParameter2() async { |
| var library = await buildLibrary(''' |
| const a = 42; |
| typedef F = void Function(int foo(@a int bar)) |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| typeAliases |
| #F1 F (nameOffset:22) (firstTokenOffset:14) (offset:22) |
| element: <testLibrary>::@typeAlias::F |
| topLevelVariables |
| #F2 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| IntegerLiteral |
| literal: 42 @10 |
| staticType: int |
| getters |
| #F3 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| typeAliases |
| F |
| reference: <testLibrary>::@typeAlias::F |
| firstFragment: #F1 |
| aliasedType: void Function(int Function(int)) |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F2 |
| type: int |
| constantInitializer |
| fragment: #F2 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F3 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::a |
| '''); |
| } |
| |
| test_metadata_inAliasedElement_typeParameter() async { |
| var library = await buildLibrary(''' |
| const a = 42; |
| typedef F = void Function<@a T>(int first) |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| typeAliases |
| #F1 F (nameOffset:22) (firstTokenOffset:14) (offset:22) |
| element: <testLibrary>::@typeAlias::F |
| topLevelVariables |
| #F2 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| IntegerLiteral |
| literal: 42 @10 |
| staticType: int |
| getters |
| #F3 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| typeAliases |
| F |
| reference: <testLibrary>::@typeAlias::F |
| firstFragment: #F1 |
| aliasedType: void Function<T>(int) |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F2 |
| type: int |
| constantInitializer |
| fragment: #F2 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F3 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::a |
| '''); |
| } |
| |
| test_metadata_invalid_classDeclaration() async { |
| var library = await buildLibrary('f(_) {} @f(42) class C {}'); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class C (nameOffset:21) (firstTokenOffset:8) (offset:21) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| functions |
| #F3 f (nameOffset:0) (firstTokenOffset:0) (offset:0) |
| element: <testLibrary>::@function::f |
| formalParameters |
| #F4 _ (nameOffset:2) (firstTokenOffset:2) (offset:2) |
| element: <testLibrary>::@function::f::@formalParameter::_ |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| functions |
| f |
| reference: <testLibrary>::@function::f |
| firstFragment: #F3 |
| formalParameters |
| #E0 requiredPositional hasImplicitType _ |
| firstFragment: #F4 |
| type: dynamic |
| returnType: dynamic |
| '''); |
| } |
| |
| test_metadata_library_part() async { |
| newFile('$testPackageLibPath/a.dart', r''' |
| part of 'test.dart'; |
| '''); |
| var library = await buildLibrary(''' |
| @deprecated |
| part 'a.dart'; |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| metadata |
| Annotation |
| atSign: @ @0 |
| name: SimpleIdentifier |
| token: deprecated @1 |
| element: dart:core::@getter::deprecated |
| staticType: null |
| element: dart:core::@getter::deprecated |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| nextFragment: #F1 |
| parts |
| part_0 |
| uri: package:test/a.dart |
| partKeywordOffset: 12 |
| metadata |
| Annotation |
| atSign: @ @0 |
| name: SimpleIdentifier |
| token: deprecated @1 |
| element: dart:core::@getter::deprecated |
| staticType: null |
| element: dart:core::@getter::deprecated |
| unit: #F1 |
| #F1 package:test/a.dart |
| element: <testLibrary> |
| enclosingFragment: #F0 |
| previousFragment: #F0 |
| '''); |
| } |
| |
| /// Even though the target is not a part, metadata is available. |
| test_metadata_library_part_notPart() async { |
| var library = await buildLibrary(''' |
| @deprecated |
| part 'dart:math'; |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| metadata |
| Annotation |
| atSign: @ @0 |
| name: SimpleIdentifier |
| token: deprecated @1 |
| element: dart:core::@getter::deprecated |
| staticType: null |
| element: dart:core::@getter::deprecated |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| parts |
| part_0 |
| uri: source 'dart:math' |
| partKeywordOffset: 12 |
| metadata |
| Annotation |
| atSign: @ @0 |
| name: SimpleIdentifier |
| token: deprecated @1 |
| element: dart:core::@getter::deprecated |
| staticType: null |
| element: dart:core::@getter::deprecated |
| '''); |
| } |
| |
| test_metadata_libraryDirective() async { |
| var library = await buildLibrary('@a library L; const a = null;'); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| name: L |
| metadata |
| Annotation |
| atSign: @ @0 |
| name: SimpleIdentifier |
| token: a @1 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| fragments |
| #F0 <testLibraryFragment> (nameOffset:<null>) (firstTokenOffset:0) (offset:11) |
| element: <testLibrary> |
| topLevelVariables |
| #F1 hasInitializer a (nameOffset:20) (firstTokenOffset:20) (offset:20) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| NullLiteral |
| literal: null @24 |
| staticType: Null |
| getters |
| #F2 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20) |
| element: <testLibrary>::@getter::a |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F1 |
| type: dynamic |
| constantInitializer |
| fragment: #F1 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F2 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::a |
| '''); |
| } |
| |
| test_metadata_methodDeclaration_getter() async { |
| var library = await buildLibrary( |
| 'const a = null; class C { @a get m => null; }', |
| ); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class C (nameOffset:22) (firstTokenOffset:16) (offset:22) |
| element: <testLibrary>::@class::C |
| fields |
| #F2 synthetic m (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22) |
| element: <testLibrary>::@class::C::@field::m |
| constructors |
| #F3 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| getters |
| #F4 m (nameOffset:33) (firstTokenOffset:26) (offset:33) |
| element: <testLibrary>::@class::C::@getter::m |
| metadata |
| Annotation |
| atSign: @ @26 |
| name: SimpleIdentifier |
| token: a @27 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| topLevelVariables |
| #F5 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| NullLiteral |
| literal: null @10 |
| staticType: Null |
| getters |
| #F6 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| fields |
| synthetic m |
| reference: <testLibrary>::@class::C::@field::m |
| firstFragment: #F2 |
| type: dynamic |
| getter: <testLibrary>::@class::C::@getter::m |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F3 |
| getters |
| m |
| reference: <testLibrary>::@class::C::@getter::m |
| firstFragment: #F4 |
| metadata |
| Annotation |
| atSign: @ @26 |
| name: SimpleIdentifier |
| token: a @27 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| returnType: dynamic |
| variable: <testLibrary>::@class::C::@field::m |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F5 |
| type: dynamic |
| constantInitializer |
| fragment: #F5 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F6 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::a |
| '''); |
| } |
| |
| test_metadata_methodDeclaration_method() async { |
| var library = await buildLibrary(r''' |
| const a = null; |
| const b = null; |
| class C { |
| @a |
| @b |
| m() {} |
| } |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class C (nameOffset:38) (firstTokenOffset:32) (offset:38) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| methods |
| #F3 m (nameOffset:54) (firstTokenOffset:44) (offset:54) |
| element: <testLibrary>::@class::C::@method::m |
| metadata |
| Annotation |
| atSign: @ @44 |
| name: SimpleIdentifier |
| token: a @45 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| Annotation |
| atSign: @ @49 |
| name: SimpleIdentifier |
| token: b @50 |
| element: <testLibrary>::@getter::b |
| staticType: null |
| element: <testLibrary>::@getter::b |
| topLevelVariables |
| #F4 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| NullLiteral |
| literal: null @10 |
| staticType: Null |
| #F5 hasInitializer b (nameOffset:22) (firstTokenOffset:22) (offset:22) |
| element: <testLibrary>::@topLevelVariable::b |
| initializer: expression_1 |
| NullLiteral |
| literal: null @26 |
| staticType: Null |
| getters |
| #F6 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| #F7 synthetic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22) |
| element: <testLibrary>::@getter::b |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| methods |
| m |
| reference: <testLibrary>::@class::C::@method::m |
| firstFragment: #F3 |
| metadata |
| Annotation |
| atSign: @ @44 |
| name: SimpleIdentifier |
| token: a @45 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| Annotation |
| atSign: @ @49 |
| name: SimpleIdentifier |
| token: b @50 |
| element: <testLibrary>::@getter::b |
| staticType: null |
| element: <testLibrary>::@getter::b |
| returnType: dynamic |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F4 |
| type: dynamic |
| constantInitializer |
| fragment: #F4 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| const hasInitializer b |
| reference: <testLibrary>::@topLevelVariable::b |
| firstFragment: #F5 |
| type: dynamic |
| constantInitializer |
| fragment: #F5 |
| expression: expression_1 |
| getter: <testLibrary>::@getter::b |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F6 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::a |
| synthetic static b |
| reference: <testLibrary>::@getter::b |
| firstFragment: #F7 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::b |
| '''); |
| } |
| |
| test_metadata_methodDeclaration_method_mixin() async { |
| var library = await buildLibrary(r''' |
| const a = null; |
| const b = null; |
| mixin M { |
| @a |
| @b |
| m() {} |
| } |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| mixins |
| #F1 mixin M (nameOffset:38) (firstTokenOffset:32) (offset:38) |
| element: <testLibrary>::@mixin::M |
| methods |
| #F2 m (nameOffset:54) (firstTokenOffset:44) (offset:54) |
| element: <testLibrary>::@mixin::M::@method::m |
| metadata |
| Annotation |
| atSign: @ @44 |
| name: SimpleIdentifier |
| token: a @45 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| Annotation |
| atSign: @ @49 |
| name: SimpleIdentifier |
| token: b @50 |
| element: <testLibrary>::@getter::b |
| staticType: null |
| element: <testLibrary>::@getter::b |
| topLevelVariables |
| #F3 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| NullLiteral |
| literal: null @10 |
| staticType: Null |
| #F4 hasInitializer b (nameOffset:22) (firstTokenOffset:22) (offset:22) |
| element: <testLibrary>::@topLevelVariable::b |
| initializer: expression_1 |
| NullLiteral |
| literal: null @26 |
| staticType: Null |
| getters |
| #F5 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| #F6 synthetic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22) |
| element: <testLibrary>::@getter::b |
| mixins |
| mixin M |
| reference: <testLibrary>::@mixin::M |
| firstFragment: #F1 |
| superclassConstraints |
| Object |
| methods |
| m |
| reference: <testLibrary>::@mixin::M::@method::m |
| firstFragment: #F2 |
| metadata |
| Annotation |
| atSign: @ @44 |
| name: SimpleIdentifier |
| token: a @45 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| Annotation |
| atSign: @ @49 |
| name: SimpleIdentifier |
| token: b @50 |
| element: <testLibrary>::@getter::b |
| staticType: null |
| element: <testLibrary>::@getter::b |
| returnType: dynamic |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F3 |
| type: dynamic |
| constantInitializer |
| fragment: #F3 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| const hasInitializer b |
| reference: <testLibrary>::@topLevelVariable::b |
| firstFragment: #F4 |
| type: dynamic |
| constantInitializer |
| fragment: #F4 |
| expression: expression_1 |
| getter: <testLibrary>::@getter::b |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F5 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::a |
| synthetic static b |
| reference: <testLibrary>::@getter::b |
| firstFragment: #F6 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::b |
| '''); |
| } |
| |
| test_metadata_methodDeclaration_setter() async { |
| var library = await buildLibrary(''' |
| const a = null; |
| class C { |
| @a |
| set m(value) {} |
| } |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class C (nameOffset:22) (firstTokenOffset:16) (offset:22) |
| element: <testLibrary>::@class::C |
| fields |
| #F2 synthetic m (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22) |
| element: <testLibrary>::@class::C::@field::m |
| constructors |
| #F3 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| setters |
| #F4 m (nameOffset:37) (firstTokenOffset:28) (offset:37) |
| element: <testLibrary>::@class::C::@setter::m |
| metadata |
| Annotation |
| atSign: @ @28 |
| name: SimpleIdentifier |
| token: a @29 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| formalParameters |
| #F5 value (nameOffset:39) (firstTokenOffset:39) (offset:39) |
| element: <testLibrary>::@class::C::@setter::m::@formalParameter::value |
| topLevelVariables |
| #F6 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| NullLiteral |
| literal: null @10 |
| staticType: Null |
| getters |
| #F7 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| fields |
| synthetic m |
| reference: <testLibrary>::@class::C::@field::m |
| firstFragment: #F2 |
| type: dynamic |
| setter: <testLibrary>::@class::C::@setter::m |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F3 |
| setters |
| m |
| reference: <testLibrary>::@class::C::@setter::m |
| firstFragment: #F4 |
| metadata |
| Annotation |
| atSign: @ @28 |
| name: SimpleIdentifier |
| token: a @29 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| formalParameters |
| #E0 requiredPositional hasImplicitType value |
| firstFragment: #F5 |
| type: dynamic |
| returnType: void |
| variable: <testLibrary>::@class::C::@field::m |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F6 |
| type: dynamic |
| constantInitializer |
| fragment: #F6 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F7 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::a |
| '''); |
| } |
| |
| test_metadata_mixin_scope() async { |
| var library = await buildLibrary(r''' |
| const foo = 0; |
| |
| @foo |
| mixin M<@foo T> { |
| static const foo = 1; |
| @foo |
| void bar() {} |
| } |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| mixins |
| #F1 mixin M (nameOffset:27) (firstTokenOffset:16) (offset:27) |
| element: <testLibrary>::@mixin::M |
| typeParameters |
| #F2 T (nameOffset:34) (firstTokenOffset:29) (offset:34) |
| element: #E0 T |
| metadata |
| Annotation |
| atSign: @ @29 |
| name: SimpleIdentifier |
| token: foo @30 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| fields |
| #F3 hasInitializer foo (nameOffset:54) (firstTokenOffset:54) (offset:54) |
| element: <testLibrary>::@mixin::M::@field::foo |
| initializer: expression_0 |
| IntegerLiteral |
| literal: 1 @60 |
| staticType: int |
| getters |
| #F4 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:54) |
| element: <testLibrary>::@mixin::M::@getter::foo |
| methods |
| #F5 bar (nameOffset:77) (firstTokenOffset:65) (offset:77) |
| element: <testLibrary>::@mixin::M::@method::bar |
| metadata |
| Annotation |
| atSign: @ @65 |
| name: SimpleIdentifier |
| token: foo @66 |
| element: <testLibrary>::@mixin::M::@getter::foo |
| staticType: null |
| element: <testLibrary>::@mixin::M::@getter::foo |
| topLevelVariables |
| #F6 hasInitializer foo (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::foo |
| initializer: expression_1 |
| IntegerLiteral |
| literal: 0 @12 |
| staticType: int |
| getters |
| #F7 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::foo |
| mixins |
| mixin M |
| reference: <testLibrary>::@mixin::M |
| firstFragment: #F1 |
| typeParameters |
| #E0 T |
| firstFragment: #F2 |
| metadata |
| Annotation |
| atSign: @ @29 |
| name: SimpleIdentifier |
| token: foo @30 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| superclassConstraints |
| Object |
| fields |
| static const hasInitializer foo |
| reference: <testLibrary>::@mixin::M::@field::foo |
| firstFragment: #F3 |
| type: int |
| constantInitializer |
| fragment: #F3 |
| expression: expression_0 |
| getter: <testLibrary>::@mixin::M::@getter::foo |
| getters |
| synthetic static foo |
| reference: <testLibrary>::@mixin::M::@getter::foo |
| firstFragment: #F4 |
| returnType: int |
| variable: <testLibrary>::@mixin::M::@field::foo |
| methods |
| bar |
| reference: <testLibrary>::@mixin::M::@method::bar |
| firstFragment: #F5 |
| metadata |
| Annotation |
| atSign: @ @65 |
| name: SimpleIdentifier |
| token: foo @66 |
| element: <testLibrary>::@mixin::M::@getter::foo |
| staticType: null |
| element: <testLibrary>::@mixin::M::@getter::foo |
| returnType: void |
| topLevelVariables |
| const hasInitializer foo |
| reference: <testLibrary>::@topLevelVariable::foo |
| firstFragment: #F6 |
| type: int |
| constantInitializer |
| fragment: #F6 |
| expression: expression_1 |
| getter: <testLibrary>::@getter::foo |
| getters |
| synthetic static foo |
| reference: <testLibrary>::@getter::foo |
| firstFragment: #F7 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::foo |
| '''); |
| } |
| |
| test_metadata_mixinDeclaration() async { |
| var library = await buildLibrary(r''' |
| const a = null; |
| const b = null; |
| @a |
| @b |
| mixin M {}'''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| mixins |
| #F1 mixin M (nameOffset:44) (firstTokenOffset:32) (offset:44) |
| element: <testLibrary>::@mixin::M |
| topLevelVariables |
| #F2 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| NullLiteral |
| literal: null @10 |
| staticType: Null |
| #F3 hasInitializer b (nameOffset:22) (firstTokenOffset:22) (offset:22) |
| element: <testLibrary>::@topLevelVariable::b |
| initializer: expression_1 |
| NullLiteral |
| literal: null @26 |
| staticType: Null |
| getters |
| #F4 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| #F5 synthetic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22) |
| element: <testLibrary>::@getter::b |
| mixins |
| mixin M |
| reference: <testLibrary>::@mixin::M |
| firstFragment: #F1 |
| superclassConstraints |
| Object |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F2 |
| type: dynamic |
| constantInitializer |
| fragment: #F2 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| const hasInitializer b |
| reference: <testLibrary>::@topLevelVariable::b |
| firstFragment: #F3 |
| type: dynamic |
| constantInitializer |
| fragment: #F3 |
| expression: expression_1 |
| getter: <testLibrary>::@getter::b |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F4 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::a |
| synthetic static b |
| reference: <testLibrary>::@getter::b |
| firstFragment: #F5 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::b |
| '''); |
| } |
| |
| test_metadata_offsets_onClass() async { |
| var library = await buildLibrary(r''' |
| const foo = 0; |
| |
| @foo |
| class A<@foo T> {} |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class A (nameOffset:27) (firstTokenOffset:16) (offset:27) |
| element: <testLibrary>::@class::A |
| typeParameters |
| #F2 T (nameOffset:34) (firstTokenOffset:29) (offset:34) |
| element: #E0 T |
| metadata |
| Annotation |
| atSign: @ @29 |
| name: SimpleIdentifier |
| token: foo @30 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| constructors |
| #F3 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27) |
| element: <testLibrary>::@class::A::@constructor::new |
| typeName: A |
| topLevelVariables |
| #F4 hasInitializer foo (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::foo |
| initializer: expression_0 |
| IntegerLiteral |
| literal: 0 @12 |
| staticType: int |
| getters |
| #F5 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::foo |
| classes |
| class A |
| reference: <testLibrary>::@class::A |
| firstFragment: #F1 |
| typeParameters |
| #E0 T |
| firstFragment: #F2 |
| metadata |
| Annotation |
| atSign: @ @29 |
| name: SimpleIdentifier |
| token: foo @30 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::A::@constructor::new |
| firstFragment: #F3 |
| topLevelVariables |
| const hasInitializer foo |
| reference: <testLibrary>::@topLevelVariable::foo |
| firstFragment: #F4 |
| type: int |
| constantInitializer |
| fragment: #F4 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::foo |
| getters |
| synthetic static foo |
| reference: <testLibrary>::@getter::foo |
| firstFragment: #F5 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::foo |
| '''); |
| } |
| |
| test_metadata_offsets_onClassConstructor() async { |
| var library = await buildLibrary(r''' |
| const foo = 0; |
| |
| class A { |
| @foo |
| A(@foo int a); |
| } |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class A (nameOffset:22) (firstTokenOffset:16) (offset:22) |
| element: <testLibrary>::@class::A |
| constructors |
| #F2 new (nameOffset:<null>) (firstTokenOffset:28) (offset:35) |
| element: <testLibrary>::@class::A::@constructor::new |
| metadata |
| Annotation |
| atSign: @ @28 |
| name: SimpleIdentifier |
| token: foo @29 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| typeName: A |
| typeNameOffset: 35 |
| formalParameters |
| #F3 a (nameOffset:46) (firstTokenOffset:37) (offset:46) |
| element: <testLibrary>::@class::A::@constructor::new::@formalParameter::a |
| metadata |
| Annotation |
| atSign: @ @37 |
| name: SimpleIdentifier |
| token: foo @38 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| topLevelVariables |
| #F4 hasInitializer foo (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::foo |
| initializer: expression_0 |
| IntegerLiteral |
| literal: 0 @12 |
| staticType: int |
| getters |
| #F5 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::foo |
| classes |
| class A |
| reference: <testLibrary>::@class::A |
| firstFragment: #F1 |
| constructors |
| new |
| reference: <testLibrary>::@class::A::@constructor::new |
| firstFragment: #F2 |
| metadata |
| Annotation |
| atSign: @ @28 |
| name: SimpleIdentifier |
| token: foo @29 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| formalParameters |
| #E0 requiredPositional a |
| firstFragment: #F3 |
| type: int |
| metadata |
| Annotation |
| atSign: @ @37 |
| name: SimpleIdentifier |
| token: foo @38 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| topLevelVariables |
| const hasInitializer foo |
| reference: <testLibrary>::@topLevelVariable::foo |
| firstFragment: #F4 |
| type: int |
| constantInitializer |
| fragment: #F4 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::foo |
| getters |
| synthetic static foo |
| reference: <testLibrary>::@getter::foo |
| firstFragment: #F5 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::foo |
| '''); |
| } |
| |
| test_metadata_offsets_onClassGetter() async { |
| var library = await buildLibrary(r''' |
| const foo = 0; |
| |
| class A { |
| @foo |
| int get getter => 0; |
| } |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class A (nameOffset:22) (firstTokenOffset:16) (offset:22) |
| element: <testLibrary>::@class::A |
| fields |
| #F2 synthetic getter (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22) |
| element: <testLibrary>::@class::A::@field::getter |
| constructors |
| #F3 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22) |
| element: <testLibrary>::@class::A::@constructor::new |
| typeName: A |
| getters |
| #F4 getter (nameOffset:43) (firstTokenOffset:28) (offset:43) |
| element: <testLibrary>::@class::A::@getter::getter |
| metadata |
| Annotation |
| atSign: @ @28 |
| name: SimpleIdentifier |
| token: foo @29 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| topLevelVariables |
| #F5 hasInitializer foo (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::foo |
| initializer: expression_0 |
| IntegerLiteral |
| literal: 0 @12 |
| staticType: int |
| getters |
| #F6 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::foo |
| classes |
| class A |
| reference: <testLibrary>::@class::A |
| firstFragment: #F1 |
| fields |
| synthetic getter |
| reference: <testLibrary>::@class::A::@field::getter |
| firstFragment: #F2 |
| type: int |
| getter: <testLibrary>::@class::A::@getter::getter |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::A::@constructor::new |
| firstFragment: #F3 |
| getters |
| getter |
| reference: <testLibrary>::@class::A::@getter::getter |
| firstFragment: #F4 |
| metadata |
| Annotation |
| atSign: @ @28 |
| name: SimpleIdentifier |
| token: foo @29 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| returnType: int |
| variable: <testLibrary>::@class::A::@field::getter |
| topLevelVariables |
| const hasInitializer foo |
| reference: <testLibrary>::@topLevelVariable::foo |
| firstFragment: #F5 |
| type: int |
| constantInitializer |
| fragment: #F5 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::foo |
| getters |
| synthetic static foo |
| reference: <testLibrary>::@getter::foo |
| firstFragment: #F6 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::foo |
| '''); |
| } |
| |
| test_metadata_offsets_onClassMethod() async { |
| var library = await buildLibrary(r''' |
| const foo = 0; |
| |
| class A { |
| @foo |
| void method<@foo T>(@foo int a) {} |
| } |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class A (nameOffset:22) (firstTokenOffset:16) (offset:22) |
| element: <testLibrary>::@class::A |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22) |
| element: <testLibrary>::@class::A::@constructor::new |
| typeName: A |
| methods |
| #F3 method (nameOffset:40) (firstTokenOffset:28) (offset:40) |
| element: <testLibrary>::@class::A::@method::method |
| metadata |
| Annotation |
| atSign: @ @28 |
| name: SimpleIdentifier |
| token: foo @29 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| typeParameters |
| #F4 T (nameOffset:52) (firstTokenOffset:47) (offset:52) |
| element: #E0 T |
| metadata |
| Annotation |
| atSign: @ @47 |
| name: SimpleIdentifier |
| token: foo @48 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| formalParameters |
| #F5 a (nameOffset:64) (firstTokenOffset:55) (offset:64) |
| element: <testLibrary>::@class::A::@method::method::@formalParameter::a |
| metadata |
| Annotation |
| atSign: @ @55 |
| name: SimpleIdentifier |
| token: foo @56 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| topLevelVariables |
| #F6 hasInitializer foo (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::foo |
| initializer: expression_0 |
| IntegerLiteral |
| literal: 0 @12 |
| staticType: int |
| getters |
| #F7 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::foo |
| classes |
| class A |
| reference: <testLibrary>::@class::A |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::A::@constructor::new |
| firstFragment: #F2 |
| methods |
| method |
| reference: <testLibrary>::@class::A::@method::method |
| firstFragment: #F3 |
| metadata |
| Annotation |
| atSign: @ @28 |
| name: SimpleIdentifier |
| token: foo @29 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| typeParameters |
| #E0 T |
| firstFragment: #F4 |
| metadata |
| Annotation |
| atSign: @ @47 |
| name: SimpleIdentifier |
| token: foo @48 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| formalParameters |
| #E1 requiredPositional a |
| firstFragment: #F5 |
| type: int |
| metadata |
| Annotation |
| atSign: @ @55 |
| name: SimpleIdentifier |
| token: foo @56 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| returnType: void |
| topLevelVariables |
| const hasInitializer foo |
| reference: <testLibrary>::@topLevelVariable::foo |
| firstFragment: #F6 |
| type: int |
| constantInitializer |
| fragment: #F6 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::foo |
| getters |
| synthetic static foo |
| reference: <testLibrary>::@getter::foo |
| firstFragment: #F7 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::foo |
| '''); |
| } |
| |
| test_metadata_offsets_onClassSetter() async { |
| var library = await buildLibrary(r''' |
| const foo = 0; |
| |
| class A { |
| @foo |
| set setter(@foo int a) {} |
| } |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class A (nameOffset:22) (firstTokenOffset:16) (offset:22) |
| element: <testLibrary>::@class::A |
| fields |
| #F2 synthetic setter (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22) |
| element: <testLibrary>::@class::A::@field::setter |
| constructors |
| #F3 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22) |
| element: <testLibrary>::@class::A::@constructor::new |
| typeName: A |
| setters |
| #F4 setter (nameOffset:39) (firstTokenOffset:28) (offset:39) |
| element: <testLibrary>::@class::A::@setter::setter |
| metadata |
| Annotation |
| atSign: @ @28 |
| name: SimpleIdentifier |
| token: foo @29 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| formalParameters |
| #F5 a (nameOffset:55) (firstTokenOffset:46) (offset:55) |
| element: <testLibrary>::@class::A::@setter::setter::@formalParameter::a |
| metadata |
| Annotation |
| atSign: @ @46 |
| name: SimpleIdentifier |
| token: foo @47 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| topLevelVariables |
| #F6 hasInitializer foo (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::foo |
| initializer: expression_0 |
| IntegerLiteral |
| literal: 0 @12 |
| staticType: int |
| getters |
| #F7 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::foo |
| classes |
| class A |
| reference: <testLibrary>::@class::A |
| firstFragment: #F1 |
| fields |
| synthetic setter |
| reference: <testLibrary>::@class::A::@field::setter |
| firstFragment: #F2 |
| type: int |
| setter: <testLibrary>::@class::A::@setter::setter |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::A::@constructor::new |
| firstFragment: #F3 |
| setters |
| setter |
| reference: <testLibrary>::@class::A::@setter::setter |
| firstFragment: #F4 |
| metadata |
| Annotation |
| atSign: @ @28 |
| name: SimpleIdentifier |
| token: foo @29 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| formalParameters |
| #E0 requiredPositional a |
| firstFragment: #F5 |
| type: int |
| metadata |
| Annotation |
| atSign: @ @46 |
| name: SimpleIdentifier |
| token: foo @47 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| returnType: void |
| variable: <testLibrary>::@class::A::@field::setter |
| topLevelVariables |
| const hasInitializer foo |
| reference: <testLibrary>::@topLevelVariable::foo |
| firstFragment: #F6 |
| type: int |
| constantInitializer |
| fragment: #F6 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::foo |
| getters |
| synthetic static foo |
| reference: <testLibrary>::@getter::foo |
| firstFragment: #F7 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::foo |
| '''); |
| } |
| |
| test_metadata_offsets_onClassTypeAlias() async { |
| var library = await buildLibrary(r''' |
| const foo = 0; |
| |
| class A {} |
| mixin M {} |
| |
| @foo |
| class B<@foo T> = A with M; |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class A (nameOffset:22) (firstTokenOffset:16) (offset:22) |
| element: <testLibrary>::@class::A |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22) |
| element: <testLibrary>::@class::A::@constructor::new |
| typeName: A |
| #F3 class B (nameOffset:50) (firstTokenOffset:39) (offset:50) |
| element: <testLibrary>::@class::B |
| typeParameters |
| #F4 T (nameOffset:57) (firstTokenOffset:52) (offset:57) |
| element: #E0 T |
| metadata |
| Annotation |
| atSign: @ @52 |
| name: SimpleIdentifier |
| token: foo @53 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| constructors |
| #F5 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:50) |
| element: <testLibrary>::@class::B::@constructor::new |
| typeName: B |
| mixins |
| #F6 mixin M (nameOffset:33) (firstTokenOffset:27) (offset:33) |
| element: <testLibrary>::@mixin::M |
| topLevelVariables |
| #F7 hasInitializer foo (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::foo |
| initializer: expression_0 |
| IntegerLiteral |
| literal: 0 @12 |
| staticType: int |
| getters |
| #F8 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::foo |
| classes |
| class A |
| reference: <testLibrary>::@class::A |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::A::@constructor::new |
| firstFragment: #F2 |
| class alias B |
| reference: <testLibrary>::@class::B |
| firstFragment: #F3 |
| typeParameters |
| #E0 T |
| firstFragment: #F4 |
| metadata |
| Annotation |
| atSign: @ @52 |
| name: SimpleIdentifier |
| token: foo @53 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| supertype: A |
| mixins |
| M |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::B::@constructor::new |
| firstFragment: #F5 |
| constantInitializers |
| SuperConstructorInvocation |
| superKeyword: super @0 |
| argumentList: ArgumentList |
| leftParenthesis: ( @0 |
| rightParenthesis: ) @0 |
| element: <testLibrary>::@class::A::@constructor::new |
| superConstructor: <testLibrary>::@class::A::@constructor::new |
| mixins |
| mixin M |
| reference: <testLibrary>::@mixin::M |
| firstFragment: #F6 |
| superclassConstraints |
| Object |
| topLevelVariables |
| const hasInitializer foo |
| reference: <testLibrary>::@topLevelVariable::foo |
| firstFragment: #F7 |
| type: int |
| constantInitializer |
| fragment: #F7 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::foo |
| getters |
| synthetic static foo |
| reference: <testLibrary>::@getter::foo |
| firstFragment: #F8 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::foo |
| '''); |
| } |
| |
| test_metadata_offsets_onEnum() async { |
| var library = await buildLibrary(r''' |
| const foo = 0; |
| |
| @foo |
| enum E { |
| @foo e1, |
| e2, |
| @foo e3, |
| } |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| enums |
| #F1 enum E (nameOffset:26) (firstTokenOffset:16) (offset:26) |
| element: <testLibrary>::@enum::E |
| fields |
| #F2 hasInitializer e1 (nameOffset:37) (firstTokenOffset:32) (offset:37) |
| element: <testLibrary>::@enum::E::@field::e1 |
| initializer: expression_0 |
| InstanceCreationExpression |
| constructorName: ConstructorName |
| type: NamedType |
| name: E @-1 |
| element: <testLibrary>::@enum::E |
| type: E |
| element: <testLibrary>::@enum::E::@constructor::new |
| argumentList: ArgumentList |
| leftParenthesis: ( @0 |
| rightParenthesis: ) @0 |
| staticType: E |
| #F3 hasInitializer e2 (nameOffset:43) (firstTokenOffset:43) (offset:43) |
| element: <testLibrary>::@enum::E::@field::e2 |
| initializer: expression_1 |
| InstanceCreationExpression |
| constructorName: ConstructorName |
| type: NamedType |
| name: E @-1 |
| element: <testLibrary>::@enum::E |
| type: E |
| element: <testLibrary>::@enum::E::@constructor::new |
| argumentList: ArgumentList |
| leftParenthesis: ( @0 |
| rightParenthesis: ) @0 |
| staticType: E |
| #F4 hasInitializer e3 (nameOffset:54) (firstTokenOffset:49) (offset:54) |
| element: <testLibrary>::@enum::E::@field::e3 |
| initializer: expression_2 |
| InstanceCreationExpression |
| constructorName: ConstructorName |
| type: NamedType |
| name: E @-1 |
| element: <testLibrary>::@enum::E |
| type: E |
| element: <testLibrary>::@enum::E::@constructor::new |
| argumentList: ArgumentList |
| leftParenthesis: ( @0 |
| rightParenthesis: ) @0 |
| staticType: E |
| #F5 synthetic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26) |
| element: <testLibrary>::@enum::E::@field::values |
| initializer: expression_3 |
| ListLiteral |
| leftBracket: [ @0 |
| elements |
| SimpleIdentifier |
| token: e1 @-1 |
| element: <testLibrary>::@enum::E::@getter::e1 |
| staticType: E |
| SimpleIdentifier |
| token: e2 @-1 |
| element: <testLibrary>::@enum::E::@getter::e2 |
| staticType: E |
| SimpleIdentifier |
| token: e3 @-1 |
| element: <testLibrary>::@enum::E::@getter::e3 |
| staticType: E |
| rightBracket: ] @0 |
| staticType: List<E> |
| constructors |
| #F6 synthetic const new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26) |
| element: <testLibrary>::@enum::E::@constructor::new |
| typeName: E |
| getters |
| #F7 synthetic e1 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37) |
| element: <testLibrary>::@enum::E::@getter::e1 |
| #F8 synthetic e2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:43) |
| element: <testLibrary>::@enum::E::@getter::e2 |
| #F9 synthetic e3 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:54) |
| element: <testLibrary>::@enum::E::@getter::e3 |
| #F10 synthetic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26) |
| element: <testLibrary>::@enum::E::@getter::values |
| topLevelVariables |
| #F11 hasInitializer foo (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::foo |
| initializer: expression_4 |
| IntegerLiteral |
| literal: 0 @12 |
| staticType: int |
| getters |
| #F12 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::foo |
| enums |
| enum E |
| reference: <testLibrary>::@enum::E |
| firstFragment: #F1 |
| supertype: Enum |
| fields |
| static const enumConstant hasInitializer e1 |
| reference: <testLibrary>::@enum::E::@field::e1 |
| firstFragment: #F2 |
| type: E |
| constantInitializer |
| fragment: #F2 |
| expression: expression_0 |
| getter: <testLibrary>::@enum::E::@getter::e1 |
| static const enumConstant hasInitializer e2 |
| reference: <testLibrary>::@enum::E::@field::e2 |
| firstFragment: #F3 |
| type: E |
| constantInitializer |
| fragment: #F3 |
| expression: expression_1 |
| getter: <testLibrary>::@enum::E::@getter::e2 |
| static const enumConstant hasInitializer e3 |
| reference: <testLibrary>::@enum::E::@field::e3 |
| firstFragment: #F4 |
| type: E |
| constantInitializer |
| fragment: #F4 |
| expression: expression_2 |
| getter: <testLibrary>::@enum::E::@getter::e3 |
| synthetic static const values |
| reference: <testLibrary>::@enum::E::@field::values |
| firstFragment: #F5 |
| type: List<E> |
| constantInitializer |
| fragment: #F5 |
| expression: expression_3 |
| getter: <testLibrary>::@enum::E::@getter::values |
| constructors |
| synthetic const new |
| reference: <testLibrary>::@enum::E::@constructor::new |
| firstFragment: #F6 |
| getters |
| synthetic static e1 |
| reference: <testLibrary>::@enum::E::@getter::e1 |
| firstFragment: #F7 |
| returnType: E |
| variable: <testLibrary>::@enum::E::@field::e1 |
| synthetic static e2 |
| reference: <testLibrary>::@enum::E::@getter::e2 |
| firstFragment: #F8 |
| returnType: E |
| variable: <testLibrary>::@enum::E::@field::e2 |
| synthetic static e3 |
| reference: <testLibrary>::@enum::E::@getter::e3 |
| firstFragment: #F9 |
| returnType: E |
| variable: <testLibrary>::@enum::E::@field::e3 |
| synthetic static values |
| reference: <testLibrary>::@enum::E::@getter::values |
| firstFragment: #F10 |
| returnType: List<E> |
| variable: <testLibrary>::@enum::E::@field::values |
| topLevelVariables |
| const hasInitializer foo |
| reference: <testLibrary>::@topLevelVariable::foo |
| firstFragment: #F11 |
| type: int |
| constantInitializer |
| fragment: #F11 |
| expression: expression_4 |
| getter: <testLibrary>::@getter::foo |
| getters |
| synthetic static foo |
| reference: <testLibrary>::@getter::foo |
| firstFragment: #F12 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::foo |
| '''); |
| } |
| |
| test_metadata_offsets_onExtension() async { |
| var library = await buildLibrary(r''' |
| const foo = 0; |
| |
| @foo |
| extension E<@foo T> on List<T> {} |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| extensions |
| #F1 extension E (nameOffset:31) (firstTokenOffset:16) (offset:31) |
| element: <testLibrary>::@extension::E |
| typeParameters |
| #F2 T (nameOffset:38) (firstTokenOffset:33) (offset:38) |
| element: #E0 T |
| metadata |
| Annotation |
| atSign: @ @33 |
| name: SimpleIdentifier |
| token: foo @34 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| topLevelVariables |
| #F3 hasInitializer foo (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::foo |
| initializer: expression_0 |
| IntegerLiteral |
| literal: 0 @12 |
| staticType: int |
| getters |
| #F4 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::foo |
| extensions |
| extension E |
| reference: <testLibrary>::@extension::E |
| firstFragment: #F1 |
| typeParameters |
| #E0 T |
| firstFragment: #F2 |
| metadata |
| Annotation |
| atSign: @ @33 |
| name: SimpleIdentifier |
| token: foo @34 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| extendedType: List<T> |
| topLevelVariables |
| const hasInitializer foo |
| reference: <testLibrary>::@topLevelVariable::foo |
| firstFragment: #F3 |
| type: int |
| constantInitializer |
| fragment: #F3 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::foo |
| getters |
| synthetic static foo |
| reference: <testLibrary>::@getter::foo |
| firstFragment: #F4 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::foo |
| '''); |
| } |
| |
| test_metadata_offsets_onFieldDeclaration() async { |
| var library = await buildLibrary(r''' |
| const foo = 0; |
| |
| class A { |
| @foo |
| static isStatic = 1; |
| |
| @foo |
| static const isStaticConst = 2; |
| |
| @foo |
| var isInstance = 3; |
| } |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class A (nameOffset:22) (firstTokenOffset:16) (offset:22) |
| element: <testLibrary>::@class::A |
| fields |
| #F2 hasInitializer isStatic (nameOffset:42) (firstTokenOffset:42) (offset:42) |
| element: <testLibrary>::@class::A::@field::isStatic |
| #F3 hasInitializer isStaticConst (nameOffset:79) (firstTokenOffset:79) (offset:79) |
| element: <testLibrary>::@class::A::@field::isStaticConst |
| initializer: expression_0 |
| IntegerLiteral |
| literal: 2 @95 |
| staticType: int |
| #F4 hasInitializer isInstance (nameOffset:112) (firstTokenOffset:112) (offset:112) |
| element: <testLibrary>::@class::A::@field::isInstance |
| constructors |
| #F5 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22) |
| element: <testLibrary>::@class::A::@constructor::new |
| typeName: A |
| getters |
| #F6 synthetic isStatic (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42) |
| element: <testLibrary>::@class::A::@getter::isStatic |
| #F7 synthetic isStaticConst (nameOffset:<null>) (firstTokenOffset:<null>) (offset:79) |
| element: <testLibrary>::@class::A::@getter::isStaticConst |
| #F8 synthetic isInstance (nameOffset:<null>) (firstTokenOffset:<null>) (offset:112) |
| element: <testLibrary>::@class::A::@getter::isInstance |
| setters |
| #F9 synthetic isStatic (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42) |
| element: <testLibrary>::@class::A::@setter::isStatic |
| formalParameters |
| #F10 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42) |
| element: <testLibrary>::@class::A::@setter::isStatic::@formalParameter::value |
| #F11 synthetic isInstance (nameOffset:<null>) (firstTokenOffset:<null>) (offset:112) |
| element: <testLibrary>::@class::A::@setter::isInstance |
| formalParameters |
| #F12 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:112) |
| element: <testLibrary>::@class::A::@setter::isInstance::@formalParameter::value |
| topLevelVariables |
| #F13 hasInitializer foo (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::foo |
| initializer: expression_1 |
| IntegerLiteral |
| literal: 0 @12 |
| staticType: int |
| getters |
| #F14 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::foo |
| classes |
| hasNonFinalField class A |
| reference: <testLibrary>::@class::A |
| firstFragment: #F1 |
| fields |
| static hasInitializer isStatic |
| reference: <testLibrary>::@class::A::@field::isStatic |
| firstFragment: #F2 |
| type: int |
| getter: <testLibrary>::@class::A::@getter::isStatic |
| setter: <testLibrary>::@class::A::@setter::isStatic |
| static const hasInitializer isStaticConst |
| reference: <testLibrary>::@class::A::@field::isStaticConst |
| firstFragment: #F3 |
| type: int |
| constantInitializer |
| fragment: #F3 |
| expression: expression_0 |
| getter: <testLibrary>::@class::A::@getter::isStaticConst |
| hasInitializer isInstance |
| reference: <testLibrary>::@class::A::@field::isInstance |
| firstFragment: #F4 |
| type: int |
| getter: <testLibrary>::@class::A::@getter::isInstance |
| setter: <testLibrary>::@class::A::@setter::isInstance |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::A::@constructor::new |
| firstFragment: #F5 |
| getters |
| synthetic static isStatic |
| reference: <testLibrary>::@class::A::@getter::isStatic |
| firstFragment: #F6 |
| returnType: int |
| variable: <testLibrary>::@class::A::@field::isStatic |
| synthetic static isStaticConst |
| reference: <testLibrary>::@class::A::@getter::isStaticConst |
| firstFragment: #F7 |
| returnType: int |
| variable: <testLibrary>::@class::A::@field::isStaticConst |
| synthetic isInstance |
| reference: <testLibrary>::@class::A::@getter::isInstance |
| firstFragment: #F8 |
| returnType: int |
| variable: <testLibrary>::@class::A::@field::isInstance |
| setters |
| synthetic static isStatic |
| reference: <testLibrary>::@class::A::@setter::isStatic |
| firstFragment: #F9 |
| formalParameters |
| #E0 requiredPositional value |
| firstFragment: #F10 |
| type: int |
| returnType: void |
| variable: <testLibrary>::@class::A::@field::isStatic |
| synthetic isInstance |
| reference: <testLibrary>::@class::A::@setter::isInstance |
| firstFragment: #F11 |
| formalParameters |
| #E1 requiredPositional value |
| firstFragment: #F12 |
| type: int |
| returnType: void |
| variable: <testLibrary>::@class::A::@field::isInstance |
| topLevelVariables |
| const hasInitializer foo |
| reference: <testLibrary>::@topLevelVariable::foo |
| firstFragment: #F13 |
| type: int |
| constantInitializer |
| fragment: #F13 |
| expression: expression_1 |
| getter: <testLibrary>::@getter::foo |
| getters |
| synthetic static foo |
| reference: <testLibrary>::@getter::foo |
| firstFragment: #F14 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::foo |
| '''); |
| } |
| |
| test_metadata_offsets_onLibrary() async { |
| var library = await buildLibrary(''' |
| /// Some documentation. |
| @foo |
| library my.lib; |
| |
| const foo = 0; |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| name: my.lib |
| documentationComment: /// Some documentation. |
| metadata |
| Annotation |
| atSign: @ @24 |
| name: SimpleIdentifier |
| token: foo @25 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| fragments |
| #F0 <testLibraryFragment> (nameOffset:<null>) (firstTokenOffset:0) (offset:37) |
| element: <testLibrary> |
| topLevelVariables |
| #F1 hasInitializer foo (nameOffset:52) (firstTokenOffset:52) (offset:52) |
| element: <testLibrary>::@topLevelVariable::foo |
| initializer: expression_0 |
| IntegerLiteral |
| literal: 0 @58 |
| staticType: int |
| getters |
| #F2 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:52) |
| element: <testLibrary>::@getter::foo |
| topLevelVariables |
| const hasInitializer foo |
| reference: <testLibrary>::@topLevelVariable::foo |
| firstFragment: #F1 |
| type: int |
| constantInitializer |
| fragment: #F1 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::foo |
| getters |
| synthetic static foo |
| reference: <testLibrary>::@getter::foo |
| firstFragment: #F2 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::foo |
| '''); |
| } |
| |
| test_metadata_offsets_onMixin() async { |
| var library = await buildLibrary(r''' |
| const foo = 0; |
| |
| @foo |
| mixin A<@foo T> {} |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| mixins |
| #F1 mixin A (nameOffset:27) (firstTokenOffset:16) (offset:27) |
| element: <testLibrary>::@mixin::A |
| typeParameters |
| #F2 T (nameOffset:34) (firstTokenOffset:29) (offset:34) |
| element: #E0 T |
| metadata |
| Annotation |
| atSign: @ @29 |
| name: SimpleIdentifier |
| token: foo @30 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| topLevelVariables |
| #F3 hasInitializer foo (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::foo |
| initializer: expression_0 |
| IntegerLiteral |
| literal: 0 @12 |
| staticType: int |
| getters |
| #F4 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::foo |
| mixins |
| mixin A |
| reference: <testLibrary>::@mixin::A |
| firstFragment: #F1 |
| typeParameters |
| #E0 T |
| firstFragment: #F2 |
| metadata |
| Annotation |
| atSign: @ @29 |
| name: SimpleIdentifier |
| token: foo @30 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| superclassConstraints |
| Object |
| topLevelVariables |
| const hasInitializer foo |
| reference: <testLibrary>::@topLevelVariable::foo |
| firstFragment: #F3 |
| type: int |
| constantInitializer |
| fragment: #F3 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::foo |
| getters |
| synthetic static foo |
| reference: <testLibrary>::@getter::foo |
| firstFragment: #F4 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::foo |
| '''); |
| } |
| |
| test_metadata_offsets_onTypeAlias_classic() async { |
| var library = await buildLibrary(r''' |
| const foo = 0; |
| |
| @foo |
| typedef void F<@foo T>(@foo int a); |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| typeAliases |
| #F1 F (nameOffset:34) (firstTokenOffset:16) (offset:34) |
| element: <testLibrary>::@typeAlias::F |
| metadata |
| Annotation |
| atSign: @ @16 |
| name: SimpleIdentifier |
| token: foo @17 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| typeParameters |
| #F2 T (nameOffset:41) (firstTokenOffset:36) (offset:41) |
| element: #E0 T |
| metadata |
| Annotation |
| atSign: @ @36 |
| name: SimpleIdentifier |
| token: foo @37 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| topLevelVariables |
| #F3 hasInitializer foo (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::foo |
| initializer: expression_0 |
| IntegerLiteral |
| literal: 0 @12 |
| staticType: int |
| getters |
| #F4 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::foo |
| typeAliases |
| F |
| reference: <testLibrary>::@typeAlias::F |
| firstFragment: #F1 |
| metadata |
| Annotation |
| atSign: @ @16 |
| name: SimpleIdentifier |
| token: foo @17 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| typeParameters |
| #E0 T |
| firstFragment: #F2 |
| metadata |
| Annotation |
| atSign: @ @36 |
| name: SimpleIdentifier |
| token: foo @37 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| aliasedType: void Function(int) |
| topLevelVariables |
| const hasInitializer foo |
| reference: <testLibrary>::@topLevelVariable::foo |
| firstFragment: #F3 |
| type: int |
| constantInitializer |
| fragment: #F3 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::foo |
| getters |
| synthetic static foo |
| reference: <testLibrary>::@getter::foo |
| firstFragment: #F4 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::foo |
| '''); |
| } |
| |
| test_metadata_offsets_onTypeAlias_genericFunctionType() async { |
| var library = await buildLibrary(r''' |
| const foo = 0; |
| |
| @foo |
| typedef A<@foo T> = void Function<@foo U>(@foo int a); |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| typeAliases |
| #F1 A (nameOffset:29) (firstTokenOffset:16) (offset:29) |
| element: <testLibrary>::@typeAlias::A |
| metadata |
| Annotation |
| atSign: @ @16 |
| name: SimpleIdentifier |
| token: foo @17 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| typeParameters |
| #F2 T (nameOffset:36) (firstTokenOffset:31) (offset:36) |
| element: #E0 T |
| metadata |
| Annotation |
| atSign: @ @31 |
| name: SimpleIdentifier |
| token: foo @32 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| topLevelVariables |
| #F3 hasInitializer foo (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::foo |
| initializer: expression_0 |
| IntegerLiteral |
| literal: 0 @12 |
| staticType: int |
| getters |
| #F4 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::foo |
| typeAliases |
| A |
| reference: <testLibrary>::@typeAlias::A |
| firstFragment: #F1 |
| metadata |
| Annotation |
| atSign: @ @16 |
| name: SimpleIdentifier |
| token: foo @17 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| typeParameters |
| #E0 T |
| firstFragment: #F2 |
| metadata |
| Annotation |
| atSign: @ @31 |
| name: SimpleIdentifier |
| token: foo @32 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| aliasedType: void Function<U>(int) |
| topLevelVariables |
| const hasInitializer foo |
| reference: <testLibrary>::@topLevelVariable::foo |
| firstFragment: #F3 |
| type: int |
| constantInitializer |
| fragment: #F3 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::foo |
| getters |
| synthetic static foo |
| reference: <testLibrary>::@getter::foo |
| firstFragment: #F4 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::foo |
| '''); |
| } |
| |
| test_metadata_offsets_onUnit() async { |
| newFile('$testPackageLibPath/a.dart', ''' |
| part of my.lib; |
| '''); |
| |
| newFile('$testPackageLibPath/b.dart', ''' |
| part of my.lib; |
| '''); |
| |
| var library = await buildLibrary(''' |
| library my.lib; |
| |
| @foo |
| part 'a.dart'; |
| |
| @foo |
| part 'b.dart'; |
| |
| const foo = 0; |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| name: my.lib |
| fragments |
| #F0 <testLibraryFragment> (nameOffset:<null>) (firstTokenOffset:0) (offset:8) |
| element: <testLibrary> |
| nextFragment: #F1 |
| parts |
| part_0 |
| uri: package:test/a.dart |
| partKeywordOffset: 22 |
| metadata |
| Annotation |
| atSign: @ @17 |
| name: SimpleIdentifier |
| token: foo @18 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| unit: #F1 |
| part_1 |
| uri: package:test/b.dart |
| partKeywordOffset: 43 |
| metadata |
| Annotation |
| atSign: @ @38 |
| name: SimpleIdentifier |
| token: foo @39 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| unit: #F2 |
| topLevelVariables |
| #F3 hasInitializer foo (nameOffset:65) (firstTokenOffset:65) (offset:65) |
| element: <testLibrary>::@topLevelVariable::foo |
| initializer: expression_0 |
| IntegerLiteral |
| literal: 0 @71 |
| staticType: int |
| getters |
| #F4 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:65) |
| element: <testLibrary>::@getter::foo |
| #F1 package:test/a.dart |
| element: <testLibrary> |
| enclosingFragment: #F0 |
| previousFragment: #F0 |
| nextFragment: #F2 |
| #F2 package:test/b.dart |
| element: <testLibrary> |
| enclosingFragment: #F0 |
| previousFragment: #F1 |
| topLevelVariables |
| const hasInitializer foo |
| reference: <testLibrary>::@topLevelVariable::foo |
| firstFragment: #F3 |
| type: int |
| constantInitializer |
| fragment: #F3 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::foo |
| getters |
| synthetic static foo |
| reference: <testLibrary>::@getter::foo |
| firstFragment: #F4 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::foo |
| '''); |
| } |
| |
| test_metadata_offsets_onUnitFunction() async { |
| var library = await buildLibrary(r''' |
| const foo = 0; |
| |
| @foo |
| void f<@foo T>({@foo int? a = 42}) {} |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| topLevelVariables |
| #F1 hasInitializer foo (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::foo |
| initializer: expression_0 |
| IntegerLiteral |
| literal: 0 @12 |
| staticType: int |
| getters |
| #F2 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::foo |
| functions |
| #F3 f (nameOffset:26) (firstTokenOffset:16) (offset:26) |
| element: <testLibrary>::@function::f |
| metadata |
| Annotation |
| atSign: @ @16 |
| name: SimpleIdentifier |
| token: foo @17 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| typeParameters |
| #F4 T (nameOffset:33) (firstTokenOffset:28) (offset:33) |
| element: #E0 T |
| metadata |
| Annotation |
| atSign: @ @28 |
| name: SimpleIdentifier |
| token: foo @29 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| formalParameters |
| #F5 a (nameOffset:47) (firstTokenOffset:37) (offset:47) |
| element: <testLibrary>::@function::f::@formalParameter::a |
| metadata |
| Annotation |
| atSign: @ @37 |
| name: SimpleIdentifier |
| token: foo @38 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| initializer: expression_1 |
| IntegerLiteral |
| literal: 42 @51 |
| staticType: int |
| topLevelVariables |
| const hasInitializer foo |
| reference: <testLibrary>::@topLevelVariable::foo |
| firstFragment: #F1 |
| type: int |
| constantInitializer |
| fragment: #F1 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::foo |
| getters |
| synthetic static foo |
| reference: <testLibrary>::@getter::foo |
| firstFragment: #F2 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::foo |
| functions |
| f |
| reference: <testLibrary>::@function::f |
| firstFragment: #F3 |
| metadata |
| Annotation |
| atSign: @ @16 |
| name: SimpleIdentifier |
| token: foo @17 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| typeParameters |
| #E0 T |
| firstFragment: #F4 |
| metadata |
| Annotation |
| atSign: @ @28 |
| name: SimpleIdentifier |
| token: foo @29 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| formalParameters |
| #E1 optionalNamed a |
| firstFragment: #F5 |
| type: int? |
| metadata |
| Annotation |
| atSign: @ @37 |
| name: SimpleIdentifier |
| token: foo @38 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| constantInitializer |
| fragment: #F5 |
| expression: expression_1 |
| returnType: void |
| '''); |
| } |
| |
| test_metadata_offsets_onUnitGetter() async { |
| var library = await buildLibrary(r''' |
| const foo = 0; |
| |
| @foo |
| int get getter => 0; |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| topLevelVariables |
| #F1 hasInitializer foo (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::foo |
| initializer: expression_0 |
| IntegerLiteral |
| literal: 0 @12 |
| staticType: int |
| #F2 synthetic getter (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29) |
| element: <testLibrary>::@topLevelVariable::getter |
| getters |
| #F3 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::foo |
| #F4 getter (nameOffset:29) (firstTokenOffset:16) (offset:29) |
| element: <testLibrary>::@getter::getter |
| metadata |
| Annotation |
| atSign: @ @16 |
| name: SimpleIdentifier |
| token: foo @17 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| topLevelVariables |
| const hasInitializer foo |
| reference: <testLibrary>::@topLevelVariable::foo |
| firstFragment: #F1 |
| type: int |
| constantInitializer |
| fragment: #F1 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::foo |
| synthetic getter |
| reference: <testLibrary>::@topLevelVariable::getter |
| firstFragment: #F2 |
| type: int |
| getter: <testLibrary>::@getter::getter |
| getters |
| synthetic static foo |
| reference: <testLibrary>::@getter::foo |
| firstFragment: #F3 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::foo |
| static getter |
| reference: <testLibrary>::@getter::getter |
| firstFragment: #F4 |
| metadata |
| Annotation |
| atSign: @ @16 |
| name: SimpleIdentifier |
| token: foo @17 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::getter |
| '''); |
| } |
| |
| test_metadata_offsets_onUnitSetter() async { |
| var library = await buildLibrary(r''' |
| const foo = 0; |
| |
| @foo |
| set setter(@foo int a) {} |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| topLevelVariables |
| #F1 hasInitializer foo (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::foo |
| initializer: expression_0 |
| IntegerLiteral |
| literal: 0 @12 |
| staticType: int |
| #F2 synthetic setter (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25) |
| element: <testLibrary>::@topLevelVariable::setter |
| getters |
| #F3 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::foo |
| setters |
| #F4 setter (nameOffset:25) (firstTokenOffset:16) (offset:25) |
| element: <testLibrary>::@setter::setter |
| metadata |
| Annotation |
| atSign: @ @16 |
| name: SimpleIdentifier |
| token: foo @17 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| formalParameters |
| #F5 a (nameOffset:41) (firstTokenOffset:32) (offset:41) |
| element: <testLibrary>::@setter::setter::@formalParameter::a |
| metadata |
| Annotation |
| atSign: @ @32 |
| name: SimpleIdentifier |
| token: foo @33 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| topLevelVariables |
| const hasInitializer foo |
| reference: <testLibrary>::@topLevelVariable::foo |
| firstFragment: #F1 |
| type: int |
| constantInitializer |
| fragment: #F1 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::foo |
| synthetic setter |
| reference: <testLibrary>::@topLevelVariable::setter |
| firstFragment: #F2 |
| type: int |
| setter: <testLibrary>::@setter::setter |
| getters |
| synthetic static foo |
| reference: <testLibrary>::@getter::foo |
| firstFragment: #F3 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::foo |
| setters |
| static setter |
| reference: <testLibrary>::@setter::setter |
| firstFragment: #F4 |
| metadata |
| Annotation |
| atSign: @ @16 |
| name: SimpleIdentifier |
| token: foo @17 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| formalParameters |
| #E0 requiredPositional a |
| firstFragment: #F5 |
| type: int |
| metadata |
| Annotation |
| atSign: @ @32 |
| name: SimpleIdentifier |
| token: foo @33 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| returnType: void |
| variable: <testLibrary>::@topLevelVariable::setter |
| '''); |
| } |
| |
| test_metadata_offsets_onUnitVariable() async { |
| var library = await buildLibrary(r''' |
| const foo = 0; |
| |
| @foo |
| var isNotConst = 1; |
| |
| @foo |
| const isConst = 2; |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| topLevelVariables |
| #F1 hasInitializer foo (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::foo |
| initializer: expression_0 |
| IntegerLiteral |
| literal: 0 @12 |
| staticType: int |
| #F2 hasInitializer isNotConst (nameOffset:25) (firstTokenOffset:25) (offset:25) |
| element: <testLibrary>::@topLevelVariable::isNotConst |
| metadata |
| Annotation |
| atSign: @ @16 |
| name: SimpleIdentifier |
| token: foo @17 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| #F3 hasInitializer isConst (nameOffset:53) (firstTokenOffset:53) (offset:53) |
| element: <testLibrary>::@topLevelVariable::isConst |
| metadata |
| Annotation |
| atSign: @ @42 |
| name: SimpleIdentifier |
| token: foo @43 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| initializer: expression_1 |
| IntegerLiteral |
| literal: 2 @63 |
| staticType: int |
| getters |
| #F4 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::foo |
| #F5 synthetic isNotConst (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25) |
| element: <testLibrary>::@getter::isNotConst |
| #F6 synthetic isConst (nameOffset:<null>) (firstTokenOffset:<null>) (offset:53) |
| element: <testLibrary>::@getter::isConst |
| setters |
| #F7 synthetic isNotConst (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25) |
| element: <testLibrary>::@setter::isNotConst |
| formalParameters |
| #F8 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25) |
| element: <testLibrary>::@setter::isNotConst::@formalParameter::value |
| topLevelVariables |
| const hasInitializer foo |
| reference: <testLibrary>::@topLevelVariable::foo |
| firstFragment: #F1 |
| type: int |
| constantInitializer |
| fragment: #F1 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::foo |
| hasInitializer isNotConst |
| reference: <testLibrary>::@topLevelVariable::isNotConst |
| firstFragment: #F2 |
| metadata |
| Annotation |
| atSign: @ @16 |
| name: SimpleIdentifier |
| token: foo @17 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| type: int |
| getter: <testLibrary>::@getter::isNotConst |
| setter: <testLibrary>::@setter::isNotConst |
| const hasInitializer isConst |
| reference: <testLibrary>::@topLevelVariable::isConst |
| firstFragment: #F3 |
| metadata |
| Annotation |
| atSign: @ @42 |
| name: SimpleIdentifier |
| token: foo @43 |
| element: <testLibrary>::@getter::foo |
| staticType: null |
| element: <testLibrary>::@getter::foo |
| type: int |
| constantInitializer |
| fragment: #F3 |
| expression: expression_1 |
| getter: <testLibrary>::@getter::isConst |
| getters |
| synthetic static foo |
| reference: <testLibrary>::@getter::foo |
| firstFragment: #F4 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::foo |
| synthetic static isNotConst |
| reference: <testLibrary>::@getter::isNotConst |
| firstFragment: #F5 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::isNotConst |
| synthetic static isConst |
| reference: <testLibrary>::@getter::isConst |
| firstFragment: #F6 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::isConst |
| setters |
| synthetic static isNotConst |
| reference: <testLibrary>::@setter::isNotConst |
| firstFragment: #F7 |
| formalParameters |
| #E0 requiredPositional value |
| firstFragment: #F8 |
| type: int |
| returnType: void |
| variable: <testLibrary>::@topLevelVariable::isNotConst |
| '''); |
| } |
| |
| test_metadata_partDirective() async { |
| newFile('$testPackageLibPath/foo.dart', r''' |
| part of 'test.dart'; |
| '''); |
| |
| var library = await buildLibrary(''' |
| @a |
| part 'foo.dart'; |
| const a = 0; |
| '''); |
| |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| metadata |
| Annotation |
| atSign: @ @0 |
| name: SimpleIdentifier |
| token: a @1 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| nextFragment: #F1 |
| parts |
| part_0 |
| uri: package:test/foo.dart |
| partKeywordOffset: 3 |
| metadata |
| Annotation |
| atSign: @ @0 |
| name: SimpleIdentifier |
| token: a @1 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| unit: #F1 |
| topLevelVariables |
| #F2 hasInitializer a (nameOffset:26) (firstTokenOffset:26) (offset:26) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| IntegerLiteral |
| literal: 0 @30 |
| staticType: int |
| getters |
| #F3 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26) |
| element: <testLibrary>::@getter::a |
| #F1 package:test/foo.dart |
| element: <testLibrary> |
| enclosingFragment: #F0 |
| previousFragment: #F0 |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F2 |
| type: int |
| constantInitializer |
| fragment: #F2 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F3 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::a |
| '''); |
| } |
| |
| test_metadata_partDirective2() async { |
| newFile('$testPackageLibPath/foo.dart', 'part of L;'); |
| var library = await buildLibrary(''' |
| library L; |
| @a |
| part 'foo.dart'; |
| const a = null;'''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| name: L |
| fragments |
| #F0 <testLibraryFragment> (nameOffset:<null>) (firstTokenOffset:0) (offset:8) |
| element: <testLibrary> |
| nextFragment: #F1 |
| parts |
| part_0 |
| uri: package:test/foo.dart |
| partKeywordOffset: 14 |
| metadata |
| Annotation |
| atSign: @ @11 |
| name: SimpleIdentifier |
| token: a @12 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| unit: #F1 |
| topLevelVariables |
| #F2 hasInitializer a (nameOffset:37) (firstTokenOffset:37) (offset:37) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| NullLiteral |
| literal: null @41 |
| staticType: Null |
| getters |
| #F3 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37) |
| element: <testLibrary>::@getter::a |
| #F1 package:test/foo.dart |
| element: <testLibrary> |
| enclosingFragment: #F0 |
| previousFragment: #F0 |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F2 |
| type: dynamic |
| constantInitializer |
| fragment: #F2 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F3 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::a |
| '''); |
| } |
| |
| test_metadata_partDirective3() async { |
| newFile('$testPackageLibPath/a.dart', r''' |
| part of 'test.dart'; |
| '''); |
| newFile('$testPackageLibPath/b.dart', r''' |
| part of 'test.dart'; |
| '''); |
| var library = await buildLibrary(''' |
| part 'a.dart'; |
| part 'b.dart'; |
| '''); |
| |
| // The difference with the test above is that we ask the part first. |
| // There was a bug that we were not loading library directives. |
| expect(library.firstFragment.parts[0].metadata.annotations, isEmpty); |
| } |
| |
| test_metadata_partOf_class() async { |
| newFile('$testPackageLibPath/a.dart', r''' |
| part of 'test.dart'; |
| @deprecated |
| class A {} |
| '''); |
| var library = await buildLibrary(''' |
| part 'a.dart'; |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| nextFragment: #F1 |
| parts |
| part_0 |
| uri: package:test/a.dart |
| partKeywordOffset: 0 |
| unit: #F1 |
| #F1 package:test/a.dart |
| element: <testLibrary> |
| enclosingFragment: #F0 |
| previousFragment: #F0 |
| classes |
| #F2 class A (nameOffset:39) (firstTokenOffset:21) (offset:39) |
| element: <testLibrary>::@class::A |
| constructors |
| #F3 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39) |
| element: <testLibrary>::@class::A::@constructor::new |
| typeName: A |
| classes |
| class A |
| reference: <testLibrary>::@class::A |
| firstFragment: #F2 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::A::@constructor::new |
| firstFragment: #F3 |
| '''); |
| } |
| |
| test_metadata_partOf_exportLibrary() async { |
| newFile('$testPackageLibPath/a.dart', r''' |
| part of 'test.dart'; |
| @deprecated |
| export 'dart:math'; |
| '''); |
| var library = await buildLibrary(''' |
| part 'a.dart'; |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| nextFragment: #F1 |
| parts |
| part_0 |
| uri: package:test/a.dart |
| partKeywordOffset: 0 |
| unit: #F1 |
| #F1 package:test/a.dart |
| element: <testLibrary> |
| enclosingFragment: #F0 |
| previousFragment: #F0 |
| libraryExports |
| dart:math |
| metadata |
| Annotation |
| atSign: @ @21 |
| name: SimpleIdentifier |
| token: deprecated @22 |
| element: dart:core::@getter::deprecated |
| staticType: null |
| element: dart:core::@getter::deprecated |
| '''); |
| } |
| |
| test_metadata_partOf_importLibrary() async { |
| newFile('$testPackageLibPath/a.dart', r''' |
| part of 'test.dart'; |
| @deprecated |
| import 'dart:math'; |
| '''); |
| var library = await buildLibrary(''' |
| part 'a.dart'; |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| nextFragment: #F1 |
| parts |
| part_0 |
| uri: package:test/a.dart |
| partKeywordOffset: 0 |
| unit: #F1 |
| #F1 package:test/a.dart |
| element: <testLibrary> |
| enclosingFragment: #F0 |
| previousFragment: #F0 |
| libraryImports |
| dart:math |
| metadata |
| Annotation |
| atSign: @ @21 |
| name: SimpleIdentifier |
| token: deprecated @22 |
| element: dart:core::@getter::deprecated |
| staticType: null |
| element: dart:core::@getter::deprecated |
| '''); |
| } |
| |
| test_metadata_partOf_part() async { |
| newFile('$testPackageLibPath/a.dart', r''' |
| part of 'b.dart'; |
| '''); |
| |
| newFile('$testPackageLibPath/b.dart', r''' |
| part of 'test.dart'; |
| @deprecated |
| part 'a.dart'; |
| '''); |
| |
| var library = await buildLibrary(''' |
| part 'b.dart'; |
| '''); |
| |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| nextFragment: #F1 |
| parts |
| part_0 |
| uri: package:test/b.dart |
| partKeywordOffset: 0 |
| unit: #F1 |
| #F1 package:test/b.dart |
| element: <testLibrary> |
| enclosingFragment: #F0 |
| previousFragment: #F0 |
| nextFragment: #F2 |
| parts |
| part_1 |
| uri: package:test/a.dart |
| partKeywordOffset: 33 |
| metadata |
| Annotation |
| atSign: @ @21 |
| name: SimpleIdentifier |
| token: deprecated @22 |
| element: dart:core::@getter::deprecated |
| staticType: null |
| element: dart:core::@getter::deprecated |
| unit: #F2 |
| #F2 package:test/a.dart |
| element: <testLibrary> |
| enclosingFragment: #F1 |
| previousFragment: #F1 |
| '''); |
| } |
| |
| test_metadata_prefixed_variable() async { |
| newFile('$testPackageLibPath/a.dart', 'const b = null;'); |
| var library = await buildLibrary('import "a.dart" as a; @a.b class C {}'); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| libraryImports |
| package:test/a.dart as a (nameOffset:19) (firstTokenOffset:<null>) (offset:19) |
| prefixes |
| <testLibraryFragment>::@prefix2::a |
| fragments: @19 |
| classes |
| #F1 class C (nameOffset:33) (firstTokenOffset:22) (offset:33) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| '''); |
| } |
| |
| test_metadata_simpleFormalParameter() async { |
| var library = await buildLibrary('const a = null; f(@a x) {}'); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| topLevelVariables |
| #F1 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| NullLiteral |
| literal: null @10 |
| staticType: Null |
| getters |
| #F2 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| functions |
| #F3 f (nameOffset:16) (firstTokenOffset:16) (offset:16) |
| element: <testLibrary>::@function::f |
| formalParameters |
| #F4 x (nameOffset:21) (firstTokenOffset:18) (offset:21) |
| element: <testLibrary>::@function::f::@formalParameter::x |
| metadata |
| Annotation |
| atSign: @ @18 |
| name: SimpleIdentifier |
| token: a @19 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F1 |
| type: dynamic |
| constantInitializer |
| fragment: #F1 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F2 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::a |
| functions |
| f |
| reference: <testLibrary>::@function::f |
| firstFragment: #F3 |
| formalParameters |
| #E0 requiredPositional hasImplicitType x |
| firstFragment: #F4 |
| type: dynamic |
| metadata |
| Annotation |
| atSign: @ @18 |
| name: SimpleIdentifier |
| token: a @19 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| returnType: dynamic |
| '''); |
| } |
| |
| test_metadata_simpleFormalParameter_method() async { |
| var library = await buildLibrary(''' |
| const a = null; |
| |
| class C { |
| m(@a x) {} |
| } |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class C (nameOffset:23) (firstTokenOffset:17) (offset:23) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| methods |
| #F3 m (nameOffset:29) (firstTokenOffset:29) (offset:29) |
| element: <testLibrary>::@class::C::@method::m |
| formalParameters |
| #F4 x (nameOffset:34) (firstTokenOffset:31) (offset:34) |
| element: <testLibrary>::@class::C::@method::m::@formalParameter::x |
| metadata |
| Annotation |
| atSign: @ @31 |
| name: SimpleIdentifier |
| token: a @32 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| topLevelVariables |
| #F5 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| NullLiteral |
| literal: null @10 |
| staticType: Null |
| getters |
| #F6 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| methods |
| m |
| reference: <testLibrary>::@class::C::@method::m |
| firstFragment: #F3 |
| formalParameters |
| #E0 requiredPositional hasImplicitType x |
| firstFragment: #F4 |
| type: dynamic |
| metadata |
| Annotation |
| atSign: @ @31 |
| name: SimpleIdentifier |
| token: a @32 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| returnType: dynamic |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F5 |
| type: dynamic |
| constantInitializer |
| fragment: #F5 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F6 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::a |
| '''); |
| } |
| |
| test_metadata_simpleFormalParameter_unit_setter() async { |
| var library = await buildLibrary(''' |
| const a = null; |
| |
| set foo(@a int x) {} |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| topLevelVariables |
| #F1 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| NullLiteral |
| literal: null @10 |
| staticType: Null |
| #F2 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21) |
| element: <testLibrary>::@topLevelVariable::foo |
| getters |
| #F3 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| setters |
| #F4 foo (nameOffset:21) (firstTokenOffset:17) (offset:21) |
| element: <testLibrary>::@setter::foo |
| formalParameters |
| #F5 x (nameOffset:32) (firstTokenOffset:25) (offset:32) |
| element: <testLibrary>::@setter::foo::@formalParameter::x |
| metadata |
| Annotation |
| atSign: @ @25 |
| name: SimpleIdentifier |
| token: a @26 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F1 |
| type: dynamic |
| constantInitializer |
| fragment: #F1 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| synthetic foo |
| reference: <testLibrary>::@topLevelVariable::foo |
| firstFragment: #F2 |
| type: int |
| setter: <testLibrary>::@setter::foo |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F3 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::a |
| setters |
| static foo |
| reference: <testLibrary>::@setter::foo |
| firstFragment: #F4 |
| formalParameters |
| #E0 requiredPositional x |
| firstFragment: #F5 |
| type: int |
| metadata |
| Annotation |
| atSign: @ @25 |
| name: SimpleIdentifier |
| token: a @26 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| returnType: void |
| variable: <testLibrary>::@topLevelVariable::foo |
| '''); |
| } |
| |
| test_metadata_simpleFormalParameter_withDefault() async { |
| var library = await buildLibrary('const a = null; f([@a x = null]) {}'); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| topLevelVariables |
| #F1 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| NullLiteral |
| literal: null @10 |
| staticType: Null |
| getters |
| #F2 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| functions |
| #F3 f (nameOffset:16) (firstTokenOffset:16) (offset:16) |
| element: <testLibrary>::@function::f |
| formalParameters |
| #F4 x (nameOffset:22) (firstTokenOffset:19) (offset:22) |
| element: <testLibrary>::@function::f::@formalParameter::x |
| metadata |
| Annotation |
| atSign: @ @19 |
| name: SimpleIdentifier |
| token: a @20 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| initializer: expression_1 |
| NullLiteral |
| literal: null @26 |
| staticType: Null |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F1 |
| type: dynamic |
| constantInitializer |
| fragment: #F1 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F2 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::a |
| functions |
| f |
| reference: <testLibrary>::@function::f |
| firstFragment: #F3 |
| formalParameters |
| #E0 optionalPositional hasImplicitType x |
| firstFragment: #F4 |
| type: dynamic |
| metadata |
| Annotation |
| atSign: @ @19 |
| name: SimpleIdentifier |
| token: a @20 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| constantInitializer |
| fragment: #F4 |
| expression: expression_1 |
| returnType: dynamic |
| '''); |
| } |
| |
| test_metadata_superFormalParameter() async { |
| var library = await buildLibrary(''' |
| const a = null; |
| |
| class A { |
| A(int x); |
| } |
| |
| class B extends A { |
| B(@a super.x); |
| } |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class A (nameOffset:23) (firstTokenOffset:17) (offset:23) |
| element: <testLibrary>::@class::A |
| constructors |
| #F2 new (nameOffset:<null>) (firstTokenOffset:29) (offset:29) |
| element: <testLibrary>::@class::A::@constructor::new |
| typeName: A |
| typeNameOffset: 29 |
| formalParameters |
| #F3 x (nameOffset:35) (firstTokenOffset:31) (offset:35) |
| element: <testLibrary>::@class::A::@constructor::new::@formalParameter::x |
| #F4 class B (nameOffset:48) (firstTokenOffset:42) (offset:48) |
| element: <testLibrary>::@class::B |
| constructors |
| #F5 new (nameOffset:<null>) (firstTokenOffset:64) (offset:64) |
| element: <testLibrary>::@class::B::@constructor::new |
| typeName: B |
| typeNameOffset: 64 |
| formalParameters |
| #F6 super.x (nameOffset:75) (firstTokenOffset:66) (offset:75) |
| element: <testLibrary>::@class::B::@constructor::new::@formalParameter::x |
| metadata |
| Annotation |
| atSign: @ @66 |
| name: SimpleIdentifier |
| token: a @67 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| topLevelVariables |
| #F7 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| NullLiteral |
| literal: null @10 |
| staticType: Null |
| getters |
| #F8 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| classes |
| class A |
| reference: <testLibrary>::@class::A |
| firstFragment: #F1 |
| constructors |
| new |
| reference: <testLibrary>::@class::A::@constructor::new |
| firstFragment: #F2 |
| formalParameters |
| #E0 requiredPositional x |
| firstFragment: #F3 |
| type: int |
| class B |
| reference: <testLibrary>::@class::B |
| firstFragment: #F4 |
| supertype: A |
| constructors |
| new |
| reference: <testLibrary>::@class::B::@constructor::new |
| firstFragment: #F5 |
| formalParameters |
| #E1 requiredPositional final hasImplicitType x |
| firstFragment: #F6 |
| type: int |
| metadata |
| Annotation |
| atSign: @ @66 |
| name: SimpleIdentifier |
| token: a @67 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| superConstructor: <testLibrary>::@class::A::@constructor::new |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F7 |
| type: dynamic |
| constantInitializer |
| fragment: #F7 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F8 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::a |
| '''); |
| } |
| |
| test_metadata_topLevelVariableDeclaration() async { |
| var library = await buildLibrary('const a = null; @a int v;'); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| topLevelVariables |
| #F1 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| NullLiteral |
| literal: null @10 |
| staticType: Null |
| #F2 v (nameOffset:23) (firstTokenOffset:23) (offset:23) |
| element: <testLibrary>::@topLevelVariable::v |
| metadata |
| Annotation |
| atSign: @ @16 |
| name: SimpleIdentifier |
| token: a @17 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| getters |
| #F3 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| #F4 synthetic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23) |
| element: <testLibrary>::@getter::v |
| setters |
| #F5 synthetic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23) |
| element: <testLibrary>::@setter::v |
| formalParameters |
| #F6 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23) |
| element: <testLibrary>::@setter::v::@formalParameter::value |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F1 |
| type: dynamic |
| constantInitializer |
| fragment: #F1 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| v |
| reference: <testLibrary>::@topLevelVariable::v |
| firstFragment: #F2 |
| metadata |
| Annotation |
| atSign: @ @16 |
| name: SimpleIdentifier |
| token: a @17 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| type: int |
| getter: <testLibrary>::@getter::v |
| setter: <testLibrary>::@setter::v |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F3 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::a |
| synthetic static v |
| reference: <testLibrary>::@getter::v |
| firstFragment: #F4 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::v |
| setters |
| synthetic static v |
| reference: <testLibrary>::@setter::v |
| firstFragment: #F5 |
| formalParameters |
| #E0 requiredPositional value |
| firstFragment: #F6 |
| type: int |
| returnType: void |
| variable: <testLibrary>::@topLevelVariable::v |
| '''); |
| } |
| |
| test_metadata_typeParameter_ofClass() async { |
| var library = await buildLibrary('const a = null; class C<@a T> {}'); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class C (nameOffset:22) (firstTokenOffset:16) (offset:22) |
| element: <testLibrary>::@class::C |
| typeParameters |
| #F2 T (nameOffset:27) (firstTokenOffset:24) (offset:27) |
| element: #E0 T |
| metadata |
| Annotation |
| atSign: @ @24 |
| name: SimpleIdentifier |
| token: a @25 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| constructors |
| #F3 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| topLevelVariables |
| #F4 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| NullLiteral |
| literal: null @10 |
| staticType: Null |
| getters |
| #F5 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| typeParameters |
| #E0 T |
| firstFragment: #F2 |
| metadata |
| Annotation |
| atSign: @ @24 |
| name: SimpleIdentifier |
| token: a @25 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F3 |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F4 |
| type: dynamic |
| constantInitializer |
| fragment: #F4 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F5 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::a |
| '''); |
| } |
| |
| test_metadata_typeParameter_ofClassTypeAlias() async { |
| var library = await buildLibrary(''' |
| const a = null; |
| class C<@a T> = D with E; |
| class D {} |
| class E {}'''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class C (nameOffset:22) (firstTokenOffset:16) (offset:22) |
| element: <testLibrary>::@class::C |
| typeParameters |
| #F2 T (nameOffset:27) (firstTokenOffset:24) (offset:27) |
| element: #E0 T |
| metadata |
| Annotation |
| atSign: @ @24 |
| name: SimpleIdentifier |
| token: a @25 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| constructors |
| #F3 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| #F4 class D (nameOffset:48) (firstTokenOffset:42) (offset:48) |
| element: <testLibrary>::@class::D |
| constructors |
| #F5 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48) |
| element: <testLibrary>::@class::D::@constructor::new |
| typeName: D |
| #F6 class E (nameOffset:59) (firstTokenOffset:53) (offset:59) |
| element: <testLibrary>::@class::E |
| constructors |
| #F7 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:59) |
| element: <testLibrary>::@class::E::@constructor::new |
| typeName: E |
| topLevelVariables |
| #F8 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| NullLiteral |
| literal: null @10 |
| staticType: Null |
| getters |
| #F9 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| classes |
| class alias C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| typeParameters |
| #E0 T |
| firstFragment: #F2 |
| metadata |
| Annotation |
| atSign: @ @24 |
| name: SimpleIdentifier |
| token: a @25 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| supertype: D |
| mixins |
| E |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F3 |
| constantInitializers |
| SuperConstructorInvocation |
| superKeyword: super @0 |
| argumentList: ArgumentList |
| leftParenthesis: ( @0 |
| rightParenthesis: ) @0 |
| element: <testLibrary>::@class::D::@constructor::new |
| superConstructor: <testLibrary>::@class::D::@constructor::new |
| class D |
| reference: <testLibrary>::@class::D |
| firstFragment: #F4 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::D::@constructor::new |
| firstFragment: #F5 |
| class E |
| reference: <testLibrary>::@class::E |
| firstFragment: #F6 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::E::@constructor::new |
| firstFragment: #F7 |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F8 |
| type: dynamic |
| constantInitializer |
| fragment: #F8 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F9 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::a |
| '''); |
| } |
| |
| test_metadata_typeParameter_ofFunction() async { |
| var library = await buildLibrary('const a = null; f<@a T>() {}'); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| topLevelVariables |
| #F1 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| NullLiteral |
| literal: null @10 |
| staticType: Null |
| getters |
| #F2 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| functions |
| #F3 f (nameOffset:16) (firstTokenOffset:16) (offset:16) |
| element: <testLibrary>::@function::f |
| typeParameters |
| #F4 T (nameOffset:21) (firstTokenOffset:18) (offset:21) |
| element: #E0 T |
| metadata |
| Annotation |
| atSign: @ @18 |
| name: SimpleIdentifier |
| token: a @19 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F1 |
| type: dynamic |
| constantInitializer |
| fragment: #F1 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F2 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::a |
| functions |
| f |
| reference: <testLibrary>::@function::f |
| firstFragment: #F3 |
| typeParameters |
| #E0 T |
| firstFragment: #F4 |
| metadata |
| Annotation |
| atSign: @ @18 |
| name: SimpleIdentifier |
| token: a @19 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| returnType: dynamic |
| '''); |
| } |
| |
| test_metadata_typeParameter_ofTypedef() async { |
| var library = await buildLibrary('const a = null; typedef F<@a T>();'); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| typeAliases |
| #F1 F (nameOffset:24) (firstTokenOffset:16) (offset:24) |
| element: <testLibrary>::@typeAlias::F |
| typeParameters |
| #F2 T (nameOffset:29) (firstTokenOffset:26) (offset:29) |
| element: #E0 T |
| metadata |
| Annotation |
| atSign: @ @26 |
| name: SimpleIdentifier |
| token: a @27 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| topLevelVariables |
| #F3 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| NullLiteral |
| literal: null @10 |
| staticType: Null |
| getters |
| #F4 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| typeAliases |
| F |
| reference: <testLibrary>::@typeAlias::F |
| firstFragment: #F1 |
| typeParameters |
| #E0 T |
| firstFragment: #F2 |
| metadata |
| Annotation |
| atSign: @ @26 |
| name: SimpleIdentifier |
| token: a @27 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| aliasedType: dynamic Function() |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F3 |
| type: dynamic |
| constantInitializer |
| fragment: #F3 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F4 |
| returnType: dynamic |
| variable: <testLibrary>::@topLevelVariable::a |
| '''); |
| } |
| |
| test_metadata_unit_topLevelVariable_first() async { |
| var library = await buildLibrary(r''' |
| const a = 0; |
| @a |
| int x = 0; |
| '''); |
| // Check metadata without asking any other properties. |
| var x = library.getTopLevelVariable('x')!; |
| expect(x.metadata.annotations, hasLength(1)); |
| // Check details. |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| topLevelVariables |
| #F1 hasInitializer a (nameOffset:6) (firstTokenOffset:6) (offset:6) |
| element: <testLibrary>::@topLevelVariable::a |
| initializer: expression_0 |
| IntegerLiteral |
| literal: 0 @10 |
| staticType: int |
| #F2 hasInitializer x (nameOffset:20) (firstTokenOffset:20) (offset:20) |
| element: <testLibrary>::@topLevelVariable::x |
| metadata |
| Annotation |
| atSign: @ @13 |
| name: SimpleIdentifier |
| token: a @14 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| getters |
| #F3 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@getter::a |
| #F4 synthetic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20) |
| element: <testLibrary>::@getter::x |
| setters |
| #F5 synthetic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20) |
| element: <testLibrary>::@setter::x |
| formalParameters |
| #F6 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20) |
| element: <testLibrary>::@setter::x::@formalParameter::value |
| topLevelVariables |
| const hasInitializer a |
| reference: <testLibrary>::@topLevelVariable::a |
| firstFragment: #F1 |
| type: int |
| constantInitializer |
| fragment: #F1 |
| expression: expression_0 |
| getter: <testLibrary>::@getter::a |
| hasInitializer x |
| reference: <testLibrary>::@topLevelVariable::x |
| firstFragment: #F2 |
| metadata |
| Annotation |
| atSign: @ @13 |
| name: SimpleIdentifier |
| token: a @14 |
| element: <testLibrary>::@getter::a |
| staticType: null |
| element: <testLibrary>::@getter::a |
| type: int |
| getter: <testLibrary>::@getter::x |
| setter: <testLibrary>::@setter::x |
| getters |
| synthetic static a |
| reference: <testLibrary>::@getter::a |
| firstFragment: #F3 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::a |
| synthetic static x |
| reference: <testLibrary>::@getter::x |
| firstFragment: #F4 |
| returnType: int |
| variable: <testLibrary>::@topLevelVariable::x |
| setters |
| synthetic static x |
| reference: <testLibrary>::@setter::x |
| firstFragment: #F5 |
| formalParameters |
| #E0 requiredPositional value |
| firstFragment: #F6 |
| type: int |
| returnType: void |
| variable: <testLibrary>::@topLevelVariable::x |
| '''); |
| } |
| |
| test_metadata_value_class_staticField() async { |
| var library = await buildLibrary(''' |
| class A { |
| static const x = 0; |
| } |
| @A.x |
| class C {} |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6) |
| element: <testLibrary>::@class::A |
| fields |
| #F2 hasInitializer x (nameOffset:25) (firstTokenOffset:25) (offset:25) |
| element: <testLibrary>::@class::A::@field::x |
| initializer: expression_0 |
| IntegerLiteral |
| literal: 0 @29 |
| staticType: int |
| constructors |
| #F3 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6) |
| element: <testLibrary>::@class::A::@constructor::new |
| typeName: A |
| getters |
| #F4 synthetic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25) |
| element: <testLibrary>::@class::A::@getter::x |
| #F5 class C (nameOffset:45) (firstTokenOffset:34) (offset:45) |
| element: <testLibrary>::@class::C |
| constructors |
| #F6 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:45) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class A |
| reference: <testLibrary>::@class::A |
| firstFragment: #F1 |
| fields |
| static const hasInitializer x |
| reference: <testLibrary>::@class::A::@field::x |
| firstFragment: #F2 |
| type: int |
| constantInitializer |
| fragment: #F2 |
| expression: expression_0 |
| getter: <testLibrary>::@class::A::@getter::x |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::A::@constructor::new |
| firstFragment: #F3 |
| getters |
| synthetic static x |
| reference: <testLibrary>::@class::A::@getter::x |
| firstFragment: #F4 |
| returnType: int |
| variable: <testLibrary>::@class::A::@field::x |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F5 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F6 |
| '''); |
| } |
| |
| test_metadata_value_enum_constant() async { |
| var library = await buildLibrary(''' |
| enum E {a, b, c} |
| @E.b |
| class C {} |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class C (nameOffset:28) (firstTokenOffset:17) (offset:28) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| enums |
| #F3 enum E (nameOffset:5) (firstTokenOffset:0) (offset:5) |
| element: <testLibrary>::@enum::E |
| fields |
| #F4 hasInitializer a (nameOffset:8) (firstTokenOffset:8) (offset:8) |
| element: <testLibrary>::@enum::E::@field::a |
| initializer: expression_0 |
| InstanceCreationExpression |
| constructorName: ConstructorName |
| type: NamedType |
| name: E @-1 |
| element: <testLibrary>::@enum::E |
| type: E |
| element: <testLibrary>::@enum::E::@constructor::new |
| argumentList: ArgumentList |
| leftParenthesis: ( @0 |
| rightParenthesis: ) @0 |
| staticType: E |
| #F5 hasInitializer b (nameOffset:11) (firstTokenOffset:11) (offset:11) |
| element: <testLibrary>::@enum::E::@field::b |
| initializer: expression_1 |
| InstanceCreationExpression |
| constructorName: ConstructorName |
| type: NamedType |
| name: E @-1 |
| element: <testLibrary>::@enum::E |
| type: E |
| element: <testLibrary>::@enum::E::@constructor::new |
| argumentList: ArgumentList |
| leftParenthesis: ( @0 |
| rightParenthesis: ) @0 |
| staticType: E |
| #F6 hasInitializer c (nameOffset:14) (firstTokenOffset:14) (offset:14) |
| element: <testLibrary>::@enum::E::@field::c |
| initializer: expression_2 |
| InstanceCreationExpression |
| constructorName: ConstructorName |
| type: NamedType |
| name: E @-1 |
| element: <testLibrary>::@enum::E |
| type: E |
| element: <testLibrary>::@enum::E::@constructor::new |
| argumentList: ArgumentList |
| leftParenthesis: ( @0 |
| rightParenthesis: ) @0 |
| staticType: E |
| #F7 synthetic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5) |
| element: <testLibrary>::@enum::E::@field::values |
| initializer: expression_3 |
| ListLiteral |
| leftBracket: [ @0 |
| elements |
| SimpleIdentifier |
| token: a @-1 |
| element: <testLibrary>::@enum::E::@getter::a |
| staticType: E |
| SimpleIdentifier |
| token: b @-1 |
| element: <testLibrary>::@enum::E::@getter::b |
| staticType: E |
| SimpleIdentifier |
| token: c @-1 |
| element: <testLibrary>::@enum::E::@getter::c |
| staticType: E |
| rightBracket: ] @0 |
| staticType: List<E> |
| constructors |
| #F8 synthetic const new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5) |
| element: <testLibrary>::@enum::E::@constructor::new |
| typeName: E |
| getters |
| #F9 synthetic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:8) |
| element: <testLibrary>::@enum::E::@getter::a |
| #F10 synthetic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11) |
| element: <testLibrary>::@enum::E::@getter::b |
| #F11 synthetic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14) |
| element: <testLibrary>::@enum::E::@getter::c |
| #F12 synthetic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5) |
| element: <testLibrary>::@enum::E::@getter::values |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| enums |
| enum E |
| reference: <testLibrary>::@enum::E |
| firstFragment: #F3 |
| supertype: Enum |
| fields |
| static const enumConstant hasInitializer a |
| reference: <testLibrary>::@enum::E::@field::a |
| firstFragment: #F4 |
| type: E |
| constantInitializer |
| fragment: #F4 |
| expression: expression_0 |
| getter: <testLibrary>::@enum::E::@getter::a |
| static const enumConstant hasInitializer b |
| reference: <testLibrary>::@enum::E::@field::b |
| firstFragment: #F5 |
| type: E |
| constantInitializer |
| fragment: #F5 |
| expression: expression_1 |
| getter: <testLibrary>::@enum::E::@getter::b |
| static const enumConstant hasInitializer c |
| reference: <testLibrary>::@enum::E::@field::c |
| firstFragment: #F6 |
| type: E |
| constantInitializer |
| fragment: #F6 |
| expression: expression_2 |
| getter: <testLibrary>::@enum::E::@getter::c |
| synthetic static const values |
| reference: <testLibrary>::@enum::E::@field::values |
| firstFragment: #F7 |
| type: List<E> |
| constantInitializer |
| fragment: #F7 |
| expression: expression_3 |
| getter: <testLibrary>::@enum::E::@getter::values |
| constructors |
| synthetic const new |
| reference: <testLibrary>::@enum::E::@constructor::new |
| firstFragment: #F8 |
| getters |
| synthetic static a |
| reference: <testLibrary>::@enum::E::@getter::a |
| firstFragment: #F9 |
| returnType: E |
| variable: <testLibrary>::@enum::E::@field::a |
| synthetic static b |
| reference: <testLibrary>::@enum::E::@getter::b |
| firstFragment: #F10 |
| returnType: E |
| variable: <testLibrary>::@enum::E::@field::b |
| synthetic static c |
| reference: <testLibrary>::@enum::E::@getter::c |
| firstFragment: #F11 |
| returnType: E |
| variable: <testLibrary>::@enum::E::@field::c |
| synthetic static values |
| reference: <testLibrary>::@enum::E::@getter::values |
| firstFragment: #F12 |
| returnType: List<E> |
| variable: <testLibrary>::@enum::E::@field::values |
| '''); |
| } |
| |
| test_metadata_value_extension_staticField() async { |
| var library = await buildLibrary(''' |
| extension E on int { |
| static const x = 0; |
| } |
| @E.x |
| class C {} |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class C (nameOffset:56) (firstTokenOffset:45) (offset:56) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:56) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| extensions |
| #F3 extension E (nameOffset:10) (firstTokenOffset:0) (offset:10) |
| element: <testLibrary>::@extension::E |
| fields |
| #F4 hasInitializer x (nameOffset:36) (firstTokenOffset:36) (offset:36) |
| element: <testLibrary>::@extension::E::@field::x |
| initializer: expression_0 |
| IntegerLiteral |
| literal: 0 @40 |
| staticType: int |
| getters |
| #F5 synthetic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36) |
| element: <testLibrary>::@extension::E::@getter::x |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| extensions |
| extension E |
| reference: <testLibrary>::@extension::E |
| firstFragment: #F3 |
| extendedType: int |
| fields |
| static const hasInitializer x |
| reference: <testLibrary>::@extension::E::@field::x |
| firstFragment: #F4 |
| type: int |
| constantInitializer |
| fragment: #F4 |
| expression: expression_0 |
| getter: <testLibrary>::@extension::E::@getter::x |
| getters |
| synthetic static x |
| reference: <testLibrary>::@extension::E::@getter::x |
| firstFragment: #F5 |
| returnType: int |
| variable: <testLibrary>::@extension::E::@field::x |
| '''); |
| } |
| |
| test_metadata_value_extension_staticField_unnamed() async { |
| var library = await buildLibrary(''' |
| extension on Object { |
| @foo |
| static const foo = 0; |
| } |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| extensions |
| #F1 extension <null-name> (nameOffset:<null>) (firstTokenOffset:0) (offset:0) |
| element: <testLibrary>::@extension::0 |
| fields |
| #F2 hasInitializer foo (nameOffset:44) (firstTokenOffset:44) (offset:44) |
| element: <testLibrary>::@extension::0::@field::foo |
| initializer: expression_0 |
| IntegerLiteral |
| literal: 0 @50 |
| staticType: int |
| getters |
| #F3 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44) |
| element: <testLibrary>::@extension::0::@getter::foo |
| extensions |
| extension <null-name> |
| reference: <testLibrary>::@extension::0 |
| firstFragment: #F1 |
| extendedType: Object |
| fields |
| static const hasInitializer foo |
| reference: <testLibrary>::@extension::0::@field::foo |
| firstFragment: #F2 |
| type: int |
| constantInitializer |
| fragment: #F2 |
| expression: expression_0 |
| getter: <testLibrary>::@extension::0::@getter::foo |
| getters |
| synthetic static foo |
| reference: <testLibrary>::@extension::0::@getter::foo |
| firstFragment: #F3 |
| returnType: int |
| variable: <testLibrary>::@extension::0::@field::foo |
| '''); |
| } |
| |
| test_metadata_value_prefix_extension_staticField() async { |
| newFile('$testPackageLibPath/foo.dart', ''' |
| extension E on int { |
| static const x = 0; |
| } |
| '''); |
| var library = await buildLibrary(''' |
| import 'foo.dart' as foo; |
| @foo.E.x |
| class C {} |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| libraryImports |
| package:test/foo.dart as foo (nameOffset:21) (firstTokenOffset:<null>) (offset:21) |
| prefixes |
| <testLibraryFragment>::@prefix2::foo |
| fragments: @21 |
| classes |
| #F1 class C (nameOffset:41) (firstTokenOffset:26) (offset:41) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:41) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| '''); |
| } |
| |
| test_unresolved_annotation_instanceCreation_argument_super() async { |
| var library = await buildLibrary(''' |
| class A { |
| const A(_); |
| } |
| |
| @A(super) |
| class C {} |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6) |
| element: <testLibrary>::@class::A |
| constructors |
| #F2 const new (nameOffset:<null>) (firstTokenOffset:12) (offset:18) |
| element: <testLibrary>::@class::A::@constructor::new |
| typeName: A |
| typeNameOffset: 18 |
| formalParameters |
| #F3 _ (nameOffset:20) (firstTokenOffset:20) (offset:20) |
| element: <testLibrary>::@class::A::@constructor::new::@formalParameter::_ |
| #F4 class C (nameOffset:43) (firstTokenOffset:27) (offset:43) |
| element: <testLibrary>::@class::C |
| constructors |
| #F5 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:43) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class A |
| reference: <testLibrary>::@class::A |
| firstFragment: #F1 |
| constructors |
| const new |
| reference: <testLibrary>::@class::A::@constructor::new |
| firstFragment: #F2 |
| formalParameters |
| #E0 requiredPositional hasImplicitType _ |
| firstFragment: #F3 |
| type: dynamic |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F4 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F5 |
| '''); |
| } |
| |
| test_unresolved_annotation_instanceCreation_argument_this() async { |
| var library = await buildLibrary(''' |
| class A { |
| const A(_); |
| } |
| |
| @A(this) |
| class C {} |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6) |
| element: <testLibrary>::@class::A |
| constructors |
| #F2 const new (nameOffset:<null>) (firstTokenOffset:12) (offset:18) |
| element: <testLibrary>::@class::A::@constructor::new |
| typeName: A |
| typeNameOffset: 18 |
| formalParameters |
| #F3 _ (nameOffset:20) (firstTokenOffset:20) (offset:20) |
| element: <testLibrary>::@class::A::@constructor::new::@formalParameter::_ |
| #F4 class C (nameOffset:42) (firstTokenOffset:27) (offset:42) |
| element: <testLibrary>::@class::C |
| constructors |
| #F5 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class A |
| reference: <testLibrary>::@class::A |
| firstFragment: #F1 |
| constructors |
| const new |
| reference: <testLibrary>::@class::A::@constructor::new |
| firstFragment: #F2 |
| formalParameters |
| #E0 requiredPositional hasImplicitType _ |
| firstFragment: #F3 |
| type: dynamic |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F4 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F5 |
| '''); |
| } |
| |
| test_unresolved_annotation_namedConstructorCall_noClass() async { |
| var library = await buildLibrary('@foo.bar() class C {}'); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class C (nameOffset:17) (firstTokenOffset:0) (offset:17) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| '''); |
| } |
| |
| test_unresolved_annotation_namedConstructorCall_noConstructor() async { |
| var library = await buildLibrary('@String.foo() class C {}'); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class C (nameOffset:20) (firstTokenOffset:0) (offset:20) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| '''); |
| } |
| |
| test_unresolved_annotation_prefixedIdentifier_badPrefix() async { |
| var library = await buildLibrary('@foo.bar class C {}'); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class C (nameOffset:15) (firstTokenOffset:0) (offset:15) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:15) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| '''); |
| } |
| |
| test_unresolved_annotation_prefixedIdentifier_noDeclaration() async { |
| var library = await buildLibrary( |
| 'import "dart:async" as foo; @foo.bar class C {}', |
| ); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| libraryImports |
| dart:async as foo (nameOffset:23) (firstTokenOffset:<null>) (offset:23) |
| prefixes |
| <testLibraryFragment>::@prefix2::foo |
| fragments: @23 |
| classes |
| #F1 class C (nameOffset:43) (firstTokenOffset:28) (offset:43) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:43) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| '''); |
| } |
| |
| test_unresolved_annotation_prefixedNamedConstructorCall_badPrefix() async { |
| var library = await buildLibrary('@foo.bar.baz() class C {}'); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class C (nameOffset:21) (firstTokenOffset:0) (offset:21) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| '''); |
| } |
| |
| test_unresolved_annotation_prefixedNamedConstructorCall_noClass() async { |
| var library = await buildLibrary( |
| 'import "dart:async" as foo; @foo.bar.baz() class C {}', |
| ); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| libraryImports |
| dart:async as foo (nameOffset:23) (firstTokenOffset:<null>) (offset:23) |
| prefixes |
| <testLibraryFragment>::@prefix2::foo |
| fragments: @23 |
| classes |
| #F1 class C (nameOffset:49) (firstTokenOffset:28) (offset:49) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:49) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| '''); |
| } |
| |
| test_unresolved_annotation_prefixedNamedConstructorCall_noConstructor() async { |
| var library = await buildLibrary( |
| 'import "dart:async" as foo; @foo.Future.bar() class C {}', |
| ); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| libraryImports |
| dart:async as foo (nameOffset:23) (firstTokenOffset:<null>) (offset:23) |
| prefixes |
| <testLibraryFragment>::@prefix2::foo |
| fragments: @23 |
| classes |
| #F1 class C (nameOffset:52) (firstTokenOffset:28) (offset:52) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:52) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| '''); |
| } |
| |
| test_unresolved_annotation_prefixedUnnamedConstructorCall_badPrefix() async { |
| var library = await buildLibrary('@foo.bar() class C {}'); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class C (nameOffset:17) (firstTokenOffset:0) (offset:17) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| '''); |
| } |
| |
| test_unresolved_annotation_prefixedUnnamedConstructorCall_noClass() async { |
| var library = await buildLibrary( |
| 'import "dart:async" as foo; @foo.bar() class C {}', |
| ); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| libraryImports |
| dart:async as foo (nameOffset:23) (firstTokenOffset:<null>) (offset:23) |
| prefixes |
| <testLibraryFragment>::@prefix2::foo |
| fragments: @23 |
| classes |
| #F1 class C (nameOffset:45) (firstTokenOffset:28) (offset:45) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:45) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| '''); |
| } |
| |
| test_unresolved_annotation_simpleIdentifier() async { |
| var library = await buildLibrary('@foo class C {}'); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class C (nameOffset:11) (firstTokenOffset:0) (offset:11) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| '''); |
| } |
| |
| test_unresolved_annotation_simpleIdentifier_multiplyDefined() async { |
| if (!keepLinkingLibraries) return; |
| |
| newFile('$testPackageLibPath/a.dart', 'const v = 0;'); |
| newFile('$testPackageLibPath/b.dart', 'const v = 0;'); |
| var library = await buildLibrary(''' |
| import 'a.dart'; |
| import 'b.dart'; |
| |
| @v |
| class C {} |
| '''); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| libraryImports |
| package:test/a.dart |
| package:test/b.dart |
| classes |
| #F1 class C (nameOffset:44) (firstTokenOffset:35) (offset:44) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| '''); |
| } |
| |
| test_unresolved_annotation_unnamedConstructorCall_noClass() async { |
| var library = await buildLibrary('@foo() class C {}'); |
| checkElementText(library, r''' |
| library |
| reference: <testLibrary> |
| fragments |
| #F0 <testLibraryFragment> |
| element: <testLibrary> |
| classes |
| #F1 class C (nameOffset:13) (firstTokenOffset:0) (offset:13) |
| element: <testLibrary>::@class::C |
| constructors |
| #F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:13) |
| element: <testLibrary>::@class::C::@constructor::new |
| typeName: C |
| classes |
| class C |
| reference: <testLibrary>::@class::C |
| firstFragment: #F1 |
| constructors |
| synthetic new |
| reference: <testLibrary>::@class::C::@constructor::new |
| firstFragment: #F2 |
| '''); |
| } |
| } |
| |
| @reflectiveTest |
| class MetadataElementTest_fromBytes extends MetadataElementTest { |
| @override |
| bool get keepLinkingLibraries => false; |
| } |
| |
| @reflectiveTest |
| class MetadataElementTest_keepLinking extends MetadataElementTest { |
| @override |
| bool get keepLinkingLibraries => true; |
| } |