Skip to content

Commit 527073f

Browse files
authored
Mustachio: fix getter override order, and bounds bug (#2523)
Mustachio: fix getter override order, and bounds bug
1 parent ed2d52b commit 527073f

File tree

4 files changed

+95
-34
lines changed

4 files changed

+95
-34
lines changed

lib/src/generator/templates.renderers.dart

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class _Renderer_PackageTemplateData extends RendererBase<PackageTemplateData> {
2828
static Map<String, Property<CT_>> propertyMap<
2929
CT_ extends PackageTemplateData>() =>
3030
{
31+
..._Renderer_TemplateData.propertyMap<Package, CT_>(),
3132
'hasHomepage': Property(
3233
getValue: (CT_ c) => c.hasHomepage,
3334
renderVariable:
@@ -138,7 +139,6 @@ class _Renderer_PackageTemplateData extends RendererBase<PackageTemplateData> {
138139
return renderSimple(c.title, ast, r.template, parent: r);
139140
},
140141
),
141-
..._Renderer_TemplateData.propertyMap<Package, CT_>(),
142142
};
143143

144144
_Renderer_PackageTemplateData(PackageTemplateData context,
@@ -165,6 +165,11 @@ String _render_Package(
165165

166166
class _Renderer_Package extends RendererBase<Package> {
167167
static Map<String, Property<CT_>> propertyMap<CT_ extends Package>() => {
168+
..._Renderer_LibraryContainer.propertyMap<CT_>(),
169+
..._Renderer_Nameable.propertyMap<CT_>(),
170+
..._Renderer_Locatable.propertyMap<CT_>(),
171+
..._Renderer_Canonicalization.propertyMap<CT_>(),
172+
..._Renderer_Warnable.propertyMap<CT_>(),
168173
'allLibraries': Property(
169174
getValue: (CT_ c) => c.allLibraries,
170175
renderVariable:
@@ -696,11 +701,6 @@ class _Renderer_Package extends RendererBase<Package> {
696701
return renderSimple(c.version, ast, r.template, parent: r);
697702
},
698703
),
699-
..._Renderer_LibraryContainer.propertyMap<CT_>(),
700-
..._Renderer_Nameable.propertyMap<CT_>(),
701-
..._Renderer_Locatable.propertyMap<CT_>(),
702-
..._Renderer_Canonicalization.propertyMap<CT_>(),
703-
..._Renderer_Warnable.propertyMap<CT_>(),
704704
};
705705

706706
_Renderer_Package(
@@ -727,6 +727,7 @@ String _render_Nameable(
727727

728728
class _Renderer_Nameable extends RendererBase<Nameable> {
729729
static Map<String, Property<CT_>> propertyMap<CT_ extends Nameable>() => {
730+
..._Renderer_Object.propertyMap<CT_>(),
730731
'fullyQualifiedName': Property(
731732
getValue: (CT_ c) => c.fullyQualifiedName,
732733
renderVariable:
@@ -773,7 +774,6 @@ class _Renderer_Nameable extends RendererBase<Nameable> {
773774
return buffer.toString();
774775
},
775776
),
776-
..._Renderer_Object.propertyMap<CT_>(),
777777
};
778778

779779
_Renderer_Nameable(
@@ -800,6 +800,7 @@ String _render_Locatable(
800800

801801
class _Renderer_Locatable extends RendererBase<Locatable> {
802802
static Map<String, Property<CT_>> propertyMap<CT_ extends Locatable>() => {
803+
..._Renderer_Object.propertyMap<CT_>(),
803804
'documentationFrom': Property(
804805
getValue: (CT_ c) => c.documentationFrom,
805806
renderVariable: (CT_ c, Property<CT_> self,
@@ -853,7 +854,6 @@ class _Renderer_Locatable extends RendererBase<Locatable> {
853854
return renderSimple(c.location, ast, r.template, parent: r);
854855
},
855856
),
856-
..._Renderer_Object.propertyMap<CT_>(),
857857
};
858858

859859
_Renderer_Locatable(
@@ -882,6 +882,7 @@ class _Renderer_Canonicalization extends RendererBase<Canonicalization> {
882882
static Map<String, Property<CT_>> propertyMap<
883883
CT_ extends Canonicalization>() =>
884884
{
885+
..._Renderer_Object.propertyMap<CT_>(),
885886
'canonicalLibrary': Property(
886887
getValue: (CT_ c) => c.canonicalLibrary,
887888
renderVariable:
@@ -930,7 +931,6 @@ class _Renderer_Canonicalization extends RendererBase<Canonicalization> {
930931
return buffer.toString();
931932
},
932933
),
933-
..._Renderer_Object.propertyMap<CT_>(),
934934
};
935935

936936
_Renderer_Canonicalization(
@@ -1026,6 +1026,7 @@ class _Renderer_LibraryContainer extends RendererBase<LibraryContainer> {
10261026
static Map<String, Property<CT_>> propertyMap<
10271027
CT_ extends LibraryContainer>() =>
10281028
{
1029+
..._Renderer_Object.propertyMap<CT_>(),
10291030
'containerOrder': Property(
10301031
getValue: (CT_ c) => c.containerOrder,
10311032
renderVariable:
@@ -1130,7 +1131,6 @@ class _Renderer_LibraryContainer extends RendererBase<LibraryContainer> {
11301131
return renderSimple(c.sortKey, ast, r.template, parent: r);
11311132
},
11321133
),
1133-
..._Renderer_Object.propertyMap<CT_>(),
11341134
};
11351135

11361136
_Renderer_LibraryContainer(
@@ -1196,6 +1196,7 @@ class _Renderer_TemplateData<T extends Documentable>
11961196
static Map<String, Property<CT_>> propertyMap<T extends Documentable,
11971197
CT_ extends TemplateData>() =>
11981198
{
1199+
..._Renderer_Object.propertyMap<CT_>(),
11991200
'bareHref': Property(
12001201
getValue: (CT_ c) => c.bareHref,
12011202
renderVariable:
@@ -1360,6 +1361,16 @@ class _Renderer_TemplateData<T extends Documentable>
13601361
parent: r);
13611362
},
13621363
),
1364+
'self': Property(
1365+
getValue: (CT_ c) => c.self,
1366+
renderVariable:
1367+
(CT_ c, Property<CT_> self, List<String> remainingNames) =>
1368+
self.renderSimpleVariable(c, remainingNames, 'Documentable'),
1369+
isNullValue: (CT_ c) => c.self == null,
1370+
renderValue: (CT_ c, RendererBase<CT_> r, List<MustachioNode> ast) {
1371+
return renderSimple(c.self, ast, r.template, parent: r);
1372+
},
1373+
),
13631374
'title': Property(
13641375
getValue: (CT_ c) => c.title,
13651376
renderVariable:
@@ -1387,7 +1398,6 @@ class _Renderer_TemplateData<T extends Documentable>
13871398
return renderSimple(c.version, ast, r.template, parent: r);
13881399
},
13891400
),
1390-
..._Renderer_Object.propertyMap<CT_>(),
13911401
};
13921402

13931403
_Renderer_TemplateData(

test/mustachio/foo.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,15 @@ library dartdoc.testing.foo;
55

66
import 'package:dartdoc/src/mustachio/annotations.dart';
77

8-
class Foo {
8+
class FooBase<T extends Object> {
9+
T baz;
10+
}
11+
12+
class Foo extends FooBase<Baz> {
913
String s1;
1014
bool b1;
1115
List<int> l1;
16+
@override
1217
Baz baz;
1318
}
1419

test/mustachio/foo.renderers.dart

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ String _render_Foo(Foo context, List<MustachioNode> ast, Template template,
2525

2626
class Renderer_Foo extends RendererBase<Foo> {
2727
static Map<String, Property<CT_>> propertyMap<CT_ extends Foo>() => {
28+
...Renderer_FooBase.propertyMap<Baz, CT_>(),
2829
'b1': Property(
2930
getValue: (CT_ c) => c.b1,
3031
renderVariable:
@@ -72,7 +73,6 @@ class Renderer_Foo extends RendererBase<Foo> {
7273
return renderSimple(c.s1, ast, r.template, parent: r);
7374
},
7475
),
75-
...Renderer_Object.propertyMap<CT_>(),
7676
};
7777

7878
Renderer_Foo(Foo context, RendererBase<Object> parent, Template template)
@@ -124,6 +124,45 @@ class Renderer_Object extends RendererBase<Object> {
124124
}
125125
}
126126

127+
String _render_FooBase<T extends Object>(
128+
FooBase<T> context, List<MustachioNode> ast, Template template,
129+
{RendererBase<Object> parent}) {
130+
var renderer = Renderer_FooBase(context, parent, template);
131+
renderer.renderBlock(ast);
132+
return renderer.buffer.toString();
133+
}
134+
135+
class Renderer_FooBase<T extends Object> extends RendererBase<FooBase<T>> {
136+
static Map<String, Property<CT_>>
137+
propertyMap<T extends Object, CT_ extends FooBase>() => {
138+
...Renderer_Object.propertyMap<CT_>(),
139+
'baz': Property(
140+
getValue: (CT_ c) => c.baz,
141+
renderVariable:
142+
(CT_ c, Property<CT_> self, List<String> remainingNames) {
143+
if (remainingNames.isEmpty) return self.getValue(c).toString();
144+
var name = remainingNames.first;
145+
var nextProperty = Renderer_Object.propertyMap().getValue(name);
146+
return nextProperty.renderVariable(self.getValue(c),
147+
nextProperty, [...remainingNames.skip(1)]);
148+
},
149+
),
150+
};
151+
152+
Renderer_FooBase(
153+
FooBase<T> context, RendererBase<Object> parent, Template template)
154+
: super(context, parent, template);
155+
156+
@override
157+
Property<FooBase<T>> getProperty(String key) {
158+
if (propertyMap<T, FooBase>().containsKey(key)) {
159+
return propertyMap<T, FooBase>()[key];
160+
} else {
161+
return null;
162+
}
163+
}
164+
}
165+
127166
String renderBar(Bar context, Template template) {
128167
return _render_Bar(context, template.ast, template);
129168
}
@@ -137,6 +176,7 @@ String _render_Bar(Bar context, List<MustachioNode> ast, Template template,
137176

138177
class Renderer_Bar extends RendererBase<Bar> {
139178
static Map<String, Property<CT_>> propertyMap<CT_ extends Bar>() => {
179+
...Renderer_Object.propertyMap<CT_>(),
140180
'baz': Property(
141181
getValue: (CT_ c) => c.baz,
142182
renderVariable:
@@ -184,7 +224,6 @@ class Renderer_Bar extends RendererBase<Bar> {
184224
return renderSimple(c.s2, ast, r.template, parent: r);
185225
},
186226
),
187-
...Renderer_Object.propertyMap<CT_>(),
188227
};
189228

190229
Renderer_Bar(Bar context, RendererBase<Object> parent, Template template)
@@ -213,6 +252,7 @@ String _render_Baz(Baz context, List<MustachioNode> ast, Template template,
213252

214253
class Renderer_Baz extends RendererBase<Baz> {
215254
static Map<String, Property<CT_>> propertyMap<CT_ extends Baz>() => {
255+
...Renderer_Object.propertyMap<CT_>(),
216256
'bar': Property(
217257
getValue: (CT_ c) => c.bar,
218258
renderVariable:
@@ -228,7 +268,6 @@ class Renderer_Baz extends RendererBase<Baz> {
228268
return _render_Bar(c.bar, ast, r.template, parent: r);
229269
},
230270
),
231-
...Renderer_Object.propertyMap<CT_>(),
232271
};
233272

234273
Renderer_Baz(Baz context, RendererBase<Object> parent, Template template)

tool/mustachio/codegen_runtime_renderer.dart

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -317,12 +317,6 @@ class ${renderer._rendererClassName}${renderer._typeParametersString}
317317
'$_contextTypeVariable extends ${renderer._typeName}');
318318
_buffer.writeln('static Map<String, Property<$_contextTypeVariable>> '
319319
'propertyMap$generics() => {');
320-
var interfaceTypedProperties = contextClass.accessors
321-
.where((property) => property.type.returnType is InterfaceType);
322-
for (var property in [...interfaceTypedProperties]
323-
..sort((a, b) => a.name.compareTo(b.name))) {
324-
_writeProperty(renderer, property);
325-
}
326320
if (contextClass.supertype != null) {
327321
var superclassRendererName =
328322
_typeToRendererClassName[contextClass.supertype.element];
@@ -356,13 +350,23 @@ class ${renderer._rendererClassName}${renderer._typeParametersString}
356350
}
357351
}
358352
}
353+
for (var property in [...contextClass.accessors]
354+
..sort((a, b) => a.name.compareTo(b.name))) {
355+
var returnType = property.type.returnType;
356+
if (returnType is InterfaceType) {
357+
_writeProperty(renderer, property, returnType);
358+
} else if (returnType is TypeParameterType &&
359+
returnType.bound != null &&
360+
!returnType.bound.isDynamic) {
361+
_writeProperty(renderer, property, returnType.bound);
362+
}
363+
}
359364
_buffer.writeln('};');
360365
_buffer.writeln('');
361366
}
362367

363-
void _writeProperty(
364-
_RendererInfo renderer, PropertyAccessorElement property) {
365-
var getterType = property.type.returnType as InterfaceType;
368+
void _writeProperty(_RendererInfo renderer, PropertyAccessorElement property,
369+
InterfaceType getterType) {
366370
if (getterType == _typeProvider.typeType) {
367371
// The [Type] type is the first case of a type we don't want to traverse.
368372
return;
@@ -409,16 +413,18 @@ renderVariable:
409413
getterType, _typeProvider.iterableDynamicType)) {
410414
var iterableElement = _typeProvider.iterableElement;
411415
var iterableType = getterType.asInstanceOf(iterableElement);
412-
var innerType = iterableType.typeArguments.first;
413-
// Don't add Iterable functions for a generic type, for example
414-
// `List<E>.reversed` has inner type `E`, which we don't have a specific
415-
// renderer for.
416-
// TODO(srawlins): Find a solution for this. We can track all of the
417-
// concrete types substituted for `E` for example.
418-
if (innerType is! TypeParameterType) {
419-
var rendererName =
420-
_typeToRenderFunctionName[innerType.element] ?? 'renderSimple';
421-
_buffer.writeln('''
416+
// Not sure why [iterableType] would be null... unresolved type?
417+
if (iterableType != null) {
418+
var innerType = iterableType.typeArguments.first;
419+
// Don't add Iterable functions for a generic type, for example
420+
// `List<E>.reversed` has inner type `E`, which we don't have a specific
421+
// renderer for.
422+
// TODO(srawlins): Find a solution for this. We can track all of the
423+
// concrete types substituted for `E` for example.
424+
if (innerType is! TypeParameterType) {
425+
var rendererName =
426+
_typeToRenderFunctionName[innerType.element] ?? 'renderSimple';
427+
_buffer.writeln('''
422428
isEmptyIterable: ($_contextTypeVariable c) => c.$getterName?.isEmpty ?? true,
423429
424430
renderIterable:
@@ -430,6 +436,7 @@ renderIterable:
430436
return buffer.toString();
431437
},
432438
''');
439+
}
433440
}
434441
} else {
435442
// Don't add Iterable functions for a generic type, for example

0 commit comments

Comments
 (0)