Skip to content

Commit f9a875d

Browse files
authored
Steel thread for new lookup code (#2622)
* Squash the large number of merges * test tweaks * Rename comment_reference.dart and get some of the threads through to markdown_processor * Finalize the first pass of the new lookup code * Improve stats by ignoring parameter resolution differences in equivalence (parameters can't be linked to) * more stats tweaks * first batch of comments * review comments * href -> null on parameters * Fix count yet again * tweak
1 parent 6446a92 commit f9a875d

35 files changed

+1259
-121
lines changed

lib/dartdoc.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import 'package:dartdoc/src/generator/generator.dart';
2020
import 'package:dartdoc/src/generator/html_generator.dart';
2121
import 'package:dartdoc/src/generator/markdown_generator.dart';
2222
import 'package:dartdoc/src/logging.dart';
23+
import 'package:dartdoc/src/markdown_processor.dart' show markdownStats;
2324
import 'package:dartdoc/src/model/model.dart';
2425
import 'package:dartdoc/src/package_meta.dart';
2526
import 'package:dartdoc/src/tool_runner.dart';
@@ -207,6 +208,10 @@ class Dartdoc {
207208
libs = packageGraph.localPublicLibraries.length;
208209
logInfo("Documented $libs public librar${libs == 1 ? 'y' : 'ies'} "
209210
'in ${seconds.toStringAsFixed(1)} seconds');
211+
212+
if (config.showStats) {
213+
logInfo(markdownStats.buildReport());
214+
}
210215
return DartdocResults(config.topLevelPackageMeta, packageGraph, outputDir);
211216
}
212217

lib/src/dartdoc_options.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1496,6 +1496,9 @@ class DartdocOptionContext extends DartdocOptionContextBase
14961496
List<String> get excludePackages =>
14971497
optionSet['excludePackages'].valueAt(context);
14981498

1499+
bool get experimentalReferenceLookup =>
1500+
optionSet['experimentalReferenceLookup'].valueAt(context);
1501+
14991502
String get flutterRoot => optionSet['flutterRoot'].valueAt(context);
15001503

15011504
bool get hideSdkText => optionSet['hideSdkText'].valueAt(context);
@@ -1558,6 +1561,8 @@ class DartdocOptionContext extends DartdocOptionContextBase
15581561
bool isPackageExcluded(String name) =>
15591562
excludePackages.any((pattern) => name == pattern);
15601563

1564+
bool get showStats => optionSet['showStats'].valueAt(context);
1565+
15611566
/// Output format, e.g. 'html', 'md'
15621567
String get format => optionSet['format'].valueAt(context);
15631568

@@ -1627,6 +1632,12 @@ Future<List<DartdocOption<Object>>> createDartdocOptions(
16271632
help: 'Library names to ignore.', splitCommas: true),
16281633
DartdocOptionArgOnly<List<String>>('excludePackages', [], resourceProvider,
16291634
help: 'Package names to ignore.', splitCommas: true),
1635+
DartdocOptionArgFile<bool>(
1636+
'experimentalReferenceLookup', false, resourceProvider,
1637+
hide: true,
1638+
help:
1639+
'Use an experimental code path to resolve comment reference lookups',
1640+
negatable: true),
16301641
// This could be a ArgOnly, but trying to not provide too many ways
16311642
// to set the flutter root.
16321643
DartdocOptionSyntheticOnly<String>(
@@ -1799,6 +1810,8 @@ Future<List<DartdocOption<Object>>> createDartdocOptions(
17991810
'pages, and please file an issue on GitHub.',
18001811
negatable: false,
18011812
hide: true),
1813+
DartdocOptionArgOnly<bool>('showStats', false, resourceProvider,
1814+
help: 'Show statistics useful for debugging.', hide: true),
18021815
// TODO(jdkoren): Unhide when we have good support for another format.
18031816
DartdocOptionArgOnly<String>('format', 'html', resourceProvider,
18041817
hide: true),

lib/src/element_type.dart

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,17 @@ library dartdoc.element_type;
88
import 'package:analyzer/dart/element/element.dart';
99
import 'package:analyzer/dart/element/nullability_suffix.dart';
1010
import 'package:analyzer/dart/element/type.dart';
11+
import 'package:dartdoc/src/model/comment_referable.dart';
1112
import 'package:dartdoc/src/model/model.dart';
1213
import 'package:dartdoc/src/render/element_type_renderer.dart';
1314

1415
/// Base class representing a type in Dartdoc. It wraps a [DartType], and
1516
/// may link to a [ModelElement].
16-
abstract class ElementType extends Privacy {
17+
abstract class ElementType extends Privacy with CommentReferable, Nameable {
1718
final DartType _type;
1819
final PackageGraph packageGraph;
1920
final ElementType returnedFrom;
21+
@override
2022
final Library library;
2123

2224
ElementType(this._type, this.library, this.packageGraph, this.returnedFrom);
@@ -73,8 +75,6 @@ abstract class ElementType extends Privacy {
7375

7476
String get linkedName;
7577

76-
String get name;
77-
7878
/// Name with generics and nullability indication.
7979
String get nameWithGenerics;
8080

@@ -113,6 +113,9 @@ class UndefinedElementType extends ElementType {
113113
ElementType returnedFrom)
114114
: super(f, library, packageGraph, returnedFrom);
115115

116+
@override
117+
Element get element => null;
118+
116119
String _linkedName;
117120

118121
@override
@@ -131,7 +134,7 @@ class UndefinedElementType extends ElementType {
131134
bool get isImpliedFuture => (type.isDynamic &&
132135
returnedFrom != null &&
133136
returnedFrom is DefinedElementType &&
134-
(returnedFrom as DefinedElementType).element.isAsynchronous);
137+
(returnedFrom as DefinedElementType).modelElement.isAsynchronous);
135138

136139
@override
137140
String get nameWithGenerics => '$name$nullabilitySuffix';
@@ -153,6 +156,12 @@ class UndefinedElementType extends ElementType {
153156
@override
154157
String get linkedName => name;
155158

159+
@override
160+
Map<String, CommentReferable> get referenceChildren => {};
161+
162+
@override
163+
Iterable<CommentReferable> get referenceParents => [];
164+
156165
@override
157166
// TODO(jcollins-g): remove the need for an empty list here.
158167
List<Parameter> get parameters => [];
@@ -264,15 +273,18 @@ class TypeParameterElementType extends DefinedElementType {
264273

265274
/// An [ElementType] associated with an [Element].
266275
abstract class DefinedElementType extends ElementType {
267-
final ModelElement _element;
276+
final ModelElement _modelElement;
268277

269278
DefinedElementType(DartType type, Library library, PackageGraph packageGraph,
270-
this._element, ElementType returnedFrom)
279+
this._modelElement, ElementType returnedFrom)
271280
: super(type, library, packageGraph, returnedFrom);
272281

273-
ModelElement get element {
274-
assert(_element != null);
275-
return _element;
282+
@override
283+
Element get element => modelElement.element;
284+
285+
ModelElement get modelElement {
286+
assert(_modelElement != null);
287+
return _modelElement;
276288
}
277289

278290
@override
@@ -285,20 +297,21 @@ abstract class DefinedElementType extends ElementType {
285297
/// would ordinarily do.
286298
@override
287299
bool get isPublic {
288-
Container canonicalClass =
289-
element.packageGraph.findCanonicalModelElementFor(element.element) ??
290-
element;
291-
return canonicalClass.isPublic;
300+
Container canonicalClass = modelElement.packageGraph
301+
.findCanonicalModelElementFor(modelElement.element) ??
302+
modelElement;
303+
return canonicalClass?.isPublic ?? false;
292304
}
293305

294306
@override
295-
bool get isTypedef => element is Typedef || element is ModelFunctionTypedef;
307+
bool get isTypedef =>
308+
modelElement is Typedef || modelElement is ModelFunctionTypedef;
296309

297310
@override
298311
List<Parameter> get parameters =>
299-
element.isCallable ? element.parameters : [];
312+
modelElement.isCallable ? modelElement.parameters : [];
300313

301-
ModelElement get returnElement => element;
314+
ModelElement get returnElement => modelElement;
302315
ElementType _returnType;
303316
ElementType get returnType {
304317
_returnType ??= ElementType.from(type, library, packageGraph, this);
@@ -359,14 +372,22 @@ abstract class DefinedElementType extends ElementType {
359372
}
360373
return false;
361374
}
375+
376+
@override
377+
Map<String, CommentReferable> get referenceChildren =>
378+
modelElement.referenceChildren;
379+
380+
@override
381+
Iterable<CommentReferable> get referenceParents =>
382+
modelElement.referenceParents;
362383
}
363384

364385
/// Any callable ElementType will mix-in this class, whether anonymous or not.
365386
abstract class CallableElementTypeMixin implements ElementType {
366387
Iterable<ElementType> _typeArguments;
367388

368389
ModelElement get returnElement => returnType is DefinedElementType
369-
? (returnType as DefinedElementType).element
390+
? (returnType as DefinedElementType).modelElement
370391
: null;
371392

372393
ElementType _returnType;

0 commit comments

Comments
 (0)