Skip to content

Commit e02a1cf

Browse files
authored
Merge pull request #2782 from jcollins-g/nnbd-mastermerge-0913
Merge master into nnbd
2 parents ee708e3 + 7d1ec5d commit e02a1cf

File tree

10 files changed

+113
-5
lines changed

10 files changed

+113
-5
lines changed

example/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ in the Dart ecosystem.
99

1010
The Dart team builds docs for the [Dart API reference](https://api.dart.dev/)
1111
with each new version of the SDK, via
12-
[this script](https://github.com/dart-lang/sdk/blob/master/tools/bots/dart_sdk.py).
12+
[this script](https://github.com/dart-lang/sdk/blob/main/tools/bots/dart_sdk.py).
1313
Look for `BuildDartdocAPIDocs`.
1414

1515
## Flutter

lib/src/dartdoc_options.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1240,7 +1240,7 @@ class DartdocOptionContext extends DartdocOptionContextBase
12401240
List<String> get excludePackages =>
12411241
optionSet['excludePackages'].valueAt(context);
12421242

1243-
String get flutterRoot => optionSet['flutterRoot'].valueAt(context);
1243+
String? get flutterRoot => optionSet['flutterRoot'].valueAt(context);
12441244

12451245
bool get hideSdkText => optionSet['hideSdkText'].valueAt(context);
12461246

lib/src/experiment_options.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
///
88
/// Implementation of Dart language experiment option handling for dartdoc.
9-
/// See https://github.com/dart-lang/sdk/blob/master/docs/process/experimental-flags.md.
9+
/// See https://github.com/dart-lang/sdk/blob/main/docs/process/experimental-flags.md.
1010
///
1111
library dartdoc.experiment_options;
1212

lib/src/model/package_graph.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import 'package:analyzer/file_system/file_system.dart';
1212
import 'package:analyzer/src/generated/sdk.dart';
1313
import 'package:analyzer/src/generated/source.dart';
1414
import 'package:analyzer/src/generated/source_io.dart';
15+
import 'package:dartdoc/dartdoc.dart' show DartdocFailure;
1516
import 'package:dartdoc/src/dartdoc_options.dart';
1617
import 'package:dartdoc/src/logging.dart';
1718
import 'package:dartdoc/src/model/comment_referable.dart';
@@ -65,6 +66,10 @@ class PackageGraph with CommentReferable, Nameable {
6566
var libraryElement = resolvedLibrary.element;
6667
var packageMeta =
6768
packageMetaProvider.fromElement(libraryElement, config.sdkDir);
69+
if (packageMeta == null) {
70+
throw DartdocFailure(packageMetaProvider.getMessageForMissingPackageMeta(
71+
libraryElement, config));
72+
}
6873
var lib = Library.fromLibraryResult(
6974
resolvedLibrary, this, Package.fromPackageMeta(packageMeta, this));
7075
packageMap[packageMeta.name].libraries.add(lib);

lib/src/package_meta.dart

Lines changed: 29 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,30 @@ 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);
6972
PackageMeta? fromFilename(String s) => _fromFilename(s, resourceProvider);
7073
PackageMeta? fromDir(Folder dir) => _fromDir(dir, resourceProvider);
7174

75+
String getMessageForMissingPackageMeta(
76+
LibraryElement library, DartdocOptionContext optionContext) =>
77+
_messageForMissingPackageMeta(library, optionContext);
78+
7279
PackageMetaProvider(this._fromElement, this._fromFilename, this._fromDir,
7380
this.resourceProvider, this.defaultSdkDir,
74-
{this.defaultSdk});
81+
{this.defaultSdk,
82+
String Function(LibraryElement, DartdocOptionContext)?
83+
messageForMissingPackageMeta})
84+
: _messageForMissingPackageMeta = messageForMissingPackageMeta ??
85+
_defaultMessageForMissingPackageMeta;
86+
87+
static String _defaultMessageForMissingPackageMeta(
88+
LibraryElement library, DartdocOptionContext optionContext) {
89+
return 'Unknown package for library: ${library.source.fullName}';
90+
}
7591
}
7692

7793
/// Describes a single package in the context of `dartdoc`.
@@ -252,6 +268,17 @@ abstract class PubPackageMeta extends PackageMeta {
252268
return _packageMetaCache[pathContext.absolute(folder.path)];
253269
}
254270

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

test/documentation_comment_test.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ void main() {
5252
resourceProvider,
5353
sdkFolder,
5454
defaultSdk: mockSdk,
55+
messageForMissingPackageMeta:
56+
PubPackageMeta.messageForMissingPackageMeta,
5557
);
5658
var optionSet = await DartdocOptionRoot.fromOptionGenerators(
5759
'dartdoc', [createDartdocOptions], packageMetaProvider);

test/end2end/model_special_cases_test.dart

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,49 @@ void main() {
230230
expect(referenceLookup(A, 'new'), equals(MatchingLinkResult(null)));
231231
expect(referenceLookup(At, 'new'), equals(MatchingLinkResult(null)));
232232
});
233+
234+
test('constant rendering', () {
235+
TopLevelVariable aFunc,
236+
aFuncParams,
237+
aTearOffDefaultConstructor,
238+
aTearOffNonDefaultConstructor,
239+
aTearOffNonDefaultConstructorInt,
240+
aTearOffDefaultConstructorArgs;
241+
TopLevelVariable aTearOffDefaultConstructorTypedef;
242+
aFunc =
243+
constructorTearoffs.constants.firstWhere((c) => c.name == 'aFunc');
244+
aFuncParams = constructorTearoffs.constants
245+
.firstWhere((c) => c.name == 'aFuncParams');
246+
aTearOffDefaultConstructor = constructorTearoffs.constants
247+
.firstWhere((c) => c.name == 'aTearOffDefaultConstructor');
248+
aTearOffNonDefaultConstructor = constructorTearoffs.constants
249+
.firstWhere((c) => c.name == 'aTearOffNonDefaultConstructor');
250+
aTearOffNonDefaultConstructorInt = constructorTearoffs.constants
251+
.firstWhere((c) => c.name == 'aTearOffNonDefaultConstructorInt');
252+
aTearOffDefaultConstructorArgs = constructorTearoffs.constants
253+
.firstWhere((c) => c.name == 'aTearOffDefaultConstructorArgs');
254+
aTearOffDefaultConstructorTypedef = constructorTearoffs.constants
255+
.firstWhere((c) => c.name == 'aTearOffDefaultConstructorTypedef');
256+
257+
expect(aFunc.constantValue, equals('func'));
258+
expect(aFuncParams.constantValue, equals('funcTypeParams'));
259+
// Does not work @ analyzer 2.2
260+
//expect(aFuncWithArgs.constantValue, equals('funcTypeParams&lt;String, int&gt;'));
261+
262+
expect(aTearOffDefaultConstructor.constantValue, equals('F.new'));
263+
expect(aTearOffNonDefaultConstructor.constantValue,
264+
equals('F.alternative'));
265+
expect(aTearOffNonDefaultConstructorInt.constantValue,
266+
equals('F&lt;int&gt;.alternative'));
267+
expect(aTearOffDefaultConstructorArgs.constantValue,
268+
equals('F&lt;String&gt;.new'));
269+
270+
expect(aTearOffDefaultConstructorTypedef.constantValue,
271+
equals('Fstring.new'));
272+
// Does not work @ analyzer 2.2
273+
//expect(aTearOffDefaultConstructorArgsTypedef.constantValue,
274+
// equals('Ft&lt;String&gt;.new'));
275+
});
233276
}, skip: !_constructorTearoffsAllowed.allows(utils.platformVersion));
234277
});
235278

test/end2end/model_test.dart

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

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

test/src/utils.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ PackageMetaProvider get testPackageMetaProvider {
9595
resourceProvider,
9696
sdkFolder,
9797
defaultSdk: mockSdk,
98+
messageForMissingPackageMeta: PubPackageMeta.messageForMissingPackageMeta,
9899
);
99100
}
100101

testing/test_package_experiments/lib/constructor_tearoffs.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ class F<T> {
4646
F() {
4747
print('I too am a valid constructor invocation with this feature.');
4848
}
49+
50+
F.alternative() {}
4951
}
5052

5153
typedef Ft = F;
@@ -59,3 +61,21 @@ typedef NotAClass = Function;
5961
/// Mixins don't have constructors either, so disallow `M.new`.
6062
mixin M<T> on C {
6163
}
64+
65+
void func() {}
66+
void funcTypeParams<T extends String, U extends num>(T something, U different) {}
67+
68+
const aFunc = func;
69+
const aFuncParams = funcTypeParams;
70+
// TODO(jcollins-g): does not work @ analyzer 2.2
71+
//const aFuncWithArgs = funcTypeParams<String, int>;
72+
73+
const aTearOffDefaultConstructor = F.new;
74+
const aTearOffNonDefaultConstructor = F.alternative;
75+
const aTearOffNonDefaultConstructorInt = F<int>.alternative;
76+
const aTearOffDefaultConstructorArgs = F<String>.new;
77+
78+
const aTearOffDefaultConstructorTypedef = Fstring.new;
79+
80+
// TODO(jcollins-g): does not work @ analyzer 2.2
81+
//const aTearOffDefaultConstructorArgsTypedef = Ft<String>.new;

0 commit comments

Comments
 (0)