Skip to content

Relocate ParameterRenderer alongside CategoryRenderer #2077

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 3 commits into from
Nov 20, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions lib/src/element_type.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/nullability_suffix.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:dartdoc/src/model/model.dart';
import 'package:dartdoc/src/model_utils.dart';
import 'package:dartdoc/src/render/parameter_renderer.dart';

/// Base class representing a type in Dartdoc. It wraps a [DartType], and
/// may link to a [ModelElement].
Expand Down Expand Up @@ -147,7 +147,7 @@ class FunctionTypeElementType extends UndefinedElementType {
buf.write('${returnType.linkedName} ');
buf.write('${nameWithGenerics}');
buf.write('<span class="signature">');
buf.write('(${linkedParams(parameters)})');
buf.write('(${ParameterRendererHtml().renderLinkedParams(parameters)})');
buf.write('</span>');
_linkedName = buf.toString();
}
Expand Down Expand Up @@ -418,7 +418,7 @@ class CallableElementType extends ParameterizedElementType
@override
String get linkedName {
if (name != null && name.isNotEmpty) return super.linkedName;
return '${nameWithGenerics}(${linkedParams(element.parameters, showNames: false).trim()}) → ${returnType.linkedName}';
return '${nameWithGenerics}(${ParameterRendererHtml(showNames: false).renderLinkedParams(element.parameters).trim()}) → ${returnType.linkedName}';
}
}

Expand All @@ -435,7 +435,7 @@ class CallableAnonymousElementType extends CallableElementType {
String get linkedName {
if (_linkedName == null) {
_linkedName =
'${returnType.linkedName} ${super.linkedName}<span class="signature">(${linkedParams(element.parameters)})</span>';
'${returnType.linkedName} ${super.linkedName}<span class="signature">(${ParameterRendererHtml().renderLinkedParams(element.parameters)})</span>';
}
return _linkedName;
}
Expand Down
15 changes: 8 additions & 7 deletions lib/src/model/model_element.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import 'package:dartdoc/src/logging.dart';
import 'package:dartdoc/src/markdown_processor.dart' show Documentation;
import 'package:dartdoc/src/model/model.dart';
import 'package:dartdoc/src/model_utils.dart' as utils;
import 'package:dartdoc/src/render/parameter_renderer.dart';
import 'package:dartdoc/src/source_linker.dart';
import 'package:dartdoc/src/tuple.dart';
import 'package:dartdoc/src/utils.dart';
Expand Down Expand Up @@ -928,18 +929,18 @@ abstract class ModelElement extends Canonicalization
return _linkedName;
}

String get linkedParams => utils.linkedParams(parameters);
String get linkedParams =>
ParameterRendererHtml().renderLinkedParams(parameters);

String get linkedParamsLines =>
utils.linkedParams(parameters, asList: true).trim();
ParameterRendererHtmlList().renderLinkedParams(parameters).trim();

String get linkedParamsNoMetadata =>
utils.linkedParams(parameters, showMetadata: false);
ParameterRendererHtml(showMetadata: false).renderLinkedParams(parameters);

String get linkedParamsNoMetadataOrNames {
return utils.linkedParams(parameters,
showMetadata: false, showNames: false);
}
String get linkedParamsNoMetadataOrNames =>
ParameterRendererHtml(showMetadata: false, showNames: false)
.renderLinkedParams(parameters);

ElementType get modelType {
if (_modelType == null) {
Expand Down
182 changes: 0 additions & 182 deletions lib/src/model_utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,193 +9,11 @@ import 'dart:io';

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

final Map<String, String> _fileContents = <String, String>{};

/// Render HTML in an extended vertical format using <ol> tag.
class ParameterRendererHtmlList extends ParameterRendererHtml {
ParameterRendererHtmlList({bool showMetadata = true, bool showNames = true})
: super(showMetadata: showMetadata, showNames: showNames);
@override
String listItem(String listItem) => '<li>$listItem</li>\n';
@override
// TODO(jcollins-g): consider comma separated lists and more advanced css.
String orderedList(String listItems) =>
'<ol class="parameter-list">$listItems</ol>\n';
}

/// Render HTML suitable for a single, wrapped line.
class ParameterRendererHtml extends ParameterRenderer {
@override
final bool showMetadata;
@override
final bool showNames;
ParameterRendererHtml({this.showMetadata = true, this.showNames = true});

@override
String listItem(String listItem) => '${listItem}<wbr>';
@override
String orderedList(String listItems) => listItems;
@override
String annotation(String annotation) => '<span>$annotation</span>';
@override
String covariant(String covariant) => '<span>$covariant</span>';
@override
String defaultValue(String defaultValue) =>
'<span class="default-value">$defaultValue</span>';
@override
String parameter(String parameter, String htmlId) =>
'<span class="parameter" id="${htmlId}">$parameter</span>';
@override
String parameterName(String parameterName) =>
'<span class="parameter-name">$parameterName</span>';
@override
String typeName(String typeName) =>
'<span class="type-annotation">$typeName</span>';
@override
String required(String required) => '<span>$required</span>';
}

abstract class ParameterRenderer {
bool get showMetadata;
bool get showNames;

String listItem(String item);
String orderedList(String listItems);
String annotation(String annotation);
String covariant(String covariant);
String defaultValue(String defaultValue);
String parameter(String parameter, String id);
String parameterName(String parameterName);
String typeName(String typeName);
String required(String required);

String _linkedParameterSublist(List<Parameter> parameters, bool trailingComma,
{String thisOpenBracket = '', String thisCloseBracket = ''}) {
StringBuffer builder = StringBuffer();
parameters.forEach((p) {
String prefix = '';
String suffix = '';
if (identical(p, parameters.first)) {
prefix = thisOpenBracket;
}
if (identical(p, parameters.last)) {
suffix += thisCloseBracket;
if (trailingComma) suffix += ', ';
} else {
suffix += ', ';
}
builder.write(
listItem(parameter(prefix + renderParam(p) + suffix, p.htmlId)));
});
return builder.toString();
}

String linkedParams(List<Parameter> parameters) {
List<Parameter> positionalParams =
parameters.where((Parameter p) => p.isRequiredPositional).toList();
List<Parameter> optionalPositionalParams =
parameters.where((Parameter p) => p.isOptionalPositional).toList();
List<Parameter> namedParams =
parameters.where((Parameter p) => p.isNamed).toList();

String positional = '', optional = '', named = '';
if (positionalParams.isNotEmpty) {
positional = _linkedParameterSublist(positionalParams,
optionalPositionalParams.isNotEmpty || namedParams.isNotEmpty);
}
if (optionalPositionalParams.isNotEmpty) {
optional = _linkedParameterSublist(
optionalPositionalParams, namedParams.isNotEmpty,
thisOpenBracket: '[', thisCloseBracket: ']');
}
if (namedParams.isNotEmpty) {
named = _linkedParameterSublist(namedParams, false,
thisOpenBracket: '{', thisCloseBracket: '}');
}
return (orderedList(positional + optional + named));
}

String renderParam(Parameter param) {
StringBuffer buf = StringBuffer();
ElementType paramModelType = param.modelType;

if (showMetadata && param.hasAnnotations) {
buf.write(param.annotations.map(annotation).join(' ') + ' ');
}
if (param.isRequiredNamed) {
buf.write(required('required') + ' ');
}
if (param.isCovariant) {
buf.write(covariant('covariant') + ' ');
}
if (paramModelType is CallableElementTypeMixin ||
paramModelType.type is FunctionType) {
String returnTypeName;
if (paramModelType.isTypedef) {
returnTypeName = paramModelType.linkedName;
} else {
returnTypeName = paramModelType.createLinkedReturnTypeName();
}
buf.write(typeName(returnTypeName));
if (showNames) {
buf.write(' ${parameterName(param.name)}');
} else if (paramModelType.isTypedef ||
paramModelType is CallableAnonymousElementType ||
paramModelType.type is FunctionType) {
buf.write(' ${parameterName(paramModelType.name)}');
}
if (!paramModelType.isTypedef && paramModelType is DefinedElementType) {
buf.write('(');
buf.write(linkedParams(paramModelType.element.parameters));
buf.write(')');
}
if (!paramModelType.isTypedef && paramModelType.type is FunctionType) {
buf.write('(');
buf.write(
linkedParams((paramModelType as UndefinedElementType).parameters));
buf.write(')');
}
} else if (param.modelType != null) {
String linkedTypeName = paramModelType.linkedName;
if (linkedTypeName.isNotEmpty) {
buf.write(typeName(linkedTypeName));
if (showNames && param.name.isNotEmpty) {
buf.write(' ');
}
}
if (showNames && param.name.isNotEmpty) {
buf.write(parameterName(param.name));
}
}

if (param.hasDefaultValue) {
if (param.isNamed) {
buf.write(': ');
} else {
buf.write(' = ');
}
buf.write(defaultValue(param.defaultValue));
}
return buf.toString();
}
}

String linkedParams(List<Parameter> parameters,
{showMetadata = true, showNames = true, asList = false}) {
if (asList) {
return ParameterRendererHtmlList(
showMetadata: showMetadata, showNames: showNames)
.linkedParams(parameters);
}
return ParameterRendererHtml(showMetadata: showMetadata, showNames: showNames)
.linkedParams(parameters);
}

/// Returns the [AstNode] for a given [Element].
///
/// Uses a precomputed map of [element.source.fullName] to [CompilationUnit]
Expand Down
Loading