blob: 253e8f4630aa2802a1cdbb14bec2ddc9e0e68be4 [file]
// 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_reflective_loader/test_reflective_loader.dart';
import '../../dart/resolution/node_text_expectations.dart';
import '../elements_base.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(NonSyntheticElementTest_keepLinking);
defineReflectiveTests(NonSyntheticElementTest_fromBytes);
defineReflectiveTests(UpdateNodeTextExpectations);
});
}
abstract class NonSyntheticElementTest extends ElementsBaseTest {
test_nonSynthetic_class_field() async {
var library = await buildLibrary(r'''
class C {
int foo = 0;
}
''');
configuration.withNonSynthetic = true;
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
classes
#F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@class::C
fields
#F2 hasInitializer isOriginDeclaration foo (nameOffset:16) (firstTokenOffset:16) (offset:16)
element: <testLibrary>::@class::C::@field::foo
inducedGetter: #F3
inducedSetter: #F4
constructors
#F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@class::C::@constructor::new
typeName: C
getters
#F3 isComplete isOriginVariable foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@class::C::@getter::foo
inducingVariable: #F2
setters
#F4 isComplete isOriginVariable foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@class::C::@setter::foo
inducingVariable: #F2
formalParameters
#F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@class::C::@setter::foo::@formalParameter::value
classes
hasNonFinalField isSimplyBounded class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
hasInitializer isOriginDeclaration foo
reference: <testLibrary>::@class::C::@field::foo
firstFragment: #F2
type: int
getter: <testLibrary>::@class::C::@getter::foo
setter: <testLibrary>::@class::C::@setter::foo
constructors
isOriginImplicitDefault new
reference: <testLibrary>::@class::C::@constructor::new
firstFragment: #F5
getters
isOriginVariable foo
reference: <testLibrary>::@class::C::@getter::foo
firstFragment: #F3
returnType: int
variable: <testLibrary>::@class::C::@field::foo
setters
isOriginVariable foo
reference: <testLibrary>::@class::C::@setter::foo
firstFragment: #F4
formalParameters
#E0 requiredPositional value
firstFragment: #F6
type: int
returnType: void
variable: <testLibrary>::@class::C::@field::foo
''');
}
test_nonSynthetic_class_getter() async {
var library = await buildLibrary(r'''
class C {
int get foo => 0;
}
''');
configuration.withNonSynthetic = true;
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
classes
#F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@class::C
fields
#F2 isOriginGetterSetter foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@class::C::@field::foo
constructors
#F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@class::C::@constructor::new
typeName: C
getters
#F4 isComplete isOriginDeclaration foo (nameOffset:20) (firstTokenOffset:12) (offset:20)
element: <testLibrary>::@class::C::@getter::foo
classes
isSimplyBounded class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
isOriginGetterSetter foo
reference: <testLibrary>::@class::C::@field::foo
firstFragment: #F2
type: int
getter: <testLibrary>::@class::C::@getter::foo
constructors
isOriginImplicitDefault new
reference: <testLibrary>::@class::C::@constructor::new
firstFragment: #F3
getters
isOriginDeclaration foo
reference: <testLibrary>::@class::C::@getter::foo
firstFragment: #F4
returnType: int
variable: <testLibrary>::@class::C::@field::foo
''');
}
test_nonSynthetic_class_setter() async {
var library = await buildLibrary(r'''
class C {
set foo(int value) {}
}
''');
configuration.withNonSynthetic = true;
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
classes
#F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@class::C
fields
#F2 isOriginGetterSetter foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@class::C::@field::foo
constructors
#F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@class::C::@constructor::new
typeName: C
setters
#F4 hasImplicitReturnType isComplete isOriginDeclaration foo (nameOffset:16) (firstTokenOffset:12) (offset:16)
element: <testLibrary>::@class::C::@setter::foo
formalParameters
#F5 requiredPositional isOriginDeclaration value (nameOffset:24) (firstTokenOffset:20) (offset:24)
element: <testLibrary>::@class::C::@setter::foo::@formalParameter::value
classes
isSimplyBounded class C
reference: <testLibrary>::@class::C
firstFragment: #F1
fields
isOriginGetterSetter foo
reference: <testLibrary>::@class::C::@field::foo
firstFragment: #F2
type: int
setter: <testLibrary>::@class::C::@setter::foo
constructors
isOriginImplicitDefault new
reference: <testLibrary>::@class::C::@constructor::new
firstFragment: #F3
setters
isOriginDeclaration foo
reference: <testLibrary>::@class::C::@setter::foo
firstFragment: #F4
formalParameters
#E0 requiredPositional value
firstFragment: #F5
type: int
returnType: void
variable: <testLibrary>::@class::C::@field::foo
''');
}
test_nonSynthetic_enum() async {
var library = await buildLibrary(r'''
enum E { a, b }
''');
configuration.withNonSynthetic = true;
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
enums
#F1 enum E (nameOffset:5) (firstTokenOffset:0) (offset:5)
element: <testLibrary>::@enum::E
fields
#F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic a (nameOffset:9) (firstTokenOffset:9) (offset:9)
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
inducedGetter: #F3
#F4 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic b (nameOffset:12) (firstTokenOffset:12) (offset:12)
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
inducedGetter: #F5
#F6 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
element: <testLibrary>::@enum::E::@field::values
initializer: expression_2
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
rightBracket: ] @0
staticType: List<E>
inducedGetter: #F7
constructors
#F8 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
element: <testLibrary>::@enum::E::@constructor::new
typeName: E
getters
#F3 isComplete isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:9)
element: <testLibrary>::@enum::E::@getter::a
inducingVariable: #F2
#F5 isComplete isOriginVariable isStatic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:12)
element: <testLibrary>::@enum::E::@getter::b
inducingVariable: #F4
#F7 isComplete isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
element: <testLibrary>::@enum::E::@getter::values
inducingVariable: #F6
enums
isSimplyBounded enum E
reference: <testLibrary>::@enum::E
firstFragment: #F1
supertype: Enum
fields
hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic isTypeInferredFromInitializer a
reference: <testLibrary>::@enum::E::@field::a
firstFragment: #F2
type: E
constantInitializer
fragment: #F2
expression: expression_0
getter: <testLibrary>::@enum::E::@getter::a
hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic isTypeInferredFromInitializer b
reference: <testLibrary>::@enum::E::@field::b
firstFragment: #F4
type: E
constantInitializer
fragment: #F4
expression: expression_1
getter: <testLibrary>::@enum::E::@getter::b
isConst isOriginEnumValues isStatic values
reference: <testLibrary>::@enum::E::@field::values
firstFragment: #F6
type: List<E>
constantInitializer
fragment: #F6
expression: expression_2
getter: <testLibrary>::@enum::E::@getter::values
constructors
isConst isOriginImplicitDefault new
reference: <testLibrary>::@enum::E::@constructor::new
firstFragment: #F8
superConstructor: dart:core::@class::Enum::@constructor::new
getters
isOriginVariable isStatic a
reference: <testLibrary>::@enum::E::@getter::a
firstFragment: #F3
returnType: E
variable: <testLibrary>::@enum::E::@field::a
isOriginVariable isStatic b
reference: <testLibrary>::@enum::E::@getter::b
firstFragment: #F5
returnType: E
variable: <testLibrary>::@enum::E::@field::b
isOriginVariable isStatic values
reference: <testLibrary>::@enum::E::@getter::values
firstFragment: #F7
returnType: List<E>
variable: <testLibrary>::@enum::E::@field::values
''');
}
test_nonSynthetic_mixin_field() async {
var library = await buildLibrary(r'''
mixin M {
int foo = 0;
}
''');
configuration.withNonSynthetic = true;
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin M (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::M
fields
#F2 hasInitializer isOriginDeclaration foo (nameOffset:16) (firstTokenOffset:16) (offset:16)
element: <testLibrary>::@mixin::M::@field::foo
inducedGetter: #F3
inducedSetter: #F4
getters
#F3 isComplete isOriginVariable foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::M::@getter::foo
inducingVariable: #F2
setters
#F4 isComplete isOriginVariable foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::M::@setter::foo
inducingVariable: #F2
formalParameters
#F5 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::M::@setter::foo::@formalParameter::value
mixins
hasNonFinalField isSimplyBounded mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F1
superclassConstraints
Object
fields
hasInitializer isOriginDeclaration foo
reference: <testLibrary>::@mixin::M::@field::foo
firstFragment: #F2
type: int
getter: <testLibrary>::@mixin::M::@getter::foo
setter: <testLibrary>::@mixin::M::@setter::foo
getters
isOriginVariable foo
reference: <testLibrary>::@mixin::M::@getter::foo
firstFragment: #F3
returnType: int
variable: <testLibrary>::@mixin::M::@field::foo
setters
isOriginVariable foo
reference: <testLibrary>::@mixin::M::@setter::foo
firstFragment: #F4
formalParameters
#E0 requiredPositional value
firstFragment: #F5
type: int
returnType: void
variable: <testLibrary>::@mixin::M::@field::foo
''');
}
test_nonSynthetic_mixin_getter() async {
var library = await buildLibrary(r'''
mixin M {
int get foo => 0;
}
''');
configuration.withNonSynthetic = true;
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin M (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::M
fields
#F2 isOriginGetterSetter foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@mixin::M::@field::foo
getters
#F3 isComplete isOriginDeclaration foo (nameOffset:20) (firstTokenOffset:12) (offset:20)
element: <testLibrary>::@mixin::M::@getter::foo
mixins
isSimplyBounded mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F1
superclassConstraints
Object
fields
isOriginGetterSetter foo
reference: <testLibrary>::@mixin::M::@field::foo
firstFragment: #F2
type: int
getter: <testLibrary>::@mixin::M::@getter::foo
getters
isOriginDeclaration foo
reference: <testLibrary>::@mixin::M::@getter::foo
firstFragment: #F3
returnType: int
variable: <testLibrary>::@mixin::M::@field::foo
''');
}
test_nonSynthetic_mixin_setter() async {
var library = await buildLibrary(r'''
mixin M {
set foo(int value) {}
}
''');
configuration.withNonSynthetic = true;
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin M (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::M
fields
#F2 isOriginGetterSetter foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@mixin::M::@field::foo
setters
#F3 hasImplicitReturnType isComplete isOriginDeclaration foo (nameOffset:16) (firstTokenOffset:12) (offset:16)
element: <testLibrary>::@mixin::M::@setter::foo
formalParameters
#F4 requiredPositional isOriginDeclaration value (nameOffset:24) (firstTokenOffset:20) (offset:24)
element: <testLibrary>::@mixin::M::@setter::foo::@formalParameter::value
mixins
isSimplyBounded mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F1
superclassConstraints
Object
fields
isOriginGetterSetter foo
reference: <testLibrary>::@mixin::M::@field::foo
firstFragment: #F2
type: int
setter: <testLibrary>::@mixin::M::@setter::foo
setters
isOriginDeclaration foo
reference: <testLibrary>::@mixin::M::@setter::foo
firstFragment: #F3
formalParameters
#E0 requiredPositional value
firstFragment: #F4
type: int
returnType: void
variable: <testLibrary>::@mixin::M::@field::foo
''');
}
test_nonSynthetic_unit_getter() async {
var library = await buildLibrary(r'''
int get foo => 0;
''');
configuration.withNonSynthetic = true;
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
topLevelVariables
#F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:8)
element: <testLibrary>::@topLevelVariable::foo
getters
#F2 isComplete isOriginDeclaration isStatic foo (nameOffset:8) (firstTokenOffset:0) (offset:8)
element: <testLibrary>::@getter::foo
topLevelVariables
isOriginGetterSetter isStatic foo
reference: <testLibrary>::@topLevelVariable::foo
firstFragment: #F1
type: int
getter: <testLibrary>::@getter::foo
getters
isOriginDeclaration isStatic foo
reference: <testLibrary>::@getter::foo
firstFragment: #F2
returnType: int
variable: <testLibrary>::@topLevelVariable::foo
''');
}
test_nonSynthetic_unit_getterSetter() async {
var library = await buildLibrary(r'''
int get foo => 0;
set foo(int value) {}
''');
configuration.withNonSynthetic = true;
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
topLevelVariables
#F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:8)
element: <testLibrary>::@topLevelVariable::foo
getters
#F2 isComplete isOriginDeclaration isStatic foo (nameOffset:8) (firstTokenOffset:0) (offset:8)
element: <testLibrary>::@getter::foo
setters
#F3 hasImplicitReturnType isComplete isOriginDeclaration isStatic foo (nameOffset:22) (firstTokenOffset:18) (offset:22)
element: <testLibrary>::@setter::foo
formalParameters
#F4 requiredPositional isOriginDeclaration value (nameOffset:30) (firstTokenOffset:26) (offset:30)
element: <testLibrary>::@setter::foo::@formalParameter::value
topLevelVariables
isOriginGetterSetter isStatic foo
reference: <testLibrary>::@topLevelVariable::foo
firstFragment: #F1
type: int
getter: <testLibrary>::@getter::foo
setter: <testLibrary>::@setter::foo
getters
isOriginDeclaration isStatic foo
reference: <testLibrary>::@getter::foo
firstFragment: #F2
returnType: int
variable: <testLibrary>::@topLevelVariable::foo
setters
isOriginDeclaration isStatic foo
reference: <testLibrary>::@setter::foo
firstFragment: #F3
formalParameters
#E0 requiredPositional value
firstFragment: #F4
type: int
returnType: void
variable: <testLibrary>::@topLevelVariable::foo
''');
}
test_nonSynthetic_unit_setter() async {
var library = await buildLibrary(r'''
set foo(int value) {}
''');
configuration.withNonSynthetic = true;
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
topLevelVariables
#F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
element: <testLibrary>::@topLevelVariable::foo
setters
#F2 hasImplicitReturnType isComplete isOriginDeclaration isStatic foo (nameOffset:4) (firstTokenOffset:0) (offset:4)
element: <testLibrary>::@setter::foo
formalParameters
#F3 requiredPositional isOriginDeclaration value (nameOffset:12) (firstTokenOffset:8) (offset:12)
element: <testLibrary>::@setter::foo::@formalParameter::value
topLevelVariables
isOriginGetterSetter isStatic foo
reference: <testLibrary>::@topLevelVariable::foo
firstFragment: #F1
type: int
setter: <testLibrary>::@setter::foo
setters
isOriginDeclaration isStatic foo
reference: <testLibrary>::@setter::foo
firstFragment: #F2
formalParameters
#E0 requiredPositional value
firstFragment: #F3
type: int
returnType: void
variable: <testLibrary>::@topLevelVariable::foo
''');
}
test_nonSynthetic_unit_variable() async {
var library = await buildLibrary(r'''
int foo = 0;
''');
configuration.withNonSynthetic = true;
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
topLevelVariables
#F1 hasInitializer isOriginDeclaration isStatic foo (nameOffset:4) (firstTokenOffset:4) (offset:4)
element: <testLibrary>::@topLevelVariable::foo
inducedGetter: #F2
inducedSetter: #F3
getters
#F2 isComplete isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
element: <testLibrary>::@getter::foo
inducingVariable: #F1
setters
#F3 isComplete isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
element: <testLibrary>::@setter::foo
inducingVariable: #F1
formalParameters
#F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
element: <testLibrary>::@setter::foo::@formalParameter::value
topLevelVariables
hasInitializer isOriginDeclaration isStatic foo
reference: <testLibrary>::@topLevelVariable::foo
firstFragment: #F1
type: int
getter: <testLibrary>::@getter::foo
setter: <testLibrary>::@setter::foo
getters
isOriginVariable isStatic foo
reference: <testLibrary>::@getter::foo
firstFragment: #F2
returnType: int
variable: <testLibrary>::@topLevelVariable::foo
setters
isOriginVariable isStatic foo
reference: <testLibrary>::@setter::foo
firstFragment: #F3
formalParameters
#E0 requiredPositional value
firstFragment: #F4
type: int
returnType: void
variable: <testLibrary>::@topLevelVariable::foo
''');
}
}
@reflectiveTest
class NonSyntheticElementTest_fromBytes extends NonSyntheticElementTest {
@override
bool get keepLinkingLibraries => false;
}
@reflectiveTest
class NonSyntheticElementTest_keepLinking extends NonSyntheticElementTest {
@override
bool get keepLinkingLibraries => true;
}