Skip to content

Commit

Permalink
Merge 0b2f932 into 7022b7f
Browse files Browse the repository at this point in the history
  • Loading branch information
jcollins-g committed Mar 18, 2021
2 parents 7022b7f + 0b2f932 commit 23af052
Show file tree
Hide file tree
Showing 5 changed files with 131 additions and 18 deletions.
35 changes: 32 additions & 3 deletions lib/src/element_type.dart
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,16 @@ abstract class ElementType extends Privacy {
return UndefinedElementType(f, library, packageGraph, returnedFrom);
} else {
var element = ModelElement.fromElement(f.element, packageGraph);
// [TypeAliasElement.aliasElement] has different implications.
// In that case it is an actual type alias of some kind (generic
// or otherwise. Here however aliasElement signals that this is a
// type referring to an alias.
if (f is! TypeAliasElement && f.aliasElement != null) {
return AliasedElementType(
f, library, packageGraph, element, returnedFrom);
}
assert(f is ParameterizedType || f is TypeParameterType);
// TODO(jcollins-g): after analyzer 1.2.0 implement InterfaceType
// alias references and strip out all the cruft that's accumulated
// TODO(jcollins-g): strip out all the cruft that's accumulated
// here for non-generic type aliases.
var isGenericTypeAlias = f.aliasElement != null && f is! InterfaceType;
if (f is FunctionType) {
Expand Down Expand Up @@ -211,10 +218,32 @@ class ParameterizedElementType extends DefinedElementType {
return _nameWithGenerics;
}

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

class AliasedElementType extends ParameterizedElementType {
AliasedElementType(ParameterizedType type, Library library,
PackageGraph packageGraph, ModelElement element, ElementType returnedFrom)
: super(type, library, packageGraph, element, returnedFrom) {
assert(type.aliasElement != null);
}

ModelElement _aliasElement;
ModelElement get aliasElement => _aliasElement ??=
ModelElement.fromElement(type.aliasElement, packageGraph);

Iterable<ElementType> _aliasArguments;
Iterable<ElementType> get aliasArguments =>
_aliasArguments ??= type.aliasArguments
.map((f) => ElementType.from(f, library, packageGraph))
.toList(growable: false);

@override
ElementTypeRenderer<AliasedElementType> get _renderer =>
packageGraph.rendererFactory.aliasedElementTypeRenderer;
}

class TypeParameterElementType extends DefinedElementType {
TypeParameterElementType(TypeParameterType type, Library library,
PackageGraph packageGraph, ModelElement element, ElementType returnedFrom)
Expand Down
64 changes: 64 additions & 0 deletions lib/src/render/element_type_renderer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,39 @@ class ParameterizedElementTypeRendererHtml
}
}

class AliasedElementTypeRendererHtml
extends ElementTypeRenderer<AliasedElementType> {
@override
String renderLinkedName(AliasedElementType elementType) {
var buf = StringBuffer();
buf.write(elementType.aliasElement.linkedName);
if (elementType.aliasArguments.isNotEmpty &&
!elementType.aliasArguments.every((t) => t.name == 'dynamic')) {
buf.write('<span class="signature">');
buf.write('&lt;<wbr><span class="type-parameter">');
buf.writeAll(elementType.aliasArguments.map((t) => t.linkedName),
'</span>, <span class="type-parameter">');
buf.write('</span>&gt;');
buf.write('</span>');
}
return wrapNullability(elementType, buf.toString());
}

@override
String renderNameWithGenerics(AliasedElementType elementType) {
var buf = StringBuffer();
buf.write(elementType.aliasElement.name);
if (elementType.aliasArguments.isNotEmpty &&
!elementType.aliasArguments.every((t) => t.name == 'dynamic')) {
buf.write('&lt;<wbr><span class="type-parameter">');
buf.writeAll(elementType.aliasArguments.map((t) => t.nameWithGenerics),
'</span>, <span class="type-parameter">');
buf.write('</span>&gt;');
}
return wrapNullability(elementType, buf.toString());
}
}

class CallableElementTypeRendererHtml
extends ElementTypeRenderer<CallableElementType> {
@override
Expand Down Expand Up @@ -160,6 +193,37 @@ class ParameterizedElementTypeRendererMd
}
}

class AliasedElementTypeRendererMd
extends ElementTypeRenderer<AliasedElementType> {
@override
String renderLinkedName(AliasedElementType elementType) {
var buf = StringBuffer();
buf.write(elementType.aliasElement.linkedName);
if (elementType.aliasArguments.isNotEmpty &&
!elementType.aliasArguments.every((t) => t.name == 'dynamic')) {
buf.write('&lt;');
buf.writeAll(elementType.aliasArguments.map((t) => t.linkedName), ', ');
buf.write('>');
}
return wrapNullability(elementType, buf.toString());
}

@override
String renderNameWithGenerics(AliasedElementType elementType) {
var buf = StringBuffer();
buf.write(elementType.aliasElement.name);
if (elementType.aliasArguments.isNotEmpty &&
!elementType.aliasArguments.every((t) => t.name == 'dynamic')) {
buf.write('&lt;');
buf.writeAll(
elementType.aliasArguments.map((t) => t.nameWithGenerics), ', ');
buf.write('>');
}
buf.write(elementType.nullabilitySuffix);
return wrapNullability(elementType, buf.toString());
}
}

class CallableElementTypeRendererMd
extends ElementTypeRenderer<CallableElementType> {
@override
Expand Down
10 changes: 10 additions & 0 deletions lib/src/render/renderer_factory.dart
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ abstract class RendererFactory {
ElementTypeRenderer<ParameterizedElementType>
get parameterizedElementTypeRenderer;

ElementTypeRenderer<AliasedElementType> get aliasedElementTypeRenderer;

ElementTypeRenderer<CallableElementType> get callableElementTypeRenderer;

EnumFieldRenderer get enumFieldRenderer;
Expand Down Expand Up @@ -90,6 +92,10 @@ class HtmlRenderFactory extends RendererFactory {
get parameterizedElementTypeRenderer =>
ParameterizedElementTypeRendererHtml();

@override
ElementTypeRenderer<AliasedElementType> get aliasedElementTypeRenderer =>
AliasedElementTypeRendererHtml();

@override
EnumFieldRenderer get enumFieldRenderer => EnumFieldRendererHtml();

Expand Down Expand Up @@ -146,6 +152,10 @@ class MdRenderFactory extends RendererFactory {
get parameterizedElementTypeRenderer =>
ParameterizedElementTypeRendererMd();

@override
ElementTypeRenderer<AliasedElementType> get aliasedElementTypeRenderer =>
AliasedElementTypeRendererMd();

@override
EnumFieldRenderer get enumFieldRenderer => EnumFieldRendererMd();

Expand Down
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ environment:
sdk: '>=2.11.99 <3.0.0'

dependencies:
analyzer: ^1.1.0
analyzer: ^1.2.0
args: ^2.0.0
charcode: ^1.2.0
collection: ^1.2.0
Expand Down
38 changes: 24 additions & 14 deletions test/end2end/model_special_cases_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -107,25 +107,35 @@ void main() {
orderedEquals(genericParameters));
}

void expectAliasedTypeName(AliasedElementType n, expected) {
expect(n.aliasElement.name, expected);
}

test('typedef references display aliases', () {
var f = C.allFields.firstWhere((f) => f.name == 'f');
var g = C.instanceMethods.firstWhere((m) => m.name == 'g');
var a = generalizedTypedefs.properties.firstWhere((p) => p.name == 'a');
var b = C2.allFields.firstWhere((f) => f.name == 'b');

var c = C2.allFields.firstWhere((f) => f.name == 'c');
var d = C2.instanceMethods.firstWhere((f) => f.name == 'd');

expect(a.modelType.name, equals('T0'));
expect(b.modelType.name, equals('T0'));
expect(c.modelType.name, equals('T1'));
expect(d.modelType.returnType.name, equals('T2'));
expect(d.parameters.first.modelType.name, equals('T3'));
expect(d.parameters.last.modelType.name, equals('T4'));

expect(f.modelType.name, equals('T0'));
expect(g.modelType.returnType.name, equals('T1'));
expect(g.modelType.parameters.first.modelType.name, equals('T2'));
expect(g.modelType.parameters.last.modelType.name, equals('T3'));
expectAliasedTypeName(c.modelType, equals('T1'));
expectAliasedTypeName(d.modelType.returnType, equals('T2'));
expectAliasedTypeName(d.parameters.first.modelType, equals('T3'));
expectAliasedTypeName(d.parameters.last.modelType, equals('T4'));

expectAliasedTypeName(g.modelType.returnType, equals('T1'));
expectAliasedTypeName(
g.modelType.parameters.first.modelType, equals('T2'));
expectAliasedTypeName(
g.modelType.parameters.last.modelType, equals('T3'));
});

test('typedef references to special types work', () {
var a = generalizedTypedefs.properties.firstWhere((p) => p.name == 'a');
var b = C2.allFields.firstWhere((f) => f.name == 'b');
var f = C.allFields.firstWhere((f) => f.name == 'f');
expectAliasedTypeName(a.modelType, equals('T0'));
expectAliasedTypeName(b.modelType, equals('T0'));
expectAliasedTypeName(f.modelType, equals('T0'));
}, skip: 'dart-lang/sdk#45921');

test('basic non-function typedefs work', () {
Expand Down

0 comments on commit 23af052

Please sign in to comment.