Skip to content

Commit d629e1e

Browse files
authored
Dedupliate library elements (#3838)
The main change that deduplicates library elements is splitting `Library.exportedAndLocalElements` into `Library._localElements` and `Library._exportedElements`, and then `Library._elementsOfType` into `Library._localElementsOfType` and `Library._exportedElementsOfType`. These two lists are separated so that the ModelElements can be instantiated or fetched from the package graph with the "correct" enclosing library. `_localElementsOfType` fetches elements via `getModelFor(e, this)`, and `exportedElementsOfType` fetches elements via `getModelFor(e, packageGraph.getModelForElement(library))`. Other changes to support this: * Use an element's `canonicalLibrary` instead of `library` in many places, like in each override of `filePath`, and in GeneratorFrontEnd. * There is no longer a distinction between an element's library and its _defining_ library. `ModelElement.definingLibrary` is removed. * Introduce a `canonicalizedQualifiedName` to use when creating `index.json`, which is the same as `fullyQualifiedName` but using the element's canonical library. * The global map of all elements was keyed on a 3-element key, which can now be a 2-element key (ConstructedModelElementsKey). * Remove an assert in Inheritable that no longer makes sense with this new model.
1 parent 9bf90e5 commit d629e1e

34 files changed

+341
-420
lines changed

lib/src/generator/generator_frontend.dart

+61-56
Original file line numberDiff line numberDiff line change
@@ -72,66 +72,66 @@ class GeneratorFrontEnd implements Generator {
7272
var indexAccumulator = <Indexable>[];
7373
var multiplePackages = packageGraph.localPackages.length > 1;
7474

75-
void generateConstants(Container container) {
75+
void generateConstants(Container container, Library library) {
7676
for (var constant in container.constantFields.whereDocumented) {
7777
if (!constant.isCanonical) continue;
7878
indexAccumulator.add(constant);
7979
_generatorBackend.generateProperty(
80-
packageGraph, container.library, container, constant);
80+
packageGraph, library, container, constant);
8181
}
8282
}
8383

84-
void generateConstructors(Constructable constructable) {
84+
void generateConstructors(Constructable constructable, Library library) {
8585
for (var constructor in constructable.constructors.whereDocumented) {
8686
if (!constructor.isCanonical) continue;
8787
indexAccumulator.add(constructor);
8888
_generatorBackend.generateConstructor(
89-
packageGraph, constructable.library, constructable, constructor);
89+
packageGraph, library, constructable, constructor);
9090
}
9191
}
9292

93-
void generateInstanceMethods(Container container) {
93+
void generateInstanceMethods(Container container, Library library) {
9494
for (var method in container.instanceMethods.whereDocumented) {
9595
if (!method.isCanonical) continue;
9696
indexAccumulator.add(method);
9797
_generatorBackend.generateMethod(
98-
packageGraph, container.library, container, method);
98+
packageGraph, library, container, method);
9999
}
100100
}
101101

102-
void generateInstanceOperators(Container container) {
102+
void generateInstanceOperators(Container container, Library library) {
103103
for (var operator in container.instanceOperators.whereDocumented) {
104104
if (!operator.isCanonical) continue;
105105
indexAccumulator.add(operator);
106106
_generatorBackend.generateMethod(
107-
packageGraph, container.library, container, operator);
107+
packageGraph, library, container, operator);
108108
}
109109
}
110110

111-
void generateInstanceProperties(Container container) {
111+
void generateInstanceProperties(Container container, Library library) {
112112
for (var property in container.instanceFields.whereDocumented) {
113113
if (!property.isCanonical) continue;
114114
indexAccumulator.add(property);
115115
_generatorBackend.generateProperty(
116-
packageGraph, container.library, container, property);
116+
packageGraph, library, container, property);
117117
}
118118
}
119119

120-
void generateStaticMethods(Container container) {
120+
void generateStaticMethods(Container container, Library library) {
121121
for (var method in container.staticMethods.whereDocumented) {
122122
if (!method.isCanonical) continue;
123123
indexAccumulator.add(method);
124124
_generatorBackend.generateMethod(
125-
packageGraph, container.library, container, method);
125+
packageGraph, library, container, method);
126126
}
127127
}
128128

129-
void generateStaticProperties(Container container) {
129+
void generateStaticProperties(Container container, Library library) {
130130
for (var property in container.variableStaticFields.whereDocumented) {
131131
if (!property.isCanonical) continue;
132132
indexAccumulator.add(property);
133133
_generatorBackend.generateProperty(
134-
packageGraph, container.library, container, property);
134+
packageGraph, library, container, property);
135135
}
136136
}
137137

@@ -157,88 +157,93 @@ class GeneratorFrontEnd implements Generator {
157157
indexAccumulator.add(lib);
158158
_generatorBackend.generateLibrary(packageGraph, lib);
159159

160-
for (var class_ in lib.classesAndExceptions.whereDocumented) {
160+
for (var class_ in lib.classesAndExceptions.whereDocumentedIn(lib)) {
161161
indexAccumulator.add(class_);
162162
_generatorBackend.generateClass(packageGraph, lib, class_);
163163

164-
generateConstants(class_);
165-
generateConstructors(class_);
166-
generateInstanceMethods(class_);
167-
generateInstanceOperators(class_);
168-
generateInstanceProperties(class_);
169-
generateStaticMethods(class_);
170-
generateStaticProperties(class_);
164+
var canonicalLibrary = class_.canonicalLibraryOrThrow;
165+
generateConstants(class_, canonicalLibrary);
166+
generateConstructors(class_, canonicalLibrary);
167+
generateInstanceMethods(class_, canonicalLibrary);
168+
generateInstanceOperators(class_, canonicalLibrary);
169+
generateInstanceProperties(class_, canonicalLibrary);
170+
generateStaticMethods(class_, canonicalLibrary);
171+
generateStaticProperties(class_, canonicalLibrary);
171172
}
172173

173-
for (var extension in lib.extensions.whereDocumented) {
174+
for (var extension in lib.extensions.whereDocumentedIn(lib)) {
174175
indexAccumulator.add(extension);
175176
_generatorBackend.generateExtension(packageGraph, lib, extension);
176177

177-
generateConstants(extension);
178-
generateInstanceMethods(extension);
179-
generateInstanceOperators(extension);
180-
generateInstanceProperties(extension);
181-
generateStaticMethods(extension);
182-
generateStaticProperties(extension);
178+
var canonicalLibrary = extension.canonicalLibraryOrThrow;
179+
generateConstants(extension, canonicalLibrary);
180+
generateInstanceMethods(extension, canonicalLibrary);
181+
generateInstanceOperators(extension, canonicalLibrary);
182+
generateInstanceProperties(extension, canonicalLibrary);
183+
generateStaticMethods(extension, canonicalLibrary);
184+
generateStaticProperties(extension, canonicalLibrary);
183185
}
184186

185-
for (var extensionType in lib.extensionTypes.whereDocumented) {
187+
for (var extensionType in lib.extensionTypes.whereDocumentedIn(lib)) {
186188
indexAccumulator.add(extensionType);
187189
_generatorBackend.generateExtensionType(
188190
packageGraph, lib, extensionType);
189191

190-
generateConstants(extensionType);
191-
generateConstructors(extensionType);
192-
generateInstanceMethods(extensionType);
193-
generateInstanceOperators(extensionType);
194-
generateInstanceProperties(extensionType);
195-
generateStaticMethods(extensionType);
196-
generateStaticProperties(extensionType);
192+
var canonicalLibrary = extensionType.canonicalLibraryOrThrow;
193+
generateConstants(extensionType, canonicalLibrary);
194+
generateConstructors(extensionType, canonicalLibrary);
195+
generateInstanceMethods(extensionType, canonicalLibrary);
196+
generateInstanceOperators(extensionType, canonicalLibrary);
197+
generateInstanceProperties(extensionType, canonicalLibrary);
198+
generateStaticMethods(extensionType, canonicalLibrary);
199+
generateStaticProperties(extensionType, canonicalLibrary);
197200
}
198201

199-
for (var mixin in lib.mixins.whereDocumented) {
202+
for (var mixin in lib.mixins.whereDocumentedIn(lib)) {
200203
indexAccumulator.add(mixin);
201204
_generatorBackend.generateMixin(packageGraph, lib, mixin);
202205

203-
generateConstants(mixin);
204-
generateInstanceMethods(mixin);
205-
generateInstanceOperators(mixin);
206-
generateInstanceProperties(mixin);
207-
generateStaticMethods(mixin);
208-
generateStaticProperties(mixin);
206+
var canonicalLibrary = mixin.canonicalLibraryOrThrow;
207+
generateConstants(mixin, canonicalLibrary);
208+
generateInstanceMethods(mixin, canonicalLibrary);
209+
generateInstanceOperators(mixin, canonicalLibrary);
210+
generateInstanceProperties(mixin, canonicalLibrary);
211+
generateStaticMethods(mixin, canonicalLibrary);
212+
generateStaticProperties(mixin, canonicalLibrary);
209213
}
210214

211-
for (var enum_ in lib.enums.whereDocumented) {
215+
for (var enum_ in lib.enums.whereDocumentedIn(lib)) {
212216
indexAccumulator.add(enum_);
213217
_generatorBackend.generateEnum(packageGraph, lib, enum_);
214218

215-
generateConstants(enum_);
216-
generateConstructors(enum_);
217-
generateInstanceMethods(enum_);
218-
generateInstanceOperators(enum_);
219-
generateInstanceProperties(enum_);
220-
generateStaticMethods(enum_);
221-
generateStaticProperties(enum_);
219+
var canonicalLibrary = enum_.canonicalLibraryOrThrow;
220+
generateConstants(enum_, canonicalLibrary);
221+
generateConstructors(enum_, canonicalLibrary);
222+
generateInstanceMethods(enum_, canonicalLibrary);
223+
generateInstanceOperators(enum_, canonicalLibrary);
224+
generateInstanceProperties(enum_, canonicalLibrary);
225+
generateStaticMethods(enum_, canonicalLibrary);
226+
generateStaticProperties(enum_, canonicalLibrary);
222227
}
223228

224-
for (var constant in lib.constants.whereDocumented) {
229+
for (var constant in lib.constants.whereDocumentedIn(lib)) {
225230
indexAccumulator.add(constant);
226231
_generatorBackend.generateTopLevelProperty(
227232
packageGraph, lib, constant);
228233
}
229234

230-
for (var property in lib.properties.whereDocumented) {
235+
for (var property in lib.properties.whereDocumentedIn(lib)) {
231236
indexAccumulator.add(property);
232237
_generatorBackend.generateTopLevelProperty(
233238
packageGraph, lib, property);
234239
}
235240

236-
for (var function in lib.functions.whereDocumented) {
241+
for (var function in lib.functions.whereDocumentedIn(lib)) {
237242
indexAccumulator.add(function);
238243
_generatorBackend.generateFunction(packageGraph, lib, function);
239244
}
240245

241-
for (var typeDef in lib.typedefs.whereDocumented) {
246+
for (var typeDef in lib.typedefs.whereDocumentedIn(lib)) {
242247
indexAccumulator.add(typeDef);
243248
_generatorBackend.generateTypeDef(packageGraph, lib, typeDef);
244249
}

lib/src/generator/generator_utils.dart

+19-3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'dart:convert';
77
import 'package:collection/collection.dart';
88
import 'package:dartdoc/src/model/directives/categorization.dart';
99
import 'package:dartdoc/src/model/indexable.dart';
10+
import 'package:dartdoc/src/model/library.dart';
1011
import 'package:dartdoc/src/model/model_element.dart';
1112

1213
String generateCategoryJson(Iterable<Categorization> categories, bool pretty) {
@@ -15,7 +16,7 @@ String generateCategoryJson(Iterable<Categorization> categories, bool pretty) {
1516
in categories.sorted(_compareElementRepresentations))
1617
<String, Object?>{
1718
'name': categorization.name,
18-
'qualifiedName': categorization.fullyQualifiedName,
19+
'qualifiedName': categorization.canonicalQualifiedName,
1920
'href': categorization.href,
2021
// TODO(srawlins): Rename to 'kind'.
2122
'type': categorization.kind.toString(),
@@ -42,7 +43,7 @@ String generateSearchIndexJson(Iterable<Indexable> indexedElements,
4243
for (final item in indexedElements.sorted(_compareElementRepresentations))
4344
{
4445
'name': item.name,
45-
'qualifiedName': item.fullyQualifiedName,
46+
'qualifiedName': item.canonicalQualifiedName,
4647
'href': item.href,
4748
'kind': item.kind.index,
4849
// TODO(srawlins): Only include this for [Inheritable] items.
@@ -112,9 +113,24 @@ final _htmlTagPattern =
112113

113114
// Compares two elements, first by fully qualified name, then by kind.
114115
int _compareElementRepresentations(Indexable a, Indexable b) {
115-
final value = compareNatural(a.fullyQualifiedName, b.fullyQualifiedName);
116+
final value =
117+
compareNatural(a.canonicalQualifiedName, b.canonicalQualifiedName);
116118
if (value == 0) {
117119
return compareNatural(a.kind.toString(), b.kind.toString());
118120
}
119121
return value;
120122
}
123+
124+
extension on Indexable {
125+
/// The fully qualified name of this element, but using the canonical library,
126+
/// if it has one.
127+
String get canonicalQualifiedName {
128+
var self = this;
129+
if (self is Library) return name;
130+
if (self is ModelElement) {
131+
var library = self.canonicalLibrary ?? self.library;
132+
return '${library.name}.${self.qualifiedName}';
133+
}
134+
return name;
135+
}
136+
}

0 commit comments

Comments
 (0)