Skip to content

Commit e8f2333

Browse files
authored
Remove Indexable as an unnecessary mixin. (#3884)
This mixin only served as an interface providing `href` and `kind`, and providing an impl for `overriddenDepth`. This amounted to a lot of complexity. Some APIs were thus written in terms of Indexable. And any class that mixed in Indexable gets an `overriddenDepth` property which is inapplicable, more often than not. As Documentable has `href` and `kind`, the easiest migration is to switch most Indexable-concerned APIs to use Documentable. We move `overriddenDepth` to _only_ be defined on Inheritable.
1 parent 0684097 commit e8f2333

37 files changed

+54
-107
lines changed

lib/dartdoc.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ library;
99
export 'package:dartdoc/src/dartdoc.dart';
1010
export 'package:dartdoc/src/dartdoc_options.dart';
1111
export 'package:dartdoc/src/generator/generator.dart';
12-
export 'package:dartdoc/src/model/indexable.dart' show Kind;
12+
export 'package:dartdoc/src/model/kind.dart';
1313
export 'package:dartdoc/src/model/package_builder.dart';
1414
export 'package:dartdoc/src/model/package_graph.dart';
1515
export 'package:dartdoc/src/package_config_provider.dart';

lib/src/generator/generator_backend.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ abstract class GeneratorBackend {
105105
}
106106

107107
/// Emits a JSON catalog of [indexedElements] for use with a search index.
108-
void generateSearchIndex(List<Indexable> indexedElements) {
108+
void generateSearchIndex(List<Documentable> indexedElements) {
109109
var json = generator_util.generateSearchIndexJson(
110110
indexedElements,
111111
packageOrder: options.packageOrder,

lib/src/generator/generator_frontend.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class GeneratorFrontEnd implements Generator {
4848

4949
/// Traverses the [packageGraph] and generates documentation for all contained
5050
/// elements.
51-
List<Indexable> _generateDocs(PackageGraph packageGraph) {
51+
List<Documentable> _generateDocs(PackageGraph packageGraph) {
5252
runtimeStats.resetAccumulators({
5353
'writtenCategoryFileCount',
5454
'writtenClassFileCount',
@@ -69,7 +69,7 @@ class GeneratorFrontEnd implements Generator {
6969
_generatorBackend.generatePackage(
7070
packageGraph, packageGraph.defaultPackage);
7171

72-
var indexAccumulator = <Indexable>[];
72+
var indexAccumulator = <Documentable>[];
7373
var multiplePackages = packageGraph.localPackages.length > 1;
7474

7575
void generateConstants(Container container, Library library) {

lib/src/generator/generator_utils.dart

+7-6
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@ import 'dart:convert';
66

77
import 'package:collection/collection.dart';
88
import 'package:dartdoc/src/model/directives/categorization.dart';
9-
import 'package:dartdoc/src/model/indexable.dart';
9+
import 'package:dartdoc/src/model/documentable.dart';
10+
import 'package:dartdoc/src/model/inheritable.dart';
1011
import 'package:dartdoc/src/model/library.dart';
1112
import 'package:dartdoc/src/model/model_element.dart';
13+
import 'package:dartdoc/src/model/nameable.dart';
1214

1315
String generateCategoryJson(Iterable<Categorization> categories, bool pretty) {
1416
final indexItems = [
@@ -37,7 +39,7 @@ String generateCategoryJson(Iterable<Categorization> categories, bool pretty) {
3739
/// [indexedElements] and [packageOrder].
3840
///
3941
/// Passing `pretty: true` will use a [JsonEncoder] with a single-space indent.
40-
String generateSearchIndexJson(Iterable<Indexable> indexedElements,
42+
String generateSearchIndexJson(Iterable<Documentable> indexedElements,
4143
{required List<String> packageOrder, required bool pretty}) {
4244
var indexItems = <Map<String, Object?>>[];
4345

@@ -52,8 +54,7 @@ String generateSearchIndexJson(Iterable<Indexable> indexedElements,
5254
'qualifiedName': element.canonicalQualifiedName,
5355
'href': element.href,
5456
'kind': element.kind.index,
55-
// TODO(srawlins): Only include this for [Inheritable] items.
56-
'overriddenDepth': element.overriddenDepth,
57+
if (element is Inheritable) 'overriddenDepth': element.overriddenDepth,
5758
};
5859

5960
if (element is ModelElement) {
@@ -131,7 +132,7 @@ final _htmlTagPattern =
131132
RegExp(r'<[^>]*>', multiLine: true, caseSensitive: true);
132133

133134
// Compares two elements, first by fully qualified name, then by kind.
134-
int _compareElementRepresentations(Indexable a, Indexable b) {
135+
int _compareElementRepresentations(Documentable a, Documentable b) {
135136
final value =
136137
compareNatural(a.canonicalQualifiedName, b.canonicalQualifiedName);
137138
if (value == 0) {
@@ -140,7 +141,7 @@ int _compareElementRepresentations(Indexable a, Indexable b) {
140141
return value;
141142
}
142143

143-
extension on Indexable {
144+
extension on Nameable {
144145
/// The fully qualified name of this element, but using the canonical library,
145146
/// if it has one.
146147
String get canonicalQualifiedName {

lib/src/generator/template_data.dart

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
/// @docImport 'generator_backend.dart';
66
library;
77

8+
import 'package:dartdoc/src/model/kind.dart';
89
import 'package:dartdoc/src/model/model.dart';
910

1011
typedef ContainerSidebar = String Function(

lib/src/generator/templates.runtime_renderers.dart

+3-72
Original file line numberDiff line numberDiff line change
@@ -841,7 +841,6 @@ class _Renderer_Category extends RendererBase<Category> {
841841
..._Renderer_MarkdownFileDocumentation.propertyMap<CT_>(),
842842
..._Renderer_LibraryContainer.propertyMap<CT_>(),
843843
..._Renderer_TopLevelContainer.propertyMap<CT_>(),
844-
..._Renderer_Indexable.propertyMap<CT_>(),
845844
'aboveSidebarPath': Property(
846845
getValue: (CT_ c) => c.aboveSidebarPath,
847846
renderVariable:
@@ -6888,73 +6887,6 @@ class _Renderer_HasNoPage extends RendererBase<HasNoPage> {
68886887
}
68896888
}
68906889

6891-
class _Renderer_Indexable extends RendererBase<Indexable> {
6892-
static final Map<Type, Object> _propertyMapCache = {};
6893-
static Map<String, Property<CT_>> propertyMap<CT_ extends Indexable>() =>
6894-
_propertyMapCache.putIfAbsent(
6895-
CT_,
6896-
() => {
6897-
'href': Property(
6898-
getValue: (CT_ c) => c.href,
6899-
renderVariable:
6900-
(CT_ c, Property<CT_> self, List<String> remainingNames) {
6901-
if (remainingNames.isEmpty) {
6902-
return self.getValue(c).toString();
6903-
}
6904-
var name = remainingNames.first;
6905-
var nextProperty =
6906-
_Renderer_String.propertyMap().getValue(name);
6907-
return nextProperty.renderVariable(
6908-
self.getValue(c) as String,
6909-
nextProperty,
6910-
[...remainingNames.skip(1)]);
6911-
},
6912-
isNullValue: (CT_ c) => c.href == null,
6913-
renderValue: (CT_ c, RendererBase<CT_> r,
6914-
List<MustachioNode> ast, StringSink sink) {
6915-
_render_String(c.href!, ast, r.template, sink, parent: r);
6916-
},
6917-
),
6918-
'kind': Property(
6919-
getValue: (CT_ c) => c.kind,
6920-
renderVariable: (CT_ c, Property<CT_> self,
6921-
List<String> remainingNames) =>
6922-
self.renderSimpleVariable(c, remainingNames, 'Kind'),
6923-
isNullValue: (CT_ c) => false,
6924-
renderValue: (CT_ c, RendererBase<CT_> r,
6925-
List<MustachioNode> ast, StringSink sink) {
6926-
renderSimple(c.kind, ast, r.template, sink,
6927-
parent: r, getters: _invisibleGetters['Kind']!);
6928-
},
6929-
),
6930-
'overriddenDepth': Property(
6931-
getValue: (CT_ c) => c.overriddenDepth,
6932-
renderVariable: (CT_ c, Property<CT_> self,
6933-
List<String> remainingNames) =>
6934-
self.renderSimpleVariable(c, remainingNames, 'int'),
6935-
isNullValue: (CT_ c) => c.overriddenDepth == null,
6936-
renderValue: (CT_ c, RendererBase<CT_> r,
6937-
List<MustachioNode> ast, StringSink sink) {
6938-
renderSimple(c.overriddenDepth, ast, r.template, sink,
6939-
parent: r, getters: _invisibleGetters['int']!);
6940-
},
6941-
),
6942-
}) as Map<String, Property<CT_>>;
6943-
6944-
_Renderer_Indexable(Indexable context, RendererBase<Object>? parent,
6945-
Template template, StringSink sink)
6946-
: super(context, parent, template, sink);
6947-
6948-
@override
6949-
Property<Indexable>? getProperty(String key) {
6950-
if (propertyMap<Indexable>().containsKey(key)) {
6951-
return propertyMap<Indexable>()[key];
6952-
} else {
6953-
return null;
6954-
}
6955-
}
6956-
}
6957-
69586890
class _Renderer_Inheritable extends RendererBase<Inheritable> {
69596891
static final Map<Type, Object> _propertyMapCache = {};
69606892
static Map<String, Property<CT_>> propertyMap<CT_ extends Inheritable>() =>
@@ -10072,7 +10004,6 @@ class _Renderer_ModelElement extends RendererBase<ModelElement> {
1007210004
..._Renderer_Locatable.propertyMap<CT_>(),
1007310005
..._Renderer_Nameable.propertyMap<CT_>(),
1007410006
..._Renderer_SourceCode.propertyMap<CT_>(),
10075-
..._Renderer_Indexable.propertyMap<CT_>(),
1007610007
..._Renderer_FeatureSet.propertyMap<CT_>(),
1007710008
..._Renderer_DocumentationComment.propertyMap<CT_>(),
1007810009
'annotations': Property(
@@ -12313,7 +12244,7 @@ class _Renderer_Package extends RendererBase<Package> {
1231312244
}
1231412245
}
1231512246

12316-
String renderIndex(PackageTemplateData context, Template template) {
12247+
String renderSearchPage(PackageTemplateData context, Template template) {
1231712248
var buffer = StringBuffer();
1231812249
_render_PackageTemplateData(context, template.ast, template, buffer);
1231912250
return buffer.toString();
@@ -12551,13 +12482,13 @@ class _Renderer_PackageTemplateData extends RendererBase<PackageTemplateData> {
1255112482
}
1255212483
}
1255312484

12554-
String renderError(PackageTemplateData context, Template template) {
12485+
String renderIndex(PackageTemplateData context, Template template) {
1255512486
var buffer = StringBuffer();
1255612487
_render_PackageTemplateData(context, template.ast, template, buffer);
1255712488
return buffer.toString();
1255812489
}
1255912490

12560-
String renderSearchPage(PackageTemplateData context, Template template) {
12491+
String renderError(PackageTemplateData context, Template template) {
1256112492
var buffer = StringBuffer();
1256212493
_render_PackageTemplateData(context, template.ast, template, buffer);
1256312494
return buffer.toString();

lib/src/model/accessor.dart

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import 'package:analyzer/src/dart/element/member.dart' show ExecutableMember;
1111
import 'package:collection/collection.dart' show IterableExtension;
1212
import 'package:dartdoc/src/element_type.dart';
1313
import 'package:dartdoc/src/model/comment_referable.dart';
14+
import 'package:dartdoc/src/model/kind.dart';
1415
import 'package:dartdoc/src/model/model.dart';
1516
import 'package:dartdoc/src/utils.dart';
1617
import 'package:dartdoc/src/warnings.dart';

lib/src/model/category.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:analyzer/dart/element/element.dart';
66
import 'package:analyzer/file_system/file_system.dart';
77
import 'package:dartdoc/src/dartdoc_options.dart';
88
import 'package:dartdoc/src/model/comment_referable.dart';
9+
import 'package:dartdoc/src/model/kind.dart';
910
import 'package:dartdoc/src/model/model.dart';
1011
import 'package:dartdoc/src/warnings.dart';
1112

@@ -18,8 +19,7 @@ class Category
1819
Locatable,
1920
MarkdownFileDocumentation,
2021
LibraryContainer,
21-
TopLevelContainer,
22-
Indexable
22+
TopLevelContainer
2323
implements Documentable {
2424
/// The package in which this category is contained.
2525
///

lib/src/model/class.dart

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
import 'package:analyzer/dart/element/element.dart';
6+
import 'package:dartdoc/src/model/kind.dart';
67
import 'package:dartdoc/src/model/model.dart';
78

89
/// A [Container] defined with a `class` declaration.

lib/src/model/constructor.dart

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:analyzer/dart/element/element.dart';
66
import 'package:analyzer/source/line_info.dart';
77
import 'package:dartdoc/src/element_type.dart';
88
import 'package:dartdoc/src/model/comment_referable.dart';
9+
import 'package:dartdoc/src/model/kind.dart';
910
import 'package:dartdoc/src/model/model.dart';
1011
import 'package:dartdoc/src/model_utils.dart';
1112

lib/src/model/directives/categorization.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ final RegExp _categoryRegExp =
99
RegExp(r'[ ]*{@(category|subCategory) (.+?)}[ ]*\n?', multiLine: true);
1010

1111
/// Mixin parsing the `@category` directive for ModelElements.
12-
mixin Categorization on DocumentationComment implements Indexable {
12+
mixin Categorization on DocumentationComment {
1313
@override
1414
String buildDocumentationAddition(String rawDocs) =>
1515
_stripAndSetDartdocCategories(super.buildDocumentationAddition(rawDocs));

lib/src/model/documentable.dart

+4-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import 'package:analyzer/file_system/file_system.dart';
66
import 'package:dartdoc/src/dartdoc_options.dart';
77
import 'package:dartdoc/src/io_utils.dart';
8+
import 'package:dartdoc/src/model/kind.dart';
89
import 'package:dartdoc/src/warnings.dart';
910

1011
import 'model.dart';
@@ -29,10 +30,11 @@ abstract class Documentable with Nameable {
2930

3031
DartdocOptionContext get config;
3132

32-
String? get href;
33-
33+
/// A human-friendly name for the kind of element this is.
3434
Kind get kind;
3535

36+
String? get href;
37+
3638
/// The full path of the sidebar for elements "above" this element.
3739
///
3840
/// A `null` value indicates no content is displayed in the "above" sidebar.

lib/src/model/dynamic.dart

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import 'package:analyzer/dart/element/element.dart';
66
import 'package:dartdoc/src/element_type.dart';
77
import 'package:dartdoc/src/model/comment_referable.dart';
8+
import 'package:dartdoc/src/model/kind.dart';
89
import 'package:dartdoc/src/model/model.dart';
910

1011
class Dynamic extends ModelElement with HasNoPage {

lib/src/model/enum.dart

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import 'package:analyzer/dart/analysis/features.dart';
66
import 'package:analyzer/dart/element/element.dart';
7+
import 'package:dartdoc/src/model/kind.dart';
78
import 'package:dartdoc/src/model/model.dart';
89
import 'package:dartdoc/src/model_utils.dart' as model_utils;
910
import 'package:meta/meta.dart';

lib/src/model/extension.dart

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'package:analyzer/dart/element/nullability_suffix.dart';
77
import 'package:analyzer/dart/element/type.dart';
88
import 'package:dartdoc/src/element_type.dart';
99
import 'package:dartdoc/src/model/comment_referable.dart';
10+
import 'package:dartdoc/src/model/kind.dart';
1011
import 'package:dartdoc/src/model/model.dart';
1112
import 'package:dartdoc/src/model_utils.dart';
1213
import 'package:meta/meta.dart';

lib/src/model/extension_type.dart

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import 'package:analyzer/dart/element/element.dart';
66
import 'package:dartdoc/src/element_type.dart';
77
import 'package:dartdoc/src/model/comment_referable.dart';
8+
import 'package:dartdoc/src/model/kind.dart';
89
import 'package:dartdoc/src/model/model.dart';
910
import 'package:meta/meta.dart';
1011

lib/src/model/field.dart

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'dart:convert';
66

77
import 'package:analyzer/dart/element/element.dart';
88
import 'package:dartdoc/src/model/attribute.dart';
9+
import 'package:dartdoc/src/model/kind.dart';
910
import 'package:dartdoc/src/model/model.dart';
1011

1112
class Field extends ModelElement

lib/src/model/inheritable.dart

+4-1
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,10 @@ mixin Inheritable on ContainerMember {
175175
return isOverride;
176176
}();
177177

178-
@override
178+
/// The depth of overrides at which this element lives.
179+
///
180+
/// Just a count of how long the chain of this element's `overriddenElement`.
181+
/// For use in ranking search results.
179182
int get overriddenDepth {
180183
var depth = 0;
181184
var e = this;

lib/src/model/indexable.dart lib/src/model/kind.dart

+1-12
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
1+
// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
import 'package:dartdoc/src/model/model.dart';
6-
75
enum Kind {
86
accessor,
97
constant,
@@ -82,12 +80,3 @@ enum Kind {
8280
_ => throw ArgumentError('Unknown kind "$value"'),
8381
};
8482
}
85-
86-
/// Something able to be indexed.
87-
mixin Indexable implements Nameable {
88-
String? get href;
89-
90-
Kind get kind;
91-
92-
int? get overriddenDepth => 0;
93-
}

lib/src/model/library.dart

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'package:analyzer/dart/element/element.dart';
77
import 'package:analyzer/dart/element/scope.dart';
88
import 'package:analyzer/source/line_info.dart';
99
import 'package:dartdoc/src/model/comment_referable.dart';
10+
import 'package:dartdoc/src/model/kind.dart';
1011
import 'package:dartdoc/src/model/model.dart';
1112
import 'package:dartdoc/src/package_meta.dart' show PackageMeta;
1213
import 'package:dartdoc/src/warnings.dart';

lib/src/model/method.dart

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'package:analyzer/src/dart/element/member.dart' show ExecutableMember;
99
import 'package:dartdoc/src/element_type.dart';
1010
import 'package:dartdoc/src/model/attribute.dart';
1111
import 'package:dartdoc/src/model/comment_referable.dart';
12+
import 'package:dartdoc/src/model/kind.dart';
1213
import 'package:dartdoc/src/model/model.dart';
1314

1415
class Method extends ModelElement

lib/src/model/mixin.dart

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:analyzer/dart/element/element.dart';
66
import 'package:analyzer/dart/element/type.dart';
77
import 'package:dartdoc/src/element_type.dart';
88
import 'package:dartdoc/src/model/comment_referable.dart';
9+
import 'package:dartdoc/src/model/kind.dart';
910
import 'package:dartdoc/src/model/model.dart';
1011
import 'package:dartdoc/src/model_utils.dart' as model_utils;
1112
import 'package:dartdoc/src/special_elements.dart';

lib/src/model/model.dart

-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ export 'extension_type.dart';
2121
export 'field.dart';
2222
export 'getter_setter_combo.dart';
2323
export 'has_no_page.dart';
24-
export 'indexable.dart';
2524
export 'inheritable.dart';
2625
export 'inheriting_container.dart';
2726
export 'library.dart';

0 commit comments

Comments
 (0)