Skip to content

Commit 1a6ae2e

Browse files
scheglovCommit Queue
authored and
Commit Queue
committed
Elements. Tests for missing name for top-level and class method/getter/setter.
Change-Id: Id94e73d5dbac817ee59e278fc980a792d612e6a2 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/390628 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Phil Quitslund <[email protected]>
1 parent 8f40f77 commit 1a6ae2e

File tree

6 files changed

+295
-9
lines changed

6 files changed

+295
-9
lines changed

pkg/analyzer/lib/src/dart/analysis/driver.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ import 'package:meta/meta.dart';
9696
// TODO(scheglov): Clean up the list of implicitly analyzed files.
9797
class AnalysisDriver {
9898
/// The version of data format, should be incremented on every format change.
99-
static const int DATA_VERSION = 399;
99+
static const int DATA_VERSION = 400;
100100

101101
/// The number of exception contexts allowed to write. Once this field is
102102
/// zero, we stop writing any new exception contexts in this process.

pkg/analyzer/lib/src/summary2/bundle_reader.dart

+2-1
Original file line numberDiff line numberDiff line change
@@ -1373,7 +1373,8 @@ class LibraryReader {
13731373
var resolutionOffset = _baseResolutionOffset + _reader.readUInt30();
13741374
var reference = _readReference();
13751375
var fragmentName = _readFragmentName();
1376-
var name = reference.elementName;
1376+
// TODO(scheglov): we do this only because MethodElement2 uses this name.
1377+
var name = _reader.readStringReference();
13771378
var element = MethodElementImpl(name, -1);
13781379
element.name2 = fragmentName;
13791380
var linkedData = MethodElementLinkedData(

pkg/analyzer/lib/src/summary2/bundle_writer.dart

+1
Original file line numberDiff line numberDiff line change
@@ -524,6 +524,7 @@ class BundleWriter {
524524
_sink.writeUInt30(_resolutionSink.offset);
525525
_writeReference(element);
526526
_writeFragmentName(element.name2);
527+
_sink._writeStringReference(element.name);
527528
MethodElementFlags.write(_sink, element);
528529

529530
_resolutionSink._writeAnnotationList(element.metadata);

pkg/analyzer/lib/src/summary2/element_builder.dart

+19-7
Original file line numberDiff line numberDiff line change
@@ -1021,7 +1021,8 @@ class ElementBuilder extends ThrowingAstVisitor<void> {
10211021
reference = _enclosingContext.addGetter(name, element);
10221022
executableElement = element;
10231023

1024-
_buildSyntheticVariable(name: name, accessorElement: element);
1024+
var refName = fragmentName?.name ?? '${_nextUnnamedId++}';
1025+
_buildSyntheticVariable(name: refName, accessorElement: element);
10251026
} else if (node.isSetter) {
10261027
var element = PropertyAccessorElementImpl(name, nameOffset);
10271028
element.name2 = fragmentName;
@@ -1030,16 +1031,20 @@ class ElementBuilder extends ThrowingAstVisitor<void> {
10301031
element.isSetter = true;
10311032
element.isStatic = node.isStatic;
10321033

1033-
reference = _enclosingContext.addSetter(name, element);
1034+
var refName = fragmentName?.name ?? '${_nextUnnamedId++}';
1035+
reference = _enclosingContext.addSetter(refName, element);
10341036
executableElement = element;
10351037

10361038
_buildSyntheticVariable(name: name, accessorElement: element);
10371039
} else {
1038-
if (name == '-') {
1040+
var isUnaryMinus = false;
1041+
if (fragmentName?.name == '-') {
10391042
var parameters = node.parameters;
1040-
if (parameters != null && parameters.parameters.isEmpty) {
1041-
name = 'unary-';
1042-
}
1043+
isUnaryMinus = parameters != null && parameters.parameters.isEmpty;
1044+
}
1045+
1046+
if (isUnaryMinus) {
1047+
name = 'unary-';
10431048
}
10441049

10451050
var element = MethodElementImpl(name, nameOffset);
@@ -1048,7 +1053,14 @@ class ElementBuilder extends ThrowingAstVisitor<void> {
10481053
element.isAugmentation = node.augmentKeyword != null;
10491054
element.isStatic = node.isStatic;
10501055

1051-
reference = _enclosingContext.addMethod(name, element);
1056+
String refName;
1057+
if (isUnaryMinus) {
1058+
refName = 'unary-';
1059+
} else {
1060+
refName = fragmentName?.name ?? '${_nextUnnamedId++}';
1061+
}
1062+
1063+
reference = _enclosingContext.addMethod(refName, element);
10521064
executableElement = element;
10531065
}
10541066
executableElement.hasImplicitReturnType = node.returnType == null;

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

+177
Original file line numberDiff line numberDiff line change
@@ -16829,6 +16829,62 @@ library
1682916829
''');
1683016830
}
1683116831

16832+
test_class_getter_missingName() async {
16833+
var library = await buildLibrary('''
16834+
class A {
16835+
get () => 0;
16836+
}
16837+
''');
16838+
checkElementText(library, r'''
16839+
library
16840+
reference: <testLibrary>
16841+
definingUnit: <testLibraryFragment>
16842+
units
16843+
<testLibraryFragment>
16844+
enclosingElement3: <null>
16845+
classes
16846+
class A @6
16847+
reference: <testLibraryFragment>::@class::A
16848+
enclosingElement3: <testLibraryFragment>
16849+
constructors
16850+
synthetic @-1
16851+
reference: <testLibraryFragment>::@class::A::@constructor::new
16852+
enclosingElement3: <testLibraryFragment>::@class::A
16853+
methods
16854+
get @12
16855+
reference: <testLibraryFragment>::@class::A::@method::get
16856+
enclosingElement3: <testLibraryFragment>::@class::A
16857+
returnType: dynamic
16858+
----------------------------------------
16859+
library
16860+
reference: <testLibrary>
16861+
fragments
16862+
<testLibraryFragment>
16863+
element: <testLibrary>
16864+
classes
16865+
class A @6
16866+
reference: <testLibraryFragment>::@class::A
16867+
element: <testLibraryFragment>::@class::A#element
16868+
constructors
16869+
synthetic <null-name>
16870+
reference: <testLibraryFragment>::@class::A::@constructor::new
16871+
element: <testLibraryFragment>::@class::A::@constructor::new#element
16872+
methods
16873+
get @12
16874+
reference: <testLibraryFragment>::@class::A::@method::get
16875+
element: <testLibraryFragment>::@class::A::@method::get#element
16876+
classes
16877+
class A
16878+
firstFragment: <testLibraryFragment>::@class::A
16879+
constructors
16880+
synthetic new
16881+
firstFragment: <testLibraryFragment>::@class::A::@constructor::new
16882+
methods
16883+
get
16884+
firstFragment: <testLibraryFragment>::@class::A::@method::get
16885+
''');
16886+
}
16887+
1683216888
test_class_getter_native() async {
1683316889
var library = await buildLibrary('''
1683416890
class C {
@@ -18209,6 +18265,62 @@ library
1820918265
''');
1821018266
}
1821118267

18268+
test_class_method_missingName() async {
18269+
var library = await buildLibrary('''
18270+
class A {
18271+
() {}
18272+
}
18273+
''');
18274+
checkElementText(library, r'''
18275+
library
18276+
reference: <testLibrary>
18277+
definingUnit: <testLibraryFragment>
18278+
units
18279+
<testLibraryFragment>
18280+
enclosingElement3: <null>
18281+
classes
18282+
class A @6
18283+
reference: <testLibraryFragment>::@class::A
18284+
enclosingElement3: <testLibraryFragment>
18285+
constructors
18286+
synthetic @-1
18287+
reference: <testLibraryFragment>::@class::A::@constructor::new
18288+
enclosingElement3: <testLibraryFragment>::@class::A
18289+
methods
18290+
@12
18291+
reference: <testLibraryFragment>::@class::A::@method::0
18292+
enclosingElement3: <testLibraryFragment>::@class::A
18293+
returnType: dynamic
18294+
----------------------------------------
18295+
library
18296+
reference: <testLibrary>
18297+
fragments
18298+
<testLibraryFragment>
18299+
element: <testLibrary>
18300+
classes
18301+
class A @6
18302+
reference: <testLibraryFragment>::@class::A
18303+
element: <testLibraryFragment>::@class::A#element
18304+
constructors
18305+
synthetic <null-name>
18306+
reference: <testLibraryFragment>::@class::A::@constructor::new
18307+
element: <testLibraryFragment>::@class::A::@constructor::new#element
18308+
methods
18309+
<null-name>
18310+
reference: <testLibraryFragment>::@class::A::@method::0
18311+
element: <testLibraryFragment>::@class::A::@method::0#element
18312+
classes
18313+
class A
18314+
firstFragment: <testLibraryFragment>::@class::A
18315+
constructors
18316+
synthetic new
18317+
firstFragment: <testLibraryFragment>::@class::A::@constructor::new
18318+
methods
18319+
18320+
firstFragment: <testLibraryFragment>::@class::A::@method::0
18321+
''');
18322+
}
18323+
1821218324
test_class_method_namedAsSupertype() async {
1821318325
var library = await buildLibrary(r'''
1821418326
class A {}
@@ -23122,6 +23234,71 @@ library
2312223234
''');
2312323235
}
2312423236

23237+
test_class_setter_missingName() async {
23238+
var library = await buildLibrary('''
23239+
class A {
23240+
set (int _) {}
23241+
}
23242+
''');
23243+
checkElementText(library, r'''
23244+
library
23245+
reference: <testLibrary>
23246+
definingUnit: <testLibraryFragment>
23247+
units
23248+
<testLibraryFragment>
23249+
enclosingElement3: <null>
23250+
classes
23251+
class A @6
23252+
reference: <testLibraryFragment>::@class::A
23253+
enclosingElement3: <testLibraryFragment>
23254+
constructors
23255+
synthetic @-1
23256+
reference: <testLibraryFragment>::@class::A::@constructor::new
23257+
enclosingElement3: <testLibraryFragment>::@class::A
23258+
methods
23259+
set @12
23260+
reference: <testLibraryFragment>::@class::A::@method::set
23261+
enclosingElement3: <testLibraryFragment>::@class::A
23262+
parameters
23263+
requiredPositional _ @21
23264+
type: int
23265+
returnType: dynamic
23266+
----------------------------------------
23267+
library
23268+
reference: <testLibrary>
23269+
fragments
23270+
<testLibraryFragment>
23271+
element: <testLibrary>
23272+
classes
23273+
class A @6
23274+
reference: <testLibraryFragment>::@class::A
23275+
element: <testLibraryFragment>::@class::A#element
23276+
constructors
23277+
synthetic <null-name>
23278+
reference: <testLibraryFragment>::@class::A::@constructor::new
23279+
element: <testLibraryFragment>::@class::A::@constructor::new#element
23280+
methods
23281+
set @12
23282+
reference: <testLibraryFragment>::@class::A::@method::set
23283+
element: <testLibraryFragment>::@class::A::@method::set#element
23284+
formalParameters
23285+
_ @21
23286+
element: <testLibraryFragment>::@class::A::@method::set::@parameter::_#element
23287+
classes
23288+
class A
23289+
firstFragment: <testLibraryFragment>::@class::A
23290+
constructors
23291+
synthetic new
23292+
firstFragment: <testLibraryFragment>::@class::A::@constructor::new
23293+
methods
23294+
set
23295+
firstFragment: <testLibraryFragment>::@class::A::@method::set
23296+
formalParameters
23297+
requiredPositional _
23298+
type: int
23299+
''');
23300+
}
23301+
2312523302
test_class_setter_native() async {
2312623303
var library = await buildLibrary('''
2312723304
class C {

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

+95
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,26 @@ f() => 0;
322322
expect(f.hasImplicitReturnType, isTrue);
323323
}
324324

325+
test_function_missingName() async {
326+
var library = await buildLibrary('''
327+
() {}
328+
''');
329+
checkElementText(library, r'''
330+
library
331+
reference: <testLibrary>
332+
definingUnit: <testLibraryFragment>
333+
units
334+
<testLibraryFragment>
335+
enclosingElement3: <null>
336+
----------------------------------------
337+
library
338+
reference: <testLibrary>
339+
fragments
340+
<testLibraryFragment>
341+
element: <testLibrary>
342+
''');
343+
}
344+
325345
test_function_parameter_const() async {
326346
var library = await buildLibrary('''
327347
void f(const x) {}
@@ -1338,6 +1358,39 @@ library
13381358
''');
13391359
}
13401360

1361+
test_getter_missingName() async {
1362+
var library = await buildLibrary('''
1363+
get () => 0;
1364+
''');
1365+
checkElementText(library, r'''
1366+
library
1367+
reference: <testLibrary>
1368+
definingUnit: <testLibraryFragment>
1369+
units
1370+
<testLibraryFragment>
1371+
enclosingElement3: <null>
1372+
functions
1373+
get @0
1374+
reference: <testLibraryFragment>::@function::get
1375+
enclosingElement3: <testLibraryFragment>
1376+
returnType: dynamic
1377+
----------------------------------------
1378+
library
1379+
reference: <testLibrary>
1380+
fragments
1381+
<testLibraryFragment>
1382+
element: <testLibrary>
1383+
functions
1384+
get @0
1385+
reference: <testLibraryFragment>::@function::get
1386+
element: <testLibraryFragment>::@function::get#element
1387+
functions
1388+
get
1389+
firstFragment: <testLibraryFragment>::@function::get
1390+
returnType: dynamic
1391+
''');
1392+
}
1393+
13411394
test_main_class() async {
13421395
var library = await buildLibrary('class main {}');
13431396
checkElementText(library, r'''
@@ -1747,6 +1800,48 @@ library
17471800
fragments
17481801
<testLibraryFragment>
17491802
element: <testLibrary>
1803+
''');
1804+
}
1805+
1806+
test_setter_missingName() async {
1807+
var library = await buildLibrary('''
1808+
set (int _) {}
1809+
''');
1810+
checkElementText(library, r'''
1811+
library
1812+
reference: <testLibrary>
1813+
definingUnit: <testLibraryFragment>
1814+
units
1815+
<testLibraryFragment>
1816+
enclosingElement3: <null>
1817+
functions
1818+
set @0
1819+
reference: <testLibraryFragment>::@function::set
1820+
enclosingElement3: <testLibraryFragment>
1821+
parameters
1822+
requiredPositional _ @9
1823+
type: int
1824+
returnType: dynamic
1825+
----------------------------------------
1826+
library
1827+
reference: <testLibrary>
1828+
fragments
1829+
<testLibraryFragment>
1830+
element: <testLibrary>
1831+
functions
1832+
set @0
1833+
reference: <testLibraryFragment>::@function::set
1834+
element: <testLibraryFragment>::@function::set#element
1835+
formalParameters
1836+
_ @9
1837+
element: <testLibraryFragment>::@function::set::@parameter::_#element
1838+
functions
1839+
set
1840+
firstFragment: <testLibraryFragment>::@function::set
1841+
formalParameters
1842+
requiredPositional _
1843+
type: int
1844+
returnType: dynamic
17501845
''');
17511846
}
17521847
}

0 commit comments

Comments
 (0)