Skip to content

Commit 51464a3

Browse files
authored
Refactor ModelElement.element to be a getter; subclasses provide the field (#3217)
1 parent 3cd12f9 commit 51464a3

21 files changed

+143
-135
lines changed

Diff for: lib/src/generator/templates.runtime_renderers.dart

+36-24
Original file line numberDiff line numberDiff line change
@@ -2970,28 +2970,6 @@ class _Renderer_Container extends RendererBase<Container> {
29702970
self.renderSimpleVariable(c, remainingNames, 'bool'),
29712971
getBool: (CT_ c) => c.isMixin == true,
29722972
),
2973-
'package': Property(
2974-
getValue: (CT_ c) => c.package,
2975-
renderVariable:
2976-
(CT_ c, Property<CT_> self, List<String> remainingNames) {
2977-
if (remainingNames.isEmpty) {
2978-
return self.getValue(c).toString();
2979-
}
2980-
var name = remainingNames.first;
2981-
var nextProperty =
2982-
_Renderer_Package.propertyMap().getValue(name);
2983-
return nextProperty.renderVariable(
2984-
self.getValue(c) as Package,
2985-
nextProperty,
2986-
[...remainingNames.skip(1)]);
2987-
},
2988-
isNullValue: (CT_ c) => false,
2989-
renderValue: (CT_ c, RendererBase<CT_> r,
2990-
List<MustachioNode> ast, StringSink sink) {
2991-
_render_Package(c.package, ast, r.template, sink,
2992-
parent: r);
2993-
},
2994-
),
29952973
'publicConstantFields': Property(
29962974
getValue: (CT_ c) => c.publicConstantFields,
29972975
renderVariable: (CT_ c, Property<CT_> self,
@@ -4358,6 +4336,19 @@ class _Renderer_Enum extends RendererBase<Enum> {
43584336
_render_Field(e, ast, r.template, sink, parent: r));
43594337
},
43604338
),
4339+
'element': Property(
4340+
getValue: (CT_ c) => c.element,
4341+
renderVariable: (CT_ c, Property<CT_> self,
4342+
List<String> remainingNames) =>
4343+
self.renderSimpleVariable(
4344+
c, remainingNames, 'EnumElement'),
4345+
isNullValue: (CT_ c) => false,
4346+
renderValue: (CT_ c, RendererBase<CT_> r,
4347+
List<MustachioNode> ast, StringSink sink) {
4348+
renderSimple(c.element, ast, r.template, sink,
4349+
parent: r, getters: _invisibleGetters['EnumElement']!);
4350+
},
4351+
),
43614352
'hasPublicEnumValues': Property(
43624353
getValue: (CT_ c) => c.hasPublicEnumValues,
43634354
renderVariable: (CT_ c, Property<CT_> self,
@@ -12218,13 +12209,13 @@ class _Renderer_PackageTemplateData extends RendererBase<PackageTemplateData> {
1221812209
}
1221912210
}
1222012211

12221-
String renderError(PackageTemplateData context, Template template) {
12212+
String renderIndex(PackageTemplateData context, Template template) {
1222212213
var buffer = StringBuffer();
1222312214
_render_PackageTemplateData(context, template.ast, template, buffer);
1222412215
return buffer.toString();
1222512216
}
1222612217

12227-
String renderIndex(PackageTemplateData context, Template template) {
12218+
String renderError(PackageTemplateData context, Template template) {
1222812219
var buffer = StringBuffer();
1222912220
_render_PackageTemplateData(context, template.ast, template, buffer);
1223012221
return buffer.toString();
@@ -14341,6 +14332,20 @@ class _Renderer_TopLevelVariable extends RendererBase<TopLevelVariable> {
1434114332
parent: r);
1434214333
},
1434314334
),
14335+
'element': Property(
14336+
getValue: (CT_ c) => c.element,
14337+
renderVariable: (CT_ c, Property<CT_> self,
14338+
List<String> remainingNames) =>
14339+
self.renderSimpleVariable(
14340+
c, remainingNames, 'TopLevelVariableElement'),
14341+
isNullValue: (CT_ c) => false,
14342+
renderValue: (CT_ c, RendererBase<CT_> r,
14343+
List<MustachioNode> ast, StringSink sink) {
14344+
renderSimple(c.element, ast, r.template, sink,
14345+
parent: r,
14346+
getters: _invisibleGetters['TopLevelVariableElement']!);
14347+
},
14348+
),
1434414349
'enclosingElement': Property(
1434514350
getValue: (CT_ c) => c.enclosingElement,
1434614351
renderVariable:
@@ -15900,6 +15905,7 @@ const _invisibleGetters = {
1590015905
'isVisibleForTesting',
1590115906
'runtimeType'
1590215907
},
15908+
'EnumElement': {'augmented', 'hashCode', 'runtimeType'},
1590315909
'ExecutableMember': {
1590415910
'context',
1590515911
'declaration',
@@ -16404,6 +16410,12 @@ const _invisibleGetters = {
1640416410
'toolVersion',
1640516411
'useBaseHref'
1640616412
},
16413+
'TopLevelVariableElement': {
16414+
'declaration',
16415+
'hashCode',
16416+
'isExternal',
16417+
'runtimeType'
16418+
},
1640716419
'TypeAliasElement': {
1640816420
'aliasedElement',
1640916421
'aliasedType',

Diff for: lib/src/model/accessor.dart

+4-6
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ import 'package:dartdoc/src/warnings.dart';
1616

1717
/// Getters and setters.
1818
class Accessor extends ModelElement implements EnclosedElement {
19+
@override
20+
final PropertyAccessorElement element;
21+
1922
/// The combo ([Field] or [TopLevelVariable]) containing this accessor.
2023
///
2124
/// Initialized in [Field]'s constructor and in [TopLevelVariable]'s
@@ -24,8 +27,7 @@ class Accessor extends ModelElement implements EnclosedElement {
2427
// initialized by code inside this library.
2528
late GetterSetterCombo enclosingCombo;
2629

27-
Accessor(
28-
PropertyAccessorElement super.element, super.library, super.packageGraph,
30+
Accessor(this.element, super.library, super.packageGraph,
2931
[ExecutableMember? super.originalMember]);
3032

3133
@override
@@ -38,10 +40,6 @@ class Accessor extends ModelElement implements EnclosedElement {
3840
return super.characterLocation;
3941
}
4042

41-
@override
42-
PropertyAccessorElement get element =>
43-
super.element as PropertyAccessorElement;
44-
4543
@override
4644
ExecutableMember? get originalMember =>
4745
super.originalMember as ExecutableMember?;

Diff for: lib/src/model/class.dart

+5-5
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@ import 'package:dartdoc/src/model/model.dart';
1414
/// **inherited**: Filtered getters giving only inherited children.
1515
class Class extends InheritingContainer
1616
with Constructable, TypeImplementing, MixedInTypes {
17-
Class(ClassElement element, Library library, PackageGraph packageGraph)
18-
: super(element, library, packageGraph) {
17+
@override
18+
final ClassElement element;
19+
20+
Class(this.element, Library library, PackageGraph packageGraph)
21+
: super(library, packageGraph) {
1922
packageGraph.specialClasses.addSpecial(this);
2023
}
2124

22-
@override
23-
ClassElement get element => super.element as ClassElement;
24-
2525
@override
2626
late final List<ModelElement> allModelElements = [
2727
...super.allModelElements,

Diff for: lib/src/model/constructor.dart

+4-5
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@ import 'package:dartdoc/src/model/model.dart';
1111
class Constructor extends ModelElement
1212
with TypeParameters, ContainerMember
1313
implements EnclosedElement {
14-
Constructor(
15-
ConstructorElement super.element, super.library, super.packageGraph);
14+
@override
15+
final ConstructorElement element;
16+
17+
Constructor(this.element, super.library, super.packageGraph);
1618

1719
@override
1820
CharacterLocation? get characterLocation {
@@ -25,9 +27,6 @@ class Constructor extends ModelElement
2527
return super.characterLocation;
2628
}
2729

28-
@override
29-
ConstructorElement get element => super.element as ConstructorElement;
30-
3130
@override
3231
List<TypeParameter> get typeParameters =>
3332
(enclosingElement as Constructable).typeParameters;

Diff for: lib/src/model/container.dart

+1-5
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,7 @@ import 'package:meta/meta.dart';
2929
/// are empty. These are available mostly for the templating system.
3030
abstract class Container extends ModelElement
3131
with Categorization, TypeParameters {
32-
Container(super.element, super.library, super.packageGraph);
33-
34-
/// Containers must have associated packages.
35-
@override
36-
Package get package => super.package;
32+
Container(super.library, super.packageGraph);
3733

3834
// TODO(jcollins-g): Implement a ContainerScope that flattens supertypes?
3935
@override

Diff for: lib/src/model/dynamic.dart

+5-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,11 @@ import 'package:dartdoc/src/model/comment_referable.dart';
88
import 'package:dartdoc/src/model/model.dart';
99

1010
class Dynamic extends ModelElement with HasNoPage {
11-
Dynamic(Element element, PackageGraph packageGraph)
12-
: super(element, Library.sentinel, packageGraph);
11+
@override
12+
final Element element;
13+
14+
Dynamic(this.element, PackageGraph packageGraph)
15+
: super(Library.sentinel, packageGraph);
1316

1417
UndefinedElementType get modelType =>
1518
throw UnimplementedError('(${element.runtimeType}) $element');

Diff for: lib/src/model/enum.dart

+4-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@ import 'package:dartdoc/src/render/enum_field_renderer.dart';
1010

1111
class Enum extends InheritingContainer
1212
with Constructable, TypeImplementing, MixedInTypes {
13-
Enum(super.element, super.library, super.packageGraph);
13+
@override
14+
final EnumElement element;
15+
16+
Enum(this.element, super.library, super.packageGraph);
1417

1518
@override
1619
late final List<ModelElement> allModelElements = [

Diff for: lib/src/model/extension.dart

+4-4
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,13 @@ import 'package:meta/meta.dart';
1212

1313
/// Extension methods
1414
class Extension extends Container implements EnclosedElement {
15+
@override
16+
final ExtensionElement element;
17+
1518
late final ElementType extendedType =
1619
modelBuilder.typeFrom(element.extendedType, library);
1720

18-
Extension(ExtensionElement super.element, super.library, super.packageGraph);
21+
Extension(this.element, super.library, super.packageGraph);
1922

2023
/// Detect if this extension applies to every object.
2124
bool get alwaysApplies =>
@@ -56,9 +59,6 @@ class Extension extends Container implements EnclosedElement {
5659
.map((e) => modelBuilder.from(e, library) as Method)
5760
.toList(growable: false);
5861

59-
@override
60-
ExtensionElement get element => super.element as ExtensionElement;
61-
6262
@override
6363
String get name => element.name == null ? '' : super.name;
6464

Diff for: lib/src/model/field.dart

+5-5
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,18 @@ import 'package:dartdoc/src/render/source_code_renderer.dart';
1010
class Field extends ModelElement
1111
with GetterSetterCombo, ContainerMember, Inheritable
1212
implements EnclosedElement {
13+
@override
14+
final FieldElement element;
15+
1316
bool _isInherited = false;
1417
late final Container _enclosingContainer;
1518
@override
1619
final ContainerAccessor? getter;
1720
@override
1821
final ContainerAccessor? setter;
1922

20-
Field(FieldElement super.element, super.library, super.packageGraph,
21-
this.getter, this.setter)
23+
Field(
24+
this.element, super.library, super.packageGraph, this.getter, this.setter)
2225
: assert(getter != null || setter != null) {
2326
getter?.enclosingCombo = this;
2427
setter?.enclosingCombo = this;
@@ -41,9 +44,6 @@ class Field extends ModelElement
4144
return newField;
4245
}
4346

44-
@override
45-
FieldElement get element => super.element as FieldElement;
46-
4747
@override
4848
String get documentation {
4949
if (enclosingElement is Enum) {

Diff for: lib/src/model/inheriting_container.dart

+11-10
Original file line numberDiff line numberDiff line change
@@ -182,17 +182,18 @@ abstract class InheritingContainer extends Container
182182
with ExtensionTarget
183183
implements EnclosedElement {
184184
@override
185-
InterfaceElement get element => super.element as InterfaceElement;
186-
187-
DefinedElementType? _supertype;
188-
DefinedElementType? get supertype =>
189-
_supertype ??= element.supertype?.element2.supertype == null
190-
? null
191-
: modelBuilder.typeFrom(element.supertype!, library)
192-
as DefinedElementType?;
185+
InterfaceElement get element;
186+
187+
late final DefinedElementType? supertype = () {
188+
final elementSupertype = element.supertype;
189+
return elementSupertype == null ||
190+
elementSupertype.element2.supertype == null
191+
? null
192+
: modelBuilder.typeFrom(elementSupertype, library)
193+
as DefinedElementType;
194+
}();
193195

194-
InheritingContainer(
195-
InterfaceElement super.element, super.library, super.packageGraph);
196+
InheritingContainer(super.library, super.packageGraph);
196197

197198
@override
198199
Iterable<Method> get instanceMethods =>

Diff for: lib/src/model/library.dart

+5-5
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ class _LibrarySentinel implements Library {
5959
}
6060

6161
class Library extends ModelElement with Categorization, TopLevelContainer {
62+
@override
63+
final LibraryElement element;
64+
6265
final Set<Element> _exportedAndLocalElements;
6366
final String _restoredUri;
6467

@@ -77,9 +80,9 @@ class Library extends ModelElement with Categorization, TopLevelContainer {
7780
/// abstract getter.
7881
static final Library sentinel = _LibrarySentinel();
7982

80-
Library._(LibraryElement element, PackageGraph packageGraph, this.package,
83+
Library._(this.element, PackageGraph packageGraph, this.package,
8184
this._restoredUri, this._exportedAndLocalElements)
82-
: super(element, sentinel, packageGraph);
85+
: super(sentinel, packageGraph);
8386

8487
factory Library.fromLibraryResult(DartDocResolvedLibrary resolvedLibrary,
8588
PackageGraph packageGraph, Package package) {
@@ -185,9 +188,6 @@ class Library extends ModelElement with Categorization, TopLevelContainer {
185188
@override
186189
Iterable<Class> get classes => allClasses.where((c) => !c.isErrorOrException);
187190

188-
@override
189-
LibraryElement get element => super.element as LibraryElement;
190-
191191
@override
192192
late final Iterable<Extension> extensions = _exportedAndLocalElements
193193
.whereType<ExtensionElement>()

Diff for: lib/src/model/method.dart

+14-14
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,26 @@ import 'package:dartdoc/src/model/model.dart';
1414
class Method extends ModelElement
1515
with ContainerMember, Inheritable, TypeParameters
1616
implements EnclosedElement {
17-
bool _isInherited = false;
17+
@override
18+
final MethodElement element;
19+
1820
Container? _enclosingContainer;
21+
22+
final bool _isInherited;
23+
1924
@override
2025
late final List<TypeParameter> typeParameters;
2126

22-
Method(MethodElement super.element, super.library, super.packageGraph) {
27+
Method(this.element, super.library, super.packageGraph)
28+
: _isInherited = false {
2329
_calcTypeParameters();
2430
}
2531

26-
Method.inherited(MethodElement element, this._enclosingContainer,
27-
Library library, PackageGraph packageGraph,
32+
Method.inherited(this.element, this._enclosingContainer, Library library,
33+
PackageGraph packageGraph,
2834
{ExecutableMember? originalMember})
29-
: super(element, library, packageGraph, originalMember) {
30-
_isInherited = true;
35+
: _isInherited = true,
36+
super(library, packageGraph, originalMember) {
3137
_calcTypeParameters();
3238
}
3339

@@ -51,11 +57,8 @@ class Method extends ModelElement
5157
}
5258

5359
@override
54-
Container get enclosingElement {
55-
_enclosingContainer ??=
56-
modelBuilder.from(element.enclosingElement3, library) as Container?;
57-
return _enclosingContainer!;
58-
}
60+
Container get enclosingElement => _enclosingContainer ??=
61+
modelBuilder.from(element.enclosingElement3, library) as Container;
5962

6063
@override
6164
String get filePath =>
@@ -119,9 +122,6 @@ class Method extends ModelElement
119122
return null;
120123
}
121124

122-
@override
123-
MethodElement get element => super.element as MethodElement;
124-
125125
/// Methods can not be covariant; always returns false.
126126
@override
127127
bool get isCovariant => false;

0 commit comments

Comments
 (0)