Skip to content

Make modelType/ElementType usage more consistent #2573

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Mar 15, 2021
44 changes: 20 additions & 24 deletions lib/src/element_type.dart
Original file line number Diff line number Diff line change
Expand Up @@ -62,10 +62,6 @@ abstract class ElementType extends Privacy {

bool get canHaveParameters => false;

// TODO(jcollins-g): change clients of ElementType to use subtypes more consistently
// and eliminate createLinkedReturnTypeName (instead, using returnType.linkedName);
String createLinkedReturnTypeName() => linkedName;

bool get isTypedef => false;

String get linkedName;
Expand All @@ -90,7 +86,7 @@ abstract class ElementType extends Privacy {
}

/// An unmodifiable list of this element type's parameters.
List<Parameter> get parameters => const <Parameter>[];
List<Parameter> get parameters;

DartType get instantiatedType;

Expand Down Expand Up @@ -149,22 +145,25 @@ class UndefinedElementType extends ElementType {

@override
String get linkedName => name;

@override
// TODO(jcollins-g): remove the need for an empty list here.
List<Parameter> get parameters => [];
}

/// A FunctionType that does not have an underpinning Element.
class FunctionTypeElementType extends UndefinedElementType {
class FunctionTypeElementType extends UndefinedElementType
with CallableElementTypeMixin {
FunctionTypeElementType(DartType f, Library library,
PackageGraph packageGraph, ElementType returnedFrom)
: super(f, library, packageGraph, returnedFrom);

@override
FunctionType get type => super.type;

@override
List<Parameter> get parameters => type.parameters
.map((p) => ModelElement.from(p, library, packageGraph) as Parameter)
.toList(growable: false);

@override
ElementType get returnType =>
ElementType.from(type.returnType, library, packageGraph, this);

Expand All @@ -174,11 +173,7 @@ class FunctionTypeElementType extends UndefinedElementType {
return _linkedName;
}

@override
String createLinkedReturnTypeName() => returnType.linkedName;

String _nameWithGenerics;

@override
String get nameWithGenerics {
_nameWithGenerics ??= _renderer.renderNameWithGenerics(this);
Expand Down Expand Up @@ -216,7 +211,7 @@ class ParameterizedElementType extends DefinedElementType {
return _nameWithGenerics;
}

ElementTypeRenderer<ParameterizedElementType> get _renderer =>
ElementTypeRenderer<ElementType> get _renderer =>
packageGraph.rendererFactory.parameterizedElementTypeRenderer;
}

Expand Down Expand Up @@ -281,9 +276,6 @@ abstract class DefinedElementType extends ElementType {
return _returnType;
}

@override
String createLinkedReturnTypeName() => returnType.linkedName;

Iterable<ElementType> _typeArguments;

/// An unmodifiable list of this element type's parameters.
Expand Down Expand Up @@ -341,13 +333,14 @@ abstract class DefinedElementType extends ElementType {
}

/// Any callable ElementType will mix-in this class, whether anonymous or not.
abstract class CallableElementTypeMixin implements ParameterizedElementType {
@override
abstract class CallableElementTypeMixin implements ElementType {
Iterable<ElementType> _typeArguments;

ModelElement get returnElement => returnType is DefinedElementType
? (returnType as DefinedElementType).element
: null;

@override
ElementType _returnType;
ElementType get returnType {
_returnType ??=
ElementType.from(type.returnType, library, packageGraph, this);
Expand All @@ -357,7 +350,6 @@ abstract class CallableElementTypeMixin implements ParameterizedElementType {
@override
FunctionType get type => _type;

@override
// TODO(jcollins-g): Rewrite this and improve object model so this doesn't
// require type checking everywhere.
Iterable<ElementType> get typeArguments {
Expand Down Expand Up @@ -414,12 +406,16 @@ class CallableElementType extends ParameterizedElementType

@override
String get linkedName {
_linkedName ??= _renderer.renderLinkedName(this);
if (_linkedName == null) {
if (name != null && name.isNotEmpty) {
_linkedName = super.linkedName;
} else {
_linkedName = _renderer.renderLinkedName(this);
}
}
return _linkedName;
}

String get superLinkedName => super.linkedName;

@override
ElementTypeRenderer<CallableElementType> get _renderer =>
packageGraph.rendererFactory.callableElementTypeRenderer;
Expand Down
7 changes: 3 additions & 4 deletions lib/src/model/accessor.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/src/dart/element/member.dart' show Member;
import 'package:dartdoc/src/element_type.dart';
import 'package:dartdoc/src/model/model.dart';
import 'package:dartdoc/src/render/source_code_renderer.dart';
import 'package:dartdoc/src/utils.dart';
Expand All @@ -18,10 +19,8 @@ class Accessor extends ModelElement implements EnclosedElement {
[Member /*?*/ originalMember])
: super(element, library, packageGraph, originalMember);

String get linkedReturnType {
assert(isGetter);
return modelType.createLinkedReturnTypeName();
}
@override
CallableElementTypeMixin get modelType => super.modelType;

bool get isSynthetic => element.isSynthetic;

Expand Down
4 changes: 0 additions & 4 deletions lib/src/model/field.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/src/dart/element/element.dart';
import 'package:dartdoc/src/element_type.dart';
import 'package:dartdoc/src/model/model.dart';
import 'package:dartdoc/src/render/source_code_renderer.dart';

Expand Down Expand Up @@ -199,9 +198,6 @@ class Field extends ModelElement
}
}

@override
CallableElementType get modelType => super.modelType;

@override
Inheritable get overriddenElement => null;
}
13 changes: 5 additions & 8 deletions lib/src/model/getter_setter_combo.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/source/line_info.dart';
import 'package:analyzer/src/dart/element/element.dart';
import 'package:dartdoc/src/element_type.dart';
import 'package:dartdoc/src/model/model.dart';
import 'package:dartdoc/src/utils.dart';
import 'package:dartdoc/src/warnings.dart';
Expand Down Expand Up @@ -179,14 +180,10 @@ mixin GetterSetterCombo on ModelElement {
return buffer.toString();
}

String get linkedReturnType {
if (hasGetter) {
return getter.linkedReturnType;
} else {
// TODO(jcollins-g): this results in the wrong span class for the return
// type.
return setter.linkedParamsNoMetadataOrNames;
}
@override
ElementType get modelType {
if (hasGetter) return getter.modelType.returnType;
return setter.parameters.first.modelType;
}

@override
Expand Down
4 changes: 3 additions & 1 deletion lib/src/model/method.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/source/line_info.dart';
import 'package:analyzer/src/dart/element/member.dart' show Member;
import 'package:dartdoc/src/element_type.dart';
import 'package:dartdoc/src/model/model.dart';

class Method extends ModelElement
Expand Down Expand Up @@ -92,7 +93,8 @@ class Method extends ModelElement
@override
String get kind => 'method';

String get linkedReturnType => modelType.createLinkedReturnTypeName();
@override
CallableElementTypeMixin get modelType => super.modelType;

@override
Method get overriddenElement {
Expand Down
2 changes: 0 additions & 2 deletions lib/src/model/model_function.dart
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,6 @@ class ModelFunctionTyped extends ModelElement
@override
String get kind => 'function';

String get linkedReturnType => modelType.createLinkedReturnTypeName();

// Food for mustache. TODO(jcollins-g): what about enclosing elements?
bool get isInherited => false;

Expand Down
4 changes: 0 additions & 4 deletions lib/src/model/top_level_variable.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
// BSD-style license that can be found in the LICENSE file.

import 'package:analyzer/dart/element/element.dart';
import 'package:dartdoc/src/element_type.dart';
import 'package:dartdoc/src/model/model.dart';

/// Top-level variables. But also picks up getters and setters?
Expand Down Expand Up @@ -86,8 +85,5 @@ class TopLevelVariable extends ModelElement
@override
String get fileName => '${isConst ? '$name-constant' : name}.$fileType';

@override
DefinedElementType get modelType => super.modelType;

TopLevelVariableElement get _variable => (element as TopLevelVariableElement);
}
6 changes: 4 additions & 2 deletions lib/src/model/typedef.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

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/model.dart';
import 'package:dartdoc/src/render/typedef_renderer.dart';

Expand Down Expand Up @@ -49,8 +50,6 @@ class Typedef extends ModelElement
@override
String get kind => 'typedef';

String get linkedReturnType => modelType.createLinkedReturnTypeName();

@override
List<TypeParameter> get typeParameters => element.typeParameters.map((f) {
return ModelElement.from(f, library, packageGraph) as TypeParameter;
Expand Down Expand Up @@ -79,4 +78,7 @@ class FunctionTypedef extends Typedef {
}
return super.genericTypeParameters;
}

@override
CallableElementTypeMixin get modelType => super.modelType;
}
10 changes: 1 addition & 9 deletions lib/src/render/element_type_renderer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -87,10 +87,6 @@ class CallableElementTypeRendererHtml
extends ElementTypeRenderer<CallableElementType> {
@override
String renderLinkedName(CallableElementType elementType) {
if (elementType.name != null && elementType.name.isNotEmpty) {
return elementType.superLinkedName;
}

var buf = StringBuffer();
buf.write(elementType.nameWithGenerics);
buf.write('(');
Expand Down Expand Up @@ -168,15 +164,11 @@ class CallableElementTypeRendererMd
extends ElementTypeRenderer<CallableElementType> {
@override
String renderLinkedName(CallableElementType elementType) {
if (elementType.name != null && elementType.name.isNotEmpty) {
return elementType.superLinkedName;
}

var buf = StringBuffer();
buf.write(elementType.nameWithGenerics);
buf.write('(');
buf.write(ParameterRendererMd()
.renderLinkedParams(elementType.element.parameters, showNames: false)
.renderLinkedParams(elementType.parameters, showNames: false)
.trim());
buf.write(') → ');
buf.write(elementType.returnType.linkedName);
Expand Down
11 changes: 6 additions & 5 deletions lib/src/render/parameter_renderer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -165,13 +165,12 @@ abstract class ParameterRenderer {
if (param.isCovariant) {
buf.write(covariant('covariant') + ' ');
}
if (paramModelType is CallableElementTypeMixin ||
paramModelType.type is FunctionType) {
if (paramModelType is CallableElementTypeMixin) {
String returnTypeName;
if (paramModelType.isTypedef) {
returnTypeName = paramModelType.linkedName;
} else {
returnTypeName = paramModelType.createLinkedReturnTypeName();
returnTypeName = paramModelType.returnType.linkedName;
}
buf.write(typeName(returnTypeName));
if (showNames) {
Expand All @@ -182,8 +181,10 @@ abstract class ParameterRenderer {
}
if (!paramModelType.isTypedef && paramModelType is DefinedElementType) {
buf.write('(');
buf.write(renderLinkedParams(paramModelType.element.parameters,
showMetadata: showMetadata, showNames: showNames));
buf.write(renderLinkedParams(
(paramModelType as DefinedElementType).element.parameters,
showMetadata: showMetadata,
showNames: showNames));
buf.write(')');
buf.write(paramModelType.nullabilitySuffix);
}
Expand Down
2 changes: 1 addition & 1 deletion lib/templates/html/_accessor_getter.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<section id="getter">

<section class="multi-line-signature">
<span class="returntype">{{{ linkedReturnType }}}</span>
<span class="returntype">{{{ modelType.returnType.linkedName }}}</span>
{{>name_summary}}
{{>features}}
</section>
Expand Down
2 changes: 1 addition & 1 deletion lib/templates/html/_callable.html
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<dt id="{{htmlId}}" class="callable{{ #isInherited }} inherited{{ /isInherited}}">
<span class="name{{#isDeprecated}} deprecated{{/isDeprecated}}">{{{linkedName}}}</span>{{{linkedGenericParameters}}}<span class="signature">(<wbr>{{{ linkedParamsNoMetadata }}})
<span class="returntype parameter">&#8594; {{{ linkedReturnType }}}</span>
<span class="returntype parameter">&#8594; {{{ modelType.returnType.linkedName }}}</span>
</span>
{{>categorization}}
</dt>
Expand Down
2 changes: 1 addition & 1 deletion lib/templates/html/_callable_multiline.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@
</div>
{{/hasAnnotations}}

<span class="returntype">{{{ linkedReturnType }}}</span>
<span class="returntype">{{{ modelType.returnType.linkedName }}}</span>
{{>name_summary}}{{{genericParameters}}}(<wbr>{{#hasParameters}}{{{linkedParamsLines}}}{{/hasParameters}})
2 changes: 1 addition & 1 deletion lib/templates/html/_constant.html
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<dt id="{{htmlId}}" class="constant">
<span class="name {{#isDeprecated}}deprecated{{/isDeprecated}}">{{{ linkedName }}}</span>
<span class="signature">&#8594; const {{{ linkedReturnType }}}</span>
<span class="signature">&#8594; const {{{ modelType.linkedName }}}</span>
{{>categorization}}
</dt>
<dd>
Expand Down
2 changes: 1 addition & 1 deletion lib/templates/html/_property.html
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<dt id="{{htmlId}}" class="property{{ #isInherited }} inherited{{ /isInherited}}">
<span class="name">{{{linkedName}}}</span>
<span class="signature">{{{ arrow }}} {{{ linkedReturnType }}}</span> {{>categorization}}
<span class="signature">{{{ arrow }}} {{{ modelType.linkedName }}}</span> {{>categorization}}
</dt>
<dd{{ #isInherited }} class="inherited"{{ /isInherited}}>
{{{ oneLineDoc }}} {{{ extendedDocLink }}}
Expand Down
3 changes: 1 addition & 2 deletions lib/templates/html/_type.html
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
<dt id="{{htmlId}}" class="{{ #isInherited }} inherited{{ /isInherited}}">
<span class="name{{#isDeprecated}} deprecated{{/isDeprecated}}">{{{linkedName}}}</span>{{{linkedGenericParameters}}}
=
<span class="returntype parameter">{{{ linkedReturnType }}}</span>
= {{{ modelType.linkedName }}}
</span>
{{>categorization}}
</dt>
Expand Down
2 changes: 1 addition & 1 deletion lib/templates/html/_type_multiline.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@
</ol>
</div>
{{/hasAnnotations}}
{{>name_summary}}{{{genericParameters}}} = <span class="returntype"> {{{linkedReturnType}}}</span>
{{>name_summary}}{{{genericParameters}}} = {{{modelType.linkedName}}}</span>
2 changes: 1 addition & 1 deletion lib/templates/html/property.html
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ <h5>{{parent.name}} {{parent.kind}}</h5>
{{#self}}
{{#hasNoGetterSetter}}
<section class="multi-line-signature">
<span class="returntype">{{{ linkedReturnType }}}</span>
{{{ modelType.linkedName }}}
{{>name_summary}}
{{>features}}
</section>
Expand Down
2 changes: 1 addition & 1 deletion lib/templates/html/top_level_property.html
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ <h5>{{parent.name}} {{parent.kind}}</h5>

{{#hasNoGetterSetter}}
<section class="multi-line-signature">
<span class="returntype">{{{ linkedReturnType }}}</span>
{{{ modelType.linkedName }}}
{{>name_summary}}
{{>features}}
</section>
Expand Down
2 changes: 1 addition & 1 deletion lib/templates/md/_accessor_getter.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{{#getter}}
{{{ linkedReturnType }}} {{>name_summary}} {{!two spaces intentional}}
{{{ modelType.returnType.linkedName }}} {{>name_summary}} {{!two spaces intentional}}
{{>features}}

{{>documentation}}
Expand Down
Loading