Skip to content

Commit 39d0d20

Browse files
committed
Migrate Constructor element model
1 parent bee0276 commit 39d0d20

11 files changed

+187
-96
lines changed

lib/src/generator/templates.runtime_renderers.dart

Lines changed: 80 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3505,6 +3505,34 @@ class _Renderer_Constructor extends RendererBase<Constructor> {
35053505
);
35063506
},
35073507
),
3508+
'element2': Property(
3509+
getValue: (CT_ c) => c.element2,
3510+
renderVariable:
3511+
(CT_ c, Property<CT_> self, List<String> remainingNames) =>
3512+
self.renderSimpleVariable(
3513+
c,
3514+
remainingNames,
3515+
'ConstructorElement2',
3516+
),
3517+
3518+
isNullValue: (CT_ c) => false,
3519+
3520+
renderValue: (
3521+
CT_ c,
3522+
RendererBase<CT_> r,
3523+
List<MustachioNode> ast,
3524+
StringSink sink,
3525+
) {
3526+
renderSimple(
3527+
c.element2,
3528+
ast,
3529+
r.template,
3530+
sink,
3531+
parent: r,
3532+
getters: _invisibleGetters['ConstructorElement2']!,
3533+
);
3534+
},
3535+
),
35083536
'enclosingElement': Property(
35093537
getValue: (CT_ c) => c.enclosingElement,
35103538
renderVariable: (
@@ -3543,6 +3571,38 @@ class _Renderer_Constructor extends RendererBase<Constructor> {
35433571
);
35443572
},
35453573
),
3574+
'fileName': Property(
3575+
getValue: (CT_ c) => c.fileName,
3576+
renderVariable: (
3577+
CT_ c,
3578+
Property<CT_> self,
3579+
List<String> remainingNames,
3580+
) {
3581+
if (remainingNames.isEmpty) {
3582+
return self.getValue(c).toString();
3583+
}
3584+
var name = remainingNames.first;
3585+
var nextProperty = _Renderer_String.propertyMap().getValue(
3586+
name,
3587+
);
3588+
return nextProperty.renderVariable(
3589+
self.getValue(c) as String,
3590+
nextProperty,
3591+
[...remainingNames.skip(1)],
3592+
);
3593+
},
3594+
3595+
isNullValue: (CT_ c) => false,
3596+
3597+
renderValue: (
3598+
CT_ c,
3599+
RendererBase<CT_> r,
3600+
List<MustachioNode> ast,
3601+
StringSink sink,
3602+
) {
3603+
_render_String(c.fileName, ast, r.template, sink, parent: r);
3604+
},
3605+
),
35463606
'fullKind': Property(
35473607
getValue: (CT_ c) => c.fullKind,
35483608
renderVariable: (
@@ -14411,7 +14471,7 @@ class _Renderer_LibraryContainer extends RendererBase<LibraryContainer> {
1441114471
}
1441214472
}
1441314473

14414-
String renderLibrary(LibraryTemplateData context, Template template) {
14474+
String renderLibraryRedirect(LibraryTemplateData context, Template template) {
1441514475
var buffer = StringBuffer();
1441614476
_render_LibraryTemplateData(context, template.ast, template, buffer);
1441714477
return buffer.toString();
@@ -14657,7 +14717,7 @@ class _Renderer_LibraryTemplateData extends RendererBase<LibraryTemplateData> {
1465714717
}
1465814718
}
1465914719

14660-
String renderLibraryRedirect(LibraryTemplateData context, Template template) {
14720+
String renderLibrary(LibraryTemplateData context, Template template) {
1466114721
var buffer = StringBuffer();
1466214722
_render_LibraryTemplateData(context, template.ast, template, buffer);
1466314723
return buffer.toString();
@@ -20710,13 +20770,13 @@ class _Renderer_PackageTemplateData extends RendererBase<PackageTemplateData> {
2071020770
}
2071120771
}
2071220772

20713-
String renderSearchPage(PackageTemplateData context, Template template) {
20773+
String renderIndex(PackageTemplateData context, Template template) {
2071420774
var buffer = StringBuffer();
2071520775
_render_PackageTemplateData(context, template.ast, template, buffer);
2071620776
return buffer.toString();
2071720777
}
2071820778

20719-
String renderIndex(PackageTemplateData context, Template template) {
20779+
String renderSearchPage(PackageTemplateData context, Template template) {
2072020780
var buffer = StringBuffer();
2072120781
_render_PackageTemplateData(context, template.ast, template, buffer);
2072220782
return buffer.toString();
@@ -26243,6 +26303,22 @@ const _invisibleGetters = {
2624326303
'runtimeType',
2624426304
'superConstructor',
2624526305
},
26306+
'ConstructorElement2': {
26307+
'baseElement',
26308+
'enclosingElement2',
26309+
'firstFragment',
26310+
'fragments',
26311+
'hashCode',
26312+
'isConst',
26313+
'isDefaultConstructor',
26314+
'isFactory',
26315+
'isGenerative',
26316+
'name3',
26317+
'redirectedConstructor2',
26318+
'returnType',
26319+
'runtimeType',
26320+
'superConstructor2',
26321+
},
2624626322
'ContainerModifier': {
2624726323
'displayName',
2624826324
'hashCode',

lib/src/model/constructor.dart

Lines changed: 41 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
// ignore_for_file: analyzer_use_new_elements
6-
75
import 'package:analyzer/dart/element/element.dart';
6+
import 'package:analyzer/dart/element/element2.dart';
87
import 'package:analyzer/source/line_info.dart';
98
import 'package:dartdoc/src/element_type.dart';
109
import 'package:dartdoc/src/model/comment_referable.dart';
@@ -14,13 +13,19 @@ import 'package:dartdoc/src/model_utils.dart';
1413

1514
class Constructor extends ModelElement with ContainerMember, TypeParameters {
1615
@override
17-
final ConstructorElement element;
16+
// ignore: analyzer_use_new_elements
17+
ConstructorElement get element =>
18+
// ignore: analyzer_use_new_elements
19+
element2.firstFragment as ConstructorElement;
20+
21+
@override
22+
final ConstructorElement2 element2;
1823

19-
Constructor(this.element, super.library, super.packageGraph);
24+
Constructor(this.element2, super.library, super.packageGraph);
2025

2126
@override
2227
CharacterLocation? get characterLocation {
23-
if (element.isSynthetic) {
28+
if (element2.isSynthetic) {
2429
// Make warnings for a synthetic constructor refer to somewhere reasonable
2530
// since a synthetic constructor has no definition independent of the
2631
// parent class.
@@ -33,11 +38,11 @@ class Constructor extends ModelElement with ContainerMember, TypeParameters {
3338
bool get isPublic {
3439
if (!super.isPublic) return false;
3540
if (element2.hasPrivateName) return false;
36-
var class_ = element.enclosingElement3;
41+
var class_ = element2.enclosingElement2;
3742
// Enums cannot be explicitly constructed or extended.
38-
if (class_ is EnumElement) return false;
39-
if (class_ is ClassElement) {
40-
if (element.isFactory) return true;
43+
if (class_ is EnumElement2) return false;
44+
if (class_ is ClassElement2) {
45+
if (element2.isFactory) return true;
4146
if (class_.isSealed ||
4247
(class_.isAbstract && class_.isFinal) ||
4348
(class_.isAbstract && class_.isInterface)) {
@@ -56,7 +61,12 @@ class Constructor extends ModelElement with ContainerMember, TypeParameters {
5661

5762
@override
5863
Container get enclosingElement =>
59-
getModelFor(element.enclosingElement3, library) as Container;
64+
getModelFor2(element2.enclosingElement2, library) as Container;
65+
66+
@override
67+
String get fileName =>
68+
// TODO(srawlins): It would be great to use `new.html` as the file name.
69+
isUnnamedConstructor ? '${enclosingElement.name}.html' : '$name.html';
6070

6171
@override
6272
String get aboveSidebarPath => enclosingElement.sidebarPath;
@@ -71,47 +81,40 @@ class Constructor extends ModelElement with ContainerMember, TypeParameters {
7181
}
7282

7383
@override
74-
String get fullyQualifiedName {
75-
if (isUnnamedConstructor) return super.fullyQualifiedName;
76-
return '${library.name}.$name';
77-
}
84+
String get fullyQualifiedName => '${library.name}.$name';
7885

7986
@override
80-
bool get isConst => element.isConst;
87+
bool get isConst => element2.isConst;
8188

82-
bool get isUnnamedConstructor => name == enclosingElement.name;
89+
bool get isUnnamedConstructor => element2.name3 == 'new';
8390

84-
bool get isFactory => element.isFactory;
91+
bool get isFactory => element2.isFactory;
8592

8693
@override
8794
Kind get kind => Kind.constructor;
8895

89-
late final Callable modelType = getTypeFor(element.type, library) as Callable;
96+
late final Callable modelType =
97+
getTypeFor(element2.type, library) as Callable;
9098

9199
@override
92-
String get name {
93-
// TODO(jcollins-g): After the old lookup code is retired, rationalize
94-
// [name] around the conventions used in referenceChildren and replace
95-
// code there and elsewhere with simple references to the name.
96-
var constructorName = element.name;
97-
if (constructorName.isEmpty) {
98-
return enclosingElement.name;
99-
}
100-
return '${enclosingElement.name}.$constructorName';
101-
}
100+
String get name =>
101+
// TODO(jcollins-g): After the old lookup code is retired, rationalize
102+
// [name] around the conventions used in referenceChildren and replace
103+
// code there and elsewhere with simple references to the name.
104+
'${enclosingElement.name}.${element2.name3}';
102105

103106
@override
104107
String get nameWithGenerics {
105-
var constructorName = element.name;
106-
if (constructorName.isEmpty) {
108+
var constructorName = element2.name3!;
109+
if (constructorName == 'new') {
107110
return '${enclosingElement.name}$genericParameters';
108111
}
109112
return '${enclosingElement.name}$genericParameters.$constructorName';
110113
}
111114

112115
String? get shortName {
113116
if (name.contains('.')) {
114-
return name.substring(element.enclosingElement3.name.length + 1);
117+
return name.substring(element2.enclosingElement2.name3!.length + 1);
115118
} else {
116119
return name;
117120
}
@@ -120,17 +123,17 @@ class Constructor extends ModelElement with ContainerMember, TypeParameters {
120123
@override
121124
late final Map<String, CommentReferable> referenceChildren = () {
122125
// Find the element that [parameter] is _really_ referring to.
123-
Element? dereferenceParameter(ParameterElement? parameter) =>
126+
Element2? dereferenceParameter(FormalParameterElement? parameter) =>
124127
switch (parameter) {
125-
FieldFormalParameterElement() => parameter.field,
126-
SuperFormalParameterElement() =>
127-
dereferenceParameter(parameter.superConstructorParameter),
128+
FieldFormalParameterElement2() => parameter.field2,
129+
SuperFormalParameterElement2() =>
130+
dereferenceParameter(parameter.superConstructorParameter2),
128131
_ => parameter
129132
};
130133

131134
var parameterElements = parameters.map((parameter) {
132-
var element = dereferenceParameter(parameter.element);
133-
return element == null ? parameter : getModelForElement(element);
135+
var element = dereferenceParameter(parameter.element2);
136+
return element == null ? parameter : getModelForElement2(element);
134137
});
135138
return {
136139
for (var element in parameterElements) element.referenceName: element,
@@ -140,5 +143,5 @@ class Constructor extends ModelElement with ContainerMember, TypeParameters {
140143

141144
@override
142145
String get referenceName =>
143-
isUnnamedConstructor ? enclosingElement.name : element.name;
146+
isUnnamedConstructor ? enclosingElement.name : element2.name3!;
144147
}

lib/src/model/getter_setter_combo.dart

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,6 @@ mixin GetterSetterCombo on ModelElement {
8383
String linkifyConstantValue(String original) {
8484
if (_constantInitializer is! InstanceCreationExpression) return original;
8585

86-
var constructorName = _constantInitializer.constructorName.toString();
8786
var element = _constantInitializer.constructorName.element;
8887
if (element == null) return original;
8988

@@ -93,8 +92,11 @@ mixin GetterSetterCombo on ModelElement {
9392

9493
// TODO(jcollins-g): this logic really should be integrated into
9594
// `Constructor`, but that's not trivial because of `linkedName`'s usage.
96-
if (enclosingElement.name == target.name) {
97-
return original.replaceAll(constructorName, target.linkedName);
95+
if (target.isUnnamedConstructor) {
96+
var parts = target.linkedNameParts;
97+
// We don't want the `.new` representation of an unnamed constructor.
98+
var linkedName = '${parts.tag}${enclosingElement.name}${parts.endTag}';
99+
return original.replaceAll(enclosingElement.name, linkedName);
98100
}
99101
return original.replaceAll('${enclosingElement.name}.${target.name}',
100102
'${enclosingElement.linkedName}.${target.linkedName}');

lib/src/model/inheriting_container.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ mixin Constructable implements InheritingContainer {
2828

2929
@override
3030
late final List<Constructor> publicConstructorsSorted =
31-
constructors.wherePublic.toList(growable: false)..sort();
31+
constructors.wherePublic.toList(growable: false)..sort(byName);
3232

3333
@override
3434
@visibleForOverriding

lib/src/model/model_element.dart

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ abstract class ModelElement
314314
ExtensionTypeElement() => ExtensionType(e, library, packageGraph),
315315
FunctionElement() => ModelFunction(
316316
e.asElement2 as TopLevelFunctionElement, library, packageGraph),
317-
ConstructorElement() => Constructor(e, library, packageGraph),
317+
ConstructorElement() => Constructor(e.asElement2, library, packageGraph),
318318
GenericFunctionTypeElement() => ModelFunctionTypedef(
319319
e.asElement2 as FunctionTypedElement2, library, packageGraph),
320320
TypeAliasElement(aliasedType: FunctionType()) =>
@@ -370,7 +370,8 @@ abstract class ModelElement
370370
if (e.enclosingElement3 is ExtensionElement ||
371371
e.enclosingElement3 is InterfaceElement) {
372372
if (enclosingContainer == null || enclosingContainer is Extension) {
373-
return ContainerAccessor(e.asElement2, library, packageGraph, enclosingContainer);
373+
return ContainerAccessor(
374+
e.asElement2, library, packageGraph, enclosingContainer);
374375
}
375376

376377
return ContainerAccessor.inherited(
@@ -688,7 +689,14 @@ abstract class ModelElement
688689
@override
689690
Library get library => _library;
690691

692+
/// The name of this element, wrapped in an HTML link (an `<a>` tag) if [href]
693+
/// is non-`null`.
691694
late final String linkedName = () {
695+
var parts = linkedNameParts;
696+
return '${parts.tag}${parts.text}${parts.endTag}';
697+
}();
698+
699+
({String tag, String text, String endTag}) get linkedNameParts {
692700
// If `name` is empty, we probably have the wrong Element association or
693701
// there's an analyzer issue.
694702
assert(name.isNotEmpty ||
@@ -701,12 +709,16 @@ abstract class ModelElement
701709
if (isPublicAndPackageDocumented) {
702710
warn(PackageWarning.noCanonicalFound);
703711
}
704-
return htmlEscape.convert(name);
712+
return (tag: '', text: htmlEscape.convert(name), endTag: '');
705713
}
706714

707715
var cssClass = isDeprecated ? ' class="deprecated"' : '';
708-
return '<a$cssClass href="$href">$displayName</a>';
709-
}();
716+
return (
717+
tag: '<a$cssClass href="$href">',
718+
text: displayName,
719+
endTag: '</a>'
720+
);
721+
}
710722

711723
ParameterRenderer get _parameterRenderer => const ParameterRendererHtml();
712724

0 commit comments

Comments
 (0)