Skip to content

Commit ad877e3

Browse files
authored
Merge pull request #1234 from dart-lang/fix_package_regression
Fix package regression
2 parents f8cd4c8 + c6f01f5 commit ad877e3

File tree

14 files changed

+138
-46
lines changed

14 files changed

+138
-46
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: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ library dartdoc.bin;
66

77
import 'dart:io';
88

9-
import 'package:analyzer/src/generated/java_io.dart';
9+
import 'package:analyzer/file_system/physical_file_system.dart';
10+
import 'package:analyzer/src/dart/sdk/sdk.dart';
1011
import 'package:analyzer/src/generated/sdk.dart';
11-
import 'package:analyzer/src/generated/sdk_io.dart';
1212
import 'package:args/args.dart';
1313
import 'package:cli_util/cli_util.dart' as cli_util;
1414
import 'package:dartdoc/dartdoc.dart';
@@ -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('');
@@ -126,7 +135,8 @@ main(List<String> arguments) async {
126135
var addCrossdart = args['add-crossdart'] as bool;
127136
var includeSource = args['include-source'] as bool;
128137

129-
DartSdk sdk = new DirectoryBasedDartSdk(new JavaFile(sdkDir.path));
138+
DartSdk sdk = new FolderBasedDartSdk(PhysicalResourceProvider.INSTANCE,
139+
PhysicalResourceProvider.INSTANCE.getFolder(sdkDir.path));
130140

131141
initializeConfig(
132142
addCrossdart: addCrossdart,

lib/dartdoc.dart

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,17 @@ 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';
17+
import 'package:analyzer/src/dart/sdk/sdk.dart';
1918
import 'package:analyzer/src/generated/engine.dart';
2019
import 'package:analyzer/src/generated/error.dart';
2120
import 'package:analyzer/src/generated/java_io.dart';
2221
import 'package:analyzer/src/generated/sdk.dart';
23-
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,
@@ -153,24 +152,21 @@ class DartDoc {
153152
List<LibraryElement> _parseLibraries(
154153
List<String> files, List<String> includeExternals) {
155154
List<LibraryElement> libraries = [];
156-
DartSdk sdk = new DirectoryBasedDartSdk(new JavaFile(sdkDir.path));
155+
DartSdk sdk = new FolderBasedDartSdk(PhysicalResourceProvider.INSTANCE,
156+
PhysicalResourceProvider.INSTANCE.getFolder(sdkDir.path));
157157
List<UriResolver> resolvers = [];
158158

159-
fileSystem.Resource cwd =
159+
fileSystem.Folder cwd =
160160
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;
161+
Map<String, List<fileSystem.Folder>> packageMap = _calculatePackageMap(cwd);
166162
EmbedderUriResolver embedderUriResolver;
167163
if (packageMap != null) {
168164
resolvers.add(new SdkExtUriResolver(packageMap));
169165
resolvers.add(new PackageMapUriResolver(
170166
PhysicalResourceProvider.INSTANCE, packageMap));
171167

172-
embedderUriResolver = new EmbedderUriResolver(
173-
new EmbedderYamlLocator(packageMap).embedderYamls);
168+
var embedderYamls = new EmbedderYamlLocator(packageMap).embedderYamls;
169+
embedderUriResolver = new EmbedderUriResolver(embedderYamls);
174170
if (embedderUriResolver.length == 0) {
175171
// The embedder uri resolver has no mappings. Use the default Dart SDK
176172
// uri resolver.
@@ -183,7 +179,8 @@ class DartDoc {
183179
} else {
184180
resolvers.add(new DartUriResolver(sdk));
185181
}
186-
resolvers.add(new FileUriResolver());
182+
resolvers.add(
183+
new fileSystem.ResourceUriResolver(PhysicalResourceProvider.INSTANCE));
187184

188185
SourceFactory sourceFactory = new SourceFactory(resolvers);
189186

@@ -262,7 +259,7 @@ class DartDoc {
262259
new _Error(error, info.lineInfo, packageMeta.dir.path));
263260
})
264261
.where((_Error error) => error.isError)
265-
.toList() as List<_Error>..sort();
262+
.toList()..sort();
266263

267264
double seconds = _stopwatch.elapsedMilliseconds / 1000.0;
268265
print("Parsed ${libraries.length} "
@@ -280,6 +277,23 @@ class DartDoc {
280277
}
281278
}
282279

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

lib/src/package_meta.dart

Lines changed: 35 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,31 @@ 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+
String pubPath =
97+
path.join(path.dirname(Platform.resolvedExecutable), 'pub');
98+
if (Platform.isWindows) pubPath += '.bat';
99+
100+
ProcessResult result =
101+
Process.runSync(pubPath, ['get'], workingDirectory: dir.path);
102+
103+
if (result.stdout.isNotEmpty) {
104+
print(result.stdout.trim());
105+
}
106+
107+
if (result.exitCode != 0) {
108+
StringBuffer buf = new StringBuffer();
109+
buf.writeln('${result.stdout}');
110+
buf.writeln('${result.stderr}');
111+
throw buf.toString().trim();
112+
}
113+
}
114+
87115
@override
88116
String get name => _pubspec['name'];
89117
@override
@@ -126,9 +154,9 @@ class _FilePackageMeta extends PackageMeta {
126154
List<String> getInvalidReasons() {
127155
List<String> reasons = <String>[];
128156
if (_pubspec == null || _pubspec.isEmpty) {
129-
reasons.add('No pubspec.yaml found');
157+
reasons.add('no pubspec.yaml found');
130158
} else if (!_pubspec.containsKey('name')) {
131-
reasons.add('No name found in pubspec.yaml');
159+
reasons.add('no name found in pubspec.yaml');
132160
}
133161
return reasons;
134162
}
@@ -157,6 +185,11 @@ class _SdkMeta extends PackageMeta {
157185
@override
158186
bool get isSdk => true;
159187

188+
@override
189+
void runPubGet() {
190+
throw 'unsupported operation';
191+
}
192+
160193
@override
161194
String get name => 'Dart SDK';
162195
@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/dartdoc_test.dart

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

103103
test('generate docs for package with embedder yaml', () async {
104104
PackageMeta meta = new PackageMeta.fromDir(testPackageWithEmbedderYaml);
105+
if (meta.needsPubGet) meta.runPubGet();
105106
DartDoc dartdoc = new DartDoc(
106107
testPackageWithEmbedderYaml, [], getSdkDir(), [], tempDir, meta, []);
107108

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: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@ 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';
12+
import 'package:analyzer/src/dart/sdk/sdk.dart';
1013
import 'package:analyzer/src/generated/engine.dart';
1114
import 'package:analyzer/src/generated/java_io.dart';
1215
import 'package:analyzer/src/generated/sdk.dart';
13-
import 'package:analyzer/src/generated/sdk_io.dart';
1416
import 'package:analyzer/src/generated/source_io.dart';
1517
import 'package:cli_util/cli_util.dart' as cli_util;
1618
import 'package:dartdoc/src/model.dart';
@@ -34,7 +36,9 @@ void delete(Directory dir) {
3436
}
3537

3638
void init() {
37-
sdkDir = new DirectoryBasedDartSdk(new JavaFile(cli_util.getSdkDir().path));
39+
ResourceProvider resourceProvider = PhysicalResourceProvider.INSTANCE;
40+
sdkDir = new FolderBasedDartSdk(
41+
resourceProvider, resourceProvider.getFolder(cli_util.getSdkDir().path));
3842

3943
analyzerHelper = new AnalyzerHelper();
4044
var pathsForTestLib = [
@@ -69,7 +73,7 @@ class AnalyzerHelper {
6973
AnalyzerHelper() {
7074
List<UriResolver> resolvers = [
7175
new DartUriResolver(sdkDir),
72-
new FileUriResolver()
76+
new ResourceUriResolver(PhysicalResourceProvider.INSTANCE)
7377
];
7478

7579
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)