Skip to content

Commit 6f1b4e2

Browse files
authored
Extension type constructors (#3550)
1 parent 50e2153 commit 6f1b4e2

9 files changed

+146
-110
lines changed

lib/src/generator/templates.aot_renderers_for_html.dart

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -852,7 +852,7 @@ String renderExtensionType<T extends ExtensionType>(
852852
<dt>on</dt>
853853
<dd>
854854
<ul class="comma-separated clazz-relationships">''');
855-
var context3 = context2.extendedType;
855+
var context3 = context2.representationType;
856856
buffer.writeln();
857857
buffer.write('''
858858
<li>''');
@@ -868,7 +868,10 @@ String renderExtensionType<T extends ExtensionType>(
868868
buffer.writeln();
869869
buffer.write('''
870870
</section>
871-
''');
871+
872+
''');
873+
buffer.write(_renderExtensionType_partial_constructors_6(context2));
874+
buffer.writeln();
872875
if (context2.hasPublicInstanceFields == true) {
873876
buffer.writeln();
874877
buffer.write('''
@@ -879,31 +882,31 @@ String renderExtensionType<T extends ExtensionType>(
879882
var context4 = context2.publicInstanceFieldsSorted;
880883
for (var context5 in context4) {
881884
buffer.write('\n ');
882-
buffer.write(_renderExtensionType_partial_property_6(context5));
885+
buffer.write(_renderExtensionType_partial_property_7(context5));
883886
}
884887
buffer.writeln();
885888
buffer.write('''
886889
</dl>
887890
</section>''');
888891
}
889892
buffer.write('\n\n ');
890-
buffer.write(_renderExtensionType_partial_instance_methods_7(context2));
893+
buffer.write(_renderExtensionType_partial_instance_methods_8(context2));
891894
buffer.write('\n ');
892-
buffer.write(_renderExtensionType_partial_instance_operators_8(context2));
895+
buffer.write(_renderExtensionType_partial_instance_operators_9(context2));
893896
buffer.write('\n ');
894-
buffer.write(_renderExtensionType_partial_static_properties_9(context2));
897+
buffer.write(_renderExtensionType_partial_static_properties_10(context2));
895898
buffer.write('\n ');
896-
buffer.write(_renderExtensionType_partial_static_methods_10(context2));
899+
buffer.write(_renderExtensionType_partial_static_methods_11(context2));
897900
buffer.write('\n ');
898-
buffer.write(_renderExtensionType_partial_static_constants_11(context2));
901+
buffer.write(_renderExtensionType_partial_static_constants_12(context2));
899902
buffer.writeln();
900903
buffer.write('''
901904
902905
</div><!-- /.main-content -->
903906
904907
<div id="dartdoc-sidebar-left" class="sidebar sidebar-offcanvas-left">
905908
''');
906-
buffer.write(_renderExtensionType_partial_search_sidebar_12(context0));
909+
buffer.write(_renderExtensionType_partial_search_sidebar_13(context0));
907910
buffer.writeln();
908911
buffer.write('''
909912
<h5>''');
@@ -917,7 +920,7 @@ String renderExtensionType<T extends ExtensionType>(
917920
</div><!--/.sidebar-offcanvas-->
918921
919922
''');
920-
buffer.write(_renderExtensionType_partial_footer_13(context0));
923+
buffer.write(_renderExtensionType_partial_footer_14(context0));
921924
buffer.writeln();
922925
buffer.writeln();
923926

@@ -2864,33 +2867,36 @@ String _renderExtensionType_partial_container_annotations_5(
28642867
ExtensionType context1) =>
28652868
_deduplicated_lib_templates_html__container_annotations_html(context1);
28662869

2867-
String _renderExtensionType_partial_property_6(Field context2) =>
2870+
String _renderExtensionType_partial_constructors_6(ExtensionType context1) =>
2871+
_deduplicated_lib_templates_html__constructors_html(context1);
2872+
2873+
String _renderExtensionType_partial_property_7(Field context2) =>
28682874
_deduplicated_lib_templates_html__property_html(context2);
28692875

2870-
String _renderExtensionType_partial_instance_methods_7(
2876+
String _renderExtensionType_partial_instance_methods_8(
28712877
ExtensionType context1) =>
28722878
_deduplicated_lib_templates_html__instance_methods_html(context1);
28732879

2874-
String _renderExtensionType_partial_instance_operators_8(
2880+
String _renderExtensionType_partial_instance_operators_9(
28752881
ExtensionType context1) =>
28762882
_deduplicated_lib_templates_html__instance_operators_html(context1);
28772883

2878-
String _renderExtensionType_partial_static_properties_9(
2884+
String _renderExtensionType_partial_static_properties_10(
28792885
ExtensionType context1) =>
28802886
_deduplicated_lib_templates_html__static_properties_html(context1);
28812887

2882-
String _renderExtensionType_partial_static_methods_10(ExtensionType context1) =>
2888+
String _renderExtensionType_partial_static_methods_11(ExtensionType context1) =>
28832889
_deduplicated_lib_templates_html__static_methods_html(context1);
28842890

2885-
String _renderExtensionType_partial_static_constants_11(
2891+
String _renderExtensionType_partial_static_constants_12(
28862892
ExtensionType context1) =>
28872893
_deduplicated_lib_templates_html__static_constants_html(context1);
28882894

2889-
String _renderExtensionType_partial_search_sidebar_12<T extends ExtensionType>(
2895+
String _renderExtensionType_partial_search_sidebar_13<T extends ExtensionType>(
28902896
ExtensionTypeTemplateData<T> context0) =>
28912897
_deduplicated_lib_templates_html__search_sidebar_html(context0);
28922898

2893-
String _renderExtensionType_partial_footer_13<T extends ExtensionType>(
2899+
String _renderExtensionType_partial_footer_14<T extends ExtensionType>(
28942900
ExtensionTypeTemplateData<T> context0) =>
28952901
_deduplicated_lib_templates_html__footer_html(context0);
28962902

lib/src/generator/templates.aot_renderers_for_md.dart

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,7 @@ String renderExtensionType<T extends ExtensionType>(
491491
buffer.writeln();
492492
buffer.write('''
493493
on ''');
494-
var context2 = context1.extendedType;
494+
var context2 = context1.representationType;
495495
buffer.write(context2.linkedName);
496496
buffer.write('\n\n');
497497
buffer.write(_renderExtensionType_partial_source_link_1(context1));
@@ -505,6 +505,8 @@ on ''');
505505
buffer.write(_renderExtensionType_partial_documentation_4(context3));
506506
buffer.write('\n\n');
507507
buffer.write(_renderExtensionType_partial_annotations_5(context3));
508+
buffer.write('\n\n');
509+
buffer.write(_renderExtensionType_partial_constructors_6(context3));
508510
buffer.writeln();
509511
if (context3.hasPublicInstanceFields == true) {
510512
buffer.writeln();
@@ -514,25 +516,25 @@ on ''');
514516
var context4 = context3.publicInstanceFieldsSorted;
515517
for (var context5 in context4) {
516518
buffer.writeln();
517-
buffer.write(_renderExtensionType_partial_property_6(context5));
519+
buffer.write(_renderExtensionType_partial_property_7(context5));
518520
buffer.writeln();
519521
}
520522
}
521523
buffer.write('\n\n');
522-
buffer.write(_renderExtensionType_partial_instance_methods_7(context3));
524+
buffer.write(_renderExtensionType_partial_instance_methods_8(context3));
523525
buffer.write('\n\n');
524-
buffer.write(_renderExtensionType_partial_instance_operators_8(context3));
526+
buffer.write(_renderExtensionType_partial_instance_operators_9(context3));
525527
buffer.write('\n\n');
526-
buffer.write(_renderExtensionType_partial_static_properties_9(context3));
528+
buffer.write(_renderExtensionType_partial_static_properties_10(context3));
527529
buffer.write('\n\n');
528-
buffer.write(_renderExtensionType_partial_static_methods_10(context3));
530+
buffer.write(_renderExtensionType_partial_static_methods_11(context3));
529531
buffer.write('\n\n');
530-
buffer.write(_renderExtensionType_partial_static_constants_11(context3));
532+
buffer.write(_renderExtensionType_partial_static_constants_12(context3));
531533
buffer.writeln();
532534
buffer.write('''
533535
{{ /extension }}''');
534536
buffer.write('\n\n');
535-
buffer.write(_renderExtensionType_partial_footer_12(context0));
537+
buffer.write(_renderExtensionType_partial_footer_13(context0));
536538
buffer.writeln();
537539
buffer.writeln();
538540

@@ -1434,29 +1436,32 @@ String _renderExtensionType_partial_documentation_4(ExtensionType context1) =>
14341436
String _renderExtensionType_partial_annotations_5(ExtensionType context1) =>
14351437
_deduplicated_lib_templates_md__annotations_md(context1);
14361438

1437-
String _renderExtensionType_partial_property_6(Field context2) =>
1439+
String _renderExtensionType_partial_constructors_6(ExtensionType context1) =>
1440+
_deduplicated_lib_templates_md__constructors_md(context1);
1441+
1442+
String _renderExtensionType_partial_property_7(Field context2) =>
14381443
_deduplicated_lib_templates_md__property_md(context2);
14391444

1440-
String _renderExtensionType_partial_instance_methods_7(
1445+
String _renderExtensionType_partial_instance_methods_8(
14411446
ExtensionType context1) =>
14421447
_deduplicated_lib_templates_md__instance_methods_md(context1);
14431448

1444-
String _renderExtensionType_partial_instance_operators_8(
1449+
String _renderExtensionType_partial_instance_operators_9(
14451450
ExtensionType context1) =>
14461451
_deduplicated_lib_templates_md__instance_operators_md(context1);
14471452

1448-
String _renderExtensionType_partial_static_properties_9(
1453+
String _renderExtensionType_partial_static_properties_10(
14491454
ExtensionType context1) =>
14501455
_deduplicated_lib_templates_md__static_properties_md(context1);
14511456

1452-
String _renderExtensionType_partial_static_methods_10(ExtensionType context1) =>
1457+
String _renderExtensionType_partial_static_methods_11(ExtensionType context1) =>
14531458
_deduplicated_lib_templates_md__static_methods_md(context1);
14541459

1455-
String _renderExtensionType_partial_static_constants_11(
1460+
String _renderExtensionType_partial_static_constants_12(
14561461
ExtensionType context1) =>
14571462
_deduplicated_lib_templates_md__static_constants_md(context1);
14581463

1459-
String _renderExtensionType_partial_footer_12<T extends ExtensionType>(
1464+
String _renderExtensionType_partial_footer_13<T extends ExtensionType>(
14601465
ExtensionTypeTemplateData<T> context0) =>
14611466
_deduplicated_lib_templates_md__footer_md(context0);
14621467

lib/src/generator/templates.runtime_renderers.dart

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5486,28 +5486,6 @@ class _Renderer_ExtensionType extends RendererBase<ExtensionType> {
54865486
parent: r);
54875487
},
54885488
),
5489-
'extendedType': Property(
5490-
getValue: (CT_ c) => c.extendedType,
5491-
renderVariable:
5492-
(CT_ c, Property<CT_> self, List<String> remainingNames) {
5493-
if (remainingNames.isEmpty) {
5494-
return self.getValue(c).toString();
5495-
}
5496-
var name = remainingNames.first;
5497-
var nextProperty =
5498-
_Renderer_ElementType.propertyMap().getValue(name);
5499-
return nextProperty.renderVariable(
5500-
self.getValue(c) as ElementType,
5501-
nextProperty,
5502-
[...remainingNames.skip(1)]);
5503-
},
5504-
isNullValue: (CT_ c) => false,
5505-
renderValue: (CT_ c, RendererBase<CT_> r,
5506-
List<MustachioNode> ast, StringSink sink) {
5507-
_render_ElementType(c.extendedType, ast, r.template, sink,
5508-
parent: r);
5509-
},
5510-
),
55115489
'filePath': Property(
55125490
getValue: (CT_ c) => c.filePath,
55135491
renderVariable:
@@ -5649,6 +5627,29 @@ class _Renderer_ExtensionType extends RendererBase<ExtensionType> {
56495627
parent: r);
56505628
},
56515629
),
5630+
'representationType': Property(
5631+
getValue: (CT_ c) => c.representationType,
5632+
renderVariable:
5633+
(CT_ c, Property<CT_> self, List<String> remainingNames) {
5634+
if (remainingNames.isEmpty) {
5635+
return self.getValue(c).toString();
5636+
}
5637+
var name = remainingNames.first;
5638+
var nextProperty =
5639+
_Renderer_ElementType.propertyMap().getValue(name);
5640+
return nextProperty.renderVariable(
5641+
self.getValue(c) as ElementType,
5642+
nextProperty,
5643+
[...remainingNames.skip(1)]);
5644+
},
5645+
isNullValue: (CT_ c) => false,
5646+
renderValue: (CT_ c, RendererBase<CT_> r,
5647+
List<MustachioNode> ast, StringSink sink) {
5648+
_render_ElementType(
5649+
c.representationType, ast, r.template, sink,
5650+
parent: r);
5651+
},
5652+
),
56525653
'sidebarPath': Property(
56535654
getValue: (CT_ c) => c.sidebarPath,
56545655
renderVariable:

lib/src/model/extension_type.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class ExtensionType extends InheritingContainer with Constructable {
1212
@override
1313
final ExtensionTypeElement element;
1414

15-
late final ElementType extendedType =
15+
late final ElementType representationType =
1616
modelBuilder.typeFrom(element.typeErasure, library);
1717

1818
ExtensionType(this.element, super.library, super.packageGraph);
@@ -56,7 +56,7 @@ class ExtensionType extends InheritingContainer with Constructable {
5656
@override
5757
late final List<ModelElement> allModelElements = [
5858
...super.allModelElements,
59-
...typeParameters,
59+
...constructors,
6060
];
6161

6262
@override
@@ -86,8 +86,8 @@ class ExtensionType extends InheritingContainer with Constructable {
8686
@override
8787
Map<String, CommentReferable> get referenceChildren {
8888
return _referenceChildren ??= {
89-
...extendedType.referenceChildren,
90-
// Override `extendedType` entries with local items.
89+
...representationType.referenceChildren,
90+
// Override `representationType` entries with local items.
9191
...super.referenceChildren,
9292
};
9393
}

lib/src/model/model_element.dart

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -459,13 +459,15 @@ abstract class ModelElement extends Canonicalization
459459
// The canonical ModelElement for this ModelElement,
460460
// or null if there isn't one.
461461
late final ModelElement? canonicalModelElement = () {
462-
Container? preferredClass;
463-
// TODO(srawlins): Add mixin.
464-
if (enclosingElement is Class ||
465-
enclosingElement is Enum ||
466-
enclosingElement is Extension) {
467-
preferredClass = enclosingElement as Container?;
468-
}
462+
final enclosingElement = this.enclosingElement;
463+
var preferredClass = switch (enclosingElement) {
464+
// TODO(srawlins): Add mixin.
465+
Class() => enclosingElement,
466+
Enum() => enclosingElement,
467+
Extension() => enclosingElement,
468+
ExtensionType() => enclosingElement,
469+
_ => null,
470+
};
469471
return packageGraph.findCanonicalModelElementFor(element,
470472
preferredClass: preferredClass);
471473
}();

lib/templates/html/extension_type.html

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,17 @@
1616
<dt>on</dt>
1717
<dd>
1818
<ul class="comma-separated clazz-relationships">
19-
{{ #extendedType }}
19+
{{ #representationType }}
2020
<li>{{{ linkedName }}}</li>
21-
{{ /extendedType }}
21+
{{ /representationType }}
2222
</ul>
2323
</dd>
2424
</dl>
2525
{{ >container_annotations }}
2626
</section>
2727

28+
{{ >constructors }}
29+
2830
{{ #hasPublicInstanceFields }}
2931
<section class="summary offset-anchor" id="instance-properties">
3032
<h2>Properties</h2>

lib/templates/md/extension_type.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
{{ #self }}
44
# {{{ nameWithGenerics }}} {{ kind }}
5-
on {{ #extendedType }}{{{ linkedName }}}{{ /extendedType }}
5+
on {{ #representationType }}{{{ linkedName }}}{{ /representationType }}
66

77
{{ >source_link }}
88

@@ -15,6 +15,8 @@ on {{ #extendedType }}{{{ linkedName }}}{{ /extendedType }}
1515

1616
{{ >annotations }}
1717

18+
{{ >constructors }}
19+
1820
{{ #hasPublicInstanceFields }}
1921
## Properties
2022

test/extension_types_test.dart

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,24 @@ class C {}
8585
);
8686
}
8787

88+
@FailingTest(reason: 'Not implemented yet')
89+
void test_referenceToExtensionTypeConstructor() async {
90+
var library = await bootPackageWithLibrary('''
91+
extension type ET(int it) {
92+
ET.named(int it);
93+
}
94+
95+
/// Doc referring to [ET.new] and [Et.named].
96+
class C {}
97+
''');
98+
99+
expect(
100+
library.classes.named('C').documentationAsHtml,
101+
'<p>Doc referring to '
102+
'<a href="${placeholder}extension_types/ET/named.html">ET.named</a>.</p>',
103+
);
104+
}
105+
88106
void test_referenceToExtensionTypeMember() async {
89107
var library = await bootPackageWithLibrary('''
90108
extension type ET(int it) {

0 commit comments

Comments
 (0)