Skip to content

Commit f7dd024

Browse files
authored
Improve scoping interaction with canonicalization, inheritance, and reexports (#2699)
* Beginnings of grandparent override scoping * intermediate * implement basic overrides, constructors still broken * intermediate * this seems to work much better * dartfmt * This now seems to work with tests * rebuild && dartfmt * fix up tests a bit * add comment * remove assert
1 parent 772a665 commit f7dd024

22 files changed

+629
-314
lines changed

lib/src/element_type.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,9 @@ class UndefinedElementType extends ElementType {
158158

159159
@override
160160
Iterable<CommentReferable> get referenceParents => [];
161+
162+
@override
163+
Iterable<CommentReferable> get referenceGrandparentOverrides => null;
161164
}
162165

163166
/// A FunctionType that does not have an underpinning Element.
@@ -358,6 +361,10 @@ abstract class DefinedElementType extends ElementType {
358361
@override
359362
Iterable<CommentReferable> get referenceParents =>
360363
modelElement.referenceParents;
364+
365+
@override
366+
Iterable<CommentReferable> get referenceGrandparentOverrides =>
367+
modelElement.referenceGrandparentOverrides;
361368
}
362369

363370
/// Any callable ElementType will mix-in this class, whether anonymous or not,

lib/src/generator/templates.runtime_renderers.dart

Lines changed: 95 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1740,6 +1740,19 @@ class _Renderer_Class extends RendererBase<Class> {
17401740
parent: r);
17411741
},
17421742
),
1743+
'extraReferenceChildren': Property(
1744+
getValue: (CT_ c) => c.extraReferenceChildren,
1745+
renderVariable: (CT_ c, Property<CT_> self,
1746+
List<String> remainingNames) =>
1747+
self.renderSimpleVariable(c, remainingNames,
1748+
'Iterable<MapEntry<String, CommentReferable>>'),
1749+
renderIterable: (CT_ c, RendererBase<CT_> r,
1750+
List<MustachioNode> ast, StringSink sink) {
1751+
return c.extraReferenceChildren.map((e) => renderSimple(
1752+
e, ast, r.template, sink,
1753+
parent: r, getters: _invisibleGetters['MapEntry']));
1754+
},
1755+
),
17431756
'fileName': Property(
17441757
getValue: (CT_ c) => c.fileName,
17451758
renderVariable:
@@ -2175,33 +2188,6 @@ class _Renderer_Class extends RendererBase<Class> {
21752188
parent: r));
21762189
},
21772190
),
2178-
'referenceChildren': Property(
2179-
getValue: (CT_ c) => c.referenceChildren,
2180-
renderVariable: (CT_ c, Property<CT_> self,
2181-
List<String> remainingNames) =>
2182-
self.renderSimpleVariable(
2183-
c, remainingNames, 'Map<String, CommentReferable>'),
2184-
isNullValue: (CT_ c) => c.referenceChildren == null,
2185-
renderValue: (CT_ c, RendererBase<CT_> r,
2186-
List<MustachioNode> ast, StringSink sink) {
2187-
renderSimple(c.referenceChildren, ast, r.template, sink,
2188-
parent: r, getters: _invisibleGetters['Map']);
2189-
},
2190-
),
2191-
'referenceParents': Property(
2192-
getValue: (CT_ c) => c.referenceParents,
2193-
renderVariable: (CT_ c, Property<CT_> self,
2194-
List<String> remainingNames) =>
2195-
self.renderSimpleVariable(
2196-
c, remainingNames, 'Iterable<CommentReferable>'),
2197-
renderIterable: (CT_ c, RendererBase<CT_> r,
2198-
List<MustachioNode> ast, StringSink sink) {
2199-
return c.referenceParents.map((e) => renderSimple(
2200-
e, ast, r.template, sink,
2201-
parent: r,
2202-
getters: _invisibleGetters['CommentReferable']));
2203-
},
2204-
),
22052191
'superChain': Property(
22062192
getValue: (CT_ c) => c.superChain,
22072193
renderVariable: (CT_ c, Property<CT_> self,
@@ -2641,6 +2627,20 @@ class _Renderer_CommentReferable extends RendererBase<CommentReferable> {
26412627
parent: r, getters: _invisibleGetters['Map']);
26422628
},
26432629
),
2630+
'referenceGrandparentOverrides': Property(
2631+
getValue: (CT_ c) => c.referenceGrandparentOverrides,
2632+
renderVariable: (CT_ c, Property<CT_> self,
2633+
List<String> remainingNames) =>
2634+
self.renderSimpleVariable(
2635+
c, remainingNames, 'Iterable<CommentReferable>'),
2636+
renderIterable: (CT_ c, RendererBase<CT_> r,
2637+
List<MustachioNode> ast, StringSink sink) {
2638+
return c.referenceGrandparentOverrides.map((e) =>
2639+
renderSimple(e, ast, r.template, sink,
2640+
parent: r,
2641+
getters: _invisibleGetters['CommentReferable']));
2642+
},
2643+
),
26442644
'referenceParents': Property(
26452645
getValue: (CT_ c) => c.referenceParents,
26462646
renderVariable: (CT_ c, Property<CT_> self,
@@ -2698,6 +2698,7 @@ class _Renderer_Constructor extends RendererBase<Constructor> {
26982698
() => {
26992699
..._Renderer_ModelElement.propertyMap<CT_>(),
27002700
..._Renderer_TypeParameters.propertyMap<CT_>(),
2701+
..._Renderer_ContainerMember.propertyMap<CT_>(),
27012702
'characterLocation': Property(
27022703
getValue: (CT_ c) => c.characterLocation,
27032704
renderVariable: (CT_ c, Property<CT_> self,
@@ -2945,20 +2946,6 @@ class _Renderer_Constructor extends RendererBase<Constructor> {
29452946
parent: r, getters: _invisibleGetters['Map']);
29462947
},
29472948
),
2948-
'referenceParents': Property(
2949-
getValue: (CT_ c) => c.referenceParents,
2950-
renderVariable: (CT_ c, Property<CT_> self,
2951-
List<String> remainingNames) =>
2952-
self.renderSimpleVariable(
2953-
c, remainingNames, 'Iterable<CommentReferable>'),
2954-
renderIterable: (CT_ c, RendererBase<CT_> r,
2955-
List<MustachioNode> ast, StringSink sink) {
2956-
return c.referenceParents.map((e) => renderSimple(
2957-
e, ast, r.template, sink,
2958-
parent: r,
2959-
getters: _invisibleGetters['CommentReferable']));
2960-
},
2961-
),
29622949
'shortName': Property(
29632950
getValue: (CT_ c) => c.shortName,
29642951
renderVariable:
@@ -3394,6 +3381,19 @@ class _Renderer_Container extends RendererBase<Container> {
33943381
parent: r);
33953382
},
33963383
),
3384+
'extraReferenceChildren': Property(
3385+
getValue: (CT_ c) => c.extraReferenceChildren,
3386+
renderVariable: (CT_ c, Property<CT_> self,
3387+
List<String> remainingNames) =>
3388+
self.renderSimpleVariable(c, remainingNames,
3389+
'Iterable<MapEntry<String, CommentReferable>>'),
3390+
renderIterable: (CT_ c, RendererBase<CT_> r,
3391+
List<MustachioNode> ast, StringSink sink) {
3392+
return c.extraReferenceChildren.map((e) => renderSimple(
3393+
e, ast, r.template, sink,
3394+
parent: r, getters: _invisibleGetters['MapEntry']));
3395+
},
3396+
),
33973397
'hasInstanceFields': Property(
33983398
getValue: (CT_ c) => c.hasInstanceFields,
33993399
renderVariable: (CT_ c, Property<CT_> self,
@@ -4031,6 +4031,30 @@ class _Renderer_ContainerMember extends RendererBase<ContainerMember> {
40314031
self.renderSimpleVariable(c, remainingNames, 'bool'),
40324032
getBool: (CT_ c) => c.isExtended == true,
40334033
),
4034+
'referenceGrandparentOverrides': Property(
4035+
getValue: (CT_ c) => c.referenceGrandparentOverrides,
4036+
renderVariable: (CT_ c, Property<CT_> self,
4037+
List<String> remainingNames) =>
4038+
self.renderSimpleVariable(
4039+
c, remainingNames, 'Iterable<Library>'),
4040+
renderIterable: (CT_ c, RendererBase<CT_> r,
4041+
List<MustachioNode> ast, StringSink sink) {
4042+
return c.referenceGrandparentOverrides.map((e) =>
4043+
_render_Library(e, ast, r.template, sink, parent: r));
4044+
},
4045+
),
4046+
'referenceParents': Property(
4047+
getValue: (CT_ c) => c.referenceParents,
4048+
renderVariable: (CT_ c, Property<CT_> self,
4049+
List<String> remainingNames) =>
4050+
self.renderSimpleVariable(
4051+
c, remainingNames, 'Iterable<Container>'),
4052+
renderIterable: (CT_ c, RendererBase<CT_> r,
4053+
List<MustachioNode> ast, StringSink sink) {
4054+
return c.referenceParents.map((e) =>
4055+
_render_Container(e, ast, r.template, sink, parent: r));
4056+
},
4057+
),
40344058
});
40354059

40364060
_Renderer_ContainerMember(ContainerMember context,
@@ -4152,6 +4176,20 @@ class _Renderer_DefinedElementType extends RendererBase<DefinedElementType> {
41524176
parent: r, getters: _invisibleGetters['Map']);
41534177
},
41544178
),
4179+
'referenceGrandparentOverrides': Property(
4180+
getValue: (CT_ c) => c.referenceGrandparentOverrides,
4181+
renderVariable: (CT_ c, Property<CT_> self,
4182+
List<String> remainingNames) =>
4183+
self.renderSimpleVariable(
4184+
c, remainingNames, 'Iterable<CommentReferable>'),
4185+
renderIterable: (CT_ c, RendererBase<CT_> r,
4186+
List<MustachioNode> ast, StringSink sink) {
4187+
return c.referenceGrandparentOverrides.map((e) =>
4188+
renderSimple(e, ast, r.template, sink,
4189+
parent: r,
4190+
getters: _invisibleGetters['CommentReferable']));
4191+
},
4192+
),
41554193
'referenceParents': Property(
41564194
getValue: (CT_ c) => c.referenceParents,
41574195
renderVariable: (CT_ c, Property<CT_> self,
@@ -6585,20 +6623,6 @@ class _Renderer_GetterSetterCombo extends RendererBase<GetterSetterCombo> {
65856623
parent: r, getters: _invisibleGetters['Map']);
65866624
},
65876625
),
6588-
'referenceParents': Property(
6589-
getValue: (CT_ c) => c.referenceParents,
6590-
renderVariable: (CT_ c, Property<CT_> self,
6591-
List<String> remainingNames) =>
6592-
self.renderSimpleVariable(
6593-
c, remainingNames, 'Iterable<CommentReferable>'),
6594-
renderIterable: (CT_ c, RendererBase<CT_> r,
6595-
List<MustachioNode> ast, StringSink sink) {
6596-
return c.referenceParents.map((e) => renderSimple(
6597-
e, ast, r.template, sink,
6598-
parent: r,
6599-
getters: _invisibleGetters['CommentReferable']));
6600-
},
6601-
),
66026626
'setter': Property(
66036627
getValue: (CT_ c) => c.setter,
66046628
renderVariable:
@@ -8442,20 +8466,6 @@ class _Renderer_Method extends RendererBase<Method> {
84428466
parent: r, getters: _invisibleGetters['Map']);
84438467
},
84448468
),
8445-
'referenceParents': Property(
8446-
getValue: (CT_ c) => c.referenceParents,
8447-
renderVariable: (CT_ c, Property<CT_> self,
8448-
List<String> remainingNames) =>
8449-
self.renderSimpleVariable(
8450-
c, remainingNames, 'Iterable<CommentReferable>'),
8451-
renderIterable: (CT_ c, RendererBase<CT_> r,
8452-
List<MustachioNode> ast, StringSink sink) {
8453-
return c.referenceParents.map((e) => renderSimple(
8454-
e, ast, r.template, sink,
8455-
parent: r,
8456-
getters: _invisibleGetters['CommentReferable']));
8457-
},
8458-
),
84598469
'typeParameters': Property(
84608470
getValue: (CT_ c) => c.typeParameters,
84618471
renderVariable: (CT_ c, Property<CT_> self,
@@ -13584,6 +13594,20 @@ class _Renderer_TopLevelVariable extends RendererBase<TopLevelVariable> {
1358413594
_render_String(c.kind, ast, r.template, sink, parent: r);
1358513595
},
1358613596
),
13597+
'referenceParents': Property(
13598+
getValue: (CT_ c) => c.referenceParents,
13599+
renderVariable: (CT_ c, Property<CT_> self,
13600+
List<String> remainingNames) =>
13601+
self.renderSimpleVariable(
13602+
c, remainingNames, 'Iterable<CommentReferable>'),
13603+
renderIterable: (CT_ c, RendererBase<CT_> r,
13604+
List<MustachioNode> ast, StringSink sink) {
13605+
return c.referenceParents.map((e) => renderSimple(
13606+
e, ast, r.template, sink,
13607+
parent: r,
13608+
getters: _invisibleGetters['CommentReferable']));
13609+
},
13610+
),
1358713611
'setter': Property(
1358813612
getValue: (CT_ c) => c.setter,
1358913613
renderVariable:
@@ -14570,6 +14594,7 @@ const _invisibleGetters = {
1457014594
'scope',
1457114595
'referenceChildren',
1457214596
'referenceParents',
14597+
'referenceGrandparentOverrides',
1457314598
'library',
1457414599
'element',
1457514600
'packageGraph'
@@ -14896,7 +14921,6 @@ const _invisibleGetters = {
1489614921
'readWrite',
1489714922
'writeOnly',
1489814923
'referenceChildren',
14899-
'referenceParents',
1490014924
'enclosingElement'
1490114925
},
1490214926
'HashMap': {'hashCode', 'runtimeType'},
@@ -14961,6 +14985,7 @@ const _invisibleGetters = {
1496114985
'isEmpty',
1496214986
'isNotEmpty'
1496314987
},
14988+
'MapEntry': {'hashCode', 'runtimeType', 'key', 'value'},
1496414989
'Member': {
1496514990
'hashCode',
1496614991
'runtimeType',

lib/src/markdown_processor.dart

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ class MatchingLinkResult {
226226

227227
@override
228228
String toString() {
229-
return 'element: ${modelElement?.fullyQualifiedName} warn: $warn';
229+
return 'element: [${modelElement is Constructor ? 'new ' : ''}${modelElement?.fullyQualifiedName}] warn: $warn';
230230
}
231231
}
232232

@@ -295,11 +295,17 @@ ModelElement _getPreferredClass(ModelElement modelElement) {
295295
return null;
296296
}
297297

298-
/// Return false if the passed [referable] is a default [Constructor].
299-
bool _rejectDefaultConstructors(CommentReferable referable) {
300-
if (referable is Constructor &&
301-
referable.name == referable.enclosingElement.name) {
302-
return false;
298+
/// Return false if the passed [referable] is a default [Constructor],
299+
/// or if it is shadowing another type of element.
300+
bool _rejectDefaultAndShadowingConstructors(CommentReferable referable) {
301+
if (referable is Constructor) {
302+
if (referable.name == referable.enclosingElement.name) {
303+
return false;
304+
}
305+
if (referable.enclosingElement
306+
.referenceChildren[referable.name.split('.').last] is! Constructor) {
307+
return false;
308+
}
303309
}
304310
// Avoid accidentally preferring arguments of the default constructor.
305311
if (referable is ModelElement && referable.enclosingElement is Constructor) {
@@ -342,7 +348,7 @@ MatchingLinkResult _getMatchingLinkElementCommentReferable(
342348
} else {
343349
// Without hints, reject default constructors to force resolution to the
344350
// class.
345-
filter = _rejectDefaultConstructors;
351+
filter = _rejectDefaultAndShadowingConstructors;
346352
}
347353

348354
var lookupResult =

0 commit comments

Comments
 (0)