diff --git a/lib/src/generator/generator_utils.dart b/lib/src/generator/generator_utils.dart index 73ba95edbd..94c4c9aef5 100644 --- a/lib/src/generator/generator_utils.dart +++ b/lib/src/generator/generator_utils.dart @@ -6,7 +6,6 @@ import 'dart:convert'; import 'package:collection/collection.dart'; import 'package:dartdoc/src/model/directives/categorization.dart'; -import 'package:dartdoc/src/model/enclosed_element.dart'; import 'package:dartdoc/src/model/indexable.dart'; import 'package:dartdoc/src/model/model_element.dart'; @@ -34,30 +33,28 @@ String generateCategoryJson(Iterable categories, bool pretty) { } /// Generates the text of the search index file (`index.json`) containing -/// [indexedItems] and [packageOrder]. +/// [indexedElements] and [packageOrder]. /// /// Passing `pretty: true` will use a [JsonEncoder] with a single-space indent. String generateSearchIndexJson(Iterable indexedElements, {required List packageOrder, required bool pretty}) { final indexItems = [ - for (final indexable - in indexedElements.sorted(_compareElementRepresentations)) + for (final item in indexedElements.sorted(_compareElementRepresentations)) { - 'name': indexable.name, - 'qualifiedName': indexable.fullyQualifiedName, - 'href': indexable.href, - 'kind': indexable.kind.index, + 'name': item.name, + 'qualifiedName': item.fullyQualifiedName, + 'href': item.href, + 'kind': item.kind.index, // TODO(srawlins): Only include this for [Inheritable] items. - 'overriddenDepth': indexable.overriddenDepth, - if (indexable is ModelElement) - 'packageRank': _packageRank(packageOrder, indexable), - if (indexable is ModelElement) - 'desc': _removeHtmlTags(indexable.oneLineDoc), - if (indexable is EnclosedElement) + 'overriddenDepth': item.overriddenDepth, + if (item is ModelElement) + 'packageRank': _packageRank(packageOrder, item), + if (item is ModelElement) 'desc': _removeHtmlTags(item.oneLineDoc), + if (item case ModelElement(:var enclosingElement?)) 'enclosedBy': { - 'name': indexable.enclosingElement.name, - 'kind': indexable.enclosingElement.kind.index, - 'href': indexable.enclosingElement.href, + 'name': enclosingElement.name, + 'kind': enclosingElement.kind.index, + 'href': enclosingElement.href, }, } ]; @@ -114,7 +111,7 @@ final _htmlTagPattern = RegExp(r'<[^>]*>', multiLine: true, caseSensitive: true); // Compares two elements, first by fully qualified name, then by kind. -int _compareElementRepresentations(T a, T b) { +int _compareElementRepresentations(Indexable a, Indexable b) { final value = compareNatural(a.fullyQualifiedName, b.fullyQualifiedName); if (value == 0) { return compareNatural(a.kind.toString(), b.kind.toString()); diff --git a/lib/src/generator/templates.runtime_renderers.dart b/lib/src/generator/templates.runtime_renderers.dart index 6b606f4a78..b68e7a6f63 100644 --- a/lib/src/generator/templates.runtime_renderers.dart +++ b/lib/src/generator/templates.runtime_renderers.dart @@ -2084,8 +2084,8 @@ class _Renderer_Constructor extends RendererBase { CT_, () => { ..._Renderer_ModelElement.propertyMap(), - ..._Renderer_TypeParameters.propertyMap(), ..._Renderer_ContainerMember.propertyMap(), + ..._Renderer_TypeParameters.propertyMap(), 'aboveSidebarPath': Property( getValue: (CT_ c) => c.aboveSidebarPath, renderVariable: @@ -3456,29 +3456,6 @@ class _Renderer_ContainerMember extends RendererBase { parent: r); }, ), - 'definingEnclosingContainer': Property( - getValue: (CT_ c) => c.definingEnclosingContainer, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) { - return self.getValue(c).toString(); - } - var name = remainingNames.first; - var nextProperty = - _Renderer_Container.propertyMap().getValue(name); - return nextProperty.renderVariable( - self.getValue(c) as Container, - nextProperty, - [...remainingNames.skip(1)]); - }, - isNullValue: (CT_ c) => false, - renderValue: (CT_ c, RendererBase r, - List ast, StringSink sink) { - _render_Container( - c.definingEnclosingContainer, ast, r.template, sink, - parent: r); - }, - ), 'enclosingElement': Property( getValue: (CT_ c) => c.enclosingElement, renderVariable: diff --git a/lib/src/model/accessor.dart b/lib/src/model/accessor.dart index b9b8fa2780..d1e9aa250c 100644 --- a/lib/src/model/accessor.dart +++ b/lib/src/model/accessor.dart @@ -16,7 +16,7 @@ import 'package:dartdoc/src/utils.dart'; import 'package:dartdoc/src/warnings.dart'; /// Getters and setters. -class Accessor extends ModelElement implements EnclosedElement { +class Accessor extends ModelElement { @override final PropertyAccessorElement element; diff --git a/lib/src/model/constructor.dart b/lib/src/model/constructor.dart index e69fd4d63e..ecbcb99c11 100644 --- a/lib/src/model/constructor.dart +++ b/lib/src/model/constructor.dart @@ -8,9 +8,7 @@ import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; import 'package:dartdoc/src/model/model.dart'; -class Constructor extends ModelElement - with TypeParameters, ContainerMember - implements EnclosedElement { +class Constructor extends ModelElement with ContainerMember, TypeParameters { @override final ConstructorElement element; diff --git a/lib/src/model/container_member.dart b/lib/src/model/container_member.dart index 5dc78ca08c..af8b9e08c3 100644 --- a/lib/src/model/container_member.dart +++ b/lib/src/model/container_member.dart @@ -4,9 +4,10 @@ import 'package:dartdoc/src/model/attribute.dart'; import 'package:dartdoc/src/model/model.dart'; +import 'package:meta/meta.dart'; /// A [ModelElement] that is a [Container] member. -mixin ContainerMember on ModelElement implements EnclosedElement { +mixin ContainerMember on ModelElement { /// True if this [ContainerMember] is from an applicable [Extension]. /// False otherwise, including if this [ContainerMember]'s [enclosingElement] /// is the extension it was declared in. @@ -20,6 +21,9 @@ mixin ContainerMember on ModelElement implements EnclosedElement { @override Container get enclosingElement; + /// The container that contains this member. + @protected + @visibleForTesting late final Container definingEnclosingContainer = getModelForElement(element.enclosingElement!) as Container; diff --git a/lib/src/model/enclosed_element.dart b/lib/src/model/enclosed_element.dart deleted file mode 100644 index 9e8666a0c9..0000000000 --- a/lib/src/model/enclosed_element.dart +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) 2019, 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:dartdoc/src/model/model.dart'; - -/// An element that is enclosed by some other element. -/// -/// Libraries are not enclosed. -abstract class EnclosedElement implements Indexable { - ModelElement get enclosingElement; -} diff --git a/lib/src/model/extension.dart b/lib/src/model/extension.dart index e60dfab585..0a124c2fd0 100644 --- a/lib/src/model/extension.dart +++ b/lib/src/model/extension.dart @@ -12,7 +12,7 @@ import 'package:meta/meta.dart'; /// Static extension on a given type, containing methods (including getters, /// setters, operators). -class Extension extends Container implements EnclosedElement { +class Extension extends Container { @override final ExtensionElement element; diff --git a/lib/src/model/field.dart b/lib/src/model/field.dart index 833a13647b..27c4a87275 100644 --- a/lib/src/model/field.dart +++ b/lib/src/model/field.dart @@ -9,8 +9,7 @@ import 'package:dartdoc/src/model/attribute.dart'; import 'package:dartdoc/src/model/model.dart'; class Field extends ModelElement - with GetterSetterCombo, ContainerMember, Inheritable - implements EnclosedElement { + with GetterSetterCombo, ContainerMember, Inheritable { @override final FieldElement element; diff --git a/lib/src/model/inheriting_container.dart b/lib/src/model/inheriting_container.dart index a756d9974a..39436ec1a6 100644 --- a/lib/src/model/inheriting_container.dart +++ b/lib/src/model/inheriting_container.dart @@ -74,8 +74,7 @@ mixin Constructable implements InheritingContainer { /// /// * **instance**: As with [Container], but also includes inherited children. /// * **inherited**: Filtered getters giving only inherited children. -abstract class InheritingContainer extends Container - implements EnclosedElement { +abstract class InheritingContainer extends Container { InheritingContainer(super.library, super.packageGraph); DefinedElementType? get supertype { diff --git a/lib/src/model/method.dart b/lib/src/model/method.dart index 0a8ffb127e..31c337cad4 100644 --- a/lib/src/model/method.dart +++ b/lib/src/model/method.dart @@ -12,8 +12,7 @@ import 'package:dartdoc/src/model/comment_referable.dart'; import 'package:dartdoc/src/model/model.dart'; class Method extends ModelElement - with ContainerMember, Inheritable, TypeParameters - implements EnclosedElement { + with ContainerMember, Inheritable, TypeParameters { @override final MethodElement element; diff --git a/lib/src/model/model.dart b/lib/src/model/model.dart index 094b7042fb..07a8f83b94 100644 --- a/lib/src/model/model.dart +++ b/lib/src/model/model.dart @@ -15,7 +15,6 @@ export 'documentable.dart'; export 'documentation.dart'; export 'documentation_comment.dart'; export 'dynamic.dart'; -export 'enclosed_element.dart'; export 'enum.dart'; export 'extension.dart'; export 'extension_type.dart'; diff --git a/lib/src/model/model_element.dart b/lib/src/model/model_element.dart index 881cdef035..52e9da0443 100644 --- a/lib/src/model/model_element.dart +++ b/lib/src/model/model_element.dart @@ -338,6 +338,14 @@ abstract class ModelElement extends Canonicalization return Accessor(e, library, packageGraph); } + /// The model element enclosing this one. + /// + /// As some examples: + /// * Instances of some subclasses have no enclosing element, like [Library] + /// and [Dynamic]. + /// * A [Container] is enclosed by a [Library]. + /// * A [Method] is enclosed by a [Container]. + /// * An [Accessor] is either enclosed by a [Container] or a [Library]. ModelElement? get enclosingElement; // Stub for mustache, which would otherwise search enclosing elements to find diff --git a/lib/src/model/model_function.dart b/lib/src/model/model_function.dart index deb71f7e05..d1f777bee4 100644 --- a/lib/src/model/model_function.dart +++ b/lib/src/model/model_function.dart @@ -32,9 +32,7 @@ class ModelFunctionTypedef extends ModelFunctionTyped { String get name => element.enclosingElement!.name!; } -class ModelFunctionTyped extends ModelElement - with TypeParameters - implements EnclosedElement { +class ModelFunctionTyped extends ModelElement with TypeParameters { @override final FunctionTypedElement element; diff --git a/lib/src/model/prefix.dart b/lib/src/model/prefix.dart index 6bea775980..9c4d6d6881 100644 --- a/lib/src/model/prefix.dart +++ b/lib/src/model/prefix.dart @@ -11,7 +11,7 @@ import 'package:dartdoc/src/model/model.dart'; /// /// Like [Parameter], it doesn't have doc pages, but participates in lookups. /// Forwards to its referenced library if referred to directly. -class Prefix extends ModelElement with HasNoPage implements EnclosedElement { +class Prefix extends ModelElement with HasNoPage { @override final PrefixElement element; diff --git a/lib/src/model/top_level_variable.dart b/lib/src/model/top_level_variable.dart index 85e19b164d..6d90674bab 100644 --- a/lib/src/model/top_level_variable.dart +++ b/lib/src/model/top_level_variable.dart @@ -9,8 +9,7 @@ import 'package:dartdoc/src/model/model.dart'; /// Top-level variables. But also picks up getters and setters? class TopLevelVariable extends ModelElement - with GetterSetterCombo, Categorization - implements EnclosedElement { + with GetterSetterCombo, Categorization { @override final TopLevelVariableElement element; diff --git a/lib/src/model/typedef.dart b/lib/src/model/typedef.dart index bcafdc185c..899cd59ced 100644 --- a/lib/src/model/typedef.dart +++ b/lib/src/model/typedef.dart @@ -9,8 +9,7 @@ import 'package:dartdoc/src/model/comment_referable.dart'; import 'package:dartdoc/src/model/model.dart'; abstract class Typedef extends ModelElement - with TypeParameters, Categorization - implements EnclosedElement { + with TypeParameters, Categorization { @override final TypeAliasElement element;