Skip to content

Commit ce10ab5

Browse files
stereotype441Commit Queue
authored andcommitted
[analyzer] Additional tests of Fragment.offset.
These tests, which are based on https://dart-review.googlesource.com/c/sdk/+/413381, provide additional confidence in the correctness of the `Fragment.offset` implementation by ensuring that all tests using the `element_text.dart` infrastructure will exercise `Fragment.offset`. The offset is output to the text summary if it has an unexpected or unusual value. Note that in several cases, the test expectation contains the string `offset=-1`. These are all bugs; `Fragment.offset` was never intended to return `-1`. I will address these bugs in follow-up CLs. Change-Id: Iad4bddcd2951ee1146d046655fb53d87346e048b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/420940 Commit-Queue: Paul Berry <[email protected]> Reviewed-by: Konstantin Shcheglov <[email protected]>
1 parent f7dd89e commit ce10ab5

18 files changed

+167
-110
lines changed

pkg/analyzer/test/src/summary/element_text.dart

Lines changed: 60 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -806,6 +806,63 @@ class _Element2Writer extends _AbstractElementWriter {
806806
}
807807
}
808808

809+
void _writeFragmentBestOffset(Fragment f) {
810+
// Usually the name offset is available.
811+
// And then the offset must be the same.
812+
if (f.nameOffset2 case var nameOffset?) {
813+
expect(f.offset, nameOffset);
814+
return;
815+
}
816+
817+
switch (f) {
818+
case ConstructorFragment():
819+
if (f.isSynthetic) {
820+
expect(f.offset, f.enclosingFragment!.offset);
821+
return;
822+
} else {
823+
expect(f.offset, f.typeNameOffset);
824+
return;
825+
}
826+
case FieldFragment():
827+
if (f.isSynthetic) {
828+
// TODO(scheglov): Why not the offset of the getter/setter?
829+
expect(f.offset, f.enclosingFragment!.offset);
830+
return;
831+
}
832+
case FormalParameterFragment():
833+
if (f.enclosingFragment case SetterFragment setter) {
834+
if (setter.isSynthetic) {
835+
var variableOffset = setter.variable3!.offset;
836+
expect(f.offset, variableOffset);
837+
return;
838+
}
839+
}
840+
case GetterFragment():
841+
expect(f.isSynthetic, isTrue);
842+
if (f.isSynthetic) {
843+
expect(f.offset, f.variable3!.offset);
844+
return;
845+
}
846+
case SetterFragment():
847+
if (f.isSynthetic) {
848+
var variableOffset = f.variable3!.offset;
849+
expect(f.offset, variableOffset);
850+
expect(f.formalParameters.single.offset, variableOffset);
851+
return;
852+
}
853+
case LibraryFragment():
854+
if (f.element.firstFragment != f) {
855+
expect(f.offset, 0);
856+
return;
857+
} else if (f.offset == 0) {
858+
return;
859+
}
860+
}
861+
862+
// If a non-standard case, write the offset.
863+
_sink.write(' (offset=${f.offset})');
864+
}
865+
809866
void _writeFragmentCodeRange(Fragment f) {
810867
if (configuration.withCodeRanges) {
811868
if (f is ElementImpl) {
@@ -847,6 +904,8 @@ class _Element2Writer extends _AbstractElementWriter {
847904
if (f.nameOffset2 case var nameOffset?) {
848905
_sink.write(' @$nameOffset');
849906
}
907+
908+
_writeFragmentBestOffset(f);
850909
}
851910

852911
void _writeFragmentReference(String name, Fragment? f) {
@@ -1009,9 +1068,6 @@ class _Element2Writer extends _AbstractElementWriter {
10091068
_sink.writeIf(fragment.isDeferred, ' deferred');
10101069
_sink.write(' as ');
10111070
_writeFragmentName(fragment);
1012-
if (fragment.offset != fragment.nameOffset2) {
1013-
_sink.write(' (offset=${fragment.offset})');
1014-
}
10151071
}
10161072
}
10171073

@@ -1199,6 +1255,7 @@ class _Element2Writer extends _AbstractElementWriter {
11991255
var reference = f.reference!;
12001256
_sink.writeIndentedLine(() {
12011257
_elementPrinter.writeReference(reference);
1258+
_writeFragmentBestOffset(f);
12021259
});
12031260

12041261
_sink.withIndent(() {

pkg/analyzer/test/src/summary/elements/class_test.dart

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9241,7 +9241,7 @@ library
92419241
element: <testLibraryFragment>::@class::C::@field::a#element
92429242
getter2: <testLibraryFragment>::@class::C::@getter::a
92439243
setter2: <testLibraryFragment>::@class::C::@setter::a
9244-
<null-name>
9244+
<null-name> (offset=30)
92459245
reference: <testLibraryFragment>::@class::C::@field::0
92469246
element: <testLibraryFragment>::@class::C::@field::0#element
92479247
getter2: <testLibraryFragment>::@class::C::@getter::0
@@ -9561,7 +9561,7 @@ library
95619561
reference: <testLibrary>
95629562
name: lib
95639563
fragments
9564-
<testLibraryFragment>
9564+
<testLibraryFragment> (offset=8)
95659565
element: <testLibrary>
95669566
nextFragment: <testLibrary>::@fragment::package:test/a.dart
95679567
classes
@@ -12300,7 +12300,7 @@ library
1230012300
element: <testLibraryFragment>::@class::A::@constructor::new#element
1230112301
typeName: A
1230212302
methods
12303-
<null-name>
12303+
<null-name> (offset=12)
1230412304
reference: <testLibraryFragment>::@class::A::@method::0
1230512305
element: <testLibraryFragment>::@class::A::@method::0#element
1230612306
classes
@@ -13093,7 +13093,7 @@ library
1309313093
<testLibraryFragment>
1309413094
element: <testLibrary>
1309513095
classes
13096-
class <null-name>
13096+
class <null-name> (offset=6)
1309713097
reference: <testLibraryFragment>::@class::0
1309813098
element: <testLibrary>::@class::0
1309913099
constructors
@@ -17608,7 +17608,7 @@ library
1760817608
typeParameters
1760917609
T @8
1761017610
element: T@8
17611-
<null-name>
17611+
<null-name> (offset=10)
1761217612
element: null@null
1761317613
constructors
1761417614
synthetic new
@@ -18121,7 +18121,7 @@ library
1812118121
element: <testLibraryFragment>::@class::C2::@constructor::new#element
1812218122
typeName: C2
1812318123
formalParameters
18124-
i
18124+
i (offset=-1)
1812518125
element: <testLibraryFragment>::@class::C2::@constructor::new::@parameter::i#element
1812618126
class C1 @90
1812718127
reference: <testLibraryFragment>::@class::C1
@@ -18132,7 +18132,7 @@ library
1813218132
element: <testLibraryFragment>::@class::C1::@constructor::new#element
1813318133
typeName: C1
1813418134
formalParameters
18135-
i
18135+
i (offset=-1)
1813618136
element: <testLibraryFragment>::@class::C1::@constructor::new::@parameter::i#element
1813718137
classes
1813818138
class A
@@ -18287,31 +18287,31 @@ library
1828718287
element: <testLibraryFragment>::@class::C::@constructor::c1#element
1828818288
typeName: C
1828918289
formalParameters
18290-
a
18290+
a (offset=-1)
1829118291
element: <testLibraryFragment>::@class::C::@constructor::c1::@parameter::a#element
1829218292
synthetic c2
1829318293
reference: <testLibraryFragment>::@class::C::@constructor::c2
1829418294
element: <testLibraryFragment>::@class::C::@constructor::c2#element
1829518295
typeName: C
1829618296
formalParameters
18297-
a
18297+
a (offset=-1)
1829818298
element: <testLibraryFragment>::@class::C::@constructor::c2::@parameter::a#element
18299-
default b
18299+
default b (offset=-1)
1830018300
element: <testLibraryFragment>::@class::C::@constructor::c2::@parameter::b#element
18301-
default c
18301+
default c (offset=-1)
1830218302
element: <testLibraryFragment>::@class::C::@constructor::c2::@parameter::c#element
1830318303
initializer: expression_0
1830418304
synthetic c3
1830518305
reference: <testLibraryFragment>::@class::C::@constructor::c3
1830618306
element: <testLibraryFragment>::@class::C::@constructor::c3#element
1830718307
typeName: C
1830818308
formalParameters
18309-
a
18309+
a (offset=-1)
1831018310
element: <testLibraryFragment>::@class::C::@constructor::c3::@parameter::a#element
18311-
default b
18311+
default b (offset=-1)
1831218312
reference: <testLibraryFragment>::@class::C::@constructor::c3::@parameter::b
1831318313
element: <testLibraryFragment>::@class::C::@constructor::c3::@parameter::b#element
18314-
default c
18314+
default c (offset=-1)
1831518315
reference: <testLibraryFragment>::@class::C::@constructor::c3::@parameter::c
1831618316
element: <testLibraryFragment>::@class::C::@constructor::c3::@parameter::c#element
1831718317
initializer: expression_1
@@ -18516,9 +18516,9 @@ library
1851618516
element: <testLibraryFragment>::@class::B::@constructor::new#element
1851718517
typeName: B
1851818518
formalParameters
18519-
x
18519+
x (offset=-1)
1852018520
element: <testLibraryFragment>::@class::B::@constructor::new::@parameter::x#element
18521-
y
18521+
y (offset=-1)
1852218522
element: <testLibraryFragment>::@class::B::@constructor::new::@parameter::y#element
1852318523
mixins
1852418524
mixin M @49
@@ -19573,14 +19573,14 @@ library
1957319573
element: <testLibraryFragment>::@class::MixinApp::@constructor::requiredArg#element
1957419574
typeName: MixinApp
1957519575
formalParameters
19576-
x
19576+
x (offset=-1)
1957719577
element: <testLibraryFragment>::@class::MixinApp::@constructor::requiredArg::@parameter::x#element
1957819578
synthetic positionalArg
1957919579
reference: <testLibraryFragment>::@class::MixinApp::@constructor::positionalArg
1958019580
element: <testLibraryFragment>::@class::MixinApp::@constructor::positionalArg#element
1958119581
typeName: MixinApp
1958219582
formalParameters
19583-
default x
19583+
default x (offset=-1)
1958419584
element: <testLibraryFragment>::@class::MixinApp::@constructor::positionalArg::@parameter::x#element
1958519585
initializer: expression_0
1958619586
BooleanLiteral
@@ -19591,7 +19591,7 @@ library
1959119591
element: <testLibraryFragment>::@class::MixinApp::@constructor::positionalArg2#element
1959219592
typeName: MixinApp
1959319593
formalParameters
19594-
default x
19594+
default x (offset=-1)
1959519595
element: <testLibraryFragment>::@class::MixinApp::@constructor::positionalArg2::@parameter::x#element
1959619596
initializer: expression_1
1959719597
BooleanLiteral
@@ -19602,7 +19602,7 @@ library
1960219602
element: <testLibraryFragment>::@class::MixinApp::@constructor::namedArg#element
1960319603
typeName: MixinApp
1960419604
formalParameters
19605-
default x
19605+
default x (offset=-1)
1960619606
reference: <testLibraryFragment>::@class::MixinApp::@constructor::namedArg::@parameter::x
1960719607
element: <testLibraryFragment>::@class::MixinApp::@constructor::namedArg::@parameter::x#element
1960819608
initializer: expression_2
@@ -19614,7 +19614,7 @@ library
1961419614
element: <testLibraryFragment>::@class::MixinApp::@constructor::namedArg2#element
1961519615
typeName: MixinApp
1961619616
formalParameters
19617-
default x
19617+
default x (offset=-1)
1961819618
reference: <testLibraryFragment>::@class::MixinApp::@constructor::namedArg2::@parameter::x
1961919619
element: <testLibraryFragment>::@class::MixinApp::@constructor::namedArg2::@parameter::x#element
1962019620
initializer: expression_3
@@ -19840,9 +19840,9 @@ library
1984019840
element: <testLibraryFragment>::@class::MixinApp::@constructor::ctor#element
1984119841
typeName: MixinApp
1984219842
formalParameters
19843-
t
19843+
t (offset=-1)
1984419844
element: <testLibraryFragment>::@class::MixinApp::@constructor::ctor::@parameter::t#element
19845-
l
19845+
l (offset=-1)
1984619846
element: <testLibraryFragment>::@class::MixinApp::@constructor::ctor::@parameter::l#element
1984719847
classes
1984819848
class Base
@@ -19956,9 +19956,9 @@ library
1995619956
element: <testLibraryFragment>::@class::MixinApp::@constructor::ctor#element
1995719957
typeName: MixinApp
1995819958
formalParameters
19959-
t
19959+
t (offset=-1)
1996019960
element: <testLibraryFragment>::@class::MixinApp::@constructor::ctor::@parameter::t#element
19961-
l
19961+
l (offset=-1)
1996219962
element: <testLibraryFragment>::@class::MixinApp::@constructor::ctor::@parameter::l#element
1996319963
classes
1996419964
class Base

pkg/analyzer/test/src/summary/elements/duplicate_declaration_test.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1375,7 +1375,7 @@ library
13751375
<testLibraryFragment>
13761376
element: <testLibrary>
13771377
topLevelVariables
1378-
synthetic foo
1378+
synthetic foo (offset=-1)
13791379
reference: <testLibraryFragment>::@topLevelVariable::foo
13801380
element: <testLibrary>::@topLevelVariable::foo
13811381
getter2: <testLibraryFragment>::@getter::foo::@def::1
@@ -1415,7 +1415,7 @@ library
14151415
<testLibraryFragment>
14161416
element: <testLibrary>
14171417
topLevelVariables
1418-
synthetic foo
1418+
synthetic foo (offset=-1)
14191419
reference: <testLibraryFragment>::@topLevelVariable::foo
14201420
element: <testLibrary>::@topLevelVariable::foo
14211421
setter2: <testLibraryFragment>::@setter::foo::@def::1

pkg/analyzer/test/src/summary/elements/enum_test.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3087,7 +3087,7 @@ library
30873087
<testLibraryFragment>
30883088
element: <testLibrary>
30893089
enums
3090-
enum <null-name>
3090+
enum <null-name> (offset=5)
30913091
reference: <testLibraryFragment>::@enum::0
30923092
element: <testLibrary>::@enum::0
30933093
fields
@@ -4612,7 +4612,7 @@ library
46124612
rightParenthesis: ) @0
46134613
staticType: E
46144614
getter2: <testLibraryFragment>::@enum::E::@getter::v
4615-
hasInitializer <null-name>
4615+
hasInitializer <null-name> (offset=10)
46164616
reference: <testLibraryFragment>::@enum::E::@field::0
46174617
element: <testLibraryFragment>::@enum::E::@field::0#element
46184618
initializer: expression_1

pkg/analyzer/test/src/summary/elements/extension_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -611,7 +611,7 @@ library
611611
<testLibraryFragment>
612612
element: <testLibrary>
613613
extensions
614-
extension <null-name>
614+
extension <null-name> (offset=0)
615615
reference: <testLibraryFragment>::@extension::0
616616
element: <testLibrary>::@extension::0
617617
extensions

pkg/analyzer/test/src/summary/elements/extension_type_test.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1608,7 +1608,7 @@ library
16081608
<testLibraryFragment>
16091609
element: <testLibrary>
16101610
extensionTypes
1611-
extension type <null-name>
1611+
extension type <null-name> (offset=15)
16121612
reference: <testLibraryFragment>::@extensionType::0
16131613
element: <testLibrary>::@extensionType::0
16141614
fields
@@ -1656,7 +1656,7 @@ library
16561656
reference: <testLibraryFragment>::@extensionType::A
16571657
element: <testLibrary>::@extensionType::A
16581658
fields
1659-
<null-name>
1659+
<null-name> (offset=17)
16601660
reference: <testLibraryFragment>::@extensionType::A::@field::<empty>
16611661
element: <testLibraryFragment>::@extensionType::A::@field::<empty>#element
16621662
getter2: <testLibraryFragment>::@extensionType::A::@getter::<empty>
@@ -1669,7 +1669,7 @@ library
16691669
typeName: A
16701670
typeNameOffset: 15
16711671
formalParameters
1672-
this.<null-name>
1672+
this.<null-name> (offset=17)
16731673
element: <testLibraryFragment>::@extensionType::A::@constructor::new::@parameter::<empty>#element
16741674
getters
16751675
synthetic get <null-name>

pkg/analyzer/test/src/summary/elements/library_test.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ library
3030
name: test
3131
documentationComment: /**\n * aaa\n * bbb\n */
3232
fragments
33-
<testLibraryFragment>
33+
<testLibraryFragment> (offset=30)
3434
element: <testLibrary>
3535
''');
3636
}
@@ -71,7 +71,7 @@ library
7171
name: test
7272
documentationComment: /// aaa\n/// bbb
7373
fragments
74-
<testLibraryFragment>
74+
<testLibraryFragment> (offset=24)
7575
element: <testLibrary>
7676
''');
7777
}
@@ -86,7 +86,7 @@ library
8686
reference: <testLibrary>
8787
name: foo.bar
8888
fragments
89-
<testLibraryFragment>
89+
<testLibraryFragment> (offset=8)
9090
element: <testLibrary>
9191
''');
9292
}
@@ -115,7 +115,7 @@ library
115115
reference: <testLibrary>
116116
name: foo.bar
117117
fragments
118-
<testLibraryFragment>
118+
<testLibraryFragment> (offset=8)
119119
element: <testLibrary>
120120
''');
121121
}

pkg/analyzer/test/src/summary/elements/local_declarations_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ library
131131
<testLibraryFragment>
132132
element: <testLibrary>
133133
topLevelVariables
134-
synthetic g
134+
synthetic g (offset=-1)
135135
reference: <testLibraryFragment>::@topLevelVariable::g
136136
element: <testLibrary>::@topLevelVariable::g
137137
getter2: <testLibraryFragment>::@getter::g

0 commit comments

Comments
 (0)