Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
f8b27a3
clean up element types and add display aliases test
jcollins-g Mar 11, 2021
b5a3cd6
Everything except the actual change I want to make
jcollins-g Mar 12, 2021
238de82
Fix tests and update templates
jcollins-g Mar 12, 2021
599fa22
dartfmt
jcollins-g Mar 12, 2021
5aee46b
remove scaffolding
jcollins-g Mar 12, 2021
705d166
Merge branch 'master' into consistent-element-type
jcollins-g Mar 12, 2021
5de7033
begin extraction
jcollins-g Mar 12, 2021
76d1a01
Exclude InterfaceType. Hacky.
jcollins-g Mar 12, 2021
6126096
Merge branch 'generic-types-are-not-interfaces' into consistent-eleme…
jcollins-g Mar 12, 2021
36550f0
Merge branch 'consistent-element-type' into consistent-element-type+m…
jcollins-g Mar 12, 2021
ecb942a
refactor continuing
jcollins-g Mar 13, 2021
e55fcb4
Merge branch 'master' into generic-types-are-not-interfaces
jcollins-g Mar 13, 2021
af002a1
Merge branch 'generic-types-are-not-interfaces' into consistent-eleme…
jcollins-g Mar 13, 2021
0fcac7d
Merge branch 'master' into generic-types-are-not-interfaces
jcollins-g Mar 15, 2021
cabc4d6
Merge branch 'generic-types-are-not-interfaces' into consistent-eleme…
jcollins-g Mar 15, 2021
ccecc78
Merge branch 'consistent-element-type' into consistent-element-type+m…
jcollins-g Mar 15, 2021
32e34ea
dartfmt, finish modelType extraction
jcollins-g Mar 17, 2021
039f5c5
Merge branch 'master' into consistent-element-type+modelType-refactor
jcollins-g Mar 17, 2021
959f9da
todo:ignore and no dynamic
jcollins-g Mar 17, 2021
625182a
fix it all
jcollins-g Mar 17, 2021
92ee8ae
Merge branch 'master' into modelType-refactor
jcollins-g Mar 17, 2021
90c3425
cleanup
jcollins-g Mar 17, 2021
b3a43f0
start splitting test apart
jcollins-g Mar 17, 2021
0637d68
update analyzer
jcollins-g Mar 17, 2021
f403a32
Implement AliasedElementType
jcollins-g Mar 17, 2021
d8c9294
update todo
jcollins-g Mar 17, 2021
3c7fd2d
Add some comments
jcollins-g Mar 17, 2021
c26fcd2
Merge branch 'master' into modelType-refactor
jcollins-g Mar 17, 2021
a0fc976
dartfmt and review comments
jcollins-g Mar 18, 2021
14510b1
Merge branch 'master' into modelType-refactor
jcollins-g Mar 18, 2021
0b2f932
Merge branch 'modelType-refactor' into modelType-refactor+type-alias-…
jcollins-g Mar 18, 2021
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
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
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Woohoo!

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