Skip to content

Dedupliate library elements #3838

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Aug 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
117 changes: 61 additions & 56 deletions lib/src/generator/generator_frontend.dart
Original file line number Diff line number Diff line change
Expand Up @@ -72,66 +72,66 @@ class GeneratorFrontEnd implements Generator {
var indexAccumulator = <Indexable>[];
var multiplePackages = packageGraph.localPackages.length > 1;

void generateConstants(Container container) {
void generateConstants(Container container, Library library) {
for (var constant in container.constantFields.whereDocumented) {
if (!constant.isCanonical) continue;
indexAccumulator.add(constant);
_generatorBackend.generateProperty(
packageGraph, container.library, container, constant);
packageGraph, library, container, constant);
}
}

void generateConstructors(Constructable constructable) {
void generateConstructors(Constructable constructable, Library library) {
for (var constructor in constructable.constructors.whereDocumented) {
if (!constructor.isCanonical) continue;
indexAccumulator.add(constructor);
_generatorBackend.generateConstructor(
packageGraph, constructable.library, constructable, constructor);
packageGraph, library, constructable, constructor);
}
}

void generateInstanceMethods(Container container) {
void generateInstanceMethods(Container container, Library library) {
for (var method in container.instanceMethods.whereDocumented) {
if (!method.isCanonical) continue;
indexAccumulator.add(method);
_generatorBackend.generateMethod(
packageGraph, container.library, container, method);
packageGraph, library, container, method);
}
}

void generateInstanceOperators(Container container) {
void generateInstanceOperators(Container container, Library library) {
for (var operator in container.instanceOperators.whereDocumented) {
if (!operator.isCanonical) continue;
indexAccumulator.add(operator);
_generatorBackend.generateMethod(
packageGraph, container.library, container, operator);
packageGraph, library, container, operator);
}
}

void generateInstanceProperties(Container container) {
void generateInstanceProperties(Container container, Library library) {
for (var property in container.instanceFields.whereDocumented) {
if (!property.isCanonical) continue;
indexAccumulator.add(property);
_generatorBackend.generateProperty(
packageGraph, container.library, container, property);
packageGraph, library, container, property);
}
}

void generateStaticMethods(Container container) {
void generateStaticMethods(Container container, Library library) {
for (var method in container.staticMethods.whereDocumented) {
if (!method.isCanonical) continue;
indexAccumulator.add(method);
_generatorBackend.generateMethod(
packageGraph, container.library, container, method);
packageGraph, library, container, method);
}
}

void generateStaticProperties(Container container) {
void generateStaticProperties(Container container, Library library) {
for (var property in container.variableStaticFields.whereDocumented) {
if (!property.isCanonical) continue;
indexAccumulator.add(property);
_generatorBackend.generateProperty(
packageGraph, container.library, container, property);
packageGraph, library, container, property);
}
}

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

for (var class_ in lib.classesAndExceptions.whereDocumented) {
for (var class_ in lib.classesAndExceptions.whereDocumentedIn(lib)) {
indexAccumulator.add(class_);
_generatorBackend.generateClass(packageGraph, lib, class_);

generateConstants(class_);
generateConstructors(class_);
generateInstanceMethods(class_);
generateInstanceOperators(class_);
generateInstanceProperties(class_);
generateStaticMethods(class_);
generateStaticProperties(class_);
var canonicalLibrary = class_.canonicalLibraryOrThrow;
generateConstants(class_, canonicalLibrary);
generateConstructors(class_, canonicalLibrary);
generateInstanceMethods(class_, canonicalLibrary);
generateInstanceOperators(class_, canonicalLibrary);
generateInstanceProperties(class_, canonicalLibrary);
generateStaticMethods(class_, canonicalLibrary);
generateStaticProperties(class_, canonicalLibrary);
}

for (var extension in lib.extensions.whereDocumented) {
for (var extension in lib.extensions.whereDocumentedIn(lib)) {
indexAccumulator.add(extension);
_generatorBackend.generateExtension(packageGraph, lib, extension);

generateConstants(extension);
generateInstanceMethods(extension);
generateInstanceOperators(extension);
generateInstanceProperties(extension);
generateStaticMethods(extension);
generateStaticProperties(extension);
var canonicalLibrary = extension.canonicalLibraryOrThrow;
generateConstants(extension, canonicalLibrary);
generateInstanceMethods(extension, canonicalLibrary);
generateInstanceOperators(extension, canonicalLibrary);
generateInstanceProperties(extension, canonicalLibrary);
generateStaticMethods(extension, canonicalLibrary);
generateStaticProperties(extension, canonicalLibrary);
}

for (var extensionType in lib.extensionTypes.whereDocumented) {
for (var extensionType in lib.extensionTypes.whereDocumentedIn(lib)) {
indexAccumulator.add(extensionType);
_generatorBackend.generateExtensionType(
packageGraph, lib, extensionType);

generateConstants(extensionType);
generateConstructors(extensionType);
generateInstanceMethods(extensionType);
generateInstanceOperators(extensionType);
generateInstanceProperties(extensionType);
generateStaticMethods(extensionType);
generateStaticProperties(extensionType);
var canonicalLibrary = extensionType.canonicalLibraryOrThrow;
generateConstants(extensionType, canonicalLibrary);
generateConstructors(extensionType, canonicalLibrary);
generateInstanceMethods(extensionType, canonicalLibrary);
generateInstanceOperators(extensionType, canonicalLibrary);
generateInstanceProperties(extensionType, canonicalLibrary);
generateStaticMethods(extensionType, canonicalLibrary);
generateStaticProperties(extensionType, canonicalLibrary);
}

for (var mixin in lib.mixins.whereDocumented) {
for (var mixin in lib.mixins.whereDocumentedIn(lib)) {
indexAccumulator.add(mixin);
_generatorBackend.generateMixin(packageGraph, lib, mixin);

generateConstants(mixin);
generateInstanceMethods(mixin);
generateInstanceOperators(mixin);
generateInstanceProperties(mixin);
generateStaticMethods(mixin);
generateStaticProperties(mixin);
var canonicalLibrary = mixin.canonicalLibraryOrThrow;
generateConstants(mixin, canonicalLibrary);
generateInstanceMethods(mixin, canonicalLibrary);
generateInstanceOperators(mixin, canonicalLibrary);
generateInstanceProperties(mixin, canonicalLibrary);
generateStaticMethods(mixin, canonicalLibrary);
generateStaticProperties(mixin, canonicalLibrary);
}

for (var enum_ in lib.enums.whereDocumented) {
for (var enum_ in lib.enums.whereDocumentedIn(lib)) {
indexAccumulator.add(enum_);
_generatorBackend.generateEnum(packageGraph, lib, enum_);

generateConstants(enum_);
generateConstructors(enum_);
generateInstanceMethods(enum_);
generateInstanceOperators(enum_);
generateInstanceProperties(enum_);
generateStaticMethods(enum_);
generateStaticProperties(enum_);
var canonicalLibrary = enum_.canonicalLibraryOrThrow;
generateConstants(enum_, canonicalLibrary);
generateConstructors(enum_, canonicalLibrary);
generateInstanceMethods(enum_, canonicalLibrary);
generateInstanceOperators(enum_, canonicalLibrary);
generateInstanceProperties(enum_, canonicalLibrary);
generateStaticMethods(enum_, canonicalLibrary);
generateStaticProperties(enum_, canonicalLibrary);
}

for (var constant in lib.constants.whereDocumented) {
for (var constant in lib.constants.whereDocumentedIn(lib)) {
indexAccumulator.add(constant);
_generatorBackend.generateTopLevelProperty(
packageGraph, lib, constant);
}

for (var property in lib.properties.whereDocumented) {
for (var property in lib.properties.whereDocumentedIn(lib)) {
indexAccumulator.add(property);
_generatorBackend.generateTopLevelProperty(
packageGraph, lib, property);
}

for (var function in lib.functions.whereDocumented) {
for (var function in lib.functions.whereDocumentedIn(lib)) {
indexAccumulator.add(function);
_generatorBackend.generateFunction(packageGraph, lib, function);
}

for (var typeDef in lib.typedefs.whereDocumented) {
for (var typeDef in lib.typedefs.whereDocumentedIn(lib)) {
indexAccumulator.add(typeDef);
_generatorBackend.generateTypeDef(packageGraph, lib, typeDef);
}
Expand Down
22 changes: 19 additions & 3 deletions lib/src/generator/generator_utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import 'dart:convert';
import 'package:collection/collection.dart';
import 'package:dartdoc/src/model/directives/categorization.dart';
import 'package:dartdoc/src/model/indexable.dart';
import 'package:dartdoc/src/model/library.dart';
import 'package:dartdoc/src/model/model_element.dart';

String generateCategoryJson(Iterable<Categorization> categories, bool pretty) {
Expand All @@ -15,7 +16,7 @@ String generateCategoryJson(Iterable<Categorization> categories, bool pretty) {
in categories.sorted(_compareElementRepresentations))
<String, Object?>{
'name': categorization.name,
'qualifiedName': categorization.fullyQualifiedName,
'qualifiedName': categorization.canonicalQualifiedName,
'href': categorization.href,
// TODO(srawlins): Rename to 'kind'.
'type': categorization.kind.toString(),
Expand All @@ -42,7 +43,7 @@ String generateSearchIndexJson(Iterable<Indexable> indexedElements,
for (final item in indexedElements.sorted(_compareElementRepresentations))
{
'name': item.name,
'qualifiedName': item.fullyQualifiedName,
'qualifiedName': item.canonicalQualifiedName,
'href': item.href,
'kind': item.kind.index,
// TODO(srawlins): Only include this for [Inheritable] items.
Expand Down Expand Up @@ -112,9 +113,24 @@ final _htmlTagPattern =

// Compares two elements, first by fully qualified name, then by kind.
int _compareElementRepresentations(Indexable a, Indexable b) {
final value = compareNatural(a.fullyQualifiedName, b.fullyQualifiedName);
final value =
compareNatural(a.canonicalQualifiedName, b.canonicalQualifiedName);
if (value == 0) {
return compareNatural(a.kind.toString(), b.kind.toString());
}
return value;
}

extension on Indexable {
/// The fully qualified name of this element, but using the canonical library,
/// if it has one.
String get canonicalQualifiedName {
var self = this;
if (self is Library) return name;
if (self is ModelElement) {
var library = self.canonicalLibrary ?? self.library;
return '${library.name}.${self.qualifiedName}';
}
return name;
}
}
Loading