Skip to content

Commit 8a1da1f

Browse files
committed
fix a regression with generating package docs
1 parent f8cd4c8 commit 8a1da1f

File tree

13 files changed

+118
-39
lines changed

13 files changed

+118
-39
lines changed

CONTRIBUTING.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ yet in the issue tracker, start by opening an issue. Thanks!
1818

1919
[![Build Status](https://travis-ci.org/dart-lang/dartdoc.svg)](https://travis-ci.org/dart-lang/dartdoc)
2020
[![Build status](https://ci.appveyor.com/api/projects/status/s6sh69et2ga00dlu?svg=true)](https://ci.appveyor.com/project/devoncarew/dartdoc)
21-
[![Coverage Status](https://img.shields.io/coveralls/dart-lang/dartdoc.svg)](https://coveralls.io/r/dart-lang/dartdoc)
2221

2322
## Making Changes
2423

bin/dartdoc.dart

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,11 +106,20 @@ main(List<String> arguments) async {
106106
: new PackageMeta.fromDir(inputDir);
107107

108108
if (!packageMeta.isValid) {
109-
print('Unable to generate documentation.');
110-
packageMeta.getInvalidReasons().map((r) => '* $r').forEach(print);
109+
stderr.writeln(
110+
'Unable to generate documentation: ${packageMeta.getInvalidReasons().first}.');
111111
exit(1);
112112
}
113113

114+
if (!packageMeta.isSdk && packageMeta.needsPubGet) {
115+
try {
116+
packageMeta.runPubGet();
117+
} catch (e) {
118+
stderr.writeln('$e');
119+
exit(1);
120+
}
121+
}
122+
114123
print("Generating documentation for '${packageMeta}' into "
115124
"${outputDir.absolute.path}${Platform.pathSeparator}");
116125
print('');

lib/dartdoc.dart

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,7 @@ import 'package:analyzer/dart/element/element.dart';
1212
import 'package:analyzer/file_system/file_system.dart' as fileSystem;
1313
import 'package:analyzer/file_system/physical_file_system.dart';
1414
import 'package:analyzer/source/embedder.dart';
15-
import 'package:analyzer/source/package_map_provider.dart';
1615
import 'package:analyzer/source/package_map_resolver.dart';
17-
import 'package:analyzer/source/pub_package_map_provider.dart';
1816
import 'package:analyzer/source/sdk_ext.dart';
1917
import 'package:analyzer/src/generated/engine.dart';
2018
import 'package:analyzer/src/generated/error.dart';
@@ -23,7 +21,8 @@ import 'package:analyzer/src/generated/sdk.dart';
2321
import 'package:analyzer/src/generated/sdk_io.dart';
2422
import 'package:analyzer/src/generated/source.dart';
2523
import 'package:analyzer/src/generated/source_io.dart';
26-
import 'package:path/path.dart' as p;
24+
import 'package:package_config/discovery.dart' as package_config;
25+
import 'package:path/path.dart' as path;
2726

2827
import 'src/config.dart';
2928
import 'src/generator.dart';
@@ -42,7 +41,7 @@ const String name = 'dartdoc';
4241
// Update when pubspec version changes.
4342
const String version = '0.9.7+1';
4443

45-
final String defaultOutDir = p.join('doc', 'api');
44+
final String defaultOutDir = path.join('doc', 'api');
4645

4746
/// Initialize and setup the generators.
4847
Future<List<Generator>> initGenerators(String url, List<String> headerFilePaths,
@@ -156,21 +155,17 @@ class DartDoc {
156155
DartSdk sdk = new DirectoryBasedDartSdk(new JavaFile(sdkDir.path));
157156
List<UriResolver> resolvers = [];
158157

159-
fileSystem.Resource cwd =
158+
fileSystem.Folder cwd =
160159
PhysicalResourceProvider.INSTANCE.getResource(rootDir.path);
161-
PubPackageMapProvider pubPackageMapProvider =
162-
new PubPackageMapProvider(PhysicalResourceProvider.INSTANCE, sdk);
163-
PackageMapInfo packageMapInfo =
164-
pubPackageMapProvider.computePackageMap(cwd);
165-
Map<String, List<fileSystem.Folder>> packageMap = packageMapInfo.packageMap;
160+
Map<String, List<fileSystem.Folder>> packageMap = _calculatePackageMap(cwd);
166161
EmbedderUriResolver embedderUriResolver;
167162
if (packageMap != null) {
168163
resolvers.add(new SdkExtUriResolver(packageMap));
169164
resolvers.add(new PackageMapUriResolver(
170165
PhysicalResourceProvider.INSTANCE, packageMap));
171166

172-
embedderUriResolver = new EmbedderUriResolver(
173-
new EmbedderYamlLocator(packageMap).embedderYamls);
167+
var embedderYamls = new EmbedderYamlLocator(packageMap).embedderYamls;
168+
embedderUriResolver = new EmbedderUriResolver(embedderYamls);
174169
if (embedderUriResolver.length == 0) {
175170
// The embedder uri resolver has no mappings. Use the default Dart SDK
176171
// uri resolver.
@@ -183,7 +178,8 @@ class DartDoc {
183178
} else {
184179
resolvers.add(new DartUriResolver(sdk));
185180
}
186-
resolvers.add(new FileUriResolver());
181+
resolvers.add(
182+
new fileSystem.ResourceUriResolver(PhysicalResourceProvider.INSTANCE));
187183

188184
SourceFactory sourceFactory = new SourceFactory(resolvers);
189185

@@ -262,7 +258,7 @@ class DartDoc {
262258
new _Error(error, info.lineInfo, packageMeta.dir.path));
263259
})
264260
.where((_Error error) => error.isError)
265-
.toList() as List<_Error>..sort();
261+
.toList()..sort();
266262

267263
double seconds = _stopwatch.elapsedMilliseconds / 1000.0;
268264
print("Parsed ${libraries.length} "
@@ -280,6 +276,23 @@ class DartDoc {
280276
}
281277
}
282278

279+
Map<String, List<fileSystem.Folder>> _calculatePackageMap(
280+
fileSystem.Folder dir) {
281+
Map<String, List<fileSystem.Folder>> map = new Map();
282+
var info = package_config.findPackagesFromFile(dir.toUri());
283+
284+
for (String name in info.packages) {
285+
Uri uri = info.asMap()[name];
286+
fileSystem.Resource resource =
287+
PhysicalResourceProvider.INSTANCE.getResource(uri.toFilePath());
288+
if (resource is fileSystem.Folder) {
289+
map[name] = [resource];
290+
}
291+
}
292+
293+
return map;
294+
}
295+
283296
/// This class is returned if dartdoc fails in an expected way (for instance, if
284297
/// there is an analysis error in the library).
285298
class DartDocFailure {

lib/src/package_meta.dart

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ abstract class PackageMeta {
1919
new _SdkMeta(sdkDir, sdkReadmePath: sdkReadmePath);
2020

2121
bool get isSdk;
22+
bool get needsPubGet => false;
23+
24+
void runPubGet();
2225

2326
String get name;
2427
String get version;
@@ -84,6 +87,23 @@ class _FilePackageMeta extends PackageMeta {
8487
@override
8588
bool get isSdk => false;
8689

90+
@override
91+
bool get needsPubGet =>
92+
!(new File(path.join(dir.path, '.packages')).existsSync());
93+
94+
@override
95+
void runPubGet() {
96+
ProcessResult result =
97+
Process.runSync('pub', ['get'], workingDirectory: dir.path);
98+
99+
if (result.exitCode != 0) {
100+
StringBuffer buf = new StringBuffer();
101+
buf.writeln('${result.stdout}');
102+
buf.writeln('${result.stderr}');
103+
throw buf.toString().trim();
104+
}
105+
}
106+
87107
@override
88108
String get name => _pubspec['name'];
89109
@override
@@ -126,9 +146,9 @@ class _FilePackageMeta extends PackageMeta {
126146
List<String> getInvalidReasons() {
127147
List<String> reasons = <String>[];
128148
if (_pubspec == null || _pubspec.isEmpty) {
129-
reasons.add('No pubspec.yaml found');
149+
reasons.add('no pubspec.yaml found');
130150
} else if (!_pubspec.containsKey('name')) {
131-
reasons.add('No name found in pubspec.yaml');
151+
reasons.add('no name found in pubspec.yaml');
132152
}
133153
return reasons;
134154
}
@@ -157,6 +177,11 @@ class _SdkMeta extends PackageMeta {
157177
@override
158178
bool get isSdk => true;
159179

180+
@override
181+
void runPubGet() {
182+
throw 'unsupported operation';
183+
}
184+
160185
@override
161186
String get name => 'Dart SDK';
162187
@override

pubspec.lock

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ packages:
66
name: analyzer
77
url: "https://pub.dartlang.org"
88
source: hosted
9-
version: "0.27.4-alpha.18"
9+
version: "0.28.1"
1010
ansicolor:
1111
description:
1212
name: ansicolor
@@ -133,6 +133,12 @@ packages:
133133
url: "https://pub.dartlang.org"
134134
source: hosted
135135
version: "0.12.0+2"
136+
meta:
137+
description:
138+
name: meta
139+
url: "https://pub.dartlang.org"
140+
source: hosted
141+
version: "1.0.2"
136142
mime:
137143
description:
138144
name: mime
@@ -157,6 +163,12 @@ packages:
157163
url: "https://pub.dartlang.org"
158164
source: hosted
159165
version: "0.1.5"
166+
package_resolver:
167+
description:
168+
name: package_resolver
169+
url: "https://pub.dartlang.org"
170+
source: hosted
171+
version: "1.0.2"
160172
path:
161173
description:
162174
name: path
@@ -199,6 +211,12 @@ packages:
199211
url: "https://pub.dartlang.org"
200212
source: hosted
201213
version: "0.6.5+2"
214+
shelf_packages_handler:
215+
description:
216+
name: shelf_packages_handler
217+
url: "https://pub.dartlang.org"
218+
source: hosted
219+
version: "1.0.0"
202220
shelf_static:
203221
description:
204222
name: shelf_static
@@ -216,7 +234,7 @@ packages:
216234
name: source_map_stack_trace
217235
url: "https://pub.dartlang.org"
218236
source: hosted
219-
version: "1.0.4"
237+
version: "1.1.3"
220238
source_maps:
221239
description:
222240
name: source_maps
@@ -258,7 +276,7 @@ packages:
258276
name: test
259277
url: "https://pub.dartlang.org"
260278
source: hosted
261-
version: "0.12.15+1"
279+
version: "0.12.15+6"
262280
typed_data:
263281
description:
264282
name: typed_data
@@ -307,4 +325,5 @@ packages:
307325
url: "https://pub.dartlang.org"
308326
source: hosted
309327
version: "2.1.10"
310-
sdk: ">=1.16.0 <1.20.0"
328+
sdks:
329+
dart: ">=1.16.0 <2.0.0"

pubspec.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,15 @@ homepage: https://github.com/dart-lang/dartdoc
77
environment:
88
sdk: '>=1.14.0 <2.0.0'
99
dependencies:
10-
analyzer: 0.27.4-alpha.18
10+
analyzer: ^0.28.1
1111
args: ^0.13.0
1212
cli_util: ^0.0.1
1313
collection: ^1.2.0
1414
html: ^0.12.1
1515
logging: '>=0.9.0 <0.12.0'
1616
markdown: ^0.10.1
1717
mustache4dart: ^1.0.9
18+
package_config: ^0.1.5
1819
path: ^1.3.0
1920
quiver: '>=0.18.0 <0.23.0'
2021
resource: ^1.1.0

test/package_meta_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ void main() {
2727
test('is not valid', () {
2828
expect(p.isValid, isFalse);
2929
expect(p.getInvalidReasons(), isNotEmpty);
30-
expect(p.getInvalidReasons(), contains('No pubspec.yaml found'));
30+
expect(p.getInvalidReasons(), contains('no pubspec.yaml found'));
3131
});
3232
});
3333

test/src/utils.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ library test_utils;
77
import 'dart:io';
88

99
import 'package:analyzer/dart/element/element.dart';
10+
import 'package:analyzer/file_system/file_system.dart';
11+
import 'package:analyzer/file_system/physical_file_system.dart';
1012
import 'package:analyzer/src/generated/engine.dart';
1113
import 'package:analyzer/src/generated/java_io.dart';
1214
import 'package:analyzer/src/generated/sdk.dart';
@@ -69,7 +71,7 @@ class AnalyzerHelper {
6971
AnalyzerHelper() {
7072
List<UriResolver> resolvers = [
7173
new DartUriResolver(sdkDir),
72-
new FileUriResolver()
74+
new ResourceUriResolver(PhysicalResourceProvider.INSTANCE)
7375
];
7476

7577
SourceFactory sourceFactory = new SourceFactory(resolvers);

testing/test_package/pubspec.lock

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
# Generated by pub
22
# See http://pub.dartlang.org/doc/glossary.html#lockfile
33
packages: {}
4+
sdks:
5+
dart: any

testing/test_package_docs/fake/ExtraSpecialList/expand.html

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,15 @@ <h5><a href="fake/ExtraSpecialList-class.html">ExtraSpecialList</a></h5>
158158
by <code>f</code> for each element of this, in iteration order.</p>
159159
<p>The returned <code>Iterable</code> is lazy, and calls <code>f</code> for each element
160160
of this every time it's iterated.</p>
161+
<p>Example:</p>
162+
<pre class="prettyprint language-dart"><code>var pairs = [[1, 2], [3, 4]];
163+
var flattened = pairs.expand((pair) =&gt; pair).toList();
164+
print(flattened); // =&gt; [1, 2, 3, 4];
165+
166+
var input = [1, 2, 3];
167+
var duplicated = input.expand((i) =&gt; [i, i]).toList();
168+
print(duplicated); // =&gt; [1, 1, 2, 2, 3, 3]
169+
</code></pre>
161170
</section>
162171

163172

0 commit comments

Comments
 (0)