Skip to content

Commit 4f1ab2b

Browse files
authored
Deduplicate some code with HasNoPage (dart-lang#3092)
1 parent 196f8f7 commit 4f1ab2b

File tree

8 files changed

+78
-87
lines changed

8 files changed

+78
-87
lines changed

lib/src/generator/templates.runtime_renderers.dart

Lines changed: 46 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -6464,6 +6464,50 @@ class _Renderer_GetterSetterCombo extends RendererBase<GetterSetterCombo> {
64646464
}
64656465
}
64666466

6467+
class _Renderer_HasNoPage extends RendererBase<HasNoPage> {
6468+
static final Map<Type, Object> _propertyMapCache = {};
6469+
static Map<String, Property<CT_>> propertyMap<CT_ extends HasNoPage>() =>
6470+
_propertyMapCache.putIfAbsent(
6471+
CT_,
6472+
() => {
6473+
'filePath': Property(
6474+
getValue: (CT_ c) => c.filePath,
6475+
renderVariable:
6476+
(CT_ c, Property<CT_> self, List<String> remainingNames) {
6477+
if (remainingNames.isEmpty) {
6478+
return self.getValue(c).toString();
6479+
}
6480+
var name = remainingNames.first;
6481+
var nextProperty =
6482+
_Renderer_String.propertyMap().getValue(name);
6483+
return nextProperty.renderVariable(
6484+
self.getValue(c) as String,
6485+
nextProperty,
6486+
[...remainingNames.skip(1)]);
6487+
},
6488+
isNullValue: (CT_ c) => false,
6489+
renderValue: (CT_ c, RendererBase<CT_> r,
6490+
List<MustachioNode> ast, StringSink sink) {
6491+
_render_String(c.filePath, ast, r.template, sink,
6492+
parent: r);
6493+
},
6494+
),
6495+
}) as Map<String, Property<CT_>>;
6496+
6497+
_Renderer_HasNoPage(HasNoPage context, RendererBase<Object>? parent,
6498+
Template template, StringSink sink)
6499+
: super(context, parent, template, sink);
6500+
6501+
@override
6502+
Property<HasNoPage>? getProperty(String key) {
6503+
if (propertyMap<HasNoPage>().containsKey(key)) {
6504+
return propertyMap<HasNoPage>()[key];
6505+
} else {
6506+
return null;
6507+
}
6508+
}
6509+
}
6510+
64676511
class _Renderer_Indexable extends RendererBase<Indexable> {
64686512
static final Map<Type, Object> _propertyMapCache = {};
64696513
static Map<String, Property<CT_>> propertyMap<CT_ extends Indexable>() =>
@@ -12197,6 +12241,7 @@ class _Renderer_Parameter extends RendererBase<Parameter> {
1219712241
CT_,
1219812242
() => {
1219912243
..._Renderer_ModelElement.propertyMap<CT_>(),
12244+
..._Renderer_HasNoPage.propertyMap<CT_>(),
1220012245
'defaultValue': Property(
1220112246
getValue: (CT_ c) => c.defaultValue,
1220212247
renderVariable:
@@ -12256,28 +12301,6 @@ class _Renderer_Parameter extends RendererBase<Parameter> {
1225612301
parent: r);
1225712302
},
1225812303
),
12259-
'filePath': Property(
12260-
getValue: (CT_ c) => c.filePath,
12261-
renderVariable:
12262-
(CT_ c, Property<CT_> self, List<String> remainingNames) {
12263-
if (remainingNames.isEmpty) {
12264-
return self.getValue(c).toString();
12265-
}
12266-
var name = remainingNames.first;
12267-
var nextProperty =
12268-
_Renderer_String.propertyMap().getValue(name);
12269-
return nextProperty.renderVariable(
12270-
self.getValue(c) as String,
12271-
nextProperty,
12272-
[...remainingNames.skip(1)]);
12273-
},
12274-
isNullValue: (CT_ c) => false,
12275-
renderValue: (CT_ c, RendererBase<CT_> r,
12276-
List<MustachioNode> ast, StringSink sink) {
12277-
_render_String(c.filePath, ast, r.template, sink,
12278-
parent: r);
12279-
},
12280-
),
1228112304
'hasDefaultValue': Property(
1228212305
getValue: (CT_ c) => c.hasDefaultValue,
1228312306
renderVariable: (CT_ c, Property<CT_> self,
@@ -14703,6 +14726,7 @@ class _Renderer_TypeParameter extends RendererBase<TypeParameter> {
1470314726
CT_,
1470414727
() => {
1470514728
..._Renderer_ModelElement.propertyMap<CT_>(),
14729+
..._Renderer_HasNoPage.propertyMap<CT_>(),
1470614730
'boundType': Property(
1470714731
getValue: (CT_ c) => c.boundType,
1470814732
renderVariable:
@@ -14762,28 +14786,6 @@ class _Renderer_TypeParameter extends RendererBase<TypeParameter> {
1476214786
parent: r);
1476314787
},
1476414788
),
14765-
'filePath': Property(
14766-
getValue: (CT_ c) => c.filePath,
14767-
renderVariable:
14768-
(CT_ c, Property<CT_> self, List<String> remainingNames) {
14769-
if (remainingNames.isEmpty) {
14770-
return self.getValue(c).toString();
14771-
}
14772-
var name = remainingNames.first;
14773-
var nextProperty =
14774-
_Renderer_String.propertyMap().getValue(name);
14775-
return nextProperty.renderVariable(
14776-
self.getValue(c) as String,
14777-
nextProperty,
14778-
[...remainingNames.skip(1)]);
14779-
},
14780-
isNullValue: (CT_ c) => false,
14781-
renderValue: (CT_ c, RendererBase<CT_> r,
14782-
List<MustachioNode> ast, StringSink sink) {
14783-
_render_String(c.filePath, ast, r.template, sink,
14784-
parent: r);
14785-
},
14786-
),
1478714789
'hasParameters': Property(
1478814790
getValue: (CT_ c) => c.hasParameters,
1478914791
renderVariable: (CT_ c, Property<CT_> self,

lib/src/model/dynamic.dart

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,22 @@ import 'package:dartdoc/src/element_type.dart';
77
import 'package:dartdoc/src/model/comment_referable.dart';
88
import 'package:dartdoc/src/model/model.dart';
99

10-
class Dynamic extends ModelElement {
10+
class Dynamic extends ModelElement with HasNoPage {
1111
Dynamic(Element element, PackageGraph packageGraph)
1212
: super(element, Library.sentinel, packageGraph);
1313

1414
UndefinedElementType get modelType =>
1515
throw UnimplementedError('(${element.runtimeType}) $element');
1616

17-
/// [dynamic] is not a real object, and so we can't document it, so there
17+
/// `dynamic` is not a real object, and so we can't document it, so there
1818
/// can be nothing canonical for it.
1919
@override
2020
ModelElement? get canonicalModelElement => null;
2121

2222
@override
2323
ModelElement? get enclosingElement => null;
2424

25-
/// And similarly, even if someone references it directly it can have
26-
/// no hyperlink.
25+
/// `dynamic` has no hyperlink.
2726
@override
2827
String? get href => null;
2928

@@ -33,9 +32,6 @@ class Dynamic extends ModelElement {
3332
@override
3433
String get linkedName => 'dynamic';
3534

36-
@override
37-
String? get filePath => null;
38-
3935
@override
4036
Map<String, CommentReferable> get referenceChildren => {};
4137

lib/src/model/has_no_page.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'package:dartdoc/src/model/model.dart';
6+
7+
/// An element which has no page documenting itself.
8+
mixin HasNoPage on ModelElement {
9+
@override
10+
String get filePath =>
11+
throw UnimplementedError('This element has no generated page');
12+
13+
// TODO(srawlins): Add sidebar information here, when sidebars become dynamic.
14+
}

lib/src/model/model.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export 'extendable.dart';
2020
export 'extension.dart';
2121
export 'field.dart';
2222
export 'getter_setter_combo.dart';
23+
export 'has_no_page.dart';
2324
export 'indexable.dart';
2425
export 'inheritable.dart';
2526
export 'inheriting_container.dart';

lib/src/model/never.dart

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import 'package:analyzer/dart/element/element.dart';
66
import 'package:dartdoc/src/model/comment_referable.dart';
77
import 'package:dartdoc/src/model/model.dart';
88

9-
class NeverType extends ModelElement {
9+
class NeverType extends ModelElement with HasNoPage {
1010
NeverType(Element element, PackageGraph packageGraph)
1111
: super(element, Library.sentinel, packageGraph);
1212

@@ -16,10 +16,9 @@ class NeverType extends ModelElement {
1616
ModelElement? get canonicalModelElement => null;
1717

1818
@override
19-
ModelElement get enclosingElement => throw UnsupportedError('');
19+
ModelElement? get enclosingElement => null;
2020

21-
/// And similarly, even if someone references it directly it can have
22-
/// no hyperlink.
21+
/// The `Never` type has no hyperlink.
2322
@override
2423
String? get href => null;
2524

@@ -29,9 +28,6 @@ class NeverType extends ModelElement {
2928
@override
3029
String get linkedName => 'Never';
3130

32-
@override
33-
String? get filePath => null;
34-
3531
@override
3632
Map<String, CommentReferable> get referenceChildren => {};
3733

lib/src/model/parameter.dart

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import 'package:dartdoc/src/element_type.dart';
99
import 'package:dartdoc/src/model/comment_referable.dart';
1010
import 'package:dartdoc/src/model/model.dart';
1111

12-
class Parameter extends ModelElement /*implements EnclosedElement*/ {
12+
class Parameter extends ModelElement with HasNoPage {
1313
Parameter(
1414
ParameterElement element, Library library, PackageGraph packageGraph,
1515
{ParameterMember? originalMember})
@@ -32,11 +32,6 @@ class Parameter extends ModelElement /*implements EnclosedElement*/ {
3232
element!.defaultValueCode!.isNotEmpty;
3333
}
3434

35-
@override
36-
String get filePath {
37-
throw UnimplementedError('Parameters have no generated files in dartdoc');
38-
}
39-
4035
@override
4136
String? get href => null;
4237

@@ -45,8 +40,8 @@ class Parameter extends ModelElement /*implements EnclosedElement*/ {
4540
if (element!.enclosingElement != null) {
4641
var enclosingName = element!.enclosingElement!.name;
4742
if (element!.enclosingElement is GenericFunctionTypeElement) {
48-
// TODO(jcollins-g): Drop when GenericFunctionTypeElement populates name.
49-
// Also, allowing null here is allowed as a workaround for
43+
// TODO(jcollins-g): Drop when GenericFunctionTypeElement populates
44+
// name. Also, allowing null here is allowed as a workaround for
5045
// dart-lang/sdk#32005.
5146
for (var e = element!.enclosingElement!;
5247
e.enclosingElement != null;

lib/src/model/prefix.dart

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import '../../dartdoc.dart';
1212
///
1313
/// Like [Parameter], it doesn't have doc pages, but participates in lookups.
1414
/// Forwards to its referenced library if referred to directly.
15-
class Prefix extends ModelElement implements EnclosedElement {
15+
class Prefix extends ModelElement with HasNoPage implements EnclosedElement {
1616
/// [library] is the library the prefix is defined in, not the [Library]
1717
/// referred to by the [PrefixElement].
1818
Prefix(PrefixElement super.element, super.library, super.packageGraph);
@@ -40,10 +40,6 @@ class Prefix extends ModelElement implements EnclosedElement {
4040
@override
4141
ModelElement get enclosingElement => library;
4242

43-
@override
44-
String get filePath =>
45-
throw UnimplementedError('prefixes have no generated files in dartdoc');
46-
4743
@override
4844
String? get href => canonicalModelElement?.href;
4945

lib/src/model/type_parameter.dart

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,36 +8,27 @@ import 'package:dartdoc/src/model/comment_referable.dart';
88
import 'package:dartdoc/src/model/model.dart';
99
import 'package:dartdoc/src/render/type_parameters_renderer.dart';
1010

11-
class TypeParameter extends ModelElement {
11+
class TypeParameter extends ModelElement with HasNoPage {
1212
TypeParameter(
1313
TypeParameterElement super.element, super.library, super.packageGraph);
1414

1515
@override
1616
ModelElement get enclosingElement =>
1717
modelBuilder.from(element!.enclosingElement!, library);
1818

19+
/// [TypeParameter]s don't have documentation pages, and don't link to the
20+
/// element on which they are declared.
21+
// TODO(srawlins): But shouldn't they link to the element on which they are
22+
// declared?
1923
@override
20-
String get filePath =>
21-
'${enclosingElement.library.dirName}/${enclosingElement.name}/$name';
22-
23-
@override
24-
25-
/// [TypeParameter]s don't have documentation pages.
2624
String? get href => null;
2725

2826
@override
2927
String get kind => 'type parameter';
3028

31-
ElementType? _boundType;
32-
3329
ElementType? get boundType {
34-
if (_boundType == null) {
35-
var bound = element!.bound;
36-
if (bound != null) {
37-
_boundType = modelBuilder.typeFrom(bound, library);
38-
}
39-
}
40-
return _boundType;
30+
var bound = element!.bound;
31+
return bound == null ? null : modelBuilder.typeFrom(bound, library);
4132
}
4233

4334
@override

0 commit comments

Comments
 (0)