blob: f6d3ba20b9545b23fe38f6a8f9f5aaeae0060cf4 [file] [log] [blame]
// 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:analyzer/dart/analysis/results.dart';
import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/test_utilities/mock_sdk.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../../dart/resolution/node_text_expectations.dart';
import '../element_text.dart';
import '../elements_base.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(SinceSdkVersionElementTest_keepLinking);
defineReflectiveTests(SinceSdkVersionElementTest_fromBytes);
defineReflectiveTests(UpdateNodeTextExpectations);
});
}
abstract class SinceSdkVersionElementTest extends ElementsBaseTest {
@override
List<MockSdkLibrary> additionalMockSdkLibraries = [];
test_sinceSdkVersion_class_constructor_inherits() async {
var library = await _buildDartFooLibrary(r'''
import 'dart:_internal';
@Since('2.15')
class A {
A.named();
}
class B {
B.named();
}
''');
configuration
..forSinceSdkVersion()
..withConstructors = true;
checkElementText(library, r'''
library
reference: dart:foo
fragments
#F0 dart:foo
element: dart:foo
classes
#F1 class A (nameOffset:47) (firstTokenOffset:26) (offset:47)
element: dart:foo::@class::A
constructors
#F2 named (nameOffset:55) (firstTokenOffset:53) (offset:55)
element: dart:foo::@class::A::@constructor::named
typeName: A
typeNameOffset: 53
periodOffset: 54
#F3 class B (nameOffset:73) (firstTokenOffset:67) (offset:73)
element: dart:foo::@class::B
constructors
#F4 named (nameOffset:81) (firstTokenOffset:79) (offset:81)
element: dart:foo::@class::B::@constructor::named
typeName: B
typeNameOffset: 79
periodOffset: 80
classes
class A
reference: dart:foo::@class::A
firstFragment: #F1
sinceSdkVersion: 2.15.0
constructors
named
reference: dart:foo::@class::A::@constructor::named
firstFragment: #F2
sinceSdkVersion: 2.15.0
class B
reference: dart:foo::@class::B
firstFragment: #F3
constructors
named
reference: dart:foo::@class::B::@constructor::named
firstFragment: #F4
''');
}
test_sinceSdkVersion_class_field_inherits() async {
var library = await _buildDartFooLibrary(r'''
import 'dart:_internal';
@Since('2.15')
class A {
int foo = 0;
}
''');
configuration.forSinceSdkVersion();
checkElementText(library, r'''
library
reference: dart:foo
fragments
#F0 dart:foo
element: dart:foo
classes
#F1 class A (nameOffset:47) (firstTokenOffset:26) (offset:47)
element: dart:foo::@class::A
fields
#F2 hasInitializer foo (nameOffset:57) (firstTokenOffset:57) (offset:57)
element: dart:foo::@class::A::@field::foo
getters
#F3 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:57)
element: dart:foo::@class::A::@getter::foo
setters
#F4 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:57)
element: dart:foo::@class::A::@setter::foo
formalParameters
#F5 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:57)
element: dart:foo::@class::A::@setter::foo::@formalParameter::value
classes
hasNonFinalField class A
reference: dart:foo::@class::A
firstFragment: #F1
sinceSdkVersion: 2.15.0
fields
hasInitializer foo
reference: dart:foo::@class::A::@field::foo
firstFragment: #F2
sinceSdkVersion: 2.15.0
type: int
getter: dart:foo::@class::A::@getter::foo
setter: dart:foo::@class::A::@setter::foo
getters
synthetic foo
reference: dart:foo::@class::A::@getter::foo
firstFragment: #F3
sinceSdkVersion: 2.15.0
returnType: int
variable: dart:foo::@class::A::@field::foo
setters
synthetic foo
reference: dart:foo::@class::A::@setter::foo
firstFragment: #F4
sinceSdkVersion: 2.15.0
formalParameters
#E0 requiredPositional value
firstFragment: #F5
type: int
returnType: void
variable: dart:foo::@class::A::@field::foo
''');
}
test_sinceSdkVersion_class_getter_inherits() async {
var library = await _buildDartFooLibrary(r'''
import 'dart:_internal';
@Since('2.15')
class A {
int get foo => 0;
}
''');
configuration.forSinceSdkVersion();
checkElementText(library, r'''
library
reference: dart:foo
fragments
#F0 dart:foo
element: dart:foo
classes
#F1 class A (nameOffset:47) (firstTokenOffset:26) (offset:47)
element: dart:foo::@class::A
fields
#F2 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:47)
element: dart:foo::@class::A::@field::foo
getters
#F3 foo (nameOffset:61) (firstTokenOffset:53) (offset:61)
element: dart:foo::@class::A::@getter::foo
classes
class A
reference: dart:foo::@class::A
firstFragment: #F1
sinceSdkVersion: 2.15.0
fields
synthetic foo
reference: dart:foo::@class::A::@field::foo
firstFragment: #F2
sinceSdkVersion: 2.15.0
type: int
getter: dart:foo::@class::A::@getter::foo
getters
foo
reference: dart:foo::@class::A::@getter::foo
firstFragment: #F3
sinceSdkVersion: 2.15.0
returnType: int
variable: dart:foo::@class::A::@field::foo
''');
}
test_sinceSdkVersion_class_method_inherits() async {
var library = await _buildDartFooLibrary(r'''
import 'dart:_internal';
@Since('2.15')
class A {
void foo() {}
}
''');
configuration.forSinceSdkVersion();
checkElementText(library, r'''
library
reference: dart:foo
fragments
#F0 dart:foo
element: dart:foo
classes
#F1 class A (nameOffset:47) (firstTokenOffset:26) (offset:47)
element: dart:foo::@class::A
methods
#F2 foo (nameOffset:58) (firstTokenOffset:53) (offset:58)
element: dart:foo::@class::A::@method::foo
classes
class A
reference: dart:foo::@class::A
firstFragment: #F1
sinceSdkVersion: 2.15.0
methods
foo
reference: dart:foo::@class::A::@method::foo
firstFragment: #F2
sinceSdkVersion: 2.15.0
returnType: void
''');
}
test_sinceSdkVersion_class_method_max_greater() async {
var library = await _buildDartFooLibrary(r'''
import 'dart:_internal';
@Since('2.15')
class A {
@Since('2.16')
void foo() {}
}
''');
configuration.forSinceSdkVersion();
checkElementText(library, r'''
library
reference: dart:foo
fragments
#F0 dart:foo
element: dart:foo
classes
#F1 class A (nameOffset:47) (firstTokenOffset:26) (offset:47)
element: dart:foo::@class::A
methods
#F2 foo (nameOffset:75) (firstTokenOffset:53) (offset:75)
element: dart:foo::@class::A::@method::foo
classes
class A
reference: dart:foo::@class::A
firstFragment: #F1
sinceSdkVersion: 2.15.0
methods
foo
reference: dart:foo::@class::A::@method::foo
firstFragment: #F2
sinceSdkVersion: 2.16.0
returnType: void
''');
}
test_sinceSdkVersion_class_method_max_less() async {
var library = await _buildDartFooLibrary(r'''
import 'dart:_internal';
@Since('2.15')
class A {
@Since('2.14')
void foo() {}
}
''');
configuration.forSinceSdkVersion();
checkElementText(library, r'''
library
reference: dart:foo
fragments
#F0 dart:foo
element: dart:foo
classes
#F1 class A (nameOffset:47) (firstTokenOffset:26) (offset:47)
element: dart:foo::@class::A
methods
#F2 foo (nameOffset:75) (firstTokenOffset:53) (offset:75)
element: dart:foo::@class::A::@method::foo
classes
class A
reference: dart:foo::@class::A
firstFragment: #F1
sinceSdkVersion: 2.15.0
methods
foo
reference: dart:foo::@class::A::@method::foo
firstFragment: #F2
sinceSdkVersion: 2.15.0
returnType: void
''');
}
test_sinceSdkVersion_class_setter_inherits() async {
var library = await _buildDartFooLibrary(r'''
import 'dart:_internal';
@Since('2.15')
class A {
set foo(int _) {}
}
''');
configuration.forSinceSdkVersion();
checkElementText(library, r'''
library
reference: dart:foo
fragments
#F0 dart:foo
element: dart:foo
classes
#F1 class A (nameOffset:47) (firstTokenOffset:26) (offset:47)
element: dart:foo::@class::A
fields
#F2 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:47)
element: dart:foo::@class::A::@field::foo
setters
#F3 foo (nameOffset:57) (firstTokenOffset:53) (offset:57)
element: dart:foo::@class::A::@setter::foo
formalParameters
#F4 requiredPositional _ (nameOffset:65) (firstTokenOffset:61) (offset:65)
element: dart:foo::@class::A::@setter::foo::@formalParameter::_
classes
class A
reference: dart:foo::@class::A
firstFragment: #F1
sinceSdkVersion: 2.15.0
fields
synthetic foo
reference: dart:foo::@class::A::@field::foo
firstFragment: #F2
sinceSdkVersion: 2.15.0
type: int
setter: dart:foo::@class::A::@setter::foo
setters
foo
reference: dart:foo::@class::A::@setter::foo
firstFragment: #F3
sinceSdkVersion: 2.15.0
formalParameters
#E0 requiredPositional _
firstFragment: #F4
type: int
returnType: void
variable: dart:foo::@class::A::@field::foo
''');
}
test_sinceSdkVersion_enum_constant() async {
var library = await _buildDartFooLibrary(r'''
import 'dart:_internal';
enum E {
v1,
@Since('2.15')
v2
}
''');
configuration.forSinceSdkVersion();
checkElementText(library, r'''
library
reference: dart:foo
fragments
#F0 dart:foo
element: dart:foo
enums
#F1 enum E (nameOffset:31) (firstTokenOffset:26) (offset:31)
element: dart:foo::@enum::E
fields
#F2 hasInitializer v1 (nameOffset:37) (firstTokenOffset:37) (offset:37)
element: dart:foo::@enum::E::@field::v1
initializer: expression_0
InstanceCreationExpression
constructorName: ConstructorName
type: NamedType
name: E @-1
element: dart:foo::@enum::E
type: E
element: dart:foo::@enum::E::@constructor::new
argumentList: ArgumentList
leftParenthesis: ( @0
rightParenthesis: ) @0
staticType: E
#F3 hasInitializer v2 (nameOffset:60) (firstTokenOffset:43) (offset:60)
element: dart:foo::@enum::E::@field::v2
initializer: expression_1
InstanceCreationExpression
constructorName: ConstructorName
type: NamedType
name: E @-1
element: dart:foo::@enum::E
type: E
element: dart:foo::@enum::E::@constructor::new
argumentList: ArgumentList
leftParenthesis: ( @0
rightParenthesis: ) @0
staticType: E
#F4 synthetic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
element: dart:foo::@enum::E::@field::values
initializer: expression_2
ListLiteral
leftBracket: [ @0
elements
SimpleIdentifier
token: v1 @-1
element: dart:foo::@enum::E::@getter::v1
staticType: E
SimpleIdentifier
token: v2 @-1
element: dart:foo::@enum::E::@getter::v2
staticType: E
rightBracket: ] @0
staticType: List<E>
getters
#F5 synthetic v1 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
element: dart:foo::@enum::E::@getter::v1
#F6 synthetic v2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:60)
element: dart:foo::@enum::E::@getter::v2
#F7 synthetic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
element: dart:foo::@enum::E::@getter::values
enums
enum E
reference: dart:foo::@enum::E
firstFragment: #F1
supertype: Enum
fields
static const enumConstant hasImplicitType hasInitializer v1
reference: dart:foo::@enum::E::@field::v1
firstFragment: #F2
type: E
constantInitializer
fragment: #F2
expression: expression_0
getter: dart:foo::@enum::E::@getter::v1
static const enumConstant hasImplicitType hasInitializer v2
reference: dart:foo::@enum::E::@field::v2
firstFragment: #F3
sinceSdkVersion: 2.15.0
type: E
constantInitializer
fragment: #F3
expression: expression_1
getter: dart:foo::@enum::E::@getter::v2
synthetic static const values
reference: dart:foo::@enum::E::@field::values
firstFragment: #F4
type: List<E>
constantInitializer
fragment: #F4
expression: expression_2
getter: dart:foo::@enum::E::@getter::values
getters
synthetic static v1
reference: dart:foo::@enum::E::@getter::v1
firstFragment: #F5
returnType: E
variable: dart:foo::@enum::E::@field::v1
synthetic static v2
reference: dart:foo::@enum::E::@getter::v2
firstFragment: #F6
sinceSdkVersion: 2.15.0
returnType: E
variable: dart:foo::@enum::E::@field::v2
synthetic static values
reference: dart:foo::@enum::E::@getter::values
firstFragment: #F7
returnType: List<E>
variable: dart:foo::@enum::E::@field::values
''');
}
test_sinceSdkVersion_enum_method_inherits() async {
var library = await _buildDartFooLibrary(r'''
import 'dart:_internal';
@Since('2.15')
enum E {
v;
void foo() {}
}
''');
configuration.forSinceSdkVersion();
checkElementText(library, r'''
library
reference: dart:foo
fragments
#F0 dart:foo
element: dart:foo
enums
#F1 enum E (nameOffset:46) (firstTokenOffset:26) (offset:46)
element: dart:foo::@enum::E
fields
#F2 hasInitializer v (nameOffset:52) (firstTokenOffset:52) (offset:52)
element: dart:foo::@enum::E::@field::v
initializer: expression_0
InstanceCreationExpression
constructorName: ConstructorName
type: NamedType
name: E @-1
element: dart:foo::@enum::E
type: E
element: dart:foo::@enum::E::@constructor::new
argumentList: ArgumentList
leftParenthesis: ( @0
rightParenthesis: ) @0
staticType: E
#F3 synthetic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:46)
element: dart:foo::@enum::E::@field::values
initializer: expression_1
ListLiteral
leftBracket: [ @0
elements
SimpleIdentifier
token: v @-1
element: dart:foo::@enum::E::@getter::v
staticType: E
rightBracket: ] @0
staticType: List<E>
getters
#F4 synthetic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:52)
element: dart:foo::@enum::E::@getter::v
#F5 synthetic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:46)
element: dart:foo::@enum::E::@getter::values
methods
#F6 foo (nameOffset:62) (firstTokenOffset:57) (offset:62)
element: dart:foo::@enum::E::@method::foo
enums
enum E
reference: dart:foo::@enum::E
firstFragment: #F1
sinceSdkVersion: 2.15.0
supertype: Enum
fields
static const enumConstant hasImplicitType hasInitializer v
reference: dart:foo::@enum::E::@field::v
firstFragment: #F2
sinceSdkVersion: 2.15.0
type: E
constantInitializer
fragment: #F2
expression: expression_0
getter: dart:foo::@enum::E::@getter::v
synthetic static const values
reference: dart:foo::@enum::E::@field::values
firstFragment: #F3
sinceSdkVersion: 2.15.0
type: List<E>
constantInitializer
fragment: #F3
expression: expression_1
getter: dart:foo::@enum::E::@getter::values
getters
synthetic static v
reference: dart:foo::@enum::E::@getter::v
firstFragment: #F4
sinceSdkVersion: 2.15.0
returnType: E
variable: dart:foo::@enum::E::@field::v
synthetic static values
reference: dart:foo::@enum::E::@getter::values
firstFragment: #F5
sinceSdkVersion: 2.15.0
returnType: List<E>
variable: dart:foo::@enum::E::@field::values
methods
foo
reference: dart:foo::@enum::E::@method::foo
firstFragment: #F6
sinceSdkVersion: 2.15.0
returnType: void
''');
}
test_sinceSdkVersion_extension_method_inherits() async {
var library = await _buildDartFooLibrary(r'''
import 'dart:_internal';
@Since('2.15')
extension E on int {
void foo() {}
}
''');
configuration.forSinceSdkVersion();
checkElementText(library, r'''
library
reference: dart:foo
fragments
#F0 dart:foo
element: dart:foo
extensions
#F1 extension E (nameOffset:51) (firstTokenOffset:26) (offset:51)
element: dart:foo::@extension::E
methods
#F2 foo (nameOffset:69) (firstTokenOffset:64) (offset:69)
element: dart:foo::@extension::E::@method::foo
extensions
extension E
reference: dart:foo::@extension::E
firstFragment: #F1
sinceSdkVersion: 2.15.0
extendedType: int
onDeclaration: dart:core::@class::int
methods
foo
reference: dart:foo::@extension::E::@method::foo
firstFragment: #F2
sinceSdkVersion: 2.15.0
returnType: void
''');
}
test_sinceSdkVersion_mixin_method_inherits() async {
var library = await _buildDartFooLibrary(r'''
import 'dart:_internal';
@Since('2.15')
mixin M {
void foo() {}
}
''');
configuration.forSinceSdkVersion();
checkElementText(library, r'''
library
reference: dart:foo
fragments
#F0 dart:foo
element: dart:foo
mixins
#F1 mixin M (nameOffset:47) (firstTokenOffset:26) (offset:47)
element: dart:foo::@mixin::M
methods
#F2 foo (nameOffset:58) (firstTokenOffset:53) (offset:58)
element: dart:foo::@mixin::M::@method::foo
mixins
mixin M
reference: dart:foo::@mixin::M
firstFragment: #F1
sinceSdkVersion: 2.15.0
superclassConstraints
Object
methods
foo
reference: dart:foo::@mixin::M::@method::foo
firstFragment: #F2
sinceSdkVersion: 2.15.0
returnType: void
''');
}
test_sinceSdkVersion_unit_function() async {
var library = await _buildDartFooLibrary(r'''
import 'dart:_internal';
@Since('2.15')
void foo() {}
void bar() {}
''');
configuration.forSinceSdkVersion();
checkElementText(library, r'''
library
reference: dart:foo
fragments
#F0 dart:foo
element: dart:foo
functions
#F1 foo (nameOffset:46) (firstTokenOffset:26) (offset:46)
element: dart:foo::@function::foo
#F2 bar (nameOffset:61) (firstTokenOffset:56) (offset:61)
element: dart:foo::@function::bar
functions
foo
reference: dart:foo::@function::foo
firstFragment: #F1
sinceSdkVersion: 2.15.0
returnType: void
bar
reference: dart:foo::@function::bar
firstFragment: #F2
returnType: void
''');
}
test_sinceSdkVersion_unit_function_format_extended() async {
var library = await _buildDartFooLibrary(r'''
import 'dart:_internal';
@Since('2.15.3-dev.7')
void foo() {}
''');
configuration.forSinceSdkVersion();
checkElementText(library, r'''
library
reference: dart:foo
fragments
#F0 dart:foo
element: dart:foo
functions
#F1 foo (nameOffset:54) (firstTokenOffset:26) (offset:54)
element: dart:foo::@function::foo
functions
foo
reference: dart:foo::@function::foo
firstFragment: #F1
sinceSdkVersion: 2.15.3-dev.7
returnType: void
''');
}
test_sinceSdkVersion_unit_function_format_full() async {
var library = await _buildDartFooLibrary(r'''
import 'dart:_internal';
@Since('2.15.3')
void foo() {}
''');
configuration.forSinceSdkVersion();
checkElementText(library, r'''
library
reference: dart:foo
fragments
#F0 dart:foo
element: dart:foo
functions
#F1 foo (nameOffset:48) (firstTokenOffset:26) (offset:48)
element: dart:foo::@function::foo
functions
foo
reference: dart:foo::@function::foo
firstFragment: #F1
sinceSdkVersion: 2.15.3
returnType: void
''');
}
test_sinceSdkVersion_unit_function_format_invalid() async {
var library = await _buildDartFooLibrary(r'''
import 'dart:_internal';
@Since('42')
void foo() {}
''');
configuration.forSinceSdkVersion();
checkElementText(library, r'''
library
reference: dart:foo
fragments
#F0 dart:foo
element: dart:foo
functions
#F1 foo (nameOffset:44) (firstTokenOffset:26) (offset:44)
element: dart:foo::@function::foo
functions
foo
reference: dart:foo::@function::foo
firstFragment: #F1
returnType: void
''');
}
test_sinceSdkVersion_unit_function_inherits() async {
var library = await _buildDartFooLibrary(r'''
@Since('2.15')
library;
import 'dart:_internal';
void foo() {}
''');
configuration.forSinceSdkVersion();
checkElementText(library, r'''
library
reference: dart:foo
sinceSdkVersion: 2.15.0
fragments
#F0 dart:foo
element: dart:foo
functions
#F1 foo (nameOffset:56) (firstTokenOffset:51) (offset:56)
element: dart:foo::@function::foo
functions
foo
reference: dart:foo::@function::foo
firstFragment: #F1
sinceSdkVersion: 2.15.0
returnType: void
''');
}
test_sinceSdkVersion_unit_function_parameters_optionalNamed() async {
var library = await _buildDartFooLibrary(r'''
import 'dart:_internal';
void f(int p1, {
@Since('2.15')
int? p2,
}) {}
''');
configuration.forSinceSdkVersion();
checkElementText(library, r'''
library
reference: dart:foo
fragments
#F0 dart:foo
element: dart:foo
functions
#F1 f (nameOffset:31) (firstTokenOffset:26) (offset:31)
element: dart:foo::@function::f
formalParameters
#F2 requiredPositional p1 (nameOffset:37) (firstTokenOffset:33) (offset:37)
element: dart:foo::@function::f::@formalParameter::p1
#F3 optionalNamed p2 (nameOffset:67) (firstTokenOffset:45) (offset:67)
element: dart:foo::@function::f::@formalParameter::p2
functions
f
reference: dart:foo::@function::f
firstFragment: #F1
formalParameters
#E0 requiredPositional p1
firstFragment: #F2
type: int
#E1 optionalNamed p2
firstFragment: #F3
type: int?
sinceSdkVersion: 2.15.0
returnType: void
''');
}
test_sinceSdkVersion_unit_function_parameters_optionalPositional() async {
var library = await _buildDartFooLibrary(r'''
import 'dart:_internal';
void f(int p1, [
@Since('2.15')
int? p2,
]) {}
''');
configuration.forSinceSdkVersion();
checkElementText(library, r'''
library
reference: dart:foo
fragments
#F0 dart:foo
element: dart:foo
functions
#F1 f (nameOffset:31) (firstTokenOffset:26) (offset:31)
element: dart:foo::@function::f
formalParameters
#F2 requiredPositional p1 (nameOffset:37) (firstTokenOffset:33) (offset:37)
element: dart:foo::@function::f::@formalParameter::p1
#F3 optionalPositional p2 (nameOffset:67) (firstTokenOffset:45) (offset:67)
element: dart:foo::@function::f::@formalParameter::p2
functions
f
reference: dart:foo::@function::f
firstFragment: #F1
formalParameters
#E0 requiredPositional p1
firstFragment: #F2
type: int
#E1 optionalPositional p2
firstFragment: #F3
type: int?
sinceSdkVersion: 2.15.0
returnType: void
''');
}
test_sinceSdkVersion_unit_typeAlias() async {
var library = await _buildDartFooLibrary(r'''
import 'dart:_internal';
@Since('2.15')
typedef A = List<int>;
''');
configuration.forSinceSdkVersion();
checkElementText(library, r'''
library
reference: dart:foo
fragments
#F0 dart:foo
element: dart:foo
typeAliases
#F1 A (nameOffset:49) (firstTokenOffset:26) (offset:49)
element: dart:foo::@typeAlias::A
typeAliases
A
reference: dart:foo::@typeAlias::A
firstFragment: #F1
sinceSdkVersion: 2.15.0
aliasedType: List<int>
''');
}
test_sinceSdkVersion_unit_variable() async {
var library = await _buildDartFooLibrary(r'''
import 'dart:_internal';
@Since('2.15')
final foo = 0;
''');
configuration.forSinceSdkVersion();
checkElementText(library, r'''
library
reference: dart:foo
fragments
#F0 dart:foo
element: dart:foo
topLevelVariables
#F1 hasInitializer foo (nameOffset:47) (firstTokenOffset:47) (offset:47)
element: dart:foo::@topLevelVariable::foo
getters
#F2 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:47)
element: dart:foo::@getter::foo
topLevelVariables
final hasImplicitType hasInitializer foo
reference: dart:foo::@topLevelVariable::foo
firstFragment: #F1
sinceSdkVersion: 2.15.0
type: int
getter: dart:foo::@getter::foo
getters
synthetic static foo
reference: dart:foo::@getter::foo
firstFragment: #F2
sinceSdkVersion: 2.15.0
returnType: int
variable: dart:foo::@topLevelVariable::foo
''');
}
Future<LibraryElementImpl> _buildDartFooLibrary(String content) async {
additionalMockSdkLibraries.add(
MockSdkLibrary('foo', [MockSdkLibraryUnit('foo/foo.dart', content)]),
);
return await _libraryByUriFromTest('dart:foo');
}
/// Returns the library for [uriStr] from the context of [testFile].
Future<LibraryElementImpl> _libraryByUriFromTest(String uriStr) async {
var analysisContext = contextFor(testFile);
var analysisSession = analysisContext.currentSession;
var libraryResult = await analysisSession.getLibraryByUri(uriStr);
libraryResult as LibraryElementResult;
return libraryResult.element as LibraryElementImpl;
}
}
@reflectiveTest
class SinceSdkVersionElementTest_fromBytes extends SinceSdkVersionElementTest {
@override
bool get keepLinkingLibraries => false;
}
@reflectiveTest
class SinceSdkVersionElementTest_keepLinking
extends SinceSdkVersionElementTest {
@override
bool get keepLinkingLibraries => true;
}
extension on ElementTextConfiguration {
void forSinceSdkVersion() {
withConstantInitializers = false;
withConstructors = false;
withImports = false;
withMetadata = false;
}
}