diff --git a/lib/src/generator/templates.runtime_renderers.dart b/lib/src/generator/templates.runtime_renderers.dart index 2c4095196d..c617f95562 100644 --- a/lib/src/generator/templates.runtime_renderers.dart +++ b/lib/src/generator/templates.runtime_renderers.dart @@ -12,7 +12,6 @@ import 'package:dartdoc/src/generator/template_data.dart'; import 'package:dartdoc/src/model/annotation.dart'; import 'package:dartdoc/src/model/attribute.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; -import 'package:dartdoc/src/model/extension_target.dart'; import 'package:dartdoc/src/model/feature_set.dart'; import 'package:dartdoc/src/model/language_feature.dart'; import 'package:dartdoc/src/model/model.dart'; @@ -5089,77 +5088,6 @@ class _Renderer_Extension extends RendererBase { } } -class _Renderer_ExtensionTarget extends RendererBase { - static final Map _propertyMapCache = {}; - static Map> propertyMap< - CT_ extends ExtensionTarget>() => - _propertyMapCache.putIfAbsent( - CT_, - () => { - 'hasModifiers': Property( - getValue: (CT_ c) => c.hasModifiers, - renderVariable: (CT_ c, Property self, - List remainingNames) => - self.renderSimpleVariable(c, remainingNames, 'bool'), - getBool: (CT_ c) => c.hasModifiers, - ), - 'hasPotentiallyApplicableExtensions': Property( - getValue: (CT_ c) => c.hasPotentiallyApplicableExtensions, - renderVariable: (CT_ c, Property self, - List remainingNames) => - self.renderSimpleVariable(c, remainingNames, 'bool'), - getBool: (CT_ c) => c.hasPotentiallyApplicableExtensions, - ), - 'modelType': Property( - getValue: (CT_ c) => c.modelType, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) { - return self.getValue(c).toString(); - } - var name = remainingNames.first; - var nextProperty = - _Renderer_ElementType.propertyMap().getValue(name); - return nextProperty.renderVariable( - self.getValue(c) as ElementType, - nextProperty, - [...remainingNames.skip(1)]); - }, - isNullValue: (CT_ c) => false, - renderValue: (CT_ c, RendererBase r, - List ast, StringSink sink) { - _render_ElementType(c.modelType, ast, r.template, sink, - parent: r); - }, - ), - 'potentiallyApplicableExtensionsSorted': Property( - getValue: (CT_ c) => c.potentiallyApplicableExtensionsSorted, - renderVariable: (CT_ c, Property self, - List remainingNames) => - self.renderSimpleVariable( - c, remainingNames, 'List'), - renderIterable: (CT_ c, RendererBase r, - List ast, StringSink sink) { - return c.potentiallyApplicableExtensionsSorted.map((e) => - _render_Extension(e, ast, r.template, sink, parent: r)); - }, - ), - }) as Map>; - - _Renderer_ExtensionTarget(ExtensionTarget 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; - } - } -} - String renderExtension( ExtensionTemplateData context, Template template) { var buffer = StringBuffer(); @@ -7448,7 +7376,6 @@ class _Renderer_InheritingContainer extends RendererBase { CT_, () => { ..._Renderer_Container.propertyMap(), - ..._Renderer_ExtensionTarget.propertyMap(), 'allFields': Property( getValue: (CT_ c) => c.allFields, renderVariable: (CT_ c, Property self, @@ -7626,6 +7553,13 @@ class _Renderer_InheritingContainer extends RendererBase { self.renderSimpleVariable(c, remainingNames, 'bool'), getBool: (CT_ c) => c.hasModifiers, ), + 'hasPotentiallyApplicableExtensions': Property( + getValue: (CT_ c) => c.hasPotentiallyApplicableExtensions, + renderVariable: (CT_ c, Property self, + List remainingNames) => + self.renderSimpleVariable(c, remainingNames, 'bool'), + getBool: (CT_ c) => c.hasPotentiallyApplicableExtensions, + ), 'hasPublicSuperChainReversed': Property( getValue: (CT_ c) => c.hasPublicSuperChainReversed, renderVariable: (CT_ c, Property self, @@ -7779,6 +7713,18 @@ class _Renderer_InheritingContainer extends RendererBase { parent: r); }, ), + 'potentiallyApplicableExtensionsSorted': Property( + getValue: (CT_ c) => c.potentiallyApplicableExtensionsSorted, + renderVariable: (CT_ c, Property self, + List remainingNames) => + self.renderSimpleVariable( + c, remainingNames, 'List'), + renderIterable: (CT_ c, RendererBase r, + List ast, StringSink sink) { + return c.potentiallyApplicableExtensionsSorted.map((e) => + _render_Extension(e, ast, r.template, sink, parent: r)); + }, + ), 'publicInheritedInstanceFields': Property( getValue: (CT_ c) => c.publicInheritedInstanceFields, renderVariable: (CT_ c, Property self, @@ -12632,7 +12578,7 @@ class _Renderer_Package extends RendererBase { } } -String renderSearchPage(PackageTemplateData context, Template template) { +String renderIndex(PackageTemplateData context, Template template) { var buffer = StringBuffer(); _render_PackageTemplateData(context, template.ast, template, buffer); return buffer.toString(); @@ -12870,13 +12816,13 @@ class _Renderer_PackageTemplateData extends RendererBase { } } -String renderError(PackageTemplateData context, Template template) { +String renderSearchPage(PackageTemplateData context, Template template) { var buffer = StringBuffer(); _render_PackageTemplateData(context, template.ast, template, buffer); return buffer.toString(); } -String renderIndex(PackageTemplateData context, Template template) { +String renderError(PackageTemplateData context, Template template) { var buffer = StringBuffer(); _render_PackageTemplateData(context, template.ast, template, buffer); return buffer.toString(); diff --git a/lib/src/model/extension.dart b/lib/src/model/extension.dart index e2f8beea3c..933ec9af97 100644 --- a/lib/src/model/extension.dart +++ b/lib/src/model/extension.dart @@ -6,7 +6,6 @@ import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; -import 'package:dartdoc/src/model/extension_target.dart'; import 'package:dartdoc/src/model/model.dart'; import 'package:dartdoc/src/type_utils.dart'; import 'package:meta/meta.dart'; @@ -28,8 +27,8 @@ class Extension extends Container implements EnclosedElement { extendedType.instantiatedType is VoidType || extendedType.instantiatedType.isDartCoreObject; - bool couldApplyTo(T c) => - _couldApplyTo(c.modelType as DefinedElementType); + bool couldApplyTo(T c) => + _couldApplyTo(c.modelType); /// Whether this extension could apply to [type]. bool _couldApplyTo(DefinedElementType type) { @@ -57,7 +56,7 @@ class Extension extends Container implements EnclosedElement { Kind get kind => Kind.extension; @override - late List declaredMethods = element.methods + late final List declaredMethods = element.methods .map((e) => modelBuilder.from(e, library) as Method) .toList(growable: false); diff --git a/lib/src/model/extension_target.dart b/lib/src/model/extension_target.dart deleted file mode 100644 index 06b661a952..0000000000 --- a/lib/src/model/extension_target.dart +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) 2020, 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/element_type.dart'; -import 'package:dartdoc/src/model/model.dart'; - -// TODO(jcollins-g): Mix-in ExtensionTarget on Method, ModelFunction, Typedef, -// and other possible documented symbols that could be extended (#2701). -mixin ExtensionTarget on ModelElement { - bool get hasModifiers; - - bool get hasPotentiallyApplicableExtensions => - potentiallyApplicableExtensionsSorted.isNotEmpty; - - /// The sorted list of potentially applicable extensions, for display in - /// templates. - /// - /// This is defined as those extensions where an instantiation of the type - /// defined by [element] can exist where this extension applies, not including - /// any extension that applies to every type. - late final List potentiallyApplicableExtensionsSorted = - packageGraph.documentedExtensions - .where((e) => !e.alwaysApplies) - .where((e) => e.couldApplyTo(this)) - .toList(growable: false) - ..sort(byName); - - ElementType get modelType; -} diff --git a/lib/src/model/inheriting_container.dart b/lib/src/model/inheriting_container.dart index cacdebc8a8..b929164ea7 100644 --- a/lib/src/model/inheriting_container.dart +++ b/lib/src/model/inheriting_container.dart @@ -8,7 +8,6 @@ import 'package:collection/collection.dart' show IterableExtension; import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; import 'package:dartdoc/src/model/container_modifiers.dart'; -import 'package:dartdoc/src/model/extension_target.dart'; import 'package:dartdoc/src/model/language_feature.dart'; import 'package:dartdoc/src/model/model.dart'; import 'package:dartdoc/src/model_utils.dart' as model_utils; @@ -74,8 +73,9 @@ mixin Constructable on InheritingContainer { /// * **instance**: As with [Container], but also includes inherited children. /// * **inherited**: Filtered getters giving only inherited children. abstract class InheritingContainer extends Container - with ExtensionTarget implements EnclosedElement { + InheritingContainer(super.library, super.packageGraph); + DefinedElementType? get supertype { final elementSupertype = element.supertype; return elementSupertype == null || @@ -138,7 +138,6 @@ abstract class InheritingContainer extends Container ]; } - @override late final DefinedElementType modelType = modelBuilder.typeFrom(element.thisType, library) as DefinedElementType; @@ -258,7 +257,21 @@ abstract class InheritingContainer extends Container as Library) as TypeParameter) .toList(growable: false); - InheritingContainer(super.library, super.packageGraph); + bool get hasPotentiallyApplicableExtensions => + potentiallyApplicableExtensionsSorted.isNotEmpty; + + /// The sorted list of potentially applicable extensions, for display in + /// templates. + /// + /// This is defined as those extensions where an instantiation of the type + /// defined by [element] can exist where this extension applies, not including + /// any extension that applies to every type. + late final List potentiallyApplicableExtensionsSorted = + packageGraph.documentedExtensions + .where((e) => !e.alwaysApplies) + .where((e) => e.couldApplyTo(this)) + .toList(growable: false) + ..sort(byName); @override List get allModelElements => _allModelElements; @@ -281,7 +294,6 @@ abstract class InheritingContainer extends Container String get fullkind => kind.toString(); - @override bool get hasModifiers => hasAnnotations || hasPublicSuperChainReversed || @@ -544,19 +556,19 @@ mixin TypeImplementing on InheritingContainer { // the superchain and publicInterfaces of this interface to pretend // as though the hidden class didn't exist and this class was declared // directly referencing the canonical classes further up the chain. - if (interfaceElement is InheritingContainer) { - if (interfaceElement.publicSuperChain.isNotEmpty) { - interfaces.add(interfaceElement.publicSuperChain.first); - } - interfaces.addAll(interfaceElement.publicInterfaces); - } else { + if (interfaceElement is! InheritingContainer) { assert( - false, - 'Can not handle intermediate non-public interfaces created by ' - 'ModelElements that are not classes or mixins: $fullyQualifiedName ' - 'contains an interface $interface, defined by $interfaceElement'); + false, + 'Can not handle intermediate non-public interfaces created by ' + "ModelElements that are not classes or mixins: '$fullyQualifiedName' " + "contains an interface '$interface', defined by '$interfaceElement'", + ); continue; } + if (interfaceElement.publicSuperChain.isNotEmpty) { + interfaces.add(interfaceElement.publicSuperChain.first); + } + interfaces.addAll(interfaceElement.publicInterfaces); } return interfaces; } @@ -566,12 +578,12 @@ extension on InterfaceElement { bool get isDartCoreObject => name == 'Object' && library.name == 'dart.core'; } -extension DefinedElementTypeIterableExtensions on Iterable { - /// Expands the `ModelElement` for each element to its inheritance chain. +extension DefinedElementTypeIterableExtension on Iterable { + /// Expands the [ModelElement] for each element to its inheritance chain. Iterable get expandInheritanceChain => expand((e) => (e.modelElement as InheritingContainer).inheritanceChain); - /// Returns the `ModelElement` for each element. + /// Returns the [ModelElement] for each element. Iterable get modelElements => map((e) => e.modelElement as InheritingContainer); } diff --git a/test/mustachio/foo.runtime_renderers.dart b/test/mustachio/foo.runtime_renderers.dart index 55f0822775..6f64562069 100644 --- a/test/mustachio/foo.runtime_renderers.dart +++ b/test/mustachio/foo.runtime_renderers.dart @@ -12,7 +12,6 @@ import 'package:dartdoc/src/generator/template_data.dart'; import 'package:dartdoc/src/model/annotation.dart'; import 'package:dartdoc/src/model/attribute.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; -import 'package:dartdoc/src/model/extension_target.dart'; import 'package:dartdoc/src/model/feature_set.dart'; import 'package:dartdoc/src/model/language_feature.dart'; import 'package:dartdoc/src/model/model.dart'; diff --git a/tool/mustachio/codegen_runtime_renderer.dart b/tool/mustachio/codegen_runtime_renderer.dart index c074a0d163..2c409cca93 100644 --- a/tool/mustachio/codegen_runtime_renderer.dart +++ b/tool/mustachio/codegen_runtime_renderer.dart @@ -89,7 +89,6 @@ import 'package:dartdoc/src/generator/template_data.dart'; import 'package:dartdoc/src/model/annotation.dart'; import 'package:dartdoc/src/model/attribute.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; -import 'package:dartdoc/src/model/extension_target.dart'; import 'package:dartdoc/src/model/feature_set.dart'; import 'package:dartdoc/src/model/language_feature.dart'; import 'package:dartdoc/src/model/model.dart';