blob: 458aea63cbf8c9253899525a85d92761dbc1f3d5 [file] [log] [blame]
// Copyright (c) 2019, 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/dartdoc.dart';
import 'package:dartdoc/src/render/parameter_renderer.dart';
abstract class ElementTypeRenderer<T extends ElementType> {
String renderLinkedName(T elementType);
String renderNameWithGenerics(T elementType) => '';
}
class FunctionTypeElementTypeRendererHtml
extends ElementTypeRenderer<FunctionTypeElementType> {
@override
String renderLinkedName(FunctionTypeElementType elementType) {
StringBuffer buf = StringBuffer();
buf.write('${elementType.returnType.linkedName} ');
buf.write('${elementType.nameWithGenerics}');
buf.write('<span class="signature">(');
buf.write(
ParameterRendererHtml().renderLinkedParams(elementType.parameters));
buf.write(')</span>');
return buf.toString();
}
@override
String renderNameWithGenerics(FunctionTypeElementType elementType) {
StringBuffer buf = StringBuffer();
buf.write(elementType.name);
if (elementType.typeFormals.isNotEmpty) {
if (!elementType.typeFormals.every((t) => t.name == 'dynamic')) {
buf.write('&lt;<wbr><span class="type-parameter">');
buf.writeAll(elementType.typeFormals.map((t) => t.name),
'</span>, <span class="type-parameter">');
buf.write('</span>&gt;');
}
}
return buf.toString();
}
}
class ParameterizedElementTypeRendererHtml
extends ElementTypeRenderer<ParameterizedElementType> {
@override
String renderLinkedName(ParameterizedElementType elementType) {
StringBuffer buf = StringBuffer();
buf.write(elementType.element.linkedName);
if (elementType.typeArguments.isNotEmpty &&
!elementType.typeArguments.every((t) => t.name == 'dynamic')) {
buf.write('<span class="signature">');
buf.write('&lt;<wbr><span class="type-parameter">');
buf.writeAll(elementType.typeArguments.map((t) => t.linkedName),
'</span>, <span class="type-parameter">');
buf.write('</span>&gt;');
buf.write('</span>');
}
return buf.toString();
}
@override
String renderNameWithGenerics(ParameterizedElementType elementType) {
StringBuffer buf = StringBuffer();
buf.write(elementType.element.name);
if (elementType.typeArguments.isNotEmpty &&
!elementType.typeArguments.every((t) => t.name == 'dynamic')) {
buf.write('&lt;<wbr><span class="type-parameter">');
buf.writeAll(elementType.typeArguments.map((t) => t.nameWithGenerics),
'</span>, <span class="type-parameter">');
buf.write('</span>&gt;');
}
return buf.toString();
}
}
class CallableElementTypeRendererHtml
extends ElementTypeRenderer<CallableElementType> {
@override
String renderLinkedName(CallableElementType elementType) {
if (elementType.name != null && elementType.name.isNotEmpty) {
return elementType.superLinkedName;
}
StringBuffer buf = StringBuffer();
buf.write(elementType.nameWithGenerics);
buf.write('(');
buf.write(ParameterRendererHtml(showNames: false)
.renderLinkedParams(elementType.element.parameters)
.trim());
buf.write(') → ');
buf.write(elementType.returnType.linkedName);
return buf.toString();
}
}
class CallableAnonymousElementTypeRendererHtml
extends ElementTypeRenderer<CallableAnonymousElementType> {
@override
String renderLinkedName(CallableAnonymousElementType elementType) {
StringBuffer buf = StringBuffer();
buf.write(elementType.returnType.linkedName);
buf.write(' ');
buf.write(elementType.superLinkedName);
buf.write('<span class="signature">(');
buf.write(ParameterRendererHtml()
.renderLinkedParams(elementType.element.parameters));
buf.write(')</span>');
return buf.toString();
}
}