From a1e234e11ce86d24aba41226d0447f5e2d4a4c07 Mon Sep 17 00:00:00 2001 From: Keerti Parthasarathy Date: Tue, 4 Feb 2025 21:14:13 -0800 Subject: [PATCH] Elements. Migrate lib/src/model/model_element.dart (#3988) --- lib/src/element_type.dart | 4 +- .../templates.runtime_renderers.dart | 215 ++++++++------ lib/src/model/canonicalization.dart | 2 +- lib/src/model/constructor.dart | 10 +- lib/src/model/extension.dart | 4 +- lib/src/model/extension_type.dart | 7 +- lib/src/model/field.dart | 14 +- lib/src/model/library.dart | 4 +- lib/src/model/model_element.dart | 267 +++++++++--------- lib/src/model/nameable.dart | 12 +- 10 files changed, 291 insertions(+), 248 deletions(-) diff --git a/lib/src/element_type.dart b/lib/src/element_type.dart index 41b62fb657..a7eb04427d 100644 --- a/lib/src/element_type.dart +++ b/lib/src/element_type.dart @@ -214,7 +214,7 @@ mixin Aliased implements ElementType { bool get isTypedef => true; late final ModelElement aliasElement = - ModelElement.forElement2(typeAliasElement2, packageGraph); + ModelElement.forElement(typeAliasElement2, packageGraph); late final List aliasArguments = type.alias!.typeArguments .map((f) => getTypeFor(f, library)) @@ -322,7 +322,7 @@ abstract class DefinedElementType extends ElementType { @internal @override CommentReferable get definingCommentReferable => - ModelElement.forElement2(modelElement.element2, packageGraph); + ModelElement.forElement(modelElement.element2, packageGraph); } /// Any callable [ElementType] will mix-in this class, whether anonymous or not, diff --git a/lib/src/generator/templates.runtime_renderers.dart b/lib/src/generator/templates.runtime_renderers.dart index fcf499fab9..803a73f0ea 100644 --- a/lib/src/generator/templates.runtime_renderers.dart +++ b/lib/src/generator/templates.runtime_renderers.dart @@ -3505,6 +3505,34 @@ class _Renderer_Constructor extends RendererBase { ); }, ), + 'element2': Property( + getValue: (CT_ c) => c.element2, + renderVariable: + (CT_ c, Property self, List remainingNames) => + self.renderSimpleVariable( + c, + remainingNames, + 'ConstructorElement2', + ), + + isNullValue: (CT_ c) => false, + + renderValue: ( + CT_ c, + RendererBase r, + List ast, + StringSink sink, + ) { + renderSimple( + c.element2, + ast, + r.template, + sink, + parent: r, + getters: _invisibleGetters['ConstructorElement2']!, + ); + }, + ), 'enclosingElement': Property( getValue: (CT_ c) => c.enclosingElement, renderVariable: ( @@ -13345,34 +13373,6 @@ class _Renderer_Library extends RendererBase { ); }, ), - 'compilationUnitElement': Property( - getValue: (CT_ c) => c.compilationUnitElement, - renderVariable: - (CT_ c, Property self, List remainingNames) => - self.renderSimpleVariable( - c, - remainingNames, - 'CompilationUnitElement', - ), - - isNullValue: (CT_ c) => false, - - renderValue: ( - CT_ c, - RendererBase r, - List ast, - StringSink sink, - ) { - renderSimple( - c.compilationUnitElement, - ast, - r.template, - sink, - parent: r, - getters: _invisibleGetters['CompilationUnitElement']!, - ); - }, - ), 'constants': Property( getValue: (CT_ c) => c.constants, renderVariable: @@ -14212,6 +14212,34 @@ class _Renderer_Library extends RendererBase { ); }, ), + 'unitElement': Property( + getValue: (CT_ c) => c.unitElement, + renderVariable: + (CT_ c, Property self, List remainingNames) => + self.renderSimpleVariable( + c, + remainingNames, + 'LibraryFragment', + ), + + isNullValue: (CT_ c) => false, + + renderValue: ( + CT_ c, + RendererBase r, + List ast, + StringSink sink, + ) { + renderSimple( + c.unitElement, + ast, + r.template, + sink, + parent: r, + getters: _invisibleGetters['LibraryFragment']!, + ); + }, + ), }, ) as Map>; @@ -14411,7 +14439,7 @@ class _Renderer_LibraryContainer extends RendererBase { } } -String renderLibrary(LibraryTemplateData context, Template template) { +String renderLibraryRedirect(LibraryTemplateData context, Template template) { var buffer = StringBuffer(); _render_LibraryTemplateData(context, template.ast, template, buffer); return buffer.toString(); @@ -14657,7 +14685,7 @@ class _Renderer_LibraryTemplateData extends RendererBase { } } -String renderLibraryRedirect(LibraryTemplateData context, Template template) { +String renderLibrary(LibraryTemplateData context, Template template) { var buffer = StringBuffer(); _render_LibraryTemplateData(context, template.ast, template, buffer); return buffer.toString(); @@ -16856,34 +16884,6 @@ class _Renderer_ModelElement extends RendererBase { ); }, ), - 'compilationUnitElement': Property( - getValue: (CT_ c) => c.compilationUnitElement, - renderVariable: - (CT_ c, Property self, List remainingNames) => - self.renderSimpleVariable( - c, - remainingNames, - 'CompilationUnitElement', - ), - - isNullValue: (CT_ c) => false, - - renderValue: ( - CT_ c, - RendererBase r, - List ast, - StringSink sink, - ) { - renderSimple( - c.compilationUnitElement, - ast, - r.template, - sink, - parent: r, - getters: _invisibleGetters['CompilationUnitElement']!, - ); - }, - ), 'config': Property( getValue: (CT_ c) => c.config, renderVariable: @@ -18013,6 +18013,34 @@ class _Renderer_ModelElement extends RendererBase { ); }, ), + 'unitElement': Property( + getValue: (CT_ c) => c.unitElement, + renderVariable: + (CT_ c, Property self, List remainingNames) => + self.renderSimpleVariable( + c, + remainingNames, + 'LibraryFragment', + ), + + isNullValue: (CT_ c) => false, + + renderValue: ( + CT_ c, + RendererBase r, + List ast, + StringSink sink, + ) { + renderSimple( + c.unitElement, + ast, + r.template, + sink, + parent: r, + getters: _invisibleGetters['LibraryFragment']!, + ); + }, + ), }, ) as Map>; @@ -20353,7 +20381,7 @@ class _Renderer_Package extends RendererBase { } } -String renderError(PackageTemplateData context, Template template) { +String renderIndex(PackageTemplateData context, Template template) { var buffer = StringBuffer(); _render_PackageTemplateData(context, template.ast, template, buffer); return buffer.toString(); @@ -20710,13 +20738,13 @@ class _Renderer_PackageTemplateData extends RendererBase { } } -String renderSearchPage(PackageTemplateData context, Template template) { +String renderError(PackageTemplateData context, Template template) { var buffer = StringBuffer(); _render_PackageTemplateData(context, template.ast, template, buffer); return buffer.toString(); } -String renderIndex(PackageTemplateData context, Template template) { +String renderSearchPage(PackageTemplateData context, Template template) { var buffer = StringBuffer(); _render_PackageTemplateData(context, template.ast, template, buffer); return buffer.toString(); @@ -26196,28 +26224,6 @@ const _invisibleGetters = { 'referenceParents', 'scope', }, - 'CompilationUnitElement': { - 'accessibleExtensions', - 'accessors', - 'classes', - 'enclosingElement3', - 'enums', - 'extensionTypes', - 'extensions', - 'functions', - 'hashCode', - 'libraryExports', - 'libraryImportPrefixes', - 'libraryImports', - 'lineInfo', - 'mixins', - 'parts', - 'runtimeType', - 'scope', - 'session', - 'topLevelVariables', - 'typeAliases', - }, 'Constructable': { 'constructors', 'extraReferenceChildren', @@ -26243,6 +26249,22 @@ const _invisibleGetters = { 'runtimeType', 'superConstructor', }, + 'ConstructorElement2': { + 'baseElement', + 'enclosingElement2', + 'firstFragment', + 'fragments', + 'hashCode', + 'isConst', + 'isDefaultConstructor', + 'isFactory', + 'isGenerative', + 'name3', + 'redirectedConstructor2', + 'returnType', + 'runtimeType', + 'superConstructor2', + }, 'ContainerModifier': { 'displayName', 'hashCode', @@ -26761,6 +26783,33 @@ const _invisibleGetters = { 'typeSystem', 'uri', }, + 'LibraryFragment': { + 'accessibleExtensions2', + 'classes2', + 'element', + 'enclosingFragment', + 'enums2', + 'extensionTypes2', + 'extensions2', + 'functions2', + 'getters', + 'hashCode', + 'importedLibraries2', + 'libraryExports2', + 'libraryImports2', + 'lineInfo', + 'mixins2', + 'nextFragment', + 'partIncludes', + 'prefixes', + 'previousFragment', + 'runtimeType', + 'scope', + 'setters', + 'source', + 'topLevelVariables2', + 'typeAliases2', + }, 'List': {'hashCode', 'length', 'reversed', 'runtimeType'}, 'Locatable': { 'documentationFrom', diff --git a/lib/src/model/canonicalization.dart b/lib/src/model/canonicalization.dart index a3e4a3e83b..ac2605c930 100644 --- a/lib/src/model/canonicalization.dart +++ b/lib/src/model/canonicalization.dart @@ -58,7 +58,7 @@ Library? canonicalLibraryCandidate(ModelElement modelElement) { } var topLevelModelElement = - ModelElement.forElement2(topLevelElement, modelElement.packageGraph); + ModelElement.forElement(topLevelElement, modelElement.packageGraph); return _Canonicalization(topLevelModelElement) .canonicalLibraryCandidate(candidateLibraries); diff --git a/lib/src/model/constructor.dart b/lib/src/model/constructor.dart index bb3cc963a6..343dabaec5 100644 --- a/lib/src/model/constructor.dart +++ b/lib/src/model/constructor.dart @@ -5,7 +5,10 @@ // ignore_for_file: analyzer_use_new_elements import 'package:analyzer/dart/element/element.dart'; +import 'package:analyzer/dart/element/element2.dart'; import 'package:analyzer/source/line_info.dart'; +// ignore: implementation_imports +import 'package:analyzer/src/utilities/extensions/element.dart'; import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; import 'package:dartdoc/src/model/kind.dart'; @@ -14,9 +17,12 @@ import 'package:dartdoc/src/model_utils.dart'; class Constructor extends ModelElement with ContainerMember, TypeParameters { @override - final ConstructorElement element; + ConstructorElement get element => element2.asElement; - Constructor(this.element, super.library, super.packageGraph); + @override + final ConstructorElement2 element2; + + Constructor(this.element2, super.library, super.packageGraph); @override CharacterLocation? get characterLocation { diff --git a/lib/src/model/extension.dart b/lib/src/model/extension.dart index a8937fe53b..7dcff42b13 100644 --- a/lib/src/model/extension.dart +++ b/lib/src/model/extension.dart @@ -110,12 +110,12 @@ class Extension extends Container { ContainerAccessor? getter, setter; final fieldGetter = field.getter2; if (fieldGetter != null) { - getter = ModelElement.for2_(fieldGetter, library, packageGraph, + getter = ModelElement.for_(fieldGetter, library, packageGraph, enclosingContainer: this) as ContainerAccessor; } final fieldSetter = field.setter2; if (fieldSetter != null) { - setter = ModelElement.for2_(fieldSetter, library, packageGraph, + setter = ModelElement.for_(fieldSetter, library, packageGraph, enclosingContainer: this) as ContainerAccessor; } return getModelForPropertyInducingElement(field.asElement, library, diff --git a/lib/src/model/extension_type.dart b/lib/src/model/extension_type.dart index 8069823524..7a5d54b456 100644 --- a/lib/src/model/extension_type.dart +++ b/lib/src/model/extension_type.dart @@ -16,16 +16,15 @@ import 'package:meta/meta.dart'; class ExtensionType extends InheritingContainer with Constructable { @override - final ExtensionTypeElement element; + ExtensionTypeElement get element => element2.asElement; @override - ExtensionTypeElement2 get element2 => - element.asElement2 as ExtensionTypeElement2; + final ExtensionTypeElement2 element2; late final ElementType representationType = getTypeFor(element.representation.type, library); - ExtensionType(this.element, super.library, super.packageGraph); + ExtensionType(this.element2, super.library, super.packageGraph); @override Library get enclosingElement => library; diff --git a/lib/src/model/field.dart b/lib/src/model/field.dart index b5cdb4d607..21d6a03367 100644 --- a/lib/src/model/field.dart +++ b/lib/src/model/field.dart @@ -42,7 +42,7 @@ class Field extends ModelElement this.setter, ) : isInherited = false, enclosingElement = - ModelElement.for_(element.enclosingElement3, library, packageGraph) + ModelElement.for_(element.asElement2.enclosingElement2, library, packageGraph) as Container, assert(getter != null || setter != null) { getter?.enclosingCombo = this; @@ -58,7 +58,7 @@ class Field extends ModelElement ) : element = element2.asElement as FieldElement, isInherited = false, enclosingElement = - ModelElement.for2_(element2.enclosingElement2!, library, packageGraph) + ModelElement.for_(element2.enclosingElement2!, library, packageGraph) as Container, assert(getter != null || setter != null) { getter?.enclosingCombo = this; @@ -66,26 +66,28 @@ class Field extends ModelElement } Field.providedByExtension( - this.element, + Element2 element2, this.enclosingElement, super.library, super.packageGraph, this.getter, this.setter, - ) : isInherited = false, + ) : element = element2.asElement as FieldElement, + isInherited = false, assert(getter != null || setter != null) { getter?.enclosingCombo = this; setter?.enclosingCombo = this; } Field.inherited( - this.element, + Element2 element2, this.enclosingElement, super.library, super.packageGraph, this.getter, this.setter, - ) : isInherited = true, + ) : element = element2.asElement as FieldElement, + isInherited = true, assert(getter != null || setter != null) { // Can't set `isInherited` to true if this is the defining element, because // that would mean it isn't inherited. diff --git a/lib/src/model/library.dart b/lib/src/model/library.dart index 6bda7b2c99..5152ccf6f9 100644 --- a/lib/src/model/library.dart +++ b/lib/src/model/library.dart @@ -120,8 +120,8 @@ class Library extends ModelElement } @override - CompilationUnitElement get compilationUnitElement => - element.definingCompilationUnit; + LibraryFragment get unitElement => + element2.library2.firstFragment; @override diff --git a/lib/src/model/model_element.dart b/lib/src/model/model_element.dart index d59c757007..2c7f3f8394 100644 --- a/lib/src/model/model_element.dart +++ b/lib/src/model/model_element.dart @@ -2,8 +2,6 @@ // 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. -// ignore_for_file: analyzer_use_new_elements - /// The models used to represent Dart code. library; @@ -15,8 +13,10 @@ import 'package:analyzer/dart/element/element2.dart'; import 'package:analyzer/dart/element/type.dart' show FunctionType; import 'package:analyzer/source/line_info.dart'; // ignore: implementation_imports +import 'package:analyzer/src/dart/element/element.dart'; +// ignore: implementation_imports import 'package:analyzer/src/dart/element/member.dart' - show ExecutableMember, Member, ParameterMember; + show ExecutableMember, FieldMember, Member, ParameterMember; // ignore: implementation_imports import 'package:analyzer/src/utilities/extensions/element.dart'; import 'package:dartdoc/src/dartdoc_options.dart'; @@ -83,25 +83,25 @@ abstract class ModelElement ModelElement(this._library, this._packageGraph, {Member? originalMember}) : _originalMember = originalMember; - /// Returns a [ModelElement] for an [Element], which can be a + /// Returns a [ModelElement] for an [Element2], which can be a /// property-inducing element or not. /// /// This constructor is used when the caller does not know the element's /// library, or whether it is property-inducing. - factory ModelElement.forElement(Element e, PackageGraph p) { - if (e is MultiplyDefinedElement) { + factory ModelElement.forElement(Element2 e, PackageGraph p) { + if (e is MultiplyDefinedElement2) { // The code-to-document has static errors. We can pick the first // conflicting element and move on. - e = e.conflictingElements.first; + e = e.conflictingElements2.first; } - var library = p.findButDoNotCreateLibraryFor(e.asElement2!) ?? Library.sentinel; + var library = p.findButDoNotCreateLibraryFor(e) ?? Library.sentinel; - if (e is PropertyInducingElement) { - var elementGetter = e.getter; + if (e is PropertyInducingElement2) { + var elementGetter = e.getter2; var getter = elementGetter != null ? ModelElement.for_(elementGetter, library, p) as Accessor : null; - var elementSetter = e.setter; + var elementSetter = e.setter2; var setter = elementSetter != null ? ModelElement.for_(elementSetter, library, p) as Accessor : null; @@ -112,22 +112,13 @@ abstract class ModelElement return ModelElement.for_(e, library, p); } - /// Returns a [ModelElement] for an [Element2], which can be a - /// property-inducing element or not. - /// - /// This constructor is used when the caller does not know the element's - /// library, or whether it is property-inducing. - factory ModelElement.forElement2(Element2 e, PackageGraph p) { - return ModelElement.forElement(e.asElement!, p); - } - /// Returns a [ModelElement] for a property-inducing element. /// /// Do not construct any [ModelElement]s except from this constructor or /// [ModelElement.for_]. Specify [enclosingContainer] if and only if this is /// to be an inherited or extended object. factory ModelElement.forPropertyInducingElement( - PropertyInducingElement e, + PropertyInducingElement2 e, Library library, PackageGraph packageGraph, { required Accessor? getter, @@ -137,24 +128,24 @@ abstract class ModelElement // TODO(jcollins-g): Refactor object model to instantiate 'ModelMembers' // for members? if (e is Member) { - e = e.declaration as PropertyInducingElement; + e = e.baseElement as PropertyInducingElement2; } // Return the cached ModelElement if it exists. var cachedModelElement = packageGraph.allConstructedModelElements[ - ConstructedModelElementsKey(e.asElement2!, enclosingContainer)]; + ConstructedModelElementsKey(e, enclosingContainer)]; if (cachedModelElement != null) { return cachedModelElement; } ModelElement newModelElement; - if (e is TopLevelVariableElement) { + if (e is TopLevelVariableElement2) { assert(getter != null || setter != null); newModelElement = - TopLevelVariable(e.asElement2, library, packageGraph, getter, setter); - } else if (e is FieldElement) { + TopLevelVariable(e, library, packageGraph, getter, setter); + } else if (e is FieldElement2) { if (enclosingContainer is Extension) { - newModelElement = Field(e, library, packageGraph, + newModelElement = Field.element2(e, library, packageGraph, getter as ContainerAccessor?, setter as ContainerAccessor?); } else if (enclosingContainer == null) { if (e.isEnumConstant) { @@ -169,19 +160,19 @@ abstract class ModelElement 'Enum $e (${e.runtimeType}) does not have a constant value.'); } var index = constantIndex.toIntValue()!; - newModelElement = EnumField.forConstant( - index, e.asElement2, library, packageGraph, getter); - } else if (e.enclosingElement3 is ExtensionElement) { - newModelElement = Field(e, library, packageGraph, + newModelElement = + EnumField.forConstant(index, e, library, packageGraph, getter); + } else if (e.enclosingElement2 is ExtensionElement2) { + newModelElement = Field.element2(e, library, packageGraph, getter as ContainerAccessor?, setter as ContainerAccessor?); } else { - newModelElement = Field(e, library, packageGraph, + newModelElement = Field.element2(e, library, packageGraph, getter as ContainerAccessor?, setter as ContainerAccessor?); } } else { // Enum fields and extension getters can't be inherited, so this case is // simpler. - if (e.enclosingElement3 is ExtensionElement) { + if (e.enclosingElement2 is ExtensionElement2) { newModelElement = Field.providedByExtension( e, enclosingContainer, @@ -222,25 +213,28 @@ abstract class ModelElement // TODO(jcollins-g): Enforce construction restraint. // TODO(jcollins-g): Allow e to be null and drop extraneous null checks. factory ModelElement.for_( - Element e, Library library, PackageGraph packageGraph, + Element2 e, Library library, PackageGraph packageGraph, {Container? enclosingContainer}) { assert(library != Library.sentinel || - e is ParameterElement || - e is TypeParameterElement || - e is GenericFunctionTypeElement || + e is FormalParameterElement || + e is TypeParameterElement2 || + e is GenericFunctionTypeElement2 || e.kind == ElementKind.DYNAMIC || e.kind == ElementKind.NEVER); Member? originalMember; // TODO(jcollins-g): Refactor object model to instantiate 'ModelMembers' // for members? - if (e is Member) { + if (e is ExecutableMember) { + originalMember = e; + e = e.baseElement; + } else if (e is FieldMember){ originalMember = e; - e = e.declaration; + e = e.baseElement; } // Return the cached ModelElement if it exists. - var key = ConstructedModelElementsKey(e.asElement2!, enclosingContainer); + var key = ConstructedModelElementsKey(e, enclosingContainer); var cachedModelElement = packageGraph.allConstructedModelElements[key]; if (cachedModelElement != null) { return cachedModelElement; @@ -248,11 +242,11 @@ abstract class ModelElement if (e.kind == ElementKind.DYNAMIC) { return packageGraph.allConstructedModelElements[key] = - Dynamic(e.asElement2!, packageGraph); + Dynamic(e, packageGraph); } if (e.kind == ElementKind.NEVER) { return packageGraph.allConstructedModelElements[key] = - NeverType(e.asElement2!, packageGraph); + NeverType(e, packageGraph); } var newModelElement = ModelElement._constructFromElementDeclaration( @@ -269,117 +263,105 @@ abstract class ModelElement return newModelElement; } - factory ModelElement.for2_( - Element2 e, Library library, PackageGraph packageGraph, - {Container? enclosingContainer}) { - return ModelElement.for_(e.asElement!, library, packageGraph, - enclosingContainer: enclosingContainer); - } - /// Caches a newly-created [ModelElement] from [ModelElement.for_] or /// [ModelElement.forPropertyInducingElement]. static void _cacheNewModelElement( - Element e, ModelElement newModelElement, Library library, + Element2 e, ModelElement newModelElement, Library library, {Container? enclosingContainer}) { // TODO(jcollins-g): Reenable Parameter caching when dart-lang/sdk#30146 // is fixed? assert(enclosingContainer == null || enclosingContainer.library == library, '$enclosingContainer.library != $library'); - var element = e.asElement2!; if (library != Library.sentinel && newModelElement is! Parameter) { runtimeStats.incrementAccumulator('modelElementCacheInsertion'); - var key = ConstructedModelElementsKey(element, enclosingContainer); + var key = ConstructedModelElementsKey(e, enclosingContainer); library.packageGraph.allConstructedModelElements[key] = newModelElement; if (newModelElement is Inheritable) { library.packageGraph.allInheritableElements - .putIfAbsent(InheritableElementsKey(element, library), () => {}) + .putIfAbsent(InheritableElementsKey(e, library), () => {}) .add(newModelElement); } } } static ModelElement _constructFromElementDeclaration( - Element e, + Element2 e, Library library, PackageGraph packageGraph, { Container? enclosingContainer, Member? originalMember, }) { return switch (e) { - LibraryElement() => packageGraph.findButDoNotCreateLibraryFor(e.asElement2)!, - PrefixElement() => Prefix(e.asElement2, library, packageGraph), - EnumElement() => Enum(e.asElement2, library, packageGraph), - MixinElement() => Mixin(e.asElement2, library, packageGraph), - ClassElement() => Class(e.asElement2, library, packageGraph), - ExtensionElement() => Extension(e.asElement2, library, packageGraph), - ExtensionTypeElement() => ExtensionType(e, library, packageGraph), - FunctionElement() => ModelFunction( - e.asElement2 as TopLevelFunctionElement, library, packageGraph), - ConstructorElement() => Constructor(e, library, packageGraph), - GenericFunctionTypeElement() => ModelFunctionTypedef( - e.asElement2 as FunctionTypedElement2, library, packageGraph), - TypeAliasElement(aliasedType: FunctionType()) => - FunctionTypedef(e.asElement2, library, packageGraph), - TypeAliasElement() - when e.aliasedType.documentableElement2.asElement - is InterfaceElement => - ClassTypedef(e.asElement2, library, packageGraph), - TypeAliasElement() => - GeneralizedTypedef(e.asElement2, library, packageGraph), - MethodElement(isOperator: true) when enclosingContainer == null => - Operator(e.asElement2, library, packageGraph), - MethodElement(isOperator: true) - when e.enclosingElement3 is ExtensionElement => + LibraryElement2() => packageGraph.findButDoNotCreateLibraryFor(e)!, + PrefixElement2() => Prefix(e, library, packageGraph), + EnumElement2() => Enum(e, library, packageGraph), + MixinElement2() => Mixin(e, library, packageGraph), + ClassElement2() => Class(e, library, packageGraph), + ExtensionElement2() => Extension(e, library, packageGraph), + ExtensionTypeElement2() => ExtensionType(e, library, packageGraph), + TopLevelFunctionElement() => ModelFunction(e, library, packageGraph), + ConstructorElement2() => Constructor(e, library, packageGraph), + GenericFunctionTypeElement2() => + ModelFunctionTypedef(e as FunctionTypedElement2, library, packageGraph), + TypeAliasElement2(aliasedType: FunctionType()) => + FunctionTypedef(e, library, packageGraph), + TypeAliasElement2() + when e.aliasedType.documentableElement2 is InterfaceElement2 => + ClassTypedef(e, library, packageGraph), + TypeAliasElement2() => GeneralizedTypedef(e, library, packageGraph), + MethodElement2(isOperator: true) when enclosingContainer == null => + Operator(e, library, packageGraph), + MethodElement2(isOperator: true) + when e.enclosingElement2 is ExtensionElement2 => Operator.providedByExtension( - e.asElement2, enclosingContainer, library, packageGraph), - MethodElement(isOperator: true) => Operator.inherited( - e.asElement2, enclosingContainer, library, packageGraph, + e, enclosingContainer, library, packageGraph), + MethodElement2(isOperator: true) => Operator.inherited( + e, enclosingContainer, library, packageGraph, originalMember: originalMember), - MethodElement(isOperator: false) when enclosingContainer == null => - Method(e.asElement2, library, packageGraph), - MethodElement(isOperator: false) - when e.enclosingElement3 is ExtensionElement => + MethodElement2(isOperator: false) when enclosingContainer == null => + Method(e, library, packageGraph), + MethodElement2(isOperator: false) + when e.enclosingElement2 is ExtensionElement2 => Method.providedByExtension( - e.asElement2, enclosingContainer, library, packageGraph), - MethodElement(isOperator: false) => Method.inherited( - e.asElement2, enclosingContainer, library, packageGraph, + e, enclosingContainer, library, packageGraph), + MethodElement2(isOperator: false) => Method.inherited( + e, enclosingContainer, library, packageGraph, originalMember: originalMember as ExecutableMember?), - ParameterElement() => Parameter(e.asElement2, library, packageGraph, + FormalParameterElement() => Parameter(e, library, packageGraph, originalMember: originalMember as ParameterMember?), - PropertyAccessorElement() => _constructFromPropertyAccessor( + PropertyAccessorElement2() => _constructFromPropertyAccessor( e, library, packageGraph, enclosingContainer: enclosingContainer, originalMember: originalMember, ), - TypeParameterElement() => - TypeParameter(e.asElement2, library, packageGraph), + TypeParameterElement2() => TypeParameter(e, library, packageGraph), _ => throw UnimplementedError('Unknown type ${e.runtimeType}'), }; } - /// Constructs a [ModelElement] from a [PropertyAccessorElement]. + /// Constructs a [ModelElement] from a [PropertyAccessorElement2]. static ModelElement _constructFromPropertyAccessor( - PropertyAccessorElement e, + PropertyAccessorElement2 e, Library library, PackageGraph packageGraph, { required Container? enclosingContainer, required Member? originalMember, }) { // Accessors can be part of a [Container], or a part of a [Library]. - if (e.enclosingElement3 is ExtensionElement || - e.enclosingElement3 is InterfaceElement) { + if (e.enclosingElement2 is ExtensionElement2 || + e.enclosingElement2 is InterfaceElement2) { if (enclosingContainer == null || enclosingContainer is Extension) { - return ContainerAccessor(e.asElement2, library, packageGraph, enclosingContainer); + return ContainerAccessor(e, library, packageGraph, enclosingContainer); } return ContainerAccessor.inherited( - e.asElement2, library, packageGraph, enclosingContainer, + e, library, packageGraph, enclosingContainer, originalMember: originalMember as ExecutableMember?); } - return Accessor(e.asElement2, library, packageGraph); + return Accessor(e, library, packageGraph); } /// The model element enclosing this one. @@ -400,7 +382,7 @@ abstract class ModelElement Iterable get displayedCategories => const []; @override - ModelNode? get modelNode => packageGraph.getModelNodeFor(element.asElement2!); + ModelNode? get modelNode => packageGraph.getModelNodeFor(element2); /// This element's [Annotation]s. /// @@ -408,7 +390,7 @@ abstract class ModelElement /// supposed to be invisible (like `@pragma`). While `null` elements indicate /// invalid code from analyzer's perspective, some are present in `sky_engine` /// (`@Native`) so we don't want to crash here. - late final List annotations = element.metadata + late final List annotations = element2.metadata .where((m) => m.isVisibleAnnotation) .map((m) => Annotation(m, library, packageGraph)) .toList(growable: false); @@ -435,7 +417,7 @@ abstract class ModelElement return false; } - if (element case LibraryElement(:var identifier, :var source)) { + if (element2 case LibraryElement2(:var identifier, :var firstFragment)) { // Private Dart SDK libraries are not public. if (identifier.startsWith('dart:_') || identifier.startsWith('dart:nativewrappers/') || @@ -443,7 +425,7 @@ abstract class ModelElement return false; } // Package-private libraries are not public. - var elementUri = source.uri; + var elementUri = firstFragment.source.uri; if (elementUri.scheme == 'package' && elementUri.pathSegments[1] == 'src') { return false; @@ -484,9 +466,9 @@ abstract class ModelElement /// Whether this is a function, or if it is an type alias to a function. bool get isCallable => - element is FunctionTypedElement || - (element is TypeAliasElement && - (element as TypeAliasElement).aliasedType is FunctionType); + element2 is FunctionTypedElement2 || + (element2 is TypeAliasElement2 && + (element2 as TypeAliasElement2).aliasedType is FunctionType); /// The canonical ModelElement for this ModelElement, or null if there isn't /// one. @@ -568,10 +550,11 @@ abstract class ModelElement documentationFrom.map((e) => e.documentationLocal).join('

')); @override - Element get element; + // ignore: analyzer_use_new_elements + Element get element => element2.asElement!; @override - Element2 get element2 => element.asElement2!; + Element2 get element2; @override String get location { @@ -609,23 +592,27 @@ abstract class ModelElement }(); @override - String get sourceFileName => element.source!.fullName; + String get sourceFileName => element2.library2!.firstFragment.source.fullName; @override late final CharacterLocation? characterLocation = () { - final lineInfo = compilationUnitElement.lineInfo; - late final element = this.element; - assert(element.nameOffset >= 0, + final lineInfo = unitElement.lineInfo; + late final element = element2; + var nameOffset = element.firstFragment.nameOffset2; + if (element is LibraryElementImpl) { + nameOffset = element.nameOffset; + } else if (element is ConstructorElement2) { + nameOffset = (element.firstFragment as ConstructorElementImpl).nameOffset; + } + assert(nameOffset != null && nameOffset >= 0, 'Invalid location data for element: $fullyQualifiedName'); - var nameOffset = element.nameOffset; - if (nameOffset >= 0) { + if (nameOffset != null && nameOffset >= 0) { return lineInfo.getLocation(nameOffset); } return null; }(); - CompilationUnitElement get compilationUnitElement => - element.thisOrAncestorOfType()!; + LibraryFragment get unitElement => element2.library2!.firstFragment; bool get hasAnnotations => annotations.isNotEmpty; @@ -652,13 +639,13 @@ abstract class ModelElement bool get isDeprecated { // If element.metadata is empty, it might be because this is a property // where the metadata belongs to the individual getter/setter - if (element.metadata.isEmpty && element is PropertyInducingElement) { - var pie = element as PropertyInducingElement; + if (element2.metadata.isEmpty && element2 is PropertyInducingElement2) { + var pie = element2 as PropertyInducingElement2; // The getter or the setter might be null – so the stored value may be // `true`, `false`, or `null` - var getterDeprecated = pie.getter?.metadata.any((a) => a.isDeprecated); - var setterDeprecated = pie.setter?.metadata.any((a) => a.isDeprecated); + var getterDeprecated = pie.getter2?.metadata.any((a) => a.isDeprecated); + var setterDeprecated = pie.setter2?.metadata.any((a) => a.isDeprecated); var deprecatedValues = [getterDeprecated, setterDeprecated].nonNulls; @@ -669,7 +656,7 @@ abstract class ModelElement // deprecated if both are deprecated. return deprecatedValues.every((d) => d); } - return element.metadata.any((a) => a.isDeprecated); + return element2.metadata.any((a) => a.isDeprecated); } @override @@ -693,8 +680,8 @@ abstract class ModelElement // If `name` is empty, we probably have the wrong Element association or // there's an analyzer issue. assert(name.isNotEmpty || - element.kind == ElementKind.DYNAMIC || - element.kind == ElementKind.NEVER || + element2.kind == ElementKind.DYNAMIC || + element2.kind == ElementKind.NEVER || this is ModelFunction); final href = this.href; @@ -732,7 +719,7 @@ abstract class ModelElement _parameterRenderer.renderLinkedParams(parameters, showMetadata: false); @override - String get name => element.name!; + String get name => element2.lookupName!; @override String get oneLineDoc => elementDocumentation.asOneLiner; @@ -753,32 +740,32 @@ abstract class ModelElement // TODO(srawlins): This really smells like it should just be implemented in // the subclasses. late final List parameters = () { - final element = this.element; + final element = element2; if (!isCallable) { throw StateError( '$element (${element.runtimeType}) cannot have parameters'); } - final List params; - if (element is TypeAliasElement) { + final List params; + if (element is TypeAliasElement2) { final aliasedType = element.aliasedType; if (aliasedType is FunctionType) { - params = aliasedType.parameters; + params = aliasedType.formalParameters; } else { return const []; } - } else if (element is ExecutableElement) { + } else if (element is ExecutableElement2) { if (_originalMember != null) { assert(_originalMember is ExecutableMember); - params = (_originalMember as ExecutableMember).parameters; + params = (_originalMember as ExecutableMember).formalParameters; } else { - params = element.parameters; + params = element.formalParameters; } - } else if (element is FunctionTypedElement) { + } else if (element is FunctionTypedElement2) { if (_originalMember != null) { - params = (_originalMember as FunctionTypedElement).parameters; + params = (_originalMember as FunctionTypedElement2).formalParameters; } else { - params = element.parameters; + params = element.formalParameters; } } else { return const []; @@ -809,8 +796,8 @@ abstract class ModelElement @internal @override CommentReferable get definingCommentReferable { - var element = this.element; - return getModelForElement(element); + var element = element2; + return getModelForElement2(element); } String get linkedObjectType => _packageGraph.dartCoreObject; @@ -821,11 +808,11 @@ extension on ElementAnnotation { /// /// At the moment, `pragma` is the only invisible annotation. bool get isVisibleAnnotation { - if (element == null) return false; + if (element2 == null) return false; - if (element case ConstructorElement(:var enclosingElement3)) { - return !(enclosingElement3.name == 'pragma' && - enclosingElement3.library.name == 'dart.core'); + if (element2 case ConstructorElement2(:var enclosingElement2)) { + return !(enclosingElement2.name3 == 'pragma' && + enclosingElement2.library2.name3 == 'dart.core'); } return true; diff --git a/lib/src/model/nameable.dart b/lib/src/model/nameable.dart index 36ddb4935d..a7fc9c4f70 100644 --- a/lib/src/model/nameable.dart +++ b/lib/src/model/nameable.dart @@ -63,7 +63,7 @@ mixin Nameable { Container? enclosingContainer, }) => ModelElement.for_( - element, + element.asElement2!, library, packageGraph, enclosingContainer: enclosingContainer, @@ -78,7 +78,7 @@ mixin Nameable { Container? enclosingContainer, }) => ModelElement.for_( - element.asElement!, + element, library, packageGraph, enclosingContainer: enclosingContainer, @@ -89,14 +89,14 @@ mixin Nameable { /// A convenience method for [ModelElement.forElement], see its /// documentation. ModelElement getModelForElement(Element element) => - ModelElement.forElement(element, packageGraph); + ModelElement.forElement(element.asElement2!, packageGraph); /// Returns the [ModelElement] for [element], instantiating it if needed. /// /// A convenience method for [ModelElement.forElement], see its /// documentation. ModelElement getModelForElement2(Element2 element) => - ModelElement.forElement(element.asElement!, packageGraph); + ModelElement.forElement(element, packageGraph); /// Returns the [ModelElement] for [element], instantiating it if needed. /// @@ -113,7 +113,7 @@ mixin Nameable { Container? enclosingContainer, }) => ModelElement.forPropertyInducingElement( - element, + element.asElement2 as PropertyInducingElement2, library, packageGraph, getter: getter, @@ -136,7 +136,7 @@ mixin Nameable { Container? enclosingContainer, }) => ModelElement.forPropertyInducingElement( - element.asElement as PropertyInducingElement, + element, library, packageGraph, getter: getter,