blob: 2d59382c755de4f36cfdd44ecf7ccf3fec017165 [file] [log] [blame] [edit]
// 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(MixinElementTest_keepLinking);
defineReflectiveTests(MixinElementTest_fromBytes);
defineReflectiveTests(MixinElementTest_augmentation_fromBytes);
defineReflectiveTests(MixinElementTest_augmentation_keepLinking);
defineReflectiveTests(UpdateNodeTextExpectations);
});
}
abstract class MixinElementTest extends ElementsBaseTest {
test_allSupertypes() async {
var library = await buildLibrary(r'''
mixin M {}
class A with M {}
''');
configuration
..withAllSupertypes = true
..withConstructors = false;
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
classes
#F1 class A (nameOffset:17) (firstTokenOffset:11) (offset:17)
element: <testLibrary>::@class::A
mixins
#F2 mixin M (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::M
classes
class A
reference: <testLibrary>::@class::A
firstFragment: #F1
supertype: Object
mixins
M
allSupertypes
M
Object
mixins
mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F2
superclassConstraints
Object
allSupertypes
Object
''');
}
test_allSupertypes_generic() async {
var library = await buildLibrary(r'''
class A<T, U> {}
class B<T> extends A<int, T> {}
mixin M1 on A<int, double> {}
mixin M2 on B<String> {}
''');
configuration
..withAllSupertypes = true
..withConstructors = false;
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
#F3 U (nameOffset:11) (firstTokenOffset:11) (offset:11)
element: #E1 U
#F4 class B (nameOffset:23) (firstTokenOffset:17) (offset:23)
element: <testLibrary>::@class::B
typeParameters
#F5 T (nameOffset:25) (firstTokenOffset:25) (offset:25)
element: #E2 T
mixins
#F6 mixin M1 (nameOffset:56) (firstTokenOffset:50) (offset:56)
element: <testLibrary>::@mixin::M1
#F7 mixin M2 (nameOffset:86) (firstTokenOffset:80) (offset:86)
element: <testLibrary>::@mixin::M2
classes
class A
reference: <testLibrary>::@class::A
firstFragment: #F1
typeParameters
#E0 T
firstFragment: #F2
#E1 U
firstFragment: #F3
allSupertypes
Object
class B
reference: <testLibrary>::@class::B
firstFragment: #F4
typeParameters
#E2 T
firstFragment: #F5
supertype: A<int, T>
allSupertypes
A<int, T>
Object
mixins
mixin M1
reference: <testLibrary>::@mixin::M1
firstFragment: #F6
superclassConstraints
A<int, double>
allSupertypes
A<int, double>
Object
mixin M2
reference: <testLibrary>::@mixin::M2
firstFragment: #F7
superclassConstraints
B<String>
allSupertypes
A<int, String>
B<String>
Object
''');
}
test_allSupertypes_hasInterfaces() async {
var library = await buildLibrary(r'''
class A {}
class B {}
class C {}
mixin M on A implements B, C {}
''');
configuration
..withAllSupertypes = true
..withConstructors = false;
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
#F2 class B (nameOffset:17) (firstTokenOffset:11) (offset:17)
element: <testLibrary>::@class::B
#F3 class C (nameOffset:28) (firstTokenOffset:22) (offset:28)
element: <testLibrary>::@class::C
mixins
#F4 mixin M (nameOffset:40) (firstTokenOffset:34) (offset:40)
element: <testLibrary>::@mixin::M
classes
class A
reference: <testLibrary>::@class::A
firstFragment: #F1
allSupertypes
Object
class B
reference: <testLibrary>::@class::B
firstFragment: #F2
allSupertypes
Object
class C
reference: <testLibrary>::@class::C
firstFragment: #F3
allSupertypes
Object
mixins
mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F4
superclassConstraints
A
interfaces
B
C
allSupertypes
A
B
C
Object
''');
}
test_allSupertypes_hasSuperclassConstraints() async {
var library = await buildLibrary(r'''
class A {}
mixin M on A {}
class B with M {}
''');
configuration
..withAllSupertypes = true
..withConstructors = false;
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
#F2 class B (nameOffset:33) (firstTokenOffset:27) (offset:33)
element: <testLibrary>::@class::B
mixins
#F3 mixin M (nameOffset:17) (firstTokenOffset:11) (offset:17)
element: <testLibrary>::@mixin::M
classes
class A
reference: <testLibrary>::@class::A
firstFragment: #F1
allSupertypes
Object
class B
reference: <testLibrary>::@class::B
firstFragment: #F2
supertype: Object
mixins
M
allSupertypes
A
M
Object
mixins
mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F3
superclassConstraints
A
allSupertypes
A
Object
''');
}
test_mixin() async {
var library = await buildLibrary(r'''
class A {}
class B {}
class C {}
class D {}
mixin M<T extends num, U> on A, B implements C, D {
T f;
U get g => 0;
set s(int v) {}
int m(double v) => 0;
}
''');
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 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@class::A::@constructor::new
typeName: A
#F3 class B (nameOffset:17) (firstTokenOffset:11) (offset:17)
element: <testLibrary>::@class::B
constructors
#F4 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
element: <testLibrary>::@class::B::@constructor::new
typeName: B
#F5 class C (nameOffset:28) (firstTokenOffset:22) (offset:28)
element: <testLibrary>::@class::C
constructors
#F6 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
element: <testLibrary>::@class::C::@constructor::new
typeName: C
#F7 class D (nameOffset:39) (firstTokenOffset:33) (offset:39)
element: <testLibrary>::@class::D
constructors
#F8 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
element: <testLibrary>::@class::D::@constructor::new
typeName: D
mixins
#F9 mixin M (nameOffset:51) (firstTokenOffset:45) (offset:51)
element: <testLibrary>::@mixin::M
typeParameters
#F10 T (nameOffset:53) (firstTokenOffset:53) (offset:53)
element: #E0 T
#F11 U (nameOffset:68) (firstTokenOffset:68) (offset:68)
element: #E1 U
fields
#F12 f (nameOffset:101) (firstTokenOffset:101) (offset:101)
element: <testLibrary>::@mixin::M::@field::f
#F13 synthetic g (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
element: <testLibrary>::@mixin::M::@field::g
#F14 synthetic s (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
element: <testLibrary>::@mixin::M::@field::s
getters
#F15 synthetic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:101)
element: <testLibrary>::@mixin::M::@getter::f
#F16 g (nameOffset:112) (firstTokenOffset:106) (offset:112)
element: <testLibrary>::@mixin::M::@getter::g
setters
#F17 synthetic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:101)
element: <testLibrary>::@mixin::M::@setter::f
formalParameters
#F18 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:101)
element: <testLibrary>::@mixin::M::@setter::f::@formalParameter::value
#F19 s (nameOffset:126) (firstTokenOffset:122) (offset:126)
element: <testLibrary>::@mixin::M::@setter::s
formalParameters
#F20 v (nameOffset:132) (firstTokenOffset:128) (offset:132)
element: <testLibrary>::@mixin::M::@setter::s::@formalParameter::v
methods
#F21 m (nameOffset:144) (firstTokenOffset:140) (offset:144)
element: <testLibrary>::@mixin::M::@method::m
formalParameters
#F22 v (nameOffset:153) (firstTokenOffset:146) (offset:153)
element: <testLibrary>::@mixin::M::@method::m::@formalParameter::v
classes
class A
reference: <testLibrary>::@class::A
firstFragment: #F1
constructors
synthetic new
reference: <testLibrary>::@class::A::@constructor::new
firstFragment: #F2
class B
reference: <testLibrary>::@class::B
firstFragment: #F3
constructors
synthetic new
reference: <testLibrary>::@class::B::@constructor::new
firstFragment: #F4
class C
reference: <testLibrary>::@class::C
firstFragment: #F5
constructors
synthetic new
reference: <testLibrary>::@class::C::@constructor::new
firstFragment: #F6
class D
reference: <testLibrary>::@class::D
firstFragment: #F7
constructors
synthetic new
reference: <testLibrary>::@class::D::@constructor::new
firstFragment: #F8
mixins
hasNonFinalField mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F9
typeParameters
#E0 T
firstFragment: #F10
bound: num
#E1 U
firstFragment: #F11
superclassConstraints
A
B
interfaces
C
D
fields
f
reference: <testLibrary>::@mixin::M::@field::f
firstFragment: #F12
hasEnclosingTypeParameterReference: true
type: T
getter: <testLibrary>::@mixin::M::@getter::f
setter: <testLibrary>::@mixin::M::@setter::f
synthetic g
reference: <testLibrary>::@mixin::M::@field::g
firstFragment: #F13
hasEnclosingTypeParameterReference: true
type: U
getter: <testLibrary>::@mixin::M::@getter::g
synthetic s
reference: <testLibrary>::@mixin::M::@field::s
firstFragment: #F14
type: int
setter: <testLibrary>::@mixin::M::@setter::s
getters
synthetic f
reference: <testLibrary>::@mixin::M::@getter::f
firstFragment: #F15
hasEnclosingTypeParameterReference: true
returnType: T
variable: <testLibrary>::@mixin::M::@field::f
g
reference: <testLibrary>::@mixin::M::@getter::g
firstFragment: #F16
hasEnclosingTypeParameterReference: true
returnType: U
variable: <testLibrary>::@mixin::M::@field::g
setters
synthetic f
reference: <testLibrary>::@mixin::M::@setter::f
firstFragment: #F17
hasEnclosingTypeParameterReference: true
formalParameters
#E2 requiredPositional value
firstFragment: #F18
type: T
returnType: void
variable: <testLibrary>::@mixin::M::@field::f
s
reference: <testLibrary>::@mixin::M::@setter::s
firstFragment: #F19
formalParameters
#E3 requiredPositional v
firstFragment: #F20
type: int
returnType: void
variable: <testLibrary>::@mixin::M::@field::s
methods
m
reference: <testLibrary>::@mixin::M::@method::m
firstFragment: #F21
formalParameters
#E4 requiredPositional v
firstFragment: #F22
type: double
returnType: int
''');
}
test_mixin_base() async {
var library = await buildLibrary(r'''
base mixin M on A {}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin M (nameOffset:11) (firstTokenOffset:0) (offset:11)
element: <testLibrary>::@mixin::M
mixins
base mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F1
superclassConstraints
Object
''');
}
test_mixin_cycle_interfaces() async {
var library = await buildLibrary(r'''
mixin A implements B {}
mixin B implements A {}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
#F2 mixin B (nameOffset:30) (firstTokenOffset:24) (offset:30)
element: <testLibrary>::@mixin::B
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
superclassConstraints
Object
mixin B
reference: <testLibrary>::@mixin::B
firstFragment: #F2
superclassConstraints
Object
''');
}
test_mixin_cycle_superclassConstraints() async {
var library = await buildLibrary(r'''
mixin A on B {}
mixin B on A {}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
#F2 mixin B (nameOffset:22) (firstTokenOffset:16) (offset:22)
element: <testLibrary>::@mixin::B
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
superclassConstraints
Object
mixin B
reference: <testLibrary>::@mixin::B
firstFragment: #F2
superclassConstraints
Object
''');
}
test_mixin_field_inferredType() async {
var library = await buildLibrary('''
mixin M {
var x = 0;
}
''');
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 x (nameOffset:16) (firstTokenOffset:16) (offset:16)
element: <testLibrary>::@mixin::M::@field::x
getters
#F3 synthetic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::M::@getter::x
setters
#F4 synthetic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::M::@setter::x
formalParameters
#F5 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::M::@setter::x::@formalParameter::value
mixins
hasNonFinalField mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F1
superclassConstraints
Object
fields
hasInitializer x
reference: <testLibrary>::@mixin::M::@field::x
firstFragment: #F2
type: int
getter: <testLibrary>::@mixin::M::@getter::x
setter: <testLibrary>::@mixin::M::@setter::x
getters
synthetic x
reference: <testLibrary>::@mixin::M::@getter::x
firstFragment: #F3
returnType: int
variable: <testLibrary>::@mixin::M::@field::x
setters
synthetic x
reference: <testLibrary>::@mixin::M::@setter::x
firstFragment: #F4
formalParameters
#E0 requiredPositional value
firstFragment: #F5
type: int
returnType: void
variable: <testLibrary>::@mixin::M::@field::x
''');
}
test_mixin_field_inferredType_final() async {
var library = await buildLibrary('''
mixin M {
final x = 0;
}''');
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 x (nameOffset:18) (firstTokenOffset:18) (offset:18)
element: <testLibrary>::@mixin::M::@field::x
getters
#F3 synthetic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:18)
element: <testLibrary>::@mixin::M::@getter::x
mixins
mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F1
superclassConstraints
Object
fields
final hasInitializer x
reference: <testLibrary>::@mixin::M::@field::x
firstFragment: #F2
type: int
getter: <testLibrary>::@mixin::M::@getter::x
getters
synthetic x
reference: <testLibrary>::@mixin::M::@getter::x
firstFragment: #F3
returnType: int
variable: <testLibrary>::@mixin::M::@field::x
''');
}
test_mixin_first() async {
var library = await buildLibrary(r'''
mixin M {}
''');
// We intentionally ask `mixins` directly, to check that we can ask them
// separately, without asking classes.
var mixins = library.firstFragment.mixins;
expect(mixins, hasLength(1));
expect(mixins[0].name, 'M');
}
test_mixin_getter_invokesSuperSelf_getter() async {
var library = await buildLibrary(r'''
mixin M on A {
int get foo {
super.foo;
}
}
''');
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 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@mixin::M::@field::foo
getters
#F3 foo (nameOffset:25) (firstTokenOffset:17) (offset:25)
element: <testLibrary>::@mixin::M::@getter::foo
mixins
mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F1
superclassConstraints
Object
fields
synthetic foo
reference: <testLibrary>::@mixin::M::@field::foo
firstFragment: #F2
type: int
getter: <testLibrary>::@mixin::M::@getter::foo
getters
foo
reference: <testLibrary>::@mixin::M::@getter::foo
firstFragment: #F3
returnType: int
variable: <testLibrary>::@mixin::M::@field::foo
''');
}
test_mixin_getter_invokesSuperSelf_getter_nestedInAssignment() async {
var library = await buildLibrary(r'''
mixin M on A {
int get foo {
(super.foo).foo = 0;
}
}
''');
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 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@mixin::M::@field::foo
getters
#F3 foo (nameOffset:25) (firstTokenOffset:17) (offset:25)
element: <testLibrary>::@mixin::M::@getter::foo
mixins
mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F1
superclassConstraints
Object
fields
synthetic foo
reference: <testLibrary>::@mixin::M::@field::foo
firstFragment: #F2
type: int
getter: <testLibrary>::@mixin::M::@getter::foo
getters
foo
reference: <testLibrary>::@mixin::M::@getter::foo
firstFragment: #F3
returnType: int
variable: <testLibrary>::@mixin::M::@field::foo
''');
}
test_mixin_getter_invokesSuperSelf_setter() async {
var library = await buildLibrary(r'''
mixin M on A {
int get foo {
super.foo = 0;
}
}
''');
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 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@mixin::M::@field::foo
getters
#F3 foo (nameOffset:25) (firstTokenOffset:17) (offset:25)
element: <testLibrary>::@mixin::M::@getter::foo
mixins
mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F1
superclassConstraints
Object
fields
synthetic foo
reference: <testLibrary>::@mixin::M::@field::foo
firstFragment: #F2
type: int
getter: <testLibrary>::@mixin::M::@getter::foo
getters
foo
reference: <testLibrary>::@mixin::M::@getter::foo
firstFragment: #F3
returnType: int
variable: <testLibrary>::@mixin::M::@field::foo
''');
}
test_mixin_implicitObjectSuperclassConstraint() async {
var library = await buildLibrary(r'''
mixin M {}
''');
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
mixins
mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F1
superclassConstraints
Object
''');
}
test_mixin_inference() async {
var library = await buildLibrary(r'''
class A<T> {}
mixin M<U> on A<U> {}
class B extends A<int> with M {}
''');
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 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@class::A::@constructor::new
typeName: A
#F4 class B (nameOffset:42) (firstTokenOffset:36) (offset:42)
element: <testLibrary>::@class::B
constructors
#F5 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42)
element: <testLibrary>::@class::B::@constructor::new
typeName: B
mixins
#F6 mixin M (nameOffset:20) (firstTokenOffset:14) (offset:20)
element: <testLibrary>::@mixin::M
typeParameters
#F7 U (nameOffset:22) (firstTokenOffset:22) (offset:22)
element: #E1 U
classes
class A
reference: <testLibrary>::@class::A
firstFragment: #F1
typeParameters
#E0 T
firstFragment: #F2
constructors
synthetic new
reference: <testLibrary>::@class::A::@constructor::new
firstFragment: #F3
class B
reference: <testLibrary>::@class::B
firstFragment: #F4
supertype: A<int>
mixins
M<int>
constructors
synthetic new
reference: <testLibrary>::@class::B::@constructor::new
firstFragment: #F5
superConstructor: ConstructorMember
baseElement: <testLibrary>::@class::A::@constructor::new
substitution: {T: int}
mixins
mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F6
typeParameters
#E1 U
firstFragment: #F7
superclassConstraints
A<U>
''');
}
test_mixin_inference_classAlias_oneMixin() async {
// In the code below, B's superclass constraints don't include A, because
// superclass constraints are determined from the mixin's superclass, and
// B's superclass is Object. So no mixin type inference is attempted, and
// "with B" is interpreted as "with B<dynamic>".
var library = await buildLibrary(r'''
class A<T> {}
class B<T> = Object with A<T>;
class C = A<int> with B;
''');
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 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@class::A::@constructor::new
typeName: A
#F4 class B (nameOffset:20) (firstTokenOffset:14) (offset:20)
element: <testLibrary>::@class::B
typeParameters
#F5 T (nameOffset:22) (firstTokenOffset:22) (offset:22)
element: #E1 T
constructors
#F6 synthetic const new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
element: <testLibrary>::@class::B::@constructor::new
typeName: B
#F7 class C (nameOffset:51) (firstTokenOffset:45) (offset:51)
element: <testLibrary>::@class::C
constructors
#F8 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
element: <testLibrary>::@class::C::@constructor::new
typeName: C
classes
class A
reference: <testLibrary>::@class::A
firstFragment: #F1
typeParameters
#E0 T
firstFragment: #F2
constructors
synthetic new
reference: <testLibrary>::@class::A::@constructor::new
firstFragment: #F3
class alias B
reference: <testLibrary>::@class::B
firstFragment: #F4
typeParameters
#E1 T
firstFragment: #F5
supertype: Object
mixins
A<T>
constructors
synthetic const new
reference: <testLibrary>::@class::B::@constructor::new
firstFragment: #F6
constantInitializers
SuperConstructorInvocation
superKeyword: super @0
argumentList: ArgumentList
leftParenthesis: ( @0
rightParenthesis: ) @0
element: dart:core::@class::Object::@constructor::new
class alias C
reference: <testLibrary>::@class::C
firstFragment: #F7
supertype: A<int>
mixins
B<dynamic>
constructors
synthetic new
reference: <testLibrary>::@class::C::@constructor::new
firstFragment: #F8
constantInitializers
SuperConstructorInvocation
superKeyword: super @0
argumentList: ArgumentList
leftParenthesis: ( @0
rightParenthesis: ) @0
element: <testLibrary>::@class::A::@constructor::new
superConstructor: ConstructorMember
baseElement: <testLibrary>::@class::A::@constructor::new
substitution: {T: int}
''');
}
test_mixin_inference_classAlias_twoMixins() async {
// In the code below, `B` has a single superclass constraint, A1, because
// superclass constraints are determined from the mixin's superclass, and
// B's superclass is "Object with A1<T>". So mixin type inference succeeds
// (since C's base class implements A1<int>), and "with B" is interpreted as
// "with B<int>".
var library = await buildLibrary(r'''
class A1<T> {}
class A2<T> {}
class B<T> = Object with A1<T>, A2<T>;
class Base implements A1<int> {}
class C = Base with B;
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
classes
#F1 class A1 (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@class::A1
typeParameters
#F2 T (nameOffset:9) (firstTokenOffset:9) (offset:9)
element: #E0 T
constructors
#F3 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@class::A1::@constructor::new
typeName: A1
#F4 class A2 (nameOffset:21) (firstTokenOffset:15) (offset:21)
element: <testLibrary>::@class::A2
typeParameters
#F5 T (nameOffset:24) (firstTokenOffset:24) (offset:24)
element: #E1 T
constructors
#F6 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
element: <testLibrary>::@class::A2::@constructor::new
typeName: A2
#F7 class B (nameOffset:36) (firstTokenOffset:30) (offset:36)
element: <testLibrary>::@class::B
typeParameters
#F8 T (nameOffset:38) (firstTokenOffset:38) (offset:38)
element: #E2 T
constructors
#F9 synthetic const new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
element: <testLibrary>::@class::B::@constructor::new
typeName: B
#F10 class Base (nameOffset:75) (firstTokenOffset:69) (offset:75)
element: <testLibrary>::@class::Base
constructors
#F11 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:75)
element: <testLibrary>::@class::Base::@constructor::new
typeName: Base
#F12 class C (nameOffset:108) (firstTokenOffset:102) (offset:108)
element: <testLibrary>::@class::C
constructors
#F13 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:108)
element: <testLibrary>::@class::C::@constructor::new
typeName: C
classes
class A1
reference: <testLibrary>::@class::A1
firstFragment: #F1
typeParameters
#E0 T
firstFragment: #F2
constructors
synthetic new
reference: <testLibrary>::@class::A1::@constructor::new
firstFragment: #F3
class A2
reference: <testLibrary>::@class::A2
firstFragment: #F4
typeParameters
#E1 T
firstFragment: #F5
constructors
synthetic new
reference: <testLibrary>::@class::A2::@constructor::new
firstFragment: #F6
class alias B
reference: <testLibrary>::@class::B
firstFragment: #F7
typeParameters
#E2 T
firstFragment: #F8
supertype: Object
mixins
A1<T>
A2<T>
constructors
synthetic const new
reference: <testLibrary>::@class::B::@constructor::new
firstFragment: #F9
constantInitializers
SuperConstructorInvocation
superKeyword: super @0
argumentList: ArgumentList
leftParenthesis: ( @0
rightParenthesis: ) @0
element: dart:core::@class::Object::@constructor::new
class Base
reference: <testLibrary>::@class::Base
firstFragment: #F10
interfaces
A1<int>
constructors
synthetic new
reference: <testLibrary>::@class::Base::@constructor::new
firstFragment: #F11
class alias C
reference: <testLibrary>::@class::C
firstFragment: #F12
supertype: Base
mixins
B<int>
constructors
synthetic new
reference: <testLibrary>::@class::C::@constructor::new
firstFragment: #F13
constantInitializers
SuperConstructorInvocation
superKeyword: super @0
argumentList: ArgumentList
leftParenthesis: ( @0
rightParenthesis: ) @0
element: <testLibrary>::@class::Base::@constructor::new
superConstructor: <testLibrary>::@class::Base::@constructor::new
''');
}
test_mixin_inference_nested_functionType() async {
var library = await buildLibrary(r'''
class A<T> {}
mixin M<T, U> on A<T Function(U)> {}
class C extends A<int Function(String)> with M {}
''');
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 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@class::A::@constructor::new
typeName: A
#F4 class C (nameOffset:57) (firstTokenOffset:51) (offset:57)
element: <testLibrary>::@class::C
constructors
#F5 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:57)
element: <testLibrary>::@class::C::@constructor::new
typeName: C
mixins
#F6 mixin M (nameOffset:20) (firstTokenOffset:14) (offset:20)
element: <testLibrary>::@mixin::M
typeParameters
#F7 T (nameOffset:22) (firstTokenOffset:22) (offset:22)
element: #E1 T
#F8 U (nameOffset:25) (firstTokenOffset:25) (offset:25)
element: #E2 U
classes
class A
reference: <testLibrary>::@class::A
firstFragment: #F1
typeParameters
#E0 T
firstFragment: #F2
constructors
synthetic new
reference: <testLibrary>::@class::A::@constructor::new
firstFragment: #F3
class C
reference: <testLibrary>::@class::C
firstFragment: #F4
supertype: A<int Function(String)>
mixins
M<int, String>
constructors
synthetic new
reference: <testLibrary>::@class::C::@constructor::new
firstFragment: #F5
superConstructor: ConstructorMember
baseElement: <testLibrary>::@class::A::@constructor::new
substitution: {T: int Function(String)}
mixins
mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F6
typeParameters
#E1 T
firstFragment: #F7
#E2 U
firstFragment: #F8
superclassConstraints
A<T Function(U)>
''');
}
test_mixin_inference_nested_interfaceType() async {
var library = await buildLibrary(r'''
abstract class A<T> {}
mixin M<T> on A<List<T>> {}
class C extends A<List<int>> with M {}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
classes
#F1 class A (nameOffset:15) (firstTokenOffset:0) (offset:15)
element: <testLibrary>::@class::A
typeParameters
#F2 T (nameOffset:17) (firstTokenOffset:17) (offset:17)
element: #E0 T
constructors
#F3 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:15)
element: <testLibrary>::@class::A::@constructor::new
typeName: A
#F4 class C (nameOffset:57) (firstTokenOffset:51) (offset:57)
element: <testLibrary>::@class::C
constructors
#F5 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:57)
element: <testLibrary>::@class::C::@constructor::new
typeName: C
mixins
#F6 mixin M (nameOffset:29) (firstTokenOffset:23) (offset:29)
element: <testLibrary>::@mixin::M
typeParameters
#F7 T (nameOffset:31) (firstTokenOffset:31) (offset:31)
element: #E1 T
classes
abstract class A
reference: <testLibrary>::@class::A
firstFragment: #F1
typeParameters
#E0 T
firstFragment: #F2
constructors
synthetic new
reference: <testLibrary>::@class::A::@constructor::new
firstFragment: #F3
class C
reference: <testLibrary>::@class::C
firstFragment: #F4
supertype: A<List<int>>
mixins
M<int>
constructors
synthetic new
reference: <testLibrary>::@class::C::@constructor::new
firstFragment: #F5
superConstructor: ConstructorMember
baseElement: <testLibrary>::@class::A::@constructor::new
substitution: {T: List<int>}
mixins
mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F6
typeParameters
#E1 T
firstFragment: #F7
superclassConstraints
A<List<T>>
''');
}
test_mixin_inference_twoMixins() async {
// Both `M1` and `M2` have their type arguments inferred.
var library = await buildLibrary(r'''
class I<X> {}
mixin M1<T> on I<T> {}
mixin M2<T> on I<T> {}
class A = I<int> with M1, M2;
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
classes
#F1 class I (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@class::I
typeParameters
#F2 X (nameOffset:8) (firstTokenOffset:8) (offset:8)
element: #E0 X
constructors
#F3 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@class::I::@constructor::new
typeName: I
#F4 class A (nameOffset:66) (firstTokenOffset:60) (offset:66)
element: <testLibrary>::@class::A
constructors
#F5 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:66)
element: <testLibrary>::@class::A::@constructor::new
typeName: A
mixins
#F6 mixin M1 (nameOffset:20) (firstTokenOffset:14) (offset:20)
element: <testLibrary>::@mixin::M1
typeParameters
#F7 T (nameOffset:23) (firstTokenOffset:23) (offset:23)
element: #E1 T
#F8 mixin M2 (nameOffset:43) (firstTokenOffset:37) (offset:43)
element: <testLibrary>::@mixin::M2
typeParameters
#F9 T (nameOffset:46) (firstTokenOffset:46) (offset:46)
element: #E2 T
classes
class I
reference: <testLibrary>::@class::I
firstFragment: #F1
typeParameters
#E0 X
firstFragment: #F2
constructors
synthetic new
reference: <testLibrary>::@class::I::@constructor::new
firstFragment: #F3
class alias A
reference: <testLibrary>::@class::A
firstFragment: #F4
supertype: I<int>
mixins
M1<int>
M2<int>
constructors
synthetic new
reference: <testLibrary>::@class::A::@constructor::new
firstFragment: #F5
constantInitializers
SuperConstructorInvocation
superKeyword: super @0
argumentList: ArgumentList
leftParenthesis: ( @0
rightParenthesis: ) @0
element: <testLibrary>::@class::I::@constructor::new
superConstructor: ConstructorMember
baseElement: <testLibrary>::@class::I::@constructor::new
substitution: {X: int}
mixins
mixin M1
reference: <testLibrary>::@mixin::M1
firstFragment: #F6
typeParameters
#E1 T
firstFragment: #F7
superclassConstraints
I<T>
mixin M2
reference: <testLibrary>::@mixin::M2
firstFragment: #F8
typeParameters
#E2 T
firstFragment: #F9
superclassConstraints
I<T>
''');
}
test_mixin_inference_viaTypeAlias() async {
var library = await buildLibrary(r'''
mixin M<T, U> on S<T> {}
typedef M2<T2> = M<T2, int>;
class S<T3> {}
class X extends S<String> with M2 {}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
classes
#F1 class S (nameOffset:62) (firstTokenOffset:56) (offset:62)
element: <testLibrary>::@class::S
typeParameters
#F2 T3 (nameOffset:64) (firstTokenOffset:64) (offset:64)
element: #E0 T3
constructors
#F3 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:62)
element: <testLibrary>::@class::S::@constructor::new
typeName: S
#F4 class X (nameOffset:78) (firstTokenOffset:72) (offset:78)
element: <testLibrary>::@class::X
constructors
#F5 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:78)
element: <testLibrary>::@class::X::@constructor::new
typeName: X
mixins
#F6 mixin M (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::M
typeParameters
#F7 T (nameOffset:8) (firstTokenOffset:8) (offset:8)
element: #E1 T
#F8 U (nameOffset:11) (firstTokenOffset:11) (offset:11)
element: #E2 U
typeAliases
#F9 M2 (nameOffset:34) (firstTokenOffset:26) (offset:34)
element: <testLibrary>::@typeAlias::M2
typeParameters
#F10 T2 (nameOffset:37) (firstTokenOffset:37) (offset:37)
element: #E3 T2
classes
class S
reference: <testLibrary>::@class::S
firstFragment: #F1
typeParameters
#E0 T3
firstFragment: #F2
constructors
synthetic new
reference: <testLibrary>::@class::S::@constructor::new
firstFragment: #F3
class X
reference: <testLibrary>::@class::X
firstFragment: #F4
supertype: S<String>
mixins
M<String, int>
alias: <testLibrary>::@typeAlias::M2
typeArguments
String
constructors
synthetic new
reference: <testLibrary>::@class::X::@constructor::new
firstFragment: #F5
superConstructor: ConstructorMember
baseElement: <testLibrary>::@class::S::@constructor::new
substitution: {T3: String}
mixins
mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F6
typeParameters
#E1 T
firstFragment: #F7
#E2 U
firstFragment: #F8
superclassConstraints
S<T>
typeAliases
M2
reference: <testLibrary>::@typeAlias::M2
firstFragment: #F9
typeParameters
#E3 T2
firstFragment: #F10
aliasedType: M<T2, int>
''');
}
test_mixin_inference_viaTypeAlias2() async {
var library = await buildLibrary(r'''
mixin M<T, U> on S<T> {}
typedef M2<T2> = M<T2, int>;
typedef M3<T3> = M2<T3>;
class S<T4> {}
class X extends S<String> with M3 {}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
classes
#F1 class S (nameOffset:88) (firstTokenOffset:82) (offset:88)
element: <testLibrary>::@class::S
typeParameters
#F2 T4 (nameOffset:90) (firstTokenOffset:90) (offset:90)
element: #E0 T4
constructors
#F3 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:88)
element: <testLibrary>::@class::S::@constructor::new
typeName: S
#F4 class X (nameOffset:104) (firstTokenOffset:98) (offset:104)
element: <testLibrary>::@class::X
constructors
#F5 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:104)
element: <testLibrary>::@class::X::@constructor::new
typeName: X
mixins
#F6 mixin M (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::M
typeParameters
#F7 T (nameOffset:8) (firstTokenOffset:8) (offset:8)
element: #E1 T
#F8 U (nameOffset:11) (firstTokenOffset:11) (offset:11)
element: #E2 U
typeAliases
#F9 M2 (nameOffset:34) (firstTokenOffset:26) (offset:34)
element: <testLibrary>::@typeAlias::M2
typeParameters
#F10 T2 (nameOffset:37) (firstTokenOffset:37) (offset:37)
element: #E3 T2
#F11 M3 (nameOffset:64) (firstTokenOffset:56) (offset:64)
element: <testLibrary>::@typeAlias::M3
typeParameters
#F12 T3 (nameOffset:67) (firstTokenOffset:67) (offset:67)
element: #E4 T3
classes
class S
reference: <testLibrary>::@class::S
firstFragment: #F1
typeParameters
#E0 T4
firstFragment: #F2
constructors
synthetic new
reference: <testLibrary>::@class::S::@constructor::new
firstFragment: #F3
class X
reference: <testLibrary>::@class::X
firstFragment: #F4
supertype: S<String>
mixins
M<String, int>
alias: <testLibrary>::@typeAlias::M3
typeArguments
String
constructors
synthetic new
reference: <testLibrary>::@class::X::@constructor::new
firstFragment: #F5
superConstructor: ConstructorMember
baseElement: <testLibrary>::@class::S::@constructor::new
substitution: {T4: String}
mixins
mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F6
typeParameters
#E1 T
firstFragment: #F7
#E2 U
firstFragment: #F8
superclassConstraints
S<T>
typeAliases
M2
reference: <testLibrary>::@typeAlias::M2
firstFragment: #F9
typeParameters
#E3 T2
firstFragment: #F10
aliasedType: M<T2, int>
M3
reference: <testLibrary>::@typeAlias::M3
firstFragment: #F11
typeParameters
#E4 T3
firstFragment: #F12
aliasedType: M<T3, int>
alias: <testLibrary>::@typeAlias::M2
typeArguments
T3
''');
}
test_mixin_interfaces_extensionType() async {
var library = await buildLibrary(r'''
class A {}
extension type B(int it) {}
class C {}
mixin M implements A, B, C {}
''');
configuration.withConstructors = false;
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
#F2 class C (nameOffset:45) (firstTokenOffset:39) (offset:45)
element: <testLibrary>::@class::C
extensionTypes
#F3 extension type B (nameOffset:26) (firstTokenOffset:11) (offset:26)
element: <testLibrary>::@extensionType::B
fields
#F4 it (nameOffset:32) (firstTokenOffset:27) (offset:32)
element: <testLibrary>::@extensionType::B::@field::it
getters
#F5 synthetic it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
element: <testLibrary>::@extensionType::B::@getter::it
mixins
#F6 mixin M (nameOffset:56) (firstTokenOffset:50) (offset:56)
element: <testLibrary>::@mixin::M
classes
class A
reference: <testLibrary>::@class::A
firstFragment: #F1
class C
reference: <testLibrary>::@class::C
firstFragment: #F2
extensionTypes
extension type B
reference: <testLibrary>::@extensionType::B
firstFragment: #F3
representation: <testLibrary>::@extensionType::B::@field::it
primaryConstructor: <testLibrary>::@extensionType::B::@constructor::new
typeErasure: int
fields
final it
reference: <testLibrary>::@extensionType::B::@field::it
firstFragment: #F4
type: int
getter: <testLibrary>::@extensionType::B::@getter::it
getters
synthetic isExtensionTypeMember it
reference: <testLibrary>::@extensionType::B::@getter::it
firstFragment: #F5
returnType: int
variable: <testLibrary>::@extensionType::B::@field::it
mixins
mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F6
superclassConstraints
Object
interfaces
A
C
''');
}
test_mixin_method_invokesSuperSelf() async {
var library = await buildLibrary(r'''
mixin M on A {
void foo() {
super.foo();
}
}
''');
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
methods
#F2 foo (nameOffset:22) (firstTokenOffset:17) (offset:22) invokesSuperSelf
element: <testLibrary>::@mixin::M::@method::foo
mixins
mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F1
superclassConstraints
Object
methods
foo
reference: <testLibrary>::@mixin::M::@method::foo
firstFragment: #F2
returnType: void
''');
}
test_mixin_method_namedAsConstraint() async {
var library = await buildLibrary(r'''
class A {}
mixin B on A {
void A() {}
}
''');
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 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@class::A::@constructor::new
typeName: A
mixins
#F3 mixin B (nameOffset:17) (firstTokenOffset:11) (offset:17)
element: <testLibrary>::@mixin::B
methods
#F4 A (nameOffset:33) (firstTokenOffset:28) (offset:33)
element: <testLibrary>::@mixin::B::@method::A
classes
class A
reference: <testLibrary>::@class::A
firstFragment: #F1
constructors
synthetic new
reference: <testLibrary>::@class::A::@constructor::new
firstFragment: #F2
mixins
mixin B
reference: <testLibrary>::@mixin::B
firstFragment: #F3
superclassConstraints
A
methods
A
reference: <testLibrary>::@mixin::B::@method::A
firstFragment: #F4
returnType: void
''');
}
test_mixin_method_ofGeneric_refEnclosingTypeParameter_false() async {
var library = await buildLibrary('''
mixin M<T> {
void foo() {}
}
''');
configuration.withConstructors = false;
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
typeParameters
#F2 T (nameOffset:8) (firstTokenOffset:8) (offset:8)
element: #E0 T
methods
#F3 foo (nameOffset:20) (firstTokenOffset:15) (offset:20)
element: <testLibrary>::@mixin::M::@method::foo
mixins
mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F1
typeParameters
#E0 T
firstFragment: #F2
superclassConstraints
Object
methods
foo
reference: <testLibrary>::@mixin::M::@method::foo
firstFragment: #F3
returnType: void
''');
}
test_mixin_method_ofGeneric_refEnclosingTypeParameter_true() async {
var library = await buildLibrary('''
mixin M<T> {
void foo(T _) {}
}
''');
configuration.withConstructors = false;
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
typeParameters
#F2 T (nameOffset:8) (firstTokenOffset:8) (offset:8)
element: #E0 T
methods
#F3 foo (nameOffset:20) (firstTokenOffset:15) (offset:20)
element: <testLibrary>::@mixin::M::@method::foo
formalParameters
#F4 _ (nameOffset:26) (firstTokenOffset:24) (offset:26)
element: <testLibrary>::@mixin::M::@method::foo::@formalParameter::_
mixins
mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F1
typeParameters
#E0 T
firstFragment: #F2
superclassConstraints
Object
methods
foo
reference: <testLibrary>::@mixin::M::@method::foo
firstFragment: #F3
hasEnclosingTypeParameterReference: true
formalParameters
#E1 requiredPositional _
firstFragment: #F4
type: T
returnType: void
''');
}
test_mixin_missingName() async {
var library = await buildLibrary(r'''
mixin {}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin <null-name> (nameOffset:<null>) (firstTokenOffset:0) (offset:0)
element: <testLibrary>::@mixin::0
mixins
mixin <null-name>
reference: <testLibrary>::@mixin::0
firstFragment: #F1
superclassConstraints
Object
''');
}
test_mixin_setter_invokesSuperSelf_getter() async {
var library = await buildLibrary(r'''
mixin M on A {
set foo(int _) {
super.foo;
}
}
''');
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 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@mixin::M::@field::foo
setters
#F3 foo (nameOffset:21) (firstTokenOffset:17) (offset:21)
element: <testLibrary>::@mixin::M::@setter::foo
formalParameters
#F4 _ (nameOffset:29) (firstTokenOffset:25) (offset:29)
element: <testLibrary>::@mixin::M::@setter::foo::@formalParameter::_
mixins
mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F1
superclassConstraints
Object
fields
synthetic foo
reference: <testLibrary>::@mixin::M::@field::foo
firstFragment: #F2
type: int
setter: <testLibrary>::@mixin::M::@setter::foo
setters
foo
reference: <testLibrary>::@mixin::M::@setter::foo
firstFragment: #F3
formalParameters
#E0 requiredPositional _
firstFragment: #F4
type: int
returnType: void
variable: <testLibrary>::@mixin::M::@field::foo
''');
}
test_mixin_setter_invokesSuperSelf_setter() async {
var library = await buildLibrary(r'''
mixin M on A {
set foo(int _) {
super.foo = 0;
}
}
''');
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 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@mixin::M::@field::foo
setters
#F3 foo (nameOffset:21) (firstTokenOffset:17) (offset:21)
element: <testLibrary>::@mixin::M::@setter::foo
formalParameters
#F4 _ (nameOffset:29) (firstTokenOffset:25) (offset:29)
element: <testLibrary>::@mixin::M::@setter::foo::@formalParameter::_
mixins
mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F1
superclassConstraints
Object
fields
synthetic foo
reference: <testLibrary>::@mixin::M::@field::foo
firstFragment: #F2
type: int
setter: <testLibrary>::@mixin::M::@setter::foo
setters
foo
reference: <testLibrary>::@mixin::M::@setter::foo
firstFragment: #F3
formalParameters
#E0 requiredPositional _
firstFragment: #F4
type: int
returnType: void
variable: <testLibrary>::@mixin::M::@field::foo
''');
}
test_mixin_superclassConstraints_extensionType() async {
var library = await buildLibrary(r'''
class A {}
extension type B(int it) {}
class C {}
mixin M on A, B, C {}
''');
configuration.withConstructors = false;
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
#F2 class C (nameOffset:45) (firstTokenOffset:39) (offset:45)
element: <testLibrary>::@class::C
extensionTypes
#F3 extension type B (nameOffset:26) (firstTokenOffset:11) (offset:26)
element: <testLibrary>::@extensionType::B
fields
#F4 it (nameOffset:32) (firstTokenOffset:27) (offset:32)
element: <testLibrary>::@extensionType::B::@field::it
getters
#F5 synthetic it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
element: <testLibrary>::@extensionType::B::@getter::it
mixins
#F6 mixin M (nameOffset:56) (firstTokenOffset:50) (offset:56)
element: <testLibrary>::@mixin::M
classes
class A
reference: <testLibrary>::@class::A
firstFragment: #F1
class C
reference: <testLibrary>::@class::C
firstFragment: #F2
extensionTypes
extension type B
reference: <testLibrary>::@extensionType::B
firstFragment: #F3
representation: <testLibrary>::@extensionType::B::@field::it
primaryConstructor: <testLibrary>::@extensionType::B::@constructor::new
typeErasure: int
fields
final it
reference: <testLibrary>::@extensionType::B::@field::it
firstFragment: #F4
type: int
getter: <testLibrary>::@extensionType::B::@getter::it
getters
synthetic isExtensionTypeMember it
reference: <testLibrary>::@extensionType::B::@getter::it
firstFragment: #F5
returnType: int
variable: <testLibrary>::@extensionType::B::@field::it
mixins
mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F6
superclassConstraints
A
C
''');
}
test_mixin_typeParameters_variance_contravariant() async {
var library = await buildLibrary('mixin M<in T> {}');
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
typeParameters
#F2 T (nameOffset:11) (firstTokenOffset:8) (offset:11)
element: #E0 T
mixins
mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F1
typeParameters
#E0 T
firstFragment: #F2
superclassConstraints
Object
''');
}
test_mixin_typeParameters_variance_covariant() async {
var library = await buildLibrary('mixin M<out T> {}');
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
typeParameters
#F2 T (nameOffset:12) (firstTokenOffset:8) (offset:12)
element: #E0 T
mixins
mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F1
typeParameters
#E0 T
firstFragment: #F2
superclassConstraints
Object
''');
}
test_mixin_typeParameters_variance_invariant() async {
var library = await buildLibrary('mixin M<inout T> {}');
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
typeParameters
#F2 T (nameOffset:14) (firstTokenOffset:8) (offset:14)
element: #E0 T
mixins
mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F1
typeParameters
#E0 T
firstFragment: #F2
superclassConstraints
Object
''');
}
test_mixin_typeParameters_variance_multiple() async {
var library = await buildLibrary('mixin M<inout T, in U, out V> {}');
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
typeParameters
#F2 T (nameOffset:14) (firstTokenOffset:8) (offset:14)
element: #E0 T
#F3 U (nameOffset:20) (firstTokenOffset:17) (offset:20)
element: #E1 U
#F4 V (nameOffset:27) (firstTokenOffset:23) (offset:27)
element: #E2 V
mixins
mixin M
reference: <testLibrary>::@mixin::M
firstFragment: #F1
typeParameters
#E0 T
firstFragment: #F2
#E1 U
firstFragment: #F3
#E2 V
firstFragment: #F4
superclassConstraints
Object
''');
}
}
abstract class MixinElementTest_augmentation extends ElementsBaseTest {
test_augmentationTarget() async {
var library = await buildLibrary(r'''
mixin A {}
augment mixin A {}
augment mixin A {}
''');
configuration.withExportScope = true;
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
#F2 mixin A (nameOffset:26) (firstTokenOffset:12) (offset:26)
element: <testLibrary>::@mixin::A
previousFragment: #F1
nextFragment: #F3
#F3 mixin A (nameOffset:45) (firstTokenOffset:31) (offset:45)
element: <testLibrary>::@mixin::A
previousFragment: #F2
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
superclassConstraints
Object
exportedReferences
declared <testLibrary>::@mixin::A
exportNamespace
A: <testLibrary>::@mixin::A
''');
}
test_augmentationTarget_augmentationThenDeclaration() async {
var library = await buildLibrary(r'''
augment mixin A {
void foo1() {}
}
mixin A {
void foo2() {}
}
augment mixin A {
void foo3() {}
}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:14) (firstTokenOffset:0) (offset:14)
element: <testLibrary>::@mixin::A::@def::0
methods
#F2 foo1 (nameOffset:25) (firstTokenOffset:20) (offset:25)
element: <testLibrary>::@mixin::A::@def::0::@method::foo1
#F3 mixin A (nameOffset:44) (firstTokenOffset:38) (offset:44)
element: <testLibrary>::@mixin::A::@def::1
nextFragment: #F4
methods
#F5 foo2 (nameOffset:55) (firstTokenOffset:50) (offset:55)
element: <testLibrary>::@mixin::A::@def::1::@method::foo2
#F4 mixin A (nameOffset:82) (firstTokenOffset:68) (offset:82)
element: <testLibrary>::@mixin::A::@def::1
previousFragment: #F3
methods
#F6 foo3 (nameOffset:93) (firstTokenOffset:88) (offset:93)
element: <testLibrary>::@mixin::A::@def::1::@method::foo3
mixins
mixin A
reference: <testLibrary>::@mixin::A::@def::0
firstFragment: #F1
superclassConstraints
Object
methods
foo1
reference: <testLibrary>::@mixin::A::@def::0::@method::foo1
firstFragment: #F2
returnType: void
mixin A
reference: <testLibrary>::@mixin::A::@def::1
firstFragment: #F3
superclassConstraints
Object
methods
foo2
reference: <testLibrary>::@mixin::A::@def::1::@method::foo2
firstFragment: #F5
returnType: void
foo3
reference: <testLibrary>::@mixin::A::@def::1::@method::foo3
firstFragment: #F6
returnType: void
''');
}
test_augmentationTarget_no2() async {
var library = await buildLibrary(r'''
mixin B {}
augment mixin A {
void foo1() {}
}
augment mixin A {
void foo2() {}
}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin B (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::B
#F2 mixin A (nameOffset:26) (firstTokenOffset:12) (offset:26)
element: <testLibrary>::@mixin::A
nextFragment: #F3
methods
#F4 foo1 (nameOffset:37) (firstTokenOffset:32) (offset:37)
element: <testLibrary>::@mixin::A::@method::foo1
#F3 mixin A (nameOffset:64) (firstTokenOffset:50) (offset:64)
element: <testLibrary>::@mixin::A
previousFragment: #F2
methods
#F5 foo2 (nameOffset:75) (firstTokenOffset:70) (offset:75)
element: <testLibrary>::@mixin::A::@method::foo2
mixins
mixin B
reference: <testLibrary>::@mixin::B
firstFragment: #F1
superclassConstraints
Object
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F2
superclassConstraints
Object
methods
foo1
reference: <testLibrary>::@mixin::A::@method::foo1
firstFragment: #F4
returnType: void
foo2
reference: <testLibrary>::@mixin::A::@method::foo2
firstFragment: #F5
returnType: void
''');
}
test_augmented_field_augment_field() async {
var library = await buildLibrary(r'''
mixin A {
int foo = 0;
}
augment mixin A {
augment int foo = 1;
}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
fields
#F3 hasInitializer foo (nameOffset:16) (firstTokenOffset:16) (offset:16)
element: <testLibrary>::@mixin::A::@field::foo
nextFragment: #F4
getters
#F5 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::A::@getter::foo
setters
#F6 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::A::@setter::foo
formalParameters
#F7 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::A::@setter::foo::@formalParameter::value
#F2 mixin A (nameOffset:42) (firstTokenOffset:28) (offset:42)
element: <testLibrary>::@mixin::A
previousFragment: #F1
fields
#F4 augment hasInitializer foo (nameOffset:60) (firstTokenOffset:60) (offset:60)
element: <testLibrary>::@mixin::A::@field::foo
previousFragment: #F3
mixins
hasNonFinalField mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
superclassConstraints
Object
fields
hasInitializer foo
reference: <testLibrary>::@mixin::A::@field::foo
firstFragment: #F3
type: int
getter: <testLibrary>::@mixin::A::@getter::foo
setter: <testLibrary>::@mixin::A::@setter::foo
getters
synthetic foo
reference: <testLibrary>::@mixin::A::@getter::foo
firstFragment: #F5
returnType: int
variable: <testLibrary>::@mixin::A::@field::foo
setters
synthetic foo
reference: <testLibrary>::@mixin::A::@setter::foo
firstFragment: #F6
formalParameters
#E0 requiredPositional value
firstFragment: #F7
type: int
returnType: void
variable: <testLibrary>::@mixin::A::@field::foo
''');
}
test_augmented_field_augment_field2() async {
var library = await buildLibrary(r'''
mixin A {
int foo = 0;
}
augment mixin A {
augment int foo = 1;
}
augment mixin A {
augment int foo = 2;
}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
fields
#F3 hasInitializer foo (nameOffset:16) (firstTokenOffset:16) (offset:16)
element: <testLibrary>::@mixin::A::@field::foo
nextFragment: #F4
getters
#F5 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::A::@getter::foo
setters
#F6 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::A::@setter::foo
formalParameters
#F7 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::A::@setter::foo::@formalParameter::value
#F2 mixin A (nameOffset:42) (firstTokenOffset:28) (offset:42)
element: <testLibrary>::@mixin::A
previousFragment: #F1
nextFragment: #F8
fields
#F4 augment hasInitializer foo (nameOffset:60) (firstTokenOffset:60) (offset:60)
element: <testLibrary>::@mixin::A::@field::foo
previousFragment: #F3
nextFragment: #F9
#F8 mixin A (nameOffset:86) (firstTokenOffset:72) (offset:86)
element: <testLibrary>::@mixin::A
previousFragment: #F2
fields
#F9 augment hasInitializer foo (nameOffset:104) (firstTokenOffset:104) (offset:104)
element: <testLibrary>::@mixin::A::@field::foo
previousFragment: #F4
mixins
hasNonFinalField mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
superclassConstraints
Object
fields
hasInitializer foo
reference: <testLibrary>::@mixin::A::@field::foo
firstFragment: #F3
type: int
getter: <testLibrary>::@mixin::A::@getter::foo
setter: <testLibrary>::@mixin::A::@setter::foo
getters
synthetic foo
reference: <testLibrary>::@mixin::A::@getter::foo
firstFragment: #F5
returnType: int
variable: <testLibrary>::@mixin::A::@field::foo
setters
synthetic foo
reference: <testLibrary>::@mixin::A::@setter::foo
firstFragment: #F6
formalParameters
#E0 requiredPositional value
firstFragment: #F7
type: int
returnType: void
variable: <testLibrary>::@mixin::A::@field::foo
''');
}
test_augmented_field_augment_field_afterGetter() async {
var library = await buildLibrary(r'''
mixin A {
int foo = 0;
}
augment mixin A {
augment int get foo => 1;
}
augment mixin A {
augment int foo = 2;
}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
fields
#F3 hasInitializer foo (nameOffset:16) (firstTokenOffset:16) (offset:16)
element: <testLibrary>::@mixin::A::@field::foo
nextFragment: #F4
getters
#F5 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::A::@getter::foo
nextFragment: #F6
setters
#F7 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::A::@setter::foo
formalParameters
#F8 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::A::@setter::foo::@formalParameter::value
#F2 mixin A (nameOffset:42) (firstTokenOffset:28) (offset:42)
element: <testLibrary>::@mixin::A
previousFragment: #F1
nextFragment: #F9
getters
#F6 augment foo (nameOffset:64) (firstTokenOffset:48) (offset:64)
element: <testLibrary>::@mixin::A::@getter::foo
previousFragment: #F5
#F9 mixin A (nameOffset:91) (firstTokenOffset:77) (offset:91)
element: <testLibrary>::@mixin::A
previousFragment: #F2
fields
#F4 augment hasInitializer foo (nameOffset:109) (firstTokenOffset:109) (offset:109)
element: <testLibrary>::@mixin::A::@field::foo
previousFragment: #F3
mixins
hasNonFinalField mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
superclassConstraints
Object
fields
hasInitializer foo
reference: <testLibrary>::@mixin::A::@field::foo
firstFragment: #F3
type: int
getter: <testLibrary>::@mixin::A::@getter::foo
setter: <testLibrary>::@mixin::A::@setter::foo
getters
synthetic foo
reference: <testLibrary>::@mixin::A::@getter::foo
firstFragment: #F5
returnType: int
variable: <testLibrary>::@mixin::A::@field::foo
setters
synthetic foo
reference: <testLibrary>::@mixin::A::@setter::foo
firstFragment: #F7
formalParameters
#E0 requiredPositional value
firstFragment: #F8
type: int
returnType: void
variable: <testLibrary>::@mixin::A::@field::foo
''');
}
test_augmented_field_augment_field_afterSetter() async {
var library = await buildLibrary(r'''
mixin A {
int foo = 0;
}
augment mixin A {
augment set foo(int _) {}
}
augment mixin A {
augment int foo = 2;
}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
fields
#F3 hasInitializer foo (nameOffset:16) (firstTokenOffset:16) (offset:16)
element: <testLibrary>::@mixin::A::@field::foo
nextFragment: #F4
getters
#F5 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::A::@getter::foo
setters
#F6 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::A::@setter::foo
formalParameters
#F7 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::A::@setter::foo::@formalParameter::value
nextFragment: #F8
#F2 mixin A (nameOffset:42) (firstTokenOffset:28) (offset:42)
element: <testLibrary>::@mixin::A
previousFragment: #F1
nextFragment: #F9
setters
#F8 augment foo (nameOffset:60) (firstTokenOffset:48) (offset:60)
element: <testLibrary>::@mixin::A::@setter::foo
formalParameters
#F10 _ (nameOffset:68) (firstTokenOffset:64) (offset:68)
element: <testLibrary>::@mixin::A::@setter::foo::@formalParameter::_
previousFragment: #F6
#F9 mixin A (nameOffset:91) (firstTokenOffset:77) (offset:91)
element: <testLibrary>::@mixin::A
previousFragment: #F2
fields
#F4 augment hasInitializer foo (nameOffset:109) (firstTokenOffset:109) (offset:109)
element: <testLibrary>::@mixin::A::@field::foo
previousFragment: #F3
mixins
hasNonFinalField mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
superclassConstraints
Object
fields
hasInitializer foo
reference: <testLibrary>::@mixin::A::@field::foo
firstFragment: #F3
type: int
getter: <testLibrary>::@mixin::A::@getter::foo
setter: <testLibrary>::@mixin::A::@setter::foo
getters
synthetic foo
reference: <testLibrary>::@mixin::A::@getter::foo
firstFragment: #F5
returnType: int
variable: <testLibrary>::@mixin::A::@field::foo
setters
synthetic foo
reference: <testLibrary>::@mixin::A::@setter::foo
firstFragment: #F6
formalParameters
#E0 requiredPositional value
firstFragment: #F7
type: int
returnType: void
variable: <testLibrary>::@mixin::A::@field::foo
''');
}
test_augmented_field_augment_field_differentTypes() async {
var library = await buildLibrary(r'''
mixin A {
int foo = 0;
}
augment mixin A {
augment double foo = 1.2;
}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
fields
#F3 hasInitializer foo (nameOffset:16) (firstTokenOffset:16) (offset:16)
element: <testLibrary>::@mixin::A::@field::foo
nextFragment: #F4
getters
#F5 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::A::@getter::foo
setters
#F6 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::A::@setter::foo
formalParameters
#F7 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::A::@setter::foo::@formalParameter::value
#F2 mixin A (nameOffset:42) (firstTokenOffset:28) (offset:42)
element: <testLibrary>::@mixin::A
previousFragment: #F1
fields
#F4 augment hasInitializer foo (nameOffset:63) (firstTokenOffset:63) (offset:63)
element: <testLibrary>::@mixin::A::@field::foo
previousFragment: #F3
mixins
hasNonFinalField mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
superclassConstraints
Object
fields
hasInitializer foo
reference: <testLibrary>::@mixin::A::@field::foo
firstFragment: #F3
type: int
getter: <testLibrary>::@mixin::A::@getter::foo
setter: <testLibrary>::@mixin::A::@setter::foo
getters
synthetic foo
reference: <testLibrary>::@mixin::A::@getter::foo
firstFragment: #F5
returnType: int
variable: <testLibrary>::@mixin::A::@field::foo
setters
synthetic foo
reference: <testLibrary>::@mixin::A::@setter::foo
firstFragment: #F6
formalParameters
#E0 requiredPositional value
firstFragment: #F7
type: int
returnType: void
variable: <testLibrary>::@mixin::A::@field::foo
''');
}
/// This is not allowed by the specification, but allowed syntactically,
/// so we need a way to handle it.
test_augmented_field_augment_getter() async {
var library = await buildLibrary(r'''
mixin A {
int get foo => 0;
}
augment mixin A {
augment int foo = 1;
}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
fields
#F3 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@mixin::A::@field::foo
nextFragment: #F4
getters
#F5 foo (nameOffset:20) (firstTokenOffset:12) (offset:20)
element: <testLibrary>::@mixin::A::@getter::foo
#F2 mixin A (nameOffset:47) (firstTokenOffset:33) (offset:47)
element: <testLibrary>::@mixin::A
previousFragment: #F1
fields
#F4 augment hasInitializer foo (nameOffset:65) (firstTokenOffset:65) (offset:65)
element: <testLibrary>::@mixin::A::@field::foo
previousFragment: #F3
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
superclassConstraints
Object
fields
synthetic hasInitializer foo
reference: <testLibrary>::@mixin::A::@field::foo
firstFragment: #F3
type: int
getter: <testLibrary>::@mixin::A::@getter::foo
getters
foo
reference: <testLibrary>::@mixin::A::@getter::foo
firstFragment: #F5
returnType: int
variable: <testLibrary>::@mixin::A::@field::foo
''');
}
test_augmented_fields_add() async {
var library = await buildLibrary(r'''
mixin A {
int foo1 = 0;
}
augment mixin A {
int foo2 = 0;
}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
fields
#F3 hasInitializer foo1 (nameOffset:16) (firstTokenOffset:16) (offset:16)
element: <testLibrary>::@mixin::A::@field::foo1
getters
#F4 synthetic foo1 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::A::@getter::foo1
setters
#F5 synthetic foo1 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::A::@setter::foo1
formalParameters
#F6 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::A::@setter::foo1::@formalParameter::value
#F2 mixin A (nameOffset:43) (firstTokenOffset:29) (offset:43)
element: <testLibrary>::@mixin::A
previousFragment: #F1
fields
#F7 hasInitializer foo2 (nameOffset:53) (firstTokenOffset:53) (offset:53)
element: <testLibrary>::@mixin::A::@field::foo2
getters
#F8 synthetic foo2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:53)
element: <testLibrary>::@mixin::A::@getter::foo2
setters
#F9 synthetic foo2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:53)
element: <testLibrary>::@mixin::A::@setter::foo2
formalParameters
#F10 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:53)
element: <testLibrary>::@mixin::A::@setter::foo2::@formalParameter::value
mixins
hasNonFinalField mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
superclassConstraints
Object
fields
hasInitializer foo1
reference: <testLibrary>::@mixin::A::@field::foo1
firstFragment: #F3
type: int
getter: <testLibrary>::@mixin::A::@getter::foo1
setter: <testLibrary>::@mixin::A::@setter::foo1
hasInitializer foo2
reference: <testLibrary>::@mixin::A::@field::foo2
firstFragment: #F7
type: int
getter: <testLibrary>::@mixin::A::@getter::foo2
setter: <testLibrary>::@mixin::A::@setter::foo2
getters
synthetic foo1
reference: <testLibrary>::@mixin::A::@getter::foo1
firstFragment: #F4
returnType: int
variable: <testLibrary>::@mixin::A::@field::foo1
synthetic foo2
reference: <testLibrary>::@mixin::A::@getter::foo2
firstFragment: #F8
returnType: int
variable: <testLibrary>::@mixin::A::@field::foo2
setters
synthetic foo1
reference: <testLibrary>::@mixin::A::@setter::foo1
firstFragment: #F5
formalParameters
#E0 requiredPositional value
firstFragment: #F6
type: int
returnType: void
variable: <testLibrary>::@mixin::A::@field::foo1
synthetic foo2
reference: <testLibrary>::@mixin::A::@setter::foo2
firstFragment: #F9
formalParameters
#E1 requiredPositional value
firstFragment: #F10
type: int
returnType: void
variable: <testLibrary>::@mixin::A::@field::foo2
''');
}
test_augmented_fields_add_generic() async {
var library = await buildLibrary(r'''
mixin A<T> {
T foo1;
}
augment mixin A<T> {
T foo2;
}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
typeParameters
#F3 T (nameOffset:8) (firstTokenOffset:8) (offset:8)
element: #E0 T
nextFragment: #F4
fields
#F5 foo1 (nameOffset:17) (firstTokenOffset:17) (offset:17)
element: <testLibrary>::@mixin::A::@field::foo1
getters
#F6 synthetic foo1 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
element: <testLibrary>::@mixin::A::@getter::foo1
setters
#F7 synthetic foo1 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
element: <testLibrary>::@mixin::A::@setter::foo1
formalParameters
#F8 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
element: <testLibrary>::@mixin::A::@setter::foo1::@formalParameter::value
#F2 mixin A (nameOffset:40) (firstTokenOffset:26) (offset:40)
element: <testLibrary>::@mixin::A
previousFragment: #F1
typeParameters
#F4 T (nameOffset:42) (firstTokenOffset:42) (offset:42)
element: #E0 T
previousFragment: #F3
fields
#F9 foo2 (nameOffset:51) (firstTokenOffset:51) (offset:51)
element: <testLibrary>::@mixin::A::@field::foo2
getters
#F10 synthetic foo2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
element: <testLibrary>::@mixin::A::@getter::foo2
setters
#F11 synthetic foo2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
element: <testLibrary>::@mixin::A::@setter::foo2
formalParameters
#F12 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
element: <testLibrary>::@mixin::A::@setter::foo2::@formalParameter::value
mixins
hasNonFinalField mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
typeParameters
#E0 T
firstFragment: #F3
superclassConstraints
Object
fields
foo1
reference: <testLibrary>::@mixin::A::@field::foo1
firstFragment: #F5
hasEnclosingTypeParameterReference: true
type: T
getter: <testLibrary>::@mixin::A::@getter::foo1
setter: <testLibrary>::@mixin::A::@setter::foo1
foo2
reference: <testLibrary>::@mixin::A::@field::foo2
firstFragment: #F9
hasEnclosingTypeParameterReference: true
type: T
getter: <testLibrary>::@mixin::A::@getter::foo2
setter: <testLibrary>::@mixin::A::@setter::foo2
getters
synthetic foo1
reference: <testLibrary>::@mixin::A::@getter::foo1
firstFragment: #F6
hasEnclosingTypeParameterReference: true
returnType: T
variable: <testLibrary>::@mixin::A::@field::foo1
synthetic foo2
reference: <testLibrary>::@mixin::A::@getter::foo2
firstFragment: #F10
hasEnclosingTypeParameterReference: true
returnType: T
variable: <testLibrary>::@mixin::A::@field::foo2
setters
synthetic foo1
reference: <testLibrary>::@mixin::A::@setter::foo1
firstFragment: #F7
hasEnclosingTypeParameterReference: true
formalParameters
#E1 requiredPositional value
firstFragment: #F8
type: T
returnType: void
variable: <testLibrary>::@mixin::A::@field::foo1
synthetic foo2
reference: <testLibrary>::@mixin::A::@setter::foo2
firstFragment: #F11
hasEnclosingTypeParameterReference: true
formalParameters
#E2 requiredPositional value
firstFragment: #F12
type: T
returnType: void
variable: <testLibrary>::@mixin::A::@field::foo2
''');
}
test_augmented_getters_add() async {
var library = await buildLibrary(r'''
mixin A {
int get foo1 => 0;
}
augment mixin A {
int get foo2 => 0;
}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
fields
#F3 synthetic foo1 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@mixin::A::@field::foo1
getters
#F4 foo1 (nameOffset:20) (firstTokenOffset:12) (offset:20)
element: <testLibrary>::@mixin::A::@getter::foo1
#F2 mixin A (nameOffset:48) (firstTokenOffset:34) (offset:48)
element: <testLibrary>::@mixin::A
previousFragment: #F1
fields
#F5 synthetic foo2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
element: <testLibrary>::@mixin::A::@field::foo2
getters
#F6 foo2 (nameOffset:62) (firstTokenOffset:54) (offset:62)
element: <testLibrary>::@mixin::A::@getter::foo2
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
superclassConstraints
Object
fields
synthetic foo1
reference: <testLibrary>::@mixin::A::@field::foo1
firstFragment: #F3
type: int
getter: <testLibrary>::@mixin::A::@getter::foo1
synthetic foo2
reference: <testLibrary>::@mixin::A::@field::foo2
firstFragment: #F5
type: int
getter: <testLibrary>::@mixin::A::@getter::foo2
getters
foo1
reference: <testLibrary>::@mixin::A::@getter::foo1
firstFragment: #F4
returnType: int
variable: <testLibrary>::@mixin::A::@field::foo1
foo2
reference: <testLibrary>::@mixin::A::@getter::foo2
firstFragment: #F6
returnType: int
variable: <testLibrary>::@mixin::A::@field::foo2
''');
}
test_augmented_getters_add_generic() async {
var library = await buildLibrary(r'''
mixin A<T> {
T get foo1;
}
augment mixin A<T> {
T get foo2;
}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
typeParameters
#F3 T (nameOffset:8) (firstTokenOffset:8) (offset:8)
element: #E0 T
nextFragment: #F4
fields
#F5 synthetic foo1 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@mixin::A::@field::foo1
getters
#F6 foo1 (nameOffset:21) (firstTokenOffset:15) (offset:21)
element: <testLibrary>::@mixin::A::@getter::foo1
#F2 mixin A (nameOffset:44) (firstTokenOffset:30) (offset:44)
element: <testLibrary>::@mixin::A
previousFragment: #F1
typeParameters
#F4 T (nameOffset:46) (firstTokenOffset:46) (offset:46)
element: #E0 T
previousFragment: #F3
fields
#F7 synthetic foo2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44)
element: <testLibrary>::@mixin::A::@field::foo2
getters
#F8 foo2 (nameOffset:59) (firstTokenOffset:53) (offset:59)
element: <testLibrary>::@mixin::A::@getter::foo2
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
typeParameters
#E0 T
firstFragment: #F3
superclassConstraints
Object
fields
synthetic foo1
reference: <testLibrary>::@mixin::A::@field::foo1
firstFragment: #F5
hasEnclosingTypeParameterReference: true
type: T
getter: <testLibrary>::@mixin::A::@getter::foo1
synthetic foo2
reference: <testLibrary>::@mixin::A::@field::foo2
firstFragment: #F7
hasEnclosingTypeParameterReference: true
type: T
getter: <testLibrary>::@mixin::A::@getter::foo2
getters
abstract foo1
reference: <testLibrary>::@mixin::A::@getter::foo1
firstFragment: #F6
hasEnclosingTypeParameterReference: true
returnType: T
variable: <testLibrary>::@mixin::A::@field::foo1
abstract foo2
reference: <testLibrary>::@mixin::A::@getter::foo2
firstFragment: #F8
hasEnclosingTypeParameterReference: true
returnType: T
variable: <testLibrary>::@mixin::A::@field::foo2
''');
}
test_augmented_getters_augment_field() async {
var library = await buildLibrary(r'''
mixin A {
int foo = 0;
}
augment mixin A {
augment int get foo => 0;
}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
fields
#F3 hasInitializer foo (nameOffset:16) (firstTokenOffset:16) (offset:16)
element: <testLibrary>::@mixin::A::@field::foo
getters
#F4 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::A::@getter::foo
nextFragment: #F5
setters
#F6 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::A::@setter::foo
formalParameters
#F7 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::A::@setter::foo::@formalParameter::value
#F2 mixin A (nameOffset:42) (firstTokenOffset:28) (offset:42)
element: <testLibrary>::@mixin::A
previousFragment: #F1
getters
#F5 augment foo (nameOffset:64) (firstTokenOffset:48) (offset:64)
element: <testLibrary>::@mixin::A::@getter::foo
previousFragment: #F4
mixins
hasNonFinalField mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
superclassConstraints
Object
fields
hasInitializer foo
reference: <testLibrary>::@mixin::A::@field::foo
firstFragment: #F3
type: int
getter: <testLibrary>::@mixin::A::@getter::foo
setter: <testLibrary>::@mixin::A::@setter::foo
getters
synthetic foo
reference: <testLibrary>::@mixin::A::@getter::foo
firstFragment: #F4
returnType: int
variable: <testLibrary>::@mixin::A::@field::foo
setters
synthetic foo
reference: <testLibrary>::@mixin::A::@setter::foo
firstFragment: #F6
formalParameters
#E0 requiredPositional value
firstFragment: #F7
type: int
returnType: void
variable: <testLibrary>::@mixin::A::@field::foo
''');
}
test_augmented_getters_augment_field2() async {
var library = await buildLibrary(r'''
mixin A {
int foo = 0;
}
augment mixin A {
augment int get foo => 0;
}
augment mixin A {
augment int get foo => 0;
}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
fields
#F3 hasInitializer foo (nameOffset:16) (firstTokenOffset:16) (offset:16)
element: <testLibrary>::@mixin::A::@field::foo
getters
#F4 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::A::@getter::foo
nextFragment: #F5
setters
#F6 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::A::@setter::foo
formalParameters
#F7 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::A::@setter::foo::@formalParameter::value
#F2 mixin A (nameOffset:42) (firstTokenOffset:28) (offset:42)
element: <testLibrary>::@mixin::A
previousFragment: #F1
nextFragment: #F8
getters
#F5 augment foo (nameOffset:64) (firstTokenOffset:48) (offset:64)
element: <testLibrary>::@mixin::A::@getter::foo
previousFragment: #F4
nextFragment: #F9
#F8 mixin A (nameOffset:91) (firstTokenOffset:77) (offset:91)
element: <testLibrary>::@mixin::A
previousFragment: #F2
getters
#F9 augment foo (nameOffset:113) (firstTokenOffset:97) (offset:113)
element: <testLibrary>::@mixin::A::@getter::foo
previousFragment: #F5
mixins
hasNonFinalField mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
superclassConstraints
Object
fields
hasInitializer foo
reference: <testLibrary>::@mixin::A::@field::foo
firstFragment: #F3
type: int
getter: <testLibrary>::@mixin::A::@getter::foo
setter: <testLibrary>::@mixin::A::@setter::foo
getters
synthetic foo
reference: <testLibrary>::@mixin::A::@getter::foo
firstFragment: #F4
returnType: int
variable: <testLibrary>::@mixin::A::@field::foo
setters
synthetic foo
reference: <testLibrary>::@mixin::A::@setter::foo
firstFragment: #F6
formalParameters
#E0 requiredPositional value
firstFragment: #F7
type: int
returnType: void
variable: <testLibrary>::@mixin::A::@field::foo
''');
}
test_augmented_getters_augment_getter() async {
var library = await buildLibrary(r'''
mixin A {
int get foo1 => 0;
int get foo2 => 0;
}
augment mixin A {
augment int get foo1 => 0;
}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
fields
#F3 synthetic foo1 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@mixin::A::@field::foo1
#F4 synthetic foo2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@mixin::A::@field::foo2
getters
#F5 foo1 (nameOffset:20) (firstTokenOffset:12) (offset:20)
element: <testLibrary>::@mixin::A::@getter::foo1
nextFragment: #F6
#F7 foo2 (nameOffset:41) (firstTokenOffset:33) (offset:41)
element: <testLibrary>::@mixin::A::@getter::foo2
#F2 mixin A (nameOffset:69) (firstTokenOffset:55) (offset:69)
element: <testLibrary>::@mixin::A
previousFragment: #F1
getters
#F6 augment foo1 (nameOffset:91) (firstTokenOffset:75) (offset:91)
element: <testLibrary>::@mixin::A::@getter::foo1
previousFragment: #F5
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
superclassConstraints
Object
fields
synthetic foo1
reference: <testLibrary>::@mixin::A::@field::foo1
firstFragment: #F3
type: int
getter: <testLibrary>::@mixin::A::@getter::foo1
synthetic foo2
reference: <testLibrary>::@mixin::A::@field::foo2
firstFragment: #F4
type: int
getter: <testLibrary>::@mixin::A::@getter::foo2
getters
foo1
reference: <testLibrary>::@mixin::A::@getter::foo1
firstFragment: #F5
returnType: int
variable: <testLibrary>::@mixin::A::@field::foo1
foo2
reference: <testLibrary>::@mixin::A::@getter::foo2
firstFragment: #F7
returnType: int
variable: <testLibrary>::@mixin::A::@field::foo2
''');
}
test_augmented_getters_augment_getter2() async {
var library = await buildLibrary(r'''
mixin A {
int get foo => 0;
}
augment mixin A {
augment int get foo => 0;
}
augment mixin A {
augment int get foo => 0;
}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
fields
#F3 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@mixin::A::@field::foo
getters
#F4 foo (nameOffset:20) (firstTokenOffset:12) (offset:20)
element: <testLibrary>::@mixin::A::@getter::foo
nextFragment: #F5
#F2 mixin A (nameOffset:47) (firstTokenOffset:33) (offset:47)
element: <testLibrary>::@mixin::A
previousFragment: #F1
nextFragment: #F6
getters
#F5 augment foo (nameOffset:69) (firstTokenOffset:53) (offset:69)
element: <testLibrary>::@mixin::A::@getter::foo
previousFragment: #F4
nextFragment: #F7
#F6 mixin A (nameOffset:96) (firstTokenOffset:82) (offset:96)
element: <testLibrary>::@mixin::A
previousFragment: #F2
getters
#F7 augment foo (nameOffset:118) (firstTokenOffset:102) (offset:118)
element: <testLibrary>::@mixin::A::@getter::foo
previousFragment: #F5
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
superclassConstraints
Object
fields
synthetic foo
reference: <testLibrary>::@mixin::A::@field::foo
firstFragment: #F3
type: int
getter: <testLibrary>::@mixin::A::@getter::foo
getters
foo
reference: <testLibrary>::@mixin::A::@getter::foo
firstFragment: #F4
returnType: int
variable: <testLibrary>::@mixin::A::@field::foo
''');
}
test_augmented_interfaces() async {
var library = await buildLibrary(r'''
mixin A implements I1 {}
class I1 {}
augment mixin A implements I2 {}
class I2 {}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
classes
#F1 class I1 (nameOffset:31) (firstTokenOffset:25) (offset:31)
element: <testLibrary>::@class::I1
constructors
#F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
element: <testLibrary>::@class::I1::@constructor::new
typeName: I1
#F3 class I2 (nameOffset:77) (firstTokenOffset:71) (offset:77)
element: <testLibrary>::@class::I2
constructors
#F4 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:77)
element: <testLibrary>::@class::I2::@constructor::new
typeName: I2
mixins
#F5 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F6
#F6 mixin A (nameOffset:52) (firstTokenOffset:38) (offset:52)
element: <testLibrary>::@mixin::A
previousFragment: #F5
classes
class I1
reference: <testLibrary>::@class::I1
firstFragment: #F1
constructors
synthetic new
reference: <testLibrary>::@class::I1::@constructor::new
firstFragment: #F2
class I2
reference: <testLibrary>::@class::I2
firstFragment: #F3
constructors
synthetic new
reference: <testLibrary>::@class::I2::@constructor::new
firstFragment: #F4
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F5
superclassConstraints
Object
interfaces
I1
I2
''');
}
test_augmented_interfaces_chain() async {
var library = await buildLibrary(r'''
mixin A implements I1 {}
class I1 {}
augment mixin A implements I2 {}
class I2 {}
augment mixin A implements I3 {}
class I3 {}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
classes
#F1 class I1 (nameOffset:31) (firstTokenOffset:25) (offset:31)
element: <testLibrary>::@class::I1
constructors
#F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
element: <testLibrary>::@class::I1::@constructor::new
typeName: I1
#F3 class I2 (nameOffset:77) (firstTokenOffset:71) (offset:77)
element: <testLibrary>::@class::I2
constructors
#F4 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:77)
element: <testLibrary>::@class::I2::@constructor::new
typeName: I2
#F5 class I3 (nameOffset:123) (firstTokenOffset:117) (offset:123)
element: <testLibrary>::@class::I3
constructors
#F6 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:123)
element: <testLibrary>::@class::I3::@constructor::new
typeName: I3
mixins
#F7 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F8
#F8 mixin A (nameOffset:52) (firstTokenOffset:38) (offset:52)
element: <testLibrary>::@mixin::A
previousFragment: #F7
nextFragment: #F9
#F9 mixin A (nameOffset:98) (firstTokenOffset:84) (offset:98)
element: <testLibrary>::@mixin::A
previousFragment: #F8
classes
class I1
reference: <testLibrary>::@class::I1
firstFragment: #F1
constructors
synthetic new
reference: <testLibrary>::@class::I1::@constructor::new
firstFragment: #F2
class I2
reference: <testLibrary>::@class::I2
firstFragment: #F3
constructors
synthetic new
reference: <testLibrary>::@class::I2::@constructor::new
firstFragment: #F4
class I3
reference: <testLibrary>::@class::I3
firstFragment: #F5
constructors
synthetic new
reference: <testLibrary>::@class::I3::@constructor::new
firstFragment: #F6
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F7
superclassConstraints
Object
interfaces
I1
I2
I3
''');
}
test_augmented_methods() async {
var library = await buildLibrary(r'''
mixin A {
void foo() {}
}
augment mixin A {
void bar() {}
}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
methods
#F3 foo (nameOffset:17) (firstTokenOffset:12) (offset:17)
element: <testLibrary>::@mixin::A::@method::foo
#F2 mixin A (nameOffset:43) (firstTokenOffset:29) (offset:43)
element: <testLibrary>::@mixin::A
previousFragment: #F1
methods
#F4 bar (nameOffset:54) (firstTokenOffset:49) (offset:54)
element: <testLibrary>::@mixin::A::@method::bar
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
superclassConstraints
Object
methods
foo
reference: <testLibrary>::@mixin::A::@method::foo
firstFragment: #F3
returnType: void
bar
reference: <testLibrary>::@mixin::A::@method::bar
firstFragment: #F4
returnType: void
''');
}
test_augmented_methods_augment() async {
var library = await buildLibrary(r'''
mixin A {
void foo1() {}
void foo2() {}
}
augment mixin A {
augment void foo1() {}
}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
methods
#F3 foo1 (nameOffset:17) (firstTokenOffset:12) (offset:17)
element: <testLibrary>::@mixin::A::@method::foo1
nextFragment: #F4
#F5 foo2 (nameOffset:34) (firstTokenOffset:29) (offset:34)
element: <testLibrary>::@mixin::A::@method::foo2
#F2 mixin A (nameOffset:61) (firstTokenOffset:47) (offset:61)
element: <testLibrary>::@mixin::A
previousFragment: #F1
methods
#F4 augment foo1 (nameOffset:80) (firstTokenOffset:67) (offset:80)
element: <testLibrary>::@mixin::A::@method::foo1
previousFragment: #F3
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
superclassConstraints
Object
methods
foo1
reference: <testLibrary>::@mixin::A::@method::foo1
firstFragment: #F3
returnType: void
foo2
reference: <testLibrary>::@mixin::A::@method::foo2
firstFragment: #F5
returnType: void
''');
}
test_augmented_methods_augment2() async {
var library = await buildLibrary(r'''
mixin A {
void foo() {}
}
augment mixin A {
augment void foo() {}
}
augment mixin A {
augment void foo() {}
}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
methods
#F3 foo (nameOffset:17) (firstTokenOffset:12) (offset:17)
element: <testLibrary>::@mixin::A::@method::foo
nextFragment: #F4
#F2 mixin A (nameOffset:43) (firstTokenOffset:29) (offset:43)
element: <testLibrary>::@mixin::A
previousFragment: #F1
nextFragment: #F5
methods
#F4 augment foo (nameOffset:62) (firstTokenOffset:49) (offset:62)
element: <testLibrary>::@mixin::A::@method::foo
previousFragment: #F3
nextFragment: #F6
#F5 mixin A (nameOffset:88) (firstTokenOffset:74) (offset:88)
element: <testLibrary>::@mixin::A
previousFragment: #F2
methods
#F6 augment foo (nameOffset:107) (firstTokenOffset:94) (offset:107)
element: <testLibrary>::@mixin::A::@method::foo
previousFragment: #F4
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
superclassConstraints
Object
methods
foo
reference: <testLibrary>::@mixin::A::@method::foo
firstFragment: #F3
returnType: void
''');
}
test_augmented_methods_generic() async {
var library = await buildLibrary(r'''
mixin A<T> {
T foo() => throw 0;
}
augment mixin A<T> {
T bar() => throw 0;
}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
typeParameters
#F3 T (nameOffset:8) (firstTokenOffset:8) (offset:8)
element: #E0 T
nextFragment: #F4
methods
#F5 foo (nameOffset:17) (firstTokenOffset:15) (offset:17)
element: <testLibrary>::@mixin::A::@method::foo
#F2 mixin A (nameOffset:52) (firstTokenOffset:38) (offset:52)
element: <testLibrary>::@mixin::A
previousFragment: #F1
typeParameters
#F4 T (nameOffset:54) (firstTokenOffset:54) (offset:54)
element: #E0 T
previousFragment: #F3
methods
#F6 bar (nameOffset:63) (firstTokenOffset:61) (offset:63)
element: <testLibrary>::@mixin::A::@method::bar
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
typeParameters
#E0 T
firstFragment: #F3
superclassConstraints
Object
methods
foo
reference: <testLibrary>::@mixin::A::@method::foo
firstFragment: #F5
hasEnclosingTypeParameterReference: true
returnType: T
bar
reference: <testLibrary>::@mixin::A::@method::bar
firstFragment: #F6
hasEnclosingTypeParameterReference: true
returnType: T
''');
}
test_augmented_methods_generic_augment() async {
var library = await buildLibrary(r'''
mixin A<T> {
T foo() => throw 0;
}
augment mixin A<T> {
augment T foo() => throw 0;
}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
typeParameters
#F3 T (nameOffset:8) (firstTokenOffset:8) (offset:8)
element: #E0 T
nextFragment: #F4
methods
#F5 foo (nameOffset:17) (firstTokenOffset:15) (offset:17)
element: <testLibrary>::@mixin::A::@method::foo
nextFragment: #F6
#F2 mixin A (nameOffset:52) (firstTokenOffset:38) (offset:52)
element: <testLibrary>::@mixin::A
previousFragment: #F1
typeParameters
#F4 T (nameOffset:54) (firstTokenOffset:54) (offset:54)
element: #E0 T
previousFragment: #F3
methods
#F6 augment foo (nameOffset:71) (firstTokenOffset:61) (offset:71)
element: <testLibrary>::@mixin::A::@method::foo
previousFragment: #F5
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
typeParameters
#E0 T
firstFragment: #F3
superclassConstraints
Object
methods
foo
reference: <testLibrary>::@mixin::A::@method::foo
firstFragment: #F5
hasEnclosingTypeParameterReference: true
returnType: T
''');
}
test_augmented_methods_typeParameterCountMismatch() async {
var library = await buildLibrary(r'''
mixin A {
void foo() {}
void bar() {}
}
augment mixin A<T> {
augment void foo() {}
}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
methods
#F3 foo (nameOffset:17) (firstTokenOffset:12) (offset:17)
element: <testLibrary>::@mixin::A::@method::foo
nextFragment: #F4
#F5 bar (nameOffset:33) (firstTokenOffset:28) (offset:33)
element: <testLibrary>::@mixin::A::@method::bar
#F2 mixin A (nameOffset:59) (firstTokenOffset:45) (offset:59)
element: <testLibrary>::@mixin::A
previousFragment: #F1
methods
#F4 augment foo (nameOffset:81) (firstTokenOffset:68) (offset:81)
element: <testLibrary>::@mixin::A::@method::foo
previousFragment: #F3
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
superclassConstraints
Object
methods
foo
reference: <testLibrary>::@mixin::A::@method::foo
firstFragment: #F3
returnType: void
bar
reference: <testLibrary>::@mixin::A::@method::bar
firstFragment: #F5
returnType: void
''');
}
test_augmented_setters_add() async {
var library = await buildLibrary(r'''
mixin A {
set foo1(int _) {}
}
augment mixin A {
set foo2(int _) {}
}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
fields
#F3 synthetic foo1 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@mixin::A::@field::foo1
setters
#F4 foo1 (nameOffset:16) (firstTokenOffset:12) (offset:16)
element: <testLibrary>::@mixin::A::@setter::foo1
formalParameters
#F5 _ (nameOffset:25) (firstTokenOffset:21) (offset:25)
element: <testLibrary>::@mixin::A::@setter::foo1::@formalParameter::_
#F2 mixin A (nameOffset:48) (firstTokenOffset:34) (offset:48)
element: <testLibrary>::@mixin::A
previousFragment: #F1
fields
#F6 synthetic foo2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
element: <testLibrary>::@mixin::A::@field::foo2
setters
#F7 foo2 (nameOffset:58) (firstTokenOffset:54) (offset:58)
element: <testLibrary>::@mixin::A::@setter::foo2
formalParameters
#F8 _ (nameOffset:67) (firstTokenOffset:63) (offset:67)
element: <testLibrary>::@mixin::A::@setter::foo2::@formalParameter::_
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
superclassConstraints
Object
fields
synthetic foo1
reference: <testLibrary>::@mixin::A::@field::foo1
firstFragment: #F3
type: int
setter: <testLibrary>::@mixin::A::@setter::foo1
synthetic foo2
reference: <testLibrary>::@mixin::A::@field::foo2
firstFragment: #F6
type: int
setter: <testLibrary>::@mixin::A::@setter::foo2
setters
foo1
reference: <testLibrary>::@mixin::A::@setter::foo1
firstFragment: #F4
formalParameters
#E0 requiredPositional _
firstFragment: #F5
type: int
returnType: void
variable: <testLibrary>::@mixin::A::@field::foo1
foo2
reference: <testLibrary>::@mixin::A::@setter::foo2
firstFragment: #F7
formalParameters
#E1 requiredPositional _
firstFragment: #F8
type: int
returnType: void
variable: <testLibrary>::@mixin::A::@field::foo2
''');
}
test_augmented_setters_augment_field() async {
var library = await buildLibrary(r'''
mixin A {
int foo = 0;
}
augment mixin A {
augment set foo(int _) {}
}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
fields
#F3 hasInitializer foo (nameOffset:16) (firstTokenOffset:16) (offset:16)
element: <testLibrary>::@mixin::A::@field::foo
getters
#F4 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::A::@getter::foo
setters
#F5 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::A::@setter::foo
formalParameters
#F6 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
element: <testLibrary>::@mixin::A::@setter::foo::@formalParameter::value
nextFragment: #F7
#F2 mixin A (nameOffset:42) (firstTokenOffset:28) (offset:42)
element: <testLibrary>::@mixin::A
previousFragment: #F1
setters
#F7 augment foo (nameOffset:60) (firstTokenOffset:48) (offset:60)
element: <testLibrary>::@mixin::A::@setter::foo
formalParameters
#F8 _ (nameOffset:68) (firstTokenOffset:64) (offset:68)
element: <testLibrary>::@mixin::A::@setter::foo::@formalParameter::_
previousFragment: #F5
mixins
hasNonFinalField mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
superclassConstraints
Object
fields
hasInitializer foo
reference: <testLibrary>::@mixin::A::@field::foo
firstFragment: #F3
type: int
getter: <testLibrary>::@mixin::A::@getter::foo
setter: <testLibrary>::@mixin::A::@setter::foo
getters
synthetic foo
reference: <testLibrary>::@mixin::A::@getter::foo
firstFragment: #F4
returnType: int
variable: <testLibrary>::@mixin::A::@field::foo
setters
synthetic foo
reference: <testLibrary>::@mixin::A::@setter::foo
firstFragment: #F5
formalParameters
#E0 requiredPositional value
firstFragment: #F6
type: int
returnType: void
variable: <testLibrary>::@mixin::A::@field::foo
''');
}
test_augmented_setters_augment_setter() async {
var library = await buildLibrary(r'''
mixin A {
set foo1(int _) {}
set foo2(int _) {}
}
augment mixin A {
augment set foo1(int _) {}
}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
fields
#F3 synthetic foo1 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@mixin::A::@field::foo1
#F4 synthetic foo2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
element: <testLibrary>::@mixin::A::@field::foo2
setters
#F5 foo1 (nameOffset:16) (firstTokenOffset:12) (offset:16)
element: <testLibrary>::@mixin::A::@setter::foo1
formalParameters
#F6 _ (nameOffset:25) (firstTokenOffset:21) (offset:25)
element: <testLibrary>::@mixin::A::@setter::foo1::@formalParameter::_
nextFragment: #F7
#F8 foo2 (nameOffset:37) (firstTokenOffset:33) (offset:37)
element: <testLibrary>::@mixin::A::@setter::foo2
formalParameters
#F9 _ (nameOffset:46) (firstTokenOffset:42) (offset:46)
element: <testLibrary>::@mixin::A::@setter::foo2::@formalParameter::_
#F2 mixin A (nameOffset:69) (firstTokenOffset:55) (offset:69)
element: <testLibrary>::@mixin::A
previousFragment: #F1
setters
#F7 augment foo1 (nameOffset:87) (firstTokenOffset:75) (offset:87)
element: <testLibrary>::@mixin::A::@setter::foo1
formalParameters
#F10 _ (nameOffset:96) (firstTokenOffset:92) (offset:96)
element: <testLibrary>::@mixin::A::@setter::foo1::@formalParameter::_
previousFragment: #F5
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
superclassConstraints
Object
fields
synthetic foo1
reference: <testLibrary>::@mixin::A::@field::foo1
firstFragment: #F3
type: int
setter: <testLibrary>::@mixin::A::@setter::foo1
synthetic foo2
reference: <testLibrary>::@mixin::A::@field::foo2
firstFragment: #F4
type: int
setter: <testLibrary>::@mixin::A::@setter::foo2
setters
foo1
reference: <testLibrary>::@mixin::A::@setter::foo1
firstFragment: #F5
formalParameters
#E0 requiredPositional _
firstFragment: #F6
type: int
returnType: void
variable: <testLibrary>::@mixin::A::@field::foo1
foo2
reference: <testLibrary>::@mixin::A::@setter::foo2
firstFragment: #F8
formalParameters
#E1 requiredPositional _
firstFragment: #F9
type: int
returnType: void
variable: <testLibrary>::@mixin::A::@field::foo2
''');
}
test_augmented_superclassConstraints() async {
var library = await buildLibrary(r'''
mixin A on B1 {}
class B1 {}
augment mixin A on B2 {}
class B2 {}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
classes
#F1 class B1 (nameOffset:23) (firstTokenOffset:17) (offset:23)
element: <testLibrary>::@class::B1
constructors
#F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
element: <testLibrary>::@class::B1::@constructor::new
typeName: B1
#F3 class B2 (nameOffset:61) (firstTokenOffset:55) (offset:61)
element: <testLibrary>::@class::B2
constructors
#F4 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:61)
element: <testLibrary>::@class::B2::@constructor::new
typeName: B2
mixins
#F5 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F6
#F6 mixin A (nameOffset:44) (firstTokenOffset:30) (offset:44)
element: <testLibrary>::@mixin::A
previousFragment: #F5
classes
class B1
reference: <testLibrary>::@class::B1
firstFragment: #F1
constructors
synthetic new
reference: <testLibrary>::@class::B1::@constructor::new
firstFragment: #F2
class B2
reference: <testLibrary>::@class::B2
firstFragment: #F3
constructors
synthetic new
reference: <testLibrary>::@class::B2::@constructor::new
firstFragment: #F4
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F5
superclassConstraints
B1
B2
''');
}
test_augmented_superclassConstraints_chain() async {
var library = await buildLibrary(r'''
mixin A on I1 {}
class I1 {}
augment mixin A on I2 {}
class I2 {}
augment mixin A on I3 {}
class I3 {}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
classes
#F1 class I1 (nameOffset:23) (firstTokenOffset:17) (offset:23)
element: <testLibrary>::@class::I1
constructors
#F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
element: <testLibrary>::@class::I1::@constructor::new
typeName: I1
#F3 class I2 (nameOffset:61) (firstTokenOffset:55) (offset:61)
element: <testLibrary>::@class::I2
constructors
#F4 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:61)
element: <testLibrary>::@class::I2::@constructor::new
typeName: I2
#F5 class I3 (nameOffset:99) (firstTokenOffset:93) (offset:99)
element: <testLibrary>::@class::I3
constructors
#F6 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:99)
element: <testLibrary>::@class::I3::@constructor::new
typeName: I3
mixins
#F7 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F8
#F8 mixin A (nameOffset:44) (firstTokenOffset:30) (offset:44)
element: <testLibrary>::@mixin::A
previousFragment: #F7
nextFragment: #F9
#F9 mixin A (nameOffset:82) (firstTokenOffset:68) (offset:82)
element: <testLibrary>::@mixin::A
previousFragment: #F8
classes
class I1
reference: <testLibrary>::@class::I1
firstFragment: #F1
constructors
synthetic new
reference: <testLibrary>::@class::I1::@constructor::new
firstFragment: #F2
class I2
reference: <testLibrary>::@class::I2
firstFragment: #F3
constructors
synthetic new
reference: <testLibrary>::@class::I2::@constructor::new
firstFragment: #F4
class I3
reference: <testLibrary>::@class::I3
firstFragment: #F5
constructors
synthetic new
reference: <testLibrary>::@class::I3::@constructor::new
firstFragment: #F6
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F7
superclassConstraints
I1
I2
I3
''');
}
test_augmented_superclassConstraints_fromAugmentation() async {
var library = await buildLibrary(r'''
mixin A {}
augment mixin A on B {}
class B {}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
classes
#F1 class B (nameOffset:42) (firstTokenOffset:36) (offset:42)
element: <testLibrary>::@class::B
constructors
#F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42)
element: <testLibrary>::@class::B::@constructor::new
typeName: B
mixins
#F3 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F4
#F4 mixin A (nameOffset:26) (firstTokenOffset:12) (offset:26)
element: <testLibrary>::@mixin::A
previousFragment: #F3
classes
class B
reference: <testLibrary>::@class::B
firstFragment: #F1
constructors
synthetic new
reference: <testLibrary>::@class::B::@constructor::new
firstFragment: #F2
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F3
superclassConstraints
B
''');
}
test_augmented_superclassConstraints_generic() async {
var library = await buildLibrary(r'''
mixin A<T> on I1 {}
class I1 {}
augment mixin A<T> on I2<T> {}
class I2<E> {}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
classes
#F1 class I1 (nameOffset:26) (firstTokenOffset:20) (offset:26)
element: <testLibrary>::@class::I1
constructors
#F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
element: <testLibrary>::@class::I1::@constructor::new
typeName: I1
#F3 class I2 (nameOffset:70) (firstTokenOffset:64) (offset:70)
element: <testLibrary>::@class::I2
typeParameters
#F4 E (nameOffset:73) (firstTokenOffset:73) (offset:73)
element: #E0 E
constructors
#F5 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:70)
element: <testLibrary>::@class::I2::@constructor::new
typeName: I2
mixins
#F6 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F7
typeParameters
#F8 T (nameOffset:8) (firstTokenOffset:8) (offset:8)
element: #E1 T
nextFragment: #F9
#F7 mixin A (nameOffset:47) (firstTokenOffset:33) (offset:47)
element: <testLibrary>::@mixin::A
previousFragment: #F6
typeParameters
#F9 T (nameOffset:49) (firstTokenOffset:49) (offset:49)
element: #E1 T
previousFragment: #F8
classes
class I1
reference: <testLibrary>::@class::I1
firstFragment: #F1
constructors
synthetic new
reference: <testLibrary>::@class::I1::@constructor::new
firstFragment: #F2
class I2
reference: <testLibrary>::@class::I2
firstFragment: #F3
typeParameters
#E0 E
firstFragment: #F4
constructors
synthetic new
reference: <testLibrary>::@class::I2::@constructor::new
firstFragment: #F5
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F6
typeParameters
#E1 T
firstFragment: #F8
superclassConstraints
I1
I2<T>
''');
}
test_augmentedBy_class2() async {
var library = await buildLibrary(r'''
mixin A {}
augment class A {}
augment class A {}
''');
configuration.withConstructors = false;
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
classes
#F1 class A (nameOffset:25) (firstTokenOffset:11) (offset:25)
element: <testLibrary>::@class::A
nextFragment: #F2
#F2 class A (nameOffset:44) (firstTokenOffset:30) (offset:44)
element: <testLibrary>::@class::A
previousFragment: #F1
mixins
#F3 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
classes
class A
reference: <testLibrary>::@class::A
firstFragment: #F1
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F3
superclassConstraints
Object
''');
}
test_augmentedBy_class_mixin() async {
var library = await buildLibrary(r'''
mixin A {}
augment class A {}
augment mixin A {}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
classes
#F1 class A (nameOffset:26) (firstTokenOffset:12) (offset:26)
element: <testLibrary>::@class::A
constructors
#F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
element: <testLibrary>::@class::A::@constructor::new
typeName: A
mixins
#F3 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A::@def::0
#F4 mixin A (nameOffset:45) (firstTokenOffset:31) (offset:45)
element: <testLibrary>::@mixin::A::@def::1
classes
class A
reference: <testLibrary>::@class::A
firstFragment: #F1
constructors
synthetic new
reference: <testLibrary>::@class::A::@constructor::new
firstFragment: #F2
mixins
mixin A
reference: <testLibrary>::@mixin::A::@def::0
firstFragment: #F3
superclassConstraints
Object
mixin A
reference: <testLibrary>::@mixin::A::@def::1
firstFragment: #F4
superclassConstraints
Object
''');
}
test_inferTypes_method_ofAugment() async {
var library = await buildLibrary(r'''
mixin B on A {}
class A {
int foo(String a) => 0;
}
augment mixin B {
foo(a) => 0;
}
''');
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 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
element: <testLibrary>::@class::A::@constructor::new
typeName: A
methods
#F3 foo (nameOffset:33) (firstTokenOffset:29) (offset:33)
element: <testLibrary>::@class::A::@method::foo
formalParameters
#F4 a (nameOffset:44) (firstTokenOffset:37) (offset:44)
element: <testLibrary>::@class::A::@method::foo::@formalParameter::a
mixins
#F5 mixin B (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::B
nextFragment: #F6
#F6 mixin B (nameOffset:70) (firstTokenOffset:56) (offset:70)
element: <testLibrary>::@mixin::B
previousFragment: #F5
methods
#F7 foo (nameOffset:76) (firstTokenOffset:76) (offset:76)
element: <testLibrary>::@mixin::B::@method::foo
formalParameters
#F8 a (nameOffset:80) (firstTokenOffset:80) (offset:80)
element: <testLibrary>::@mixin::B::@method::foo::@formalParameter::a
classes
class A
reference: <testLibrary>::@class::A
firstFragment: #F1
constructors
synthetic new
reference: <testLibrary>::@class::A::@constructor::new
firstFragment: #F2
methods
foo
reference: <testLibrary>::@class::A::@method::foo
firstFragment: #F3
formalParameters
#E0 requiredPositional a
firstFragment: #F4
type: String
returnType: int
mixins
mixin B
reference: <testLibrary>::@mixin::B
firstFragment: #F5
superclassConstraints
A
methods
foo
reference: <testLibrary>::@mixin::B::@method::foo
firstFragment: #F7
formalParameters
#E1 requiredPositional hasImplicitType a
firstFragment: #F8
type: String
returnType: int
''');
}
test_inferTypes_method_usingAugmentation_interface() async {
var library = await buildLibrary(r'''
mixin B {
foo(a) => 0;
}
class A {
int foo(String a) => 0;
}
augment mixin B implements A {}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
classes
#F1 class A (nameOffset:34) (firstTokenOffset:28) (offset:34)
element: <testLibrary>::@class::A
constructors
#F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
element: <testLibrary>::@class::A::@constructor::new
typeName: A
methods
#F3 foo (nameOffset:44) (firstTokenOffset:40) (offset:44)
element: <testLibrary>::@class::A::@method::foo
formalParameters
#F4 a (nameOffset:55) (firstTokenOffset:48) (offset:55)
element: <testLibrary>::@class::A::@method::foo::@formalParameter::a
mixins
#F5 mixin B (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::B
nextFragment: #F6
methods
#F7 foo (nameOffset:12) (firstTokenOffset:12) (offset:12)
element: <testLibrary>::@mixin::B::@method::foo
formalParameters
#F8 a (nameOffset:16) (firstTokenOffset:16) (offset:16)
element: <testLibrary>::@mixin::B::@method::foo::@formalParameter::a
#F6 mixin B (nameOffset:81) (firstTokenOffset:67) (offset:81)
element: <testLibrary>::@mixin::B
previousFragment: #F5
classes
class A
reference: <testLibrary>::@class::A
firstFragment: #F1
constructors
synthetic new
reference: <testLibrary>::@class::A::@constructor::new
firstFragment: #F2
methods
foo
reference: <testLibrary>::@class::A::@method::foo
firstFragment: #F3
formalParameters
#E0 requiredPositional a
firstFragment: #F4
type: String
returnType: int
mixins
mixin B
reference: <testLibrary>::@mixin::B
firstFragment: #F5
superclassConstraints
Object
interfaces
A
methods
foo
reference: <testLibrary>::@mixin::B::@method::foo
firstFragment: #F7
formalParameters
#E1 requiredPositional hasImplicitType a
firstFragment: #F8
type: String
returnType: int
''');
}
test_inferTypes_method_usingAugmentation_superclassConstraint() async {
var library = await buildLibrary(r'''
mixin B {
foo(a) => 0;
}
class A {
int foo(String a) => 0;
}
augment mixin B on A {}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
classes
#F1 class A (nameOffset:34) (firstTokenOffset:28) (offset:34)
element: <testLibrary>::@class::A
constructors
#F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
element: <testLibrary>::@class::A::@constructor::new
typeName: A
methods
#F3 foo (nameOffset:44) (firstTokenOffset:40) (offset:44)
element: <testLibrary>::@class::A::@method::foo
formalParameters
#F4 a (nameOffset:55) (firstTokenOffset:48) (offset:55)
element: <testLibrary>::@class::A::@method::foo::@formalParameter::a
mixins
#F5 mixin B (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::B
nextFragment: #F6
methods
#F7 foo (nameOffset:12) (firstTokenOffset:12) (offset:12)
element: <testLibrary>::@mixin::B::@method::foo
formalParameters
#F8 a (nameOffset:16) (firstTokenOffset:16) (offset:16)
element: <testLibrary>::@mixin::B::@method::foo::@formalParameter::a
#F6 mixin B (nameOffset:81) (firstTokenOffset:67) (offset:81)
element: <testLibrary>::@mixin::B
previousFragment: #F5
classes
class A
reference: <testLibrary>::@class::A
firstFragment: #F1
constructors
synthetic new
reference: <testLibrary>::@class::A::@constructor::new
firstFragment: #F2
methods
foo
reference: <testLibrary>::@class::A::@method::foo
firstFragment: #F3
formalParameters
#E0 requiredPositional a
firstFragment: #F4
type: String
returnType: int
mixins
mixin B
reference: <testLibrary>::@mixin::B
firstFragment: #F5
superclassConstraints
A
methods
foo
reference: <testLibrary>::@mixin::B::@method::foo
firstFragment: #F7
formalParameters
#E1 requiredPositional hasImplicitType a
firstFragment: #F8
type: String
returnType: int
''');
}
test_inferTypes_method_withAugment() async {
var library = await buildLibrary(r'''
mixin B on A {
foo(a) => 0;
}
class A {
int foo(String a) => 0;
}
augment mixin B {
augment foo(a) => 0;
}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
classes
#F1 class A (nameOffset:39) (firstTokenOffset:33) (offset:39)
element: <testLibrary>::@class::A
constructors
#F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
element: <testLibrary>::@class::A::@constructor::new
typeName: A
methods
#F3 foo (nameOffset:49) (firstTokenOffset:45) (offset:49)
element: <testLibrary>::@class::A::@method::foo
formalParameters
#F4 a (nameOffset:60) (firstTokenOffset:53) (offset:60)
element: <testLibrary>::@class::A::@method::foo::@formalParameter::a
mixins
#F5 mixin B (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::B
nextFragment: #F6
methods
#F7 foo (nameOffset:17) (firstTokenOffset:17) (offset:17)
element: <testLibrary>::@mixin::B::@method::foo
nextFragment: #F8
formalParameters
#F9 a (nameOffset:21) (firstTokenOffset:21) (offset:21)
element: <testLibrary>::@mixin::B::@method::foo::@formalParameter::a
nextFragment: #F10
#F6 mixin B (nameOffset:86) (firstTokenOffset:72) (offset:86)
element: <testLibrary>::@mixin::B
previousFragment: #F5
methods
#F8 augment foo (nameOffset:100) (firstTokenOffset:92) (offset:100)
element: <testLibrary>::@mixin::B::@method::foo
previousFragment: #F7
formalParameters
#F10 a (nameOffset:104) (firstTokenOffset:104) (offset:104)
element: <testLibrary>::@mixin::B::@method::foo::@formalParameter::a
previousFragment: #F9
classes
class A
reference: <testLibrary>::@class::A
firstFragment: #F1
constructors
synthetic new
reference: <testLibrary>::@class::A::@constructor::new
firstFragment: #F2
methods
foo
reference: <testLibrary>::@class::A::@method::foo
firstFragment: #F3
formalParameters
#E0 requiredPositional a
firstFragment: #F4
type: String
returnType: int
mixins
mixin B
reference: <testLibrary>::@mixin::B
firstFragment: #F5
superclassConstraints
A
methods
foo
reference: <testLibrary>::@mixin::B::@method::foo
firstFragment: #F7
formalParameters
#E1 requiredPositional hasImplicitType a
firstFragment: #F9
type: String
returnType: int
''');
}
test_method_typeParameters_111() async {
var library = await buildLibrary(r'''
mixin A {
void foo<T>(){}
}
augment mixin A {
augment void foo<T>(){}
}
augment mixin A {
augment void foo<T>(){}
}
''');
configuration.withConstructors = false;
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
methods
#F3 foo (nameOffset:17) (firstTokenOffset:12) (offset:17)
element: <testLibrary>::@mixin::A::@method::foo
nextFragment: #F4
typeParameters
#F5 T (nameOffset:21) (firstTokenOffset:21) (offset:21)
element: #E0 T
nextFragment: #F6
#F2 mixin A (nameOffset:44) (firstTokenOffset:30) (offset:44)
element: <testLibrary>::@mixin::A
previousFragment: #F1
nextFragment: #F7
methods
#F4 augment foo (nameOffset:63) (firstTokenOffset:50) (offset:63)
element: <testLibrary>::@mixin::A::@method::foo
previousFragment: #F3
nextFragment: #F8
typeParameters
#F6 T (nameOffset:67) (firstTokenOffset:67) (offset:67)
element: #E0 T
previousFragment: #F5
nextFragment: #F9
#F7 mixin A (nameOffset:90) (firstTokenOffset:76) (offset:90)
element: <testLibrary>::@mixin::A
previousFragment: #F2
methods
#F8 augment foo (nameOffset:109) (firstTokenOffset:96) (offset:109)
element: <testLibrary>::@mixin::A::@method::foo
previousFragment: #F4
typeParameters
#F9 T (nameOffset:113) (firstTokenOffset:113) (offset:113)
element: #E0 T
previousFragment: #F6
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
superclassConstraints
Object
methods
foo
reference: <testLibrary>::@mixin::A::@method::foo
firstFragment: #F3
typeParameters
#E0 T
firstFragment: #F5
returnType: void
''');
}
test_method_typeParameters_121() async {
var library = await buildLibrary(r'''
mixin A {
void foo<T>(){}
}
augment mixin A {
augment void foo<T, U>(){}
}
augment mixin A {
augment void foo<T>(){}
}
''');
configuration.withConstructors = false;
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
methods
#F3 foo (nameOffset:17) (firstTokenOffset:12) (offset:17)
element: <testLibrary>::@mixin::A::@method::foo
nextFragment: #F4
typeParameters
#F5 T (nameOffset:21) (firstTokenOffset:21) (offset:21)
element: #E0 T
nextFragment: #F6
#F2 mixin A (nameOffset:44) (firstTokenOffset:30) (offset:44)
element: <testLibrary>::@mixin::A
previousFragment: #F1
nextFragment: #F7
methods
#F4 augment foo (nameOffset:63) (firstTokenOffset:50) (offset:63)
element: <testLibrary>::@mixin::A::@method::foo
previousFragment: #F3
nextFragment: #F8
typeParameters
#F6 T (nameOffset:67) (firstTokenOffset:67) (offset:67)
element: #E0 T
previousFragment: #F5
nextFragment: #F9
#F7 mixin A (nameOffset:93) (firstTokenOffset:79) (offset:93)
element: <testLibrary>::@mixin::A
previousFragment: #F2
methods
#F8 augment foo (nameOffset:112) (firstTokenOffset:99) (offset:112)
element: <testLibrary>::@mixin::A::@method::foo
previousFragment: #F4
typeParameters
#F9 T (nameOffset:116) (firstTokenOffset:116) (offset:116)
element: #E0 T
previousFragment: #F6
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
superclassConstraints
Object
methods
foo
reference: <testLibrary>::@mixin::A::@method::foo
firstFragment: #F3
typeParameters
#E0 T
firstFragment: #F5
returnType: void
''');
}
test_method_typeParameters_212() async {
var library = await buildLibrary(r'''
mixin A {
void foo<T, U>(){}
}
augment mixin A {
augment void foo<T>(){}
}
augment mixin A {
augment void foo<T, U>(){}
}
''');
configuration.withConstructors = false;
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
methods
#F3 foo (nameOffset:17) (firstTokenOffset:12) (offset:17)
element: <testLibrary>::@mixin::A::@method::foo
nextFragment: #F4
typeParameters
#F5 T (nameOffset:21) (firstTokenOffset:21) (offset:21)
element: #E0 T
nextFragment: #F6
#F7 U (nameOffset:24) (firstTokenOffset:24) (offset:24)
element: #E1 U
nextFragment: #F8
#F2 mixin A (nameOffset:47) (firstTokenOffset:33) (offset:47)
element: <testLibrary>::@mixin::A
previousFragment: #F1
nextFragment: #F9
methods
#F4 augment foo (nameOffset:66) (firstTokenOffset:53) (offset:66)
element: <testLibrary>::@mixin::A::@method::foo
previousFragment: #F3
nextFragment: #F10
typeParameters
#F6 T (nameOffset:70) (firstTokenOffset:70) (offset:70)
element: #E0 T
previousFragment: #F5
nextFragment: #F11
#F8 U (nameOffset:<null>) (firstTokenOffset:<null>) (offset:66)
element: #E1 U
previousFragment: #F7
nextFragment: #F12
#F9 mixin A (nameOffset:93) (firstTokenOffset:79) (offset:93)
element: <testLibrary>::@mixin::A
previousFragment: #F2
methods
#F10 augment foo (nameOffset:112) (firstTokenOffset:99) (offset:112)
element: <testLibrary>::@mixin::A::@method::foo
previousFragment: #F4
typeParameters
#F11 T (nameOffset:116) (firstTokenOffset:116) (offset:116)
element: #E0 T
previousFragment: #F6
#F12 U (nameOffset:119) (firstTokenOffset:119) (offset:119)
element: #E1 U
previousFragment: #F8
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
superclassConstraints
Object
methods
foo
reference: <testLibrary>::@mixin::A::@method::foo
firstFragment: #F3
typeParameters
#E0 T
firstFragment: #F5
#E1 U
firstFragment: #F7
returnType: void
''');
}
test_method_typeParameters_bounds_bounds_int_int() async {
var library = await buildLibrary(r'''
mixin A {
void foo<T extends int>() {}
}
augment mixin A {
augment void foo<T extends int>() {}
}
''');
configuration.withConstructors = false;
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
methods
#F3 foo (nameOffset:17) (firstTokenOffset:12) (offset:17)
element: <testLibrary>::@mixin::A::@method::foo
nextFragment: #F4
typeParameters
#F5 T (nameOffset:21) (firstTokenOffset:21) (offset:21)
element: #E0 T
nextFragment: #F6
#F2 mixin A (nameOffset:57) (firstTokenOffset:43) (offset:57)
element: <testLibrary>::@mixin::A
previousFragment: #F1
methods
#F4 augment foo (nameOffset:76) (firstTokenOffset:63) (offset:76)
element: <testLibrary>::@mixin::A::@method::foo
previousFragment: #F3
typeParameters
#F6 T (nameOffset:80) (firstTokenOffset:80) (offset:80)
element: #E0 T
previousFragment: #F5
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
superclassConstraints
Object
methods
foo
reference: <testLibrary>::@mixin::A::@method::foo
firstFragment: #F3
typeParameters
#E0 T
firstFragment: #F5
bound: int
returnType: void
''');
}
test_method_typeParameters_bounds_int_nothing() async {
var library = await buildLibrary(r'''
mixin A {
void foo<T extends int>() {}
}
augment mixin A {
augment void foo<T>() {}
}
''');
configuration.withConstructors = false;
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
methods
#F3 foo (nameOffset:17) (firstTokenOffset:12) (offset:17)
element: <testLibrary>::@mixin::A::@method::foo
nextFragment: #F4
typeParameters
#F5 T (nameOffset:21) (firstTokenOffset:21) (offset:21)
element: #E0 T
nextFragment: #F6
#F2 mixin A (nameOffset:57) (firstTokenOffset:43) (offset:57)
element: <testLibrary>::@mixin::A
previousFragment: #F1
methods
#F4 augment foo (nameOffset:76) (firstTokenOffset:63) (offset:76)
element: <testLibrary>::@mixin::A::@method::foo
previousFragment: #F3
typeParameters
#F6 T (nameOffset:80) (firstTokenOffset:80) (offset:80)
element: #E0 T
previousFragment: #F5
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
superclassConstraints
Object
methods
foo
reference: <testLibrary>::@mixin::A::@method::foo
firstFragment: #F3
typeParameters
#E0 T
firstFragment: #F5
bound: int
returnType: void
''');
}
test_method_typeParameters_bounds_int_string() async {
var library = await buildLibrary(r'''
mixin A {
void foo<T extends int>() {}
}
augment mixin A {
augment void foo<T extends String>() {}
}
''');
configuration.withConstructors = false;
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
methods
#F3 foo (nameOffset:17) (firstTokenOffset:12) (offset:17)
element: <testLibrary>::@mixin::A::@method::foo
nextFragment: #F4
typeParameters
#F5 T (nameOffset:21) (firstTokenOffset:21) (offset:21)
element: #E0 T
nextFragment: #F6
#F2 mixin A (nameOffset:57) (firstTokenOffset:43) (offset:57)
element: <testLibrary>::@mixin::A
previousFragment: #F1
methods
#F4 augment foo (nameOffset:76) (firstTokenOffset:63) (offset:76)
element: <testLibrary>::@mixin::A::@method::foo
previousFragment: #F3
typeParameters
#F6 T (nameOffset:80) (firstTokenOffset:80) (offset:80)
element: #E0 T
previousFragment: #F5
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
superclassConstraints
Object
methods
foo
reference: <testLibrary>::@mixin::A::@method::foo
firstFragment: #F3
typeParameters
#E0 T
firstFragment: #F5
bound: int
returnType: void
''');
}
test_method_typeParameters_bounds_nothing_int() async {
var library = await buildLibrary(r'''
mixin A {
void foo<T>() {}
}
augment mixin A {
augment void foo<T extends int>() {}
}
''');
configuration.withConstructors = false;
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
methods
#F3 foo (nameOffset:17) (firstTokenOffset:12) (offset:17)
element: <testLibrary>::@mixin::A::@method::foo
nextFragment: #F4
typeParameters
#F5 T (nameOffset:21) (firstTokenOffset:21) (offset:21)
element: #E0 T
nextFragment: #F6
#F2 mixin A (nameOffset:45) (firstTokenOffset:31) (offset:45)
element: <testLibrary>::@mixin::A
previousFragment: #F1
methods
#F4 augment foo (nameOffset:64) (firstTokenOffset:51) (offset:64)
element: <testLibrary>::@mixin::A::@method::foo
previousFragment: #F3
typeParameters
#F6 T (nameOffset:68) (firstTokenOffset:68) (offset:68)
element: #E0 T
previousFragment: #F5
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
superclassConstraints
Object
methods
foo
reference: <testLibrary>::@mixin::A::@method::foo
firstFragment: #F3
typeParameters
#E0 T
firstFragment: #F5
returnType: void
''');
}
test_method_typeParameters_differentNames() async {
var library = await buildLibrary(r'''
mixin A {
void foo<T, U>() {}
}
augment mixin A {
augment void foo<U, T>() {}
}
''');
configuration.withConstructors = false;
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
methods
#F3 foo (nameOffset:17) (firstTokenOffset:12) (offset:17)
element: <testLibrary>::@mixin::A::@method::foo
nextFragment: #F4
typeParameters
#F5 T (nameOffset:21) (firstTokenOffset:21) (offset:21)
element: #E0 T
nextFragment: #F6
#F7 U (nameOffset:24) (firstTokenOffset:24) (offset:24)
element: #E1 U
nextFragment: #F8
#F2 mixin A (nameOffset:49) (firstTokenOffset:35) (offset:49)
element: <testLibrary>::@mixin::A
previousFragment: #F1
methods
#F4 augment foo (nameOffset:68) (firstTokenOffset:55) (offset:68)
element: <testLibrary>::@mixin::A::@method::foo
previousFragment: #F3
typeParameters
#F6 U (nameOffset:72) (firstTokenOffset:72) (offset:72)
element: #E0 T
previousFragment: #F5
#F8 T (nameOffset:75) (firstTokenOffset:75) (offset:75)
element: #E1 U
previousFragment: #F7
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
superclassConstraints
Object
methods
foo
reference: <testLibrary>::@mixin::A::@method::foo
firstFragment: #F3
typeParameters
#E0 T
firstFragment: #F5
#E1 U
firstFragment: #F7
returnType: void
''');
}
test_modifiers_base() async {
var library = await buildLibrary(r'''
base mixin A {}
augment base mixin A {}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:11) (firstTokenOffset:0) (offset:11)
element: <testLibrary>::@mixin::A
nextFragment: #F2
#F2 mixin A (nameOffset:35) (firstTokenOffset:16) (offset:35)
element: <testLibrary>::@mixin::A
previousFragment: #F1
mixins
base mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
superclassConstraints
Object
''');
}
test_notAugmented_interfaces() async {
var library = await buildLibrary(r'''
mixin A implements I {}
class I {}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
classes
#F1 class I (nameOffset:30) (firstTokenOffset:24) (offset:30)
element: <testLibrary>::@class::I
constructors
#F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
element: <testLibrary>::@class::I::@constructor::new
typeName: I
mixins
#F3 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
classes
class I
reference: <testLibrary>::@class::I
firstFragment: #F1
constructors
synthetic new
reference: <testLibrary>::@class::I::@constructor::new
firstFragment: #F2
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F3
superclassConstraints
Object
interfaces
I
''');
}
test_notAugmented_superclassConstraints() async {
var library = await buildLibrary(r'''
mixin A on B {}
class B {}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
classes
#F1 class B (nameOffset:22) (firstTokenOffset:16) (offset:22)
element: <testLibrary>::@class::B
constructors
#F2 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
element: <testLibrary>::@class::B::@constructor::new
typeName: B
mixins
#F3 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
classes
class B
reference: <testLibrary>::@class::B
firstFragment: #F1
constructors
synthetic new
reference: <testLibrary>::@class::B::@constructor::new
firstFragment: #F2
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F3
superclassConstraints
B
''');
}
test_notSimplyBounded_self() async {
var library = await buildLibrary(r'''
mixin A<T extends A> {}
augment mixin A<T extends A> {}
''');
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
typeParameters
#F3 T (nameOffset:8) (firstTokenOffset:8) (offset:8)
element: #E0 T
nextFragment: #F4
#F2 mixin A (nameOffset:39) (firstTokenOffset:25) (offset:39)
element: <testLibrary>::@mixin::A
previousFragment: #F1
typeParameters
#F4 T (nameOffset:41) (firstTokenOffset:41) (offset:41)
element: #E0 T
previousFragment: #F3
mixins
notSimplyBounded mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
typeParameters
#E0 T
firstFragment: #F3
bound: A<dynamic>
superclassConstraints
Object
''');
}
test_typeParameters_111() async {
var library = await buildLibrary(r'''
mixin A<T> {}
augment mixin A<T> {}
augment mixin A<T> {}
''');
configuration.withConstructors = false;
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
typeParameters
#F3 T (nameOffset:8) (firstTokenOffset:8) (offset:8)
element: #E0 T
nextFragment: #F4
#F2 mixin A (nameOffset:28) (firstTokenOffset:14) (offset:28)
element: <testLibrary>::@mixin::A
previousFragment: #F1
nextFragment: #F5
typeParameters
#F4 T (nameOffset:30) (firstTokenOffset:30) (offset:30)
element: #E0 T
previousFragment: #F3
nextFragment: #F6
#F5 mixin A (nameOffset:50) (firstTokenOffset:36) (offset:50)
element: <testLibrary>::@mixin::A
previousFragment: #F2
typeParameters
#F6 T (nameOffset:52) (firstTokenOffset:52) (offset:52)
element: #E0 T
previousFragment: #F4
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
typeParameters
#E0 T
firstFragment: #F3
superclassConstraints
Object
''');
}
test_typeParameters_121() async {
var library = await buildLibrary(r'''
mixin A<T> {}
augment mixin A<T, U> {}
augment mixin A<T> {}
''');
configuration.withConstructors = false;
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
typeParameters
#F3 T (nameOffset:8) (firstTokenOffset:8) (offset:8)
element: #E0 T
nextFragment: #F4
#F2 mixin A (nameOffset:28) (firstTokenOffset:14) (offset:28)
element: <testLibrary>::@mixin::A
previousFragment: #F1
nextFragment: #F5
typeParameters
#F4 T (nameOffset:30) (firstTokenOffset:30) (offset:30)
element: #E0 T
previousFragment: #F3
nextFragment: #F6
#F5 mixin A (nameOffset:53) (firstTokenOffset:39) (offset:53)
element: <testLibrary>::@mixin::A
previousFragment: #F2
typeParameters
#F6 T (nameOffset:55) (firstTokenOffset:55) (offset:55)
element: #E0 T
previousFragment: #F4
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
typeParameters
#E0 T
firstFragment: #F3
superclassConstraints
Object
''');
}
test_typeParameters_212() async {
var library = await buildLibrary(r'''
mixin A<T, U> {}
augment mixin A<T> {}
augment mixin A<T, U> {}
''');
configuration.withConstructors = false;
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
typeParameters
#F3 T (nameOffset:8) (firstTokenOffset:8) (offset:8)
element: #E0 T
nextFragment: #F4
#F5 U (nameOffset:11) (firstTokenOffset:11) (offset:11)
element: #E1 U
nextFragment: #F6
#F2 mixin A (nameOffset:31) (firstTokenOffset:17) (offset:31)
element: <testLibrary>::@mixin::A
previousFragment: #F1
nextFragment: #F7
typeParameters
#F4 T (nameOffset:33) (firstTokenOffset:33) (offset:33)
element: #E0 T
previousFragment: #F3
nextFragment: #F8
#F6 U (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
element: #E1 U
previousFragment: #F5
nextFragment: #F9
#F7 mixin A (nameOffset:53) (firstTokenOffset:39) (offset:53)
element: <testLibrary>::@mixin::A
previousFragment: #F2
typeParameters
#F8 T (nameOffset:55) (firstTokenOffset:55) (offset:55)
element: #E0 T
previousFragment: #F4
#F9 U (nameOffset:58) (firstTokenOffset:58) (offset:58)
element: #E1 U
previousFragment: #F6
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
typeParameters
#E0 T
firstFragment: #F3
#E1 U
firstFragment: #F5
superclassConstraints
Object
''');
}
test_typeParameters_bounds_int_int() async {
var library = await buildLibrary(r'''
mixin A<T extends int> {}
augment mixin A<T extends int> {}
''');
configuration.withConstructors = false;
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
typeParameters
#F3 T (nameOffset:8) (firstTokenOffset:8) (offset:8)
element: #E0 T
nextFragment: #F4
#F2 mixin A (nameOffset:40) (firstTokenOffset:26) (offset:40)
element: <testLibrary>::@mixin::A
previousFragment: #F1
typeParameters
#F4 T (nameOffset:42) (firstTokenOffset:42) (offset:42)
element: #E0 T
previousFragment: #F3
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
typeParameters
#E0 T
firstFragment: #F3
bound: int
superclassConstraints
Object
''');
}
test_typeParameters_bounds_int_nothing() async {
var library = await buildLibrary(r'''
mixin A<T extends int> {}
augment mixin A<T> {}
''');
configuration.withConstructors = false;
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
typeParameters
#F3 T (nameOffset:8) (firstTokenOffset:8) (offset:8)
element: #E0 T
nextFragment: #F4
#F2 mixin A (nameOffset:40) (firstTokenOffset:26) (offset:40)
element: <testLibrary>::@mixin::A
previousFragment: #F1
typeParameters
#F4 T (nameOffset:42) (firstTokenOffset:42) (offset:42)
element: #E0 T
previousFragment: #F3
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
typeParameters
#E0 T
firstFragment: #F3
bound: int
superclassConstraints
Object
''');
}
test_typeParameters_bounds_int_string() async {
var library = await buildLibrary(r'''
mixin A<T extends int> {}
augment mixin A<T extends String> {}
''');
configuration.withConstructors = false;
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
typeParameters
#F3 T (nameOffset:8) (firstTokenOffset:8) (offset:8)
element: #E0 T
nextFragment: #F4
#F2 mixin A (nameOffset:40) (firstTokenOffset:26) (offset:40)
element: <testLibrary>::@mixin::A
previousFragment: #F1
typeParameters
#F4 T (nameOffset:42) (firstTokenOffset:42) (offset:42)
element: #E0 T
previousFragment: #F3
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
typeParameters
#E0 T
firstFragment: #F3
bound: int
superclassConstraints
Object
''');
}
test_typeParameters_bounds_nothing_int() async {
var library = await buildLibrary(r'''
mixin A<T> {}
augment mixin A<T extends int> {}
''');
configuration.withConstructors = false;
checkElementText(library, r'''
library
reference: <testLibrary>
fragments
#F0 <testLibraryFragment>
element: <testLibrary>
mixins
#F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
element: <testLibrary>::@mixin::A
nextFragment: #F2
typeParameters
#F3 T (nameOffset:8) (firstTokenOffset:8) (offset:8)
element: #E0 T
nextFragment: #F4
#F2 mixin A (nameOffset:28) (firstTokenOffset:14) (offset:28)
element: <testLibrary>::@mixin::A
previousFragment: #F1
typeParameters
#F4 T (nameOffset:30) (firstTokenOffset:30) (offset:30)
element: #E0 T
previousFragment: #F3
mixins
mixin A
reference: <testLibrary>::@mixin::A
firstFragment: #F1
typeParameters
#E0 T
firstFragment: #F3
superclassConstraints
Object
''');
}
}
@reflectiveTest
class MixinElementTest_augmentation_fromBytes
extends MixinElementTest_augmentation {
@override
bool get keepLinkingLibraries => false;
}
@reflectiveTest
class MixinElementTest_augmentation_keepLinking
extends MixinElementTest_augmentation {
@override
bool get keepLinkingLibraries => true;
}
@reflectiveTest
class MixinElementTest_fromBytes extends MixinElementTest {
@override
bool get keepLinkingLibraries => false;
}
@reflectiveTest
class MixinElementTest_keepLinking extends MixinElementTest {
@override
bool get keepLinkingLibraries => true;
}