Skip to content

Commit 63aa736

Browse files
scheglovCommit Queue
authored andcommitted
Elements. Add reference to MethodElementImpl, write it.
Change-Id: Iedfa3cb01749e527012e24a72539d591a3a0afbf Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/431940 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Paul Berry <[email protected]> Reviewed-by: Samuel Rawlins <[email protected]>
1 parent 55a2089 commit 63aa736

File tree

12 files changed

+114
-23
lines changed

12 files changed

+114
-23
lines changed

pkg/analysis_server/test/services/refactoring/agnostic/change_method_signature_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,7 @@ class A {
373373
''');
374374

375375
_assertSelectionState(selectionState, r'''
376-
element: self::@fragment::self::@class::A::@method::test
376+
element: self::@class::A::@method::test
377377
formalParameters
378378
id: 0
379379
kind: requiredPositional

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ testFineAfterLibraryAnalyzerHook;
110110
// TODO(scheglov): Clean up the list of implicitly analyzed files.
111111
class AnalysisDriver {
112112
/// The version of data format, should be incremented on every format change.
113-
static const int DATA_VERSION = 462;
113+
static const int DATA_VERSION = 463;
114114

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

pkg/analyzer/lib/src/dart/element/element.dart

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7527,13 +7527,23 @@ class MethodElementImpl2 extends ExecutableElementImpl2
75277527
FragmentedElementMixin<MethodFragmentImpl>,
75287528
_HasSinceSdkVersionMixin
75297529
implements MethodElement2OrMember {
7530+
@override
7531+
final Reference reference;
7532+
75307533
@override
75317534
final String? name3;
75327535

75337536
@override
75347537
final MethodFragmentImpl firstFragment;
75357538

7536-
MethodElementImpl2(this.name3, this.firstFragment);
7539+
MethodElementImpl2({
7540+
required this.name3,
7541+
required this.reference,
7542+
required this.firstFragment,
7543+
}) {
7544+
reference.element2 = this;
7545+
firstFragment.element = this;
7546+
}
75377547

75387548
@override
75397549
MethodElementImpl2 get baseElement => this;
@@ -7599,7 +7609,7 @@ abstract class MethodElementOrMember implements ExecutableElementOrMember {
75997609
class MethodFragmentImpl extends ExecutableFragmentImpl
76007610
implements MethodElementOrMember, MethodFragment {
76017611
@override
7602-
late final MethodElementImpl2 element = MethodElementImpl2(name, this);
7612+
late final MethodElementImpl2 element;
76037613

76047614
@override
76057615
String? name2;

pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1156,12 +1156,35 @@ class InheritanceManager3 {
11561156
}
11571157

11581158
if (executable is MethodElementOrMember) {
1159-
var result = MethodFragmentImpl(name: executable.name, nameOffset: -1);
1159+
var fragmentName = executable.name;
1160+
var fragmentReference = class_.reference!
1161+
.getChild('@method')
1162+
.getChild(fragmentName);
1163+
1164+
if (fragmentReference.element case MethodFragmentImpl result) {
1165+
return result;
1166+
}
1167+
1168+
var result = MethodFragmentImpl(name: fragmentName, nameOffset: -1);
1169+
result.reference = fragmentReference;
1170+
fragmentReference.element = result;
11601171
result.enclosingElement3 = class_;
11611172
result.isSynthetic = true;
11621173
result.parameters = transformedParameters;
11631174
result.returnType = executable.returnType;
11641175
result.typeParameters = executable.typeParameters;
1176+
1177+
var elementName = executable.asElement2.name3!;
1178+
var elementReference = class_.element.reference!
1179+
.getChild('@method')
1180+
.getChild(elementName);
1181+
assert(elementReference.element2 == null);
1182+
MethodElementImpl2(
1183+
name3: elementName,
1184+
reference: elementReference,
1185+
firstFragment: result,
1186+
);
1187+
11651188
return result;
11661189
}
11671190

@@ -1216,9 +1239,20 @@ class InheritanceManager3 {
12161239
}
12171240

12181241
if (first is MethodElementOrMember) {
1219-
var firstMethod = first;
1220-
var fragmentName = first.asElement2.firstFragment.name2;
1221-
var result = MethodFragmentImpl(name: firstMethod.name, nameOffset: -1);
1242+
var firstElement = first.asElement2;
1243+
var fragmentName = firstElement.firstFragment.name2!;
1244+
1245+
var fragmentReference = targetClass.reference!
1246+
.getChild('@method')
1247+
.getChild(fragmentName);
1248+
1249+
if (fragmentReference.element case MethodFragmentImpl result) {
1250+
return result;
1251+
}
1252+
1253+
var result = MethodFragmentImpl(name: first.name, nameOffset: -1);
1254+
result.reference = fragmentReference;
1255+
fragmentReference.element = result;
12221256
result.enclosingElement3 = targetClass;
12231257
result.name2 = fragmentName;
12241258
result.typeParameters = resultType.typeFormals;
@@ -1228,6 +1262,18 @@ class InheritanceManager3 {
12281262
resultType.parameters
12291263
.map((e) => e.firstFragment as FormalParameterFragmentImpl)
12301264
.toList();
1265+
1266+
var elementName = first.asElement2.name3!;
1267+
var elementReference = targetClass.element.reference!
1268+
.getChild('@method')
1269+
.getChild(elementName);
1270+
assert(elementReference.element2 == null);
1271+
MethodElementImpl2(
1272+
name3: elementName,
1273+
reference: elementReference,
1274+
firstFragment: result,
1275+
);
1276+
12311277
return result;
12321278
} else {
12331279
var firstAccessor = first as PropertyAccessorElementOrMember;

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1270,6 +1270,7 @@ class LibraryReader {
12701270
return _reader.readTypedList(() {
12711271
var resolutionOffset = _baseResolutionOffset + _reader.readUInt30();
12721272
var reference = _readReference();
1273+
var reference2 = _readReference();
12731274
var fragmentName = _readFragmentName();
12741275
// TODO(scheglov): we do this only because MethodElement2 uses this name.
12751276
var name = _reader.readStringReference();
@@ -1287,6 +1288,13 @@ class LibraryReader {
12871288
fragment.typeParameters = _readTypeParameters();
12881289
fragment.parameters = _readParameters();
12891290
fragment.typeInferenceError = _readTopLevelInferenceError();
1291+
1292+
MethodElementImpl2(
1293+
name3: name,
1294+
reference: reference2,
1295+
firstFragment: fragment,
1296+
);
1297+
12901298
return fragment;
12911299
});
12921300
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,7 @@ class BundleWriter {
424424
void _writeMethodElement(MethodFragmentImpl fragment) {
425425
_sink.writeUInt30(_resolutionSink.offset);
426426
_writeReference(fragment);
427+
_writeReference2(fragment.element.reference);
427428
_writeFragmentName(fragment);
428429
_sink._writeStringReference(fragment.name);
429430
MethodElementFlags.write(_sink, fragment);
@@ -721,7 +722,6 @@ class ResolutionSink extends _SummaryDataWriter {
721722
case FieldElementImpl2():
722723
case FormalParameterElementImpl():
723724
case GetterElementImpl():
724-
case MethodElementImpl2():
725725
case SetterElementImpl():
726726
case TypeParameterElementImpl2():
727727
// TODO(scheglov): eventually stop using fragments here.

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1263,6 +1263,17 @@ class ElementBuilder extends ThrowingAstVisitor<void> {
12631263

12641264
reference = _enclosingContext.addMethod(refName, fragment);
12651265
executableFragment = fragment;
1266+
1267+
var containerBuilder = _enclosingContext.instanceElementBuilder!;
1268+
var containerElement = containerBuilder.element;
1269+
var containerRef = containerElement.reference!.getChild('@method');
1270+
var elementReference = containerRef.addChild(refName);
1271+
1272+
MethodElementImpl2(
1273+
name3: name,
1274+
reference: elementReference,
1275+
firstFragment: fragment,
1276+
);
12661277
}
12671278
executableFragment.hasImplicitReturnType = node.returnType == null;
12681279
executableFragment.invokesSuperSelf = node.invokesSuperSelf;

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -214,11 +214,12 @@ class LinkedElementFactory {
214214
}
215215

216216
var parentRef = reference.parentNotContainer;
217-
var parentElement = elementOfReference(parentRef);
217+
var parentElement = elementOfReference3(parentRef);
218218

219219
// Only classes delay creating children.
220-
if (parentElement is ClassFragmentImpl) {
221-
parentElement.linkedData?.readMembers(parentElement);
220+
if (parentElement is ClassElementImpl2) {
221+
var firstFragment = parentElement.firstFragment;
222+
firstFragment.linkedData?.readMembers(firstFragment);
222223
}
223224

224225
var element = reference.element2;

pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1093,6 +1093,11 @@ class _MockSdkElementsBuilder {
10931093
.toList()
10941094
..returnType = returnType
10951095
..typeParameters = typeFormals;
1096+
MethodElementImpl2(
1097+
name3: name,
1098+
reference: Reference.root(),
1099+
firstFragment: fragment,
1100+
);
10961101
return fragment;
10971102
}
10981103

pkg/analyzer/test/generated/elements_types_mixin.dart

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -445,11 +445,18 @@ mixin ElementsTypesMixin {
445445
List<TypeParameterElementImpl2> typeParameters = const [],
446446
List<FormalParameterElementImpl> formalParameters = const [],
447447
}) {
448-
return MethodFragmentImpl(name: name, nameOffset: 0)
449-
..isStatic = isStatic
450-
..parameters = formalParameters.map((e) => e.asElement).toList()
451-
..returnType = returnType
452-
..typeParameters = typeParameters.map((e) => e.asElement).toList();
448+
var fragment =
449+
MethodFragmentImpl(name: name, nameOffset: 0)
450+
..isStatic = isStatic
451+
..parameters = formalParameters.map((e) => e.asElement).toList()
452+
..returnType = returnType
453+
..typeParameters = typeParameters.map((e) => e.asElement).toList();
454+
MethodElementImpl2(
455+
name3: name,
456+
reference: Reference.root(),
457+
firstFragment: fragment,
458+
);
459+
return fragment;
453460
}
454461

455462
MixinFragmentImpl mixin_({

0 commit comments

Comments
 (0)