From f8b27a3b996680a791a75f662930a0bb2e0bcfc2 Mon Sep 17 00:00:00 2001 From: Janice Collins Date: Thu, 11 Mar 2021 13:18:14 -0800 Subject: [PATCH 01/13] clean up element types and add display aliases test --- lib/src/element_type.dart | 44 ++++++++++------------ lib/src/model/accessor.dart | 6 ++- lib/src/model/field.dart | 2 +- lib/src/model/method.dart | 6 ++- lib/src/model/model_function.dart | 2 +- lib/src/model/typedef.dart | 8 +++- lib/src/render/element_type_renderer.dart | 10 +---- lib/src/render/parameter_renderer.dart | 11 +++--- lib/templates/html/_type.html | 3 +- lib/templates/html/_type_multiline.html | 2 +- test/end2end/model_special_cases_test.dart | 11 ++++++ test/end2end/model_test.dart | 14 ++++--- 12 files changed, 67 insertions(+), 52 deletions(-) diff --git a/lib/src/element_type.dart b/lib/src/element_type.dart index 603e0c5973..b4fd1f2809 100644 --- a/lib/src/element_type.dart +++ b/lib/src/element_type.dart @@ -60,10 +60,6 @@ abstract class ElementType extends Privacy { bool get canHaveParameters => false; - // TODO(jcollins-g): change clients of ElementType to use subtypes more consistently - // and eliminate createLinkedReturnTypeName (instead, using returnType.linkedName); - String createLinkedReturnTypeName() => linkedName; - bool get isTypedef => false; String get linkedName; @@ -88,7 +84,7 @@ abstract class ElementType extends Privacy { } /// An unmodifiable list of this element type's parameters. - List get parameters => const []; + List get parameters; DartType get instantiatedType; @@ -147,22 +143,25 @@ class UndefinedElementType extends ElementType { @override String get linkedName => name; + + @override + // TODO(jcollins-g): remove the need for an empty list here. + List get parameters => []; } /// A FunctionType that does not have an underpinning Element. -class FunctionTypeElementType extends UndefinedElementType { +class FunctionTypeElementType extends UndefinedElementType + with CallableElementTypeMixin { FunctionTypeElementType(DartType f, Library library, PackageGraph packageGraph, ElementType returnedFrom) : super(f, library, packageGraph, returnedFrom); - @override - FunctionType get type => super.type; - @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, this); @@ -172,11 +171,7 @@ class FunctionTypeElementType extends UndefinedElementType { return _linkedName; } - @override - String createLinkedReturnTypeName() => returnType.linkedName; - String _nameWithGenerics; - @override String get nameWithGenerics { _nameWithGenerics ??= _renderer.renderNameWithGenerics(this); @@ -214,7 +209,7 @@ class ParameterizedElementType extends DefinedElementType { return _nameWithGenerics; } - ElementTypeRenderer get _renderer => + ElementTypeRenderer get _renderer => packageGraph.rendererFactory.parameterizedElementTypeRenderer; } @@ -279,9 +274,6 @@ abstract class DefinedElementType extends ElementType { return _returnType; } - @override - String createLinkedReturnTypeName() => returnType.linkedName; - Iterable _typeArguments; /// An unmodifiable list of this element type's parameters. @@ -339,13 +331,14 @@ abstract class DefinedElementType extends ElementType { } /// Any callable ElementType will mix-in this class, whether anonymous or not. -abstract class CallableElementTypeMixin implements ParameterizedElementType { - @override +abstract class CallableElementTypeMixin implements ElementType { + Iterable _typeArguments; + ModelElement get returnElement => returnType is DefinedElementType ? (returnType as DefinedElementType).element : null; - @override + ElementType _returnType; ElementType get returnType { _returnType ??= ElementType.from(type.returnType, library, packageGraph, this); @@ -355,7 +348,6 @@ abstract class CallableElementTypeMixin implements ParameterizedElementType { @override FunctionType get type => _type; - @override // TODO(jcollins-g): Rewrite this and improve object model so this doesn't // require type checking everywhere. Iterable get typeArguments { @@ -412,12 +404,16 @@ class CallableElementType extends ParameterizedElementType @override String get linkedName { - _linkedName ??= _renderer.renderLinkedName(this); + if (_linkedName == null) { + if (name != null && name.isNotEmpty) { + _linkedName = super.linkedName; + } else { + _linkedName = _renderer.renderLinkedName(this); + } + } return _linkedName; } - String get superLinkedName => super.linkedName; - @override ElementTypeRenderer get _renderer => packageGraph.rendererFactory.callableElementTypeRenderer; diff --git a/lib/src/model/accessor.dart b/lib/src/model/accessor.dart index ff84496267..f80d6b7d12 100644 --- a/lib/src/model/accessor.dart +++ b/lib/src/model/accessor.dart @@ -4,6 +4,7 @@ import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/src/dart/element/member.dart' show Member; +import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/model/model.dart'; import 'package:dartdoc/src/render/source_code_renderer.dart'; import 'package:dartdoc/src/utils.dart'; @@ -20,9 +21,12 @@ class Accessor extends ModelElement implements EnclosedElement { String get linkedReturnType { assert(isGetter); - return modelType.createLinkedReturnTypeName(); + return modelType.returnType.linkedName; } + @override + CallableElementTypeMixin get modelType => super.modelType; + bool get isSynthetic => element.isSynthetic; SourceCodeRenderer get _sourceCodeRenderer => diff --git a/lib/src/model/field.dart b/lib/src/model/field.dart index dcf4570f56..83584e54d5 100644 --- a/lib/src/model/field.dart +++ b/lib/src/model/field.dart @@ -200,7 +200,7 @@ class Field extends ModelElement } @override - CallableElementType get modelType => super.modelType; + CallableElementTypeMixin get modelType => super.modelType; @override Inheritable get overriddenElement => null; diff --git a/lib/src/model/method.dart b/lib/src/model/method.dart index 496cb1d494..1c6a42cd20 100644 --- a/lib/src/model/method.dart +++ b/lib/src/model/method.dart @@ -5,6 +5,7 @@ import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/source/line_info.dart'; import 'package:analyzer/src/dart/element/member.dart' show Member; +import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/model/model.dart'; class Method extends ModelElement @@ -92,7 +93,10 @@ class Method extends ModelElement @override String get kind => 'method'; - String get linkedReturnType => modelType.createLinkedReturnTypeName(); + String get linkedReturnType => modelType.returnType.linkedName; + + @override + CallableElementTypeMixin get modelType => super.modelType; @override Method get overriddenElement { diff --git a/lib/src/model/model_function.dart b/lib/src/model/model_function.dart index e5db7fab74..c59a0b94f8 100644 --- a/lib/src/model/model_function.dart +++ b/lib/src/model/model_function.dart @@ -66,7 +66,7 @@ class ModelFunctionTyped extends ModelElement @override String get kind => 'function'; - String get linkedReturnType => modelType.createLinkedReturnTypeName(); + String get linkedReturnType => modelType.returnType.linkedName; // Food for mustache. TODO(jcollins-g): what about enclosing elements? bool get isInherited => false; diff --git a/lib/src/model/typedef.dart b/lib/src/model/typedef.dart index 07f10bfd2f..e49c2dd2cb 100644 --- a/lib/src/model/typedef.dart +++ b/lib/src/model/typedef.dart @@ -4,6 +4,7 @@ import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/type.dart'; +import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/model/model.dart'; import 'package:dartdoc/src/render/typedef_renderer.dart'; @@ -49,8 +50,6 @@ class Typedef extends ModelElement @override String get kind => 'typedef'; - String get linkedReturnType => modelType.createLinkedReturnTypeName(); - @override List get typeParameters => element.typeParameters.map((f) { return ModelElement.from(f, library, packageGraph) as TypeParameter; @@ -79,4 +78,9 @@ class FunctionTypedef extends Typedef { } return super.genericTypeParameters; } + + String get linkedReturnType => modelType.returnType.linkedName; + + @override + CallableElementTypeMixin get modelType => super.modelType; } diff --git a/lib/src/render/element_type_renderer.dart b/lib/src/render/element_type_renderer.dart index 66124adae5..bd474c1d09 100644 --- a/lib/src/render/element_type_renderer.dart +++ b/lib/src/render/element_type_renderer.dart @@ -87,10 +87,6 @@ class CallableElementTypeRendererHtml extends ElementTypeRenderer { @override String renderLinkedName(CallableElementType elementType) { - if (elementType.name != null && elementType.name.isNotEmpty) { - return elementType.superLinkedName; - } - var buf = StringBuffer(); buf.write(elementType.nameWithGenerics); buf.write('('); @@ -168,15 +164,11 @@ class CallableElementTypeRendererMd extends ElementTypeRenderer { @override String renderLinkedName(CallableElementType elementType) { - if (elementType.name != null && elementType.name.isNotEmpty) { - return elementType.superLinkedName; - } - var buf = StringBuffer(); buf.write(elementType.nameWithGenerics); buf.write('('); buf.write(ParameterRendererMd() - .renderLinkedParams(elementType.element.parameters, showNames: false) + .renderLinkedParams(elementType.parameters, showNames: false) .trim()); buf.write(') → '); buf.write(elementType.returnType.linkedName); diff --git a/lib/src/render/parameter_renderer.dart b/lib/src/render/parameter_renderer.dart index c92c66503c..5f932e74ec 100644 --- a/lib/src/render/parameter_renderer.dart +++ b/lib/src/render/parameter_renderer.dart @@ -165,13 +165,12 @@ abstract class ParameterRenderer { if (param.isCovariant) { buf.write(covariant('covariant') + ' '); } - if (paramModelType is CallableElementTypeMixin || - paramModelType.type is FunctionType) { + if (paramModelType is CallableElementTypeMixin) { String returnTypeName; if (paramModelType.isTypedef) { returnTypeName = paramModelType.linkedName; } else { - returnTypeName = paramModelType.createLinkedReturnTypeName(); + returnTypeName = paramModelType.returnType.linkedName; } buf.write(typeName(returnTypeName)); if (showNames) { @@ -182,8 +181,10 @@ abstract class ParameterRenderer { } if (!paramModelType.isTypedef && paramModelType is DefinedElementType) { buf.write('('); - buf.write(renderLinkedParams(paramModelType.element.parameters, - showMetadata: showMetadata, showNames: showNames)); + buf.write(renderLinkedParams( + (paramModelType as DefinedElementType).element.parameters, + showMetadata: showMetadata, + showNames: showNames)); buf.write(')'); buf.write(paramModelType.nullabilitySuffix); } diff --git a/lib/templates/html/_type.html b/lib/templates/html/_type.html index 7ac5632cfc..f5851e88ee 100644 --- a/lib/templates/html/_type.html +++ b/lib/templates/html/_type.html @@ -1,7 +1,6 @@
{{{linkedName}}}{{{linkedGenericParameters}}} - = - {{{ linkedReturnType }}} + = {{{ modelType.linkedName }}} {{>categorization}}
diff --git a/lib/templates/html/_type_multiline.html b/lib/templates/html/_type_multiline.html index 71b80368df..987a3f7e8f 100644 --- a/lib/templates/html/_type_multiline.html +++ b/lib/templates/html/_type_multiline.html @@ -7,4 +7,4 @@ {{/hasAnnotations}} -{{>name_summary}}{{{genericParameters}}} = {{{linkedReturnType}}} +{{>name_summary}}{{{genericParameters}}} = {{{modelType.linkedName}}} diff --git a/test/end2end/model_special_cases_test.dart b/test/end2end/model_special_cases_test.dart index 9d8ea3ab16..c46e22e1b6 100644 --- a/test/end2end/model_special_cases_test.dart +++ b/test/end2end/model_special_cases_test.dart @@ -82,6 +82,7 @@ void main() { group('generalized typedefs', () { Library generalizedTypedefs; Typedef T0, T1, T2, T3, T4, T5, T6, T7; + Class C; setUpAll(() async { generalizedTypedefs = (await _testPackageGraphExperiments) @@ -95,6 +96,7 @@ void main() { T5 = generalizedTypedefs.typedefs.firstWhere((a) => a.name == 'T5'); T6 = generalizedTypedefs.typedefs.firstWhere((a) => a.name == 'T6'); T7 = generalizedTypedefs.typedefs.firstWhere((a) => a.name == 'T7'); + C = generalizedTypedefs.classes.firstWhere((c) => c.name == 'C'); }); void expectTypedefs(Typedef t, String modelTypeToString, @@ -104,6 +106,15 @@ void main() { orderedEquals(genericParameters)); } + test('typedef references display aliases', () { + var f = C.allFields.firstWhere((f) => f.name == 'f'); + var g = C.instanceMethods.firstWhere((m) => m.name == 'g'); + expect(f.modelType.name, equals('T0')); + expect(g.modelType.returnType.name, equals('T1')); + expect(g.modelType.parameters.first.modelType.name, equals('T2')); + expect(g.modelType.parameters.last.modelType.name, equals('T3')); + }); + test('basic non-function typedefs work', () { expectTypedefs(T0, 'void', []); expectTypedefs(T1, 'Function', []); diff --git a/test/end2end/model_test.dart b/test/end2end/model_test.dart index 1454765bbb..bac9d3f798 100644 --- a/test/end2end/model_test.dart +++ b/test/end2end/model_test.dart @@ -2781,7 +2781,7 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, }); test('return type', () { - expect(isGreaterThan.modelType.createLinkedReturnTypeName(), 'bool'); + expect(isGreaterThan.modelType.returnType.linkedName, 'bool'); }); test('return type has Future', () { @@ -2795,7 +2795,11 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, test('parameter is a function', () { var functionArgParam = m4.parameters[1]; - expect(functionArgParam.modelType.createLinkedReturnTypeName(), 'String'); + expect( + (functionArgParam.modelType as CallableElementTypeMixin) + .returnType + .linkedName, + 'String'); }); test('method overrides another', () { @@ -3677,9 +3681,9 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, }); group('Typedef', () { - Typedef processMessage; - Typedef generic; - Typedef aComplexTypedef; + FunctionTypedef processMessage; + FunctionTypedef generic; + FunctionTypedef aComplexTypedef; Class TypedefUsingClass; setUpAll(() { From b5a3cd6f4eea928103cab8de1d3f8132f9cb51f2 Mon Sep 17 00:00:00 2001 From: Janice Collins Date: Fri, 12 Mar 2021 10:14:10 -0800 Subject: [PATCH 02/13] Everything except the actual change I want to make --- lib/src/model/accessor.dart | 5 - lib/src/model/field.dart | 4 +- lib/src/model/getter_setter_combo.dart | 13 +-- lib/src/model/method.dart | 2 - lib/src/model/model_element.dart | 4 +- lib/src/model/model_function.dart | 2 - lib/src/model/top_level_variable.dart | 4 - lib/src/model/typedef.dart | 2 - test/end2end/model_special_cases_test.dart | 15 ++- test/end2end/model_test.dart | 101 +++++++++--------- .../lib/generalized_typedefs.dart | 13 ++- 11 files changed, 86 insertions(+), 79 deletions(-) diff --git a/lib/src/model/accessor.dart b/lib/src/model/accessor.dart index f80d6b7d12..831b93ca16 100644 --- a/lib/src/model/accessor.dart +++ b/lib/src/model/accessor.dart @@ -19,11 +19,6 @@ class Accessor extends ModelElement implements EnclosedElement { [Member /*?*/ originalMember]) : super(element, library, packageGraph, originalMember); - String get linkedReturnType { - assert(isGetter); - return modelType.returnType.linkedName; - } - @override CallableElementTypeMixin get modelType => super.modelType; diff --git a/lib/src/model/field.dart b/lib/src/model/field.dart index 83584e54d5..528c059c3d 100644 --- a/lib/src/model/field.dart +++ b/lib/src/model/field.dart @@ -4,7 +4,6 @@ import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/src/dart/element/element.dart'; -import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/model/model.dart'; import 'package:dartdoc/src/render/source_code_renderer.dart'; @@ -199,8 +198,7 @@ class Field extends ModelElement } } - @override - CallableElementTypeMixin get modelType => super.modelType; + @override Inheritable get overriddenElement => null; diff --git a/lib/src/model/getter_setter_combo.dart b/lib/src/model/getter_setter_combo.dart index 7b17289bb2..f9c8006cd5 100644 --- a/lib/src/model/getter_setter_combo.dart +++ b/lib/src/model/getter_setter_combo.dart @@ -8,6 +8,7 @@ import 'package:analyzer/dart/ast/ast.dart'; import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/source/line_info.dart'; import 'package:analyzer/src/dart/element/element.dart'; +import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/model/model.dart'; import 'package:dartdoc/src/utils.dart'; import 'package:dartdoc/src/warnings.dart'; @@ -179,14 +180,10 @@ mixin GetterSetterCombo on ModelElement { return buffer.toString(); } - String get linkedReturnType { - if (hasGetter) { - return getter.linkedReturnType; - } else { - // TODO(jcollins-g): this results in the wrong span class for the return - // type. - return setter.linkedParamsNoMetadataOrNames; - } + @override + ElementType get modelType { + if (hasGetter) return getter.modelType.returnType; + return setter.parameters.first.modelType; } @override diff --git a/lib/src/model/method.dart b/lib/src/model/method.dart index 1c6a42cd20..8583a440eb 100644 --- a/lib/src/model/method.dart +++ b/lib/src/model/method.dart @@ -93,8 +93,6 @@ class Method extends ModelElement @override String get kind => 'method'; - String get linkedReturnType => modelType.returnType.linkedName; - @override CallableElementTypeMixin get modelType => super.modelType; diff --git a/lib/src/model/model_element.dart b/lib/src/model/model_element.dart index e908dd780b..95d987bfb2 100644 --- a/lib/src/model/model_element.dart +++ b/lib/src/model/model_element.dart @@ -984,7 +984,9 @@ abstract class ModelElement extends Canonicalization String get linkedParamsNoMetadataOrNames => _parameterRenderer .renderLinkedParams(parameters, showMetadata: false, showNames: false); - ElementType get modelType { + ElementType get modelType => modelTypeReal; + + ElementType get modelTypeReal { var element = this.element; if (_modelType == null) { // TODO(jcollins-g): Need an interface for a "member with a type" (or changed object model). diff --git a/lib/src/model/model_function.dart b/lib/src/model/model_function.dart index c59a0b94f8..bb6c4ccca7 100644 --- a/lib/src/model/model_function.dart +++ b/lib/src/model/model_function.dart @@ -66,8 +66,6 @@ class ModelFunctionTyped extends ModelElement @override String get kind => 'function'; - String get linkedReturnType => modelType.returnType.linkedName; - // Food for mustache. TODO(jcollins-g): what about enclosing elements? bool get isInherited => false; diff --git a/lib/src/model/top_level_variable.dart b/lib/src/model/top_level_variable.dart index 0128736ab5..bf0c2fc317 100644 --- a/lib/src/model/top_level_variable.dart +++ b/lib/src/model/top_level_variable.dart @@ -3,7 +3,6 @@ // BSD-style license that can be found in the LICENSE file. import 'package:analyzer/dart/element/element.dart'; -import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/model/model.dart'; /// Top-level variables. But also picks up getters and setters? @@ -86,8 +85,5 @@ class TopLevelVariable extends ModelElement @override String get fileName => '${isConst ? '$name-constant' : name}.$fileType'; - @override - DefinedElementType get modelType => super.modelType; - TopLevelVariableElement get _variable => (element as TopLevelVariableElement); } diff --git a/lib/src/model/typedef.dart b/lib/src/model/typedef.dart index e49c2dd2cb..1401da1c7f 100644 --- a/lib/src/model/typedef.dart +++ b/lib/src/model/typedef.dart @@ -79,8 +79,6 @@ class FunctionTypedef extends Typedef { return super.genericTypeParameters; } - String get linkedReturnType => modelType.returnType.linkedName; - @override CallableElementTypeMixin get modelType => super.modelType; } diff --git a/test/end2end/model_special_cases_test.dart b/test/end2end/model_special_cases_test.dart index c46e22e1b6..a508adad12 100644 --- a/test/end2end/model_special_cases_test.dart +++ b/test/end2end/model_special_cases_test.dart @@ -82,7 +82,7 @@ void main() { group('generalized typedefs', () { Library generalizedTypedefs; Typedef T0, T1, T2, T3, T4, T5, T6, T7; - Class C; + Class C, C2; setUpAll(() async { generalizedTypedefs = (await _testPackageGraphExperiments) @@ -97,6 +97,7 @@ void main() { T6 = generalizedTypedefs.typedefs.firstWhere((a) => a.name == 'T6'); T7 = generalizedTypedefs.typedefs.firstWhere((a) => a.name == 'T7'); C = generalizedTypedefs.classes.firstWhere((c) => c.name == 'C'); + C2 = generalizedTypedefs.classes.firstWhere((c) => c.name == 'C2'); }); void expectTypedefs(Typedef t, String modelTypeToString, @@ -109,6 +110,18 @@ void main() { test('typedef references display aliases', () { var f = C.allFields.firstWhere((f) => f.name == 'f'); var g = C.instanceMethods.firstWhere((m) => m.name == 'g'); + var a = generalizedTypedefs.properties.firstWhere((p) => p.name == 'a'); + var b = C2.allFields.firstWhere((f) => f.name == 'b'); + var c = C2.allFields.firstWhere((f) => f.name == 'c'); + var d = C2.instanceMethods.firstWhere((f) => f.name == 'd'); + + expect(a.modelType.name, equals('T0')); + expect(b.modelType.name, equals('T0')); + expect(c.modelType.name, equals('T1')); + expect(d.modelType.returnType.name, equals('T2')); + expect(d.parameters.first.modelType.name, equals('T3')); + expect(d.parameters.last.modelType.name, equals('T4')); + expect(f.modelType.name, equals('T0')); expect(g.modelType.returnType.name, equals('T1')); expect(g.modelType.parameters.first.modelType.name, equals('T2')); diff --git a/test/end2end/model_test.dart b/test/end2end/model_test.dart index bac9d3f798..54d233c80f 100644 --- a/test/end2end/model_test.dart +++ b/test/end2end/model_test.dart @@ -215,19 +215,19 @@ void main() { // analyzer instead of setting up 'isLate'. expect(c.instanceFields.any((f) => f.name == 'late'), isFalse); - expect(a.modelType.returnType.name, equals('dynamic')); + expect(a.modelType.name, equals('dynamic')); expect(a.isLate, isTrue); expect(a.features, contains('late')); - expect(b.modelType.returnType.name, equals('int')); + expect(b.modelType.name, equals('int')); expect(b.isLate, isTrue); expect(b.features, contains('late')); - expect(cField.modelType.returnType.name, equals('dynamic')); + expect(cField.modelType.name, equals('dynamic')); expect(cField.isLate, isTrue); expect(cField.features, contains('late')); - expect(dField.modelType.returnType.name, equals('double')); + expect(dField.modelType.name, equals('double')); expect(dField.isLate, isTrue); expect(dField.features, contains('late')); }); @@ -235,7 +235,7 @@ void main() { test('Late final top level variables', () { var initializeMe = lateFinalWithoutInitializer.publicProperties .firstWhere((v) => v.name == 'initializeMe'); - expect(initializeMe.modelType.returnType.name, equals('String')); + expect(initializeMe.modelType.name, equals('String')); expect(initializeMe.isLate, isTrue); expect(initializeMe.features, contains('late')); }); @@ -260,10 +260,10 @@ void main() { equals( 'ComplexNullableMembers<T extends String?>')); expect( - aComplexType.linkedReturnType, + aComplexType.modelType.linkedName, equals( 'Map<T?, String?>')); - expect(aComplexSetterOnlyType.linkedReturnType, equals( + expect(aComplexSetterOnlyType.modelType.linkedName, equals( // TODO(jcollins-g): fix wrong span class for setter-only return type (#2226) 'List<Map<T?, String?>?>')); }); @@ -281,16 +281,16 @@ void main() { .firstWhere((f) => f.name == 'operator *'); expect(nullableMembers.isNullSafety, isTrue); expect( - nullableField.linkedReturnType, + nullableField.modelType.linkedName, equals( 'Iterable<BigInt>?')); expect( methodWithNullables.linkedParams, equals( 'String? foo')); - expect(methodWithNullables.linkedReturnType, equals('int?')); + expect(methodWithNullables.modelType.returnType.linkedName, equals('int?')); expect( - initialized.linkedReturnType, + initialized.modelType.linkedName, equals( 'Map<String, Map>?')); expect( @@ -324,25 +324,25 @@ void main() { test('Set literals test', () { expect(aComplexSet.modelType.name, equals('Set')); - expect(aComplexSet.modelType.typeArguments.map((a) => a.name).toList(), + expect((aComplexSet.modelType as ParameterizedElementType).typeArguments.map((a) => a.name).toList(), equals(['AClassContainingLiterals'])); expect(aComplexSet.constantValue, equals('const {const AClassContainingLiterals(3, 5)}')); expect(inferredTypeSet.modelType.name, equals('Set')); expect( - inferredTypeSet.modelType.typeArguments.map((a) => a.name).toList(), + (inferredTypeSet.modelType as ParameterizedElementType).typeArguments. map((a) => a.name).toList(), equals(['int'])); expect(inferredTypeSet.constantValue, equals('const {1, 3, 5}')); expect(specifiedSet.modelType.name, equals('Set')); - expect(specifiedSet.modelType.typeArguments.map((a) => a.name).toList(), + expect((specifiedSet.modelType as ParameterizedElementType).typeArguments.map((a) => a.name).toList(), equals(['int'])); expect(specifiedSet.constantValue, equals('const {}')); expect(untypedMap.modelType.name, equals('Map')); - expect(untypedMap.modelType.typeArguments.map((a) => a.name).toList(), + expect((untypedMap.modelType as ParameterizedElementType).typeArguments.map((a) => a.name).toList(), equals(['dynamic', 'dynamic'])); expect(untypedMap.constantValue, equals('const {}')); expect(typedSet.modelType.name, equals('Set')); - expect(typedSet.modelType.typeArguments.map((a) => a.name).toList(), + expect((typedSet.modelType as ParameterizedElementType).typeArguments.map((a) => a.name).toList(), equals(['String'])); expect(typedSet.constantValue, matches(RegExp(r'const <String>\s?{}'))); @@ -1908,13 +1908,13 @@ void main() { equals('${htmlBasePlaceholder}ex/Deprecated/expires.html')); }); - test('exported class should have linkedReturnType for the current library', + test('exported class should have modelType.returnType.linkedName for the current library', () { var returnCool = Cool.instanceMethods .firstWhere((m) => m.name == 'returnCool', orElse: () => null); expect(returnCool, isNotNull); expect( - returnCool.linkedReturnType, + returnCool.modelType.returnType.linkedName, equals( 'Cool')); }); @@ -2416,7 +2416,7 @@ void main() { test('async function', () { expect(thisIsAsync.isAsynchronous, isTrue); - expect(thisIsAsync.linkedReturnType, equals('Future')); + expect(thisIsAsync.modelType.returnType.linkedName, equals('Future')); expect( thisIsAsync.documentation, equals( @@ -2429,13 +2429,13 @@ void main() { test('function returning FutureOr', () { expect(thisIsFutureOr.isAsynchronous, isFalse); - expect(thisIsFutureOr.linkedReturnType, equals('FutureOr')); + expect(thisIsFutureOr.modelType.returnType.linkedName, equals('FutureOr')); }); test('function returning FutureOr', () { expect(thisIsFutureOrNull.isAsynchronous, isFalse); expect( - thisIsFutureOrNull.linkedReturnType, + thisIsFutureOrNull.modelType.returnType.linkedName, equals( 'FutureOr<Null>')); }); @@ -2443,7 +2443,7 @@ void main() { test('function returning FutureOr', () { expect(thisIsFutureOrNull.isAsynchronous, isFalse); expect( - thisIsFutureOrT.linkedReturnType, + thisIsFutureOrT.modelType.returnType.linkedName, equals( 'FutureOr<T>')); }); @@ -2542,7 +2542,7 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, // TODO(jcollins-g): really, these shouldn't be called "parameters" in // the span class. expect( - explicitSetter.linkedReturnType, + explicitSetter.modelType.linkedName, 'dynamic Function(int, ' 'Cool, ' 'List<int>)'); @@ -2551,14 +2551,14 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, test('parameterized type from field is correctly displayed', () { var aField = TemplatedInterface.instanceFields .singleWhere((f) => f.name == 'aField'); - expect(aField.linkedReturnType, + expect(aField.modelType.linkedName, 'AnotherParameterizedClass<Stream<List<int>>>'); }); test('parameterized type from inherited field is correctly displayed', () { var aInheritedField = TemplatedInterface.inheritedFields .singleWhere((f) => f.name == 'aInheritedField'); - expect(aInheritedField.linkedReturnType, + expect(aInheritedField.modelType.linkedName, 'AnotherParameterizedClass<List<int>>'); }); @@ -2568,7 +2568,7 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, Accessor aGetter = TemplatedInterface.instanceFields .singleWhere((f) => f.name == 'aGetter') .getter; - expect(aGetter.linkedReturnType, + expect(aGetter.modelType.returnType.linkedName, 'AnotherParameterizedClass<Map<A, List<String>>>'); }); @@ -2578,7 +2578,7 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, Accessor aInheritedGetter = TemplatedInterface.inheritedFields .singleWhere((f) => f.name == 'aInheritedGetter') .getter; - expect(aInheritedGetter.linkedReturnType, + expect(aInheritedGetter.modelType.returnType.linkedName, 'AnotherParameterizedClass<List<int>>'); }); @@ -2592,7 +2592,7 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, 'AnotherParameterizedClass<List<int>>'); // TODO(jcollins-g): really, these shouldn't be called "parameters" in // the span class. - expect(aInheritedSetter.enclosingCombo.linkedReturnType, + expect(aInheritedSetter.enclosingCombo.modelType.linkedName, 'AnotherParameterizedClass<List<int>>'); }); @@ -2601,7 +2601,7 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, () { var aMethodInterface = TemplatedInterface.instanceMethods .singleWhere((m) => m.name == 'aMethodInterface'); - expect(aMethodInterface.linkedReturnType, + expect(aMethodInterface.modelType.returnType.linkedName, 'AnotherParameterizedClass<List<int>>'); }); @@ -2610,7 +2610,7 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, () { var aInheritedMethod = TemplatedInterface.instanceMethods .singleWhere((m) => m.name == 'aInheritedMethod'); - expect(aInheritedMethod.linkedReturnType, + expect(aInheritedMethod.modelType.returnType.linkedName, 'AnotherParameterizedClass<List<int>>'); }); @@ -2619,7 +2619,7 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, () { var aTypedefReturningMethodInterface = TemplatedInterface.instanceMethods .singleWhere((m) => m.name == 'aTypedefReturningMethodInterface'); - expect(aTypedefReturningMethodInterface.linkedReturnType, + expect(aTypedefReturningMethodInterface.modelType.returnType.linkedName, 'ParameterizedTypedef<List<String>>'); }); @@ -2628,7 +2628,7 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, () { var aInheritedTypedefReturningMethod = TemplatedInterface.instanceMethods .singleWhere((m) => m.name == 'aInheritedTypedefReturningMethod'); - expect(aInheritedTypedefReturningMethod.linkedReturnType, + expect(aInheritedTypedefReturningMethod.modelType.returnType.linkedName, 'ParameterizedTypedef<List<int>>'); }); @@ -2636,7 +2636,7 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, () { var aInheritedAdditionOperator = TemplatedInterface.inheritedOperators .singleWhere((m) => m.name == 'operator +'); - expect(aInheritedAdditionOperator.linkedReturnType, + expect(aInheritedAdditionOperator.modelType.returnType.linkedName, 'ParameterizedClass<List<int>>'); expect( ParameterRendererHtml() @@ -2702,7 +2702,7 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, test('verify parameter types are correctly displayed', () { expect( - getAFunctionReturningVoid.linkedReturnType, + getAFunctionReturningVoid.modelType.returnType.linkedName, equals( 'void Function(T1, T2)')); }); @@ -2711,7 +2711,7 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, 'verify type parameters to anonymous functions are distinct from normal parameters and instantiated type parameters from method, displayed correctly', () { expect( - getAFunctionReturningBool.linkedReturnType, + getAFunctionReturningBool.modelType.returnType.linkedName, equals( 'bool Function<T4>(String, T1, T4)')); }); @@ -2785,7 +2785,7 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, }); test('return type has Future', () { - expect(m7.linkedReturnType, contains('Future')); + expect(m7.modelType.returnType.linkedName, contains('Future')); }); test('parameter has generics in signature', () { @@ -3262,7 +3262,7 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, final fieldWithTypedef = apple.instanceFields.firstWhere((m) => m.name == 'fieldWithTypedef'); expect( - fieldWithTypedef.linkedReturnType, + fieldWithTypedef.modelType.linkedName, equals( 'ParameterizedTypedef<bool>')); }); @@ -3316,7 +3316,7 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, 'Verify that a map containing anonymous functions as values works correctly', () { var typeArguments = - (importantComputations.modelType.returnType as DefinedElementType) + (importantComputations.modelType as DefinedElementType) .typeArguments; expect(typeArguments, isNotEmpty); expect( @@ -3326,7 +3326,7 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, matches(RegExp( r'(dynamic|num) Function\(List<num> a\)'))); expect( - importantComputations.linkedReturnType, + importantComputations.modelType.linkedName, matches(RegExp( r'Map<int, (dynamic|num) Function\(List<num> a\)>'))); }); @@ -3335,7 +3335,7 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, 'Verify that a complex type parameter with an anonymous function works correctly', () { expect( - complicatedReturn.linkedReturnType, + complicatedReturn.modelType.linkedName, equals( 'ATypeTakingClass<String Function(int)>')); }); @@ -3373,10 +3373,11 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, }); test('type arguments are correct', () { - expect(mapWithDynamicKeys.modelType.typeArguments, hasLength(2)); - expect(mapWithDynamicKeys.modelType.typeArguments.first.name, + var modelType = mapWithDynamicKeys.modelType as ParameterizedElementType; + expect(modelType.typeArguments, hasLength(2)); + expect(modelType.typeArguments.first.name, equals('dynamic')); - expect(mapWithDynamicKeys.modelType.typeArguments.last.name, + expect(modelType.typeArguments.last.name, equals('String')); }); @@ -3389,11 +3390,11 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, }); test('linked return type is a double', () { - expect(v.linkedReturnType, 'double'); + expect(v.modelType.linkedName, 'double'); }); test('linked return type is dynamic', () { - expect(v3.linkedReturnType, 'dynamic'); + expect(v3.modelType.linkedName, 'dynamic'); }); test('just a getter has documentation', () { @@ -3612,7 +3613,7 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, test('a function returning a Future', () { expect( - returningFutureVoid.linkedReturnType, + returningFutureVoid.modelType.returnType.linkedName, equals( 'Future<void>')); }); @@ -3710,7 +3711,7 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, test('anonymous nested functions inside typedefs are handled', () { expect(aComplexTypedef, isNotNull); - expect(aComplexTypedef.linkedReturnType, startsWith('void Function')); + expect(aComplexTypedef.modelType.returnType.linkedName, startsWith('void Function')); expect( aComplexTypedef.nameWithGenerics, equals( @@ -3720,7 +3721,7 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, test('anonymous nested functions inside typedefs are handled correctly', () { expect( - aComplexTypedef.linkedReturnType, + aComplexTypedef.modelType.returnType.linkedName, equals( 'void Function(A1, A2, A3)')); expect( @@ -3748,9 +3749,9 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, }); test('linked return type', () { - expect(processMessage.linkedReturnType, equals('String')); + expect(processMessage.modelType.returnType.linkedName, equals('String')); expect( - generic.linkedReturnType, + generic.modelType.returnType.linkedName, equals( 'List<S>')); }); @@ -3856,7 +3857,7 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, }); test('async return type', () { - expect(asyncM.linkedReturnType, 'Future'); + expect(asyncM.modelType.returnType.linkedName, 'Future'); }); test('param with generics', () { diff --git a/testing/test_package_experiments/lib/generalized_typedefs.dart b/testing/test_package_experiments/lib/generalized_typedefs.dart index 658c8cd22a..8bcfbf5e11 100644 --- a/testing/test_package_experiments/lib/generalized_typedefs.dart +++ b/testing/test_package_experiments/lib/generalized_typedefs.dart @@ -17,7 +17,18 @@ typedef T5 = X Function(X, {X name}); typedef T6 = X Function(Y, [Map]); typedef T7> = X Function(Y, [Map]); -class C1 {} +T0 a; + +class C2 { + T0 b; + T1 c; + T2 d(T3 e, T4 f); +} + +class C1 { + T2 a; + T0 b(T1 c, T d); +} typedef T8 = C1; From 238de82f07176e199435e46952ef7c9d738e9a69 Mon Sep 17 00:00:00 2001 From: Janice Collins Date: Fri, 12 Mar 2021 11:30:15 -0800 Subject: [PATCH 03/13] Fix tests and update templates --- lib/templates/html/_accessor_getter.html | 2 +- lib/templates/html/_callable.html | 2 +- lib/templates/html/_callable_multiline.html | 2 +- lib/templates/html/_constant.html | 2 +- lib/templates/html/_property.html | 2 +- lib/templates/html/_type.html | 2 +- lib/templates/html/property.html | 2 +- lib/templates/html/top_level_property.html | 2 +- lib/templates/md/_accessor_getter.md | 2 +- lib/templates/md/_callable.md | 2 +- lib/templates/md/_callable_multiline.md | 2 +- lib/templates/md/_constant.md | 2 +- lib/templates/md/_property.md | 2 +- lib/templates/md/_type.md | 2 +- lib/templates/md/_type_multiline.md | 2 +- lib/templates/md/property.md | 2 +- lib/templates/md/top_level_property.md | 2 +- test/end2end/model_special_cases_test.dart | 2 +- test/end2end/model_test.dart | 12 +++--------- .../templates/_accessor_getter.html | 2 +- .../templates/_callable.html | 2 +- .../templates/_callable_multiline.html | 2 +- .../templates/_constant.html | 2 +- .../templates/_property.html | 2 +- .../templates/constant.html | 2 +- .../templates/property.html | 2 +- .../templates/top_level_property.html | 2 +- 27 files changed, 29 insertions(+), 35 deletions(-) diff --git a/lib/templates/html/_accessor_getter.html b/lib/templates/html/_accessor_getter.html index 4bc9e08e2d..9f3cf4dcf1 100644 --- a/lib/templates/html/_accessor_getter.html +++ b/lib/templates/html/_accessor_getter.html @@ -2,7 +2,7 @@
- {{{ linkedReturnType }}} + {{{ modelType.returnType.linkedName }}} {{>name_summary}} {{>features}}
diff --git a/lib/templates/html/_callable.html b/lib/templates/html/_callable.html index 7fb911b573..bc864dc735 100644 --- a/lib/templates/html/_callable.html +++ b/lib/templates/html/_callable.html @@ -1,6 +1,6 @@
{{{linkedName}}}{{{linkedGenericParameters}}}({{{ linkedParamsNoMetadata }}}) - → {{{ linkedReturnType }}} + → {{{ modelType.returnType.linkedName }}} {{>categorization}}
diff --git a/lib/templates/html/_callable_multiline.html b/lib/templates/html/_callable_multiline.html index ab0fa11769..78afd0c7f5 100644 --- a/lib/templates/html/_callable_multiline.html +++ b/lib/templates/html/_callable_multiline.html @@ -8,5 +8,5 @@ {{/hasAnnotations}} -{{{ linkedReturnType }}} +{{{ modelType.returnType.linkedName }}} {{>name_summary}}{{{genericParameters}}}({{#hasParameters}}{{{linkedParamsLines}}}{{/hasParameters}}) diff --git a/lib/templates/html/_constant.html b/lib/templates/html/_constant.html index 72d367c667..f12c94d20a 100644 --- a/lib/templates/html/_constant.html +++ b/lib/templates/html/_constant.html @@ -1,6 +1,6 @@
{{{ linkedName }}} - → const {{{ linkedReturnType }}} + → const {{{ modelType.linkedName }}} {{>categorization}}
diff --git a/lib/templates/html/_property.html b/lib/templates/html/_property.html index 09f61f67e0..dc58959e80 100644 --- a/lib/templates/html/_property.html +++ b/lib/templates/html/_property.html @@ -1,6 +1,6 @@
{{{linkedName}}} - {{{ arrow }}} {{{ linkedReturnType }}} {{>categorization}} + {{{ arrow }}} {{{ modelType.linkedName }}} {{>categorization}}
{{{ oneLineDoc }}} {{{ extendedDocLink }}} diff --git a/lib/templates/html/_type.html b/lib/templates/html/_type.html index f5851e88ee..8adc172135 100644 --- a/lib/templates/html/_type.html +++ b/lib/templates/html/_type.html @@ -1,6 +1,6 @@
{{{linkedName}}}{{{linkedGenericParameters}}} - = {{{ modelType.linkedName }}} + = {{{ modelType.linkedName }}} {{>categorization}}
diff --git a/lib/templates/html/property.html b/lib/templates/html/property.html index a3dbf40e85..5044c41c05 100644 --- a/lib/templates/html/property.html +++ b/lib/templates/html/property.html @@ -14,7 +14,7 @@
{{parent.name}} {{parent.kind}}
{{#self}} {{#hasNoGetterSetter}}
- {{{ linkedReturnType }}} + {{{ modelType.linkedName }}} {{>name_summary}} {{>features}}
diff --git a/lib/templates/html/top_level_property.html b/lib/templates/html/top_level_property.html index 49565c6c01..7f9c734dc5 100644 --- a/lib/templates/html/top_level_property.html +++ b/lib/templates/html/top_level_property.html @@ -12,7 +12,7 @@
{{parent.name}} {{parent.kind}}
{{#hasNoGetterSetter}}
- {{{ linkedReturnType }}} + {{{ modelType.linkedName }}} {{>name_summary}} {{>features}}
diff --git a/lib/templates/md/_accessor_getter.md b/lib/templates/md/_accessor_getter.md index b04c749201..fb07e7f650 100644 --- a/lib/templates/md/_accessor_getter.md +++ b/lib/templates/md/_accessor_getter.md @@ -1,5 +1,5 @@ {{#getter}} -{{{ linkedReturnType }}} {{>name_summary}} {{!two spaces intentional}} +{{{ modelType.returnType.linkedName }}} {{>name_summary}} {{!two spaces intentional}} {{>features}} {{>documentation}} diff --git a/lib/templates/md/_callable.md b/lib/templates/md/_callable.md index 12560c75fd..c56df18e06 100644 --- a/lib/templates/md/_callable.md +++ b/lib/templates/md/_callable.md @@ -1,4 +1,4 @@ -##### {{{linkedName}}}{{{linkedGenericParameters}}}({{{ linkedParamsNoMetadata }}}) {{{ linkedReturnType }}} +##### {{{linkedName}}}{{{linkedGenericParameters}}}({{{ linkedParamsNoMetadata }}}) {{{ modelType.returnType.linkedName }}} {{>categorization}} {{{ oneLineDoc }}} {{{ extendedDocLink }}} {{!two spaces intentional}} diff --git a/lib/templates/md/_callable_multiline.md b/lib/templates/md/_callable_multiline.md index cec0056a7e..edb8b9d1e6 100644 --- a/lib/templates/md/_callable_multiline.md +++ b/lib/templates/md/_callable_multiline.md @@ -4,4 +4,4 @@ {{/annotations}} {{/hasAnnotations}} -{{{ linkedReturnType }}} {{>name_summary}}{{{genericParameters}}}({{#hasParameters}}{{{linkedParamsLines}}}{{/hasParameters}}) +{{{ modelType.returnType.linkedName }}} {{>name_summary}}{{{genericParameters}}}({{#hasParameters}}{{{linkedParamsLines}}}{{/hasParameters}}) diff --git a/lib/templates/md/_constant.md b/lib/templates/md/_constant.md index c7e3745c61..c36fc1d32e 100644 --- a/lib/templates/md/_constant.md +++ b/lib/templates/md/_constant.md @@ -1,4 +1,4 @@ -##### {{{ linkedName }}} const {{{ linkedReturnType }}} +##### {{{ linkedName }}} const {{{ modelType.linkedName }}} {{>categorization}} {{{ oneLineDoc }}} {{{ extendedDocLink }}} {{!two spaces intentional}} diff --git a/lib/templates/md/_property.md b/lib/templates/md/_property.md index 64883efda1..110f42c23a 100644 --- a/lib/templates/md/_property.md +++ b/lib/templates/md/_property.md @@ -1,4 +1,4 @@ -##### {{{linkedName}}} {{{ arrow }}} {{{ linkedReturnType }}} +##### {{{linkedName}}} {{{ arrow }}} {{{ modelType.linkedName }}} {{>categorization}} {{{ oneLineDoc }}} {{{ extendedDocLink }}} {{!two spaces intentional}} diff --git a/lib/templates/md/_type.md b/lib/templates/md/_type.md index 12560c75fd..39a16f3bfd 100644 --- a/lib/templates/md/_type.md +++ b/lib/templates/md/_type.md @@ -1,4 +1,4 @@ -##### {{{linkedName}}}{{{linkedGenericParameters}}}({{{ linkedParamsNoMetadata }}}) {{{ linkedReturnType }}} +##### {{{linkedName}}}{{{linkedGenericParameters}}}({{{ linkedParamsNoMetadata }}}) {{{ modelType.linkedName }}} {{>categorization}} {{{ oneLineDoc }}} {{{ extendedDocLink }}} {{!two spaces intentional}} diff --git a/lib/templates/md/_type_multiline.md b/lib/templates/md/_type_multiline.md index adfbd36058..e25431310b 100644 --- a/lib/templates/md/_type_multiline.md +++ b/lib/templates/md/_type_multiline.md @@ -4,4 +4,4 @@ {{/annotations}} {{/hasAnnotations}} -{{>name_summary}}{{{genericParameters}}} = {{{linkedReturnType}}} +{{>name_summary}}{{{genericParameters}}} = {{{modelType.linkedName}}} diff --git a/lib/templates/md/property.md b/lib/templates/md/property.md index 222c5e26c9..b59b778f4d 100644 --- a/lib/templates/md/property.md +++ b/lib/templates/md/property.md @@ -9,7 +9,7 @@ {{#self}} {{#hasNoGetterSetter}} -{{{ linkedReturnType }}} {{>name_summary}} {{!two spaces intentional}} +{{{ modelType.linkedName }}} {{>name_summary}} {{!two spaces intentional}} {{>features}} {{>documentation}} diff --git a/lib/templates/md/top_level_property.md b/lib/templates/md/top_level_property.md index 43a5ffc955..8d17ea5205 100644 --- a/lib/templates/md/top_level_property.md +++ b/lib/templates/md/top_level_property.md @@ -8,7 +8,7 @@ {{>feature_set}} {{#hasNoGetterSetter}} -{{{ linkedReturnType }}} {{>name_summary}} {{!two spaces intentional}} +{{{ modelType.linkedName }}} {{>name_summary}} {{!two spaces intentional}} {{>features}} {{>documentation}} diff --git a/test/end2end/model_special_cases_test.dart b/test/end2end/model_special_cases_test.dart index a508adad12..893589921c 100644 --- a/test/end2end/model_special_cases_test.dart +++ b/test/end2end/model_special_cases_test.dart @@ -126,7 +126,7 @@ void main() { expect(g.modelType.returnType.name, equals('T1')); expect(g.modelType.parameters.first.modelType.name, equals('T2')); expect(g.modelType.parameters.last.modelType.name, equals('T3')); - }); + }, skip: 'dart-lang/sdk#45921'); test('basic non-function typedefs work', () { expectTypedefs(T0, 'void', []); diff --git a/test/end2end/model_test.dart b/test/end2end/model_test.dart index 54d233c80f..50a50fec39 100644 --- a/test/end2end/model_test.dart +++ b/test/end2end/model_test.dart @@ -264,8 +264,7 @@ void main() { equals( 'Map<T?, String?>')); expect(aComplexSetterOnlyType.modelType.linkedName, equals( - // TODO(jcollins-g): fix wrong span class for setter-only return type (#2226) - 'List<Map<T?, String?>?>')); + 'List<Map<T?, String?>?>')); }); test('simple nullable elements are detected and rendered correctly', () { @@ -2542,10 +2541,7 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, // TODO(jcollins-g): really, these shouldn't be called "parameters" in // the span class. expect( - explicitSetter.modelType.linkedName, - 'dynamic Function(int, ' - 'Cool, ' - 'List<int>)'); + explicitSetter.modelType.linkedName, 'dynamic Function(int bar, Cool baz, List<int> macTruck)'); }); test('parameterized type from field is correctly displayed', () { @@ -2590,10 +2586,8 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, .setter; expect(aInheritedSetter.allParameters.first.modelType.linkedName, 'AnotherParameterizedClass<List<int>>'); - // TODO(jcollins-g): really, these shouldn't be called "parameters" in - // the span class. expect(aInheritedSetter.enclosingCombo.modelType.linkedName, - 'AnotherParameterizedClass<List<int>>'); + 'AnotherParameterizedClass<List<int>>'); }); test( diff --git a/testing/test_package_custom_templates/templates/_accessor_getter.html b/testing/test_package_custom_templates/templates/_accessor_getter.html index 4bc9e08e2d..9f3cf4dcf1 100644 --- a/testing/test_package_custom_templates/templates/_accessor_getter.html +++ b/testing/test_package_custom_templates/templates/_accessor_getter.html @@ -2,7 +2,7 @@
- {{{ linkedReturnType }}} + {{{ modelType.returnType.linkedName }}} {{>name_summary}} {{>features}}
diff --git a/testing/test_package_custom_templates/templates/_callable.html b/testing/test_package_custom_templates/templates/_callable.html index 7fb911b573..bc864dc735 100644 --- a/testing/test_package_custom_templates/templates/_callable.html +++ b/testing/test_package_custom_templates/templates/_callable.html @@ -1,6 +1,6 @@
{{{linkedName}}}{{{linkedGenericParameters}}}({{{ linkedParamsNoMetadata }}}) - → {{{ linkedReturnType }}} + → {{{ modelType.returnType.linkedName }}} {{>categorization}}
diff --git a/testing/test_package_custom_templates/templates/_callable_multiline.html b/testing/test_package_custom_templates/templates/_callable_multiline.html index 4d0bce92a5..dc1b17290c 100644 --- a/testing/test_package_custom_templates/templates/_callable_multiline.html +++ b/testing/test_package_custom_templates/templates/_callable_multiline.html @@ -7,5 +7,5 @@ {{/hasAnnotations}} -{{{ linkedReturnType }}} +{{{ modelType.returnType.linkedName }}} {{>name_summary}}{{{genericParameters}}}({{#hasParameters}}{{{linkedParamsLines}}}{{/hasParameters}}) diff --git a/testing/test_package_custom_templates/templates/_constant.html b/testing/test_package_custom_templates/templates/_constant.html index 72d367c667..f12c94d20a 100644 --- a/testing/test_package_custom_templates/templates/_constant.html +++ b/testing/test_package_custom_templates/templates/_constant.html @@ -1,6 +1,6 @@
{{{ linkedName }}} - → const {{{ linkedReturnType }}} + → const {{{ modelType.linkedName }}} {{>categorization}}
diff --git a/testing/test_package_custom_templates/templates/_property.html b/testing/test_package_custom_templates/templates/_property.html index 09f61f67e0..dc58959e80 100644 --- a/testing/test_package_custom_templates/templates/_property.html +++ b/testing/test_package_custom_templates/templates/_property.html @@ -1,6 +1,6 @@
{{{linkedName}}} - {{{ arrow }}} {{{ linkedReturnType }}} {{>categorization}} + {{{ arrow }}} {{{ modelType.linkedName }}} {{>categorization}}
{{{ oneLineDoc }}} {{{ extendedDocLink }}} diff --git a/testing/test_package_custom_templates/templates/constant.html b/testing/test_package_custom_templates/templates/constant.html index 5ae50e8eac..0577cba6d5 100644 --- a/testing/test_package_custom_templates/templates/constant.html +++ b/testing/test_package_custom_templates/templates/constant.html @@ -13,7 +13,7 @@
{{parent.name}} {{parent.kind}}
{{#property}} - {{{ linkedReturnType }}} + {{{ modelType.returnType.linkedName }}} {{>name_summary}} = {{{ constantValue }}} diff --git a/testing/test_package_custom_templates/templates/property.html b/testing/test_package_custom_templates/templates/property.html index b8bb7e559a..691da45f25 100644 --- a/testing/test_package_custom_templates/templates/property.html +++ b/testing/test_package_custom_templates/templates/property.html @@ -14,7 +14,7 @@
{{parent.name}} {{parent.kind}}
{{#self}} {{#hasNoGetterSetter}}
- {{{ linkedReturnType }}} + {{{ modelType.returnType.linkedName }}} {{>name_summary}} {{>features}}
diff --git a/testing/test_package_custom_templates/templates/top_level_property.html b/testing/test_package_custom_templates/templates/top_level_property.html index 449244a3c3..8b587177da 100644 --- a/testing/test_package_custom_templates/templates/top_level_property.html +++ b/testing/test_package_custom_templates/templates/top_level_property.html @@ -12,7 +12,7 @@
{{parent.name}} {{parent.kind}}
{{#hasNoGetterSetter}}
- {{{ linkedReturnType }}} + {{{ modelType.returnType.linkedName }}} {{>name_summary}} {{>features}}
From 599fa22426bf1e52aeaa0a82e7c14438b6e88347 Mon Sep 17 00:00:00 2001 From: Janice Collins Date: Fri, 12 Mar 2021 11:47:30 -0800 Subject: [PATCH 04/13] dartfmt --- lib/src/model/field.dart | 2 -- test/end2end/model_test.dart | 60 ++++++++++++++++++++++++------------ 2 files changed, 41 insertions(+), 21 deletions(-) diff --git a/lib/src/model/field.dart b/lib/src/model/field.dart index 528c059c3d..0b464dc03e 100644 --- a/lib/src/model/field.dart +++ b/lib/src/model/field.dart @@ -198,8 +198,6 @@ class Field extends ModelElement } } - - @override Inheritable get overriddenElement => null; } diff --git a/test/end2end/model_test.dart b/test/end2end/model_test.dart index 50a50fec39..237fafa09a 100644 --- a/test/end2end/model_test.dart +++ b/test/end2end/model_test.dart @@ -263,8 +263,10 @@ void main() { aComplexType.modelType.linkedName, equals( 'Map<T?, String?>')); - expect(aComplexSetterOnlyType.modelType.linkedName, equals( - 'List<Map<T?, String?>?>')); + expect( + aComplexSetterOnlyType.modelType.linkedName, + equals( + 'List<Map<T?, String?>?>')); }); test('simple nullable elements are detected and rendered correctly', () { @@ -287,7 +289,8 @@ void main() { methodWithNullables.linkedParams, equals( 'String? foo')); - expect(methodWithNullables.modelType.returnType.linkedName, equals('int?')); + expect( + methodWithNullables.modelType.returnType.linkedName, equals('int?')); expect( initialized.modelType.linkedName, equals( @@ -323,25 +326,44 @@ void main() { test('Set literals test', () { expect(aComplexSet.modelType.name, equals('Set')); - expect((aComplexSet.modelType as ParameterizedElementType).typeArguments.map((a) => a.name).toList(), + expect( + (aComplexSet.modelType as ParameterizedElementType) + .typeArguments + .map((a) => a.name) + .toList(), equals(['AClassContainingLiterals'])); expect(aComplexSet.constantValue, equals('const {const AClassContainingLiterals(3, 5)}')); expect(inferredTypeSet.modelType.name, equals('Set')); expect( - (inferredTypeSet.modelType as ParameterizedElementType).typeArguments. map((a) => a.name).toList(), + (inferredTypeSet.modelType as ParameterizedElementType) + .typeArguments + .map((a) => a.name) + .toList(), equals(['int'])); expect(inferredTypeSet.constantValue, equals('const {1, 3, 5}')); expect(specifiedSet.modelType.name, equals('Set')); - expect((specifiedSet.modelType as ParameterizedElementType).typeArguments.map((a) => a.name).toList(), + expect( + (specifiedSet.modelType as ParameterizedElementType) + .typeArguments + .map((a) => a.name) + .toList(), equals(['int'])); expect(specifiedSet.constantValue, equals('const {}')); expect(untypedMap.modelType.name, equals('Map')); - expect((untypedMap.modelType as ParameterizedElementType).typeArguments.map((a) => a.name).toList(), + expect( + (untypedMap.modelType as ParameterizedElementType) + .typeArguments + .map((a) => a.name) + .toList(), equals(['dynamic', 'dynamic'])); expect(untypedMap.constantValue, equals('const {}')); expect(typedSet.modelType.name, equals('Set')); - expect((typedSet.modelType as ParameterizedElementType).typeArguments.map((a) => a.name).toList(), + expect( + (typedSet.modelType as ParameterizedElementType) + .typeArguments + .map((a) => a.name) + .toList(), equals(['String'])); expect(typedSet.constantValue, matches(RegExp(r'const <String>\s?{}'))); @@ -1907,7 +1929,8 @@ void main() { equals('${htmlBasePlaceholder}ex/Deprecated/expires.html')); }); - test('exported class should have modelType.returnType.linkedName for the current library', + test( + 'exported class should have modelType.returnType.linkedName for the current library', () { var returnCool = Cool.instanceMethods .firstWhere((m) => m.name == 'returnCool', orElse: () => null); @@ -2428,7 +2451,8 @@ void main() { test('function returning FutureOr', () { expect(thisIsFutureOr.isAsynchronous, isFalse); - expect(thisIsFutureOr.modelType.returnType.linkedName, equals('FutureOr')); + expect( + thisIsFutureOr.modelType.returnType.linkedName, equals('FutureOr')); }); test('function returning FutureOr', () { @@ -2540,8 +2564,8 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, .singleWhere((f) => f.name == 'explicitSetter'); // TODO(jcollins-g): really, these shouldn't be called "parameters" in // the span class. - expect( - explicitSetter.modelType.linkedName, 'dynamic Function(int bar, Cool baz, List<int> macTruck)'); + expect(explicitSetter.modelType.linkedName, + 'dynamic Function(int bar, Cool baz, List<int> macTruck)'); }); test('parameterized type from field is correctly displayed', () { @@ -3310,8 +3334,7 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, 'Verify that a map containing anonymous functions as values works correctly', () { var typeArguments = - (importantComputations.modelType as DefinedElementType) - .typeArguments; + (importantComputations.modelType as DefinedElementType).typeArguments; expect(typeArguments, isNotEmpty); expect( typeArguments.last.linkedName, @@ -3369,10 +3392,8 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, test('type arguments are correct', () { var modelType = mapWithDynamicKeys.modelType as ParameterizedElementType; expect(modelType.typeArguments, hasLength(2)); - expect(modelType.typeArguments.first.name, - equals('dynamic')); - expect(modelType.typeArguments.last.name, - equals('String')); + expect(modelType.typeArguments.first.name, equals('dynamic')); + expect(modelType.typeArguments.last.name, equals('String')); }); test('has enclosing element', () { @@ -3705,7 +3726,8 @@ String topLevelFunction(int param1, bool param2, Cool coolBeans, test('anonymous nested functions inside typedefs are handled', () { expect(aComplexTypedef, isNotNull); - expect(aComplexTypedef.modelType.returnType.linkedName, startsWith('void Function')); + expect(aComplexTypedef.modelType.returnType.linkedName, + startsWith('void Function')); expect( aComplexTypedef.nameWithGenerics, equals( From 5aee46b4ec49087eb69ccf93fb9adf1f7e821a80 Mon Sep 17 00:00:00 2001 From: Janice Collins Date: Fri, 12 Mar 2021 12:00:05 -0800 Subject: [PATCH 05/13] remove scaffolding --- lib/src/model/model_element.dart | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/src/model/model_element.dart b/lib/src/model/model_element.dart index 95d987bfb2..e908dd780b 100644 --- a/lib/src/model/model_element.dart +++ b/lib/src/model/model_element.dart @@ -984,9 +984,7 @@ abstract class ModelElement extends Canonicalization String get linkedParamsNoMetadataOrNames => _parameterRenderer .renderLinkedParams(parameters, showMetadata: false, showNames: false); - ElementType get modelType => modelTypeReal; - - ElementType get modelTypeReal { + ElementType get modelType { var element = this.element; if (_modelType == null) { // TODO(jcollins-g): Need an interface for a "member with a type" (or changed object model). From 5de7033d026d573d5df9c2f675fcfcb762753022 Mon Sep 17 00:00:00 2001 From: Janice Collins Date: Fri, 12 Mar 2021 12:22:38 -0800 Subject: [PATCH 06/13] begin extraction --- lib/src/model/accessor.dart | 20 ++++++++++++++++---- lib/src/model/class.dart | 5 ++++- lib/src/model/constructor.dart | 7 ++++++- lib/src/model/model_element.dart | 3 ++- 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/lib/src/model/accessor.dart b/lib/src/model/accessor.dart index 831b93ca16..29f64dc553 100644 --- a/lib/src/model/accessor.dart +++ b/lib/src/model/accessor.dart @@ -3,7 +3,7 @@ // BSD-style license that can be found in the LICENSE file. import 'package:analyzer/dart/element/element.dart'; -import 'package:analyzer/src/dart/element/member.dart' show Member; +import 'package:analyzer/src/dart/element/member.dart' show ExecutableMember; import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/model/model.dart'; import 'package:dartdoc/src/render/source_code_renderer.dart'; @@ -16,11 +16,23 @@ class Accessor extends ModelElement implements EnclosedElement { Accessor(PropertyAccessorElement element, Library library, PackageGraph packageGraph, - [Member /*?*/ originalMember]) + [ExecutableMember /*?*/ originalMember]) : super(element, library, packageGraph, originalMember); @override - CallableElementTypeMixin get modelType => super.modelType; + ExecutableMember get originalMember => super.originalMember; + + CallableElementTypeMixin _modelType; + @override + CallableElementTypeMixin get modelType { + if (_modelType == null) { + if (originalMember != null) { + _modelType = ElementType.from(originalMember.type, library, + packageGraph); + } + } + return _modelType; + } bool get isSynthetic => element.isSynthetic; @@ -153,7 +165,7 @@ class ContainerAccessor extends Accessor with ContainerMember, Inheritable { ContainerAccessor.inherited(PropertyAccessorElement element, Library library, PackageGraph packageGraph, this._enclosingElement, - {Member originalMember}) + {ExecutableMember originalMember}) : super(element, library, packageGraph, originalMember) { _isInherited = true; } diff --git a/lib/src/model/class.dart b/lib/src/model/class.dart index 8e6bc356ca..f6871d4f32 100644 --- a/lib/src/model/class.dart +++ b/lib/src/model/class.dart @@ -334,8 +334,11 @@ class Class extends Container Iterable get publicMixedInTypes => model_utils.filterNonPublic(mixedInTypes); + DefinedElementType _modelType; + @override - DefinedElementType get modelType => super.modelType; + DefinedElementType get modelType => + _modelType ??= ElementType.from(element.thisType, library, packageGraph); /// Not the same as superChain as it may include mixins. /// It's really not even the same as ordinary Dart inheritance, either, diff --git a/lib/src/model/constructor.dart b/lib/src/model/constructor.dart index b7cd94cdfb..cc6f00a970 100644 --- a/lib/src/model/constructor.dart +++ b/lib/src/model/constructor.dart @@ -25,6 +25,9 @@ class Constructor extends ModelElement return super.characterLocation; } + @override + ConstructorElement get element => super.element; + @override // TODO(jcollins-g): Revisit this when dart-lang/sdk#31517 is implemented. List get typeParameters => @@ -75,8 +78,10 @@ class Constructor extends ModelElement @override String get kind => 'constructor'; + DefinedElementType _modelType; @override - DefinedElementType get modelType => super.modelType; + DefinedElementType get modelType => _modelType ??= ElementType.from(element.type, + library, packageGraph); String _name; diff --git a/lib/src/model/model_element.dart b/lib/src/model/model_element.dart index e908dd780b..09841c7bb9 100644 --- a/lib/src/model/model_element.dart +++ b/lib/src/model/model_element.dart @@ -984,7 +984,8 @@ abstract class ModelElement extends Canonicalization String get linkedParamsNoMetadataOrNames => _parameterRenderer .renderLinkedParams(parameters, showMetadata: false, showNames: false); - ElementType get modelType { + ElementType get modelType; + ElementType get modelTypeReal { var element = this.element; if (_modelType == null) { // TODO(jcollins-g): Need an interface for a "member with a type" (or changed object model). From 76d1a017c20a93d915f54b3bcb09dbf8dd1c6dfb Mon Sep 17 00:00:00 2001 From: Janice Collins Date: Fri, 12 Mar 2021 13:51:39 -0800 Subject: [PATCH 07/13] Exclude InterfaceType. Hacky. --- lib/src/element_type.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/src/element_type.dart b/lib/src/element_type.dart index 603e0c5973..553c55161c 100644 --- a/lib/src/element_type.dart +++ b/lib/src/element_type.dart @@ -34,7 +34,10 @@ abstract class ElementType extends Privacy { } else { var element = ModelElement.fromElement(f.element, packageGraph); assert(f is ParameterizedType || f is TypeParameterType); - var isGenericTypeAlias = f.aliasElement != null; + // TODO(jcollins-g): after analyzer 1.2.0 implement InterfaceType + // alias references and strip out all the cruft that's accumulated + // here for non-generic type aliases. + var isGenericTypeAlias = f.aliasElement != null && f is! InterfaceType; if (f is FunctionType) { assert(f is ParameterizedType); if (isGenericTypeAlias) { @@ -44,7 +47,6 @@ abstract class ElementType extends Privacy { return CallableElementType( f, library, packageGraph, element, returnedFrom); } else if (isGenericTypeAlias) { - assert(f is TypeParameterType); return GenericTypeAliasElementType( f, library, packageGraph, element, returnedFrom); } From ecb942a2a01192356d5e653a2b27afbb151fe45f Mon Sep 17 00:00:00 2001 From: Janice Collins Date: Fri, 12 Mar 2021 16:25:57 -0800 Subject: [PATCH 08/13] refactor continuing --- lib/src/model/dynamic.dart | 4 ++++ lib/src/model/extension.dart | 2 +- lib/src/model/method.dart | 33 +++++++++++++++++++++++-------- lib/src/model/model_function.dart | 6 +++++- 4 files changed, 35 insertions(+), 10 deletions(-) diff --git a/lib/src/model/dynamic.dart b/lib/src/model/dynamic.dart index ab5d497a9f..02298a8d4c 100644 --- a/lib/src/model/dynamic.dart +++ b/lib/src/model/dynamic.dart @@ -3,12 +3,16 @@ // BSD-style license that can be found in the LICENSE file. import 'package:analyzer/dart/element/element.dart'; +import 'package:dartdoc/dartdoc.dart'; import 'package:dartdoc/src/model/model.dart'; class Dynamic extends ModelElement { Dynamic(Element element, PackageGraph packageGraph) : super(element, null, packageGraph); + @override + UndefinedElementType get modelType => throw UnimplementedError('(${element.runtimeType}) $element'); + /// [dynamic] is not a real object, and so we can't document it, so there /// can be nothing canonical for it. @override diff --git a/lib/src/model/extension.dart b/lib/src/model/extension.dart index 819722dcc6..8a8e47fd2f 100644 --- a/lib/src/model/extension.dart +++ b/lib/src/model/extension.dart @@ -94,7 +94,7 @@ class Extension extends Container } @override - ParameterizedElementType get modelType => super.modelType; + ElementType get modelType => throw UnimplementedError('(${element.runtimeType}) $element'); List _allModelElements; @override diff --git a/lib/src/model/method.dart b/lib/src/model/method.dart index 8583a440eb..02cc4cde81 100644 --- a/lib/src/model/method.dart +++ b/lib/src/model/method.dart @@ -4,7 +4,7 @@ import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/source/line_info.dart'; -import 'package:analyzer/src/dart/element/member.dart' show Member; +import 'package:analyzer/src/dart/element/member.dart' show ExecutableMember; import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/model/model.dart'; @@ -23,14 +23,14 @@ class Method extends ModelElement Method.inherited(MethodElement element, this._enclosingContainer, Library library, PackageGraph packageGraph, - {Member originalMember}) + {ExecutableMember originalMember}) : super(element, library, packageGraph, originalMember) { _isInherited = true; _calcTypeParameters(); } void _calcTypeParameters() { - typeParameters = _method.typeParameters.map((f) { + typeParameters = element.typeParameters.map((f) { return ModelElement.from(f, library, packageGraph) as TypeParameter; }).toList(); } @@ -51,7 +51,7 @@ class Method extends ModelElement @override ModelElement get enclosingElement { _enclosingContainer ??= - ModelElement.from(_method.enclosingElement, library, packageGraph); + ModelElement.from(element.enclosingElement, library, packageGraph); return _enclosingContainer; } @@ -60,7 +60,7 @@ class Method extends ModelElement '${enclosingElement.library.dirName}/${enclosingElement.name}/$fileName'; String get fullkind { - if (_method.isAbstract) return 'abstract $kind'; + if (element.isAbstract) return 'abstract $kind'; return kind; } @@ -88,13 +88,29 @@ class Method extends ModelElement } @override - bool get isStatic => _method.isStatic; + bool get isStatic => element.isStatic; @override String get kind => 'method'; @override - CallableElementTypeMixin get modelType => super.modelType; + ExecutableMember get originalMember => super.originalMember; + + CallableElementTypeMixin _modelType; + @override + CallableElementTypeMixin get modelType { + if (_modelType == null) { + if (originalMember != null) { + _modelType = ElementType.from( + originalMember.type, + library, + packageGraph); + } else { + _modelType = ElementType.from(element.type, library, packageGraph); + } + } + return _modelType; + } @override Method get overriddenElement { @@ -112,7 +128,8 @@ class Method extends ModelElement return null; } - MethodElement get _method => (element as MethodElement); + @override + MethodElement get element => super.element; /// Methods can not be covariant; always returns false. @override diff --git a/lib/src/model/model_function.dart b/lib/src/model/model_function.dart index bb6c4ccca7..23d70fe75a 100644 --- a/lib/src/model/model_function.dart +++ b/lib/src/model/model_function.dart @@ -70,5 +70,9 @@ class ModelFunctionTyped extends ModelElement bool get isInherited => false; @override - DefinedElementType get modelType => super.modelType; + FunctionTypedElement element; + + DefinedElementType _modelType; + @override + DefinedElementType get modelType => _modelType ??= ElementType.from(element.type, library, packageGraph); } From 32e34eafcb1bb69cc229d16e4df31623c3fde6de Mon Sep 17 00:00:00 2001 From: Janice Collins Date: Wed, 17 Mar 2021 11:13:31 -0700 Subject: [PATCH 09/13] dartfmt, finish modelType extraction --- lib/src/model/accessor.dart | 9 ++++-- lib/src/model/constructor.dart | 4 +-- lib/src/model/dynamic.dart | 3 +- lib/src/model/extension.dart | 3 -- lib/src/model/extension_target.dart | 3 ++ lib/src/model/method.dart | 6 ++-- lib/src/model/model_element.dart | 2 +- lib/src/model/model_function.dart | 5 ++-- lib/src/model/parameter.dart | 46 ++++++++++++++++++----------- lib/src/model/type_parameter.dart | 17 ++++++----- lib/src/model/typedef.dart | 5 ++++ test/dartdoc_options_test.dart | 20 ++++++------- 12 files changed, 72 insertions(+), 51 deletions(-) diff --git a/lib/src/model/accessor.dart b/lib/src/model/accessor.dart index 29f64dc553..47380f0157 100644 --- a/lib/src/model/accessor.dart +++ b/lib/src/model/accessor.dart @@ -19,6 +19,9 @@ class Accessor extends ModelElement implements EnclosedElement { [ExecutableMember /*?*/ originalMember]) : super(element, library, packageGraph, originalMember); + @override + PropertyAccessorElement get element => super.element; + @override ExecutableMember get originalMember => super.originalMember; @@ -27,8 +30,10 @@ class Accessor extends ModelElement implements EnclosedElement { CallableElementTypeMixin get modelType { if (_modelType == null) { if (originalMember != null) { - _modelType = ElementType.from(originalMember.type, library, - packageGraph); + _modelType = + ElementType.from(originalMember.type, library, packageGraph); + } else { + _modelType = ElementType.from(element.type, library, packageGraph); } } return _modelType; diff --git a/lib/src/model/constructor.dart b/lib/src/model/constructor.dart index cc6f00a970..9be880574e 100644 --- a/lib/src/model/constructor.dart +++ b/lib/src/model/constructor.dart @@ -80,8 +80,8 @@ class Constructor extends ModelElement DefinedElementType _modelType; @override - DefinedElementType get modelType => _modelType ??= ElementType.from(element.type, - library, packageGraph); + DefinedElementType get modelType => + _modelType ??= ElementType.from(element.type, library, packageGraph); String _name; diff --git a/lib/src/model/dynamic.dart b/lib/src/model/dynamic.dart index 02298a8d4c..a8cbf6abd1 100644 --- a/lib/src/model/dynamic.dart +++ b/lib/src/model/dynamic.dart @@ -11,7 +11,8 @@ class Dynamic extends ModelElement { : super(element, null, packageGraph); @override - UndefinedElementType get modelType => throw UnimplementedError('(${element.runtimeType}) $element'); + UndefinedElementType get modelType => + throw UnimplementedError('(${element.runtimeType}) $element'); /// [dynamic] is not a real object, and so we can't document it, so there /// can be nothing canonical for it. diff --git a/lib/src/model/extension.dart b/lib/src/model/extension.dart index 8a8e47fd2f..52575c0e9f 100644 --- a/lib/src/model/extension.dart +++ b/lib/src/model/extension.dart @@ -93,9 +93,6 @@ class Extension extends Container return _typeParameters; } - @override - ElementType get modelType => throw UnimplementedError('(${element.runtimeType}) $element'); - List _allModelElements; @override List get allModelElements { diff --git a/lib/src/model/extension_target.dart b/lib/src/model/extension_target.dart index 19f5cc11e1..bea6e7c65f 100644 --- a/lib/src/model/extension_target.dart +++ b/lib/src/model/extension_target.dart @@ -2,6 +2,7 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. +import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/model/model.dart'; // TODO(jcollins-g): Mix-in ExtensionTarget on Method, ModelFunction, Typedef, @@ -27,6 +28,8 @@ mixin ExtensionTarget on ModelElement { return _potentiallyApplicableExtensions; } + ElementType get modelType; + List get potentiallyApplicableExtensionsSorted => potentiallyApplicableExtensions.toList()..sort(byName); } diff --git a/lib/src/model/method.dart b/lib/src/model/method.dart index 02cc4cde81..36318abd34 100644 --- a/lib/src/model/method.dart +++ b/lib/src/model/method.dart @@ -101,10 +101,8 @@ class Method extends ModelElement CallableElementTypeMixin get modelType { if (_modelType == null) { if (originalMember != null) { - _modelType = ElementType.from( - originalMember.type, - library, - packageGraph); + _modelType = + ElementType.from(originalMember.type, library, packageGraph); } else { _modelType = ElementType.from(element.type, library, packageGraph); } diff --git a/lib/src/model/model_element.dart b/lib/src/model/model_element.dart index 09841c7bb9..4ec83efd18 100644 --- a/lib/src/model/model_element.dart +++ b/lib/src/model/model_element.dart @@ -984,7 +984,7 @@ abstract class ModelElement extends Canonicalization String get linkedParamsNoMetadataOrNames => _parameterRenderer .renderLinkedParams(parameters, showMetadata: false, showNames: false); - ElementType get modelType; + //ElementType get modelType; ElementType get modelTypeReal { var element = this.element; if (_modelType == null) { diff --git a/lib/src/model/model_function.dart b/lib/src/model/model_function.dart index 23d70fe75a..ce5e4ee1e5 100644 --- a/lib/src/model/model_function.dart +++ b/lib/src/model/model_function.dart @@ -70,9 +70,10 @@ class ModelFunctionTyped extends ModelElement bool get isInherited => false; @override - FunctionTypedElement element; + FunctionTypedElement get element => super.element; DefinedElementType _modelType; @override - DefinedElementType get modelType => _modelType ??= ElementType.from(element.type, library, packageGraph); + DefinedElementType get modelType => + _modelType ??= ElementType.from(element.type, library, packageGraph); } diff --git a/lib/src/model/parameter.dart b/lib/src/model/parameter.dart index 3655503b4f..04bb118f46 100644 --- a/lib/src/model/parameter.dart +++ b/lib/src/model/parameter.dart @@ -3,28 +3,29 @@ // BSD-style license that can be found in the LICENSE file. import 'package:analyzer/dart/element/element.dart'; -import 'package:analyzer/src/dart/element/member.dart' show Member; +import 'package:analyzer/src/dart/element/member.dart' show ParameterMember; +import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/model/model.dart'; class Parameter extends ModelElement implements EnclosedElement { Parameter( ParameterElement element, Library library, PackageGraph packageGraph, - {Member originalMember}) + {ParameterMember originalMember}) : super(element, library, packageGraph, originalMember); String get defaultValue { if (!hasDefaultValue) return null; - return _parameter.defaultValueCode; + return element.defaultValueCode; } @override - ModelElement get enclosingElement => (_parameter.enclosingElement != null) - ? ModelElement.from(_parameter.enclosingElement, library, packageGraph) + ModelElement get enclosingElement => (element.enclosingElement != null) + ? ModelElement.from(element.enclosingElement, library, packageGraph) : null; bool get hasDefaultValue { - return _parameter.defaultValueCode != null && - _parameter.defaultValueCode.isNotEmpty; + return element.defaultValueCode != null && + element.defaultValueCode.isNotEmpty; } @override @@ -39,13 +40,13 @@ class Parameter extends ModelElement implements EnclosedElement { @override String get htmlId { - if (_parameter.enclosingElement != null) { - var enclosingName = _parameter.enclosingElement.name; - if (_parameter.enclosingElement is GenericFunctionTypeElement) { + if (element.enclosingElement != null) { + var enclosingName = element.enclosingElement.name; + if (element.enclosingElement is GenericFunctionTypeElement) { // TODO(jcollins-g): Drop when GenericFunctionTypeElement populates name. // Also, allowing null here is allowed as a workaround for // dart-lang/sdk#32005. - for (var e = _parameter.enclosingElement; + for (var e = element.enclosingElement; e.enclosingElement != null; e = e.enclosingElement) { enclosingName = e.name; @@ -63,21 +64,30 @@ class Parameter extends ModelElement implements EnclosedElement { @override bool operator ==(Object object) => - object is Parameter && (_parameter.type == object._parameter.type); + object is Parameter && (element.type == object.element.type); - bool get isCovariant => _parameter.isCovariant; + bool get isCovariant => element.isCovariant; - bool get isRequiredPositional => _parameter.isRequiredPositional; + bool get isRequiredPositional => element.isRequiredPositional; - bool get isNamed => _parameter.isNamed; + bool get isNamed => element.isNamed; - bool get isOptionalPositional => _parameter.isOptionalPositional; + bool get isOptionalPositional => element.isOptionalPositional; /// Only true if this is a required named parameter. - bool get isRequiredNamed => _parameter.isRequiredNamed; + bool get isRequiredNamed => element.isRequiredNamed; @override String get kind => 'parameter'; - ParameterElement get _parameter => element as ParameterElement; + @override + ParameterElement get element => super.element; + + @override + ParameterMember get originalMember => super.originalMember; + + ElementType _modelType; + @override + ElementType get modelType => _modelType ??= + ElementType.from((originalMember ?? element).type, library, packageGraph); } diff --git a/lib/src/model/type_parameter.dart b/lib/src/model/type_parameter.dart index c6492df695..dc450a95b5 100644 --- a/lib/src/model/type_parameter.dart +++ b/lib/src/model/type_parameter.dart @@ -38,7 +38,7 @@ class TypeParameter extends ModelElement { ElementType get boundType { if (_boundType == null) { - var bound = _typeParameter.bound; + var bound = element.bound; if (bound != null) { _boundType = ElementType.from(bound, library, packageGraph); } @@ -50,9 +50,9 @@ class TypeParameter extends ModelElement { @override String get name { - _name ??= _typeParameter.bound != null - ? '${_typeParameter.name} extends ${boundType.nameWithGenerics}' - : _typeParameter.name; + _name ??= element.bound != null + ? '${element.name} extends ${boundType.nameWithGenerics}' + : element.name; return _name; } @@ -60,13 +60,14 @@ class TypeParameter extends ModelElement { @override String get linkedName { - _linkedName ??= _typeParameter.bound != null - ? '${_typeParameter.name} extends ${boundType.linkedName}' - : _typeParameter.name; + _linkedName ??= element.bound != null + ? '${element.name} extends ${boundType.linkedName}' + : element.name; return _linkedName; } - TypeParameterElement get _typeParameter => element as TypeParameterElement; + @override + TypeParameterElement get element => super.element; } mixin TypeParameters implements ModelElement { diff --git a/lib/src/model/typedef.dart b/lib/src/model/typedef.dart index 1401da1c7f..c984deb083 100644 --- a/lib/src/model/typedef.dart +++ b/lib/src/model/typedef.dart @@ -19,6 +19,11 @@ class Typedef extends ModelElement @override TypeAliasElement get element => super.element; + ElementType _modelType; + @override + ElementType get modelType => _modelType ??= + ElementType.from(element.aliasedType, library, packageGraph); + @override ModelElement get enclosingElement => library; diff --git a/test/dartdoc_options_test.dart b/test/dartdoc_options_test.dart index 0a7b1cb5d3..e3de06e005 100644 --- a/test/dartdoc_options_test.dart +++ b/test/dartdoc_options_test.dart @@ -637,13 +637,13 @@ dartdoc: equals( 'Field dartdoc.fileOptionList from ${path.canonicalize(dartdocOptionsTwo.path)}, set to [existing.dart, thing/that/does/not/exist], resolves to missing path: ' '"${path.joinAll([ - path.canonicalize(secondDir.path), - 'thing', - 'that', - 'does', - 'not', - 'exist' - ])}"')); + path.canonicalize(secondDir.path), + 'thing', + 'that', + 'does', + 'not', + 'exist' + ])}"')); // It doesn't matter that this fails. expect(dartdocOptionSetFiles['nonCriticalFileOption'].valueAt(firstDir), equals(path.joinAll([path.canonicalize(firstDir.path), 'whatever']))); @@ -663,9 +663,9 @@ dartdoc: equals( 'Field dartdoc.fileOption from ${path.canonicalize(dartdocOptionsTwo.path)}, set to not existing, resolves to missing path: ' '"${path.joinAll([ - path.canonicalize(secondDir.path), - "not existing" - ])}"')); + path.canonicalize(secondDir.path), + "not existing" + ])}"')); }); test('DartdocOptionSetFile works for directory options', () { From 959f9dacce7a8bbf6a765b1ca3378d481f4bdb20 Mon Sep 17 00:00:00 2001 From: Janice Collins Date: Wed, 17 Mar 2021 11:28:47 -0700 Subject: [PATCH 10/13] todo:ignore and no dynamic --- analysis_options.yaml | 2 +- analysis_options_presubmit.yaml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index a3f964ba30..d98b6ccaff 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -4,6 +4,7 @@ include: package:pedantic/analysis_options.1.11.0.yaml analyzer: errors: + todo: ignore unused_import: warning unused_shown_name: warning exclude: @@ -17,7 +18,6 @@ analyzer: linter: rules: - always_declare_return_types - - avoid_dynamic_calls - avoid_single_cascade_in_expression_statements - avoid_unused_constructor_parameters - annotate_overrides diff --git a/analysis_options_presubmit.yaml b/analysis_options_presubmit.yaml index 98bdeb11ba..6494e3a5ed 100644 --- a/analysis_options_presubmit.yaml +++ b/analysis_options_presubmit.yaml @@ -4,6 +4,7 @@ include: package:pedantic/analysis_options.1.11.0.yaml analyzer: errors: + todo: ignore unused_import: warning unused_shown_name: warning ### Extra ignores for presubmit From 625182abc2679dc27d194b2efac1e1e9ec86ab30 Mon Sep 17 00:00:00 2001 From: Janice Collins Date: Wed, 17 Mar 2021 12:39:51 -0700 Subject: [PATCH 11/13] fix it all --- lib/src/model/accessor.dart | 15 ++++++--------- lib/src/model/constructor.dart | 11 ++++------- lib/src/model/dynamic.dart | 1 - lib/src/model/getter_setter_combo.dart | 1 - lib/src/model/method.dart | 1 - lib/src/model/model_function.dart | 1 - lib/src/model/parameter.dart | 1 - lib/src/model/typedef.dart | 1 - test/dartdoc_options_test.dart | 20 ++++++++++---------- 9 files changed, 20 insertions(+), 32 deletions(-) diff --git a/lib/src/model/accessor.dart b/lib/src/model/accessor.dart index 47380f0157..5a142389ef 100644 --- a/lib/src/model/accessor.dart +++ b/lib/src/model/accessor.dart @@ -26,7 +26,6 @@ class Accessor extends ModelElement implements EnclosedElement { ExecutableMember get originalMember => super.originalMember; CallableElementTypeMixin _modelType; - @override CallableElementTypeMixin get modelType { if (_modelType == null) { if (originalMember != null) { @@ -48,7 +47,7 @@ class Accessor extends ModelElement implements EnclosedElement { // The [enclosingCombo] where this element was defined. GetterSetterCombo get definingCombo { if (_definingCombo == null) { - var variable = (element as PropertyAccessorElement).variable; + var variable = element.variable; _definingCombo = ModelElement.fromElement(variable, packageGraph); assert(_definingCombo != null, 'Unable to find defining combo'); } @@ -102,12 +101,12 @@ class Accessor extends ModelElement implements EnclosedElement { @override ModelElement get enclosingElement { - if (_accessor.enclosingElement is CompilationUnitElement) { + if (element.enclosingElement is CompilationUnitElement) { return packageGraph.findButDoNotCreateLibraryFor( - _accessor.enclosingElement.enclosingElement); + element.enclosingElement.enclosingElement); } - return ModelElement.from(_accessor.enclosingElement, library, packageGraph); + return ModelElement.from(element.enclosingElement, library, packageGraph); } @override @@ -121,9 +120,9 @@ class Accessor extends ModelElement implements EnclosedElement { return enclosingCombo.href; } - bool get isGetter => _accessor.isGetter; + bool get isGetter => element.isGetter; - bool get isSetter => _accessor.isSetter; + bool get isSetter => element.isSetter; @override String get kind => 'accessor'; @@ -135,8 +134,6 @@ class Accessor extends ModelElement implements EnclosedElement { _namePart ??= super.namePart.split('=').first; return _namePart; } - - PropertyAccessorElement get _accessor => (element as PropertyAccessorElement); } /// A getter or setter that is a member of a [Container]. diff --git a/lib/src/model/constructor.dart b/lib/src/model/constructor.dart index 9be880574e..81f1f6b1df 100644 --- a/lib/src/model/constructor.dart +++ b/lib/src/model/constructor.dart @@ -35,7 +35,7 @@ class Constructor extends ModelElement @override ModelElement get enclosingElement => - ModelElement.from(_constructor.enclosingElement, library, packageGraph); + ModelElement.from(element.enclosingElement, library, packageGraph); @override String get filePath => @@ -64,7 +64,7 @@ class Constructor extends ModelElement } @override - bool get isConst => _constructor.isConst; + bool get isConst => element.isConst; bool get isUnnamedConstructor => name == enclosingElement.name; @@ -73,13 +73,12 @@ class Constructor extends ModelElement 'be removed as early as Dartdoc 1.0.0') bool get isDefaultConstructor => isUnnamedConstructor; - bool get isFactory => _constructor.isFactory; + bool get isFactory => element.isFactory; @override String get kind => 'constructor'; DefinedElementType _modelType; - @override DefinedElementType get modelType => _modelType ??= ElementType.from(element.type, library, packageGraph); @@ -116,11 +115,9 @@ class Constructor extends ModelElement String get shortName { if (name.contains('.')) { - return name.substring(_constructor.enclosingElement.name.length + 1); + return name.substring(element.enclosingElement.name.length + 1); } else { return name; } } - - ConstructorElement get _constructor => (element as ConstructorElement); } diff --git a/lib/src/model/dynamic.dart b/lib/src/model/dynamic.dart index a8cbf6abd1..d911a39d52 100644 --- a/lib/src/model/dynamic.dart +++ b/lib/src/model/dynamic.dart @@ -10,7 +10,6 @@ class Dynamic extends ModelElement { Dynamic(Element element, PackageGraph packageGraph) : super(element, null, packageGraph); - @override UndefinedElementType get modelType => throw UnimplementedError('(${element.runtimeType}) $element'); diff --git a/lib/src/model/getter_setter_combo.dart b/lib/src/model/getter_setter_combo.dart index f9c8006cd5..fa5ff1cfb1 100644 --- a/lib/src/model/getter_setter_combo.dart +++ b/lib/src/model/getter_setter_combo.dart @@ -180,7 +180,6 @@ mixin GetterSetterCombo on ModelElement { return buffer.toString(); } - @override ElementType get modelType { if (hasGetter) return getter.modelType.returnType; return setter.parameters.first.modelType; diff --git a/lib/src/model/method.dart b/lib/src/model/method.dart index 36318abd34..4b7205d4e7 100644 --- a/lib/src/model/method.dart +++ b/lib/src/model/method.dart @@ -97,7 +97,6 @@ class Method extends ModelElement ExecutableMember get originalMember => super.originalMember; CallableElementTypeMixin _modelType; - @override CallableElementTypeMixin get modelType { if (_modelType == null) { if (originalMember != null) { diff --git a/lib/src/model/model_function.dart b/lib/src/model/model_function.dart index ce5e4ee1e5..a848dfeb5e 100644 --- a/lib/src/model/model_function.dart +++ b/lib/src/model/model_function.dart @@ -73,7 +73,6 @@ class ModelFunctionTyped extends ModelElement FunctionTypedElement get element => super.element; DefinedElementType _modelType; - @override DefinedElementType get modelType => _modelType ??= ElementType.from(element.type, library, packageGraph); } diff --git a/lib/src/model/parameter.dart b/lib/src/model/parameter.dart index 04bb118f46..33d11ca918 100644 --- a/lib/src/model/parameter.dart +++ b/lib/src/model/parameter.dart @@ -87,7 +87,6 @@ class Parameter extends ModelElement implements EnclosedElement { ParameterMember get originalMember => super.originalMember; ElementType _modelType; - @override ElementType get modelType => _modelType ??= ElementType.from((originalMember ?? element).type, library, packageGraph); } diff --git a/lib/src/model/typedef.dart b/lib/src/model/typedef.dart index c984deb083..96f5ec0e7b 100644 --- a/lib/src/model/typedef.dart +++ b/lib/src/model/typedef.dart @@ -20,7 +20,6 @@ class Typedef extends ModelElement TypeAliasElement get element => super.element; ElementType _modelType; - @override ElementType get modelType => _modelType ??= ElementType.from(element.aliasedType, library, packageGraph); diff --git a/test/dartdoc_options_test.dart b/test/dartdoc_options_test.dart index e3de06e005..0a7b1cb5d3 100644 --- a/test/dartdoc_options_test.dart +++ b/test/dartdoc_options_test.dart @@ -637,13 +637,13 @@ dartdoc: equals( 'Field dartdoc.fileOptionList from ${path.canonicalize(dartdocOptionsTwo.path)}, set to [existing.dart, thing/that/does/not/exist], resolves to missing path: ' '"${path.joinAll([ - path.canonicalize(secondDir.path), - 'thing', - 'that', - 'does', - 'not', - 'exist' - ])}"')); + path.canonicalize(secondDir.path), + 'thing', + 'that', + 'does', + 'not', + 'exist' + ])}"')); // It doesn't matter that this fails. expect(dartdocOptionSetFiles['nonCriticalFileOption'].valueAt(firstDir), equals(path.joinAll([path.canonicalize(firstDir.path), 'whatever']))); @@ -663,9 +663,9 @@ dartdoc: equals( 'Field dartdoc.fileOption from ${path.canonicalize(dartdocOptionsTwo.path)}, set to not existing, resolves to missing path: ' '"${path.joinAll([ - path.canonicalize(secondDir.path), - "not existing" - ])}"')); + path.canonicalize(secondDir.path), + "not existing" + ])}"')); }); test('DartdocOptionSetFile works for directory options', () { From 90c3425a9151e4340ee3793e4faf92de5fca1263 Mon Sep 17 00:00:00 2001 From: Janice Collins Date: Wed, 17 Mar 2021 13:14:21 -0700 Subject: [PATCH 12/13] cleanup --- lib/src/model/field.dart | 7 ----- lib/src/model/model_element.dart | 44 +------------------------------- 2 files changed, 1 insertion(+), 50 deletions(-) diff --git a/lib/src/model/field.dart b/lib/src/model/field.dart index 0b464dc03e..fe84d8d875 100644 --- a/lib/src/model/field.dart +++ b/lib/src/model/field.dart @@ -23,7 +23,6 @@ class Field extends ModelElement assert(getter != null || setter != null); if (getter != null) getter.enclosingCombo = this; if (setter != null) setter.enclosingCombo = this; - _setModelType(); } factory Field.inherited( @@ -192,12 +191,6 @@ class Field extends ModelElement return _sourceCode; } - void _setModelType() { - if (hasGetter) { - setModelType(getter.modelType); - } - } - @override Inheritable get overriddenElement => null; } diff --git a/lib/src/model/model_element.dart b/lib/src/model/model_element.dart index 4ec83efd18..43e095edcc 100644 --- a/lib/src/model/model_element.dart +++ b/lib/src/model/model_element.dart @@ -12,10 +12,9 @@ import 'package:analyzer/dart/element/type.dart' show FunctionType; import 'package:analyzer/source/line_info.dart'; import 'package:analyzer/src/dart/element/element.dart'; import 'package:analyzer/src/dart/element/member.dart' - show ExecutableMember, Member, ParameterMember; + show ExecutableMember, Member; import 'package:collection/collection.dart'; import 'package:dartdoc/src/dartdoc_options.dart'; -import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/model/documentation_comment.dart'; import 'package:dartdoc/src/model/feature_set.dart'; import 'package:dartdoc/src/model/model.dart'; @@ -143,7 +142,6 @@ abstract class ModelElement extends Canonicalization final Member /*?*/ _originalMember; final Library /*?*/ _library; - ElementType _modelType; String _rawDocs; Documentation __documentation; UnmodifiableListView _parameters; @@ -984,46 +982,6 @@ abstract class ModelElement extends Canonicalization String get linkedParamsNoMetadataOrNames => _parameterRenderer .renderLinkedParams(parameters, showMetadata: false, showNames: false); - //ElementType get modelType; - ElementType get modelTypeReal { - var element = this.element; - if (_modelType == null) { - // TODO(jcollins-g): Need an interface for a "member with a type" (or changed object model). - if (_originalMember != null && - (_originalMember is ExecutableMember || - _originalMember is ParameterMember)) { - if (_originalMember is ExecutableMember) { - _modelType = ElementType.from( - (_originalMember as ExecutableMember).type, - library, - packageGraph); - } else { - // ParameterMember - _modelType = ElementType.from( - (_originalMember as ParameterMember).type, library, packageGraph); - } - } else if (element is ClassElement) { - _modelType = ElementType.from(element.thisType, library, packageGraph); - } else if (element is TypeAliasElement) { - _modelType = - ElementType.from(element.aliasedType, library, packageGraph); - } else if (element is FunctionTypedElement) { - _modelType = ElementType.from(element.type, library, packageGraph); - } else if (element is ParameterElement) { - _modelType = ElementType.from(element.type, library, packageGraph); - } else if (element is PropertyInducingElement) { - _modelType = ElementType.from(element.type, library, packageGraph); - } else { - throw UnimplementedError('(${element.runtimeType}) $element'); - } - } - return _modelType; - } - - void setModelType(ElementType type) { - _modelType = type; - } - String _name; @override From a0fc976c5e8611a73e16bd26da7cf8f3c5181a12 Mon Sep 17 00:00:00 2001 From: Janice Collins Date: Thu, 18 Mar 2021 09:48:53 -0700 Subject: [PATCH 13/13] dartfmt and review comments --- lib/src/model/accessor.dart | 13 ++----------- lib/src/model/method.dart | 13 ++----------- test/dartdoc_options_test.dart | 20 ++++++++++---------- 3 files changed, 14 insertions(+), 32 deletions(-) diff --git a/lib/src/model/accessor.dart b/lib/src/model/accessor.dart index 5a142389ef..5b2f78db48 100644 --- a/lib/src/model/accessor.dart +++ b/lib/src/model/accessor.dart @@ -26,17 +26,8 @@ class Accessor extends ModelElement implements EnclosedElement { ExecutableMember get originalMember => super.originalMember; CallableElementTypeMixin _modelType; - CallableElementTypeMixin get modelType { - if (_modelType == null) { - if (originalMember != null) { - _modelType = - ElementType.from(originalMember.type, library, packageGraph); - } else { - _modelType = ElementType.from(element.type, library, packageGraph); - } - } - return _modelType; - } + CallableElementTypeMixin get modelType => _modelType ??= + ElementType.from((originalMember ?? element).type, library, packageGraph); bool get isSynthetic => element.isSynthetic; diff --git a/lib/src/model/method.dart b/lib/src/model/method.dart index 4b7205d4e7..b3fd60290e 100644 --- a/lib/src/model/method.dart +++ b/lib/src/model/method.dart @@ -97,17 +97,8 @@ class Method extends ModelElement ExecutableMember get originalMember => super.originalMember; CallableElementTypeMixin _modelType; - CallableElementTypeMixin get modelType { - if (_modelType == null) { - if (originalMember != null) { - _modelType = - ElementType.from(originalMember.type, library, packageGraph); - } else { - _modelType = ElementType.from(element.type, library, packageGraph); - } - } - return _modelType; - } + CallableElementTypeMixin get modelType => _modelType ??= + ElementType.from((originalMember ?? element).type, library, packageGraph); @override Method get overriddenElement { diff --git a/test/dartdoc_options_test.dart b/test/dartdoc_options_test.dart index 0a7b1cb5d3..e3de06e005 100644 --- a/test/dartdoc_options_test.dart +++ b/test/dartdoc_options_test.dart @@ -637,13 +637,13 @@ dartdoc: equals( 'Field dartdoc.fileOptionList from ${path.canonicalize(dartdocOptionsTwo.path)}, set to [existing.dart, thing/that/does/not/exist], resolves to missing path: ' '"${path.joinAll([ - path.canonicalize(secondDir.path), - 'thing', - 'that', - 'does', - 'not', - 'exist' - ])}"')); + path.canonicalize(secondDir.path), + 'thing', + 'that', + 'does', + 'not', + 'exist' + ])}"')); // It doesn't matter that this fails. expect(dartdocOptionSetFiles['nonCriticalFileOption'].valueAt(firstDir), equals(path.joinAll([path.canonicalize(firstDir.path), 'whatever']))); @@ -663,9 +663,9 @@ dartdoc: equals( 'Field dartdoc.fileOption from ${path.canonicalize(dartdocOptionsTwo.path)}, set to not existing, resolves to missing path: ' '"${path.joinAll([ - path.canonicalize(secondDir.path), - "not existing" - ])}"')); + path.canonicalize(secondDir.path), + "not existing" + ])}"')); }); test('DartdocOptionSetFile works for directory options', () {