Skip to content

Commit

Permalink
refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
jcollins-g committed Jun 2, 2021
1 parent 31fa623 commit 6e045ef
Show file tree
Hide file tree
Showing 11 changed files with 492 additions and 645 deletions.
148 changes: 30 additions & 118 deletions lib/src/element_type.dart
Expand Up @@ -54,10 +54,8 @@ abstract class ElementType extends Privacy with CommentReferable, Nameable {
var isGenericTypeAlias = f.aliasElement != null && f is! InterfaceType;
if (f is FunctionType) {
assert(f is ParameterizedType);
if (isGenericTypeAlias) {
return CallableGenericTypeAliasElementType(
f, library, packageGraph, element, returnedFrom);
}
assert(
!isGenericTypeAlias, 'should never occur: out of date analyzer?');
return CallableElementType(
f, library, packageGraph, element, returnedFrom);
} else if (isGenericTypeAlias) {
Expand Down Expand Up @@ -97,11 +95,11 @@ abstract class ElementType extends Privacy with CommentReferable, Nameable {
return '';
}

/// An unmodifiable list of this element type's parameters.
List<Parameter> get parameters;

DartType get instantiatedType;

/// An unmodifiable list of this element type's parameters.
Iterable<ElementType> get typeArguments;

bool isBoundSupertypeTo(ElementType t);
bool isSubtypeOf(ElementType t);

Expand Down Expand Up @@ -160,33 +158,22 @@ class UndefinedElementType extends ElementType {
String get linkedName => name;

@override
Map<String, CommentReferable> get referenceChildren => {};
Iterable<ElementType> get typeArguments => [];

@override
Iterable<CommentReferable> get referenceParents => [];
Map<String, CommentReferable> get referenceChildren => {};

@override
// TODO(jcollins-g): remove the need for an empty list here.
List<Parameter> get parameters => [];
Iterable<CommentReferable> get referenceParents => [];
}

/// A FunctionType that does not have an underpinning Element.
class FunctionTypeElementType extends UndefinedElementType
with CallableElementTypeMixin {
with Rendered, Callable {
FunctionTypeElementType(DartType f, Library library,
PackageGraph packageGraph, ElementType returnedFrom)
: super(f, library, packageGraph, returnedFrom);

@override
List<Parameter> get parameters => type.parameters
.map((p) => ModelElement.from(p, library, packageGraph) as Parameter)
.toList(growable: false);

@override
ElementType get returnType =>
ElementType.from(type.returnType, library, packageGraph,
returnedFrom: this);

/// An unmodifiable list of this function element's type parameters.
List<TypeParameter> get typeFormals => type.typeFormals
.map((p) => ModelElement.from(p, library, packageGraph) as TypeParameter)
Expand All @@ -196,64 +183,36 @@ class FunctionTypeElementType extends UndefinedElementType
String get name => 'Function';

@override
ElementTypeRenderer<FunctionTypeElementType> get _renderer =>
ElementTypeRenderer get _renderer =>
packageGraph.rendererFactory.functionTypeElementTypeRenderer;
}

class AliasedFunctionTypeElementType extends FunctionTypeElementType
with AliasedElementTypeMixin {
with Aliased {
AliasedFunctionTypeElementType(DartType f, Library library,
PackageGraph packageGraph, ElementType returnedFrom)
: super(f, library, packageGraph, returnedFrom);

@override
String get name => type.aliasElement.name;

@override
String _linkedName;
@override
String get linkedName {
_linkedName ??= _renderer.renderLinkedName(this);
return _linkedName;
}

@override
String _nameWithGenerics;
@override
String get nameWithGenerics {
_nameWithGenerics ??= _renderer.renderNameWithGenerics(this);
return _nameWithGenerics;
}

@override
ElementTypeRenderer<AliasedFunctionTypeElementType> get _renderer =>
packageGraph.rendererFactory.aliasedFunctionTypeElementTypeRenderer;
}

class ParameterizedElementType extends DefinedElementType {
class ParameterizedElementType extends DefinedElementType with Rendered {
ParameterizedElementType(ParameterizedType type, Library library,
PackageGraph packageGraph, ModelElement element, ElementType returnedFrom)
: super(type, library, packageGraph, element, returnedFrom);

String _linkedName;
@override
String get linkedName {
_linkedName ??= _renderer.renderLinkedName(this);
return _linkedName;
}

String _nameWithGenerics;
@override
String get nameWithGenerics {
_nameWithGenerics ??= _renderer.renderNameWithGenerics(this);
return _nameWithGenerics;
}

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

mixin AliasedElementTypeMixin implements ElementType {
/// A [ElementType] whose underlying type was referrred to by a type alias.
mixin Aliased implements ElementType {
@override
String get name => type.aliasElement.name;

@override
bool get isTypedef => true;

Expand All @@ -268,17 +227,15 @@ mixin AliasedElementTypeMixin implements ElementType {
.toList(growable: false);

Iterable<ElementType> _typeArguments;

/// An unmodifiable list of this element type's parameters.
@override
Iterable<ElementType> get typeArguments =>
_typeArguments ??= (type as ParameterizedType)
.typeArguments
.map((f) => ElementType.from(f, library, packageGraph))
.toList(growable: false);
}

class AliasedElementType extends ParameterizedElementType
with AliasedElementTypeMixin {
class AliasedElementType extends ParameterizedElementType with Aliased {
AliasedElementType(ParameterizedType type, Library library,
PackageGraph packageGraph, ModelElement element, ElementType returnedFrom)
: super(type, library, packageGraph, element, returnedFrom) {
Expand Down Expand Up @@ -340,20 +297,8 @@ abstract class DefinedElementType extends ElementType {
return canonicalClass?.isPublic ?? false;
}

@override
List<Parameter> get parameters =>
modelElement.isCallable ? modelElement.parameters : [];

ModelElement get returnElement => modelElement;
ElementType _returnType;
ElementType get returnType {
_returnType ??= ElementType.from(type, library, packageGraph);
return _returnType;
}

Iterable<ElementType> _typeArguments;

/// An unmodifiable list of this element type's parameters.
@override
Iterable<ElementType> get typeArguments =>
_typeArguments ??= (type as ParameterizedType)
.typeArguments
Expand Down Expand Up @@ -416,10 +361,10 @@ abstract class DefinedElementType extends ElementType {
}

/// Any callable ElementType will mix-in this class, whether anonymous or not.
mixin CallableElementTypeMixin implements ElementType {
ModelElement get returnElement => returnType is DefinedElementType
? (returnType as DefinedElementType).modelElement
: null;
mixin Callable implements ElementType {
List<Parameter> get parameters => type.parameters
.map((p) => ModelElement.from(p, library, packageGraph) as Parameter)
.toList(growable: false);

ElementType _returnType;
ElementType get returnType {
Expand All @@ -429,14 +374,11 @@ mixin CallableElementTypeMixin implements ElementType {

@override
FunctionType get type => _type;
}

Iterable<ElementType> _typeArguments;
Iterable<ElementType> get typeArguments =>
_typeArguments ??= type.aliasArguments
?.map((f) => ElementType.from(f, library, packageGraph))
?.toList() ??
[];

/// This [ElementType] uses an [ElementTypeRenderer] to generate
/// some of its parameters.
mixin Rendered implements ElementType {
String _linkedName;
@override
String get linkedName {
Expand All @@ -451,13 +393,12 @@ mixin CallableElementTypeMixin implements ElementType {
return _nameWithGenerics;
}

ElementTypeRenderer<CallableElementTypeMixin> get _renderer;
ElementTypeRenderer<ElementType> get _renderer;
}

/// A callable type that may or may not be backed by a declaration using the generic
/// function syntax.
class CallableElementType extends DefinedElementType
with CallableElementTypeMixin {
class CallableElementType extends DefinedElementType with Rendered, Callable {
CallableElementType(FunctionType t, Library library,
PackageGraph packageGraph, ModelElement element, ElementType returnedFrom)
: super(t, library, packageGraph, element, returnedFrom);
Expand All @@ -477,32 +418,3 @@ class GenericTypeAliasElementType extends TypeParameterElementType {
PackageGraph packageGraph, ModelElement element, ElementType returnedFrom)
: super(t, library, packageGraph, element, returnedFrom);
}

/// A Callable generic type alias that may or may not have a name.
class CallableGenericTypeAliasElementType extends DefinedElementType
with CallableElementTypeMixin {
CallableGenericTypeAliasElementType(FunctionType t, Library library,
PackageGraph packageGraph, ModelElement element, ElementType returnedFrom)
: super(t, library, packageGraph, element, returnedFrom);

ModelElement _returnElement;
@override
ModelElement get returnElement {
_returnElement ??= ModelElement.fromElement(
type.aliasElement.enclosingElement, packageGraph);
return _returnElement;
}

@override
ElementType get returnType {
_returnType ??= ElementType.from(type.returnType, library, packageGraph);
return _returnType;
}

@override
DartType get instantiatedType => type;

@override
ElementTypeRenderer<CallableGenericTypeAliasElementType> get _renderer =>
null;
}
4 changes: 2 additions & 2 deletions lib/src/generator/templates.dart
Expand Up @@ -41,15 +41,15 @@ import 'package:path/path.dart' as path show Context;

const _visibleTypes = {
Annotation,
CallableElementTypeMixin,
Callable,
Category,
Class,
Constructor,
DefinedElementType,
Documentable,
Enum,
Extension,
FeatureSet,
FunctionTypeElementType,
LanguageFeature,
Library,
LibraryContainer,
Expand Down

0 comments on commit 6e045ef

Please sign in to comment.