Skip to content

Commit b0e5bed

Browse files
committed
Make getters and setters actually look like their declarations
1 parent c10962e commit b0e5bed

File tree

6 files changed

+134
-33
lines changed

6 files changed

+134
-33
lines changed

lib/src/generator/templates.aot_renderers_for_html.dart

Lines changed: 16 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4743,6 +4743,7 @@ String _deduplicated_lib_templates__accessor_getter_html(
47434743
buffer.write(''' <span class="returntype">''');
47444744
buffer.write(context1.modelType.returnType.linkedName);
47454745
buffer.write('''</span>
4746+
get
47464747
''');
47474748
buffer.write(
47484749
__deduplicated_lib_templates__accessor_getter_html_partial_name_summary_1(
@@ -4869,27 +4870,30 @@ String _deduplicated_lib_templates__accessor_setter_html(
48694870
__deduplicated_lib_templates__accessor_setter_html_partial_annotations_0(
48704871
context1));
48714872
buffer.writeln();
4872-
buffer.write(''' <span class="returntype">void</span>
4873-
''');
4874-
buffer.write(
4875-
__deduplicated_lib_templates__accessor_setter_html_partial_name_summary_1(
4876-
context1));
4877-
buffer.write('''<span class="signature">(<wbr>''');
4873+
buffer.write(''' set
4874+
<span class="name ''');
4875+
if (context1.isDeprecated) {
4876+
buffer.write('''deprecated''');
4877+
}
4878+
buffer.write('''">''');
4879+
buffer.writeEscaped(context1.definingCombo.name);
4880+
buffer.write('''</span>
4881+
<span class="signature">(<wbr>''');
48784882
buffer.write(context1.linkedParamsNoMetadata);
48794883
buffer.write(''')</span>
48804884
''');
48814885
buffer.write(
4882-
__deduplicated_lib_templates__accessor_setter_html_partial_attributes_2(
4886+
__deduplicated_lib_templates__accessor_setter_html_partial_attributes_1(
48834887
context1));
48844888
buffer.writeln();
48854889
buffer.write(''' </section>
48864890
''');
48874891
buffer.write(
4888-
__deduplicated_lib_templates__accessor_setter_html_partial_documentation_3(
4892+
__deduplicated_lib_templates__accessor_setter_html_partial_documentation_2(
48894893
context1));
48904894
buffer.write('\n ');
48914895
buffer.write(
4892-
__deduplicated_lib_templates__accessor_setter_html_partial_source_code_4(
4896+
__deduplicated_lib_templates__accessor_setter_html_partial_source_code_3(
48934897
context1));
48944898
buffer.writeln();
48954899
buffer.write(''' </section>''');
@@ -4921,25 +4925,7 @@ String __deduplicated_lib_templates__accessor_setter_html_partial_annotations_0(
49214925
return buffer.toString();
49224926
}
49234927

4924-
String
4925-
__deduplicated_lib_templates__accessor_setter_html_partial_name_summary_1(
4926-
Accessor context1) {
4927-
final buffer = StringBuffer();
4928-
if (context1.isConst) {
4929-
buffer.write('''const ''');
4930-
}
4931-
buffer.write('''<span class="name ''');
4932-
if (context1.isDeprecated) {
4933-
buffer.write('''deprecated''');
4934-
}
4935-
buffer.write('''">''');
4936-
buffer.writeEscaped(context1.name);
4937-
buffer.write('''</span>''');
4938-
4939-
return buffer.toString();
4940-
}
4941-
4942-
String __deduplicated_lib_templates__accessor_setter_html_partial_attributes_2(
4928+
String __deduplicated_lib_templates__accessor_setter_html_partial_attributes_1(
49434929
Accessor context1) {
49444930
final buffer = StringBuffer();
49454931
if (context1.hasAttributes) {
@@ -4953,7 +4939,7 @@ String __deduplicated_lib_templates__accessor_setter_html_partial_attributes_2(
49534939
}
49544940

49554941
String
4956-
__deduplicated_lib_templates__accessor_setter_html_partial_documentation_3(
4942+
__deduplicated_lib_templates__accessor_setter_html_partial_documentation_2(
49574943
Accessor context1) {
49584944
final buffer = StringBuffer();
49594945
if (context1.hasDocumentation) {
@@ -4969,7 +4955,7 @@ String
49694955
return buffer.toString();
49704956
}
49714957

4972-
String __deduplicated_lib_templates__accessor_setter_html_partial_source_code_4(
4958+
String __deduplicated_lib_templates__accessor_setter_html_partial_source_code_3(
49734959
Accessor context1) {
49744960
final buffer = StringBuffer();
49754961
if (context1.hasSourceCode) {

lib/src/generator/templates.runtime_renderers.dart

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6585,6 +6585,27 @@ class _Renderer_GetterSetterCombo extends RendererBase<GetterSetterCombo> {
65856585
parent: r);
65866586
},
65876587
),
6588+
'name': Property(
6589+
getValue: (CT_ c) => c.name,
6590+
renderVariable:
6591+
(CT_ c, Property<CT_> self, List<String> remainingNames) {
6592+
if (remainingNames.isEmpty) {
6593+
return self.getValue(c).toString();
6594+
}
6595+
var name = remainingNames.first;
6596+
var nextProperty =
6597+
_Renderer_String.propertyMap().getValue(name);
6598+
return nextProperty.renderVariable(
6599+
self.getValue(c) as String,
6600+
nextProperty,
6601+
[...remainingNames.skip(1)]);
6602+
},
6603+
isNullValue: (CT_ c) => false,
6604+
renderValue: (CT_ c, RendererBase<CT_> r,
6605+
List<MustachioNode> ast, StringSink sink) {
6606+
_render_String(c.name, ast, r.template, sink, parent: r);
6607+
},
6608+
),
65886609
'oneLineDoc': Property(
65896610
getValue: (CT_ c) => c.oneLineDoc,
65906611
renderVariable:
@@ -16013,6 +16034,7 @@ const _invisibleGetters = {
1601316034
'isPublic',
1601416035
'linkedParamsNoMetadata',
1601516036
'modelType',
16037+
'name',
1601616038
'oneLineDoc',
1601716039
'parameters',
1601816040
'readOnly',

lib/src/model/getter_setter_combo.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@ mixin GetterSetterCombo on ModelElement {
5656

5757
bool get isInherited;
5858

59+
@override
60+
// Food for mustachio; because this is a mixin, mustachio can't figure out
61+
// that this implicitly has a `name` property.
62+
String get name;
63+
5964
@override
6065
String get fileName => isConst ? '$name-constant.html' : '$name.html';
6166

lib/templates/_accessor_getter.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
{{ #getter }}
22
<section id="getter">
3-
43
<section class="multi-line-signature">
54
{{ >annotations }}
65
<span class="returntype">{{{ modelType.returnType.linkedName }}}</span>
6+
get
77
{{ >name_summary }}
88
{{ >attributes }}
99
</section>

lib/templates/_accessor_setter.html

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33

44
<section class="multi-line-signature">
55
{{ >annotations }}
6-
<span class="returntype">void</span>
7-
{{ >name_summary }}<span class="signature">(<wbr>{{{ linkedParamsNoMetadata }}})</span>
6+
set
7+
<span class="name {{#isDeprecated}}deprecated{{/isDeprecated}}">{{ definingCombo.name }}</span>
8+
<span class="signature">(<wbr>{{{ linkedParamsNoMetadata }}})</span>
89
{{ >attributes }}
910
</section>
1011

test/templates/field_test.dart

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,93 @@ extension type ET(
9191
);
9292
}
9393

94+
void test_getter_signature() async {
95+
await createPackageWithLibrary('''
96+
class C {
97+
int get f1 => 1;
98+
}
99+
''');
100+
var f1Lines = readLines(['lib', 'C', 'f1.html']);
101+
f1Lines.expectMainContentContainsAllInOrder(
102+
[
103+
matches('<h1><span class="kind-property">f1</span> property'),
104+
matches('<section class="multi-line-signature">'),
105+
matches('<span class="returntype">int</span>'),
106+
matches('get'),
107+
matches('<span class="name ">f1</span>'),
108+
],
109+
);
110+
}
111+
112+
void test_getter_overridingProperty_signature() async {
113+
await createPackageWithLibrary('''
114+
class C {
115+
int f1 = 0;
116+
}
117+
class D extends C {
118+
@override
119+
int get f1 => 1;
120+
}
121+
''');
122+
var f1Lines = readLines(['lib', 'D', 'f1.html']);
123+
f1Lines.expectMainContentContainsAllInOrder(
124+
[
125+
matches('<h1><span class="kind-property">f1</span> property'),
126+
matches('<section class="multi-line-signature">'),
127+
matches('<span class="returntype">int</span>'),
128+
matches('get'),
129+
matches('<span class="name ">f1</span>'),
130+
],
131+
);
132+
}
133+
134+
void test_setter_signature() async {
135+
await createPackageWithLibrary('''
136+
class C {
137+
set f1(int value) {}
138+
}
139+
''');
140+
var f1Lines = readLines(['lib', 'C', 'f1.html']);
141+
f1Lines.expectMainContentContainsAllInOrder(
142+
[
143+
matches('<section class="multi-line-signature">'),
144+
matches('set'),
145+
matches('<span class="name ">f1</span>'),
146+
matches(r'<span class="signature">\('
147+
'<wbr><span class="parameter" id="f1=-param-value">'
148+
'<span class="type-annotation">int</span> '
149+
'<span class="parameter-name">value</span>'
150+
r'</span>\)'
151+
'</span>'),
152+
],
153+
);
154+
}
155+
156+
void test_setter_overridingProperty_signature() async {
157+
await createPackageWithLibrary('''
158+
class C {
159+
int f1 = 0;
160+
}
161+
class D extends C {
162+
set f1(int value) {}
163+
}
164+
''');
165+
var f1Lines = readLines(['lib', 'D', 'f1.html']);
166+
f1Lines.expectMainContentContainsAllInOrder(
167+
[
168+
matches('<section class="multi-line-signature">'),
169+
matches('set'),
170+
matches('<span class="name ">f1</span>'),
171+
matches(r'<span class="signature">\('
172+
'<wbr><span class="parameter" id="f1=-param-value">'
173+
'<span class="type-annotation">int</span> '
174+
'<span class="parameter-name">value</span>'
175+
r'</span>\)'
176+
'</span>'),
177+
],
178+
);
179+
}
180+
94181
// TODO(srawlins): Add rendering tests:
95182
// * how inherited fields look on subclass page ('inherited' feature)
96183
// * static fields

0 commit comments

Comments
 (0)