Skip to content

Commit 9f0ea7a

Browse files
committed
Remove redundant Generator abstraction
1 parent 30ec961 commit 9f0ea7a

File tree

4 files changed

+236
-258
lines changed

4 files changed

+236
-258
lines changed

lib/src/generator/generator.dart

Lines changed: 232 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,12 @@
66
library;
77

88
import 'package:dartdoc/src/dartdoc_options.dart';
9-
import 'package:dartdoc/src/model/package_graph.dart';
9+
import 'package:dartdoc/src/generator/generator_backend.dart';
10+
import 'package:dartdoc/src/logging.dart';
11+
import 'package:dartdoc/src/model/model.dart';
12+
import 'package:dartdoc/src/model_utils.dart';
1013
import 'package:dartdoc/src/package_meta.dart';
14+
import 'package:dartdoc/src/runtime_stats.dart';
1115
import 'package:dartdoc/src/warnings.dart';
1216

1317
abstract class FileWriter {
@@ -33,13 +37,234 @@ abstract class FileWriter {
3337
/// A generator generates documentation for a given package.
3438
///
3539
/// Generators can generate documentation in different formats: HTML, JSON, etc.
36-
abstract class Generator {
37-
/// Generates the documentation for the given package using the specified
38-
/// writer. Completes the returned future when done.
39-
Future<void> generate(PackageGraph packageGraph);
40+
class Generator {
41+
final GeneratorBackend _generatorBackend;
4042

41-
/// The set of of files written by the generator backend.
42-
Set<String> get writtenFiles;
43+
Generator(this._generatorBackend);
44+
45+
Future<void> generate(PackageGraph? packageGraph) async {
46+
await _generatorBackend.generateAdditionalFiles();
47+
48+
if (packageGraph == null) {
49+
return;
50+
}
51+
52+
var indexElements = _generateDocs(packageGraph);
53+
var categories = indexElements
54+
.whereType<Categorization>()
55+
.where((e) => e.hasCategorization)
56+
.toList(growable: false);
57+
_generatorBackend.generateCategoryJson(categories);
58+
_generatorBackend.generateSearchIndex(indexElements);
59+
}
60+
61+
Set<String> get writtenFiles => _generatorBackend.writer.writtenFiles;
62+
63+
/// Traverses the [packageGraph] and generates documentation for all contained
64+
/// elements.
65+
List<Documentable> _generateDocs(PackageGraph packageGraph) {
66+
runtimeStats.resetAccumulators({
67+
'writtenCategoryFileCount',
68+
'writtenClassFileCount',
69+
'writtenConstructorFileCount',
70+
'writtenEnumFileCount',
71+
'writtenExtensionFileCount',
72+
'writtenExtensionTypeFileCount',
73+
'writtenFunctionFileCount',
74+
'writtenLibraryFileCount',
75+
'writtenMethodFileCount',
76+
'writtenMixinFileCount',
77+
'writtenPackageFileCount',
78+
'writtenPropertyFileCount',
79+
'writtenSidebarFileCount',
80+
'writtenTopLevelPropertyFileCount',
81+
'writtenTypedefFileCount'
82+
});
83+
_generatorBackend.generatePackage(
84+
packageGraph, packageGraph.defaultPackage);
85+
86+
var indexAccumulator = <Documentable>[];
87+
var multiplePackages = packageGraph.localPackages.length > 1;
88+
89+
void generateConstants(Container container, Library library) {
90+
for (var constant in container.constantFields.whereDocumented) {
91+
if (!constant.isCanonical) continue;
92+
indexAccumulator.add(constant);
93+
_generatorBackend.generateProperty(
94+
packageGraph, library, container, constant);
95+
}
96+
}
97+
98+
void generateConstructors(Constructable constructable, Library library) {
99+
for (var constructor in constructable.constructors.whereDocumented) {
100+
if (!constructor.isCanonical) continue;
101+
indexAccumulator.add(constructor);
102+
_generatorBackend.generateConstructor(
103+
packageGraph, library, constructable, constructor);
104+
}
105+
}
106+
107+
void generateInstanceMethods(Container container, Library library) {
108+
for (var method in container.instanceMethods.whereDocumented) {
109+
if (!method.isCanonical) continue;
110+
indexAccumulator.add(method);
111+
_generatorBackend.generateMethod(
112+
packageGraph, library, container, method);
113+
}
114+
}
115+
116+
void generateInstanceOperators(Container container, Library library) {
117+
for (var operator in container.instanceOperators.whereDocumented) {
118+
if (!operator.isCanonical) continue;
119+
indexAccumulator.add(operator);
120+
_generatorBackend.generateMethod(
121+
packageGraph, library, container, operator);
122+
}
123+
}
124+
125+
void generateInstanceProperties(Container container, Library library) {
126+
for (var property in container.instanceFields.whereDocumented) {
127+
if (!property.isCanonical) continue;
128+
indexAccumulator.add(property);
129+
_generatorBackend.generateProperty(
130+
packageGraph, library, container, property);
131+
}
132+
}
133+
134+
void generateStaticMethods(Container container, Library library) {
135+
for (var method in container.staticMethods.whereDocumented) {
136+
if (!method.isCanonical) continue;
137+
indexAccumulator.add(method);
138+
_generatorBackend.generateMethod(
139+
packageGraph, library, container, method);
140+
}
141+
}
142+
143+
void generateStaticProperties(Container container, Library library) {
144+
for (var property in container.variableStaticFields.whereDocumented) {
145+
if (!property.isCanonical) continue;
146+
indexAccumulator.add(property);
147+
_generatorBackend.generateProperty(
148+
packageGraph, library, container, property);
149+
}
150+
}
151+
152+
for (var package in packageGraph.localPackages) {
153+
if (multiplePackages) {
154+
logInfo('Generating docs for package ${package.name}...');
155+
}
156+
for (var category in package.categories.whereDocumented) {
157+
logInfo('Generating docs for category ${category.name} from '
158+
'${category.package.fullyQualifiedName}...');
159+
indexAccumulator.add(category);
160+
_generatorBackend.generateCategory(packageGraph, category);
161+
}
162+
163+
for (var lib in package.libraries.whereDocumented) {
164+
if (!multiplePackages) {
165+
logInfo('Generating docs for library ${lib.breadcrumbName} from '
166+
'${lib.element.firstFragment.source.uri}...');
167+
}
168+
if (!lib.isAnonymous && !lib.hasDocumentation) {
169+
packageGraph.warnOnElement(lib, PackageWarning.noLibraryLevelDocs);
170+
}
171+
indexAccumulator.add(lib);
172+
_generatorBackend.generateLibrary(packageGraph, lib);
173+
174+
for (var class_ in lib.classesAndExceptions.whereDocumentedIn(lib)) {
175+
indexAccumulator.add(class_);
176+
_generatorBackend.generateClass(packageGraph, lib, class_);
177+
178+
var canonicalLibrary = class_.canonicalLibraryOrThrow;
179+
generateConstants(class_, canonicalLibrary);
180+
generateConstructors(class_, canonicalLibrary);
181+
generateInstanceMethods(class_, canonicalLibrary);
182+
generateInstanceOperators(class_, canonicalLibrary);
183+
generateInstanceProperties(class_, canonicalLibrary);
184+
generateStaticMethods(class_, canonicalLibrary);
185+
generateStaticProperties(class_, canonicalLibrary);
186+
}
187+
188+
for (var extension in lib.extensions.whereDocumentedIn(lib)) {
189+
indexAccumulator.add(extension);
190+
_generatorBackend.generateExtension(packageGraph, lib, extension);
191+
192+
var canonicalLibrary = extension.canonicalLibraryOrThrow;
193+
generateConstants(extension, canonicalLibrary);
194+
generateInstanceMethods(extension, canonicalLibrary);
195+
generateInstanceOperators(extension, canonicalLibrary);
196+
generateInstanceProperties(extension, canonicalLibrary);
197+
generateStaticMethods(extension, canonicalLibrary);
198+
generateStaticProperties(extension, canonicalLibrary);
199+
}
200+
201+
for (var extensionType in lib.extensionTypes.whereDocumentedIn(lib)) {
202+
indexAccumulator.add(extensionType);
203+
_generatorBackend.generateExtensionType(
204+
packageGraph, lib, extensionType);
205+
206+
var canonicalLibrary = extensionType.canonicalLibraryOrThrow;
207+
generateConstants(extensionType, canonicalLibrary);
208+
generateConstructors(extensionType, canonicalLibrary);
209+
generateInstanceMethods(extensionType, canonicalLibrary);
210+
generateInstanceOperators(extensionType, canonicalLibrary);
211+
generateInstanceProperties(extensionType, canonicalLibrary);
212+
generateStaticMethods(extensionType, canonicalLibrary);
213+
generateStaticProperties(extensionType, canonicalLibrary);
214+
}
215+
216+
for (var mixin in lib.mixins.whereDocumentedIn(lib)) {
217+
indexAccumulator.add(mixin);
218+
_generatorBackend.generateMixin(packageGraph, lib, mixin);
219+
220+
var canonicalLibrary = mixin.canonicalLibraryOrThrow;
221+
generateConstants(mixin, canonicalLibrary);
222+
generateInstanceMethods(mixin, canonicalLibrary);
223+
generateInstanceOperators(mixin, canonicalLibrary);
224+
generateInstanceProperties(mixin, canonicalLibrary);
225+
generateStaticMethods(mixin, canonicalLibrary);
226+
generateStaticProperties(mixin, canonicalLibrary);
227+
}
228+
229+
for (var enum_ in lib.enums.whereDocumentedIn(lib)) {
230+
indexAccumulator.add(enum_);
231+
_generatorBackend.generateEnum(packageGraph, lib, enum_);
232+
233+
var canonicalLibrary = enum_.canonicalLibraryOrThrow;
234+
generateConstants(enum_, canonicalLibrary);
235+
generateConstructors(enum_, canonicalLibrary);
236+
generateInstanceMethods(enum_, canonicalLibrary);
237+
generateInstanceOperators(enum_, canonicalLibrary);
238+
generateInstanceProperties(enum_, canonicalLibrary);
239+
generateStaticMethods(enum_, canonicalLibrary);
240+
generateStaticProperties(enum_, canonicalLibrary);
241+
}
242+
243+
for (var constant in lib.constants.whereDocumentedIn(lib)) {
244+
indexAccumulator.add(constant);
245+
_generatorBackend.generateTopLevelProperty(
246+
packageGraph, lib, constant);
247+
}
248+
249+
for (var property in lib.properties.whereDocumentedIn(lib)) {
250+
indexAccumulator.add(property);
251+
_generatorBackend.generateTopLevelProperty(
252+
packageGraph, lib, property);
253+
}
254+
255+
for (var function in lib.functions.whereDocumentedIn(lib)) {
256+
indexAccumulator.add(function);
257+
_generatorBackend.generateFunction(packageGraph, lib, function);
258+
}
259+
260+
for (var typeDef in lib.typedefs.whereDocumentedIn(lib)) {
261+
indexAccumulator.add(typeDef);
262+
_generatorBackend.generateTypeDef(packageGraph, lib, typeDef);
263+
}
264+
}
265+
}
266+
return indexAccumulator;
267+
}
43268
}
44269

45270
List<DartdocOption> createGeneratorOptions(

0 commit comments

Comments
 (0)