From 4a0d9c670eccd3093f738f520fc03b1f94874727 Mon Sep 17 00:00:00 2001 From: Janice Collins Date: Wed, 2 Jun 2021 09:32:18 -0700 Subject: [PATCH 1/9] First try --- lib/src/element_type.dart | 122 ++++++++++++------ .../templates.runtime_renderers.dart | 31 +++-- lib/src/model/model_function.dart | 4 +- lib/src/render/element_type_renderer.dart | 67 ++++++++++ lib/src/render/renderer_factory.dart | 13 ++ test/end2end/model_test.dart | 8 +- tool/mustachio/builder.dart | 3 +- 7 files changed, 192 insertions(+), 56 deletions(-) diff --git a/lib/src/element_type.dart b/lib/src/element_type.dart index e5d887d311..a1fdd0d009 100644 --- a/lib/src/element_type.dart +++ b/lib/src/element_type.dart @@ -26,11 +26,15 @@ abstract class ElementType extends Privacy with CommentReferable, Nameable { factory ElementType.from( DartType f, Library library, PackageGraph packageGraph, - [ElementType returnedFrom]) { + {ElementType returnedFrom}) { if (f.element == null || f.element.kind == ElementKind.DYNAMIC || f.element.kind == ElementKind.NEVER) { if (f is FunctionType) { + if (f.aliasElement != null) { + return AliasedFunctionTypeElementType( + f, library, packageGraph, returnedFrom); + } return FunctionTypeElementType(f, library, packageGraph, returnedFrom); } return UndefinedElementType(f, library, packageGraph, returnedFrom); @@ -117,8 +121,6 @@ class UndefinedElementType extends ElementType { @override Element get element => null; - String _linkedName; - @override bool get isPublic => true; @@ -182,14 +184,40 @@ class FunctionTypeElementType extends UndefinedElementType @override ElementType get returnType => - ElementType.from(type.returnType, library, packageGraph, this); + ElementType.from(type.returnType, library, packageGraph, + returnedFrom: this); + + /// An unmodifiable list of this function element's type parameters. + List get typeFormals => type.typeFormals + .map((p) => ModelElement.from(p, library, packageGraph) as TypeParameter) + .toList(growable: false); + + @override + String get name => 'Function'; + + @override + ElementTypeRenderer get _renderer => + packageGraph.rendererFactory.functionTypeElementTypeRenderer; +} + +class AliasedFunctionTypeElementType extends FunctionTypeElementType + with AliasedElementTypeMixin { + AliasedFunctionTypeElementType(DartType f, Library library, + PackageGraph packageGraph, ElementType returnedFrom) + : super(f, library, packageGraph, returnedFrom); + + @override + String get name => type.aliasElement.name; + @override + String _linkedName; @override String get linkedName { _linkedName ??= _renderer.renderLinkedName(this); return _linkedName; } + @override String _nameWithGenerics; @override String get nameWithGenerics { @@ -197,16 +225,9 @@ class FunctionTypeElementType extends UndefinedElementType return _nameWithGenerics; } - /// An unmodifiable list of this function element's type parameters. - List get typeFormals => type.typeFormals - .map((p) => ModelElement.from(p, library, packageGraph) as TypeParameter) - .toList(growable: false); - @override - String get name => 'Function'; - - ElementTypeRenderer get _renderer => - packageGraph.rendererFactory.functionTypeElementTypeRenderer; + ElementTypeRenderer get _renderer => + packageGraph.rendererFactory.aliasedFunctionTypeElementTypeRenderer; } class ParameterizedElementType extends DefinedElementType { @@ -232,12 +253,9 @@ class ParameterizedElementType extends DefinedElementType { 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); - } +mixin AliasedElementTypeMixin implements ElementType { + @override + bool get isTypedef => true; ModelElement _aliasElement; ModelElement get aliasElement => _aliasElement ??= @@ -249,6 +267,24 @@ class AliasedElementType extends ParameterizedElementType { .map((f) => ElementType.from(f, library, packageGraph)) .toList(growable: false); + Iterable _typeArguments; + + /// An unmodifiable list of this element type's parameters. + Iterable get typeArguments => + _typeArguments ??= (type as ParameterizedType) + .typeArguments + .map((f) => ElementType.from(f, library, packageGraph)) + .toList(growable: false); +} + +class AliasedElementType extends ParameterizedElementType + with AliasedElementTypeMixin { + AliasedElementType(ParameterizedType type, Library library, + PackageGraph packageGraph, ModelElement element, ElementType returnedFrom) + : super(type, library, packageGraph, element, returnedFrom) { + assert(type.aliasElement != null); + } + @override ElementTypeRenderer get _renderer => packageGraph.rendererFactory.aliasedElementTypeRenderer; @@ -304,10 +340,6 @@ abstract class DefinedElementType extends ElementType { return canonicalClass?.isPublic ?? false; } - @override - bool get isTypedef => - modelElement is Typedef || modelElement is ModelFunctionTypedef; - @override List get parameters => modelElement.isCallable ? modelElement.parameters : []; @@ -315,7 +347,7 @@ abstract class DefinedElementType extends ElementType { ModelElement get returnElement => modelElement; ElementType _returnType; ElementType get returnType { - _returnType ??= ElementType.from(type, library, packageGraph, this); + _returnType ??= ElementType.from(type, library, packageGraph); return _returnType; } @@ -385,18 +417,13 @@ abstract class DefinedElementType extends ElementType { /// Any callable ElementType will mix-in this class, whether anonymous or not. mixin CallableElementTypeMixin implements ElementType { - @override - // TODO(jcollins-g): remove after dart-lang/dartdoc#2648 is fixed. - String get linkedName; - ModelElement get returnElement => returnType is DefinedElementType ? (returnType as DefinedElementType).modelElement : null; ElementType _returnType; ElementType get returnType { - _returnType ??= - ElementType.from(type.returnType, library, packageGraph, this); + _returnType ??= ElementType.from(type.returnType, library, packageGraph); return _returnType; } @@ -409,11 +436,27 @@ mixin CallableElementTypeMixin implements ElementType { ?.map((f) => ElementType.from(f, library, packageGraph)) ?.toList() ?? []; + + String _linkedName; + @override + String get linkedName { + _linkedName ??= _renderer.renderLinkedName(this); + return _linkedName; + } + + String _nameWithGenerics; + @override + String get nameWithGenerics { + _nameWithGenerics ??= _renderer.renderNameWithGenerics(this); + return _nameWithGenerics; + } + + ElementTypeRenderer get _renderer; } /// A callable type that may or may not be backed by a declaration using the generic /// function syntax. -class CallableElementType extends ParameterizedElementType +class CallableElementType extends DefinedElementType with CallableElementTypeMixin { CallableElementType(FunctionType t, Library library, PackageGraph packageGraph, ModelElement element, ElementType returnedFrom) @@ -428,20 +471,16 @@ class CallableElementType extends ParameterizedElementType packageGraph.rendererFactory.callableElementTypeRenderer; } -/// Types backed by a [GenericTypeAliasElement] that may or may not be callable. -abstract class GenericTypeAliasElementTypeMixin {} - /// A non-callable type backed by a [GenericTypeAliasElement]. -class GenericTypeAliasElementType extends TypeParameterElementType - with GenericTypeAliasElementTypeMixin { +class GenericTypeAliasElementType extends TypeParameterElementType { GenericTypeAliasElementType(TypeParameterType t, Library library, PackageGraph packageGraph, ModelElement element, ElementType returnedFrom) : super(t, library, packageGraph, element, returnedFrom); } /// A Callable generic type alias that may or may not have a name. -class CallableGenericTypeAliasElementType extends ParameterizedElementType - with CallableElementTypeMixin, GenericTypeAliasElementTypeMixin { +class CallableGenericTypeAliasElementType extends DefinedElementType + with CallableElementTypeMixin { CallableGenericTypeAliasElementType(FunctionType t, Library library, PackageGraph packageGraph, ModelElement element, ElementType returnedFrom) : super(t, library, packageGraph, element, returnedFrom); @@ -456,11 +495,14 @@ class CallableGenericTypeAliasElementType extends ParameterizedElementType @override ElementType get returnType { - _returnType ??= - ElementType.from(type.returnType, library, packageGraph, this); + _returnType ??= ElementType.from(type.returnType, library, packageGraph); return _returnType; } @override DartType get instantiatedType => type; + + @override + ElementTypeRenderer get _renderer => + null; } diff --git a/lib/src/generator/templates.runtime_renderers.dart b/lib/src/generator/templates.runtime_renderers.dart index bd5a970e3d..3fc9ee51c1 100644 --- a/lib/src/generator/templates.runtime_renderers.dart +++ b/lib/src/generator/templates.runtime_renderers.dart @@ -520,6 +520,26 @@ class _Renderer_CallableElementTypeMixin parent: r); }, ), + 'nameWithGenerics': Property( + getValue: (CT_ c) => c.nameWithGenerics, + renderVariable: + (CT_ c, Property self, List remainingNames) { + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); + } + var name = remainingNames.first; + var nextProperty = + _Renderer_String.propertyMap().getValue(name); + return nextProperty.renderVariable(self.getValue(c), + nextProperty, [...remainingNames.skip(1)]); + }, + isNullValue: (CT_ c) => c.nameWithGenerics == null, + renderValue: + (CT_ c, RendererBase r, List ast) { + return _render_String(c.nameWithGenerics, ast, r.template, + parent: r); + }, + ), 'returnElement': Property( getValue: (CT_ c) => c.returnElement, renderVariable: @@ -4040,13 +4060,6 @@ class _Renderer_DefinedElementType extends RendererBase { self.renderSimpleVariable(c, remainingNames, 'bool'), getBool: (CT_ c) => c.isPublic == true, ), - 'isTypedef': Property( - getValue: (CT_ c) => c.isTypedef, - renderVariable: (CT_ c, Property self, - List remainingNames) => - self.renderSimpleVariable(c, remainingNames, 'bool'), - getBool: (CT_ c) => c.isTypedef == true, - ), 'modelElement': Property( getValue: (CT_ c) => c.modelElement, renderVariable: @@ -10054,7 +10067,7 @@ class _Renderer_ModelFunctionTyped extends RendererBase { } var name = remainingNames.first; var nextProperty = - _Renderer_DefinedElementType.propertyMap() + _Renderer_CallableElementTypeMixin.propertyMap() .getValue(name); return nextProperty.renderVariable(self.getValue(c), nextProperty, [...remainingNames.skip(1)]); @@ -10062,7 +10075,7 @@ class _Renderer_ModelFunctionTyped extends RendererBase { isNullValue: (CT_ c) => c.modelType == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_DefinedElementType( + return _render_CallableElementTypeMixin( c.modelType, ast, r.template, parent: r); }, diff --git a/lib/src/model/model_function.dart b/lib/src/model/model_function.dart index c323da6cf6..bd55c98f2c 100644 --- a/lib/src/model/model_function.dart +++ b/lib/src/model/model_function.dart @@ -88,7 +88,7 @@ class ModelFunctionTyped extends ModelElement @override FunctionTypedElement get element => super.element; - DefinedElementType _modelType; - DefinedElementType get modelType => + CallableElementTypeMixin _modelType; + CallableElementTypeMixin get modelType => _modelType ??= ElementType.from(element.type, library, packageGraph); } diff --git a/lib/src/render/element_type_renderer.dart b/lib/src/render/element_type_renderer.dart index 940661e8f9..5ef50c24af 100644 --- a/lib/src/render/element_type_renderer.dart +++ b/lib/src/render/element_type_renderer.dart @@ -89,6 +89,41 @@ class ParameterizedElementTypeRendererHtml } } +class AliasedFunctionTypeElementTypeRendererHtml + extends ElementTypeRenderer { + const AliasedFunctionTypeElementTypeRendererHtml(); + + @override + String renderLinkedName(AliasedFunctionTypeElementType elementType) { + var buf = StringBuffer(); + buf.write(elementType.aliasElement.linkedName); + if (elementType.aliasArguments.isNotEmpty && + !elementType.aliasArguments.every((t) => t.name == 'dynamic')) { + buf.write(''); + buf.write('<'); + buf.writeAll(elementType.aliasArguments.map((t) => t.linkedName), + ', '); + buf.write('>'); + buf.write(''); + } + return wrapNullability(elementType, buf.toString()); + } + + @override + String renderNameWithGenerics(AliasedFunctionTypeElementType elementType) { + var buf = StringBuffer(); + buf.write(elementType.aliasElement.name); + if (elementType.aliasArguments.isNotEmpty && + !elementType.aliasArguments.every((t) => t.name == 'dynamic')) { + buf.write('<'); + buf.writeAll(elementType.aliasArguments.map((t) => t.nameWithGenerics), + ', '); + buf.write('>'); + } + return wrapNullability(elementType, buf.toString()); + } +} + class AliasedElementTypeRendererHtml extends ElementTypeRenderer { const AliasedElementTypeRendererHtml(); @@ -255,6 +290,38 @@ class AliasedElementTypeRendererMd } } +class AliasedFunctionTypeElementTypeRendererMd + extends ElementTypeRenderer { + const AliasedFunctionTypeElementTypeRendererMd(); + + @override + String renderLinkedName(AliasedFunctionTypeElementType elementType) { + var buf = StringBuffer(); + buf.write(elementType.aliasElement.linkedName); + if (elementType.aliasArguments.isNotEmpty && + !elementType.aliasArguments.every((t) => t.name == 'dynamic')) { + buf.write('<'); + buf.writeAll(elementType.aliasArguments.map((t) => t.linkedName), ', '); + buf.write('>'); + } + return wrapNullability(elementType, buf.toString()); + } + + @override + String renderNameWithGenerics(AliasedFunctionTypeElementType elementType) { + var buf = StringBuffer(); + buf.write(elementType.aliasElement.name); + if (elementType.aliasArguments.isNotEmpty && + !elementType.aliasArguments.every((t) => t.name == 'dynamic')) { + buf.write('<'); + buf.writeAll( + elementType.aliasArguments.map((t) => t.nameWithGenerics), ', '); + buf.write('>'); + } + return wrapNullability(elementType, buf.toString()); + } +} + class CallableElementTypeRendererMd extends ElementTypeRenderer { const CallableElementTypeRendererMd(); diff --git a/lib/src/render/renderer_factory.dart b/lib/src/render/renderer_factory.dart index 9ecbc1157b..9bc6d3ba11 100644 --- a/lib/src/render/renderer_factory.dart +++ b/lib/src/render/renderer_factory.dart @@ -51,6 +51,9 @@ abstract class RendererFactory { ElementTypeRenderer get aliasedElementTypeRenderer; + ElementTypeRenderer + get aliasedFunctionTypeElementTypeRenderer; + ElementTypeRenderer get callableElementTypeRenderer; EnumFieldRenderer get enumFieldRenderer; @@ -129,6 +132,11 @@ class HtmlRenderFactory extends RendererFactory { @override FeatureRenderer get featureRenderer => const FeatureRendererHtml(); + + @override + ElementTypeRenderer + get aliasedFunctionTypeElementTypeRenderer => + const AliasedFunctionTypeElementTypeRendererHtml(); } class MdRenderFactory extends RendererFactory { @@ -193,4 +201,9 @@ class MdRenderFactory extends RendererFactory { @override FeatureRenderer get featureRenderer => const FeatureRendererMd(); + + @override + ElementTypeRenderer + get aliasedFunctionTypeElementTypeRenderer => + const AliasedFunctionTypeElementTypeRendererMd(); } diff --git a/test/end2end/model_test.dart b/test/end2end/model_test.dart index 5ecbf4d714..67cf83609b 100644 --- a/test/end2end/model_test.dart +++ b/test/end2end/model_test.dart @@ -120,7 +120,7 @@ void main() { orderedEquals(genericParameters)); } - void expectAliasedTypeName(AliasedElementType n, expected) { + void expectAliasedTypeName(AliasedElementTypeMixin n, expected) { expect(n.aliasElement.name, expected); } @@ -212,7 +212,7 @@ void main() { expect(anotherOddFunction.modelType.returnType.name, equals('Future')); expect(anotherOddFunction.modelType.returnType.nullabilitySuffix, equals('?')); - }); + }, skip: 'implied Future detection is broken'); test('isNullSafety is set correctly for libraries', () { expect(lateFinalWithoutInitializer.isNullSafety, isTrue); @@ -2710,7 +2710,7 @@ void main() { test('async function', () { expect(thisIsAsync.isAsynchronous, isTrue); - expect(thisIsAsync.modelType.returnType.linkedName, equals('Future')); + expect(thisIsAsync.modelType.returnType.linkedName, equals('dynamic')); expect( thisIsAsync.documentation, equals( @@ -4208,7 +4208,7 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, test('async return type', () { expect(asyncM.modelType.returnType.linkedName, 'Future'); - }); + }, skip: 'async return type is no longer overwritten'); test('param with generics', () { var params = ParameterRendererHtml() diff --git a/tool/mustachio/builder.dart b/tool/mustachio/builder.dart index c4108ff272..85ed810b8e 100644 --- a/tool/mustachio/builder.dart +++ b/tool/mustachio/builder.dart @@ -3,6 +3,7 @@ // BSD-style license that can be found in the LICENSE file. import 'package:analyzer/dart/element/element.dart'; +import 'package:analyzer/dart/element/type.dart'; import 'package:analyzer/src/dart/element/member.dart'; import 'package:build/build.dart'; import 'package:dartdoc/src/mustachio/annotations.dart'; @@ -131,7 +132,7 @@ class _RendererGatherer { if (contextField.isNull) { throw StateError('@Renderer context must not be null'); } - var contextFieldType = contextField.type; + var contextFieldType = contextField.type as InterfaceType; assert(contextFieldType.typeArguments.length == 1); var contextType = contextFieldType.typeArguments.single; From 31fa623e4aea440e5ea5e5f30d24306849c1542a Mon Sep 17 00:00:00 2001 From: Janice Collins Date: Wed, 2 Jun 2021 10:14:31 -0700 Subject: [PATCH 2/9] retire the feature --- test/end2end/model_test.dart | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/test/end2end/model_test.dart b/test/end2end/model_test.dart index 67cf83609b..8b577ab819 100644 --- a/test/end2end/model_test.dart +++ b/test/end2end/model_test.dart @@ -205,14 +205,14 @@ void main() { equals('?')); }); - test('implied Future types have correct nullability', () { - expect(oddAsyncFunction.modelType.returnType.name, equals('Future')); + test('old implied Future types have correct nullability', () { + expect(oddAsyncFunction.modelType.returnType.name, equals('dynamic')); expect( - oddAsyncFunction.modelType.returnType.nullabilitySuffix, equals('?')); - expect(anotherOddFunction.modelType.returnType.name, equals('Future')); + oddAsyncFunction.modelType.returnType.nullabilitySuffix, equals('')); + expect(anotherOddFunction.modelType.returnType.name, equals('dynamic')); expect(anotherOddFunction.modelType.returnType.nullabilitySuffix, - equals('?')); - }, skip: 'implied Future detection is broken'); + equals('')); + }); test('isNullSafety is set correctly for libraries', () { expect(lateFinalWithoutInitializer.isNullSafety, isTrue); @@ -4207,8 +4207,8 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, }); test('async return type', () { - expect(asyncM.modelType.returnType.linkedName, 'Future'); - }, skip: 'async return type is no longer overwritten'); + expect(asyncM.modelType.returnType.linkedName, 'dynamic'); + }); test('param with generics', () { var params = ParameterRendererHtml() From 6e045ef702e8dc2949be1c6f220cd5df34a10f63 Mon Sep 17 00:00:00 2001 From: Janice Collins Date: Wed, 2 Jun 2021 12:09:42 -0700 Subject: [PATCH 3/9] refactor --- lib/src/element_type.dart | 148 +-- lib/src/generator/templates.dart | 4 +- .../templates.runtime_renderers.dart | 943 ++++++++---------- lib/src/model/accessor.dart | 4 +- lib/src/model/constructor.dart | 4 +- lib/src/model/method.dart | 4 +- lib/src/model/model_element.dart | 9 +- lib/src/model/model_function.dart | 4 +- lib/src/model/typedef.dart | 2 +- lib/src/render/parameter_renderer.dart | 8 +- test/end2end/model_test.dart | 7 +- 11 files changed, 492 insertions(+), 645 deletions(-) diff --git a/lib/src/element_type.dart b/lib/src/element_type.dart index a1fdd0d009..fcbcd5f36d 100644 --- a/lib/src/element_type.dart +++ b/lib/src/element_type.dart @@ -54,10 +54,8 @@ abstract class ElementType extends Privacy with CommentReferable, Nameable { var isGenericTypeAlias = f.aliasElement != null && f is! InterfaceType; if (f is FunctionType) { assert(f is ParameterizedType); - if (isGenericTypeAlias) { - return CallableGenericTypeAliasElementType( - f, library, packageGraph, element, returnedFrom); - } + assert( + !isGenericTypeAlias, 'should never occur: out of date analyzer?'); return CallableElementType( f, library, packageGraph, element, returnedFrom); } else if (isGenericTypeAlias) { @@ -97,11 +95,11 @@ abstract class ElementType extends Privacy with CommentReferable, Nameable { return ''; } - /// An unmodifiable list of this element type's parameters. - List get parameters; - DartType get instantiatedType; + /// An unmodifiable list of this element type's parameters. + Iterable get typeArguments; + bool isBoundSupertypeTo(ElementType t); bool isSubtypeOf(ElementType t); @@ -160,33 +158,22 @@ class UndefinedElementType extends ElementType { String get linkedName => name; @override - Map get referenceChildren => {}; + Iterable get typeArguments => []; @override - Iterable get referenceParents => []; + Map get referenceChildren => {}; @override - // TODO(jcollins-g): remove the need for an empty list here. - List get parameters => []; + Iterable get referenceParents => []; } /// A FunctionType that does not have an underpinning Element. class FunctionTypeElementType extends UndefinedElementType - with CallableElementTypeMixin { + with Rendered, Callable { FunctionTypeElementType(DartType f, Library library, PackageGraph packageGraph, ElementType returnedFrom) : super(f, library, packageGraph, returnedFrom); - @override - List 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, - returnedFrom: this); - /// An unmodifiable list of this function element's type parameters. List get typeFormals => type.typeFormals .map((p) => ModelElement.from(p, library, packageGraph) as TypeParameter) @@ -196,64 +183,36 @@ class FunctionTypeElementType extends UndefinedElementType String get name => 'Function'; @override - ElementTypeRenderer get _renderer => + ElementTypeRenderer get _renderer => packageGraph.rendererFactory.functionTypeElementTypeRenderer; } class AliasedFunctionTypeElementType extends FunctionTypeElementType - with AliasedElementTypeMixin { + with Aliased { AliasedFunctionTypeElementType(DartType f, Library library, PackageGraph packageGraph, ElementType returnedFrom) : super(f, library, packageGraph, returnedFrom); - @override - String get name => type.aliasElement.name; - - @override - String _linkedName; - @override - String get linkedName { - _linkedName ??= _renderer.renderLinkedName(this); - return _linkedName; - } - - @override - String _nameWithGenerics; - @override - String get nameWithGenerics { - _nameWithGenerics ??= _renderer.renderNameWithGenerics(this); - return _nameWithGenerics; - } - @override ElementTypeRenderer get _renderer => packageGraph.rendererFactory.aliasedFunctionTypeElementTypeRenderer; } -class ParameterizedElementType extends DefinedElementType { +class ParameterizedElementType extends DefinedElementType with Rendered { ParameterizedElementType(ParameterizedType type, Library library, PackageGraph packageGraph, ModelElement element, ElementType returnedFrom) : super(type, library, packageGraph, element, returnedFrom); - String _linkedName; @override - String get linkedName { - _linkedName ??= _renderer.renderLinkedName(this); - return _linkedName; - } - - String _nameWithGenerics; - @override - String get nameWithGenerics { - _nameWithGenerics ??= _renderer.renderNameWithGenerics(this); - return _nameWithGenerics; - } - ElementTypeRenderer get _renderer => packageGraph.rendererFactory.parameterizedElementTypeRenderer; } -mixin AliasedElementTypeMixin implements ElementType { +/// A [ElementType] whose underlying type was referrred to by a type alias. +mixin Aliased implements ElementType { + @override + String get name => type.aliasElement.name; + @override bool get isTypedef => true; @@ -268,8 +227,7 @@ mixin AliasedElementTypeMixin implements ElementType { .toList(growable: false); Iterable _typeArguments; - - /// An unmodifiable list of this element type's parameters. + @override Iterable get typeArguments => _typeArguments ??= (type as ParameterizedType) .typeArguments @@ -277,8 +235,7 @@ mixin AliasedElementTypeMixin implements ElementType { .toList(growable: false); } -class AliasedElementType extends ParameterizedElementType - with AliasedElementTypeMixin { +class AliasedElementType extends ParameterizedElementType with Aliased { AliasedElementType(ParameterizedType type, Library library, PackageGraph packageGraph, ModelElement element, ElementType returnedFrom) : super(type, library, packageGraph, element, returnedFrom) { @@ -340,20 +297,8 @@ abstract class DefinedElementType extends ElementType { return canonicalClass?.isPublic ?? false; } - @override - List get parameters => - modelElement.isCallable ? modelElement.parameters : []; - - ModelElement get returnElement => modelElement; - ElementType _returnType; - ElementType get returnType { - _returnType ??= ElementType.from(type, library, packageGraph); - return _returnType; - } - Iterable _typeArguments; - - /// An unmodifiable list of this element type's parameters. + @override Iterable get typeArguments => _typeArguments ??= (type as ParameterizedType) .typeArguments @@ -416,10 +361,10 @@ abstract class DefinedElementType extends ElementType { } /// Any callable ElementType will mix-in this class, whether anonymous or not. -mixin CallableElementTypeMixin implements ElementType { - ModelElement get returnElement => returnType is DefinedElementType - ? (returnType as DefinedElementType).modelElement - : null; +mixin Callable implements ElementType { + List get parameters => type.parameters + .map((p) => ModelElement.from(p, library, packageGraph) as Parameter) + .toList(growable: false); ElementType _returnType; ElementType get returnType { @@ -429,14 +374,11 @@ mixin CallableElementTypeMixin implements ElementType { @override FunctionType get type => _type; +} - Iterable _typeArguments; - Iterable get typeArguments => - _typeArguments ??= type.aliasArguments - ?.map((f) => ElementType.from(f, library, packageGraph)) - ?.toList() ?? - []; - +/// This [ElementType] uses an [ElementTypeRenderer] to generate +/// some of its parameters. +mixin Rendered implements ElementType { String _linkedName; @override String get linkedName { @@ -451,13 +393,12 @@ mixin CallableElementTypeMixin implements ElementType { return _nameWithGenerics; } - ElementTypeRenderer get _renderer; + ElementTypeRenderer get _renderer; } /// A callable type that may or may not be backed by a declaration using the generic /// function syntax. -class CallableElementType extends DefinedElementType - with CallableElementTypeMixin { +class CallableElementType extends DefinedElementType with Rendered, Callable { CallableElementType(FunctionType t, Library library, PackageGraph packageGraph, ModelElement element, ElementType returnedFrom) : super(t, library, packageGraph, element, returnedFrom); @@ -477,32 +418,3 @@ class GenericTypeAliasElementType extends TypeParameterElementType { PackageGraph packageGraph, ModelElement element, ElementType returnedFrom) : super(t, library, packageGraph, element, returnedFrom); } - -/// A Callable generic type alias that may or may not have a name. -class CallableGenericTypeAliasElementType extends DefinedElementType - with CallableElementTypeMixin { - CallableGenericTypeAliasElementType(FunctionType t, Library library, - PackageGraph packageGraph, ModelElement element, ElementType returnedFrom) - : super(t, library, packageGraph, element, returnedFrom); - - ModelElement _returnElement; - @override - ModelElement get returnElement { - _returnElement ??= ModelElement.fromElement( - type.aliasElement.enclosingElement, packageGraph); - return _returnElement; - } - - @override - ElementType get returnType { - _returnType ??= ElementType.from(type.returnType, library, packageGraph); - return _returnType; - } - - @override - DartType get instantiatedType => type; - - @override - ElementTypeRenderer get _renderer => - null; -} diff --git a/lib/src/generator/templates.dart b/lib/src/generator/templates.dart index e50ba5eaa1..d8cbe836cc 100644 --- a/lib/src/generator/templates.dart +++ b/lib/src/generator/templates.dart @@ -41,15 +41,15 @@ import 'package:path/path.dart' as path show Context; const _visibleTypes = { Annotation, - CallableElementTypeMixin, + Callable, Category, Class, Constructor, - DefinedElementType, Documentable, Enum, Extension, FeatureSet, + FunctionTypeElementType, LanguageFeature, Library, LibraryContainer, diff --git a/lib/src/generator/templates.runtime_renderers.dart b/lib/src/generator/templates.runtime_renderers.dart index 3fc9ee51c1..d232cfe43f 100644 --- a/lib/src/generator/templates.runtime_renderers.dart +++ b/lib/src/generator/templates.runtime_renderers.dart @@ -201,16 +201,14 @@ class _Renderer_Accessor extends RendererBase { } var name = remainingNames.first; var nextProperty = - _Renderer_CallableElementTypeMixin.propertyMap() - .getValue(name); + _Renderer_Callable.propertyMap().getValue(name); return nextProperty.renderVariable(self.getValue(c), nextProperty, [...remainingNames.skip(1)]); }, isNullValue: (CT_ c) => c.modelType == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_CallableElementTypeMixin( - c.modelType, ast, r.template, + return _render_Callable(c.modelType, ast, r.template, parent: r); }, ), @@ -484,81 +482,30 @@ class _Renderer_Annotation extends RendererBase { } } -String _render_CallableElementTypeMixin(CallableElementTypeMixin context, - List ast, Template template, +String _render_Callable( + Callable context, List ast, Template template, {RendererBase parent}) { - var renderer = _Renderer_CallableElementTypeMixin(context, parent, template); + var renderer = _Renderer_Callable(context, parent, template); renderer.renderBlock(ast); return renderer.buffer.toString(); } -class _Renderer_CallableElementTypeMixin - extends RendererBase { +class _Renderer_Callable extends RendererBase { static final Map _propertyMapCache = {}; - static Map> propertyMap< - CT_ extends CallableElementTypeMixin>() => + static Map> propertyMap() => _propertyMapCache.putIfAbsent( CT_, () => { - 'linkedName': Property( - getValue: (CT_ c) => c.linkedName, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) { - return self.getValue(c).toString(); - } - var name = remainingNames.first; - var nextProperty = - _Renderer_String.propertyMap().getValue(name); - return nextProperty.renderVariable(self.getValue(c), - nextProperty, [...remainingNames.skip(1)]); - }, - isNullValue: (CT_ c) => c.linkedName == null, - renderValue: - (CT_ c, RendererBase r, List ast) { - return _render_String(c.linkedName, ast, r.template, - parent: r); - }, - ), - 'nameWithGenerics': Property( - getValue: (CT_ c) => c.nameWithGenerics, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) { - return self.getValue(c).toString(); - } - var name = remainingNames.first; - var nextProperty = - _Renderer_String.propertyMap().getValue(name); - return nextProperty.renderVariable(self.getValue(c), - nextProperty, [...remainingNames.skip(1)]); - }, - isNullValue: (CT_ c) => c.nameWithGenerics == null, - renderValue: - (CT_ c, RendererBase r, List ast) { - return _render_String(c.nameWithGenerics, ast, r.template, - parent: r); - }, - ), - 'returnElement': Property( - getValue: (CT_ c) => c.returnElement, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) { - return self.getValue(c).toString(); - } - var name = remainingNames.first; - var nextProperty = - _Renderer_ModelElement.propertyMap().getValue(name); - return nextProperty.renderVariable(self.getValue(c), - nextProperty, [...remainingNames.skip(1)]); - }, - isNullValue: (CT_ c) => c.returnElement == null, - renderValue: + 'parameters': Property( + getValue: (CT_ c) => c.parameters, + renderVariable: (CT_ c, Property self, + List remainingNames) => + self.renderSimpleVariable( + c, remainingNames, 'List'), + renderIterable: (CT_ c, RendererBase r, List ast) { - return _render_ModelElement( - c.returnElement, ast, r.template, - parent: r); + return c.parameters.map((e) => + _render_Parameter(e, ast, r.template, parent: r)); }, ), 'returnType': Property( @@ -593,28 +540,16 @@ class _Renderer_CallableElementTypeMixin return renderSimple(c.type, ast, r.template, parent: r); }, ), - 'typeArguments': Property( - getValue: (CT_ c) => c.typeArguments, - renderVariable: (CT_ c, Property self, - List remainingNames) => - self.renderSimpleVariable( - c, remainingNames, 'Iterable'), - renderIterable: - (CT_ c, RendererBase r, List ast) { - return c.typeArguments.map( - (e) => renderSimple(e, ast, r.template, parent: r)); - }, - ), }); - _Renderer_CallableElementTypeMixin(CallableElementTypeMixin context, - RendererBase parent, Template template) + _Renderer_Callable( + Callable context, RendererBase parent, Template template) : super(context, parent, template); @override - Property getProperty(String key) { - if (propertyMap().containsKey(key)) { - return propertyMap()[key]; + Property getProperty(String key) { + if (propertyMap().containsKey(key)) { + return propertyMap()[key]; } else { return null; } @@ -1971,9 +1906,8 @@ class _Renderer_Class extends RendererBase { c, remainingNames, 'List'), renderIterable: (CT_ c, RendererBase r, List ast) { - return c.interfaces.map((e) => _render_DefinedElementType( - e, ast, r.template, - parent: r)); + return c.interfaces.map( + (e) => renderSimple(e, ast, r.template, parent: r)); }, ), 'isAbstract': Property( @@ -2024,30 +1958,20 @@ class _Renderer_Class extends RendererBase { c, remainingNames, 'List'), renderIterable: (CT_ c, RendererBase r, List ast) { - return c.mixedInTypes.map((e) => _render_DefinedElementType( - e, ast, r.template, - parent: r)); + return c.mixedInTypes.map( + (e) => renderSimple(e, ast, r.template, parent: r)); }, ), 'modelType': Property( getValue: (CT_ c) => c.modelType, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) { - return self.getValue(c).toString(); - } - var name = remainingNames.first; - var nextProperty = - _Renderer_DefinedElementType.propertyMap() - .getValue(name); - return nextProperty.renderVariable(self.getValue(c), - nextProperty, [...remainingNames.skip(1)]); - }, + renderVariable: (CT_ c, Property self, + List remainingNames) => + self.renderSimpleVariable( + c, remainingNames, 'DefinedElementType'), isNullValue: (CT_ c) => c.modelType == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_DefinedElementType( - c.modelType, ast, r.template, + return renderSimple(c.modelType, ast, r.template, parent: r); }, ), @@ -2141,9 +2065,8 @@ class _Renderer_Class extends RendererBase { c, remainingNames, 'Iterable'), renderIterable: (CT_ c, RendererBase r, List ast) { - return c.publicInterfaces.map((e) => - _render_DefinedElementType(e, ast, r.template, - parent: r)); + return c.publicInterfaces.map( + (e) => renderSimple(e, ast, r.template, parent: r)); }, ), 'publicMixedInTypes': Property( @@ -2154,9 +2077,8 @@ class _Renderer_Class extends RendererBase { c, remainingNames, 'Iterable'), renderIterable: (CT_ c, RendererBase r, List ast) { - return c.publicMixedInTypes.map((e) => - _render_DefinedElementType(e, ast, r.template, - parent: r)); + return c.publicMixedInTypes.map( + (e) => renderSimple(e, ast, r.template, parent: r)); }, ), 'publicSuperChain': Property( @@ -2167,9 +2089,8 @@ class _Renderer_Class extends RendererBase { c, remainingNames, 'Iterable'), renderIterable: (CT_ c, RendererBase r, List ast) { - return c.publicSuperChain.map((e) => - _render_DefinedElementType(e, ast, r.template, - parent: r)); + return c.publicSuperChain.map( + (e) => renderSimple(e, ast, r.template, parent: r)); }, ), 'publicSuperChainReversed': Property( @@ -2180,9 +2101,8 @@ class _Renderer_Class extends RendererBase { c, remainingNames, 'Iterable'), renderIterable: (CT_ c, RendererBase r, List ast) { - return c.publicSuperChainReversed.map((e) => - _render_DefinedElementType(e, ast, r.template, - parent: r)); + return c.publicSuperChainReversed.map( + (e) => renderSimple(e, ast, r.template, parent: r)); }, ), 'referenceParents': Property( @@ -2205,30 +2125,20 @@ class _Renderer_Class extends RendererBase { c, remainingNames, 'List'), renderIterable: (CT_ c, RendererBase r, List ast) { - return c.superChain.map((e) => _render_DefinedElementType( - e, ast, r.template, - parent: r)); + return c.superChain.map( + (e) => renderSimple(e, ast, r.template, parent: r)); }, ), 'supertype': Property( getValue: (CT_ c) => c.supertype, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) { - return self.getValue(c).toString(); - } - var name = remainingNames.first; - var nextProperty = - _Renderer_DefinedElementType.propertyMap() - .getValue(name); - return nextProperty.renderVariable(self.getValue(c), - nextProperty, [...remainingNames.skip(1)]); - }, + renderVariable: (CT_ c, Property self, + List remainingNames) => + self.renderSimpleVariable( + c, remainingNames, 'DefinedElementType'), isNullValue: (CT_ c) => c.supertype == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_DefinedElementType( - c.supertype, ast, r.template, + return renderSimple(c.supertype, ast, r.template, parent: r); }, ), @@ -2868,16 +2778,14 @@ class _Renderer_Constructor extends RendererBase { } var name = remainingNames.first; var nextProperty = - _Renderer_CallableElementTypeMixin.propertyMap() - .getValue(name); + _Renderer_Callable.propertyMap().getValue(name); return nextProperty.renderVariable(self.getValue(c), nextProperty, [...remainingNames.skip(1)]); }, isNullValue: (CT_ c) => c.modelType == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_CallableElementTypeMixin( - c.modelType, ast, r.template, + return _render_Callable(c.modelType, ast, r.template, parent: r); }, ), @@ -4007,61 +3915,35 @@ class _Renderer_ContainerMember extends RendererBase { } } -String _render_DefinedElementType( - DefinedElementType context, List ast, Template template, +String _render_Documentable( + Documentable context, List ast, Template template, {RendererBase parent}) { - var renderer = _Renderer_DefinedElementType(context, parent, template); + var renderer = _Renderer_Documentable(context, parent, template); renderer.renderBlock(ast); return renderer.buffer.toString(); } -class _Renderer_DefinedElementType extends RendererBase { +class _Renderer_Documentable extends RendererBase { static final Map _propertyMapCache = {}; - static Map> propertyMap< - CT_ extends DefinedElementType>() => + static Map> propertyMap() => _propertyMapCache.putIfAbsent( CT_, () => { - ..._Renderer_ElementType.propertyMap(), - 'element': Property( - getValue: (CT_ c) => c.element, - renderVariable: (CT_ c, Property self, - List remainingNames) => - self.renderSimpleVariable(c, remainingNames, 'Element'), - isNullValue: (CT_ c) => c.element == null, - renderValue: - (CT_ c, RendererBase r, List ast) { - return renderSimple(c.element, ast, r.template, parent: r); - }, - ), - 'instantiatedType': Property( - getValue: (CT_ c) => c.instantiatedType, + ..._Renderer_Nameable.propertyMap(), + 'config': Property( + getValue: (CT_ c) => c.config, renderVariable: (CT_ c, Property self, List remainingNames) => - self.renderSimpleVariable(c, remainingNames, 'DartType'), - isNullValue: (CT_ c) => c.instantiatedType == null, + self.renderSimpleVariable( + c, remainingNames, 'DartdocOptionContext'), + isNullValue: (CT_ c) => c.config == null, renderValue: (CT_ c, RendererBase r, List ast) { - return renderSimple(c.instantiatedType, ast, r.template, - parent: r); + return renderSimple(c.config, ast, r.template, parent: r); }, ), - 'isParameterType': Property( - getValue: (CT_ c) => c.isParameterType, - renderVariable: (CT_ c, Property self, - List remainingNames) => - self.renderSimpleVariable(c, remainingNames, 'bool'), - getBool: (CT_ c) => c.isParameterType == true, - ), - 'isPublic': Property( - getValue: (CT_ c) => c.isPublic, - renderVariable: (CT_ c, Property self, - List remainingNames) => - self.renderSimpleVariable(c, remainingNames, 'bool'), - getBool: (CT_ c) => c.isPublic == true, - ), - 'modelElement': Property( - getValue: (CT_ c) => c.modelElement, + 'documentation': Property( + getValue: (CT_ c) => c.documentation, renderVariable: (CT_ c, Property self, List remainingNames) { if (remainingNames.isEmpty) { @@ -4069,19 +3951,19 @@ class _Renderer_DefinedElementType extends RendererBase { } var name = remainingNames.first; var nextProperty = - _Renderer_ModelElement.propertyMap().getValue(name); + _Renderer_String.propertyMap().getValue(name); return nextProperty.renderVariable(self.getValue(c), nextProperty, [...remainingNames.skip(1)]); }, - isNullValue: (CT_ c) => c.modelElement == null, + isNullValue: (CT_ c) => c.documentation == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_ModelElement(c.modelElement, ast, r.template, + return _render_String(c.documentation, ast, r.template, parent: r); }, ), - 'name': Property( - getValue: (CT_ c) => c.name, + 'documentationAsHtml': Property( + getValue: (CT_ c) => c.documentationAsHtml, renderVariable: (CT_ c, Property self, List remainingNames) { if (remainingNames.isEmpty) { @@ -4093,51 +3975,56 @@ class _Renderer_DefinedElementType extends RendererBase { return nextProperty.renderVariable(self.getValue(c), nextProperty, [...remainingNames.skip(1)]); }, - isNullValue: (CT_ c) => c.name == null, + isNullValue: (CT_ c) => c.documentationAsHtml == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.name, ast, r.template, parent: r); + return _render_String( + c.documentationAsHtml, ast, r.template, + parent: r); }, ), - 'parameters': Property( - getValue: (CT_ c) => c.parameters, + 'hasDocumentation': Property( + getValue: (CT_ c) => c.hasDocumentation, renderVariable: (CT_ c, Property self, List remainingNames) => - self.renderSimpleVariable( - c, remainingNames, 'List'), - renderIterable: - (CT_ c, RendererBase r, List ast) { - return c.parameters.map((e) => - _render_Parameter(e, ast, r.template, parent: r)); - }, + self.renderSimpleVariable(c, remainingNames, 'bool'), + getBool: (CT_ c) => c.hasDocumentation == true, ), - 'referenceChildren': Property( - getValue: (CT_ c) => c.referenceChildren, + 'hasExtendedDocumentation': Property( + getValue: (CT_ c) => c.hasExtendedDocumentation, renderVariable: (CT_ c, Property self, List remainingNames) => - self.renderSimpleVariable( - c, remainingNames, 'Map'), - isNullValue: (CT_ c) => c.referenceChildren == null, + self.renderSimpleVariable(c, remainingNames, 'bool'), + getBool: (CT_ c) => c.hasExtendedDocumentation == true, + ), + 'href': Property( + getValue: (CT_ c) => c.href, + renderVariable: + (CT_ c, Property self, List remainingNames) { + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); + } + var name = remainingNames.first; + var nextProperty = + _Renderer_String.propertyMap().getValue(name); + return nextProperty.renderVariable(self.getValue(c), + nextProperty, [...remainingNames.skip(1)]); + }, + isNullValue: (CT_ c) => c.href == null, renderValue: (CT_ c, RendererBase r, List ast) { - return renderSimple(c.referenceChildren, ast, r.template, - parent: r); + return _render_String(c.href, ast, r.template, parent: r); }, ), - 'referenceParents': Property( - getValue: (CT_ c) => c.referenceParents, + 'isDocumented': Property( + getValue: (CT_ c) => c.isDocumented, renderVariable: (CT_ c, Property self, List remainingNames) => - self.renderSimpleVariable( - c, remainingNames, 'Iterable'), - renderIterable: - (CT_ c, RendererBase r, List ast) { - return c.referenceParents.map( - (e) => renderSimple(e, ast, r.template, parent: r)); - }, + self.renderSimpleVariable(c, remainingNames, 'bool'), + getBool: (CT_ c) => c.isDocumented == true, ), - 'returnElement': Property( - getValue: (CT_ c) => c.returnElement, + 'kind': Property( + getValue: (CT_ c) => c.kind, renderVariable: (CT_ c, Property self, List remainingNames) { if (remainingNames.isEmpty) { @@ -4145,20 +4032,18 @@ class _Renderer_DefinedElementType extends RendererBase { } var name = remainingNames.first; var nextProperty = - _Renderer_ModelElement.propertyMap().getValue(name); + _Renderer_String.propertyMap().getValue(name); return nextProperty.renderVariable(self.getValue(c), nextProperty, [...remainingNames.skip(1)]); }, - isNullValue: (CT_ c) => c.returnElement == null, + isNullValue: (CT_ c) => c.kind == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_ModelElement( - c.returnElement, ast, r.template, - parent: r); + return _render_String(c.kind, ast, r.template, parent: r); }, ), - 'returnType': Property( - getValue: (CT_ c) => c.returnType, + 'oneLineDoc': Property( + getValue: (CT_ c) => c.oneLineDoc, renderVariable: (CT_ c, Property self, List remainingNames) { if (remainingNames.isEmpty) { @@ -4166,194 +4051,19 @@ class _Renderer_DefinedElementType extends RendererBase { } var name = remainingNames.first; var nextProperty = - _Renderer_ElementType.propertyMap().getValue(name); + _Renderer_String.propertyMap().getValue(name); return nextProperty.renderVariable(self.getValue(c), nextProperty, [...remainingNames.skip(1)]); }, - isNullValue: (CT_ c) => c.returnType == null, + isNullValue: (CT_ c) => c.oneLineDoc == null, renderValue: (CT_ c, RendererBase r, List ast) { - return renderSimple(c.returnType, ast, r.template, + return _render_String(c.oneLineDoc, ast, r.template, parent: r); }, ), - 'typeArguments': Property( - getValue: (CT_ c) => c.typeArguments, - renderVariable: (CT_ c, Property self, - List remainingNames) => - self.renderSimpleVariable( - c, remainingNames, 'Iterable'), - renderIterable: - (CT_ c, RendererBase r, List ast) { - return c.typeArguments.map( - (e) => renderSimple(e, ast, r.template, parent: r)); - }, - ), - }); - - _Renderer_DefinedElementType(DefinedElementType context, - RendererBase parent, Template template) - : super(context, parent, template); - - @override - Property getProperty(String key) { - if (propertyMap().containsKey(key)) { - return propertyMap()[key]; - } else { - return null; - } - } -} - -String _render_Documentable( - Documentable context, List ast, Template template, - {RendererBase parent}) { - var renderer = _Renderer_Documentable(context, parent, template); - renderer.renderBlock(ast); - return renderer.buffer.toString(); -} - -class _Renderer_Documentable extends RendererBase { - static final Map _propertyMapCache = {}; - static Map> propertyMap() => - _propertyMapCache.putIfAbsent( - CT_, - () => { - ..._Renderer_Nameable.propertyMap(), - 'config': Property( - getValue: (CT_ c) => c.config, - renderVariable: (CT_ c, Property self, - List remainingNames) => - self.renderSimpleVariable( - c, remainingNames, 'DartdocOptionContext'), - isNullValue: (CT_ c) => c.config == null, - renderValue: - (CT_ c, RendererBase r, List ast) { - return renderSimple(c.config, ast, r.template, parent: r); - }, - ), - 'documentation': Property( - getValue: (CT_ c) => c.documentation, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) { - return self.getValue(c).toString(); - } - var name = remainingNames.first; - var nextProperty = - _Renderer_String.propertyMap().getValue(name); - return nextProperty.renderVariable(self.getValue(c), - nextProperty, [...remainingNames.skip(1)]); - }, - isNullValue: (CT_ c) => c.documentation == null, - renderValue: - (CT_ c, RendererBase r, List ast) { - return _render_String(c.documentation, ast, r.template, - parent: r); - }, - ), - 'documentationAsHtml': Property( - getValue: (CT_ c) => c.documentationAsHtml, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) { - return self.getValue(c).toString(); - } - var name = remainingNames.first; - var nextProperty = - _Renderer_String.propertyMap().getValue(name); - return nextProperty.renderVariable(self.getValue(c), - nextProperty, [...remainingNames.skip(1)]); - }, - isNullValue: (CT_ c) => c.documentationAsHtml == null, - renderValue: - (CT_ c, RendererBase r, List ast) { - return _render_String( - c.documentationAsHtml, ast, r.template, - parent: r); - }, - ), - 'hasDocumentation': Property( - getValue: (CT_ c) => c.hasDocumentation, - renderVariable: (CT_ c, Property self, - List remainingNames) => - self.renderSimpleVariable(c, remainingNames, 'bool'), - getBool: (CT_ c) => c.hasDocumentation == true, - ), - 'hasExtendedDocumentation': Property( - getValue: (CT_ c) => c.hasExtendedDocumentation, - renderVariable: (CT_ c, Property self, - List remainingNames) => - self.renderSimpleVariable(c, remainingNames, 'bool'), - getBool: (CT_ c) => c.hasExtendedDocumentation == true, - ), - 'href': Property( - getValue: (CT_ c) => c.href, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) { - return self.getValue(c).toString(); - } - var name = remainingNames.first; - var nextProperty = - _Renderer_String.propertyMap().getValue(name); - return nextProperty.renderVariable(self.getValue(c), - nextProperty, [...remainingNames.skip(1)]); - }, - isNullValue: (CT_ c) => c.href == null, - renderValue: - (CT_ c, RendererBase r, List ast) { - return _render_String(c.href, ast, r.template, parent: r); - }, - ), - 'isDocumented': Property( - getValue: (CT_ c) => c.isDocumented, - renderVariable: (CT_ c, Property self, - List remainingNames) => - self.renderSimpleVariable(c, remainingNames, 'bool'), - getBool: (CT_ c) => c.isDocumented == true, - ), - 'kind': Property( - getValue: (CT_ c) => c.kind, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) { - return self.getValue(c).toString(); - } - var name = remainingNames.first; - var nextProperty = - _Renderer_String.propertyMap().getValue(name); - return nextProperty.renderVariable(self.getValue(c), - nextProperty, [...remainingNames.skip(1)]); - }, - isNullValue: (CT_ c) => c.kind == null, - renderValue: - (CT_ c, RendererBase r, List ast) { - return _render_String(c.kind, ast, r.template, parent: r); - }, - ), - 'oneLineDoc': Property( - getValue: (CT_ c) => c.oneLineDoc, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) { - return self.getValue(c).toString(); - } - var name = remainingNames.first; - var nextProperty = - _Renderer_String.propertyMap().getValue(name); - return nextProperty.renderVariable(self.getValue(c), - nextProperty, [...remainingNames.skip(1)]); - }, - isNullValue: (CT_ c) => c.oneLineDoc == null, - renderValue: - (CT_ c, RendererBase r, List ast) { - return _render_String(c.oneLineDoc, ast, r.template, - parent: r); - }, - ), - 'packageGraph': Property( - getValue: (CT_ c) => c.packageGraph, + 'packageGraph': Property( + getValue: (CT_ c) => c.packageGraph, renderVariable: (CT_ c, Property self, List remainingNames) => self.renderSimpleVariable( @@ -4628,18 +4338,6 @@ class _Renderer_ElementType extends RendererBase { parent: r); }, ), - 'parameters': Property( - getValue: (CT_ c) => c.parameters, - renderVariable: (CT_ c, Property self, - List remainingNames) => - self.renderSimpleVariable( - c, remainingNames, 'List'), - renderIterable: - (CT_ c, RendererBase r, List ast) { - return c.parameters.map((e) => - _render_Parameter(e, ast, r.template, parent: r)); - }, - ), 'returnedFrom': Property( getValue: (CT_ c) => c.returnedFrom, renderVariable: @@ -4671,6 +4369,18 @@ class _Renderer_ElementType extends RendererBase { return renderSimple(c.type, ast, r.template, parent: r); }, ), + 'typeArguments': Property( + getValue: (CT_ c) => c.typeArguments, + renderVariable: (CT_ c, Property self, + List remainingNames) => + self.renderSimpleVariable( + c, remainingNames, 'Iterable'), + renderIterable: + (CT_ c, RendererBase r, List ast) { + return c.typeArguments.map( + (e) => renderSimple(e, ast, r.template, parent: r)); + }, + ), }); _Renderer_ElementType( @@ -6101,6 +5811,72 @@ class _Renderer_FunctionTemplateData } } +String _render_FunctionTypeElementType( + FunctionTypeElementType context, List ast, Template template, + {RendererBase parent}) { + var renderer = _Renderer_FunctionTypeElementType(context, parent, template); + renderer.renderBlock(ast); + return renderer.buffer.toString(); +} + +class _Renderer_FunctionTypeElementType + extends RendererBase { + static final Map _propertyMapCache = {}; + static Map> propertyMap< + CT_ extends FunctionTypeElementType>() => + _propertyMapCache.putIfAbsent( + CT_, + () => { + ..._Renderer_UndefinedElementType.propertyMap(), + ..._Renderer_Rendered.propertyMap(), + ..._Renderer_Callable.propertyMap(), + 'name': Property( + getValue: (CT_ c) => c.name, + renderVariable: + (CT_ c, Property self, List remainingNames) { + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); + } + var name = remainingNames.first; + var nextProperty = + _Renderer_String.propertyMap().getValue(name); + return nextProperty.renderVariable(self.getValue(c), + nextProperty, [...remainingNames.skip(1)]); + }, + isNullValue: (CT_ c) => c.name == null, + renderValue: + (CT_ c, RendererBase r, List ast) { + return _render_String(c.name, ast, r.template, parent: r); + }, + ), + 'typeFormals': Property( + getValue: (CT_ c) => c.typeFormals, + renderVariable: (CT_ c, Property self, + List remainingNames) => + self.renderSimpleVariable( + c, remainingNames, 'List'), + renderIterable: + (CT_ c, RendererBase r, List ast) { + return c.typeFormals.map((e) => + _render_TypeParameter(e, ast, r.template, parent: r)); + }, + ), + }); + + _Renderer_FunctionTypeElementType(FunctionTypeElementType context, + RendererBase parent, Template template) + : super(context, parent, template); + + @override + Property getProperty(String key) { + if (propertyMap().containsKey(key)) { + return propertyMap()[key]; + } else { + return null; + } + } +} + String _render_FunctionTypedef( FunctionTypedef context, List ast, Template template, {RendererBase parent}) { @@ -6126,7 +5902,7 @@ class _Renderer_FunctionTypedef extends RendererBase { } var name = remainingNames.first; var nextProperty = - _Renderer_CallableElementTypeMixin.propertyMap() + _Renderer_FunctionTypeElementType.propertyMap() .getValue(name); return nextProperty.renderVariable(self.getValue(c), nextProperty, [...remainingNames.skip(1)]); @@ -6134,7 +5910,7 @@ class _Renderer_FunctionTypedef extends RendererBase { isNullValue: (CT_ c) => c.modelType == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_CallableElementTypeMixin( + return _render_FunctionTypeElementType( c.modelType, ast, r.template, parent: r); }, @@ -8338,16 +8114,14 @@ class _Renderer_Method extends RendererBase { } var name = remainingNames.first; var nextProperty = - _Renderer_CallableElementTypeMixin.propertyMap() - .getValue(name); + _Renderer_Callable.propertyMap().getValue(name); return nextProperty.renderVariable(self.getValue(c), nextProperty, [...remainingNames.skip(1)]); }, isNullValue: (CT_ c) => c.modelType == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_CallableElementTypeMixin( - c.modelType, ast, r.template, + return _render_Callable(c.modelType, ast, r.template, parent: r); }, ), @@ -8769,9 +8543,8 @@ class _Renderer_Mixin extends RendererBase { 'Iterable'), renderIterable: (CT_ c, RendererBase r, List ast) { - return c.publicSuperclassConstraints.map((e) => - _render_ParameterizedElementType(e, ast, r.template, - parent: r)); + return c.publicSuperclassConstraints.map( + (e) => renderSimple(e, ast, r.template, parent: r)); }, ), 'superclassConstraints': Property( @@ -8782,9 +8555,8 @@ class _Renderer_Mixin extends RendererBase { 'Iterable'), renderIterable: (CT_ c, RendererBase r, List ast) { - return c.superclassConstraints.map((e) => - _render_ParameterizedElementType(e, ast, r.template, - parent: r)); + return c.superclassConstraints.map( + (e) => renderSimple(e, ast, r.template, parent: r)); }, ), }); @@ -10067,16 +9839,14 @@ class _Renderer_ModelFunctionTyped extends RendererBase { } var name = remainingNames.first; var nextProperty = - _Renderer_CallableElementTypeMixin.propertyMap() - .getValue(name); + _Renderer_Callable.propertyMap().getValue(name); return nextProperty.renderVariable(self.getValue(c), nextProperty, [...remainingNames.skip(1)]); }, isNullValue: (CT_ c) => c.modelType == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_CallableElementTypeMixin( - c.modelType, ast, r.template, + return _render_Callable(c.modelType, ast, r.template, parent: r); }, ), @@ -11127,7 +10897,7 @@ class _Renderer_Package extends RendererBase { } } -String renderIndex(PackageTemplateData context, Template template) { +String renderError(PackageTemplateData context, Template template) { return _render_PackageTemplateData(context, template.ast, template); } @@ -11327,7 +11097,7 @@ class _Renderer_PackageTemplateData extends RendererBase { } } -String renderError(PackageTemplateData context, Template template) { +String renderIndex(PackageTemplateData context, Template template) { return _render_PackageTemplateData(context, template.ast, template); } @@ -11603,79 +11373,6 @@ class _Renderer_Parameter extends RendererBase { } } -String _render_ParameterizedElementType(ParameterizedElementType context, - List ast, Template template, - {RendererBase parent}) { - var renderer = _Renderer_ParameterizedElementType(context, parent, template); - renderer.renderBlock(ast); - return renderer.buffer.toString(); -} - -class _Renderer_ParameterizedElementType - extends RendererBase { - static final Map _propertyMapCache = {}; - static Map> propertyMap< - CT_ extends ParameterizedElementType>() => - _propertyMapCache.putIfAbsent( - CT_, - () => { - ..._Renderer_DefinedElementType.propertyMap(), - 'linkedName': Property( - getValue: (CT_ c) => c.linkedName, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) { - return self.getValue(c).toString(); - } - var name = remainingNames.first; - var nextProperty = - _Renderer_String.propertyMap().getValue(name); - return nextProperty.renderVariable(self.getValue(c), - nextProperty, [...remainingNames.skip(1)]); - }, - isNullValue: (CT_ c) => c.linkedName == null, - renderValue: - (CT_ c, RendererBase r, List ast) { - return _render_String(c.linkedName, ast, r.template, - parent: r); - }, - ), - 'nameWithGenerics': Property( - getValue: (CT_ c) => c.nameWithGenerics, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) { - return self.getValue(c).toString(); - } - var name = remainingNames.first; - var nextProperty = - _Renderer_String.propertyMap().getValue(name); - return nextProperty.renderVariable(self.getValue(c), - nextProperty, [...remainingNames.skip(1)]); - }, - isNullValue: (CT_ c) => c.nameWithGenerics == null, - renderValue: - (CT_ c, RendererBase r, List ast) { - return _render_String(c.nameWithGenerics, ast, r.template, - parent: r); - }, - ), - }); - - _Renderer_ParameterizedElementType(ParameterizedElementType context, - RendererBase parent, Template template) - : super(context, parent, template); - - @override - Property getProperty(String key) { - if (propertyMap().containsKey(key)) { - return propertyMap()[key]; - } else { - return null; - } - } -} - class _Renderer_Privacy extends RendererBase { static final Map _propertyMapCache = {}; static Map> propertyMap() => @@ -11946,6 +11643,68 @@ class _Renderer_PropertyTemplateData } } +class _Renderer_Rendered extends RendererBase { + static final Map _propertyMapCache = {}; + static Map> propertyMap() => + _propertyMapCache.putIfAbsent( + CT_, + () => { + 'linkedName': Property( + getValue: (CT_ c) => c.linkedName, + renderVariable: + (CT_ c, Property self, List remainingNames) { + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); + } + var name = remainingNames.first; + var nextProperty = + _Renderer_String.propertyMap().getValue(name); + return nextProperty.renderVariable(self.getValue(c), + nextProperty, [...remainingNames.skip(1)]); + }, + isNullValue: (CT_ c) => c.linkedName == null, + renderValue: + (CT_ c, RendererBase r, List ast) { + return _render_String(c.linkedName, ast, r.template, + parent: r); + }, + ), + 'nameWithGenerics': Property( + getValue: (CT_ c) => c.nameWithGenerics, + renderVariable: + (CT_ c, Property self, List remainingNames) { + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); + } + var name = remainingNames.first; + var nextProperty = + _Renderer_String.propertyMap().getValue(name); + return nextProperty.renderVariable(self.getValue(c), + nextProperty, [...remainingNames.skip(1)]); + }, + isNullValue: (CT_ c) => c.nameWithGenerics == null, + renderValue: + (CT_ c, RendererBase r, List ast) { + return _render_String(c.nameWithGenerics, ast, r.template, + parent: r); + }, + ), + }); + + _Renderer_Rendered( + Rendered context, RendererBase parent, Template template) + : super(context, parent, template); + + @override + Property getProperty(String key) { + if (propertyMap().containsKey(key)) { + return propertyMap()[key]; + } else { + return null; + } + } +} + class _Renderer_SourceCodeMixin extends RendererBase { static final Map _propertyMapCache = {}; static Map> propertyMap< @@ -14323,6 +14082,184 @@ class _Renderer_TypedefTemplateData extends RendererBase { } } +class _Renderer_UndefinedElementType + extends RendererBase { + static final Map _propertyMapCache = {}; + static Map> propertyMap< + CT_ extends UndefinedElementType>() => + _propertyMapCache.putIfAbsent( + CT_, + () => { + ..._Renderer_ElementType.propertyMap(), + 'element': Property( + getValue: (CT_ c) => c.element, + renderVariable: (CT_ c, Property self, + List remainingNames) => + self.renderSimpleVariable(c, remainingNames, 'Element'), + isNullValue: (CT_ c) => c.element == null, + renderValue: + (CT_ c, RendererBase r, List ast) { + return renderSimple(c.element, ast, r.template, parent: r); + }, + ), + 'instantiatedType': Property( + getValue: (CT_ c) => c.instantiatedType, + renderVariable: (CT_ c, Property self, + List remainingNames) => + self.renderSimpleVariable(c, remainingNames, 'DartType'), + isNullValue: (CT_ c) => c.instantiatedType == null, + renderValue: + (CT_ c, RendererBase r, List ast) { + return renderSimple(c.instantiatedType, ast, r.template, + parent: r); + }, + ), + 'isImpliedFuture': Property( + getValue: (CT_ c) => c.isImpliedFuture, + renderVariable: (CT_ c, Property self, + List remainingNames) => + self.renderSimpleVariable(c, remainingNames, 'bool'), + getBool: (CT_ c) => c.isImpliedFuture == true, + ), + 'isPublic': Property( + getValue: (CT_ c) => c.isPublic, + renderVariable: (CT_ c, Property self, + List remainingNames) => + self.renderSimpleVariable(c, remainingNames, 'bool'), + getBool: (CT_ c) => c.isPublic == true, + ), + 'linkedName': Property( + getValue: (CT_ c) => c.linkedName, + renderVariable: + (CT_ c, Property self, List remainingNames) { + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); + } + var name = remainingNames.first; + var nextProperty = + _Renderer_String.propertyMap().getValue(name); + return nextProperty.renderVariable(self.getValue(c), + nextProperty, [...remainingNames.skip(1)]); + }, + isNullValue: (CT_ c) => c.linkedName == null, + renderValue: + (CT_ c, RendererBase r, List ast) { + return _render_String(c.linkedName, ast, r.template, + parent: r); + }, + ), + 'name': Property( + getValue: (CT_ c) => c.name, + renderVariable: + (CT_ c, Property self, List remainingNames) { + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); + } + var name = remainingNames.first; + var nextProperty = + _Renderer_String.propertyMap().getValue(name); + return nextProperty.renderVariable(self.getValue(c), + nextProperty, [...remainingNames.skip(1)]); + }, + isNullValue: (CT_ c) => c.name == null, + renderValue: + (CT_ c, RendererBase r, List ast) { + return _render_String(c.name, ast, r.template, parent: r); + }, + ), + 'nameWithGenerics': Property( + getValue: (CT_ c) => c.nameWithGenerics, + renderVariable: + (CT_ c, Property self, List remainingNames) { + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); + } + var name = remainingNames.first; + var nextProperty = + _Renderer_String.propertyMap().getValue(name); + return nextProperty.renderVariable(self.getValue(c), + nextProperty, [...remainingNames.skip(1)]); + }, + isNullValue: (CT_ c) => c.nameWithGenerics == null, + renderValue: + (CT_ c, RendererBase r, List ast) { + return _render_String(c.nameWithGenerics, ast, r.template, + parent: r); + }, + ), + 'nullabilitySuffix': Property( + getValue: (CT_ c) => c.nullabilitySuffix, + renderVariable: + (CT_ c, Property self, List remainingNames) { + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); + } + var name = remainingNames.first; + var nextProperty = + _Renderer_String.propertyMap().getValue(name); + return nextProperty.renderVariable(self.getValue(c), + nextProperty, [...remainingNames.skip(1)]); + }, + isNullValue: (CT_ c) => c.nullabilitySuffix == null, + renderValue: + (CT_ c, RendererBase r, List ast) { + return _render_String(c.nullabilitySuffix, ast, r.template, + parent: r); + }, + ), + 'referenceChildren': Property( + getValue: (CT_ c) => c.referenceChildren, + renderVariable: (CT_ c, Property self, + List remainingNames) => + self.renderSimpleVariable( + c, remainingNames, 'Map'), + isNullValue: (CT_ c) => c.referenceChildren == null, + renderValue: + (CT_ c, RendererBase r, List ast) { + return renderSimple(c.referenceChildren, ast, r.template, + parent: r); + }, + ), + 'referenceParents': Property( + getValue: (CT_ c) => c.referenceParents, + renderVariable: (CT_ c, Property self, + List remainingNames) => + self.renderSimpleVariable( + c, remainingNames, 'Iterable'), + renderIterable: + (CT_ c, RendererBase r, List ast) { + return c.referenceParents.map( + (e) => renderSimple(e, ast, r.template, parent: r)); + }, + ), + 'typeArguments': Property( + getValue: (CT_ c) => c.typeArguments, + renderVariable: (CT_ c, Property self, + List remainingNames) => + self.renderSimpleVariable( + c, remainingNames, 'Iterable'), + renderIterable: + (CT_ c, RendererBase r, List ast) { + return c.typeArguments.map( + (e) => renderSimple(e, ast, r.template, parent: r)); + }, + ), + }); + + _Renderer_UndefinedElementType(UndefinedElementType context, + RendererBase parent, Template template) + : super(context, parent, template); + + @override + Property getProperty(String key) { + if (propertyMap().containsKey(key)) { + return propertyMap()[key]; + } else { + return null; + } + } +} + class _Renderer_Warnable extends RendererBase { static final Map _propertyMapCache = {}; static Map> propertyMap() => diff --git a/lib/src/model/accessor.dart b/lib/src/model/accessor.dart index c8a6976a68..c8aba534ff 100644 --- a/lib/src/model/accessor.dart +++ b/lib/src/model/accessor.dart @@ -27,8 +27,8 @@ class Accessor extends ModelElement implements EnclosedElement { @override ExecutableMember get originalMember => super.originalMember; - CallableElementTypeMixin _modelType; - CallableElementTypeMixin get modelType => _modelType ??= + Callable _modelType; + Callable get modelType => _modelType ??= ElementType.from((originalMember ?? element).type, library, packageGraph); bool get isSynthetic => element.isSynthetic; diff --git a/lib/src/model/constructor.dart b/lib/src/model/constructor.dart index b07c7032cb..a572b3d699 100644 --- a/lib/src/model/constructor.dart +++ b/lib/src/model/constructor.dart @@ -79,8 +79,8 @@ class Constructor extends ModelElement @override String get kind => 'constructor'; - CallableElementTypeMixin _modelType; - CallableElementTypeMixin get modelType => + Callable _modelType; + Callable get modelType => _modelType ??= ElementType.from(element.type, library, packageGraph); String _name; diff --git a/lib/src/model/method.dart b/lib/src/model/method.dart index 2b6e38e476..a2d288a258 100644 --- a/lib/src/model/method.dart +++ b/lib/src/model/method.dart @@ -97,8 +97,8 @@ class Method extends ModelElement @override ExecutableMember get originalMember => super.originalMember; - CallableElementTypeMixin _modelType; - CallableElementTypeMixin get modelType => _modelType ??= + Callable _modelType; + Callable get modelType => _modelType ??= ElementType.from((originalMember ?? element).type, library, packageGraph); @override diff --git a/lib/src/model/model_element.dart b/lib/src/model/model_element.dart index fb4b9ce737..62955392d6 100644 --- a/lib/src/model/model_element.dart +++ b/lib/src/model/model_element.dart @@ -16,6 +16,7 @@ import 'package:analyzer/src/dart/element/member.dart' import 'package:collection/collection.dart'; import 'package:dartdoc/src/comment_references/model_comment_reference.dart'; import 'package:dartdoc/src/dartdoc_options.dart'; +import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/model/annotation.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; import 'package:dartdoc/src/model/feature.dart'; @@ -945,9 +946,11 @@ abstract class ModelElement extends Canonicalization recursedParameters.addAll(newParameters); newParameters.clear(); for (var p in recursedParameters) { - var l = p.modelType.parameters - .where((pm) => !recursedParameters.contains(pm)); - newParameters.addAll(l); + var parameterModelType = p.modelType; + if (parameterModelType is Callable) { + newParameters.addAll(parameterModelType.parameters + .where((pm) => !recursedParameters.contains(pm))); + } } } _allParameters = recursedParameters.toList(); diff --git a/lib/src/model/model_function.dart b/lib/src/model/model_function.dart index bd55c98f2c..bd442323dd 100644 --- a/lib/src/model/model_function.dart +++ b/lib/src/model/model_function.dart @@ -88,7 +88,7 @@ class ModelFunctionTyped extends ModelElement @override FunctionTypedElement get element => super.element; - CallableElementTypeMixin _modelType; - CallableElementTypeMixin get modelType => + Callable _modelType; + Callable get modelType => _modelType ??= ElementType.from(element.type, library, packageGraph); } diff --git a/lib/src/model/typedef.dart b/lib/src/model/typedef.dart index 8f4e8527e7..ac36412d57 100644 --- a/lib/src/model/typedef.dart +++ b/lib/src/model/typedef.dart @@ -89,5 +89,5 @@ class FunctionTypedef extends Typedef { : super(element, library, packageGraph); @override - CallableElementTypeMixin get modelType => super.modelType; + FunctionTypeElementType get modelType => super.modelType; } diff --git a/lib/src/render/parameter_renderer.dart b/lib/src/render/parameter_renderer.dart index f4539f6868..b1e551e758 100644 --- a/lib/src/render/parameter_renderer.dart +++ b/lib/src/render/parameter_renderer.dart @@ -183,7 +183,7 @@ abstract class ParameterRenderer { if (param.isCovariant) { buf.write(covariant('covariant') + ' '); } - if (paramModelType is CallableElementTypeMixin) { + if (paramModelType is Callable) { String returnTypeName; if (paramModelType.isTypedef) { returnTypeName = paramModelType.linkedName; @@ -208,10 +208,8 @@ abstract class ParameterRenderer { } if (!paramModelType.isTypedef && paramModelType.type is FunctionType) { buf.write('('); - buf.write(renderLinkedParams( - (paramModelType as UndefinedElementType).parameters, - showMetadata: showMetadata, - showNames: showNames)); + buf.write(renderLinkedParams(paramModelType.parameters, + showMetadata: showMetadata, showNames: showNames)); buf.write(')'); buf.write(paramModelType.nullabilitySuffix); } diff --git a/test/end2end/model_test.dart b/test/end2end/model_test.dart index 8b577ab819..89cd9bf0d3 100644 --- a/test/end2end/model_test.dart +++ b/test/end2end/model_test.dart @@ -120,7 +120,7 @@ void main() { orderedEquals(genericParameters)); } - void expectAliasedTypeName(AliasedElementTypeMixin n, expected) { + void expectAliasedTypeName(Aliased n, expected) { expect(n.aliasElement.name, expected); } @@ -3085,10 +3085,7 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, test('parameter is a function', () { var functionArgParam = m4.parameters[1]; - expect( - (functionArgParam.modelType as CallableElementTypeMixin) - .returnType - .linkedName, + expect((functionArgParam.modelType as Callable).returnType.linkedName, 'String'); }); From e95dbd4234ddd6e4447498610813c4286d1eda28 Mon Sep 17 00:00:00 2001 From: Janice Collins Date: Wed, 2 Jun 2021 12:58:55 -0700 Subject: [PATCH 4/9] finish excising implicit future --- lib/src/element_type.dart | 11 -------- .../templates.runtime_renderers.dart | 27 ------------------- 2 files changed, 38 deletions(-) diff --git a/lib/src/element_type.dart b/lib/src/element_type.dart index fcbcd5f36d..80e79705bb 100644 --- a/lib/src/element_type.dart +++ b/lib/src/element_type.dart @@ -124,26 +124,15 @@ class UndefinedElementType extends ElementType { @override String get name { - if (isImpliedFuture) return 'Future'; if (type.isVoid) return 'void'; assert({'Never', 'void', 'dynamic'}.contains(type.element.name), 'Unrecognized type for UndefinedElementType: ${type.toString()}'); return type.element.name; } - /// Returns true if this type is an implied `Future`. - bool get isImpliedFuture => (type.isDynamic && - returnedFrom != null && - returnedFrom is DefinedElementType && - (returnedFrom as DefinedElementType).modelElement.isAsynchronous); - @override String get nameWithGenerics => '$name$nullabilitySuffix'; - @override - String get nullabilitySuffix => - isImpliedFuture && library.isNullSafety ? '?' : super.nullabilitySuffix; - /// Assume that undefined elements don't have useful bounds. @override DartType get instantiatedType => type; diff --git a/lib/src/generator/templates.runtime_renderers.dart b/lib/src/generator/templates.runtime_renderers.dart index d232cfe43f..c93365b558 100644 --- a/lib/src/generator/templates.runtime_renderers.dart +++ b/lib/src/generator/templates.runtime_renderers.dart @@ -14114,13 +14114,6 @@ class _Renderer_UndefinedElementType parent: r); }, ), - 'isImpliedFuture': Property( - getValue: (CT_ c) => c.isImpliedFuture, - renderVariable: (CT_ c, Property self, - List remainingNames) => - self.renderSimpleVariable(c, remainingNames, 'bool'), - getBool: (CT_ c) => c.isImpliedFuture == true, - ), 'isPublic': Property( getValue: (CT_ c) => c.isPublic, renderVariable: (CT_ c, Property self, @@ -14187,26 +14180,6 @@ class _Renderer_UndefinedElementType parent: r); }, ), - 'nullabilitySuffix': Property( - getValue: (CT_ c) => c.nullabilitySuffix, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) { - return self.getValue(c).toString(); - } - var name = remainingNames.first; - var nextProperty = - _Renderer_String.propertyMap().getValue(name); - return nextProperty.renderVariable(self.getValue(c), - nextProperty, [...remainingNames.skip(1)]); - }, - isNullValue: (CT_ c) => c.nullabilitySuffix == null, - renderValue: - (CT_ c, RendererBase r, List ast) { - return _render_String(c.nullabilitySuffix, ast, r.template, - parent: r); - }, - ), 'referenceChildren': Property( getValue: (CT_ c) => c.referenceChildren, renderVariable: (CT_ c, Property self, From 97525d534a704f46a9bbefb23af15630baf37dd8 Mon Sep 17 00:00:00 2001 From: Janice Collins Date: Wed, 2 Jun 2021 14:31:55 -0700 Subject: [PATCH 5/9] cleanup --- lib/src/element_type.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/src/element_type.dart b/lib/src/element_type.dart index 80e79705bb..544943b5d4 100644 --- a/lib/src/element_type.dart +++ b/lib/src/element_type.dart @@ -97,7 +97,6 @@ abstract class ElementType extends Privacy with CommentReferable, Nameable { DartType get instantiatedType; - /// An unmodifiable list of this element type's parameters. Iterable get typeArguments; bool isBoundSupertypeTo(ElementType t); From 4a2f6670c46891d78454c623ed0bd0d1465f2a73 Mon Sep 17 00:00:00 2001 From: Janice Collins Date: Wed, 2 Jun 2021 14:47:14 -0700 Subject: [PATCH 6/9] Fix recursive parameter search (flutter test failure) --- lib/src/element_type.dart | 7 ++++++- lib/src/model/model_element.dart | 5 +++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/src/element_type.dart b/lib/src/element_type.dart index 544943b5d4..f1e78dc60f 100644 --- a/lib/src/element_type.dart +++ b/lib/src/element_type.dart @@ -230,6 +230,10 @@ class AliasedElementType extends ParameterizedElementType with Aliased { assert(type.aliasElement != null); } + /// Parameters, if available, for the underlying typedef. + List get aliasedParameters => + modelElement.isCallable ? modelElement.parameters : []; + @override ElementTypeRenderer get _renderer => packageGraph.rendererFactory.aliasedElementTypeRenderer; @@ -348,7 +352,8 @@ abstract class DefinedElementType extends ElementType { modelElement.referenceParents; } -/// Any callable ElementType will mix-in this class, whether anonymous or not. +/// Any callable ElementType will mix-in this class, whether anonymous or not, +/// unless it is an alias reference. mixin Callable implements ElementType { List get parameters => type.parameters .map((p) => ModelElement.from(p, library, packageGraph) as Parameter) diff --git a/lib/src/model/model_element.dart b/lib/src/model/model_element.dart index 62955392d6..cf59bf1aca 100644 --- a/lib/src/model/model_element.dart +++ b/lib/src/model/model_element.dart @@ -942,6 +942,7 @@ abstract class ModelElement extends Canonicalization } else { if (isCallable) newParameters.addAll(parameters); } + // TODO(jcollins-g): This part probably belongs in [ElementType]. while (newParameters.isNotEmpty) { recursedParameters.addAll(newParameters); newParameters.clear(); @@ -951,6 +952,10 @@ abstract class ModelElement extends Canonicalization newParameters.addAll(parameterModelType.parameters .where((pm) => !recursedParameters.contains(pm))); } + if (parameterModelType is AliasedElementType) { + newParameters.addAll(parameterModelType.aliasedParameters + .where((pm) => !recursedParameters.contains(pm))); + } } } _allParameters = recursedParameters.toList(); From c9b40ee9b2f4cec031729b531403605c7e572426 Mon Sep 17 00:00:00 2001 From: Janice Collins Date: Thu, 3 Jun 2021 08:37:24 -0700 Subject: [PATCH 7/9] this seems to work --- .../templates.runtime_renderers.dart | 262 ++++++++++++++++-- 1 file changed, 234 insertions(+), 28 deletions(-) diff --git a/lib/src/generator/templates.runtime_renderers.dart b/lib/src/generator/templates.runtime_renderers.dart index c93365b558..f524624927 100644 --- a/lib/src/generator/templates.runtime_renderers.dart +++ b/lib/src/generator/templates.runtime_renderers.dart @@ -1906,8 +1906,9 @@ class _Renderer_Class extends RendererBase { c, remainingNames, 'List'), renderIterable: (CT_ c, RendererBase r, List ast) { - return c.interfaces.map( - (e) => renderSimple(e, ast, r.template, parent: r)); + return c.interfaces.map((e) => _render_DefinedElementType( + e, ast, r.template, + parent: r)); }, ), 'isAbstract': Property( @@ -1958,20 +1959,30 @@ class _Renderer_Class extends RendererBase { c, remainingNames, 'List'), renderIterable: (CT_ c, RendererBase r, List ast) { - return c.mixedInTypes.map( - (e) => renderSimple(e, ast, r.template, parent: r)); + return c.mixedInTypes.map((e) => _render_DefinedElementType( + e, ast, r.template, + parent: r)); }, ), 'modelType': Property( getValue: (CT_ c) => c.modelType, - renderVariable: (CT_ c, Property self, - List remainingNames) => - self.renderSimpleVariable( - c, remainingNames, 'DefinedElementType'), + renderVariable: + (CT_ c, Property self, List remainingNames) { + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); + } + var name = remainingNames.first; + var nextProperty = + _Renderer_DefinedElementType.propertyMap() + .getValue(name); + return nextProperty.renderVariable(self.getValue(c), + nextProperty, [...remainingNames.skip(1)]); + }, isNullValue: (CT_ c) => c.modelType == null, renderValue: (CT_ c, RendererBase r, List ast) { - return renderSimple(c.modelType, ast, r.template, + return _render_DefinedElementType( + c.modelType, ast, r.template, parent: r); }, ), @@ -2065,8 +2076,9 @@ class _Renderer_Class extends RendererBase { c, remainingNames, 'Iterable'), renderIterable: (CT_ c, RendererBase r, List ast) { - return c.publicInterfaces.map( - (e) => renderSimple(e, ast, r.template, parent: r)); + return c.publicInterfaces.map((e) => + _render_DefinedElementType(e, ast, r.template, + parent: r)); }, ), 'publicMixedInTypes': Property( @@ -2077,8 +2089,9 @@ class _Renderer_Class extends RendererBase { c, remainingNames, 'Iterable'), renderIterable: (CT_ c, RendererBase r, List ast) { - return c.publicMixedInTypes.map( - (e) => renderSimple(e, ast, r.template, parent: r)); + return c.publicMixedInTypes.map((e) => + _render_DefinedElementType(e, ast, r.template, + parent: r)); }, ), 'publicSuperChain': Property( @@ -2089,8 +2102,9 @@ class _Renderer_Class extends RendererBase { c, remainingNames, 'Iterable'), renderIterable: (CT_ c, RendererBase r, List ast) { - return c.publicSuperChain.map( - (e) => renderSimple(e, ast, r.template, parent: r)); + return c.publicSuperChain.map((e) => + _render_DefinedElementType(e, ast, r.template, + parent: r)); }, ), 'publicSuperChainReversed': Property( @@ -2101,8 +2115,9 @@ class _Renderer_Class extends RendererBase { c, remainingNames, 'Iterable'), renderIterable: (CT_ c, RendererBase r, List ast) { - return c.publicSuperChainReversed.map( - (e) => renderSimple(e, ast, r.template, parent: r)); + return c.publicSuperChainReversed.map((e) => + _render_DefinedElementType(e, ast, r.template, + parent: r)); }, ), 'referenceParents': Property( @@ -2125,20 +2140,30 @@ class _Renderer_Class extends RendererBase { c, remainingNames, 'List'), renderIterable: (CT_ c, RendererBase r, List ast) { - return c.superChain.map( - (e) => renderSimple(e, ast, r.template, parent: r)); + return c.superChain.map((e) => _render_DefinedElementType( + e, ast, r.template, + parent: r)); }, ), 'supertype': Property( getValue: (CT_ c) => c.supertype, - renderVariable: (CT_ c, Property self, - List remainingNames) => - self.renderSimpleVariable( - c, remainingNames, 'DefinedElementType'), + renderVariable: + (CT_ c, Property self, List remainingNames) { + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); + } + var name = remainingNames.first; + var nextProperty = + _Renderer_DefinedElementType.propertyMap() + .getValue(name); + return nextProperty.renderVariable(self.getValue(c), + nextProperty, [...remainingNames.skip(1)]); + }, isNullValue: (CT_ c) => c.supertype == null, renderValue: (CT_ c, RendererBase r, List ast) { - return renderSimple(c.supertype, ast, r.template, + return _render_DefinedElementType( + c.supertype, ast, r.template, parent: r); }, ), @@ -3915,6 +3940,151 @@ class _Renderer_ContainerMember extends RendererBase { } } +String _render_DefinedElementType( + DefinedElementType context, List ast, Template template, + {RendererBase parent}) { + var renderer = _Renderer_DefinedElementType(context, parent, template); + renderer.renderBlock(ast); + return renderer.buffer.toString(); +} + +class _Renderer_DefinedElementType extends RendererBase { + static final Map _propertyMapCache = {}; + static Map> propertyMap< + CT_ extends DefinedElementType>() => + _propertyMapCache.putIfAbsent( + CT_, + () => { + ..._Renderer_ElementType.propertyMap(), + 'element': Property( + getValue: (CT_ c) => c.element, + renderVariable: (CT_ c, Property self, + List remainingNames) => + self.renderSimpleVariable(c, remainingNames, 'Element'), + isNullValue: (CT_ c) => c.element == null, + renderValue: + (CT_ c, RendererBase r, List ast) { + return renderSimple(c.element, ast, r.template, parent: r); + }, + ), + 'instantiatedType': Property( + getValue: (CT_ c) => c.instantiatedType, + renderVariable: (CT_ c, Property self, + List remainingNames) => + self.renderSimpleVariable(c, remainingNames, 'DartType'), + isNullValue: (CT_ c) => c.instantiatedType == null, + renderValue: + (CT_ c, RendererBase r, List ast) { + return renderSimple(c.instantiatedType, ast, r.template, + parent: r); + }, + ), + 'isParameterType': Property( + getValue: (CT_ c) => c.isParameterType, + renderVariable: (CT_ c, Property self, + List remainingNames) => + self.renderSimpleVariable(c, remainingNames, 'bool'), + getBool: (CT_ c) => c.isParameterType == true, + ), + 'isPublic': Property( + getValue: (CT_ c) => c.isPublic, + renderVariable: (CT_ c, Property self, + List remainingNames) => + self.renderSimpleVariable(c, remainingNames, 'bool'), + getBool: (CT_ c) => c.isPublic == true, + ), + 'modelElement': Property( + getValue: (CT_ c) => c.modelElement, + renderVariable: + (CT_ c, Property self, List remainingNames) { + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); + } + var name = remainingNames.first; + var nextProperty = + _Renderer_ModelElement.propertyMap().getValue(name); + return nextProperty.renderVariable(self.getValue(c), + nextProperty, [...remainingNames.skip(1)]); + }, + isNullValue: (CT_ c) => c.modelElement == null, + renderValue: + (CT_ c, RendererBase r, List ast) { + return _render_ModelElement(c.modelElement, ast, r.template, + parent: r); + }, + ), + 'name': Property( + getValue: (CT_ c) => c.name, + renderVariable: + (CT_ c, Property self, List remainingNames) { + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); + } + var name = remainingNames.first; + var nextProperty = + _Renderer_String.propertyMap().getValue(name); + return nextProperty.renderVariable(self.getValue(c), + nextProperty, [...remainingNames.skip(1)]); + }, + isNullValue: (CT_ c) => c.name == null, + renderValue: + (CT_ c, RendererBase r, List ast) { + return _render_String(c.name, ast, r.template, parent: r); + }, + ), + 'referenceChildren': Property( + getValue: (CT_ c) => c.referenceChildren, + renderVariable: (CT_ c, Property self, + List remainingNames) => + self.renderSimpleVariable( + c, remainingNames, 'Map'), + isNullValue: (CT_ c) => c.referenceChildren == null, + renderValue: + (CT_ c, RendererBase r, List ast) { + return renderSimple(c.referenceChildren, ast, r.template, + parent: r); + }, + ), + 'referenceParents': Property( + getValue: (CT_ c) => c.referenceParents, + renderVariable: (CT_ c, Property self, + List remainingNames) => + self.renderSimpleVariable( + c, remainingNames, 'Iterable'), + renderIterable: + (CT_ c, RendererBase r, List ast) { + return c.referenceParents.map( + (e) => renderSimple(e, ast, r.template, parent: r)); + }, + ), + 'typeArguments': Property( + getValue: (CT_ c) => c.typeArguments, + renderVariable: (CT_ c, Property self, + List remainingNames) => + self.renderSimpleVariable( + c, remainingNames, 'Iterable'), + renderIterable: + (CT_ c, RendererBase r, List ast) { + return c.typeArguments.map( + (e) => renderSimple(e, ast, r.template, parent: r)); + }, + ), + }); + + _Renderer_DefinedElementType(DefinedElementType context, + RendererBase parent, Template template) + : super(context, parent, template); + + @override + Property getProperty(String key) { + if (propertyMap().containsKey(key)) { + return propertyMap()[key]; + } else { + return null; + } + } +} + String _render_Documentable( Documentable context, List ast, Template template, {RendererBase parent}) { @@ -8543,8 +8713,9 @@ class _Renderer_Mixin extends RendererBase { 'Iterable'), renderIterable: (CT_ c, RendererBase r, List ast) { - return c.publicSuperclassConstraints.map( - (e) => renderSimple(e, ast, r.template, parent: r)); + return c.publicSuperclassConstraints.map((e) => + _render_ParameterizedElementType(e, ast, r.template, + parent: r)); }, ), 'superclassConstraints': Property( @@ -8555,8 +8726,9 @@ class _Renderer_Mixin extends RendererBase { 'Iterable'), renderIterable: (CT_ c, RendererBase r, List ast) { - return c.superclassConstraints.map( - (e) => renderSimple(e, ast, r.template, parent: r)); + return c.superclassConstraints.map((e) => + _render_ParameterizedElementType(e, ast, r.template, + parent: r)); }, ), }); @@ -11373,6 +11545,40 @@ class _Renderer_Parameter extends RendererBase { } } +String _render_ParameterizedElementType(ParameterizedElementType context, + List ast, Template template, + {RendererBase parent}) { + var renderer = _Renderer_ParameterizedElementType(context, parent, template); + renderer.renderBlock(ast); + return renderer.buffer.toString(); +} + +class _Renderer_ParameterizedElementType + extends RendererBase { + static final Map _propertyMapCache = {}; + static Map> + propertyMap() => + _propertyMapCache.putIfAbsent( + CT_, + () => { + ..._Renderer_DefinedElementType.propertyMap(), + ..._Renderer_Rendered.propertyMap(), + }); + + _Renderer_ParameterizedElementType(ParameterizedElementType context, + RendererBase parent, Template template) + : super(context, parent, template); + + @override + Property getProperty(String key) { + if (propertyMap().containsKey(key)) { + return propertyMap()[key]; + } else { + return null; + } + } +} + class _Renderer_Privacy extends RendererBase { static final Map _propertyMapCache = {}; static Map> propertyMap() => From 04334b210beba8c757dfe84075a20318fd26d09f Mon Sep 17 00:00:00 2001 From: Janice Collins Date: Thu, 3 Jun 2021 08:38:55 -0700 Subject: [PATCH 8/9] DefinedElementType back in visibleTypes --- lib/src/generator/templates.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/src/generator/templates.dart b/lib/src/generator/templates.dart index d8cbe836cc..f358ab801b 100644 --- a/lib/src/generator/templates.dart +++ b/lib/src/generator/templates.dart @@ -45,6 +45,7 @@ const _visibleTypes = { Category, Class, Constructor, + DefinedElementType, Documentable, Enum, Extension, From 2a440a0d9c22e560748a8e277ffcdb8f6732d068 Mon Sep 17 00:00:00 2001 From: Janice Collins Date: Thu, 3 Jun 2021 13:27:42 -0700 Subject: [PATCH 9/9] Comments and type cleanup --- lib/src/element_type.dart | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/src/element_type.dart b/lib/src/element_type.dart index f1e78dc60f..ba2da3912f 100644 --- a/lib/src/element_type.dart +++ b/lib/src/element_type.dart @@ -54,8 +54,13 @@ abstract class ElementType extends Privacy with CommentReferable, Nameable { var isGenericTypeAlias = f.aliasElement != null && f is! InterfaceType; if (f is FunctionType) { assert(f is ParameterizedType); + // This is an indication we have an extremely out of date analyzer.... assert( !isGenericTypeAlias, 'should never occur: out of date analyzer?'); + // And finally, delete this case and its associated class + // after https://dart-review.googlesource.com/c/sdk/+/201520 + // is in all published versions of analyzer this version of dartdoc + // is compatible with. return CallableElementType( f, library, packageGraph, element, returnedFrom); } else if (isGenericTypeAlias) { @@ -158,7 +163,7 @@ class UndefinedElementType extends ElementType { /// A FunctionType that does not have an underpinning Element. class FunctionTypeElementType extends UndefinedElementType with Rendered, Callable { - FunctionTypeElementType(DartType f, Library library, + FunctionTypeElementType(FunctionType f, Library library, PackageGraph packageGraph, ElementType returnedFrom) : super(f, library, packageGraph, returnedFrom); @@ -177,9 +182,12 @@ class FunctionTypeElementType extends UndefinedElementType class AliasedFunctionTypeElementType extends FunctionTypeElementType with Aliased { - AliasedFunctionTypeElementType(DartType f, Library library, + AliasedFunctionTypeElementType(FunctionType f, Library library, PackageGraph packageGraph, ElementType returnedFrom) - : super(f, library, packageGraph, returnedFrom); + : super(f, library, packageGraph, returnedFrom) { + assert(type.aliasElement != null); + assert(type.aliasArguments != null); + } @override ElementTypeRenderer get _renderer =>