Skip to content

Parameter/Type Parameter handling fixes and reference children refactor #2707

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 13 commits into from
Jun 28, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib/dartdoc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import 'package:dartdoc/src/generator/generator.dart';
import 'package:dartdoc/src/generator/html_generator.dart';
import 'package:dartdoc/src/generator/markdown_generator.dart';
import 'package:dartdoc/src/logging.dart';
import 'package:dartdoc/src/markdown_processor.dart' show markdownStats;
import 'package:dartdoc/src/matching_link_result.dart';
import 'package:dartdoc/src/model/model.dart';
import 'package:dartdoc/src/package_meta.dart';
import 'package:dartdoc/src/tool_definition.dart';
Expand Down
45 changes: 30 additions & 15 deletions lib/src/comment_references/model_comment_reference.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ abstract class ModelCommentReference {
// TODO(jcollins-g): rewrite/discard this once default constructor tear-off
// design process is complete.
bool get allowDefaultConstructor;
bool get allowDefaultConstructorParameter;
String get codeRef;
bool get hasConstructorHint;
bool get hasCallableHint;
Expand All @@ -34,29 +35,43 @@ abstract class ModelCommentReference {
/// and [ResourceProvider] after construction.
class _ModelCommentReferenceImpl implements ModelCommentReference {
bool _allowDefaultConstructor;
@override
bool get allowDefaultConstructor {
if (_allowDefaultConstructor == null) {
_allowDefaultConstructor = false;
var foundFirst = false;
String checkText;
// Check for two identically named identifiers at the end of the
// parse list, skipping over any junk or other nodes.
for (var node in parsed.reversed.whereType<IdentifierNode>()) {
if (foundFirst) {
if (checkText == node.text) {

void _initAllowCache() {
var referencePieces = parsed.whereType<IdentifierNode>().toList();
_allowDefaultConstructor = false;
_allowDefaultConstructorParameter = false;
if (referencePieces.length >= 2) {
IdentifierNode nodeLast;
for (var f in referencePieces) {
if (f.text == nodeLast?.text) {
if (identical(referencePieces.last, f)) {
_allowDefaultConstructor = true;
} else {
_allowDefaultConstructorParameter = true;
}
break;
} else {
foundFirst = true;
checkText = node.text;
}
nodeLast = f;
}
}
}

@override
bool get allowDefaultConstructor {
if (_allowDefaultConstructor == null) {
_initAllowCache();
}
return _allowDefaultConstructor;
}

bool _allowDefaultConstructorParameter;
@override
bool get allowDefaultConstructorParameter {
if (_allowDefaultConstructorParameter == null) {
_initAllowCache();
}
return _allowDefaultConstructorParameter;
}

@override
final String codeRef;

Expand Down
28 changes: 20 additions & 8 deletions lib/src/element_type.dart
Original file line number Diff line number Diff line change
Expand Up @@ -202,9 +202,19 @@ class ParameterizedElementType extends DefinedElementType with Rendered {
PackageGraph packageGraph, ModelElement element, ElementType returnedFrom)
: super(type, library, packageGraph, element, returnedFrom);

@override
ParameterizedType get type => super.type;

@override
ElementTypeRenderer<ParameterizedElementType> get _renderer =>
packageGraph.rendererFactory.parameterizedElementTypeRenderer;

Iterable<ElementType> _typeArguments;
@override
Iterable<ElementType> get typeArguments =>
_typeArguments ??= type.typeArguments
.map((f) => ElementType.from(f, library, packageGraph))
.toList(growable: false);
}

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

Iterable<ElementType> _typeArguments;
@override
Iterable<ElementType> get typeArguments =>
_typeArguments ??= (type as ParameterizedType)
.typeArguments
.map((f) => ElementType.from(f, library, packageGraph))
.toList(growable: false);

DartType get _bound => type;

DartType _instantiatedType;
Expand Down Expand Up @@ -354,6 +356,9 @@ abstract class DefinedElementType extends ElementType {
return false;
}

@override
Iterable<ElementType> get typeArguments => [];

@override
Map<String, CommentReferable> get referenceChildren =>
modelElement.referenceChildren;
Expand Down Expand Up @@ -422,6 +427,13 @@ class CallableElementType extends DefinedElementType with Rendered, Callable {
@override
ElementTypeRenderer<CallableElementType> get _renderer =>
packageGraph.rendererFactory.callableElementTypeRenderer;

Iterable<ElementType> _typeArguments;
@override
Iterable<ElementType> get typeArguments =>
_typeArguments ??= (type.aliasArguments ?? [])
.map((f) => ElementType.from(f, library, packageGraph))
.toList(growable: false);
}

/// A non-callable type backed by a [GenericTypeAliasElement].
Expand Down
129 changes: 129 additions & 0 deletions lib/src/generator/templates.runtime_renderers.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2660,6 +2660,26 @@ class _Renderer_CommentReferable extends RendererBase<CommentReferable> {
getters: _invisibleGetters['CommentReferable']));
},
),
'referenceName': Property(
getValue: (CT_ c) => c.referenceName,
renderVariable:
(CT_ c, Property<CT_> self, List<String> remainingNames) {
if (remainingNames.isEmpty) {
return self.getValue(c).toString();
}
var name = remainingNames.first;
var nextProperty =
_Renderer_String.propertyMap().getValue(name);
return nextProperty.renderVariable(self.getValue(c),
nextProperty, [...remainingNames.skip(1)]);
},
isNullValue: (CT_ c) => c.referenceName == null,
renderValue: (CT_ c, RendererBase<CT_> r,
List<MustachioNode> ast, StringSink sink) {
_render_String(c.referenceName, ast, r.template, sink,
parent: r);
},
),
'referenceParents': Property(
getValue: (CT_ c) => c.referenceParents,
renderVariable: (CT_ c, Property<CT_> self,
Expand Down Expand Up @@ -2965,6 +2985,26 @@ class _Renderer_Constructor extends RendererBase<Constructor> {
parent: r, getters: _invisibleGetters['Map']);
},
),
'referenceName': Property(
getValue: (CT_ c) => c.referenceName,
renderVariable:
(CT_ c, Property<CT_> self, List<String> remainingNames) {
if (remainingNames.isEmpty) {
return self.getValue(c).toString();
}
var name = remainingNames.first;
var nextProperty =
_Renderer_String.propertyMap().getValue(name);
return nextProperty.renderVariable(self.getValue(c),
nextProperty, [...remainingNames.skip(1)]);
},
isNullValue: (CT_ c) => c.referenceName == null,
renderValue: (CT_ c, RendererBase<CT_> r,
List<MustachioNode> ast, StringSink sink) {
_render_String(c.referenceName, ast, r.template, sink,
parent: r);
},
),
'shortName': Property(
getValue: (CT_ c) => c.shortName,
renderVariable:
Expand Down Expand Up @@ -10445,6 +10485,26 @@ class _Renderer_Operator extends RendererBase<Operator> {
_render_String(c.name, ast, r.template, sink, parent: r);
},
),
'referenceName': Property(
getValue: (CT_ c) => c.referenceName,
renderVariable:
(CT_ c, Property<CT_> self, List<String> remainingNames) {
if (remainingNames.isEmpty) {
return self.getValue(c).toString();
}
var name = remainingNames.first;
var nextProperty =
_Renderer_String.propertyMap().getValue(name);
return nextProperty.renderVariable(self.getValue(c),
nextProperty, [...remainingNames.skip(1)]);
},
isNullValue: (CT_ c) => c.referenceName == null,
renderValue: (CT_ c, RendererBase<CT_> r,
List<MustachioNode> ast, StringSink sink) {
_render_String(c.referenceName, ast, r.template, sink,
parent: r);
},
),
});

_Renderer_Operator(Operator context, RendererBase<Object> parent,
Expand Down Expand Up @@ -11148,6 +11208,26 @@ class _Renderer_Package extends RendererBase<Package> {
parent: r, getters: _invisibleGetters['Map']);
},
),
'referenceName': Property(
getValue: (CT_ c) => c.referenceName,
renderVariable:
(CT_ c, Property<CT_> self, List<String> remainingNames) {
if (remainingNames.isEmpty) {
return self.getValue(c).toString();
}
var name = remainingNames.first;
var nextProperty =
_Renderer_String.propertyMap().getValue(name);
return nextProperty.renderVariable(self.getValue(c),
nextProperty, [...remainingNames.skip(1)]);
},
isNullValue: (CT_ c) => c.referenceName == null,
renderValue: (CT_ c, RendererBase<CT_> r,
List<MustachioNode> ast, StringSink sink) {
_render_String(c.referenceName, ast, r.template, sink,
parent: r);
},
),
'referenceParents': Property(
getValue: (CT_ c) => c.referenceParents,
renderVariable: (CT_ c, Property<CT_> self,
Expand Down Expand Up @@ -11726,6 +11806,33 @@ class _Renderer_ParameterizedElementType
() => {
..._Renderer_DefinedElementType.propertyMap<CT_>(),
..._Renderer_Rendered.propertyMap<CT_>(),
'type': Property(
getValue: (CT_ c) => c.type,
renderVariable: (CT_ c, Property<CT_> self,
List<String> remainingNames) =>
self.renderSimpleVariable(
c, remainingNames, 'ParameterizedType'),
isNullValue: (CT_ c) => c.type == null,
renderValue: (CT_ c, RendererBase<CT_> r,
List<MustachioNode> ast, StringSink sink) {
renderSimple(c.type, ast, r.template, sink,
parent: r,
getters: _invisibleGetters['ParameterizedType']);
},
),
'typeArguments': Property(
getValue: (CT_ c) => c.typeArguments,
renderVariable: (CT_ c, Property<CT_> self,
List<String> remainingNames) =>
self.renderSimpleVariable(
c, remainingNames, 'Iterable<ElementType>'),
renderIterable: (CT_ c, RendererBase<CT_> r,
List<MustachioNode> ast, StringSink sink) {
return c.typeArguments.map((e) => _render_ElementType(
e, ast, r.template, sink,
parent: r));
},
),
});

_Renderer_ParameterizedElementType(ParameterizedElementType context,
Expand Down Expand Up @@ -13849,6 +13956,26 @@ class _Renderer_TypeParameter extends RendererBase<TypeParameter> {
parent: r, getters: _invisibleGetters['Map']);
},
),
'referenceName': Property(
getValue: (CT_ c) => c.referenceName,
renderVariable:
(CT_ c, Property<CT_> self, List<String> remainingNames) {
if (remainingNames.isEmpty) {
return self.getValue(c).toString();
}
var name = remainingNames.first;
var nextProperty =
_Renderer_String.propertyMap().getValue(name);
return nextProperty.renderVariable(self.getValue(c),
nextProperty, [...remainingNames.skip(1)]);
},
isNullValue: (CT_ c) => c.referenceName == null,
renderValue: (CT_ c, RendererBase<CT_> r,
List<MustachioNode> ast, StringSink sink) {
_render_String(c.referenceName, ast, r.template, sink,
parent: r);
},
),
'referenceParents': Property(
getValue: (CT_ c) => c.referenceParents,
renderVariable: (CT_ c, Property<CT_> self,
Expand Down Expand Up @@ -14615,6 +14742,7 @@ const _invisibleGetters = {
'referenceChildren',
'referenceParents',
'referenceGrandparentOverrides',
'referenceName',
'library',
'element',
'packageGraph'
Expand Down Expand Up @@ -15202,6 +15330,7 @@ const _invisibleGetters = {
'parameterKind',
'parameters'
},
'ParameterizedType': {'hashCode', 'runtimeType', 'typeArguments'},
'PropertyAccessorElement': {
'hashCode',
'runtimeType',
Expand Down
Loading