diff --git a/lib/src/element_type.dart b/lib/src/element_type.dart index 419d3794c0..6b289c8133 100644 --- a/lib/src/element_type.dart +++ b/lib/src/element_type.dart @@ -10,11 +10,13 @@ import 'package:analyzer/dart/element/nullability_suffix.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; import 'package:dartdoc/src/model/model.dart'; +import 'package:dartdoc/src/model/model_object_builder.dart'; import 'package:dartdoc/src/render/element_type_renderer.dart'; /// Base class representing a type in Dartdoc. It wraps a [DartType], and /// may link to a [ModelElement]. -abstract class ElementType extends Privacy with CommentReferable, Nameable { +abstract class ElementType extends Privacy + with CommentReferable, Nameable, ModelBuilder { final DartType _type; @override final PackageGraph packageGraph; @@ -39,7 +41,7 @@ abstract class ElementType extends Privacy with CommentReferable, Nameable { } return UndefinedElementType(f, library, packageGraph, returnedFrom); } else { - var element = ModelElement.fromElement(f.element, packageGraph); + var element = packageGraph.modelBuilder.fromElement(f.element); // [TypeAliasElement.aliasElement] has different implications. // In that case it is an actual type alias of some kind (generic // or otherwise. Here however aliasElement signals that this is a @@ -172,7 +174,7 @@ class FunctionTypeElementType extends UndefinedElementType /// An unmodifiable list of this function element's type parameters. List get typeFormals => type.typeFormals - .map((p) => ModelElement.from(p, library, packageGraph) as TypeParameter) + .map((p) => packageGraph.modelBuilder.from(p, library) as TypeParameter) .toList(growable: false); @override @@ -218,7 +220,7 @@ class ParameterizedElementType extends DefinedElementType with Rendered { } /// A [ElementType] whose underlying type was referrred to by a type alias. -mixin Aliased implements ElementType { +mixin Aliased implements ElementType, ModelBuilderInterface { @override String get name => type.alias.element.name; @@ -226,8 +228,8 @@ mixin Aliased implements ElementType { bool get isTypedef => true; ModelElement _aliasElement; - ModelElement get aliasElement => _aliasElement ??= - ModelElement.fromElement(type.alias.element, packageGraph); + ModelElement get aliasElement => + _aliasElement ??= modelBuilder.fromElement(type.alias.element); Iterable _aliasArguments; Iterable get aliasArguments => @@ -374,7 +376,7 @@ abstract class DefinedElementType extends ElementType { /// unless it is an alias reference. mixin Callable implements ElementType { List get parameters => type.parameters - .map((p) => ModelElement.from(p, library, packageGraph) as Parameter) + .map((p) => modelBuilder.from(p, library) as Parameter) .toList(growable: false); ElementType _returnType; diff --git a/lib/src/generator/templates.runtime_renderers.dart b/lib/src/generator/templates.runtime_renderers.dart index a7eb731441..0de46dc0ea 100644 --- a/lib/src/generator/templates.runtime_renderers.dart +++ b/lib/src/generator/templates.runtime_renderers.dart @@ -14,6 +14,7 @@ import 'package:dartdoc/src/model/feature.dart'; import 'package:dartdoc/src/model/feature_set.dart'; import 'package:dartdoc/src/model/language_feature.dart'; import 'package:dartdoc/src/model/model.dart'; +import 'package:dartdoc/src/model/model_object_builder.dart'; import 'package:dartdoc/src/mustachio/parser.dart'; import 'package:dartdoc/src/mustachio/renderer_base.dart'; import 'package:dartdoc/src/warnings.dart'; @@ -369,6 +370,7 @@ class _Renderer_Annotation extends RendererBase { CT_, () => { ..._Renderer_Feature.propertyMap(), + ..._Renderer_ModelBuilder.propertyMap(), 'annotation': Property( getValue: (CT_ c) => c.annotation, renderVariable: (CT_ c, Property self, @@ -868,6 +870,7 @@ class _Renderer_Category extends RendererBase { ..._Renderer_LibraryContainer.propertyMap(), ..._Renderer_TopLevelContainer.propertyMap(), ..._Renderer_Indexable.propertyMap(), + ..._Renderer_ModelBuilder.propertyMap(), 'canonicalLibrary': Property( getValue: (CT_ c) => c.canonicalLibrary, renderVariable: @@ -1929,19 +1932,6 @@ class _Renderer_CommentReferable extends RendererBase { parent: r); }, ), - 'packageGraph': Property( - getValue: (CT_ c) => c.packageGraph, - renderVariable: (CT_ c, Property self, - List remainingNames) => - self.renderSimpleVariable( - c, remainingNames, 'PackageGraph'), - isNullValue: (CT_ c) => c.packageGraph == null, - renderValue: (CT_ c, RendererBase r, - List ast, StringSink sink) { - renderSimple(c.packageGraph, ast, r.template, sink, - parent: r, getters: _invisibleGetters['PackageGraph']); - }, - ), 'referenceChildren': Property( getValue: (CT_ c) => c.referenceChildren, renderVariable: (CT_ c, Property self, @@ -4124,6 +4114,7 @@ class _Renderer_ElementType extends RendererBase { ..._Renderer_Privacy.propertyMap(), ..._Renderer_CommentReferable.propertyMap(), ..._Renderer_Nameable.propertyMap(), + ..._Renderer_ModelBuilder.propertyMap(), 'canHaveParameters': Property( getValue: (CT_ c) => c.canHaveParameters, renderVariable: (CT_ c, Property self, @@ -9323,6 +9314,55 @@ class _Renderer_MixinTemplateData extends RendererBase { } } +class _Renderer_ModelBuilder extends RendererBase { + static final Map _propertyMapCache = {}; + static Map> propertyMap() => + _propertyMapCache.putIfAbsent( + CT_, + () => { + 'modelBuilder': Property( + getValue: (CT_ c) => c.modelBuilder, + renderVariable: (CT_ c, Property self, + List remainingNames) => + self.renderSimpleVariable( + c, remainingNames, 'ModelObjectBuilder'), + isNullValue: (CT_ c) => c.modelBuilder == null, + renderValue: (CT_ c, RendererBase r, + List ast, StringSink sink) { + renderSimple(c.modelBuilder, ast, r.template, sink, + parent: r, + getters: _invisibleGetters['ModelObjectBuilder']); + }, + ), + 'packageGraph': Property( + getValue: (CT_ c) => c.packageGraph, + renderVariable: (CT_ c, Property self, + List remainingNames) => + self.renderSimpleVariable( + c, remainingNames, 'PackageGraph'), + isNullValue: (CT_ c) => c.packageGraph == null, + renderValue: (CT_ c, RendererBase r, + List ast, StringSink sink) { + renderSimple(c.packageGraph, ast, r.template, sink, + parent: r, getters: _invisibleGetters['PackageGraph']); + }, + ), + }); + + _Renderer_ModelBuilder(ModelBuilder context, RendererBase parent, + Template template, StringSink sink) + : super(context, parent, template, sink); + + @override + Property getProperty(String key) { + if (propertyMap().containsKey(key)) { + return propertyMap()[key]; + } else { + return null; + } + } +} + void _render_ModelElement(ModelElement context, List ast, Template template, StringSink sink, {RendererBase parent}) { @@ -9346,6 +9386,7 @@ class _Renderer_ModelElement extends RendererBase { ..._Renderer_Indexable.propertyMap(), ..._Renderer_FeatureSet.propertyMap(), ..._Renderer_DocumentationComment.propertyMap(), + ..._Renderer_ModelBuilder.propertyMap(), 'allParameters': Property( getValue: (CT_ c) => c.allParameters, renderVariable: (CT_ c, Property self, @@ -10827,6 +10868,7 @@ class _Renderer_Package extends RendererBase { ..._Renderer_Canonicalization.propertyMap(), ..._Renderer_Warnable.propertyMap(), ..._Renderer_CommentReferable.propertyMap(), + ..._Renderer_ModelBuilder.propertyMap(), 'allLibraries': Property( getValue: (CT_ c) => c.allLibraries, renderVariable: (CT_ c, Property self, @@ -11583,7 +11625,7 @@ class _Renderer_Package extends RendererBase { } } -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(); @@ -11785,7 +11827,7 @@ class _Renderer_PackageTemplateData extends RendererBase { } } -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(); @@ -15126,7 +15168,6 @@ const _invisibleGetters = { 'unnamedConstructor' }, 'CommentReferable': { - 'packageGraph', 'scope', 'href', 'referenceChildren', @@ -15610,6 +15651,7 @@ const _invisibleGetters = { 'resourceProvider', 'sourceCode' }, + 'ModelObjectBuilder': {'hashCode', 'runtimeType'}, 'PackageGraph': { 'hashCode', 'runtimeType', diff --git a/lib/src/model/accessor.dart b/lib/src/model/accessor.dart index a9fb81b3ab..eafe811454 100644 --- a/lib/src/model/accessor.dart +++ b/lib/src/model/accessor.dart @@ -51,7 +51,7 @@ class Accessor extends ModelElement implements EnclosedElement { GetterSetterCombo get definingCombo { if (_definingCombo == null) { var variable = element.variable; - _definingCombo = ModelElement.fromElement(variable, packageGraph); + _definingCombo = modelBuilder.fromElement(variable); assert(_definingCombo != null, 'Unable to find defining combo'); } return _definingCombo; @@ -141,7 +141,7 @@ class Accessor extends ModelElement implements EnclosedElement { element.enclosingElement.enclosingElement); } - return ModelElement.from(element.enclosingElement, library, packageGraph); + return modelBuilder.from(element.enclosingElement, library); } @override @@ -196,12 +196,12 @@ class ContainerAccessor extends Accessor with ContainerMember, Inheritable { ContainerAccessor accessor; if (element == null) return null; if (inheritedAccessors.contains(element)) { - accessor = ModelElement.from( - element, enclosingContainer.library, enclosingContainer.packageGraph, + accessor = enclosingContainer.packageGraph.modelBuilder.from( + element, enclosingContainer.library, enclosingContainer: enclosingContainer); } else { - accessor = ModelElement.from( - element, enclosingContainer.library, enclosingContainer.packageGraph); + accessor = enclosingContainer.packageGraph.modelBuilder + .from(element, enclosingContainer.library); } return accessor; } @@ -261,7 +261,7 @@ class ContainerAccessor extends Accessor with ContainerMember, Inheritable { if (accessor != null) { accessor = accessor.declaration; InheritingContainer parentContainer = - ModelElement.fromElement(t.element, packageGraph); + modelBuilder.fromElement(t.element); var possibleFields = []; possibleFields.addAll(parentContainer.instanceFields); possibleFields.addAll(parentContainer.staticFields); diff --git a/lib/src/model/annotation.dart b/lib/src/model/annotation.dart index 0e6bc696a6..6017d74c84 100644 --- a/lib/src/model/annotation.dart +++ b/lib/src/model/annotation.dart @@ -7,14 +7,15 @@ import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/model/feature.dart'; import 'package:dartdoc/src/model/getter_setter_combo.dart'; import 'package:dartdoc/src/model/library.dart'; -import 'package:dartdoc/src/model/model_element.dart'; +import 'package:dartdoc/src/model/model_object_builder.dart'; import 'package:dartdoc/src/model/package_graph.dart'; /// Represents a Dart annotation, attached to an element in the source code with /// `@`. -class Annotation extends Feature { +class Annotation extends Feature with ModelBuilder { final ElementAnnotation annotation; final Library library; + @override final PackageGraph packageGraph; Annotation(this.annotation, this.library, this.packageGraph) @@ -28,7 +29,7 @@ class Annotation extends Feature { /// Return the linked name of the annotation. @override String get linkedName => annotation.element is PropertyAccessorElement - ? ModelElement.fromElement(annotation.element, packageGraph).linkedName + ? modelBuilder.fromElement(annotation.element).linkedName // TODO(jcollins-g): consider linking to constructor instead of type? : modelType.linkedName; @@ -40,10 +41,9 @@ class Annotation extends Feature { _modelType = ElementType.from(annotatedWith.returnType, library, packageGraph); } else if (annotatedWith is PropertyAccessorElement) { - _modelType = - (ModelElement.fromElement(annotatedWith.variable, packageGraph) - as GetterSetterCombo) - .modelType; + _modelType = (modelBuilder.fromElement(annotatedWith.variable) + as GetterSetterCombo) + .modelType; } else { assert(false, 'non-callable element used as annotation?: ${annotation.element}'); diff --git a/lib/src/model/category.dart b/lib/src/model/category.dart index 79fefac413..6ddbc366c7 100644 --- a/lib/src/model/category.dart +++ b/lib/src/model/category.dart @@ -8,6 +8,7 @@ import 'package:dartdoc/src/comment_references/model_comment_reference.dart'; import 'package:dartdoc/src/dartdoc_options.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; import 'package:dartdoc/src/model/model.dart'; +import 'package:dartdoc/src/model/model_object_builder.dart'; import 'package:dartdoc/src/render/category_renderer.dart'; import 'package:dartdoc/src/warnings.dart'; @@ -22,7 +23,8 @@ class Category extends Nameable MarkdownFileDocumentation, LibraryContainer, TopLevelContainer, - Indexable + Indexable, + ModelBuilder implements Documentable { /// All libraries in [libraries] must come from [package]. final Package _package; diff --git a/lib/src/model/comment_referable.dart b/lib/src/model/comment_referable.dart index 3c872f0339..f406b7701b 100644 --- a/lib/src/model/comment_referable.dart +++ b/lib/src/model/comment_referable.dart @@ -14,9 +14,8 @@ import 'package:analyzer/dart/element/scope.dart'; import 'package:dartdoc/src/model/accessor.dart'; import 'package:dartdoc/src/model/container.dart'; import 'package:dartdoc/src/model/library.dart'; -import 'package:dartdoc/src/model/model_element.dart'; +import 'package:dartdoc/src/model/model_object_builder.dart'; import 'package:dartdoc/src/model/nameable.dart'; -import 'package:dartdoc/src/model/package_graph.dart'; import 'package:meta/meta.dart'; class ReferenceChildrenLookup { @@ -78,9 +77,7 @@ extension CommentReferableEntryBuilder on Map { } /// Support comment reference lookups on a Nameable object. -mixin CommentReferable implements Nameable { - PackageGraph packageGraph; - +mixin CommentReferable implements Nameable, ModelBuilderInterface { /// For any [CommentReferable] where an analyzer [Scope] exists (or can /// be constructed), implement this. This will take priority over /// lookups via [referenceChildren]. Can be cached. @@ -147,7 +144,7 @@ mixin CommentReferable implements Nameable { bool Function(CommentReferable) filter) { var resultElement = scope.lookupPreferGetter(referenceLookup.lookup); if (resultElement == null) return null; - var result = ModelElement.fromElement(resultElement, packageGraph); + var result = modelBuilder.fromElement(resultElement); if (result is Accessor) { result = (result as Accessor).enclosingCombo; } diff --git a/lib/src/model/constructor.dart b/lib/src/model/constructor.dart index 0db067279e..1cac5f19a9 100644 --- a/lib/src/model/constructor.dart +++ b/lib/src/model/constructor.dart @@ -36,7 +36,7 @@ class Constructor extends ModelElement @override ModelElement get enclosingElement => - ModelElement.from(element.enclosingElement, library, packageGraph); + modelBuilder.from(element.enclosingElement, library); @override String get filePath => @@ -131,7 +131,7 @@ class Constructor extends ModelElement _referenceChildren.addEntries(allParameters.map((param) { var paramElement = param.element; if (paramElement is FieldFormalParameterElement) { - return ModelElement.fromElement(paramElement.field, packageGraph); + return modelBuilder.fromElement(paramElement.field); } return param; }).generateEntries()); diff --git a/lib/src/model/container_member.dart b/lib/src/model/container_member.dart index e6ad58d012..2c3f61ff9b 100644 --- a/lib/src/model/container_member.dart +++ b/lib/src/model/container_member.dart @@ -22,7 +22,7 @@ mixin ContainerMember on ModelElement implements EnclosedElement { Container get definingEnclosingContainer { _definingEnclosingContainer ??= - ModelElement.fromElement(element.enclosingElement, packageGraph); + modelBuilder.fromElement(element.enclosingElement); return _definingEnclosingContainer; } diff --git a/lib/src/model/documentation_comment.dart b/lib/src/model/documentation_comment.dart index 1351febb35..a1ba9c9022 100644 --- a/lib/src/model/documentation_comment.dart +++ b/lib/src/model/documentation_comment.dart @@ -4,7 +4,6 @@ import 'package:dartdoc/src/model/documentable.dart'; import 'package:dartdoc/src/model/documentation.dart'; import 'package:dartdoc/src/model/inheritable.dart'; import 'package:dartdoc/src/model/locatable.dart'; -import 'package:dartdoc/src/model/model_element.dart'; import 'package:dartdoc/src/model/source_code_mixin.dart'; import 'package:dartdoc/src/render/model_element_renderer.dart'; import 'package:dartdoc/src/utils.dart'; @@ -57,9 +56,7 @@ mixin DocumentationComment (this as Inheritable).overriddenElement != null) { return (this as Inheritable).overriddenElement.documentationFrom; } else if (this is Inheritable && (this as Inheritable).isInherited) { - var thisInheritable = (this as Inheritable); - var fromThis = ModelElement.fromElement( - element, thisInheritable.definingEnclosingContainer.packageGraph); + var fromThis = modelBuilder.fromElement(element); return fromThis.documentationFrom; } else { return [this]; diff --git a/lib/src/model/extension.dart b/lib/src/model/extension.dart index 8685b525be..17ed365e76 100644 --- a/lib/src/model/extension.dart +++ b/lib/src/model/extension.dart @@ -55,7 +55,7 @@ class Extension extends Container implements EnclosedElement { @override List get declaredMethods { _methods ??= _extension.methods.map((e) { - return ModelElement.from(e, library, packageGraph) as Method; + return modelBuilder.from(e, library) as Method; }).toList(growable: false); return _methods; } @@ -75,7 +75,7 @@ class Extension extends Container implements EnclosedElement { if (f.setter != null) { setter = ContainerAccessor(f.setter, library, packageGraph); } - return ModelElement.fromPropertyInducingElement(f, library, packageGraph, + return modelBuilder.fromPropertyInducingElement(f, library, getter: getter, setter: setter) as Field; }).toList(growable: false); return _declaredFields; @@ -87,8 +87,8 @@ class Extension extends Container implements EnclosedElement { @override List get typeParameters { _typeParameters ??= _extension.typeParameters.map((f) { - var lib = Library(f.enclosingElement.library, packageGraph); - return ModelElement.from(f, lib, packageGraph) as TypeParameter; + var lib = modelBuilder.fromElement(f.enclosingElement.library); + return modelBuilder.from(f, lib) as TypeParameter; }).toList(); return _typeParameters; } diff --git a/lib/src/model/field.dart b/lib/src/model/field.dart index 3c63c15fdb..61da13f049 100644 --- a/lib/src/model/field.dart +++ b/lib/src/model/field.dart @@ -57,8 +57,7 @@ class Field extends ModelElement @override Container get enclosingElement { - _enclosingContainer ??= - ModelElement.from(field.enclosingElement, library, packageGraph); + _enclosingContainer ??= modelBuilder.from(field.enclosingElement, library); return _enclosingContainer; } diff --git a/lib/src/model/getter_setter_combo.dart b/lib/src/model/getter_setter_combo.dart index 3cce011981..c9a425f2da 100644 --- a/lib/src/model/getter_setter_combo.dart +++ b/lib/src/model/getter_setter_combo.dart @@ -63,7 +63,7 @@ mixin GetterSetterCombo on ModelElement { warn(PackageWarning.missingConstantConstructor, message: constructorName); return original; } - Constructor target = ModelElement.fromElement(staticElement, packageGraph); + Constructor target = modelBuilder.fromElement(staticElement); Class targetClass = target.enclosingElement; // TODO(jcollins-g): this logic really should be integrated into Constructor, // but that's not trivial because of linkedName's usage. diff --git a/lib/src/model/inheriting_container.dart b/lib/src/model/inheriting_container.dart index d98930840b..c4cc033014 100644 --- a/lib/src/model/inheriting_container.dart +++ b/lib/src/model/inheriting_container.dart @@ -20,8 +20,8 @@ import 'package:meta/meta.dart'; mixin Constructable on InheritingContainer { List _constructors; Iterable get constructors => _constructors ??= [ - ...element.constructors.map( - (e) => ModelElement.from(e, library, packageGraph) as Constructor) + ...element.constructors + .map((e) => modelBuilder.from(e, library) as Constructor) ]; @override @@ -264,7 +264,7 @@ abstract class InheritingContainer extends Container /// Returns the [InheritingContainer] with the library in which [element] is defined. InheritingContainer get definingContainer => - ModelElement.from(element, definingLibrary, packageGraph); + modelBuilder.from(element, definingLibrary); /// Returns the library that encloses this element. @override @@ -309,8 +309,7 @@ abstract class InheritingContainer extends Container }).toSet(); for (var e in inheritedMethodElements) { - Method m = ModelElement.from(e, library, packageGraph, - enclosingContainer: this); + Method m = modelBuilder.from(e, library, enclosingContainer: this); _inheritedMethods.add(m); } } @@ -336,8 +335,7 @@ abstract class InheritingContainer extends Container !operatorNames.contains(e.name)); }).toSet(); for (var e in inheritedOperatorElements) { - Operator o = ModelElement.from(e, library, packageGraph, - enclosingContainer: this); + Operator o = modelBuilder.from(e, library, enclosingContainer: this); _inheritedOperators.add(o); } } @@ -524,10 +522,25 @@ abstract class InheritingContainer extends Container PropertyAccessorElement setterElement, Set inheritedAccessors, [FieldElement f]) { - var getter = - ContainerAccessor.from(getterElement, inheritedAccessors, this); - var setter = - ContainerAccessor.from(setterElement, inheritedAccessors, this); + /// Return an [ContainerAccessor] with isInherited = true + /// if [element] is in [inheritedAccessors]. + ContainerAccessor containerAccessorFrom( + PropertyAccessorElement element, + Set inheritedAccessors, + Container enclosingContainer) { + ContainerAccessor accessor; + if (element == null) return null; + if (inheritedAccessors.contains(element)) { + accessor = modelBuilder.from(element, enclosingContainer.library, + enclosingContainer: enclosingContainer); + } else { + accessor = modelBuilder.from(element, enclosingContainer.library); + } + return accessor; + } + + var getter = containerAccessorFrom(getterElement, inheritedAccessors, this); + var setter = containerAccessorFrom(setterElement, inheritedAccessors, this); // Rebind getterElement/setterElement as ModelElement.from can resolve // MultiplyInheritedExecutableElements or resolve Members. getterElement = getter?.element; @@ -559,14 +572,14 @@ abstract class InheritingContainer extends Container if ((getter == null || getter.isInherited) && (setter == null || setter.isInherited)) { // Field is 100% inherited. - field = ModelElement.fromPropertyInducingElement(f, library, packageGraph, + field = modelBuilder.fromPropertyInducingElement(f, library, enclosingContainer: this, getter: getter, setter: setter); } else { // Field is <100% inherited (could be half-inherited). // TODO(jcollins-g): Navigation is probably still confusing for // half-inherited fields when traversing the inheritance tree. Make // this better, somehow. - field = ModelElement.fromPropertyInducingElement(f, library, packageGraph, + field = modelBuilder.fromPropertyInducingElement(f, library, getter: getter, setter: setter); } _allFields.add(field); @@ -577,7 +590,7 @@ abstract class InheritingContainer extends Container @override Iterable get declaredMethods => _declaredMethods ??= element.methods.map((e) { - return ModelElement.from(e, library, packageGraph) as Method; + return modelBuilder.from(e, library) as Method; }); List _typeParameters; @@ -585,8 +598,8 @@ abstract class InheritingContainer extends Container @override List get typeParameters { _typeParameters ??= element.typeParameters.map((f) { - var lib = Library(f.enclosingElement.library, packageGraph); - return ModelElement.from(f, lib, packageGraph) as TypeParameter; + var lib = modelBuilder.fromElement(f.enclosingElement.library); + return modelBuilder.from(f, lib) as TypeParameter; }).toList(); return _typeParameters; } diff --git a/lib/src/model/library.dart b/lib/src/model/library.dart index 0df92b185f..3fd276edbb 100644 --- a/lib/src/model/library.dart +++ b/lib/src/model/library.dart @@ -61,8 +61,9 @@ class Library extends ModelElement with Categorization, TopLevelContainer { @override final Package package; + @Deprecated('Use [modelBuilder.fromElement] instead of this factory.') factory Library(LibraryElement element, PackageGraph packageGraph) { - return packageGraph.findButDoNotCreateLibraryFor(element); + return packageGraph.modelBuilder.fromElement(element); } Library._(LibraryElement element, PackageGraph packageGraph, this.package, @@ -142,24 +143,18 @@ class Library extends ModelElement with Categorization, TopLevelContainer { Accessor getter; Accessor setter; if (e.hasGetter) { - getter = ModelElement.fromElement(e.getter.element, packageGraph); + getter = modelBuilder.fromElement(e.getter.element); } if (e.hasSetter) { - setter = ModelElement.fromElement(e.setter.element, packageGraph); + setter = modelBuilder.fromElement(e.setter.element); } - return ModelElement.fromPropertyInducingElement( - e.element, - packageGraph.findButDoNotCreateLibraryFor(e.element), - packageGraph, - getter: getter, - setter: setter) + return modelBuilder + .fromPropertyInducingElement( + e.element, modelBuilder.fromElement(e.element.library), + getter: getter, setter: setter) .fullyQualifiedName; } - return ModelElement.from( - e.element, - packageGraph.findButDoNotCreateLibraryFor(e.element), - packageGraph) - .fullyQualifiedName; + return modelBuilder.fromElement(e.element).fullyQualifiedName; }).toList(); return __allOriginalModelElementNames; } @@ -190,7 +185,7 @@ class Library extends ModelElement with Categorization, TopLevelContainer { Iterable get extensions { _extensions ??= _exportedAndLocalElements .whereType() - .map((e) => ModelElement.from(e, this, packageGraph) as Extension) + .map((e) => modelBuilder.from(e, this) as Extension) .toList(growable: false); return _extensions; } @@ -277,7 +272,7 @@ class Library extends ModelElement with Categorization, TopLevelContainer { if (i.prefix?.name != null && i.importedLibrary != null) { _prefixToLibrary .putIfAbsent(i.prefix?.name, () => {}) - .add(ModelElement.from(i.importedLibrary, library, packageGraph)); + .add(modelBuilder.from(i.importedLibrary, library)); } } } @@ -347,7 +342,7 @@ class Library extends ModelElement with Categorization, TopLevelContainer { _enums ??= _exportedAndLocalElements .whereType() .where((element) => element.isEnum) - .map((e) => ModelElement.from(e, this, packageGraph) as Enum) + .map((e) => modelBuilder.from(e, this) as Enum) .toList(growable: false); return _enums; } @@ -359,7 +354,7 @@ class Library extends ModelElement with Categorization, TopLevelContainer { _mixins ??= _exportedAndLocalElements .whereType() .where((ClassElement c) => c.isMixin) - .map((e) => ModelElement.from(e, this, packageGraph) as Mixin) + .map((e) => modelBuilder.from(e, this) as Mixin) .toList(growable: false); return _mixins; } @@ -385,7 +380,7 @@ class Library extends ModelElement with Categorization, TopLevelContainer { List get functions { _functions ??= _exportedAndLocalElements.whereType().map((e) { - return ModelElement.from(e, this, packageGraph) as ModelFunction; + return modelBuilder.from(e, this) as ModelFunction; }).toList(growable: false); return _functions; } @@ -486,7 +481,7 @@ class Library extends ModelElement with Categorization, TopLevelContainer { List get typedefs { _typedefs ??= _exportedAndLocalElements .whereType() - .map((e) => ModelElement.from(e, this, packageGraph) as Typedef) + .map((e) => modelBuilder.from(e, this) as Typedef) .toList(growable: false); return _typedefs; } @@ -499,7 +494,7 @@ class Library extends ModelElement with Categorization, TopLevelContainer { _classes ??= _exportedAndLocalElements .whereType() .where((e) => !e.isMixin && !e.isEnum) - .map((e) => ModelElement.from(e, this, packageGraph) as Class) + .map((e) => modelBuilder.from(e, this) as Class) .toList(growable: false); return _classes; } @@ -522,14 +517,13 @@ class Library extends ModelElement with Categorization, TopLevelContainer { for (var element in elements) { Accessor getter; if (element.getter != null) { - getter = ModelElement.from(element.getter, this, packageGraph); + getter = modelBuilder.from(element.getter, this); } Accessor setter; if (element.setter != null) { - setter = ModelElement.from(element.setter, this, packageGraph); + setter = modelBuilder.from(element.setter, this); } - var me = ModelElement.fromPropertyInducingElement( - element, this, packageGraph, + var me = modelBuilder.fromPropertyInducingElement(element, this, getter: getter, setter: setter); _variables.add(me); } @@ -633,7 +627,7 @@ class Library extends ModelElement with Categorization, TopLevelContainer { _referenceChildren = {}; var definedNamesModelElements = element .exportNamespace.definedNames.values - .map((v) => ModelElement.fromElement(v, packageGraph)); + .map((v) => modelBuilder.fromElement(v)); _referenceChildren.addEntries( definedNamesModelElements.whereNotType().generateEntries()); /* diff --git a/lib/src/model/method.dart b/lib/src/model/method.dart index 05c6f12c3e..cd5d2f49fd 100644 --- a/lib/src/model/method.dart +++ b/lib/src/model/method.dart @@ -33,7 +33,7 @@ class Method extends ModelElement void _calcTypeParameters() { typeParameters = element.typeParameters.map((f) { - return ModelElement.from(f, library, packageGraph) as TypeParameter; + return modelBuilder.from(f, library) as TypeParameter; }).toList(); } @@ -53,7 +53,7 @@ class Method extends ModelElement @override ModelElement get enclosingElement { _enclosingContainer ??= - ModelElement.from(element.enclosingElement, library, packageGraph); + modelBuilder.from(element.enclosingElement, library); return _enclosingContainer; } @@ -111,7 +111,7 @@ class Method extends ModelElement Element e = t.getMethod(element.name); if (e != null) { assert(e.enclosingElement is ClassElement); - return ModelElement.fromElement(e, packageGraph); + return modelBuilder.fromElement(e); } } return null; diff --git a/lib/src/model/model_element.dart b/lib/src/model/model_element.dart index c18fad8cbd..c1bf97ad62 100644 --- a/lib/src/model/model_element.dart +++ b/lib/src/model/model_element.dart @@ -22,6 +22,7 @@ import 'package:dartdoc/src/model/comment_referable.dart'; import 'package:dartdoc/src/model/feature.dart'; import 'package:dartdoc/src/model/feature_set.dart'; import 'package:dartdoc/src/model/model.dart'; +import 'package:dartdoc/src/model/model_object_builder.dart'; import 'package:dartdoc/src/model/prefix.dart'; import 'package:dartdoc/src/model_utils.dart' as utils; import 'package:dartdoc/src/render/model_element_renderer.dart'; @@ -43,7 +44,7 @@ ModelElement resolveMultiplyInheritedElement( PackageGraph packageGraph, Class enclosingClass) { var inheritables = e.inheritedElements - .map((ee) => ModelElement.fromElement(ee, packageGraph) as Inheritable); + .map((ee) => ModelElement._fromElement(ee, packageGraph) as Inheritable); Inheritable foundInheritable; var lowIndex = enclosingClass.inheritanceChain.length; for (var inheritable in inheritables) { @@ -54,10 +55,34 @@ ModelElement resolveMultiplyInheritedElement( lowIndex = index; } } - return ModelElement.from(foundInheritable.element, library, packageGraph, + return ModelElement._from(foundInheritable.element, library, packageGraph, enclosingContainer: enclosingClass); } +class ModelElementBuilderImpl implements ModelObjectBuilder { + final PackageGraph _packageGraph; + + ModelElementBuilderImpl(this._packageGraph); + + @override + ModelElement from(Element e, Library library, + {Container enclosingContainer}) => + ModelElement._from(e, library, _packageGraph, + enclosingContainer: enclosingContainer); + + @override + ModelElement fromElement(Element e) => + ModelElement._fromElement(e, _packageGraph); + + @override + ModelElement fromPropertyInducingElement(Element e, Library l, + {Container enclosingContainer, Accessor getter, Accessor setter}) => + ModelElement._fromPropertyInducingElement(e, l, _packageGraph, + enclosingContainer: enclosingContainer, + getter: getter, + setter: setter); +} + /// This class is the foundation of Dartdoc's model for source code. /// /// All ModelElements are contained within a [PackageGraph], and laid out in a @@ -96,7 +121,8 @@ abstract class ModelElement extends Canonicalization SourceCodeMixin, Indexable, FeatureSet, - DocumentationComment + DocumentationComment, + ModelBuilder implements Comparable, Documentable { final Element _element; @@ -111,25 +137,25 @@ abstract class ModelElement extends Canonicalization [this._originalMember]); /// Creates a [ModelElement] from [e]. - factory ModelElement.fromElement(Element e, PackageGraph p) { + factory ModelElement._fromElement(Element e, PackageGraph p) { var lib = p.findButDoNotCreateLibraryFor(e); if (e is PropertyInducingElement) { var getter = - e.getter != null ? ModelElement.from(e.getter, lib, p) : null; + e.getter != null ? ModelElement._from(e.getter, lib, p) : null; var setter = - e.setter != null ? ModelElement.from(e.setter, lib, p) : null; - return ModelElement.fromPropertyInducingElement(e, lib, p, + e.setter != null ? ModelElement._from(e.setter, lib, p) : null; + return ModelElement._fromPropertyInducingElement(e, lib, p, getter: getter, setter: setter); } - return ModelElement.from(e, lib, p); + return ModelElement._from(e, lib, p); } /// Creates a [ModelElement] from [PropertyInducingElement] [e]. /// /// Do not construct any ModelElements except from this constructor or - /// [ModelElement.from]. Specify [enclosingContainer] + /// [ModelElement._from]. Specify [enclosingContainer] /// if and only if this is to be an inherited or extended object. - factory ModelElement.fromPropertyInducingElement( + factory ModelElement._fromPropertyInducingElement( PropertyInducingElement e, Library library, PackageGraph packageGraph, {Container enclosingContainer, @required Accessor getter, @@ -189,7 +215,7 @@ abstract class ModelElement extends Canonicalization /// Creates a [ModelElement] from a non-property-inducing [e]. /// /// Do not construct any ModelElements except from this constructor or - /// [ModelElement.fromPropertyInducingElement]. Specify [enclosingContainer] + /// [ModelElement._fromPropertyInducingElement]. Specify [enclosingContainer] /// if and only if this is to be an inherited or extended object. // TODO(jcollins-g): this way of using the optional parameter is messy, // clean that up. @@ -197,7 +223,7 @@ abstract class ModelElement extends Canonicalization // TODO(jcollins-g): Allow e to be null and drop extraneous null checks. // TODO(jcollins-g): Auto-vivify element's defining library for library // parameter when given a null. - factory ModelElement.from( + factory ModelElement._from( Element e, Library library, PackageGraph packageGraph, {Container enclosingContainer}) { assert(packageGraph != null); @@ -231,7 +257,7 @@ abstract class ModelElement extends Canonicalization return packageGraph.allConstructedModelElements[key]; } - var newModelElement = ModelElement._from(e, library, packageGraph, + var newModelElement = ModelElement._fromParameters(e, library, packageGraph, enclosingContainer: enclosingContainer, originalMember: originalMember); if (enclosingContainer != null) assert(newModelElement is Inheritable); @@ -242,8 +268,8 @@ abstract class ModelElement extends Canonicalization return newModelElement; } - /// Caches a newly-created [ModelElement] from [ModelElement.from] or - /// [ModelElement.fromPropertyInducingElement]. + /// Caches a newly-created [ModelElement] from [ModelElement._from] or + /// [ModelElement._fromPropertyInducingElement]. static void _cacheNewModelElement( Element e, ModelElement newModelElement, Library library, {Container enclosingContainer}) { @@ -262,7 +288,7 @@ abstract class ModelElement extends Canonicalization } } - static ModelElement _from( + static ModelElement _fromParameters( Element e, Library library, PackageGraph packageGraph, {Container enclosingContainer, Member originalMember}) { if (e is MultiplyInheritedExecutableElement) { @@ -271,7 +297,7 @@ abstract class ModelElement extends Canonicalization } assert(e is! MultiplyDefinedElement); if (e is LibraryElement) { - return Library(e, packageGraph); + return packageGraph.findButDoNotCreateLibraryFor(e); } if (e is PrefixElement) { return Prefix(e, library, packageGraph); @@ -598,7 +624,7 @@ abstract class ModelElement extends Canonicalization } // Start with our top-level element. - var warnable = ModelElement.fromElement(topLevelElement, packageGraph); + var warnable = ModelElement._fromElement(topLevelElement, packageGraph); // Heuristic scoring to determine which library a human likely // considers this element to be primarily 'from', and therefore, // canonical. Still warn if the heuristic isn't that confident. @@ -888,7 +914,7 @@ abstract class ModelElement extends Canonicalization List params; if (element is TypeAliasElement) { - _parameters = ModelElement.fromElement( + _parameters = ModelElement._fromElement( (element as TypeAliasElement).aliasedElement, packageGraph) .parameters; } else { @@ -908,8 +934,8 @@ abstract class ModelElement extends Canonicalization } } _parameters = UnmodifiableListView(params - .map( - (p) => ModelElement.from(p, library, packageGraph) as Parameter) + .map((p) => + ModelElement._from(p, library, packageGraph) as Parameter) .toList(growable: false)); } } diff --git a/lib/src/model/model_function.dart b/lib/src/model/model_function.dart index 236f1e6ea6..3025183465 100644 --- a/lib/src/model/model_function.dart +++ b/lib/src/model/model_function.dart @@ -37,16 +37,15 @@ class ModelFunctionTypedef extends ModelFunctionTyped { class ModelFunctionTyped extends ModelElement with TypeParameters implements EnclosedElement { + List _typeParameters; @override - final List typeParameters; + List get typeParameters => _typeParameters ??= [ + for (var p in element.typeParameters) modelBuilder.from(p, library), + ]; ModelFunctionTyped( FunctionTypedElement element, Library library, PackageGraph packageGraph) - : typeParameters = [ - for (var p in element.typeParameters) - ModelElement.from(p, library, packageGraph), - ], - super(element, library, packageGraph); + : super(element, library, packageGraph); @override ModelElement get enclosingElement => library; diff --git a/lib/src/model/model_object_builder.dart b/lib/src/model/model_object_builder.dart new file mode 100644 index 0000000000..6ad909ae94 --- /dev/null +++ b/lib/src/model/model_object_builder.dart @@ -0,0 +1,39 @@ +// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'package:analyzer/dart/element/element.dart'; +import 'package:dartdoc/src/model/accessor.dart'; +import 'package:dartdoc/src/model/container.dart'; +import 'package:dartdoc/src/model/library.dart'; +import 'package:dartdoc/src/model/model_element.dart'; +import 'package:dartdoc/src/model/package_graph.dart'; +import 'package:meta/meta.dart'; + +abstract class ModelObjectBuilder { + ModelElement from(Element e, Library library, {Container enclosingContainer}); + + ModelElement fromElement(Element e); + + ModelElement fromPropertyInducingElement(Element e, Library l, + {Container enclosingContainer, + @required Accessor getter, + @required Accessor setter}); +} + +abstract class ModelBuilderInterface { + /// Override implementations in unit tests to avoid requiring literal + /// [ModelElement]s. + ModelObjectBuilder get modelBuilder; +} + +/// Default implementation of the ModelBuilderInterface, requiring a +/// [PackageGraph]. +mixin ModelBuilder implements ModelBuilderInterface { + PackageGraph get packageGraph; + + ModelObjectBuilder _modelBuilder; + @override + ModelObjectBuilder get modelBuilder => + _modelBuilder ??= ModelElementBuilderImpl(packageGraph); +} diff --git a/lib/src/model/package.dart b/lib/src/model/package.dart index a2e30dd72f..efe5bccd0a 100644 --- a/lib/src/model/package.dart +++ b/lib/src/model/package.dart @@ -9,6 +9,7 @@ import 'package:dartdoc/src/dartdoc_options.dart'; import 'package:dartdoc/src/io_utils.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; import 'package:dartdoc/src/model/model.dart'; +import 'package:dartdoc/src/model/model_object_builder.dart'; import 'package:dartdoc/src/package_meta.dart'; import 'package:dartdoc/src/warnings.dart'; import 'package:meta/meta.dart'; @@ -30,7 +31,13 @@ const String htmlBasePlaceholder = '\%\%__HTMLBASE_dartdoc_internal__\%\%'; /// A [LibraryContainer] that contains [Library] objects related to a particular /// package. class Package extends LibraryContainer - with Nameable, Locatable, Canonicalization, Warnable, CommentReferable + with + Nameable, + Locatable, + Canonicalization, + Warnable, + CommentReferable, + ModelBuilder implements Privacy, Documentable { String _name; PackageGraph _packageGraph; diff --git a/lib/src/model/package_graph.dart b/lib/src/model/package_graph.dart index 16ef48c4b1..6c16ae38ab 100644 --- a/lib/src/model/package_graph.dart +++ b/lib/src/model/package_graph.dart @@ -15,6 +15,7 @@ import 'package:dartdoc/src/failure.dart'; import 'package:dartdoc/src/logging.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; import 'package:dartdoc/src/model/model.dart'; +import 'package:dartdoc/src/model/model_object_builder.dart'; import 'package:dartdoc/src/model_utils.dart' as utils; import 'package:dartdoc/src/package_meta.dart' show PackageMeta, PackageMetaProvider; @@ -25,7 +26,7 @@ import 'package:dartdoc/src/tool_runner.dart'; import 'package:dartdoc/src/tuple.dart'; import 'package:dartdoc/src/warnings.dart'; -class PackageGraph with CommentReferable, Nameable { +class PackageGraph with CommentReferable, Nameable, ModelBuilder { PackageGraph.uninitialized( this.config, this.sdk, @@ -767,11 +768,11 @@ class PackageGraph with CommentReferable, Nameable { ModelElement modelElement; // For elements defined in extensions, they are canonical. if (e?.enclosingElement is ExtensionElement) { - lib ??= Library(e.enclosingElement.library, packageGraph); + lib ??= modelBuilder.fromElement(e.enclosingElement.library); // (TODO:keertip) Find a better way to exclude members of extensions // when libraries are specified using the "--include" flag if (lib?.isDocumented == true) { - return ModelElement.from(e, lib, packageGraph); + return modelBuilder.from(e, lib); } } // TODO(jcollins-g): Special cases are pretty large here. Refactor to split @@ -853,17 +854,14 @@ class PackageGraph with CommentReferable, Nameable { } else { if (lib != null) { if (e is PropertyInducingElement) { - var getter = e.getter != null - ? ModelElement.from(e.getter, lib, packageGraph) - : null; - var setter = e.setter != null - ? ModelElement.from(e.setter, lib, packageGraph) - : null; - modelElement = ModelElement.fromPropertyInducingElement( - e, lib, packageGraph, + var getter = + e.getter != null ? modelBuilder.from(e.getter, lib) : null; + var setter = + e.setter != null ? modelBuilder.from(e.setter, lib) : null; + modelElement = modelBuilder.fromPropertyInducingElement(e, lib, getter: getter, setter: setter); } else { - modelElement = ModelElement.from(e, lib, packageGraph); + modelElement = modelBuilder.from(e, lib); } } assert(modelElement is! Inheritable); diff --git a/lib/src/model/parameter.dart b/lib/src/model/parameter.dart index 0d39fa89a4..aca7d2f94a 100644 --- a/lib/src/model/parameter.dart +++ b/lib/src/model/parameter.dart @@ -20,7 +20,7 @@ class Parameter extends ModelElement implements EnclosedElement { @override ModelElement get enclosingElement => (element.enclosingElement != null) - ? ModelElement.from(element.enclosingElement, library, packageGraph) + ? modelBuilder.from(element.enclosingElement, library) : null; bool get hasDefaultValue { diff --git a/lib/src/model/prefix.dart b/lib/src/model/prefix.dart index c44e0838da..09ccd01b18 100644 --- a/lib/src/model/prefix.dart +++ b/lib/src/model/prefix.dart @@ -26,11 +26,9 @@ class Prefix extends ModelElement implements EnclosedElement { // TODO(jcollins-g): consider connecting PrefixElement to the imported library // in analyzer? Library get associatedLibrary => - _associatedLibrary ??= ModelElement.fromElement( - library.element.imports - .firstWhere((i) => i.prefix == element) - .importedLibrary, - packageGraph); + _associatedLibrary ??= modelBuilder.fromElement(library.element.imports + .firstWhere((i) => i.prefix == element) + .importedLibrary); @override Library get canonicalModelElement => associatedLibrary.canonicalLibrary; diff --git a/lib/src/model/type_parameter.dart b/lib/src/model/type_parameter.dart index 54056ed6e0..6eb556701f 100644 --- a/lib/src/model/type_parameter.dart +++ b/lib/src/model/type_parameter.dart @@ -15,7 +15,7 @@ class TypeParameter extends ModelElement { @override ModelElement get enclosingElement => (element.enclosingElement != null) - ? ModelElement.from(element.enclosingElement, library, packageGraph) + ? modelBuilder.from(element.enclosingElement, library) : null; @override diff --git a/lib/src/model/typedef.dart b/lib/src/model/typedef.dart index d4be7b2433..791937c327 100644 --- a/lib/src/model/typedef.dart +++ b/lib/src/model/typedef.dart @@ -62,7 +62,7 @@ abstract class Typedef extends ModelElement @override List get typeParameters => element.typeParameters.map((f) { - return ModelElement.from(f, library, packageGraph) as TypeParameter; + return modelBuilder.from(f, library) as TypeParameter; }).toList(); TypedefRenderer get _renderer => packageGraph.rendererFactory.typedefRenderer; diff --git a/test/comment_referable/comment_referable_test.dart b/test/comment_referable/comment_referable_test.dart index 127d6262ef..17ce8bcbf0 100644 --- a/test/comment_referable/comment_referable_test.dart +++ b/test/comment_referable/comment_referable_test.dart @@ -6,12 +6,17 @@ library dartdoc.comment_reference_test; import 'package:analyzer/dart/element/element.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; +import 'package:dartdoc/src/model/model_object_builder.dart'; import 'package:dartdoc/src/model/nameable.dart'; import 'package:test/test.dart'; const _separator = '.'; abstract class Base extends Nameable with CommentReferable { + @override + ModelObjectBuilder get modelBuilder => + throw UnimplementedError('not needed for this test'); + List children; Base parent; diff --git a/test/mustachio/foo.runtime_renderers.dart b/test/mustachio/foo.runtime_renderers.dart index e1b31ca1eb..6dcfdc94af 100644 --- a/test/mustachio/foo.runtime_renderers.dart +++ b/test/mustachio/foo.runtime_renderers.dart @@ -14,6 +14,7 @@ import 'package:dartdoc/src/model/feature.dart'; import 'package:dartdoc/src/model/feature_set.dart'; import 'package:dartdoc/src/model/language_feature.dart'; import 'package:dartdoc/src/model/model.dart'; +import 'package:dartdoc/src/model/model_object_builder.dart'; import 'package:dartdoc/src/mustachio/parser.dart'; import 'package:dartdoc/src/mustachio/renderer_base.dart'; import 'package:dartdoc/src/warnings.dart'; diff --git a/test/src/utils.dart b/test/src/utils.dart index 413b072244..8e9d696485 100644 --- a/test/src/utils.dart +++ b/test/src/utils.dart @@ -12,7 +12,6 @@ import 'package:analyzer/src/test_utilities/mock_sdk.dart'; import 'package:dartdoc/src/dartdoc_options.dart'; import 'package:dartdoc/src/markdown_processor.dart'; import 'package:dartdoc/src/matching_link_result.dart'; -import 'package:dartdoc/src/model/model_element.dart'; import 'package:dartdoc/src/model/package_builder.dart'; import 'package:dartdoc/src/model/package_graph.dart'; import 'package:dartdoc/src/package_config_provider.dart'; @@ -205,8 +204,8 @@ two:lib/ MatchingLinkResult definingLinkResult(MatchingLinkResult originalResult) { if (originalResult.commentReferable?.element != null) { return MatchingLinkResult( - ModelElement.fromElement(originalResult.commentReferable.element, - originalResult.commentReferable.packageGraph), + originalResult.commentReferable.modelBuilder + .fromElement(originalResult.commentReferable.element), warn: originalResult.warn); } return originalResult; diff --git a/tool/mustachio/codegen_runtime_renderer.dart b/tool/mustachio/codegen_runtime_renderer.dart index 59905ebc84..445bdd8acd 100644 --- a/tool/mustachio/codegen_runtime_renderer.dart +++ b/tool/mustachio/codegen_runtime_renderer.dart @@ -90,6 +90,7 @@ import 'package:dartdoc/src/model/feature.dart'; import 'package:dartdoc/src/model/feature_set.dart'; import 'package:dartdoc/src/model/language_feature.dart'; import 'package:dartdoc/src/model/model.dart'; +import 'package:dartdoc/src/model/model_object_builder.dart'; import 'package:dartdoc/src/mustachio/parser.dart'; import 'package:dartdoc/src/mustachio/renderer_base.dart'; import 'package:dartdoc/src/warnings.dart';