Skip to content

Refactor ModelElement.element to be a getter; subclasses provide the field #3217

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Oct 24, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 36 additions & 24 deletions lib/src/generator/templates.runtime_renderers.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2970,28 +2970,6 @@ class _Renderer_Container extends RendererBase<Container> {
self.renderSimpleVariable(c, remainingNames, 'bool'),
getBool: (CT_ c) => c.isMixin == true,
),
'package': Property(
getValue: (CT_ c) => c.package,
renderVariable:
(CT_ c, Property<CT_> self, List<String> remainingNames) {
if (remainingNames.isEmpty) {
return self.getValue(c).toString();
}
var name = remainingNames.first;
var nextProperty =
_Renderer_Package.propertyMap().getValue(name);
return nextProperty.renderVariable(
self.getValue(c) as Package,
nextProperty,
[...remainingNames.skip(1)]);
},
isNullValue: (CT_ c) => false,
renderValue: (CT_ c, RendererBase<CT_> r,
List<MustachioNode> ast, StringSink sink) {
_render_Package(c.package, ast, r.template, sink,
parent: r);
},
),
'publicConstantFields': Property(
getValue: (CT_ c) => c.publicConstantFields,
renderVariable: (CT_ c, Property<CT_> self,
Expand Down Expand Up @@ -4358,6 +4336,19 @@ class _Renderer_Enum extends RendererBase<Enum> {
_render_Field(e, ast, r.template, sink, parent: r));
},
),
'element': Property(
getValue: (CT_ c) => c.element,
renderVariable: (CT_ c, Property<CT_> self,
List<String> remainingNames) =>
self.renderSimpleVariable(
c, remainingNames, 'EnumElement'),
isNullValue: (CT_ c) => false,
renderValue: (CT_ c, RendererBase<CT_> r,
List<MustachioNode> ast, StringSink sink) {
renderSimple(c.element, ast, r.template, sink,
parent: r, getters: _invisibleGetters['EnumElement']!);
},
),
'hasPublicEnumValues': Property(
getValue: (CT_ c) => c.hasPublicEnumValues,
renderVariable: (CT_ c, Property<CT_> self,
Expand Down Expand Up @@ -12218,13 +12209,13 @@ class _Renderer_PackageTemplateData extends RendererBase<PackageTemplateData> {
}
}

String renderError(PackageTemplateData context, Template template) {
String renderIndex(PackageTemplateData context, Template template) {
var buffer = StringBuffer();
_render_PackageTemplateData(context, template.ast, template, buffer);
return buffer.toString();
}

String renderIndex(PackageTemplateData context, Template template) {
String renderError(PackageTemplateData context, Template template) {
var buffer = StringBuffer();
_render_PackageTemplateData(context, template.ast, template, buffer);
return buffer.toString();
Expand Down Expand Up @@ -14341,6 +14332,20 @@ class _Renderer_TopLevelVariable extends RendererBase<TopLevelVariable> {
parent: r);
},
),
'element': Property(
getValue: (CT_ c) => c.element,
renderVariable: (CT_ c, Property<CT_> self,
List<String> remainingNames) =>
self.renderSimpleVariable(
c, remainingNames, 'TopLevelVariableElement'),
isNullValue: (CT_ c) => false,
renderValue: (CT_ c, RendererBase<CT_> r,
List<MustachioNode> ast, StringSink sink) {
renderSimple(c.element, ast, r.template, sink,
parent: r,
getters: _invisibleGetters['TopLevelVariableElement']!);
},
),
'enclosingElement': Property(
getValue: (CT_ c) => c.enclosingElement,
renderVariable:
Expand Down Expand Up @@ -15900,6 +15905,7 @@ const _invisibleGetters = {
'isVisibleForTesting',
'runtimeType'
},
'EnumElement': {'augmented', 'hashCode', 'runtimeType'},
'ExecutableMember': {
'context',
'declaration',
Expand Down Expand Up @@ -16404,6 +16410,12 @@ const _invisibleGetters = {
'toolVersion',
'useBaseHref'
},
'TopLevelVariableElement': {
'declaration',
'hashCode',
'isExternal',
'runtimeType'
},
'TypeAliasElement': {
'aliasedElement',
'aliasedType',
Expand Down
10 changes: 4 additions & 6 deletions lib/src/model/accessor.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ import 'package:dartdoc/src/warnings.dart';

/// Getters and setters.
class Accessor extends ModelElement implements EnclosedElement {
@override
final PropertyAccessorElement element;

/// The combo ([Field] or [TopLevelVariable]) containing this accessor.
///
/// Initialized in [Field]'s constructor and in [TopLevelVariable]'s
Expand All @@ -24,8 +27,7 @@ class Accessor extends ModelElement implements EnclosedElement {
// initialized by code inside this library.
late GetterSetterCombo enclosingCombo;

Accessor(
PropertyAccessorElement super.element, super.library, super.packageGraph,
Accessor(this.element, super.library, super.packageGraph,
[ExecutableMember? super.originalMember]);

@override
Expand All @@ -38,10 +40,6 @@ class Accessor extends ModelElement implements EnclosedElement {
return super.characterLocation;
}

@override
PropertyAccessorElement get element =>
super.element as PropertyAccessorElement;

@override
ExecutableMember? get originalMember =>
super.originalMember as ExecutableMember?;
Expand Down
10 changes: 5 additions & 5 deletions lib/src/model/class.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,14 @@ import 'package:dartdoc/src/model/model.dart';
/// **inherited**: Filtered getters giving only inherited children.
class Class extends InheritingContainer
with Constructable, TypeImplementing, MixedInTypes {
Class(ClassElement element, Library library, PackageGraph packageGraph)
: super(element, library, packageGraph) {
@override
final ClassElement element;

Class(this.element, Library library, PackageGraph packageGraph)
: super(library, packageGraph) {
packageGraph.specialClasses.addSpecial(this);
}

@override
ClassElement get element => super.element as ClassElement;

@override
late final List<ModelElement> allModelElements = [
...super.allModelElements,
Expand Down
9 changes: 4 additions & 5 deletions lib/src/model/constructor.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,10 @@ import 'package:dartdoc/src/model/model.dart';
class Constructor extends ModelElement
with TypeParameters, ContainerMember
implements EnclosedElement {
Constructor(
ConstructorElement super.element, super.library, super.packageGraph);
@override
final ConstructorElement element;

Constructor(this.element, super.library, super.packageGraph);

@override
CharacterLocation? get characterLocation {
Expand All @@ -25,9 +27,6 @@ class Constructor extends ModelElement
return super.characterLocation;
}

@override
ConstructorElement get element => super.element as ConstructorElement;

@override
List<TypeParameter> get typeParameters =>
(enclosingElement as Constructable).typeParameters;
Expand Down
6 changes: 1 addition & 5 deletions lib/src/model/container.dart
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,7 @@ import 'package:meta/meta.dart';
/// are empty. These are available mostly for the templating system.
abstract class Container extends ModelElement
with Categorization, TypeParameters {
Container(super.element, super.library, super.packageGraph);

/// Containers must have associated packages.
@override
Package get package => super.package;
Container(super.library, super.packageGraph);

// TODO(jcollins-g): Implement a ContainerScope that flattens supertypes?
@override
Expand Down
7 changes: 5 additions & 2 deletions lib/src/model/dynamic.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,11 @@ import 'package:dartdoc/src/model/comment_referable.dart';
import 'package:dartdoc/src/model/model.dart';

class Dynamic extends ModelElement with HasNoPage {
Dynamic(Element element, PackageGraph packageGraph)
: super(element, Library.sentinel, packageGraph);
@override
final Element element;

Dynamic(this.element, PackageGraph packageGraph)
: super(Library.sentinel, packageGraph);

UndefinedElementType get modelType =>
throw UnimplementedError('(${element.runtimeType}) $element');
Expand Down
5 changes: 4 additions & 1 deletion lib/src/model/enum.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,10 @@ import 'package:dartdoc/src/render/enum_field_renderer.dart';

class Enum extends InheritingContainer
with Constructable, TypeImplementing, MixedInTypes {
Enum(super.element, super.library, super.packageGraph);
@override
final EnumElement element;

Enum(this.element, super.library, super.packageGraph);

@override
late final List<ModelElement> allModelElements = [
Expand Down
8 changes: 4 additions & 4 deletions lib/src/model/extension.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,13 @@ import 'package:meta/meta.dart';

/// Extension methods
class Extension extends Container implements EnclosedElement {
@override
final ExtensionElement element;

late final ElementType extendedType =
modelBuilder.typeFrom(element.extendedType, library);

Extension(ExtensionElement super.element, super.library, super.packageGraph);
Extension(this.element, super.library, super.packageGraph);

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

@override
ExtensionElement get element => super.element as ExtensionElement;

@override
String get name => element.name == null ? '' : super.name;

Expand Down
10 changes: 5 additions & 5 deletions lib/src/model/field.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,18 @@ import 'package:dartdoc/src/render/source_code_renderer.dart';
class Field extends ModelElement
with GetterSetterCombo, ContainerMember, Inheritable
implements EnclosedElement {
@override
final FieldElement element;

bool _isInherited = false;
late final Container _enclosingContainer;
@override
final ContainerAccessor? getter;
@override
final ContainerAccessor? setter;

Field(FieldElement super.element, super.library, super.packageGraph,
this.getter, this.setter)
Field(
this.element, super.library, super.packageGraph, this.getter, this.setter)
: assert(getter != null || setter != null) {
getter?.enclosingCombo = this;
setter?.enclosingCombo = this;
Expand All @@ -41,9 +44,6 @@ class Field extends ModelElement
return newField;
}

@override
FieldElement get element => super.element as FieldElement;

@override
String get documentation {
if (enclosingElement is Enum) {
Expand Down
21 changes: 11 additions & 10 deletions lib/src/model/inheriting_container.dart
Original file line number Diff line number Diff line change
Expand Up @@ -182,17 +182,18 @@ abstract class InheritingContainer extends Container
with ExtensionTarget
implements EnclosedElement {
@override
InterfaceElement get element => super.element as InterfaceElement;

DefinedElementType? _supertype;
DefinedElementType? get supertype =>
_supertype ??= element.supertype?.element2.supertype == null
? null
: modelBuilder.typeFrom(element.supertype!, library)
as DefinedElementType?;
InterfaceElement get element;

late final DefinedElementType? supertype = () {
final elementSupertype = element.supertype;
return elementSupertype == null ||
elementSupertype.element2.supertype == null
? null
: modelBuilder.typeFrom(elementSupertype, library)
as DefinedElementType;
}();

InheritingContainer(
InterfaceElement super.element, super.library, super.packageGraph);
InheritingContainer(super.library, super.packageGraph);

@override
Iterable<Method> get instanceMethods =>
Expand Down
10 changes: 5 additions & 5 deletions lib/src/model/library.dart
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,9 @@ class _LibrarySentinel implements Library {
}

class Library extends ModelElement with Categorization, TopLevelContainer {
@override
final LibraryElement element;

final Set<Element> _exportedAndLocalElements;
final String _restoredUri;

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

Library._(LibraryElement element, PackageGraph packageGraph, this.package,
Library._(this.element, PackageGraph packageGraph, this.package,
this._restoredUri, this._exportedAndLocalElements)
: super(element, sentinel, packageGraph);
: super(sentinel, packageGraph);

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

@override
LibraryElement get element => super.element as LibraryElement;

@override
late final Iterable<Extension> extensions = _exportedAndLocalElements
.whereType<ExtensionElement>()
Expand Down
28 changes: 14 additions & 14 deletions lib/src/model/method.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,20 +14,26 @@ import 'package:dartdoc/src/model/model.dart';
class Method extends ModelElement
with ContainerMember, Inheritable, TypeParameters
implements EnclosedElement {
bool _isInherited = false;
@override
final MethodElement element;

Container? _enclosingContainer;

final bool _isInherited;

@override
late final List<TypeParameter> typeParameters;

Method(MethodElement super.element, super.library, super.packageGraph) {
Method(this.element, super.library, super.packageGraph)
: _isInherited = false {
_calcTypeParameters();
}

Method.inherited(MethodElement element, this._enclosingContainer,
Library library, PackageGraph packageGraph,
Method.inherited(this.element, this._enclosingContainer, Library library,
PackageGraph packageGraph,
{ExecutableMember? originalMember})
: super(element, library, packageGraph, originalMember) {
_isInherited = true;
: _isInherited = true,
super(library, packageGraph, originalMember) {
_calcTypeParameters();
}

Expand All @@ -51,11 +57,8 @@ class Method extends ModelElement
}

@override
Container get enclosingElement {
_enclosingContainer ??=
modelBuilder.from(element.enclosingElement3, library) as Container?;
return _enclosingContainer!;
}
Container get enclosingElement => _enclosingContainer ??=
modelBuilder.from(element.enclosingElement3, library) as Container;

@override
String get filePath =>
Expand Down Expand Up @@ -119,9 +122,6 @@ class Method extends ModelElement
return null;
}

@override
MethodElement get element => super.element as MethodElement;

/// Methods can not be covariant; always returns false.
@override
bool get isCovariant => false;
Expand Down
Loading