Skip to content

Commit 63c384f

Browse files
authored
Add a message for the package not found case to help users (#2781)
* Add a message for the package not found case to help users * We don't need all of dartdoc.dart
1 parent 51776f2 commit 63c384f

File tree

5 files changed

+55
-9
lines changed

5 files changed

+55
-9
lines changed

lib/src/model/package_graph.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import 'package:analyzer/file_system/file_system.dart';
1010
import 'package:analyzer/src/generated/sdk.dart';
1111
import 'package:analyzer/src/generated/source.dart';
1212
import 'package:analyzer/src/generated/source_io.dart';
13+
import 'package:dartdoc/dartdoc.dart' show DartdocFailure;
1314
import 'package:dartdoc/src/dartdoc_options.dart';
1415
import 'package:dartdoc/src/logging.dart';
1516
import 'package:dartdoc/src/model/comment_referable.dart';
@@ -63,6 +64,10 @@ class PackageGraph with CommentReferable, Nameable {
6364
var libraryElement = resolvedLibrary.element;
6465
var packageMeta =
6566
packageMetaProvider.fromElement(libraryElement, config.sdkDir);
67+
if (packageMeta == null) {
68+
throw DartdocFailure(packageMetaProvider.getMessageForMissingPackageMeta(
69+
libraryElement, config));
70+
}
6671
var lib = Library.fromLibraryResult(
6772
resolvedLibrary, this, Package.fromPackageMeta(packageMeta, this));
6873
packageMap[packageMeta.name].libraries.add(lib);

lib/src/package_meta.dart

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ final PackageMetaProvider pubPackageMetaProvider = PackageMetaProvider(
4444
.getFile(PhysicalResourceProvider.INSTANCE.pathContext
4545
.absolute(Platform.resolvedExecutable))
4646
.parent2
47-
.parent2);
47+
.parent2,
48+
messageForMissingPackageMeta: PubPackageMeta.messageForMissingPackageMeta);
4849

4950
/// Sets the supported way of constructing [PackageMeta] objects.
5051
///
@@ -63,15 +64,32 @@ class PackageMetaProvider {
6364
_fromElement;
6465
final PackageMeta Function(String, ResourceProvider) _fromFilename;
6566
final PackageMeta Function(Folder, ResourceProvider) _fromDir;
67+
final String Function(LibraryElement, DartdocOptionContext)
68+
_messageForMissingPackageMeta;
6669

6770
PackageMeta fromElement(LibraryElement library, String s) =>
6871
_fromElement(library, s, resourceProvider);
72+
6973
PackageMeta fromFilename(String s) => _fromFilename(s, resourceProvider);
74+
7075
PackageMeta fromDir(Folder dir) => _fromDir(dir, resourceProvider);
7176

77+
String getMessageForMissingPackageMeta(
78+
LibraryElement library, DartdocOptionContext optionContext) =>
79+
_messageForMissingPackageMeta(library, optionContext);
80+
7281
PackageMetaProvider(this._fromElement, this._fromFilename, this._fromDir,
7382
this.resourceProvider, this.defaultSdkDir,
74-
{this.defaultSdk});
83+
{this.defaultSdk,
84+
Function(LibraryElement, DartdocOptionContext)
85+
messageForMissingPackageMeta})
86+
: _messageForMissingPackageMeta = messageForMissingPackageMeta ??
87+
_defaultMessageForMissingPackageMeta;
88+
89+
static String _defaultMessageForMissingPackageMeta(
90+
LibraryElement library, DartdocOptionContext optionContext) {
91+
return 'Unknown package for library: ${library.source.fullName}';
92+
}
7593
}
7694

7795
/// Describes a single package in the context of `dartdoc`.
@@ -255,6 +273,17 @@ abstract class PubPackageMeta extends PackageMeta {
255273
return _packageMetaCache[pathContext.absolute(folder.path)];
256274
}
257275

276+
/// Create a helpful user error message for a case where a package can not
277+
/// be found.
278+
static String messageForMissingPackageMeta(
279+
LibraryElement library, DartdocOptionContext optionContext) {
280+
var libraryString = library.librarySource.fullName;
281+
var dartOrFlutter = optionContext.flutterRoot == null ? 'dart' : 'flutter';
282+
return 'Unknown package for library: $libraryString. Consider `$dartOrFlutter pub get` and/or '
283+
'`$dartOrFlutter pub global deactivate dartdoc` followed by `$dartOrFlutter pub global activate dartdoc` to fix. '
284+
'Also, be sure that `$dartOrFlutter analyze` completes without errors.';
285+
}
286+
258287
@override
259288
String sdkType(String flutterRootPath) {
260289
if (flutterRootPath != null) {

test/documentation_comment_test.dart

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,14 @@ void main() {
4444
sdkFolder = utils.writeMockSdkFiles(mockSdk);
4545

4646
packageMetaProvider = PackageMetaProvider(
47-
PubPackageMeta.fromElement,
48-
PubPackageMeta.fromFilename,
49-
PubPackageMeta.fromDir,
50-
resourceProvider,
51-
sdkFolder,
52-
defaultSdk: mockSdk,
53-
);
47+
PubPackageMeta.fromElement,
48+
PubPackageMeta.fromFilename,
49+
PubPackageMeta.fromDir,
50+
resourceProvider,
51+
sdkFolder,
52+
defaultSdk: mockSdk,
53+
messageForMissingPackageMeta:
54+
PubPackageMeta.messageForMissingPackageMeta);
5455
var optionSet = await DartdocOptionSet.fromOptionGenerators(
5556
'dartdoc', [createDartdocOptions], packageMetaProvider);
5657
optionSet.parseArguments([]);

test/end2end/model_test.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,16 @@ void main() {
9393
packageGraph.libraries.firstWhere((lib) => lib.name == 'base_class');
9494
});
9595

96+
group('PackageMeta and PackageGraph integration', () {
97+
test('PackageMeta error messages generate correctly', () {
98+
var message = packageGraph.packageMetaProvider
99+
.getMessageForMissingPackageMeta(
100+
fakeLibrary.element, packageGraph.config);
101+
expect(message, contains('fake.dart'));
102+
expect(message, contains('pub global activate dartdoc'));
103+
});
104+
});
105+
96106
group('triple-shift', () {
97107
Library tripleShift;
98108
Class C, E, F;

test/src/utils.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ PackageMetaProvider get testPackageMetaProvider {
9393
resourceProvider,
9494
sdkFolder,
9595
defaultSdk: mockSdk,
96+
messageForMissingPackageMeta: PubPackageMeta.messageForMissingPackageMeta,
9697
);
9798
}
9899

0 commit comments

Comments
 (0)