Skip to content

Commit a4fb766

Browse files
authored
Simplify InheritingContainer wrt inherited elements (#4059)
While working with analyzer's InheritanceManager3, I noticed there was a fair bit of code in dartdoc's InheritingContainer that could be simplified. The `_inheritedElements` field is relied on by `inheritedMethods`, `inheritedOperators`, and `allFields`. It performs some calculations to come up with the collection of inherited elements using its own homegrown dartdoc logic, but this logic exists in the analyzer APIs on `InterfaceElement`. We can basically replace this field with access to `element.inheritedElements`. While investigating, I found that I could make a few members `@visibleForTesting`: `inheritedMethods`, `inheritedOperators`. Also `allFields` can be made private. And `Enum.hasPublicEnumValues` can be removed, as it is the same as the super implementation. This leads to all of the deleted code in `templates.runtime_renderers.dart`.
1 parent 8e6a95c commit a4fb766

File tree

6 files changed

+51
-209
lines changed

6 files changed

+51
-209
lines changed

lib/src/generator/templates.runtime_renderers.dart

Lines changed: 4 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -7213,14 +7213,6 @@ class _Renderer_Enum extends RendererBase<Enum> {
72137213
);
72147214
},
72157215
),
7216-
'hasPublicEnumValues': Property(
7217-
getValue: (CT_ c) => c.hasPublicEnumValues,
7218-
renderVariable:
7219-
(CT_ c, Property<CT_> self, List<String> remainingNames) =>
7220-
self.renderSimpleVariable(c, remainingNames, 'bool'),
7221-
7222-
getBool: (CT_ c) => c.hasPublicEnumValues,
7223-
),
72247216
'inheritanceChain': Property(
72257217
getValue: (CT_ c) => c.inheritanceChain,
72267218
renderVariable:
@@ -11498,29 +11490,6 @@ class _Renderer_InheritingContainer extends RendererBase<InheritingContainer> {
1149811490
CT_,
1149911491
() => {
1150011492
..._Renderer_Container.propertyMap<CT_>(),
11501-
'allFields': Property(
11502-
getValue: (CT_ c) => c.allFields,
11503-
renderVariable:
11504-
(CT_ c, Property<CT_> self, List<String> remainingNames) =>
11505-
self.renderSimpleVariable(
11506-
c,
11507-
remainingNames,
11508-
'List<Field>',
11509-
),
11510-
11511-
renderIterable:
11512-
(
11513-
CT_ c,
11514-
RendererBase<CT_> r,
11515-
List<MustachioNode> ast,
11516-
StringSink sink,
11517-
) {
11518-
return c.allFields.map(
11519-
(e) =>
11520-
_render_Field(e, ast, r.template, sink, parent: r),
11521-
);
11522-
},
11523-
),
1152411493
'allModelElements': Property(
1152511494
getValue: (CT_ c) => c.allModelElements,
1152611495
renderVariable:
@@ -11953,57 +11922,6 @@ class _Renderer_InheritingContainer extends RendererBase<InheritingContainer> {
1195311922
);
1195411923
},
1195511924
),
11956-
'inheritedMethods': Property(
11957-
getValue: (CT_ c) => c.inheritedMethods,
11958-
renderVariable:
11959-
(CT_ c, Property<CT_> self, List<String> remainingNames) =>
11960-
self.renderSimpleVariable(
11961-
c,
11962-
remainingNames,
11963-
'Iterable<Method>',
11964-
),
11965-
11966-
renderIterable:
11967-
(
11968-
CT_ c,
11969-
RendererBase<CT_> r,
11970-
List<MustachioNode> ast,
11971-
StringSink sink,
11972-
) {
11973-
return c.inheritedMethods.map(
11974-
(e) =>
11975-
_render_Method(e, ast, r.template, sink, parent: r),
11976-
);
11977-
},
11978-
),
11979-
'inheritedOperators': Property(
11980-
getValue: (CT_ c) => c.inheritedOperators,
11981-
renderVariable:
11982-
(CT_ c, Property<CT_> self, List<String> remainingNames) =>
11983-
self.renderSimpleVariable(
11984-
c,
11985-
remainingNames,
11986-
'List<Operator>',
11987-
),
11988-
11989-
renderIterable:
11990-
(
11991-
CT_ c,
11992-
RendererBase<CT_> r,
11993-
List<MustachioNode> ast,
11994-
StringSink sink,
11995-
) {
11996-
return c.inheritedOperators.map(
11997-
(e) => _render_Operator(
11998-
e,
11999-
ast,
12000-
r.template,
12001-
sink,
12002-
parent: r,
12003-
),
12004-
);
12005-
},
12006-
),
1200711925
'instanceFields': Property(
1200811926
getValue: (CT_ c) => c.instanceFields,
1200911927
renderVariable:
@@ -14263,7 +14181,7 @@ class _Renderer_LibraryContainer extends RendererBase<LibraryContainer> {
1426314181
}
1426414182
}
1426514183

14266-
String renderLibraryRedirect(LibraryTemplateData context, Template template) {
14184+
String renderLibrary(LibraryTemplateData context, Template template) {
1426714185
var buffer = StringBuffer();
1426814186
_render_LibraryTemplateData(context, template.ast, template, buffer);
1426914187
return buffer.toString();
@@ -14501,7 +14419,7 @@ class _Renderer_LibraryTemplateData extends RendererBase<LibraryTemplateData> {
1450114419
}
1450214420
}
1450314421

14504-
String renderLibrary(LibraryTemplateData context, Template template) {
14422+
String renderLibraryRedirect(LibraryTemplateData context, Template template) {
1450514423
var buffer = StringBuffer();
1450614424
_render_LibraryTemplateData(context, template.ast, template, buffer);
1450714425
return buffer.toString();
@@ -20021,7 +19939,7 @@ class _Renderer_Package extends RendererBase<Package> {
2002119939
}
2002219940
}
2002319941

20024-
String renderSearchPage(PackageTemplateData context, Template template) {
19942+
String renderIndex(PackageTemplateData context, Template template) {
2002519943
var buffer = StringBuffer();
2002619944
_render_PackageTemplateData(context, template.ast, template, buffer);
2002719945
return buffer.toString();
@@ -20379,7 +20297,7 @@ class _Renderer_PackageTemplateData extends RendererBase<PackageTemplateData> {
2037920297
}
2038020298
}
2038120299

20382-
String renderIndex(PackageTemplateData context, Template template) {
20300+
String renderSearchPage(PackageTemplateData context, Template template) {
2038320301
var buffer = StringBuffer();
2038420302
_render_PackageTemplateData(context, template.ast, template, buffer);
2038520303
return buffer.toString();

lib/src/model/enum.dart

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,9 @@ import 'package:analyzer/dart/analysis/features.dart';
66
import 'package:analyzer/dart/element/element2.dart';
77
import 'package:dartdoc/src/model/kind.dart';
88
import 'package:dartdoc/src/model/model.dart';
9-
import 'package:dartdoc/src/model_utils.dart' as model_utils;
109
import 'package:meta/meta.dart';
1110

1211
class Enum extends InheritingContainer with Constructable, MixedInTypes {
13-
1412
@override
1513
final EnumElement2 element;
1614

@@ -51,12 +49,12 @@ class Enum extends InheritingContainer with Constructable, MixedInTypes {
5149
declaredFields.where((f) => f is! EnumField && f.isConst);
5250

5351
@override
54-
late final List<Field> publicEnumValues =
55-
allFields.whereType<EnumField>().wherePublic.toList(growable: false);
56-
57-
@override
58-
bool get hasPublicEnumValues =>
59-
allFields.whereType<EnumField>().any((e) => e.isPublic);
52+
late final List<Field> publicEnumValues = [
53+
for (var value in element.constants2)
54+
getModelForPropertyInducingElement(value, library,
55+
getter: getModelFor(value.getter2!, library) as ContainerAccessor,
56+
setter: null) as Field
57+
];
6058

6159
@override
6260
bool get isAbstract => false;

lib/src/model/inheriting_container.dart

Lines changed: 16 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -99,29 +99,28 @@ abstract class InheritingContainer extends Container {
9999
...typeParameters,
100100
];
101101

102+
@visibleForTesting
102103
Iterable<Method> get inheritedMethods {
103104
var methodNames = declaredMethods.map((m) => m.element.name3).toSet();
104-
var inheritedMethodElements = _inheritedElements
105+
var inheritedMethodElements = element.inheritedMembers.values
105106
.whereType<MethodElement2>()
106-
.where((e) =>
107-
!e.isOperator &&
108-
e is! PropertyAccessorElement2 &&
109-
!methodNames.contains(e.name3))
110-
.toSet();
107+
.where((e) => !e.isOperator)
108+
.where((e) => !methodNames.contains(e.name3));
111109

112110
return [
113111
for (var e in inheritedMethodElements)
114112
getModelFor(e, library, enclosingContainer: this) as Method,
115113
];
116114
}
117115

116+
@visibleForTesting
118117
List<Operator> get inheritedOperators {
119118
var operatorNames =
120119
declaredOperators.map((o) => o.element.lookupName).toSet();
121-
var inheritedOperatorElements = _inheritedElements
120+
var inheritedOperatorElements = element.inheritedMembers.values
122121
.whereType<MethodElement2>()
123-
.where((e) => e.isOperator && !operatorNames.contains(e.lookupName))
124-
.toSet();
122+
.where((e) => e.isOperator)
123+
.where((e) => !operatorNames.contains(e.name3));
125124

126125
return [
127126
for (var e in inheritedOperatorElements)
@@ -132,74 +131,10 @@ abstract class InheritingContainer extends Container {
132131
late final DefinedElementType modelType =
133132
getTypeFor(element.thisType, library) as DefinedElementType;
134133

135-
/// A list of the inherited executable elements, one element per inherited
136-
/// `Name`.
137-
///
138-
/// In this list, elements that are "closer" in the inheritance chain to
139-
/// _this_ element are preferred over elements that are further away. In the
140-
/// case of ties, concrete inherited elements are prefered to non-concrete
141-
/// ones.
142-
late final List<ExecutableElement2> _inheritedElements = () {
143-
if (element case ClassElement2 classElement
144-
when classElement.isDartCoreObject) {
145-
return const <ExecutableElement2>[];
146-
}
147-
148-
// The mapping of all of the inherited element names to their _concrete_
149-
// implementation element.
150-
var concreteInheritanceMap =
151-
packageGraph.inheritanceManager.getInheritedConcreteMap(element);
152-
// The mapping of all inherited element names to the nearest inherited
153-
// element that they resolve to.
154-
var inheritanceMap =
155-
packageGraph.inheritanceManager.getInheritedMap(element);
156-
157-
var inheritanceChainElements =
158-
inheritanceChain.map((c) => c.element).toList(growable: false);
159-
160-
// A combined map of names to inherited _concrete_ Elements, and other
161-
// inherited Elements.
162-
var combinedMap = {
163-
for (var MapEntry(:key, :value) in concreteInheritanceMap.entries)
164-
key.name: value,
165-
};
166-
for (var MapEntry(key: name, value: inheritedElement)
167-
in inheritanceMap.entries) {
168-
var combinedMapElement = combinedMap[name.name];
169-
if (combinedMapElement == null) {
170-
combinedMap[name.name] = inheritedElement;
171-
continue;
172-
}
173-
174-
// Elements in the inheritance chain starting from `this.element` up to,
175-
// but not including, `Object`.
176-
var enclosingElement =
177-
inheritedElement.enclosingElement2 as InterfaceElement2;
178-
assert(inheritanceChainElements.contains(enclosingElement) ||
179-
enclosingElement.isDartCoreObject);
180-
181-
// If the concrete element from `getInheritedConcreteMap2` is farther in
182-
// the inheritance chain from this class than the (non-concrete) one
183-
// provided by `getInheritedMap2`, prefer the latter. This correctly
184-
// accounts for intermediate abstract classes that have method/field
185-
// implementations.
186-
var enclosingElementFromCombined =
187-
combinedMapElement.enclosingElement2 as InterfaceElement2;
188-
if (inheritanceChainElements.indexOf(enclosingElementFromCombined) <
189-
inheritanceChainElements.indexOf(enclosingElement)) {
190-
combinedMap[name.name] = inheritedElement;
191-
}
192-
}
193-
194-
// Finally, return all of the elements ultimately collected in the combined
195-
// map.
196-
return combinedMap.values.toList(growable: false);
197-
}();
198-
199134
/// All fields defined on this container, _including inherited fields_.
200-
late List<Field> allFields = () {
135+
late final List<Field> _allFields = () {
201136
var inheritedAccessorElements = {
202-
..._inheritedElements.whereType<PropertyAccessorElement2>()
137+
...element.inheritedMembers.values.whereType<PropertyAccessorElement2>()
203138
};
204139

205140
// This structure keeps track of inherited accessors, allowing lookup
@@ -285,17 +220,15 @@ abstract class InheritingContainer extends Container {
285220
List<ModelElement> get allModelElements => _allModelElements;
286221

287222
@override
288-
Iterable<Field> get constantFields => allFields.where((f) => f.isConst);
223+
Iterable<Field> get constantFields => _allFields.where((f) => f.isConst);
289224

290225
@override
291-
Iterable<Field> get declaredFields => allFields.where((f) => !f.isInherited);
226+
Iterable<Field> get declaredFields => _allFields.where((f) => !f.isInherited);
292227

293228
/// The [InheritingContainer] with the library in which [element] is defined.
294229
InheritingContainer get definingContainer =>
295230
getModelFor(element, library) as InheritingContainer;
296231

297-
@override
298-
299232
@override
300233
InterfaceElement2 get element;
301234

@@ -333,10 +266,10 @@ abstract class InheritingContainer extends Container {
333266
List<InheritingContainer> get inheritanceChain;
334267

335268
@visibleForTesting
336-
Iterable<Field> get inheritedFields => allFields.where((f) => f.isInherited);
269+
Iterable<Field> get inheritedFields => _allFields.where((f) => f.isInherited);
337270

338271
@override
339-
Iterable<Field> get instanceFields => allFields.where((f) => !f.isStatic);
272+
Iterable<Field> get instanceFields => _allFields.where((f) => !f.isStatic);
340273

341274
@override
342275
late final List<Field> availableInstanceFieldsSorted = [
@@ -371,8 +304,8 @@ abstract class InheritingContainer extends Container {
371304
List<Method> get _extensionInstanceMethods => [
372305
for (var extension in potentiallyApplicableExtensionsSorted)
373306
for (var method in extension.instanceMethods)
374-
getModelFor(method.element, library,
375-
enclosingContainer: extension) as Method,
307+
getModelFor(method.element, library, enclosingContainer: extension)
308+
as Method,
376309
];
377310

378311
@override
@@ -677,11 +610,6 @@ mixin MixedInTypes on InheritingContainer {
677610
mixedInTypes.wherePublic;
678611
}
679612

680-
extension on InterfaceElement2 {
681-
bool get isDartCoreObject =>
682-
name3 == 'Object' && library2.name3 == 'dart.core';
683-
}
684-
685613
extension DefinedElementTypeIterableExtension on Iterable<DefinedElementType> {
686614
/// The [ModelElement] for each element.
687615
List<InheritingContainer> get modelElements =>

0 commit comments

Comments
 (0)