Skip to content

Commit 96832aa

Browse files
authored
Refactor constructors of ModelElement (#2828)
* partial * analyzes * finish refactor * rebuild and delete an unnecessary reference * rebuild * dartfmt * Rename to ModelObjectBuilder so that we can build more than just ModelElements * complete rename
1 parent c2f284f commit 96832aa

28 files changed

+273
-154
lines changed

lib/src/element_type.dart

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@ import 'package:analyzer/dart/element/nullability_suffix.dart';
1010
import 'package:analyzer/dart/element/type.dart';
1111
import 'package:dartdoc/src/model/comment_referable.dart';
1212
import 'package:dartdoc/src/model/model.dart';
13+
import 'package:dartdoc/src/model/model_object_builder.dart';
1314
import 'package:dartdoc/src/render/element_type_renderer.dart';
1415

1516
/// Base class representing a type in Dartdoc. It wraps a [DartType], and
1617
/// may link to a [ModelElement].
17-
abstract class ElementType extends Privacy with CommentReferable, Nameable {
18+
abstract class ElementType extends Privacy
19+
with CommentReferable, Nameable, ModelBuilder {
1820
final DartType _type;
1921
@override
2022
final PackageGraph packageGraph;
@@ -39,7 +41,7 @@ abstract class ElementType extends Privacy with CommentReferable, Nameable {
3941
}
4042
return UndefinedElementType(f, library, packageGraph, returnedFrom);
4143
} else {
42-
var element = ModelElement.fromElement(f.element, packageGraph);
44+
var element = packageGraph.modelBuilder.fromElement(f.element);
4345
// [TypeAliasElement.aliasElement] has different implications.
4446
// In that case it is an actual type alias of some kind (generic
4547
// or otherwise. Here however aliasElement signals that this is a
@@ -172,7 +174,7 @@ class FunctionTypeElementType extends UndefinedElementType
172174

173175
/// An unmodifiable list of this function element's type parameters.
174176
List<TypeParameter> get typeFormals => type.typeFormals
175-
.map((p) => ModelElement.from(p, library, packageGraph) as TypeParameter)
177+
.map((p) => packageGraph.modelBuilder.from(p, library) as TypeParameter)
176178
.toList(growable: false);
177179

178180
@override
@@ -218,16 +220,16 @@ class ParameterizedElementType extends DefinedElementType with Rendered {
218220
}
219221

220222
/// A [ElementType] whose underlying type was referrred to by a type alias.
221-
mixin Aliased implements ElementType {
223+
mixin Aliased implements ElementType, ModelBuilderInterface {
222224
@override
223225
String get name => type.alias.element.name;
224226

225227
@override
226228
bool get isTypedef => true;
227229

228230
ModelElement _aliasElement;
229-
ModelElement get aliasElement => _aliasElement ??=
230-
ModelElement.fromElement(type.alias.element, packageGraph);
231+
ModelElement get aliasElement =>
232+
_aliasElement ??= modelBuilder.fromElement(type.alias.element);
231233

232234
Iterable<ElementType> _aliasArguments;
233235
Iterable<ElementType> get aliasArguments =>
@@ -374,7 +376,7 @@ abstract class DefinedElementType extends ElementType {
374376
/// unless it is an alias reference.
375377
mixin Callable implements ElementType {
376378
List<Parameter> get parameters => type.parameters
377-
.map((p) => ModelElement.from(p, library, packageGraph) as Parameter)
379+
.map((p) => modelBuilder.from(p, library) as Parameter)
378380
.toList(growable: false);
379381

380382
ElementType _returnType;

lib/src/generator/templates.runtime_renderers.dart

Lines changed: 58 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import 'package:dartdoc/src/model/feature.dart';
1414
import 'package:dartdoc/src/model/feature_set.dart';
1515
import 'package:dartdoc/src/model/language_feature.dart';
1616
import 'package:dartdoc/src/model/model.dart';
17+
import 'package:dartdoc/src/model/model_object_builder.dart';
1718
import 'package:dartdoc/src/mustachio/parser.dart';
1819
import 'package:dartdoc/src/mustachio/renderer_base.dart';
1920
import 'package:dartdoc/src/warnings.dart';
@@ -369,6 +370,7 @@ class _Renderer_Annotation extends RendererBase<Annotation> {
369370
CT_,
370371
() => {
371372
..._Renderer_Feature.propertyMap<CT_>(),
373+
..._Renderer_ModelBuilder.propertyMap<CT_>(),
372374
'annotation': Property(
373375
getValue: (CT_ c) => c.annotation,
374376
renderVariable: (CT_ c, Property<CT_> self,
@@ -868,6 +870,7 @@ class _Renderer_Category extends RendererBase<Category> {
868870
..._Renderer_LibraryContainer.propertyMap<CT_>(),
869871
..._Renderer_TopLevelContainer.propertyMap<CT_>(),
870872
..._Renderer_Indexable.propertyMap<CT_>(),
873+
..._Renderer_ModelBuilder.propertyMap<CT_>(),
871874
'canonicalLibrary': Property(
872875
getValue: (CT_ c) => c.canonicalLibrary,
873876
renderVariable:
@@ -1929,19 +1932,6 @@ class _Renderer_CommentReferable extends RendererBase<CommentReferable> {
19291932
parent: r);
19301933
},
19311934
),
1932-
'packageGraph': Property(
1933-
getValue: (CT_ c) => c.packageGraph,
1934-
renderVariable: (CT_ c, Property<CT_> self,
1935-
List<String> remainingNames) =>
1936-
self.renderSimpleVariable(
1937-
c, remainingNames, 'PackageGraph'),
1938-
isNullValue: (CT_ c) => c.packageGraph == null,
1939-
renderValue: (CT_ c, RendererBase<CT_> r,
1940-
List<MustachioNode> ast, StringSink sink) {
1941-
renderSimple(c.packageGraph, ast, r.template, sink,
1942-
parent: r, getters: _invisibleGetters['PackageGraph']);
1943-
},
1944-
),
19451935
'referenceChildren': Property(
19461936
getValue: (CT_ c) => c.referenceChildren,
19471937
renderVariable: (CT_ c, Property<CT_> self,
@@ -4124,6 +4114,7 @@ class _Renderer_ElementType extends RendererBase<ElementType> {
41244114
..._Renderer_Privacy.propertyMap<CT_>(),
41254115
..._Renderer_CommentReferable.propertyMap<CT_>(),
41264116
..._Renderer_Nameable.propertyMap<CT_>(),
4117+
..._Renderer_ModelBuilder.propertyMap<CT_>(),
41274118
'canHaveParameters': Property(
41284119
getValue: (CT_ c) => c.canHaveParameters,
41294120
renderVariable: (CT_ c, Property<CT_> self,
@@ -9323,6 +9314,55 @@ class _Renderer_MixinTemplateData extends RendererBase<MixinTemplateData> {
93239314
}
93249315
}
93259316

9317+
class _Renderer_ModelBuilder extends RendererBase<ModelBuilder> {
9318+
static final Map<Type, Object> _propertyMapCache = {};
9319+
static Map<String, Property<CT_>> propertyMap<CT_ extends ModelBuilder>() =>
9320+
_propertyMapCache.putIfAbsent(
9321+
CT_,
9322+
() => {
9323+
'modelBuilder': Property(
9324+
getValue: (CT_ c) => c.modelBuilder,
9325+
renderVariable: (CT_ c, Property<CT_> self,
9326+
List<String> remainingNames) =>
9327+
self.renderSimpleVariable(
9328+
c, remainingNames, 'ModelObjectBuilder'),
9329+
isNullValue: (CT_ c) => c.modelBuilder == null,
9330+
renderValue: (CT_ c, RendererBase<CT_> r,
9331+
List<MustachioNode> ast, StringSink sink) {
9332+
renderSimple(c.modelBuilder, ast, r.template, sink,
9333+
parent: r,
9334+
getters: _invisibleGetters['ModelObjectBuilder']);
9335+
},
9336+
),
9337+
'packageGraph': Property(
9338+
getValue: (CT_ c) => c.packageGraph,
9339+
renderVariable: (CT_ c, Property<CT_> self,
9340+
List<String> remainingNames) =>
9341+
self.renderSimpleVariable(
9342+
c, remainingNames, 'PackageGraph'),
9343+
isNullValue: (CT_ c) => c.packageGraph == null,
9344+
renderValue: (CT_ c, RendererBase<CT_> r,
9345+
List<MustachioNode> ast, StringSink sink) {
9346+
renderSimple(c.packageGraph, ast, r.template, sink,
9347+
parent: r, getters: _invisibleGetters['PackageGraph']);
9348+
},
9349+
),
9350+
});
9351+
9352+
_Renderer_ModelBuilder(ModelBuilder context, RendererBase<Object> parent,
9353+
Template template, StringSink sink)
9354+
: super(context, parent, template, sink);
9355+
9356+
@override
9357+
Property<ModelBuilder> getProperty(String key) {
9358+
if (propertyMap<ModelBuilder>().containsKey(key)) {
9359+
return propertyMap<ModelBuilder>()[key];
9360+
} else {
9361+
return null;
9362+
}
9363+
}
9364+
}
9365+
93269366
void _render_ModelElement(ModelElement context, List<MustachioNode> ast,
93279367
Template template, StringSink sink,
93289368
{RendererBase<Object> parent}) {
@@ -9346,6 +9386,7 @@ class _Renderer_ModelElement extends RendererBase<ModelElement> {
93469386
..._Renderer_Indexable.propertyMap<CT_>(),
93479387
..._Renderer_FeatureSet.propertyMap<CT_>(),
93489388
..._Renderer_DocumentationComment.propertyMap<CT_>(),
9389+
..._Renderer_ModelBuilder.propertyMap<CT_>(),
93499390
'allParameters': Property(
93509391
getValue: (CT_ c) => c.allParameters,
93519392
renderVariable: (CT_ c, Property<CT_> self,
@@ -10827,6 +10868,7 @@ class _Renderer_Package extends RendererBase<Package> {
1082710868
..._Renderer_Canonicalization.propertyMap<CT_>(),
1082810869
..._Renderer_Warnable.propertyMap<CT_>(),
1082910870
..._Renderer_CommentReferable.propertyMap<CT_>(),
10871+
..._Renderer_ModelBuilder.propertyMap<CT_>(),
1083010872
'allLibraries': Property(
1083110873
getValue: (CT_ c) => c.allLibraries,
1083210874
renderVariable: (CT_ c, Property<CT_> self,
@@ -11583,7 +11625,7 @@ class _Renderer_Package extends RendererBase<Package> {
1158311625
}
1158411626
}
1158511627

11586-
String renderError(PackageTemplateData context, Template template) {
11628+
String renderIndex(PackageTemplateData context, Template template) {
1158711629
var buffer = StringBuffer();
1158811630
_render_PackageTemplateData(context, template.ast, template, buffer);
1158911631
return buffer.toString();
@@ -11785,7 +11827,7 @@ class _Renderer_PackageTemplateData extends RendererBase<PackageTemplateData> {
1178511827
}
1178611828
}
1178711829

11788-
String renderIndex(PackageTemplateData context, Template template) {
11830+
String renderError(PackageTemplateData context, Template template) {
1178911831
var buffer = StringBuffer();
1179011832
_render_PackageTemplateData(context, template.ast, template, buffer);
1179111833
return buffer.toString();
@@ -15126,7 +15168,6 @@ const _invisibleGetters = {
1512615168
'unnamedConstructor'
1512715169
},
1512815170
'CommentReferable': {
15129-
'packageGraph',
1513015171
'scope',
1513115172
'href',
1513215173
'referenceChildren',
@@ -15610,6 +15651,7 @@ const _invisibleGetters = {
1561015651
'resourceProvider',
1561115652
'sourceCode'
1561215653
},
15654+
'ModelObjectBuilder': {'hashCode', 'runtimeType'},
1561315655
'PackageGraph': {
1561415656
'hashCode',
1561515657
'runtimeType',

lib/src/model/accessor.dart

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class Accessor extends ModelElement implements EnclosedElement {
5151
GetterSetterCombo get definingCombo {
5252
if (_definingCombo == null) {
5353
var variable = element.variable;
54-
_definingCombo = ModelElement.fromElement(variable, packageGraph);
54+
_definingCombo = modelBuilder.fromElement(variable);
5555
assert(_definingCombo != null, 'Unable to find defining combo');
5656
}
5757
return _definingCombo;
@@ -141,7 +141,7 @@ class Accessor extends ModelElement implements EnclosedElement {
141141
element.enclosingElement.enclosingElement);
142142
}
143143

144-
return ModelElement.from(element.enclosingElement, library, packageGraph);
144+
return modelBuilder.from(element.enclosingElement, library);
145145
}
146146

147147
@override
@@ -196,12 +196,12 @@ class ContainerAccessor extends Accessor with ContainerMember, Inheritable {
196196
ContainerAccessor accessor;
197197
if (element == null) return null;
198198
if (inheritedAccessors.contains(element)) {
199-
accessor = ModelElement.from(
200-
element, enclosingContainer.library, enclosingContainer.packageGraph,
199+
accessor = enclosingContainer.packageGraph.modelBuilder.from(
200+
element, enclosingContainer.library,
201201
enclosingContainer: enclosingContainer);
202202
} else {
203-
accessor = ModelElement.from(
204-
element, enclosingContainer.library, enclosingContainer.packageGraph);
203+
accessor = enclosingContainer.packageGraph.modelBuilder
204+
.from(element, enclosingContainer.library);
205205
}
206206
return accessor;
207207
}
@@ -261,7 +261,7 @@ class ContainerAccessor extends Accessor with ContainerMember, Inheritable {
261261
if (accessor != null) {
262262
accessor = accessor.declaration;
263263
InheritingContainer parentContainer =
264-
ModelElement.fromElement(t.element, packageGraph);
264+
modelBuilder.fromElement(t.element);
265265
var possibleFields = <Field>[];
266266
possibleFields.addAll(parentContainer.instanceFields);
267267
possibleFields.addAll(parentContainer.staticFields);

lib/src/model/annotation.dart

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,15 @@ import 'package:dartdoc/src/element_type.dart';
77
import 'package:dartdoc/src/model/feature.dart';
88
import 'package:dartdoc/src/model/getter_setter_combo.dart';
99
import 'package:dartdoc/src/model/library.dart';
10-
import 'package:dartdoc/src/model/model_element.dart';
10+
import 'package:dartdoc/src/model/model_object_builder.dart';
1111
import 'package:dartdoc/src/model/package_graph.dart';
1212

1313
/// Represents a Dart annotation, attached to an element in the source code with
1414
/// `@`.
15-
class Annotation extends Feature {
15+
class Annotation extends Feature with ModelBuilder {
1616
final ElementAnnotation annotation;
1717
final Library library;
18+
@override
1819
final PackageGraph packageGraph;
1920

2021
Annotation(this.annotation, this.library, this.packageGraph)
@@ -28,7 +29,7 @@ class Annotation extends Feature {
2829
/// Return the linked name of the annotation.
2930
@override
3031
String get linkedName => annotation.element is PropertyAccessorElement
31-
? ModelElement.fromElement(annotation.element, packageGraph).linkedName
32+
? modelBuilder.fromElement(annotation.element).linkedName
3233
// TODO(jcollins-g): consider linking to constructor instead of type?
3334
: modelType.linkedName;
3435

@@ -40,10 +41,9 @@ class Annotation extends Feature {
4041
_modelType =
4142
ElementType.from(annotatedWith.returnType, library, packageGraph);
4243
} else if (annotatedWith is PropertyAccessorElement) {
43-
_modelType =
44-
(ModelElement.fromElement(annotatedWith.variable, packageGraph)
45-
as GetterSetterCombo)
46-
.modelType;
44+
_modelType = (modelBuilder.fromElement(annotatedWith.variable)
45+
as GetterSetterCombo)
46+
.modelType;
4747
} else {
4848
assert(false,
4949
'non-callable element used as annotation?: ${annotation.element}');

lib/src/model/category.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:dartdoc/src/comment_references/model_comment_reference.dart';
88
import 'package:dartdoc/src/dartdoc_options.dart';
99
import 'package:dartdoc/src/model/comment_referable.dart';
1010
import 'package:dartdoc/src/model/model.dart';
11+
import 'package:dartdoc/src/model/model_object_builder.dart';
1112
import 'package:dartdoc/src/render/category_renderer.dart';
1213
import 'package:dartdoc/src/warnings.dart';
1314

@@ -22,7 +23,8 @@ class Category extends Nameable
2223
MarkdownFileDocumentation,
2324
LibraryContainer,
2425
TopLevelContainer,
25-
Indexable
26+
Indexable,
27+
ModelBuilder
2628
implements Documentable {
2729
/// All libraries in [libraries] must come from [package].
2830
final Package _package;

lib/src/model/comment_referable.dart

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,8 @@ import 'package:analyzer/dart/element/scope.dart';
1414
import 'package:dartdoc/src/model/accessor.dart';
1515
import 'package:dartdoc/src/model/container.dart';
1616
import 'package:dartdoc/src/model/library.dart';
17-
import 'package:dartdoc/src/model/model_element.dart';
17+
import 'package:dartdoc/src/model/model_object_builder.dart';
1818
import 'package:dartdoc/src/model/nameable.dart';
19-
import 'package:dartdoc/src/model/package_graph.dart';
2019
import 'package:meta/meta.dart';
2120

2221
class ReferenceChildrenLookup {
@@ -78,9 +77,7 @@ extension CommentReferableEntryBuilder on Map<String, CommentReferable> {
7877
}
7978

8079
/// Support comment reference lookups on a Nameable object.
81-
mixin CommentReferable implements Nameable {
82-
PackageGraph packageGraph;
83-
80+
mixin CommentReferable implements Nameable, ModelBuilderInterface {
8481
/// For any [CommentReferable] where an analyzer [Scope] exists (or can
8582
/// be constructed), implement this. This will take priority over
8683
/// lookups via [referenceChildren]. Can be cached.
@@ -147,7 +144,7 @@ mixin CommentReferable implements Nameable {
147144
bool Function(CommentReferable) filter) {
148145
var resultElement = scope.lookupPreferGetter(referenceLookup.lookup);
149146
if (resultElement == null) return null;
150-
var result = ModelElement.fromElement(resultElement, packageGraph);
147+
var result = modelBuilder.fromElement(resultElement);
151148
if (result is Accessor) {
152149
result = (result as Accessor).enclosingCombo;
153150
}

lib/src/model/constructor.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class Constructor extends ModelElement
3636

3737
@override
3838
ModelElement get enclosingElement =>
39-
ModelElement.from(element.enclosingElement, library, packageGraph);
39+
modelBuilder.from(element.enclosingElement, library);
4040

4141
@override
4242
String get filePath =>
@@ -131,7 +131,7 @@ class Constructor extends ModelElement
131131
_referenceChildren.addEntries(allParameters.map((param) {
132132
var paramElement = param.element;
133133
if (paramElement is FieldFormalParameterElement) {
134-
return ModelElement.fromElement(paramElement.field, packageGraph);
134+
return modelBuilder.fromElement(paramElement.field);
135135
}
136136
return param;
137137
}).generateEntries());

lib/src/model/container_member.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ mixin ContainerMember on ModelElement implements EnclosedElement {
2222

2323
Container get definingEnclosingContainer {
2424
_definingEnclosingContainer ??=
25-
ModelElement.fromElement(element.enclosingElement, packageGraph);
25+
modelBuilder.fromElement(element.enclosingElement);
2626
return _definingEnclosingContainer;
2727
}
2828

lib/src/model/documentation_comment.dart

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import 'package:dartdoc/src/model/documentable.dart';
44
import 'package:dartdoc/src/model/documentation.dart';
55
import 'package:dartdoc/src/model/inheritable.dart';
66
import 'package:dartdoc/src/model/locatable.dart';
7-
import 'package:dartdoc/src/model/model_element.dart';
87
import 'package:dartdoc/src/model/source_code_mixin.dart';
98
import 'package:dartdoc/src/render/model_element_renderer.dart';
109
import 'package:dartdoc/src/utils.dart';
@@ -57,9 +56,7 @@ mixin DocumentationComment
5756
(this as Inheritable).overriddenElement != null) {
5857
return (this as Inheritable).overriddenElement.documentationFrom;
5958
} else if (this is Inheritable && (this as Inheritable).isInherited) {
60-
var thisInheritable = (this as Inheritable);
61-
var fromThis = ModelElement.fromElement(
62-
element, thisInheritable.definingEnclosingContainer.packageGraph);
59+
var fromThis = modelBuilder.fromElement(element);
6360
return fromThis.documentationFrom;
6461
} else {
6562
return [this];

0 commit comments

Comments
 (0)