Skip to content

Commit 1f6f9ed

Browse files
astashovkeertip
authored andcommitted
Add --auto-include-dependencies [#1159] (#1327)
If `--auto-include-dependencies` flag is provided, dartdoc tries to automatically add all the used libraries, even from other packages, to the list of the documented libraries. For that, it goes through each model element in a package, and finds "used" elements for each element (e.g. from the parameters and from the return type), and if any of these are from undocumented lib - it adds that lib, and then rebuild `Package` with the new list of libs. Testing: Flutter now generates docs for `vector_math_64` when `--auto-include-dependencies` are provided. And the test package adds library from `test_package_imported` because it uses it and has one of the members of that lib in one of the Apple method's parameters. Fixes #1159
1 parent b2715ec commit 1f6f9ed

File tree

78 files changed

+2862
-12
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

78 files changed

+2862
-12
lines changed

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,11 @@ and then you can insert it via `{@macro template_name}`, like
114114
/// More comments
115115
```
116116

117+
### Auto including dependencies
118+
119+
If `--auto-include-dependencies` flag is provided, dartdoc tries to automatically add
120+
all the used libraries, even from other packages, to the list of the documented libraries.
121+
117122
## Issues and bugs
118123

119124
Please file reports on the [GitHub Issue Tracker][].

bin/dartdoc.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,8 @@ main(List<String> arguments) async {
143143
showWarnings: args['show-warnings'],
144144
includeSource: includeSource,
145145
inputDir: inputDir,
146-
sdkVersion: sdk.sdkVersion);
146+
sdkVersion: sdk.sdkVersion,
147+
autoIncludeDependencies: args['auto-include-dependencies']);
147148

148149
var dartdoc = new DartDoc(inputDir, excludeLibraries, sdkDir, generators,
149150
outputDir, packageMeta, includeLibraries,
@@ -218,6 +219,10 @@ ArgParser _createArgsParser() {
218219
help: 'Group libraries from the same package into categories.',
219220
negatable: false,
220221
defaultsTo: false);
222+
parser.addFlag('auto-include-dependencies',
223+
help: 'Include all the used libraries into the docs, even the ones not in the current package or "include-external"',
224+
negatable: false,
225+
defaultsTo: false);
221226
return parser;
222227
}
223228

lib/dartdoc.dart

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,14 +67,16 @@ void initializeConfig(
6767
bool showWarnings: false,
6868
bool addCrossdart: false,
6969
String examplePathPrefix,
70-
bool includeSource: true}) {
70+
bool includeSource: true,
71+
bool autoIncludeDependencies: false}) {
7172
setConfig(
7273
inputDir: inputDir,
7374
sdkVersion: sdkVersion,
7475
showWarnings: showWarnings,
7576
addCrossdart: addCrossdart,
7677
examplePathPrefix: examplePathPrefix,
77-
includeSource: includeSource);
78+
includeSource: includeSource,
79+
autoIncludeDependencies: autoIncludeDependencies);
7880
}
7981

8082
Map<String, List<fileSystem.Folder>> _calculatePackageMap(
@@ -150,6 +152,13 @@ class DartDoc {
150152
}
151153

152154
Package package = new Package(libraries, packageMeta);
155+
156+
if (config != null && config.autoIncludeDependencies) {
157+
final newLibraryElements = _buildLibrariesWithAutoincludedDependencies(package);
158+
Library.clearLibraryMap();
159+
package = new Package(newLibraryElements, packageMeta);
160+
}
161+
153162
// Go through docs of every model element in package to prebuild the macros index
154163
package.allModelElements.forEach((m) => m.documentation);
155164

@@ -358,3 +367,24 @@ class _Error implements Comparable<_Error> {
358367
@override
359368
String toString() => '[${severityName}] ${description}';
360369
}
370+
371+
Iterable<LibraryElement> _buildLibrariesWithAutoincludedDependencies(Package package) {
372+
final List<LibraryElement> newLibraryElements = []..addAll(package.libraries.map((l) => l.element as LibraryElement));
373+
374+
package.allModelElements.forEach((modelElement) {
375+
modelElement.usedElements.forEach((used) {
376+
if (used != null && used.modelType != null) {
377+
final ModelElement modelTypeElement = used.modelType.element;
378+
final library = package.findLibraryFor(modelTypeElement.element);
379+
if (library == null && modelTypeElement.library != null) {
380+
if (!newLibraryElements.contains(modelTypeElement.library.element)
381+
&& !modelTypeElement.library.name.startsWith("dart:")) {
382+
newLibraryElements.add(modelTypeElement.library.element);
383+
}
384+
}
385+
}
386+
});
387+
});
388+
389+
return newLibraryElements;
390+
}

lib/src/config.dart

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,15 @@ class Config {
1313
final String examplePathPrefix;
1414
final bool includeSource;
1515
final String sdkVersion;
16+
final bool autoIncludeDependencies;
1617
Config._(
17-
this.inputDir, this.showWarnings, this.addCrossdart, this.examplePathPrefix, this.includeSource, this.sdkVersion);
18+
this.inputDir,
19+
this.showWarnings,
20+
this.addCrossdart,
21+
this.examplePathPrefix,
22+
this.includeSource,
23+
this.sdkVersion,
24+
this.autoIncludeDependencies);
1825
}
1926

2027
Config _config;
@@ -26,6 +33,14 @@ void setConfig(
2633
String sdkVersion,
2734
bool addCrossdart: false,
2835
String examplePathPrefix,
29-
bool includeSource: true}) {
30-
_config = new Config._(inputDir, showWarnings, addCrossdart, examplePathPrefix, includeSource, sdkVersion);
36+
bool includeSource: true,
37+
bool autoIncludeDependencies: false}) {
38+
_config = new Config._(
39+
inputDir,
40+
showWarnings,
41+
addCrossdart,
42+
examplePathPrefix,
43+
includeSource,
44+
sdkVersion,
45+
autoIncludeDependencies);
3146
}

lib/src/element_type.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ class ElementType {
6464

6565
ModelElement get returnElement {
6666
Element e = _returnTypeCore.element;
67-
if (e == null) {
67+
if (e == null || e.library == null) {
6868
return null;
6969
}
7070
Library lib = element.package.findLibraryFor(e);

lib/src/model.dart

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -961,7 +961,10 @@ abstract class GetterSetterCombo {
961961
}
962962

963963
class Library extends ModelElement {
964-
static final Map<String, Library> _libraryMap = <String, Library>{};
964+
static Map<String, Library> _libraryMap = <String, Library>{};
965+
static void clearLibraryMap() {
966+
_libraryMap = {};
967+
}
965968

966969
@override
967970
final Package package;
@@ -1771,6 +1774,31 @@ abstract class ModelElement implements Comparable, Nameable, Documentable {
17711774
return builder.toString().trim();
17721775
}
17731776

1777+
/// Gather all the used elements, from the parameters and return type, for example
1778+
/// E.g. method <code>Iterable<String> blah(List<int> foo)</code> will return
1779+
/// <code>[Iterable, String, List, int]</code>
1780+
Iterable<ModelElement> get usedElements {
1781+
final set = new Set<ModelElement>();
1782+
if (modelType != null) {
1783+
if (modelType.isFunctionType) {
1784+
if (modelType.returnElement != null) {
1785+
set.addAll(modelType.returnElement.usedElements);
1786+
}
1787+
if (canHaveParameters) {
1788+
set.addAll(parameters.map((p) => p.usedElements).expand((i) => i));
1789+
}
1790+
} else if (modelType.element != null) {
1791+
set.add(modelType.element);
1792+
if (modelType.isParameterizedType) {
1793+
set.addAll(modelType.typeArguments
1794+
.map((arg) => arg.element.usedElements)
1795+
.expand((i) => i));
1796+
}
1797+
}
1798+
}
1799+
return set;
1800+
}
1801+
17741802
@override
17751803
String toString() => '$runtimeType $name';
17761804

test/compare_output_test.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ void main() {
5050

5151
var args = <String>[
5252
dartdocBin,
53+
'--auto-include-dependencies',
5354
'--example-path-prefix',
5455
'examples',
5556
'--no-include-source',

test/model_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -625,7 +625,7 @@ void main() {
625625
});
626626

627627
test('inherited methods, including from Object ', () {
628-
expect(B.inheritedMethods, hasLength(6));
628+
expect(B.inheritedMethods, hasLength(7));
629629
expect(B.hasInheritedMethods, isTrue);
630630
});
631631

testing/test_package/lib/example.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ library ex;
44
import 'dart:async';
55

66
import 'src/mylib.dart' show Helper;
7+
import 'package:test_package_imported/main.dart';
78

89
export 'dart:core' show deprecated, Deprecated;
910

@@ -97,6 +98,10 @@ class Apple {
9798

9899
Apple._internal(this._s2);
99100

101+
/// Apple docs for whataclass
102+
void whataclass(List<Whataclass<bool>> list) {
103+
}
104+
100105
/**
101106
* The getter for `s`
102107
*/

testing/test_package/pubspec.lock

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Generated by pub
22
# See http://pub.dartlang.org/doc/glossary.html#lockfile
3-
packages: {}
3+
packages:
4+
test_package_imported:
5+
description:
6+
path: "../test_package_imported"
7+
relative: true
8+
source: path
9+
version: "0.0.1"
410
sdks:
511
dart: any

0 commit comments

Comments
 (0)