Skip to content

Commit

Permalink
Extract modelType out of ModelElement (#2583)
Browse files Browse the repository at this point in the history
* clean up element types and add display aliases test

* Everything except the actual change I want to make

* Fix tests and update templates

* dartfmt

* remove scaffolding

* begin extraction

* Exclude InterfaceType.  Hacky.

* refactor continuing

* dartfmt, finish modelType extraction

* todo:ignore and no dynamic

* fix it all

* cleanup

* dartfmt and review comments
  • Loading branch information
jcollins-g committed Mar 18, 2021
1 parent 52e50c9 commit 7022b7f
Show file tree
Hide file tree
Showing 14 changed files with 97 additions and 109 deletions.
29 changes: 17 additions & 12 deletions lib/src/model/accessor.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -16,11 +16,18 @@ 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;
PropertyAccessorElement get element => super.element;

@override
ExecutableMember get originalMember => super.originalMember;

CallableElementTypeMixin _modelType;
CallableElementTypeMixin get modelType => _modelType ??=
ElementType.from((originalMember ?? element).type, library, packageGraph);

bool get isSynthetic => element.isSynthetic;

Expand All @@ -31,7 +38,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');
}
Expand Down Expand Up @@ -85,12 +92,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
Expand All @@ -104,9 +111,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';
Expand All @@ -118,8 +125,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].
Expand Down Expand Up @@ -153,7 +158,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;
}
Expand Down
5 changes: 4 additions & 1 deletion lib/src/model/class.dart
Original file line number Diff line number Diff line change
Expand Up @@ -334,8 +334,11 @@ class Class extends Container
Iterable<DefinedElementType> 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,
Expand Down
18 changes: 10 additions & 8 deletions lib/src/model/constructor.dart
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,17 @@ 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<TypeParameter> get typeParameters =>
(enclosingElement as Class).typeParameters;

@override
ModelElement get enclosingElement =>
ModelElement.from(_constructor.enclosingElement, library, packageGraph);
ModelElement.from(element.enclosingElement, library, packageGraph);

@override
String get filePath =>
Expand Down Expand Up @@ -61,7 +64,7 @@ class Constructor extends ModelElement
}

@override
bool get isConst => _constructor.isConst;
bool get isConst => element.isConst;

bool get isUnnamedConstructor => name == enclosingElement.name;

Expand All @@ -70,13 +73,14 @@ 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';

@override
DefinedElementType get modelType => super.modelType;
DefinedElementType _modelType;
DefinedElementType get modelType =>
_modelType ??= ElementType.from(element.type, library, packageGraph);

String _name;

Expand Down Expand Up @@ -111,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);
}
4 changes: 4 additions & 0 deletions lib/src/model/dynamic.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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);

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
Expand Down
3 changes: 0 additions & 3 deletions lib/src/model/extension.dart
Original file line number Diff line number Diff line change
Expand Up @@ -93,9 +93,6 @@ class Extension extends Container
return _typeParameters;
}

@override
ParameterizedElementType get modelType => super.modelType;

List<ModelElement> _allModelElements;
@override
List<ModelElement> get allModelElements {
Expand Down
3 changes: 3 additions & 0 deletions lib/src/model/extension_target.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -27,6 +28,8 @@ mixin ExtensionTarget on ModelElement {
return _potentiallyApplicableExtensions;
}

ElementType get modelType;

List<Extension> get potentiallyApplicableExtensionsSorted =>
potentiallyApplicableExtensions.toList()..sort(byName);
}
7 changes: 0 additions & 7 deletions lib/src/model/field.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -192,12 +191,6 @@ class Field extends ModelElement
return _sourceCode;
}

void _setModelType() {
if (hasGetter) {
setModelType(getter.modelType);
}
}

@override
Inheritable get overriddenElement => null;
}
1 change: 0 additions & 1 deletion lib/src/model/getter_setter_combo.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
21 changes: 13 additions & 8 deletions lib/src/model/method.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand All @@ -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();
}
Expand All @@ -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;
}

Expand All @@ -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;
}

Expand Down Expand Up @@ -88,13 +88,17 @@ 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;
CallableElementTypeMixin get modelType => _modelType ??=
ElementType.from((originalMember ?? element).type, library, packageGraph);

@override
Method get overriddenElement {
Expand All @@ -112,7 +116,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
Expand Down
43 changes: 1 addition & 42 deletions lib/src/model/model_element.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -143,7 +142,6 @@ abstract class ModelElement extends Canonicalization
final Member /*?*/ _originalMember;
final Library /*?*/ _library;

ElementType _modelType;
String _rawDocs;
Documentation __documentation;
UnmodifiableListView<Parameter> _parameters;
Expand Down Expand Up @@ -984,45 +982,6 @@ abstract class ModelElement extends Canonicalization
String get linkedParamsNoMetadataOrNames => _parameterRenderer
.renderLinkedParams(parameters, showMetadata: false, showNames: false);

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).
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
Expand Down
6 changes: 5 additions & 1 deletion lib/src/model/model_function.dart
Original file line number Diff line number Diff line change
Expand Up @@ -70,5 +70,9 @@ class ModelFunctionTyped extends ModelElement
bool get isInherited => false;

@override
DefinedElementType get modelType => super.modelType;
FunctionTypedElement get element => super.element;

DefinedElementType _modelType;
DefinedElementType get modelType =>
_modelType ??= ElementType.from(element.type, library, packageGraph);
}
Loading

0 comments on commit 7022b7f

Please sign in to comment.