Skip to content

Commit f049730

Browse files
authored
Make modelType/ElementType usage more consistent (#2573)
* clean up element types and add display aliases test * Everything except the actual change I want to make * Fix tests and update templates * dartfmt * remove scaffolding * Exclude InterfaceType. Hacky.
1 parent 2a97d3c commit f049730

39 files changed

+192
-158
lines changed

lib/src/element_type.dart

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,6 @@ abstract class ElementType extends Privacy {
6262

6363
bool get canHaveParameters => false;
6464

65-
// TODO(jcollins-g): change clients of ElementType to use subtypes more consistently
66-
// and eliminate createLinkedReturnTypeName (instead, using returnType.linkedName);
67-
String createLinkedReturnTypeName() => linkedName;
68-
6965
bool get isTypedef => false;
7066

7167
String get linkedName;
@@ -90,7 +86,7 @@ abstract class ElementType extends Privacy {
9086
}
9187

9288
/// An unmodifiable list of this element type's parameters.
93-
List<Parameter> get parameters => const <Parameter>[];
89+
List<Parameter> get parameters;
9490

9591
DartType get instantiatedType;
9692

@@ -149,22 +145,25 @@ class UndefinedElementType extends ElementType {
149145

150146
@override
151147
String get linkedName => name;
148+
149+
@override
150+
// TODO(jcollins-g): remove the need for an empty list here.
151+
List<Parameter> get parameters => [];
152152
}
153153

154154
/// A FunctionType that does not have an underpinning Element.
155-
class FunctionTypeElementType extends UndefinedElementType {
155+
class FunctionTypeElementType extends UndefinedElementType
156+
with CallableElementTypeMixin {
156157
FunctionTypeElementType(DartType f, Library library,
157158
PackageGraph packageGraph, ElementType returnedFrom)
158159
: super(f, library, packageGraph, returnedFrom);
159160

160-
@override
161-
FunctionType get type => super.type;
162-
163161
@override
164162
List<Parameter> get parameters => type.parameters
165163
.map((p) => ModelElement.from(p, library, packageGraph) as Parameter)
166164
.toList(growable: false);
167165

166+
@override
168167
ElementType get returnType =>
169168
ElementType.from(type.returnType, library, packageGraph, this);
170169

@@ -174,11 +173,7 @@ class FunctionTypeElementType extends UndefinedElementType {
174173
return _linkedName;
175174
}
176175

177-
@override
178-
String createLinkedReturnTypeName() => returnType.linkedName;
179-
180176
String _nameWithGenerics;
181-
182177
@override
183178
String get nameWithGenerics {
184179
_nameWithGenerics ??= _renderer.renderNameWithGenerics(this);
@@ -216,7 +211,7 @@ class ParameterizedElementType extends DefinedElementType {
216211
return _nameWithGenerics;
217212
}
218213

219-
ElementTypeRenderer<ParameterizedElementType> get _renderer =>
214+
ElementTypeRenderer<ElementType> get _renderer =>
220215
packageGraph.rendererFactory.parameterizedElementTypeRenderer;
221216
}
222217

@@ -281,9 +276,6 @@ abstract class DefinedElementType extends ElementType {
281276
return _returnType;
282277
}
283278

284-
@override
285-
String createLinkedReturnTypeName() => returnType.linkedName;
286-
287279
Iterable<ElementType> _typeArguments;
288280

289281
/// An unmodifiable list of this element type's parameters.
@@ -341,13 +333,14 @@ abstract class DefinedElementType extends ElementType {
341333
}
342334

343335
/// Any callable ElementType will mix-in this class, whether anonymous or not.
344-
abstract class CallableElementTypeMixin implements ParameterizedElementType {
345-
@override
336+
abstract class CallableElementTypeMixin implements ElementType {
337+
Iterable<ElementType> _typeArguments;
338+
346339
ModelElement get returnElement => returnType is DefinedElementType
347340
? (returnType as DefinedElementType).element
348341
: null;
349342

350-
@override
343+
ElementType _returnType;
351344
ElementType get returnType {
352345
_returnType ??=
353346
ElementType.from(type.returnType, library, packageGraph, this);
@@ -357,7 +350,6 @@ abstract class CallableElementTypeMixin implements ParameterizedElementType {
357350
@override
358351
FunctionType get type => _type;
359352

360-
@override
361353
// TODO(jcollins-g): Rewrite this and improve object model so this doesn't
362354
// require type checking everywhere.
363355
Iterable<ElementType> get typeArguments {
@@ -414,12 +406,16 @@ class CallableElementType extends ParameterizedElementType
414406

415407
@override
416408
String get linkedName {
417-
_linkedName ??= _renderer.renderLinkedName(this);
409+
if (_linkedName == null) {
410+
if (name != null && name.isNotEmpty) {
411+
_linkedName = super.linkedName;
412+
} else {
413+
_linkedName = _renderer.renderLinkedName(this);
414+
}
415+
}
418416
return _linkedName;
419417
}
420418

421-
String get superLinkedName => super.linkedName;
422-
423419
@override
424420
ElementTypeRenderer<CallableElementType> get _renderer =>
425421
packageGraph.rendererFactory.callableElementTypeRenderer;

lib/src/model/accessor.dart

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import 'package:analyzer/dart/element/element.dart';
66
import 'package:analyzer/src/dart/element/member.dart' show Member;
7+
import 'package:dartdoc/src/element_type.dart';
78
import 'package:dartdoc/src/model/model.dart';
89
import 'package:dartdoc/src/render/source_code_renderer.dart';
910
import 'package:dartdoc/src/utils.dart';
@@ -18,10 +19,8 @@ class Accessor extends ModelElement implements EnclosedElement {
1819
[Member /*?*/ originalMember])
1920
: super(element, library, packageGraph, originalMember);
2021

21-
String get linkedReturnType {
22-
assert(isGetter);
23-
return modelType.createLinkedReturnTypeName();
24-
}
22+
@override
23+
CallableElementTypeMixin get modelType => super.modelType;
2524

2625
bool get isSynthetic => element.isSynthetic;
2726

lib/src/model/field.dart

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import 'package:analyzer/dart/element/element.dart';
66
import 'package:analyzer/src/dart/element/element.dart';
7-
import 'package:dartdoc/src/element_type.dart';
87
import 'package:dartdoc/src/model/model.dart';
98
import 'package:dartdoc/src/render/source_code_renderer.dart';
109

@@ -199,9 +198,6 @@ class Field extends ModelElement
199198
}
200199
}
201200

202-
@override
203-
CallableElementType get modelType => super.modelType;
204-
205201
@override
206202
Inheritable get overriddenElement => null;
207203
}

lib/src/model/getter_setter_combo.dart

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:analyzer/dart/ast/ast.dart';
88
import 'package:analyzer/dart/element/element.dart';
99
import 'package:analyzer/source/line_info.dart';
1010
import 'package:analyzer/src/dart/element/element.dart';
11+
import 'package:dartdoc/src/element_type.dart';
1112
import 'package:dartdoc/src/model/model.dart';
1213
import 'package:dartdoc/src/utils.dart';
1314
import 'package:dartdoc/src/warnings.dart';
@@ -179,14 +180,10 @@ mixin GetterSetterCombo on ModelElement {
179180
return buffer.toString();
180181
}
181182

182-
String get linkedReturnType {
183-
if (hasGetter) {
184-
return getter.linkedReturnType;
185-
} else {
186-
// TODO(jcollins-g): this results in the wrong span class for the return
187-
// type.
188-
return setter.linkedParamsNoMetadataOrNames;
189-
}
183+
@override
184+
ElementType get modelType {
185+
if (hasGetter) return getter.modelType.returnType;
186+
return setter.parameters.first.modelType;
190187
}
191188

192189
@override

lib/src/model/method.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import 'package:analyzer/dart/element/element.dart';
66
import 'package:analyzer/source/line_info.dart';
77
import 'package:analyzer/src/dart/element/member.dart' show Member;
8+
import 'package:dartdoc/src/element_type.dart';
89
import 'package:dartdoc/src/model/model.dart';
910

1011
class Method extends ModelElement
@@ -92,7 +93,8 @@ class Method extends ModelElement
9293
@override
9394
String get kind => 'method';
9495

95-
String get linkedReturnType => modelType.createLinkedReturnTypeName();
96+
@override
97+
CallableElementTypeMixin get modelType => super.modelType;
9698

9799
@override
98100
Method get overriddenElement {

lib/src/model/model_function.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,6 @@ class ModelFunctionTyped extends ModelElement
6666
@override
6767
String get kind => 'function';
6868

69-
String get linkedReturnType => modelType.createLinkedReturnTypeName();
70-
7169
// Food for mustache. TODO(jcollins-g): what about enclosing elements?
7270
bool get isInherited => false;
7371

lib/src/model/top_level_variable.dart

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
import 'package:analyzer/dart/element/element.dart';
6-
import 'package:dartdoc/src/element_type.dart';
76
import 'package:dartdoc/src/model/model.dart';
87

98
/// Top-level variables. But also picks up getters and setters?
@@ -86,8 +85,5 @@ class TopLevelVariable extends ModelElement
8685
@override
8786
String get fileName => '${isConst ? '$name-constant' : name}.$fileType';
8887

89-
@override
90-
DefinedElementType get modelType => super.modelType;
91-
9288
TopLevelVariableElement get _variable => (element as TopLevelVariableElement);
9389
}

lib/src/model/typedef.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import 'package:analyzer/dart/element/element.dart';
66
import 'package:analyzer/dart/element/type.dart';
7+
import 'package:dartdoc/src/element_type.dart';
78
import 'package:dartdoc/src/model/model.dart';
89
import 'package:dartdoc/src/render/typedef_renderer.dart';
910

@@ -49,8 +50,6 @@ class Typedef extends ModelElement
4950
@override
5051
String get kind => 'typedef';
5152

52-
String get linkedReturnType => modelType.createLinkedReturnTypeName();
53-
5453
@override
5554
List<TypeParameter> get typeParameters => element.typeParameters.map((f) {
5655
return ModelElement.from(f, library, packageGraph) as TypeParameter;
@@ -79,4 +78,7 @@ class FunctionTypedef extends Typedef {
7978
}
8079
return super.genericTypeParameters;
8180
}
81+
82+
@override
83+
CallableElementTypeMixin get modelType => super.modelType;
8284
}

lib/src/render/element_type_renderer.dart

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,6 @@ class CallableElementTypeRendererHtml
8787
extends ElementTypeRenderer<CallableElementType> {
8888
@override
8989
String renderLinkedName(CallableElementType elementType) {
90-
if (elementType.name != null && elementType.name.isNotEmpty) {
91-
return elementType.superLinkedName;
92-
}
93-
9490
var buf = StringBuffer();
9591
buf.write(elementType.nameWithGenerics);
9692
buf.write('(');
@@ -168,15 +164,11 @@ class CallableElementTypeRendererMd
168164
extends ElementTypeRenderer<CallableElementType> {
169165
@override
170166
String renderLinkedName(CallableElementType elementType) {
171-
if (elementType.name != null && elementType.name.isNotEmpty) {
172-
return elementType.superLinkedName;
173-
}
174-
175167
var buf = StringBuffer();
176168
buf.write(elementType.nameWithGenerics);
177169
buf.write('(');
178170
buf.write(ParameterRendererMd()
179-
.renderLinkedParams(elementType.element.parameters, showNames: false)
171+
.renderLinkedParams(elementType.parameters, showNames: false)
180172
.trim());
181173
buf.write(') → ');
182174
buf.write(elementType.returnType.linkedName);

lib/src/render/parameter_renderer.dart

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -165,13 +165,12 @@ abstract class ParameterRenderer {
165165
if (param.isCovariant) {
166166
buf.write(covariant('covariant') + ' ');
167167
}
168-
if (paramModelType is CallableElementTypeMixin ||
169-
paramModelType.type is FunctionType) {
168+
if (paramModelType is CallableElementTypeMixin) {
170169
String returnTypeName;
171170
if (paramModelType.isTypedef) {
172171
returnTypeName = paramModelType.linkedName;
173172
} else {
174-
returnTypeName = paramModelType.createLinkedReturnTypeName();
173+
returnTypeName = paramModelType.returnType.linkedName;
175174
}
176175
buf.write(typeName(returnTypeName));
177176
if (showNames) {
@@ -182,8 +181,10 @@ abstract class ParameterRenderer {
182181
}
183182
if (!paramModelType.isTypedef && paramModelType is DefinedElementType) {
184183
buf.write('(');
185-
buf.write(renderLinkedParams(paramModelType.element.parameters,
186-
showMetadata: showMetadata, showNames: showNames));
184+
buf.write(renderLinkedParams(
185+
(paramModelType as DefinedElementType).element.parameters,
186+
showMetadata: showMetadata,
187+
showNames: showNames));
187188
buf.write(')');
188189
buf.write(paramModelType.nullabilitySuffix);
189190
}

0 commit comments

Comments
 (0)