Skip to content

Commit a10ce29

Browse files
scheglovCommit Queue
authored andcommitted
Elements. Add reference to ConstructorElementImpl2, write it.
Change-Id: I40ff802e9c78b2d74c19769da8339a947d23d7f7 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/432540 Reviewed-by: Paul Berry <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]>
1 parent 5e15e6f commit a10ce29

File tree

8 files changed

+137
-64
lines changed

8 files changed

+137
-64
lines changed

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

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ class A {
178178
''');
179179

180180
_assertSelectionState(selectionState, r'''
181-
element: self::@fragment::self::@class::A::@constructor::new
181+
element: self::@class::A::@constructor::new
182182
formalParameters
183183
id: 0
184184
kind: requiredPositional
@@ -196,7 +196,7 @@ class A {
196196
''');
197197

198198
_assertSelectionState(selectionState, r'''
199-
element: self::@fragment::self::@class::A::@constructor::new
199+
element: self::@class::A::@constructor::new
200200
formalParameters
201201
id: 0
202202
kind: requiredPositional
@@ -213,7 +213,7 @@ class A {
213213
''');
214214

215215
_assertSelectionState(selectionState, r'''
216-
element: self::@fragment::self::@class::A::@constructor::named
216+
element: self::@class::A::@constructor::named
217217
formalParameters
218218
id: 0
219219
kind: requiredPositional
@@ -230,7 +230,7 @@ class A {
230230
''');
231231

232232
_assertSelectionState(selectionState, r'''
233-
element: self::@fragment::self::@class::A::@constructor::named
233+
element: self::@class::A::@constructor::named
234234
formalParameters
235235
id: 0
236236
kind: requiredPositional
@@ -247,7 +247,7 @@ class A {
247247
''');
248248

249249
_assertSelectionState(selectionState, r'''
250-
element: self::@fragment::self::@class::A::@constructor::named
250+
element: self::@class::A::@constructor::named
251251
formalParameters
252252
id: 0
253253
kind: requiredPositional
@@ -269,7 +269,7 @@ class B extends A {
269269
''');
270270

271271
_assertSelectionState(selectionState, r'''
272-
element: self::@fragment::self::@class::B::@constructor::new
272+
element: self::@class::B::@constructor::new
273273
formalParameters
274274
id: 0
275275
kind: optionalNamed
@@ -291,7 +291,7 @@ class B extends A {
291291
''');
292292

293293
_assertSelectionState(selectionState, r'''
294-
element: self::@fragment::self::@class::B::@constructor::new
294+
element: self::@class::B::@constructor::new
295295
formalParameters
296296
id: 0
297297
kind: optionalPositional
@@ -317,7 +317,7 @@ class B extends A {
317317
''');
318318

319319
_assertSelectionState(selectionState, r'''
320-
element: self::@fragment::self::@class::B::@constructor::new
320+
element: self::@class::B::@constructor::new
321321
formalParameters
322322
id: 0
323323
kind: requiredNamed
@@ -339,7 +339,7 @@ class B extends A {
339339
''');
340340

341341
_assertSelectionState(selectionState, r'''
342-
element: self::@fragment::self::@class::B::@constructor::new
342+
element: self::@class::B::@constructor::new
343343
formalParameters
344344
id: 0
345345
kind: requiredPositional
@@ -356,7 +356,7 @@ class A {
356356
''');
357357

358358
_assertSelectionState(selectionState, r'''
359-
element: self::@fragment::self::@class::A::@constructor::new
359+
element: self::@class::A::@constructor::new
360360
formalParameters
361361
id: 0
362362
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 = 469;
113+
static const int DATA_VERSION = 470;
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: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -628,23 +628,23 @@ class ClassFragmentImpl extends ClassOrMixinFragmentImpl
628628
_constructors = constructorsToForward
629629
.map((superclassConstructor) {
630630
var name = superclassConstructor.name2;
631-
var implicitConstructor = ConstructorFragmentImpl(
631+
var implicitConstructorFragment = ConstructorFragmentImpl(
632632
name2: name,
633633
nameOffset: -1,
634634
);
635-
implicitConstructor.isSynthetic = true;
636-
implicitConstructor.typeName = name2;
635+
implicitConstructorFragment.isSynthetic = true;
636+
implicitConstructorFragment.typeName = name2;
637637

638638
var containerRef = reference!.getChild('@constructor');
639639
var referenceName = name.ifNotEmptyOrElse('new');
640640
var implicitReference = containerRef.getChild(referenceName);
641-
implicitConstructor.reference = implicitReference;
642-
implicitReference.element = implicitConstructor;
641+
implicitConstructorFragment.reference = implicitReference;
642+
implicitReference.element = implicitConstructorFragment;
643643

644644
var hasMixinWithInstanceVariables = mixins.any(
645645
typeHasInstanceVariables,
646646
);
647-
implicitConstructor.isConst =
647+
implicitConstructorFragment.isConst =
648648
superclassConstructor.isConst && !hasMixinWithInstanceVariables;
649649
var superParameters = superclassConstructor.parameters;
650650
int count = superParameters.length;
@@ -696,11 +696,12 @@ class ClassFragmentImpl extends ClassOrMixinFragmentImpl
696696
..setPseudoExpressionStaticType(implicitParameter.type),
697697
);
698698
}
699-
implicitConstructor.parameters = implicitParameters.toFixedList();
699+
implicitConstructorFragment.parameters =
700+
implicitParameters.toFixedList();
700701
}
701-
implicitConstructor.enclosingElement3 = this;
702+
implicitConstructorFragment.enclosingElement3 = this;
702703
// TODO(scheglov): Why do we manually map parameters types above?
703-
implicitConstructor.superConstructor = ConstructorMember.from(
704+
implicitConstructorFragment.superConstructor = ConstructorMember.from(
704705
superclassConstructor,
705706
superType,
706707
);
@@ -727,9 +728,17 @@ class ClassFragmentImpl extends ClassOrMixinFragmentImpl
727728
);
728729
AstNodeImpl.linkNodeTokens(superInvocation);
729730
superInvocation.element = superclassConstructor.asElement2;
730-
implicitConstructor.constantInitializers = [superInvocation];
731+
implicitConstructorFragment.constantInitializers = [superInvocation];
732+
733+
ConstructorElementImpl2(
734+
name3: implicitConstructorFragment.name2,
735+
reference: element.reference
736+
.getChild('@constructor')
737+
.getChild(name),
738+
firstFragment: implicitConstructorFragment,
739+
);
731740

732-
return implicitConstructor;
741+
return implicitConstructorFragment;
733742
})
734743
.toList(growable: false);
735744
}
@@ -814,13 +823,23 @@ class ConstructorElementImpl2 extends ExecutableElementImpl2
814823
ConstructorElementMixin2,
815824
_HasSinceSdkVersionMixin
816825
implements ConstructorElement {
826+
@override
827+
final Reference reference;
828+
817829
@override
818830
final String? name3;
819831

820832
@override
821833
final ConstructorFragmentImpl firstFragment;
822834

823-
ConstructorElementImpl2(this.name3, this.firstFragment);
835+
ConstructorElementImpl2({
836+
required this.name3,
837+
required this.reference,
838+
required this.firstFragment,
839+
}) {
840+
reference.element2 = this;
841+
firstFragment.element = this;
842+
}
824843

825844
@override
826845
ConstructorElementImpl2 get baseElement => this;
@@ -992,10 +1011,7 @@ mixin ConstructorElementMixin2
9921011
class ConstructorFragmentImpl extends ExecutableFragmentImpl
9931012
with ConstructorElementMixin
9941013
implements ConstructorFragment {
995-
late final ConstructorElementImpl2 element = ConstructorElementImpl2(
996-
name2,
997-
this,
998-
);
1014+
late final ConstructorElementImpl2 element;
9991015

10001016
/// The super-constructor which this constructor is invoking, or `null` if
10011017
/// this constructor is not generative, or is redirecting, or the

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -758,6 +758,7 @@ class LibraryReader {
758758
return _reader.readTypedList(() {
759759
var resolutionOffset = _baseResolutionOffset + _reader.readUInt30();
760760
var reference = _readReference();
761+
var reference2 = _readReference();
761762
var typeName = _reader.readOptionalStringReference();
762763
var fragmentName = _reader.readStringReference();
763764
var element = ConstructorFragmentImpl(
@@ -774,6 +775,13 @@ class LibraryReader {
774775
element.setLinkedData(reference, linkedData);
775776
ConstructorElementFlags.read(_reader, element);
776777
element.parameters = _readParameters();
778+
779+
ConstructorElementImpl2(
780+
name3: element.name2,
781+
reference: reference2,
782+
firstFragment: element,
783+
);
784+
777785
return element;
778786
});
779787
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ class BundleWriter {
160160
void _writeConstructorElement(ConstructorFragmentImpl element) {
161161
_sink.writeUInt30(_resolutionSink.offset);
162162
_writeReference(element);
163+
_writeReference2(element.element.reference);
163164
_sink._writeOptionalStringReference(element.typeName);
164165
_sink._writeStringReference(element.name2);
165166
ConstructorElementFlags.write(_sink, element);
@@ -712,7 +713,6 @@ class ResolutionSink extends _SummaryDataWriter {
712713
);
713714
_writeTypeList(typeArguments);
714715
// TODO(scheglov): give reference to each element below
715-
case ConstructorElementImpl2():
716716
case FieldElementImpl2():
717717
case FormalParameterElementImpl():
718718
case GetterElementImpl():

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

Lines changed: 45 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -270,34 +270,46 @@ class ElementBuilder extends ThrowingAstVisitor<void> {
270270
fragmentName = 'new';
271271
}
272272

273-
var element = ConstructorFragmentImpl(
273+
var fragment = ConstructorFragmentImpl(
274274
name2: fragmentName,
275275
nameOffset: nameOffset,
276276
);
277-
element.isAugmentation = node.augmentKeyword != null;
278-
element.isConst = node.constKeyword != null;
279-
element.isExternal = node.externalKeyword != null;
280-
element.isFactory = node.factoryKeyword != null;
281-
element.metadata = _buildMetadata(node.metadata);
282-
element.typeName = node.returnType.name;
283-
element.typeNameOffset = node.returnType.offset;
284-
element.periodOffset = node.period?.offset;
285-
element.nameEnd = nameNode.end;
286-
element.nameOffset2 = fragmentNameOffset;
287-
_setCodeRange(element, node);
288-
_setDocumentation(element, node);
289-
290-
if (element.isConst || element.isFactory) {
291-
element.constantInitializers = node.initializers;
277+
fragment.isAugmentation = node.augmentKeyword != null;
278+
fragment.isConst = node.constKeyword != null;
279+
fragment.isExternal = node.externalKeyword != null;
280+
fragment.isFactory = node.factoryKeyword != null;
281+
fragment.metadata = _buildMetadata(node.metadata);
282+
fragment.typeName = node.returnType.name;
283+
fragment.typeNameOffset = node.returnType.offset;
284+
fragment.periodOffset = node.period?.offset;
285+
fragment.nameEnd = nameNode.end;
286+
fragment.nameOffset2 = fragmentNameOffset;
287+
_setCodeRange(fragment, node);
288+
_setDocumentation(fragment, node);
289+
290+
if (fragment.isConst || fragment.isFactory) {
291+
fragment.constantInitializers = node.initializers;
292292
}
293293

294-
node.declaredFragment = element;
295-
_linker.elementNodes[element] = node;
294+
node.declaredFragment = fragment;
295+
_linker.elementNodes[fragment] = node;
296+
297+
var reference = _enclosingContext.addConstructor(fragment);
298+
299+
var containerBuilder = _enclosingContext.instanceElementBuilder!;
300+
var containerElement = containerBuilder.element;
301+
var containerRef = containerElement.reference!.getChild('@constructor');
302+
var elementReference = containerRef.addChild(fragment.name2);
303+
304+
ConstructorElementImpl2(
305+
name3: fragment.name2,
306+
reference: elementReference,
307+
firstFragment: fragment,
308+
);
296309

297-
var reference = _enclosingContext.addConstructor(element);
298310
_buildExecutableElementChildren(
299311
reference: reference,
300-
fragment: element,
312+
fragment: fragment,
301313
formalParameters: node.parameters,
302314
);
303315
}
@@ -1858,6 +1870,19 @@ class ElementBuilder extends ThrowingAstVisitor<void> {
18581870
representation.constructorFragment = constructorFragment;
18591871
_linker.elementNodes[constructorFragment] = representation;
18601872
_enclosingContext.addConstructor(constructorFragment);
1873+
1874+
var containerBuilder = _enclosingContext.instanceElementBuilder!;
1875+
var containerElement = containerBuilder.element;
1876+
var containerRef = containerElement.reference!.getChild('@method');
1877+
var elementReference = containerRef.addChild(
1878+
extensionFragment.name2 ?? 'new',
1879+
);
1880+
1881+
ConstructorElementImpl2(
1882+
name3: constructorFragment.name2,
1883+
reference: elementReference,
1884+
firstFragment: constructorFragment,
1885+
);
18611886
}
18621887

18631888
representation.fieldType.accept(this);

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

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -143,15 +143,23 @@ class LibraryBuilder {
143143
if (classFragment.isMixinApplication) continue;
144144
if (classFragment.constructors.isNotEmpty) continue;
145145

146-
var constructor = ConstructorFragmentImpl(name2: 'new', nameOffset: -1)
146+
var fragment = ConstructorFragmentImpl(name2: 'new', nameOffset: -1)
147147
..isSynthetic = true;
148148
var containerRef = classFragment.reference!.getChild('@constructor');
149149
var reference = containerRef.getChild('new');
150-
reference.element = constructor;
151-
constructor.reference = reference;
152-
constructor.typeName = classFragment.name2;
150+
reference.element = fragment;
151+
fragment.reference = reference;
152+
fragment.typeName = classFragment.name2;
153+
154+
ConstructorElementImpl2(
155+
name3: fragment.name2,
156+
reference: classFragment.element.reference
157+
.getChild('@constructor')
158+
.addChild('new'),
159+
firstFragment: fragment,
160+
);
153161

154-
classFragment.constructors = [constructor].toFixedList();
162+
classFragment.constructors = [fragment].toFixedList();
155163
}
156164
}
157165

@@ -208,18 +216,26 @@ class LibraryBuilder {
208216
if (enumFragment is! EnumFragmentImpl) continue;
209217
if (hasConstructor(enumFragment)) continue;
210218

211-
var constructor =
219+
var fragment =
212220
ConstructorFragmentImpl(name2: 'new', nameOffset: -1)
213221
..isConst = true
214222
..isSynthetic = true;
215223
var containerRef = enumFragment.reference!.getChild('@constructor');
216224
var reference = containerRef.getChild('new');
217-
reference.element = constructor;
218-
constructor.reference = reference;
219-
constructor.typeName = enumFragment.name2;
225+
reference.element = fragment;
226+
fragment.reference = reference;
227+
fragment.typeName = enumFragment.name2;
228+
229+
ConstructorElementImpl2(
230+
name3: fragment.name2,
231+
reference: enumFragment.element.reference
232+
.getChild('@constructor')
233+
.addChild('new'),
234+
firstFragment: fragment,
235+
);
220236

221237
enumFragment.constructors =
222-
[...enumFragment.constructors, constructor].toFixedList();
238+
[...enumFragment.constructors, fragment].toFixedList();
223239
}
224240
}
225241

@@ -302,7 +318,8 @@ class LibraryBuilder {
302318
for (var constructor in interfaceFragment.constructors) {
303319
for (var parameter in constructor.parameters) {
304320
if (parameter is FieldFormalParameterFragmentImpl) {
305-
parameter.field = element.getField(parameter.name2 ?? '')?.asElement;
321+
parameter.field =
322+
element.getField(parameter.name2 ?? '')?.asElement;
306323
}
307324
}
308325
}

0 commit comments

Comments
 (0)