Skip to content

Commit 7022b7f

Browse files
authored
Extract modelType out of ModelElement (#2583)
* 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 * begin extraction * Exclude InterfaceType. Hacky. * refactor continuing * dartfmt, finish modelType extraction * todo:ignore and no dynamic * fix it all * cleanup * dartfmt and review comments
1 parent 52e50c9 commit 7022b7f

14 files changed

+97
-109
lines changed

lib/src/model/accessor.dart

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

55
import 'package:analyzer/dart/element/element.dart';
6-
import 'package:analyzer/src/dart/element/member.dart' show Member;
6+
import 'package:analyzer/src/dart/element/member.dart' show ExecutableMember;
77
import 'package:dartdoc/src/element_type.dart';
88
import 'package:dartdoc/src/model/model.dart';
99
import 'package:dartdoc/src/render/source_code_renderer.dart';
@@ -16,11 +16,18 @@ class Accessor extends ModelElement implements EnclosedElement {
1616

1717
Accessor(PropertyAccessorElement element, Library library,
1818
PackageGraph packageGraph,
19-
[Member /*?*/ originalMember])
19+
[ExecutableMember /*?*/ originalMember])
2020
: super(element, library, packageGraph, originalMember);
2121

2222
@override
23-
CallableElementTypeMixin get modelType => super.modelType;
23+
PropertyAccessorElement get element => super.element;
24+
25+
@override
26+
ExecutableMember get originalMember => super.originalMember;
27+
28+
CallableElementTypeMixin _modelType;
29+
CallableElementTypeMixin get modelType => _modelType ??=
30+
ElementType.from((originalMember ?? element).type, library, packageGraph);
2431

2532
bool get isSynthetic => element.isSynthetic;
2633

@@ -31,7 +38,7 @@ class Accessor extends ModelElement implements EnclosedElement {
3138
// The [enclosingCombo] where this element was defined.
3239
GetterSetterCombo get definingCombo {
3340
if (_definingCombo == null) {
34-
var variable = (element as PropertyAccessorElement).variable;
41+
var variable = element.variable;
3542
_definingCombo = ModelElement.fromElement(variable, packageGraph);
3643
assert(_definingCombo != null, 'Unable to find defining combo');
3744
}
@@ -85,12 +92,12 @@ class Accessor extends ModelElement implements EnclosedElement {
8592

8693
@override
8794
ModelElement get enclosingElement {
88-
if (_accessor.enclosingElement is CompilationUnitElement) {
95+
if (element.enclosingElement is CompilationUnitElement) {
8996
return packageGraph.findButDoNotCreateLibraryFor(
90-
_accessor.enclosingElement.enclosingElement);
97+
element.enclosingElement.enclosingElement);
9198
}
9299

93-
return ModelElement.from(_accessor.enclosingElement, library, packageGraph);
100+
return ModelElement.from(element.enclosingElement, library, packageGraph);
94101
}
95102

96103
@override
@@ -104,9 +111,9 @@ class Accessor extends ModelElement implements EnclosedElement {
104111
return enclosingCombo.href;
105112
}
106113

107-
bool get isGetter => _accessor.isGetter;
114+
bool get isGetter => element.isGetter;
108115

109-
bool get isSetter => _accessor.isSetter;
116+
bool get isSetter => element.isSetter;
110117

111118
@override
112119
String get kind => 'accessor';
@@ -118,8 +125,6 @@ class Accessor extends ModelElement implements EnclosedElement {
118125
_namePart ??= super.namePart.split('=').first;
119126
return _namePart;
120127
}
121-
122-
PropertyAccessorElement get _accessor => (element as PropertyAccessorElement);
123128
}
124129

125130
/// A getter or setter that is a member of a [Container].
@@ -153,7 +158,7 @@ class ContainerAccessor extends Accessor with ContainerMember, Inheritable {
153158

154159
ContainerAccessor.inherited(PropertyAccessorElement element, Library library,
155160
PackageGraph packageGraph, this._enclosingElement,
156-
{Member originalMember})
161+
{ExecutableMember originalMember})
157162
: super(element, library, packageGraph, originalMember) {
158163
_isInherited = true;
159164
}

lib/src/model/class.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,8 +334,11 @@ class Class extends Container
334334
Iterable<DefinedElementType> get publicMixedInTypes =>
335335
model_utils.filterNonPublic(mixedInTypes);
336336

337+
DefinedElementType _modelType;
338+
337339
@override
338-
DefinedElementType get modelType => super.modelType;
340+
DefinedElementType get modelType =>
341+
_modelType ??= ElementType.from(element.thisType, library, packageGraph);
339342

340343
/// Not the same as superChain as it may include mixins.
341344
/// It's really not even the same as ordinary Dart inheritance, either,

lib/src/model/constructor.dart

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,17 @@ class Constructor extends ModelElement
2525
return super.characterLocation;
2626
}
2727

28+
@override
29+
ConstructorElement get element => super.element;
30+
2831
@override
2932
// TODO(jcollins-g): Revisit this when dart-lang/sdk#31517 is implemented.
3033
List<TypeParameter> get typeParameters =>
3134
(enclosingElement as Class).typeParameters;
3235

3336
@override
3437
ModelElement get enclosingElement =>
35-
ModelElement.from(_constructor.enclosingElement, library, packageGraph);
38+
ModelElement.from(element.enclosingElement, library, packageGraph);
3639

3740
@override
3841
String get filePath =>
@@ -61,7 +64,7 @@ class Constructor extends ModelElement
6164
}
6265

6366
@override
64-
bool get isConst => _constructor.isConst;
67+
bool get isConst => element.isConst;
6568

6669
bool get isUnnamedConstructor => name == enclosingElement.name;
6770

@@ -70,13 +73,14 @@ class Constructor extends ModelElement
7073
'be removed as early as Dartdoc 1.0.0')
7174
bool get isDefaultConstructor => isUnnamedConstructor;
7275

73-
bool get isFactory => _constructor.isFactory;
76+
bool get isFactory => element.isFactory;
7477

7578
@override
7679
String get kind => 'constructor';
7780

78-
@override
79-
DefinedElementType get modelType => super.modelType;
81+
DefinedElementType _modelType;
82+
DefinedElementType get modelType =>
83+
_modelType ??= ElementType.from(element.type, library, packageGraph);
8084

8185
String _name;
8286

@@ -111,11 +115,9 @@ class Constructor extends ModelElement
111115

112116
String get shortName {
113117
if (name.contains('.')) {
114-
return name.substring(_constructor.enclosingElement.name.length + 1);
118+
return name.substring(element.enclosingElement.name.length + 1);
115119
} else {
116120
return name;
117121
}
118122
}
119-
120-
ConstructorElement get _constructor => (element as ConstructorElement);
121123
}

lib/src/model/dynamic.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,16 @@
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/dartdoc.dart';
67
import 'package:dartdoc/src/model/model.dart';
78

89
class Dynamic extends ModelElement {
910
Dynamic(Element element, PackageGraph packageGraph)
1011
: super(element, null, packageGraph);
1112

13+
UndefinedElementType get modelType =>
14+
throw UnimplementedError('(${element.runtimeType}) $element');
15+
1216
/// [dynamic] is not a real object, and so we can't document it, so there
1317
/// can be nothing canonical for it.
1418
@override

lib/src/model/extension.dart

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,6 @@ class Extension extends Container
9393
return _typeParameters;
9494
}
9595

96-
@override
97-
ParameterizedElementType get modelType => super.modelType;
98-
9996
List<ModelElement> _allModelElements;
10097
@override
10198
List<ModelElement> get allModelElements {

lib/src/model/extension_target.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5+
import 'package:dartdoc/src/element_type.dart';
56
import 'package:dartdoc/src/model/model.dart';
67

78
// TODO(jcollins-g): Mix-in ExtensionTarget on Method, ModelFunction, Typedef,
@@ -27,6 +28,8 @@ mixin ExtensionTarget on ModelElement {
2728
return _potentiallyApplicableExtensions;
2829
}
2930

31+
ElementType get modelType;
32+
3033
List<Extension> get potentiallyApplicableExtensionsSorted =>
3134
potentiallyApplicableExtensions.toList()..sort(byName);
3235
}

lib/src/model/field.dart

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ class Field extends ModelElement
2323
assert(getter != null || setter != null);
2424
if (getter != null) getter.enclosingCombo = this;
2525
if (setter != null) setter.enclosingCombo = this;
26-
_setModelType();
2726
}
2827

2928
factory Field.inherited(
@@ -192,12 +191,6 @@ class Field extends ModelElement
192191
return _sourceCode;
193192
}
194193

195-
void _setModelType() {
196-
if (hasGetter) {
197-
setModelType(getter.modelType);
198-
}
199-
}
200-
201194
@override
202195
Inheritable get overriddenElement => null;
203196
}

lib/src/model/getter_setter_combo.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,6 @@ mixin GetterSetterCombo on ModelElement {
180180
return buffer.toString();
181181
}
182182

183-
@override
184183
ElementType get modelType {
185184
if (hasGetter) return getter.modelType.returnType;
186185
return setter.parameters.first.modelType;

lib/src/model/method.dart

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

55
import 'package:analyzer/dart/element/element.dart';
66
import 'package:analyzer/source/line_info.dart';
7-
import 'package:analyzer/src/dart/element/member.dart' show Member;
7+
import 'package:analyzer/src/dart/element/member.dart' show ExecutableMember;
88
import 'package:dartdoc/src/element_type.dart';
99
import 'package:dartdoc/src/model/model.dart';
1010

@@ -23,14 +23,14 @@ class Method extends ModelElement
2323

2424
Method.inherited(MethodElement element, this._enclosingContainer,
2525
Library library, PackageGraph packageGraph,
26-
{Member originalMember})
26+
{ExecutableMember originalMember})
2727
: super(element, library, packageGraph, originalMember) {
2828
_isInherited = true;
2929
_calcTypeParameters();
3030
}
3131

3232
void _calcTypeParameters() {
33-
typeParameters = _method.typeParameters.map((f) {
33+
typeParameters = element.typeParameters.map((f) {
3434
return ModelElement.from(f, library, packageGraph) as TypeParameter;
3535
}).toList();
3636
}
@@ -51,7 +51,7 @@ class Method extends ModelElement
5151
@override
5252
ModelElement get enclosingElement {
5353
_enclosingContainer ??=
54-
ModelElement.from(_method.enclosingElement, library, packageGraph);
54+
ModelElement.from(element.enclosingElement, library, packageGraph);
5555
return _enclosingContainer;
5656
}
5757

@@ -60,7 +60,7 @@ class Method extends ModelElement
6060
'${enclosingElement.library.dirName}/${enclosingElement.name}/$fileName';
6161

6262
String get fullkind {
63-
if (_method.isAbstract) return 'abstract $kind';
63+
if (element.isAbstract) return 'abstract $kind';
6464
return kind;
6565
}
6666

@@ -88,13 +88,17 @@ class Method extends ModelElement
8888
}
8989

9090
@override
91-
bool get isStatic => _method.isStatic;
91+
bool get isStatic => element.isStatic;
9292

9393
@override
9494
String get kind => 'method';
9595

9696
@override
97-
CallableElementTypeMixin get modelType => super.modelType;
97+
ExecutableMember get originalMember => super.originalMember;
98+
99+
CallableElementTypeMixin _modelType;
100+
CallableElementTypeMixin get modelType => _modelType ??=
101+
ElementType.from((originalMember ?? element).type, library, packageGraph);
98102

99103
@override
100104
Method get overriddenElement {
@@ -112,7 +116,8 @@ class Method extends ModelElement
112116
return null;
113117
}
114118

115-
MethodElement get _method => (element as MethodElement);
119+
@override
120+
MethodElement get element => super.element;
116121

117122
/// Methods can not be covariant; always returns false.
118123
@override

lib/src/model/model_element.dart

Lines changed: 1 addition & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,9 @@ import 'package:analyzer/dart/element/type.dart' show FunctionType;
1212
import 'package:analyzer/source/line_info.dart';
1313
import 'package:analyzer/src/dart/element/element.dart';
1414
import 'package:analyzer/src/dart/element/member.dart'
15-
show ExecutableMember, Member, ParameterMember;
15+
show ExecutableMember, Member;
1616
import 'package:collection/collection.dart';
1717
import 'package:dartdoc/src/dartdoc_options.dart';
18-
import 'package:dartdoc/src/element_type.dart';
1918
import 'package:dartdoc/src/model/documentation_comment.dart';
2019
import 'package:dartdoc/src/model/feature_set.dart';
2120
import 'package:dartdoc/src/model/model.dart';
@@ -143,7 +142,6 @@ abstract class ModelElement extends Canonicalization
143142
final Member /*?*/ _originalMember;
144143
final Library /*?*/ _library;
145144

146-
ElementType _modelType;
147145
String _rawDocs;
148146
Documentation __documentation;
149147
UnmodifiableListView<Parameter> _parameters;
@@ -984,45 +982,6 @@ abstract class ModelElement extends Canonicalization
984982
String get linkedParamsNoMetadataOrNames => _parameterRenderer
985983
.renderLinkedParams(parameters, showMetadata: false, showNames: false);
986984

987-
ElementType get modelType {
988-
var element = this.element;
989-
if (_modelType == null) {
990-
// TODO(jcollins-g): Need an interface for a "member with a type" (or changed object model).
991-
if (_originalMember != null &&
992-
(_originalMember is ExecutableMember ||
993-
_originalMember is ParameterMember)) {
994-
if (_originalMember is ExecutableMember) {
995-
_modelType = ElementType.from(
996-
(_originalMember as ExecutableMember).type,
997-
library,
998-
packageGraph);
999-
} else {
1000-
// ParameterMember
1001-
_modelType = ElementType.from(
1002-
(_originalMember as ParameterMember).type, library, packageGraph);
1003-
}
1004-
} else if (element is ClassElement) {
1005-
_modelType = ElementType.from(element.thisType, library, packageGraph);
1006-
} else if (element is TypeAliasElement) {
1007-
_modelType =
1008-
ElementType.from(element.aliasedType, library, packageGraph);
1009-
} else if (element is FunctionTypedElement) {
1010-
_modelType = ElementType.from(element.type, library, packageGraph);
1011-
} else if (element is ParameterElement) {
1012-
_modelType = ElementType.from(element.type, library, packageGraph);
1013-
} else if (element is PropertyInducingElement) {
1014-
_modelType = ElementType.from(element.type, library, packageGraph);
1015-
} else {
1016-
throw UnimplementedError('(${element.runtimeType}) $element');
1017-
}
1018-
}
1019-
return _modelType;
1020-
}
1021-
1022-
void setModelType(ElementType type) {
1023-
_modelType = type;
1024-
}
1025-
1026985
String _name;
1027986

1028987
@override

lib/src/model/model_function.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,5 +70,9 @@ class ModelFunctionTyped extends ModelElement
7070
bool get isInherited => false;
7171

7272
@override
73-
DefinedElementType get modelType => super.modelType;
73+
FunctionTypedElement get element => super.element;
74+
75+
DefinedElementType _modelType;
76+
DefinedElementType get modelType =>
77+
_modelType ??= ElementType.from(element.type, library, packageGraph);
7478
}

0 commit comments

Comments
 (0)