Skip to content

Commit 048df2e

Browse files
committed
Simplify InheritingContainer wrt inherited elements
1 parent 56cf68d commit 048df2e

File tree

6 files changed

+51
-208
lines changed

6 files changed

+51
-208
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 & 87 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,16 @@ 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

297232
@override
298-
299233
@override
300234
InterfaceElement2 get element;
301235

@@ -333,10 +267,10 @@ abstract class InheritingContainer extends Container {
333267
List<InheritingContainer> get inheritanceChain;
334268

335269
@visibleForTesting
336-
Iterable<Field> get inheritedFields => allFields.where((f) => f.isInherited);
270+
Iterable<Field> get inheritedFields => _allFields.where((f) => f.isInherited);
337271

338272
@override
339-
Iterable<Field> get instanceFields => allFields.where((f) => !f.isStatic);
273+
Iterable<Field> get instanceFields => _allFields.where((f) => !f.isStatic);
340274

341275
@override
342276
late final List<Field> availableInstanceFieldsSorted = [
@@ -371,8 +305,8 @@ abstract class InheritingContainer extends Container {
371305
List<Method> get _extensionInstanceMethods => [
372306
for (var extension in potentiallyApplicableExtensionsSorted)
373307
for (var method in extension.instanceMethods)
374-
getModelFor(method.element, library,
375-
enclosingContainer: extension) as Method,
308+
getModelFor(method.element, library, enclosingContainer: extension)
309+
as Method,
376310
];
377311

378312
@override
@@ -677,11 +611,6 @@ mixin MixedInTypes on InheritingContainer {
677611
mixedInTypes.wherePublic;
678612
}
679613

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

0 commit comments

Comments
 (0)