Skip to content

Improve scoping interaction with canonicalization, inheritance, and reexports #2699

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 14 commits into from
Jun 22, 2021
7 changes: 7 additions & 0 deletions lib/src/element_type.dart
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,9 @@ class UndefinedElementType extends ElementType {

@override
Iterable<CommentReferable> get referenceParents => [];

@override
Iterable<CommentReferable> get referenceGrandparentOverrides => null;
}

/// A FunctionType that does not have an underpinning Element.
Expand Down Expand Up @@ -358,6 +361,10 @@ abstract class DefinedElementType extends ElementType {
@override
Iterable<CommentReferable> get referenceParents =>
modelElement.referenceParents;

@override
Iterable<CommentReferable> get referenceGrandparentOverrides =>
modelElement.referenceGrandparentOverrides;
}

/// Any callable ElementType will mix-in this class, whether anonymous or not,
Expand Down
165 changes: 95 additions & 70 deletions lib/src/generator/templates.runtime_renderers.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1740,6 +1740,19 @@ class _Renderer_Class extends RendererBase<Class> {
parent: r);
},
),
'extraReferenceChildren': Property(
getValue: (CT_ c) => c.extraReferenceChildren,
renderVariable: (CT_ c, Property<CT_> self,
List<String> remainingNames) =>
self.renderSimpleVariable(c, remainingNames,
'Iterable<MapEntry<String, CommentReferable>>'),
renderIterable: (CT_ c, RendererBase<CT_> r,
List<MustachioNode> ast, StringSink sink) {
return c.extraReferenceChildren.map((e) => renderSimple(
e, ast, r.template, sink,
parent: r, getters: _invisibleGetters['MapEntry']));
},
),
'fileName': Property(
getValue: (CT_ c) => c.fileName,
renderVariable:
Expand Down Expand Up @@ -2175,33 +2188,6 @@ class _Renderer_Class extends RendererBase<Class> {
parent: r));
},
),
'referenceChildren': Property(
getValue: (CT_ c) => c.referenceChildren,
renderVariable: (CT_ c, Property<CT_> self,
List<String> remainingNames) =>
self.renderSimpleVariable(
c, remainingNames, 'Map<String, CommentReferable>'),
isNullValue: (CT_ c) => c.referenceChildren == null,
renderValue: (CT_ c, RendererBase<CT_> r,
List<MustachioNode> ast, StringSink sink) {
renderSimple(c.referenceChildren, ast, r.template, sink,
parent: r, getters: _invisibleGetters['Map']);
},
),
'referenceParents': Property(
getValue: (CT_ c) => c.referenceParents,
renderVariable: (CT_ c, Property<CT_> self,
List<String> remainingNames) =>
self.renderSimpleVariable(
c, remainingNames, 'Iterable<CommentReferable>'),
renderIterable: (CT_ c, RendererBase<CT_> r,
List<MustachioNode> ast, StringSink sink) {
return c.referenceParents.map((e) => renderSimple(
e, ast, r.template, sink,
parent: r,
getters: _invisibleGetters['CommentReferable']));
},
),
'superChain': Property(
getValue: (CT_ c) => c.superChain,
renderVariable: (CT_ c, Property<CT_> self,
Expand Down Expand Up @@ -2641,6 +2627,20 @@ class _Renderer_CommentReferable extends RendererBase<CommentReferable> {
parent: r, getters: _invisibleGetters['Map']);
},
),
'referenceGrandparentOverrides': Property(
getValue: (CT_ c) => c.referenceGrandparentOverrides,
renderVariable: (CT_ c, Property<CT_> self,
List<String> remainingNames) =>
self.renderSimpleVariable(
c, remainingNames, 'Iterable<CommentReferable>'),
renderIterable: (CT_ c, RendererBase<CT_> r,
List<MustachioNode> ast, StringSink sink) {
return c.referenceGrandparentOverrides.map((e) =>
renderSimple(e, ast, r.template, sink,
parent: r,
getters: _invisibleGetters['CommentReferable']));
},
),
'referenceParents': Property(
getValue: (CT_ c) => c.referenceParents,
renderVariable: (CT_ c, Property<CT_> self,
Expand Down Expand Up @@ -2698,6 +2698,7 @@ class _Renderer_Constructor extends RendererBase<Constructor> {
() => {
..._Renderer_ModelElement.propertyMap<CT_>(),
..._Renderer_TypeParameters.propertyMap<CT_>(),
..._Renderer_ContainerMember.propertyMap<CT_>(),
'characterLocation': Property(
getValue: (CT_ c) => c.characterLocation,
renderVariable: (CT_ c, Property<CT_> self,
Expand Down Expand Up @@ -2945,20 +2946,6 @@ class _Renderer_Constructor extends RendererBase<Constructor> {
parent: r, getters: _invisibleGetters['Map']);
},
),
'referenceParents': Property(
getValue: (CT_ c) => c.referenceParents,
renderVariable: (CT_ c, Property<CT_> self,
List<String> remainingNames) =>
self.renderSimpleVariable(
c, remainingNames, 'Iterable<CommentReferable>'),
renderIterable: (CT_ c, RendererBase<CT_> r,
List<MustachioNode> ast, StringSink sink) {
return c.referenceParents.map((e) => renderSimple(
e, ast, r.template, sink,
parent: r,
getters: _invisibleGetters['CommentReferable']));
},
),
'shortName': Property(
getValue: (CT_ c) => c.shortName,
renderVariable:
Expand Down Expand Up @@ -3394,6 +3381,19 @@ class _Renderer_Container extends RendererBase<Container> {
parent: r);
},
),
'extraReferenceChildren': Property(
getValue: (CT_ c) => c.extraReferenceChildren,
renderVariable: (CT_ c, Property<CT_> self,
List<String> remainingNames) =>
self.renderSimpleVariable(c, remainingNames,
'Iterable<MapEntry<String, CommentReferable>>'),
renderIterable: (CT_ c, RendererBase<CT_> r,
List<MustachioNode> ast, StringSink sink) {
return c.extraReferenceChildren.map((e) => renderSimple(
e, ast, r.template, sink,
parent: r, getters: _invisibleGetters['MapEntry']));
},
),
'hasInstanceFields': Property(
getValue: (CT_ c) => c.hasInstanceFields,
renderVariable: (CT_ c, Property<CT_> self,
Expand Down Expand Up @@ -4031,6 +4031,30 @@ class _Renderer_ContainerMember extends RendererBase<ContainerMember> {
self.renderSimpleVariable(c, remainingNames, 'bool'),
getBool: (CT_ c) => c.isExtended == true,
),
'referenceGrandparentOverrides': Property(
getValue: (CT_ c) => c.referenceGrandparentOverrides,
renderVariable: (CT_ c, Property<CT_> self,
List<String> remainingNames) =>
self.renderSimpleVariable(
c, remainingNames, 'Iterable<Library>'),
renderIterable: (CT_ c, RendererBase<CT_> r,
List<MustachioNode> ast, StringSink sink) {
return c.referenceGrandparentOverrides.map((e) =>
_render_Library(e, ast, r.template, sink, parent: r));
},
),
'referenceParents': Property(
getValue: (CT_ c) => c.referenceParents,
renderVariable: (CT_ c, Property<CT_> self,
List<String> remainingNames) =>
self.renderSimpleVariable(
c, remainingNames, 'Iterable<Container>'),
renderIterable: (CT_ c, RendererBase<CT_> r,
List<MustachioNode> ast, StringSink sink) {
return c.referenceParents.map((e) =>
_render_Container(e, ast, r.template, sink, parent: r));
},
),
});

_Renderer_ContainerMember(ContainerMember context,
Expand Down Expand Up @@ -4152,6 +4176,20 @@ class _Renderer_DefinedElementType extends RendererBase<DefinedElementType> {
parent: r, getters: _invisibleGetters['Map']);
},
),
'referenceGrandparentOverrides': Property(
getValue: (CT_ c) => c.referenceGrandparentOverrides,
renderVariable: (CT_ c, Property<CT_> self,
List<String> remainingNames) =>
self.renderSimpleVariable(
c, remainingNames, 'Iterable<CommentReferable>'),
renderIterable: (CT_ c, RendererBase<CT_> r,
List<MustachioNode> ast, StringSink sink) {
return c.referenceGrandparentOverrides.map((e) =>
renderSimple(e, ast, r.template, sink,
parent: r,
getters: _invisibleGetters['CommentReferable']));
},
),
'referenceParents': Property(
getValue: (CT_ c) => c.referenceParents,
renderVariable: (CT_ c, Property<CT_> self,
Expand Down Expand Up @@ -6585,20 +6623,6 @@ class _Renderer_GetterSetterCombo extends RendererBase<GetterSetterCombo> {
parent: r, getters: _invisibleGetters['Map']);
},
),
'referenceParents': Property(
getValue: (CT_ c) => c.referenceParents,
renderVariable: (CT_ c, Property<CT_> self,
List<String> remainingNames) =>
self.renderSimpleVariable(
c, remainingNames, 'Iterable<CommentReferable>'),
renderIterable: (CT_ c, RendererBase<CT_> r,
List<MustachioNode> ast, StringSink sink) {
return c.referenceParents.map((e) => renderSimple(
e, ast, r.template, sink,
parent: r,
getters: _invisibleGetters['CommentReferable']));
},
),
'setter': Property(
getValue: (CT_ c) => c.setter,
renderVariable:
Expand Down Expand Up @@ -8442,20 +8466,6 @@ class _Renderer_Method extends RendererBase<Method> {
parent: r, getters: _invisibleGetters['Map']);
},
),
'referenceParents': Property(
getValue: (CT_ c) => c.referenceParents,
renderVariable: (CT_ c, Property<CT_> self,
List<String> remainingNames) =>
self.renderSimpleVariable(
c, remainingNames, 'Iterable<CommentReferable>'),
renderIterable: (CT_ c, RendererBase<CT_> r,
List<MustachioNode> ast, StringSink sink) {
return c.referenceParents.map((e) => renderSimple(
e, ast, r.template, sink,
parent: r,
getters: _invisibleGetters['CommentReferable']));
},
),
'typeParameters': Property(
getValue: (CT_ c) => c.typeParameters,
renderVariable: (CT_ c, Property<CT_> self,
Expand Down Expand Up @@ -13584,6 +13594,20 @@ class _Renderer_TopLevelVariable extends RendererBase<TopLevelVariable> {
_render_String(c.kind, ast, r.template, sink, parent: r);
},
),
'referenceParents': Property(
getValue: (CT_ c) => c.referenceParents,
renderVariable: (CT_ c, Property<CT_> self,
List<String> remainingNames) =>
self.renderSimpleVariable(
c, remainingNames, 'Iterable<CommentReferable>'),
renderIterable: (CT_ c, RendererBase<CT_> r,
List<MustachioNode> ast, StringSink sink) {
return c.referenceParents.map((e) => renderSimple(
e, ast, r.template, sink,
parent: r,
getters: _invisibleGetters['CommentReferable']));
},
),
'setter': Property(
getValue: (CT_ c) => c.setter,
renderVariable:
Expand Down Expand Up @@ -14570,6 +14594,7 @@ const _invisibleGetters = {
'scope',
'referenceChildren',
'referenceParents',
'referenceGrandparentOverrides',
'library',
'element',
'packageGraph'
Expand Down Expand Up @@ -14896,7 +14921,6 @@ const _invisibleGetters = {
'readWrite',
'writeOnly',
'referenceChildren',
'referenceParents',
'enclosingElement'
},
'HashMap': {'hashCode', 'runtimeType'},
Expand Down Expand Up @@ -14961,6 +14985,7 @@ const _invisibleGetters = {
'isEmpty',
'isNotEmpty'
},
'MapEntry': {'hashCode', 'runtimeType', 'key', 'value'},
'Member': {
'hashCode',
'runtimeType',
Expand Down
20 changes: 13 additions & 7 deletions lib/src/markdown_processor.dart
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ class MatchingLinkResult {

@override
String toString() {
return 'element: ${modelElement?.fullyQualifiedName} warn: $warn';
return 'element: [${modelElement is Constructor ? 'new ' : ''}${modelElement?.fullyQualifiedName}] warn: $warn';
}
}

Expand Down Expand Up @@ -295,11 +295,17 @@ ModelElement _getPreferredClass(ModelElement modelElement) {
return null;
}

/// Return false if the passed [referable] is a default [Constructor].
bool _rejectDefaultConstructors(CommentReferable referable) {
if (referable is Constructor &&
referable.name == referable.enclosingElement.name) {
return false;
/// Return false if the passed [referable] is a default [Constructor],
/// or if it is shadowing another type of element.
bool _rejectDefaultAndShadowingConstructors(CommentReferable referable) {
if (referable is Constructor) {
if (referable.name == referable.enclosingElement.name) {
return false;
}
if (referable.enclosingElement
.referenceChildren[referable.name.split('.').last] is! Constructor) {
return false;
}
}
// Avoid accidentally preferring arguments of the default constructor.
if (referable is ModelElement && referable.enclosingElement is Constructor) {
Expand Down Expand Up @@ -342,7 +348,7 @@ MatchingLinkResult _getMatchingLinkElementCommentReferable(
} else {
// Without hints, reject default constructors to force resolution to the
// class.
filter = _rejectDefaultConstructors;
filter = _rejectDefaultAndShadowingConstructors;
}

var lookupResult =
Expand Down
Loading