Skip to content

Commit 526fc4e

Browse files
authored
Create renderers for ElementType and subclasses (#2080)
1 parent bd158ec commit 526fc4e

File tree

2 files changed

+129
-56
lines changed

2 files changed

+129
-56
lines changed

lib/src/element_type.dart

Lines changed: 18 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import 'package:analyzer/dart/element/element.dart';
1111
import 'package:analyzer/dart/element/nullability_suffix.dart';
1212
import 'package:analyzer/dart/element/type.dart';
1313
import 'package:dartdoc/src/model/model.dart';
14-
import 'package:dartdoc/src/render/parameter_renderer.dart';
14+
import 'package:dartdoc/src/render/element_type_renderer.dart';
1515

1616
/// Base class representing a type in Dartdoc. It wraps a [DartType], and
1717
/// may link to a [ModelElement].
@@ -143,13 +143,8 @@ class FunctionTypeElementType extends UndefinedElementType {
143143
@override
144144
String get linkedName {
145145
if (_linkedName == null) {
146-
StringBuffer buf = StringBuffer();
147-
buf.write('${returnType.linkedName} ');
148-
buf.write('${nameWithGenerics}');
149-
buf.write('<span class="signature">');
150-
buf.write('(${ParameterRendererHtml().renderLinkedParams(parameters)})');
151-
buf.write('</span>');
152-
_linkedName = buf.toString();
146+
_linkedName =
147+
FunctionTypeElementTypeRendererHtml().renderLinkedName(this);
153148
}
154149
return _linkedName;
155150
}
@@ -162,17 +157,8 @@ class FunctionTypeElementType extends UndefinedElementType {
162157
@override
163158
String get nameWithGenerics {
164159
if (_nameWithGenerics == null) {
165-
StringBuffer buf = StringBuffer();
166-
buf.write(name);
167-
if ((type as FunctionType).typeFormals.isNotEmpty) {
168-
if (!typeFormals.every((t) => t.name == 'dynamic')) {
169-
buf.write('&lt;<wbr><span class="type-parameter">');
170-
buf.writeAll(typeFormals.map((t) => t.name),
171-
'</span>, <span class="type-parameter">');
172-
buf.write('</span>&gt;');
173-
}
174-
}
175-
_nameWithGenerics = buf.toString();
160+
_nameWithGenerics =
161+
FunctionTypeElementTypeRendererHtml().renderNameWithGenerics(this);
176162
}
177163
return _nameWithGenerics;
178164
}
@@ -198,21 +184,8 @@ class ParameterizedElementType extends DefinedElementType {
198184
@override
199185
String get linkedName {
200186
if (_linkedName == null) {
201-
StringBuffer buf = StringBuffer();
202-
203-
buf.write(element.linkedName);
204-
205-
if (!typeArguments.every((t) => t.name == 'dynamic') &&
206-
typeArguments.isNotEmpty) {
207-
buf.write('<span class="signature">');
208-
buf.write('&lt;<wbr><span class="type-parameter">');
209-
buf.writeAll(typeArguments.map((t) => t.linkedName),
210-
'</span>, <span class="type-parameter">');
211-
buf.write('</span>&gt;');
212-
buf.write('</span>');
213-
}
214-
215-
_linkedName = buf.toString();
187+
_linkedName =
188+
ParameterizedElementTypeRendererHtml().renderLinkedName(this);
216189
}
217190
return _linkedName;
218191
}
@@ -221,18 +194,8 @@ class ParameterizedElementType extends DefinedElementType {
221194
@override
222195
String get nameWithGenerics {
223196
if (_nameWithGenerics == null) {
224-
StringBuffer buf = StringBuffer();
225-
226-
buf.write(element.name);
227-
228-
if (!typeArguments.every((t) => t.name == 'dynamic') &&
229-
typeArguments.isNotEmpty) {
230-
buf.write('&lt;<wbr><span class="type-parameter">');
231-
buf.writeAll(typeArguments.map((t) => t.nameWithGenerics),
232-
'</span>, <span class="type-parameter">');
233-
buf.write('</span>&gt;');
234-
}
235-
_nameWithGenerics = buf.toString();
197+
_nameWithGenerics =
198+
ParameterizedElementTypeRendererHtml().renderNameWithGenerics(this);
236199
}
237200
return _nameWithGenerics;
238201
}
@@ -246,17 +209,12 @@ class TypeParameterElementType extends DefinedElementType {
246209
@override
247210
String get linkedName => name;
248211

249-
String _nameWithGenerics;
250212
@override
251-
String get nameWithGenerics {
252-
if (_nameWithGenerics == null) {
253-
_nameWithGenerics = name;
254-
}
255-
return _nameWithGenerics;
256-
}
213+
String get nameWithGenerics => name;
257214

258215
@override
259216
ClassElement get _boundClassElement => interfaceType.element;
217+
260218
@override
261219
InterfaceType get interfaceType => (type as TypeParameterType).bound;
262220
}
@@ -417,9 +375,13 @@ class CallableElementType extends ParameterizedElementType
417375

418376
@override
419377
String get linkedName {
420-
if (name != null && name.isNotEmpty) return super.linkedName;
421-
return '${nameWithGenerics}(${ParameterRendererHtml(showNames: false).renderLinkedParams(element.parameters).trim()}) → ${returnType.linkedName}';
378+
if (_linkedName == null) {
379+
_linkedName = CallableElementTypeRendererHtml().renderLinkedName(this);
380+
}
381+
return _linkedName;
422382
}
383+
384+
String get superLinkedName => super.linkedName;
423385
}
424386

425387
/// This is an anonymous function using the generic function syntax (declared
@@ -435,7 +397,7 @@ class CallableAnonymousElementType extends CallableElementType {
435397
String get linkedName {
436398
if (_linkedName == null) {
437399
_linkedName =
438-
'${returnType.linkedName} ${super.linkedName}<span class="signature">(${ParameterRendererHtml().renderLinkedParams(element.parameters)})</span>';
400+
CallableAnonymousElementTypeRendererHtml().renderLinkedName(this);
439401
}
440402
return _linkedName;
441403
}
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'package:dartdoc/dartdoc.dart';
6+
import 'package:dartdoc/src/render/parameter_renderer.dart';
7+
8+
abstract class ElementTypeRenderer<T extends ElementType> {
9+
String renderLinkedName(T elementType);
10+
11+
String renderNameWithGenerics(T elementType) => '';
12+
}
13+
14+
class FunctionTypeElementTypeRendererHtml
15+
extends ElementTypeRenderer<FunctionTypeElementType> {
16+
@override
17+
String renderLinkedName(FunctionTypeElementType elementType) {
18+
StringBuffer buf = StringBuffer();
19+
buf.write('${elementType.returnType.linkedName} ');
20+
buf.write('${elementType.nameWithGenerics}');
21+
buf.write('<span class="signature">(');
22+
buf.write(
23+
ParameterRendererHtml().renderLinkedParams(elementType.parameters));
24+
buf.write(')</span>');
25+
return buf.toString();
26+
}
27+
28+
@override
29+
String renderNameWithGenerics(FunctionTypeElementType elementType) {
30+
StringBuffer buf = StringBuffer();
31+
buf.write(elementType.name);
32+
if (elementType.typeFormals.isNotEmpty) {
33+
if (!elementType.typeFormals.every((t) => t.name == 'dynamic')) {
34+
buf.write('&lt;<wbr><span class="type-parameter">');
35+
buf.writeAll(elementType.typeFormals.map((t) => t.name),
36+
'</span>, <span class="type-parameter">');
37+
buf.write('</span>&gt;');
38+
}
39+
}
40+
return buf.toString();
41+
}
42+
}
43+
44+
class ParameterizedElementTypeRendererHtml
45+
extends ElementTypeRenderer<ParameterizedElementType> {
46+
@override
47+
String renderLinkedName(ParameterizedElementType elementType) {
48+
StringBuffer buf = StringBuffer();
49+
buf.write(elementType.element.linkedName);
50+
if (elementType.typeArguments.isNotEmpty &&
51+
!elementType.typeArguments.every((t) => t.name == 'dynamic')) {
52+
buf.write('<span class="signature">');
53+
buf.write('&lt;<wbr><span class="type-parameter">');
54+
buf.writeAll(elementType.typeArguments.map((t) => t.linkedName),
55+
'</span>, <span class="type-parameter">');
56+
buf.write('</span>&gt;');
57+
buf.write('</span>');
58+
}
59+
return buf.toString();
60+
}
61+
62+
@override
63+
String renderNameWithGenerics(ParameterizedElementType elementType) {
64+
StringBuffer buf = StringBuffer();
65+
buf.write(elementType.element.name);
66+
if (elementType.typeArguments.isNotEmpty &&
67+
!elementType.typeArguments.every((t) => t.name == 'dynamic')) {
68+
buf.write('&lt;<wbr><span class="type-parameter">');
69+
buf.writeAll(elementType.typeArguments.map((t) => t.nameWithGenerics),
70+
'</span>, <span class="type-parameter">');
71+
buf.write('</span>&gt;');
72+
}
73+
return buf.toString();
74+
}
75+
}
76+
77+
class CallableElementTypeRendererHtml
78+
extends ElementTypeRenderer<CallableElementType> {
79+
@override
80+
String renderLinkedName(CallableElementType elementType) {
81+
if (elementType.name != null && elementType.name.isNotEmpty) {
82+
return elementType.superLinkedName;
83+
}
84+
85+
StringBuffer buf = StringBuffer();
86+
buf.write(elementType.nameWithGenerics);
87+
buf.write('(');
88+
buf.write(ParameterRendererHtml(showNames: false)
89+
.renderLinkedParams(elementType.element.parameters)
90+
.trim());
91+
buf.write(') → ');
92+
buf.write(elementType.returnType.linkedName);
93+
return buf.toString();
94+
}
95+
}
96+
97+
class CallableAnonymousElementTypeRendererHtml
98+
extends ElementTypeRenderer<CallableAnonymousElementType> {
99+
@override
100+
String renderLinkedName(CallableAnonymousElementType elementType) {
101+
StringBuffer buf = StringBuffer();
102+
buf.write(elementType.returnType.linkedName);
103+
buf.write(' ');
104+
buf.write(elementType.superLinkedName);
105+
buf.write('<span class="signature">(');
106+
buf.write(ParameterRendererHtml()
107+
.renderLinkedParams(elementType.element.parameters));
108+
buf.write(')</span>');
109+
return buf.toString();
110+
}
111+
}

0 commit comments

Comments
 (0)