Skip to content

Commit feab6a9

Browse files
authored
Parameter/Type Parameter handling fixes and reference children refactor (dart-lang#2707)
* It 'works' but no tests for new functionality yet * dartfmt * add tests for type parameters, handle more constructor parameter edge cases * dartfmt rebuild * remove debugging * This was never correct, delete hrefs for type parameters * Correct a problem with inherited docs * Remember, we need both * Remove commented out code block
1 parent 869d41a commit feab6a9

26 files changed

+658
-260
lines changed

lib/dartdoc.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +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;
23+
import 'package:dartdoc/src/matching_link_result.dart';
2424
import 'package:dartdoc/src/model/model.dart';
2525
import 'package:dartdoc/src/package_meta.dart';
2626
import 'package:dartdoc/src/tool_definition.dart';

lib/src/comment_references/model_comment_reference.dart

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ abstract class ModelCommentReference {
1313
// TODO(jcollins-g): rewrite/discard this once default constructor tear-off
1414
// design process is complete.
1515
bool get allowDefaultConstructor;
16+
bool get allowDefaultConstructorParameter;
1617
String get codeRef;
1718
bool get hasConstructorHint;
1819
bool get hasCallableHint;
@@ -34,29 +35,43 @@ abstract class ModelCommentReference {
3435
/// and [ResourceProvider] after construction.
3536
class _ModelCommentReferenceImpl implements ModelCommentReference {
3637
bool _allowDefaultConstructor;
37-
@override
38-
bool get allowDefaultConstructor {
39-
if (_allowDefaultConstructor == null) {
40-
_allowDefaultConstructor = false;
41-
var foundFirst = false;
42-
String checkText;
43-
// Check for two identically named identifiers at the end of the
44-
// parse list, skipping over any junk or other nodes.
45-
for (var node in parsed.reversed.whereType<IdentifierNode>()) {
46-
if (foundFirst) {
47-
if (checkText == node.text) {
38+
39+
void _initAllowCache() {
40+
var referencePieces = parsed.whereType<IdentifierNode>().toList();
41+
_allowDefaultConstructor = false;
42+
_allowDefaultConstructorParameter = false;
43+
if (referencePieces.length >= 2) {
44+
IdentifierNode nodeLast;
45+
for (var f in referencePieces) {
46+
if (f.text == nodeLast?.text) {
47+
if (identical(referencePieces.last, f)) {
4848
_allowDefaultConstructor = true;
49+
} else {
50+
_allowDefaultConstructorParameter = true;
4951
}
50-
break;
51-
} else {
52-
foundFirst = true;
53-
checkText = node.text;
5452
}
53+
nodeLast = f;
5554
}
5655
}
56+
}
57+
58+
@override
59+
bool get allowDefaultConstructor {
60+
if (_allowDefaultConstructor == null) {
61+
_initAllowCache();
62+
}
5763
return _allowDefaultConstructor;
5864
}
5965

66+
bool _allowDefaultConstructorParameter;
67+
@override
68+
bool get allowDefaultConstructorParameter {
69+
if (_allowDefaultConstructorParameter == null) {
70+
_initAllowCache();
71+
}
72+
return _allowDefaultConstructorParameter;
73+
}
74+
6075
@override
6176
final String codeRef;
6277

lib/src/element_type.dart

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -202,9 +202,19 @@ class ParameterizedElementType extends DefinedElementType with Rendered {
202202
PackageGraph packageGraph, ModelElement element, ElementType returnedFrom)
203203
: super(type, library, packageGraph, element, returnedFrom);
204204

205+
@override
206+
ParameterizedType get type => super.type;
207+
205208
@override
206209
ElementTypeRenderer<ParameterizedElementType> get _renderer =>
207210
packageGraph.rendererFactory.parameterizedElementTypeRenderer;
211+
212+
Iterable<ElementType> _typeArguments;
213+
@override
214+
Iterable<ElementType> get typeArguments =>
215+
_typeArguments ??= type.typeArguments
216+
.map((f) => ElementType.from(f, library, packageGraph))
217+
.toList(growable: false);
208218
}
209219

210220
/// A [ElementType] whose underlying type was referrred to by a type alias.
@@ -300,14 +310,6 @@ abstract class DefinedElementType extends ElementType {
300310
return canonicalClass?.isPublic ?? false;
301311
}
302312

303-
Iterable<ElementType> _typeArguments;
304-
@override
305-
Iterable<ElementType> get typeArguments =>
306-
_typeArguments ??= (type as ParameterizedType)
307-
.typeArguments
308-
.map((f) => ElementType.from(f, library, packageGraph))
309-
.toList(growable: false);
310-
311313
DartType get _bound => type;
312314

313315
DartType _instantiatedType;
@@ -354,6 +356,9 @@ abstract class DefinedElementType extends ElementType {
354356
return false;
355357
}
356358

359+
@override
360+
Iterable<ElementType> get typeArguments => [];
361+
357362
@override
358363
Map<String, CommentReferable> get referenceChildren =>
359364
modelElement.referenceChildren;
@@ -422,6 +427,13 @@ class CallableElementType extends DefinedElementType with Rendered, Callable {
422427
@override
423428
ElementTypeRenderer<CallableElementType> get _renderer =>
424429
packageGraph.rendererFactory.callableElementTypeRenderer;
430+
431+
Iterable<ElementType> _typeArguments;
432+
@override
433+
Iterable<ElementType> get typeArguments =>
434+
_typeArguments ??= (type.aliasArguments ?? [])
435+
.map((f) => ElementType.from(f, library, packageGraph))
436+
.toList(growable: false);
425437
}
426438

427439
/// A non-callable type backed by a [GenericTypeAliasElement].

lib/src/generator/templates.runtime_renderers.dart

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2660,6 +2660,26 @@ class _Renderer_CommentReferable extends RendererBase<CommentReferable> {
26602660
getters: _invisibleGetters['CommentReferable']));
26612661
},
26622662
),
2663+
'referenceName': Property(
2664+
getValue: (CT_ c) => c.referenceName,
2665+
renderVariable:
2666+
(CT_ c, Property<CT_> self, List<String> remainingNames) {
2667+
if (remainingNames.isEmpty) {
2668+
return self.getValue(c).toString();
2669+
}
2670+
var name = remainingNames.first;
2671+
var nextProperty =
2672+
_Renderer_String.propertyMap().getValue(name);
2673+
return nextProperty.renderVariable(self.getValue(c),
2674+
nextProperty, [...remainingNames.skip(1)]);
2675+
},
2676+
isNullValue: (CT_ c) => c.referenceName == null,
2677+
renderValue: (CT_ c, RendererBase<CT_> r,
2678+
List<MustachioNode> ast, StringSink sink) {
2679+
_render_String(c.referenceName, ast, r.template, sink,
2680+
parent: r);
2681+
},
2682+
),
26632683
'referenceParents': Property(
26642684
getValue: (CT_ c) => c.referenceParents,
26652685
renderVariable: (CT_ c, Property<CT_> self,
@@ -2965,6 +2985,26 @@ class _Renderer_Constructor extends RendererBase<Constructor> {
29652985
parent: r, getters: _invisibleGetters['Map']);
29662986
},
29672987
),
2988+
'referenceName': Property(
2989+
getValue: (CT_ c) => c.referenceName,
2990+
renderVariable:
2991+
(CT_ c, Property<CT_> self, List<String> remainingNames) {
2992+
if (remainingNames.isEmpty) {
2993+
return self.getValue(c).toString();
2994+
}
2995+
var name = remainingNames.first;
2996+
var nextProperty =
2997+
_Renderer_String.propertyMap().getValue(name);
2998+
return nextProperty.renderVariable(self.getValue(c),
2999+
nextProperty, [...remainingNames.skip(1)]);
3000+
},
3001+
isNullValue: (CT_ c) => c.referenceName == null,
3002+
renderValue: (CT_ c, RendererBase<CT_> r,
3003+
List<MustachioNode> ast, StringSink sink) {
3004+
_render_String(c.referenceName, ast, r.template, sink,
3005+
parent: r);
3006+
},
3007+
),
29683008
'shortName': Property(
29693009
getValue: (CT_ c) => c.shortName,
29703010
renderVariable:
@@ -10445,6 +10485,26 @@ class _Renderer_Operator extends RendererBase<Operator> {
1044510485
_render_String(c.name, ast, r.template, sink, parent: r);
1044610486
},
1044710487
),
10488+
'referenceName': Property(
10489+
getValue: (CT_ c) => c.referenceName,
10490+
renderVariable:
10491+
(CT_ c, Property<CT_> self, List<String> remainingNames) {
10492+
if (remainingNames.isEmpty) {
10493+
return self.getValue(c).toString();
10494+
}
10495+
var name = remainingNames.first;
10496+
var nextProperty =
10497+
_Renderer_String.propertyMap().getValue(name);
10498+
return nextProperty.renderVariable(self.getValue(c),
10499+
nextProperty, [...remainingNames.skip(1)]);
10500+
},
10501+
isNullValue: (CT_ c) => c.referenceName == null,
10502+
renderValue: (CT_ c, RendererBase<CT_> r,
10503+
List<MustachioNode> ast, StringSink sink) {
10504+
_render_String(c.referenceName, ast, r.template, sink,
10505+
parent: r);
10506+
},
10507+
),
1044810508
});
1044910509

1045010510
_Renderer_Operator(Operator context, RendererBase<Object> parent,
@@ -11148,6 +11208,26 @@ class _Renderer_Package extends RendererBase<Package> {
1114811208
parent: r, getters: _invisibleGetters['Map']);
1114911209
},
1115011210
),
11211+
'referenceName': Property(
11212+
getValue: (CT_ c) => c.referenceName,
11213+
renderVariable:
11214+
(CT_ c, Property<CT_> self, List<String> remainingNames) {
11215+
if (remainingNames.isEmpty) {
11216+
return self.getValue(c).toString();
11217+
}
11218+
var name = remainingNames.first;
11219+
var nextProperty =
11220+
_Renderer_String.propertyMap().getValue(name);
11221+
return nextProperty.renderVariable(self.getValue(c),
11222+
nextProperty, [...remainingNames.skip(1)]);
11223+
},
11224+
isNullValue: (CT_ c) => c.referenceName == null,
11225+
renderValue: (CT_ c, RendererBase<CT_> r,
11226+
List<MustachioNode> ast, StringSink sink) {
11227+
_render_String(c.referenceName, ast, r.template, sink,
11228+
parent: r);
11229+
},
11230+
),
1115111231
'referenceParents': Property(
1115211232
getValue: (CT_ c) => c.referenceParents,
1115311233
renderVariable: (CT_ c, Property<CT_> self,
@@ -11726,6 +11806,33 @@ class _Renderer_ParameterizedElementType
1172611806
() => {
1172711807
..._Renderer_DefinedElementType.propertyMap<CT_>(),
1172811808
..._Renderer_Rendered.propertyMap<CT_>(),
11809+
'type': Property(
11810+
getValue: (CT_ c) => c.type,
11811+
renderVariable: (CT_ c, Property<CT_> self,
11812+
List<String> remainingNames) =>
11813+
self.renderSimpleVariable(
11814+
c, remainingNames, 'ParameterizedType'),
11815+
isNullValue: (CT_ c) => c.type == null,
11816+
renderValue: (CT_ c, RendererBase<CT_> r,
11817+
List<MustachioNode> ast, StringSink sink) {
11818+
renderSimple(c.type, ast, r.template, sink,
11819+
parent: r,
11820+
getters: _invisibleGetters['ParameterizedType']);
11821+
},
11822+
),
11823+
'typeArguments': Property(
11824+
getValue: (CT_ c) => c.typeArguments,
11825+
renderVariable: (CT_ c, Property<CT_> self,
11826+
List<String> remainingNames) =>
11827+
self.renderSimpleVariable(
11828+
c, remainingNames, 'Iterable<ElementType>'),
11829+
renderIterable: (CT_ c, RendererBase<CT_> r,
11830+
List<MustachioNode> ast, StringSink sink) {
11831+
return c.typeArguments.map((e) => _render_ElementType(
11832+
e, ast, r.template, sink,
11833+
parent: r));
11834+
},
11835+
),
1172911836
});
1173011837

1173111838
_Renderer_ParameterizedElementType(ParameterizedElementType context,
@@ -13849,6 +13956,26 @@ class _Renderer_TypeParameter extends RendererBase<TypeParameter> {
1384913956
parent: r, getters: _invisibleGetters['Map']);
1385013957
},
1385113958
),
13959+
'referenceName': Property(
13960+
getValue: (CT_ c) => c.referenceName,
13961+
renderVariable:
13962+
(CT_ c, Property<CT_> self, List<String> remainingNames) {
13963+
if (remainingNames.isEmpty) {
13964+
return self.getValue(c).toString();
13965+
}
13966+
var name = remainingNames.first;
13967+
var nextProperty =
13968+
_Renderer_String.propertyMap().getValue(name);
13969+
return nextProperty.renderVariable(self.getValue(c),
13970+
nextProperty, [...remainingNames.skip(1)]);
13971+
},
13972+
isNullValue: (CT_ c) => c.referenceName == null,
13973+
renderValue: (CT_ c, RendererBase<CT_> r,
13974+
List<MustachioNode> ast, StringSink sink) {
13975+
_render_String(c.referenceName, ast, r.template, sink,
13976+
parent: r);
13977+
},
13978+
),
1385213979
'referenceParents': Property(
1385313980
getValue: (CT_ c) => c.referenceParents,
1385413981
renderVariable: (CT_ c, Property<CT_> self,
@@ -14615,6 +14742,7 @@ const _invisibleGetters = {
1461514742
'referenceChildren',
1461614743
'referenceParents',
1461714744
'referenceGrandparentOverrides',
14745+
'referenceName',
1461814746
'library',
1461914747
'element',
1462014748
'packageGraph'
@@ -15202,6 +15330,7 @@ const _invisibleGetters = {
1520215330
'parameterKind',
1520315331
'parameters'
1520415332
},
15333+
'ParameterizedType': {'hashCode', 'runtimeType', 'typeArguments'},
1520515334
'PropertyAccessorElement': {
1520615335
'hashCode',
1520715336
'runtimeType',

0 commit comments

Comments
 (0)