Skip to content

Commit c45302c

Browse files
authored
constructor refactor for element type (#2829)
1 parent 96832aa commit c45302c

16 files changed

+67
-46
lines changed

lib/dartdoc.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44

55
/// A documentation generator for Dart.
66
///
7-
/// Library interface is currently under heavy construction and may change
8-
/// drastically between minor revisions.
7+
/// Library interface is still experimental.
8+
@experimental
99
library dartdoc;
1010

1111
import 'dart:async';

lib/src/element_type.dart

+14-5
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,15 @@ import 'package:dartdoc/src/model/model.dart';
1313
import 'package:dartdoc/src/model/model_object_builder.dart';
1414
import 'package:dartdoc/src/render/element_type_renderer.dart';
1515

16+
mixin ElementTypeBuilderImpl implements ElementTypeBuilder {
17+
PackageGraph get packageGraph;
18+
19+
@override
20+
ElementType typeFrom(DartType f, Library library,
21+
{ElementType returnedFrom}) =>
22+
ElementType._from(f, library, packageGraph, returnedFrom: returnedFrom);
23+
}
24+
1625
/// Base class representing a type in Dartdoc. It wraps a [DartType], and
1726
/// may link to a [ModelElement].
1827
abstract class ElementType extends Privacy
@@ -26,7 +35,7 @@ abstract class ElementType extends Privacy
2635

2736
ElementType(this._type, this.library, this.packageGraph, this.returnedFrom);
2837

29-
factory ElementType.from(
38+
factory ElementType._from(
3039
DartType f, Library library, PackageGraph packageGraph,
3140
{ElementType returnedFrom}) {
3241
if (f.element == null ||
@@ -215,7 +224,7 @@ class ParameterizedElementType extends DefinedElementType with Rendered {
215224
@override
216225
Iterable<ElementType> get typeArguments =>
217226
_typeArguments ??= type.typeArguments
218-
.map((f) => ElementType.from(f, library, packageGraph))
227+
.map((f) => modelBuilder.typeFrom(f, library))
219228
.toList(growable: false);
220229
}
221230

@@ -234,7 +243,7 @@ mixin Aliased implements ElementType, ModelBuilderInterface {
234243
Iterable<ElementType> _aliasArguments;
235244
Iterable<ElementType> get aliasArguments =>
236245
_aliasArguments ??= type.alias.typeArguments
237-
.map((f) => ElementType.from(f, library, packageGraph))
246+
.map((f) => modelBuilder.typeFrom(f, library))
238247
.toList(growable: false);
239248
}
240249

@@ -381,7 +390,7 @@ mixin Callable implements ElementType {
381390

382391
ElementType _returnType;
383392
ElementType get returnType {
384-
_returnType ??= ElementType.from(type.returnType, library, packageGraph);
393+
_returnType ??= modelBuilder.typeFrom(type.returnType, library);
385394
return _returnType;
386395
}
387396

@@ -432,7 +441,7 @@ class CallableElementType extends DefinedElementType with Rendered, Callable {
432441
@override
433442
Iterable<ElementType> get typeArguments =>
434443
_typeArguments ??= (type.alias?.typeArguments ?? [])
435-
.map((f) => ElementType.from(f, library, packageGraph))
444+
.map((f) => modelBuilder.typeFrom(f, library))
436445
.toList(growable: false);
437446
}
438447

lib/src/model/accessor.dart

+3-3
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class Accessor extends ModelElement implements EnclosedElement {
3939

4040
Callable _modelType;
4141
Callable get modelType => _modelType ??=
42-
ElementType.from((originalMember ?? element).type, library, packageGraph);
42+
modelBuilder.typeFrom((originalMember ?? element).type, library);
4343

4444
bool get isSynthetic => element.isSynthetic;
4545

@@ -137,8 +137,8 @@ class Accessor extends ModelElement implements EnclosedElement {
137137
@override
138138
ModelElement get enclosingElement {
139139
if (element.enclosingElement is CompilationUnitElement) {
140-
return packageGraph.findButDoNotCreateLibraryFor(
141-
element.enclosingElement.enclosingElement);
140+
return modelBuilder
141+
.fromElement(element.enclosingElement.enclosingElement);
142142
}
143143

144144
return modelBuilder.from(element.enclosingElement, library);

lib/src/model/annotation.dart

+1-2
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,7 @@ class Annotation extends Feature with ModelBuilder {
3838
if (_modelType == null) {
3939
var annotatedWith = annotation.element;
4040
if (annotatedWith is ConstructorElement) {
41-
_modelType =
42-
ElementType.from(annotatedWith.returnType, library, packageGraph);
41+
_modelType = modelBuilder.typeFrom(annotatedWith.returnType, library);
4342
} else if (annotatedWith is PropertyAccessorElement) {
4443
_modelType = (modelBuilder.fromElement(annotatedWith.variable)
4544
as GetterSetterCombo)

lib/src/model/constructor.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ class Constructor extends ModelElement
7979

8080
Callable _modelType;
8181
Callable get modelType =>
82-
_modelType ??= ElementType.from(element.type, library, packageGraph);
82+
_modelType ??= modelBuilder.typeFrom(element.type, library);
8383

8484
String _name;
8585

lib/src/model/extension.dart

+1-2
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ class Extension extends Container implements EnclosedElement {
1616
Extension(
1717
ExtensionElement element, Library library, PackageGraph packageGraph)
1818
: super(element, library, packageGraph) {
19-
extendedType =
20-
ElementType.from(_extension.extendedType, library, packageGraph);
19+
extendedType = modelBuilder.typeFrom(_extension.extendedType, library);
2120
}
2221

2322
/// Detect if this extension applies to every object.

lib/src/model/inheriting_container.dart

+11-12
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,7 @@ mixin MixedInTypes on InheritingContainer {
9696
_mixedInTypes ??
9797
[
9898
...element.mixins
99-
.map<DefinedElementType>(
100-
(f) => ElementType.from(f, library, packageGraph))
99+
.map<DefinedElementType>((f) => modelBuilder.typeFrom(f, library))
101100
.where((mixin) => mixin != null)
102101
];
103102

@@ -118,8 +117,7 @@ mixin TypeImplementing on InheritingContainer {
118117
_directInterfaces ??
119118
[
120119
...element.interfaces
121-
.map<DefinedElementType>(
122-
(f) => ElementType.from(f, library, packageGraph))
120+
.map<DefinedElementType>((f) => modelBuilder.typeFrom(f, library))
123121
.toList(growable: false)
124122
];
125123

@@ -224,14 +222,15 @@ abstract class InheritingContainer extends Container
224222
/// [ClassElement] is analogous to [InheritingContainer].
225223
ClassElement get element => super.element;
226224

227-
final DefinedElementType supertype;
225+
DefinedElementType _supertype;
226+
DefinedElementType get supertype =>
227+
_supertype ??= element.supertype?.element?.supertype == null
228+
? null
229+
: modelBuilder.typeFrom(element.supertype, library);
228230

229231
InheritingContainer(
230232
ClassElement element, Library library, PackageGraph packageGraph)
231-
: supertype = element.supertype?.element?.supertype == null
232-
? null
233-
: ElementType.from(element.supertype, library, packageGraph),
234-
super(element, library, packageGraph);
233+
: super(element, library, packageGraph);
235234

236235
@override
237236
Iterable<Method> get instanceMethods =>
@@ -361,7 +360,7 @@ abstract class InheritingContainer extends Container
361360

362361
@override
363362
DefinedElementType get modelType =>
364-
_modelType ??= ElementType.from(element.thisType, library, packageGraph);
363+
_modelType ??= modelBuilder.typeFrom(element.thisType, library);
365364

366365
/// Not the same as superChain as it may include mixins.
367366
/// It's really not even the same as ordinary Dart inheritance, either,
@@ -381,8 +380,8 @@ abstract class InheritingContainer extends Container
381380
if ((parent.type as InterfaceType)?.superclass?.superclass == null) {
382381
parent = null;
383382
} else {
384-
parent = ElementType.from(
385-
(parent.type as InterfaceType).superclass, library, packageGraph);
383+
parent = modelBuilder.typeFrom(
384+
(parent.type as InterfaceType).superclass, library);
386385
}
387386
} else {
388387
parent = (parent.modelElement as Class).supertype;

lib/src/model/library.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ class Library extends ModelElement with Categorization, TopLevelContainer {
252252
importedExportedLibraryElements.addAll(element.importedLibraries);
253253
importedExportedLibraryElements.addAll(element.exportedLibraries);
254254
for (var l in importedExportedLibraryElements) {
255-
var lib = packageGraph.findButDoNotCreateLibraryFor(l);
255+
var lib = modelBuilder.fromElement(l) as Library;
256256
_importedExportedLibraries.add(lib);
257257
_importedExportedLibraries.addAll(lib.importedExportedLibraries);
258258
}

lib/src/model/method.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ class Method extends ModelElement
9999

100100
Callable _modelType;
101101
Callable get modelType => _modelType ??=
102-
ElementType.from((originalMember ?? element).type, library, packageGraph);
102+
modelBuilder.typeFrom((originalMember ?? element).type, library);
103103

104104
@override
105105
Method get overriddenElement {

lib/src/model/mixin.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class Mixin extends InheritingContainer with TypeImplementing {
2121
_superclassConstraints ??= [
2222
...element.superclassConstraints
2323
.map<ParameterizedElementType>(
24-
(InterfaceType i) => ElementType.from(i, library, packageGraph))
24+
(InterfaceType i) => modelBuilder.typeFrom(i, library))
2525
.where((t) =>
2626
t.modelElement !=
2727
packageGraph.specialClasses[SpecialClass.object])

lib/src/model/model_element.dart

+7-9
Original file line numberDiff line numberDiff line change
@@ -59,25 +59,23 @@ ModelElement resolveMultiplyInheritedElement(
5959
enclosingContainer: enclosingClass);
6060
}
6161

62-
class ModelElementBuilderImpl implements ModelObjectBuilder {
63-
final PackageGraph _packageGraph;
64-
65-
ModelElementBuilderImpl(this._packageGraph);
62+
mixin ModelElementBuilderImpl implements ModelElementBuilder {
63+
PackageGraph get packageGraph;
6664

6765
@override
6866
ModelElement from(Element e, Library library,
6967
{Container enclosingContainer}) =>
70-
ModelElement._from(e, library, _packageGraph,
68+
ModelElement._from(e, library, packageGraph,
7169
enclosingContainer: enclosingContainer);
7270

7371
@override
7472
ModelElement fromElement(Element e) =>
75-
ModelElement._fromElement(e, _packageGraph);
73+
ModelElement._fromElement(e, packageGraph);
7674

7775
@override
7876
ModelElement fromPropertyInducingElement(Element e, Library l,
7977
{Container enclosingContainer, Accessor getter, Accessor setter}) =>
80-
ModelElement._fromPropertyInducingElement(e, l, _packageGraph,
78+
ModelElement._fromPropertyInducingElement(e, l, packageGraph,
8179
enclosingContainer: enclosingContainer,
8280
getter: getter,
8381
setter: setter);
@@ -150,7 +148,7 @@ abstract class ModelElement extends Canonicalization
150148
return ModelElement._from(e, lib, p);
151149
}
152150

153-
/// Creates a [ModelElement] from [PropertyInducingElement] [e].
151+
/// Creates a [ModelElement] from [PropertyInducingElement] [e].
154152
///
155153
/// Do not construct any ModelElements except from this constructor or
156154
/// [ModelElement._from]. Specify [enclosingContainer]
@@ -525,7 +523,7 @@ abstract class ModelElement extends Canonicalization
525523
}
526524

527525
Library get definingLibrary {
528-
var library = packageGraph.findButDoNotCreateLibraryFor(element);
526+
Library library = modelBuilder.fromElement(element.library);
529527
if (library == null) {
530528
warn(PackageWarning.noDefiningLibraryFound);
531529
}

lib/src/model/model_function.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -90,5 +90,5 @@ class ModelFunctionTyped extends ModelElement
9090

9191
Callable _modelType;
9292
Callable get modelType =>
93-
_modelType ??= ElementType.from(element.type, library, packageGraph);
93+
_modelType ??= modelBuilder.typeFrom(element.type, library);
9494
}

lib/src/model/model_object_builder.dart

+19-2
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,19 @@
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/dart/element/type.dart';
7+
import 'package:dartdoc/src/element_type.dart';
68
import 'package:dartdoc/src/model/accessor.dart';
79
import 'package:dartdoc/src/model/container.dart';
810
import 'package:dartdoc/src/model/library.dart';
911
import 'package:dartdoc/src/model/model_element.dart';
1012
import 'package:dartdoc/src/model/package_graph.dart';
1113
import 'package:meta/meta.dart';
1214

13-
abstract class ModelObjectBuilder {
15+
abstract class ModelObjectBuilder
16+
implements ModelElementBuilder, ElementTypeBuilder {}
17+
18+
abstract class ModelElementBuilder {
1419
ModelElement from(Element e, Library library, {Container enclosingContainer});
1520

1621
ModelElement fromElement(Element e);
@@ -21,12 +26,24 @@ abstract class ModelObjectBuilder {
2126
@required Accessor setter});
2227
}
2328

29+
abstract class ElementTypeBuilder {
30+
ElementType typeFrom(DartType f, Library library, {ElementType returnedFrom});
31+
}
32+
2433
abstract class ModelBuilderInterface {
2534
/// Override implementations in unit tests to avoid requiring literal
2635
/// [ModelElement]s.
2736
ModelObjectBuilder get modelBuilder;
2837
}
2938

39+
class ModelObjectBuilderImpl extends ModelObjectBuilder
40+
with ModelElementBuilderImpl, ElementTypeBuilderImpl {
41+
@override
42+
final PackageGraph packageGraph;
43+
44+
ModelObjectBuilderImpl(this.packageGraph);
45+
}
46+
3047
/// Default implementation of the ModelBuilderInterface, requiring a
3148
/// [PackageGraph].
3249
mixin ModelBuilder implements ModelBuilderInterface {
@@ -35,5 +52,5 @@ mixin ModelBuilder implements ModelBuilderInterface {
3552
ModelObjectBuilder _modelBuilder;
3653
@override
3754
ModelObjectBuilder get modelBuilder =>
38-
_modelBuilder ??= ModelElementBuilderImpl(packageGraph);
55+
_modelBuilder ??= ModelObjectBuilderImpl(packageGraph);
3956
}

lib/src/model/parameter.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -109,5 +109,5 @@ class Parameter extends ModelElement implements EnclosedElement {
109109

110110
ElementType _modelType;
111111
ElementType get modelType => _modelType ??=
112-
ElementType.from((originalMember ?? element).type, library, packageGraph);
112+
modelBuilder.typeFrom((originalMember ?? element).type, library);
113113
}

lib/src/model/type_parameter.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class TypeParameter extends ModelElement {
3636
if (_boundType == null) {
3737
var bound = element.bound;
3838
if (bound != null) {
39-
_boundType = ElementType.from(bound, library, packageGraph);
39+
_boundType = modelBuilder.typeFrom(bound, library);
4040
}
4141
}
4242
return _boundType;

lib/src/model/typedef.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ abstract class Typedef extends ModelElement
2121
TypeAliasElement get element => super.element;
2222

2323
ElementType _modelType;
24-
ElementType get modelType => _modelType ??=
25-
ElementType.from(element.aliasedType, library, packageGraph);
24+
ElementType get modelType =>
25+
_modelType ??= modelBuilder.typeFrom(element.aliasedType, library);
2626

2727
@override
2828
Library get enclosingElement => library;

0 commit comments

Comments
 (0)