66library ;
77
88import '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' ;
1013import 'package:dartdoc/src/package_meta.dart' ;
14+ import 'package:dartdoc/src/runtime_stats.dart' ;
1115import 'package:dartdoc/src/warnings.dart' ;
1216
1317abstract 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
45270List <DartdocOption > createGeneratorOptions (
0 commit comments