From f8c32e351699ea2af45c36660923388dd1082961 Mon Sep 17 00:00:00 2001 From: Fedor Shcheglov Date: Fri, 15 Aug 2025 16:08:17 -0700 Subject: [PATCH 01/14] 600 --- lib/src/dartdoc_options.dart | 8 ++--- lib/src/element_type.dart | 20 +++++------ lib/src/model/accessor.dart | 26 +++++++------- lib/src/model/annotation.dart | 6 ++-- lib/src/model/canonicalization.dart | 2 +- lib/src/model/comment_referable.dart | 4 +-- lib/src/model/documentation_comment.dart | 4 +-- lib/src/model/inheriting_container.dart | 8 ++--- pubspec.yaml | 2 +- tool/mustachio/codegen_runtime_renderer.dart | 38 ++++++++++---------- tool/mustachio/utilities.dart | 10 +++--- 11 files changed, 62 insertions(+), 66 deletions(-) diff --git a/lib/src/dartdoc_options.dart b/lib/src/dartdoc_options.dart index b4b23270c1..ad112bc92b 100644 --- a/lib/src/dartdoc_options.dart +++ b/lib/src/dartdoc_options.dart @@ -14,7 +14,7 @@ library; import 'dart:io' show exitCode, stderr, stdout; -import 'package:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/file_system/file_system.dart'; import 'package:args/args.dart'; import 'package:dartdoc/src/dartdoc.dart' show dartdocVersion, programName; @@ -1128,7 +1128,7 @@ class DartdocOptionContext extends DartdocOptionContextBase /// Build a DartdocOptionContext from an analyzer element (using its source /// location). factory DartdocOptionContext.fromElement(DartdocOptionSet optionSet, - LibraryElement2 libraryElement, ResourceProvider resourceProvider) { + LibraryElement libraryElement, ResourceProvider resourceProvider) { return DartdocOptionContext( optionSet, resourceProvider.getFile(libraryElement.firstFragment.source.fullName), @@ -1136,10 +1136,10 @@ class DartdocOptionContext extends DartdocOptionContextBase } /// Build a DartdocOptionContext from an existing [DartdocOptionContext] and a - /// new analyzer [Element2]. + /// new analyzer [Element]. factory DartdocOptionContext.fromContextElement( DartdocOptionContext optionContext, - LibraryElement2 libraryElement, + LibraryElement libraryElement, ResourceProvider resourceProvider) { return DartdocOptionContext.fromElement( optionContext.optionSet, libraryElement, resourceProvider); diff --git a/lib/src/element_type.dart b/lib/src/element_type.dart index df8185b334..810ca3d652 100644 --- a/lib/src/element_type.dart +++ b/lib/src/element_type.dart @@ -7,7 +7,7 @@ /// The only entrypoint for constructing these classes is [ElementType.for_]. library; -import 'package:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/nullability_suffix.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; @@ -67,7 +67,7 @@ abstract class ElementType with CommentReferable, Nameable { String toString() => '$type'; } -/// An [ElementType] that isn't pinned to an [Element2] (or one that is, but +/// An [ElementType] that isn't pinned to an [Element] (or one that is, but /// whose element is irrelevant). class UndefinedElementType extends ElementType { UndefinedElementType._(super.type, super.library, super.packageGraph) @@ -102,9 +102,9 @@ class UndefinedElementType extends ElementType { // We can not simply throw here because not all SDK libraries resolve // all types. if (type is InvalidType) return 'dynamic'; - assert(const {'Never'}.contains(type.documentableElement2?.name3), + assert(const {'Never'}.contains(type.documentableElement2?.name), 'Unrecognized type for UndefinedElementType: $type'); - return type.documentableElement2!.name3!; + return type.documentableElement2!.name!; } @override @@ -129,7 +129,7 @@ class UndefinedElementType extends ElementType { Iterable? get referenceGrandparentOverrides => null; } -/// A [FunctionType] that does not have an underpinning [Element2]. +/// A [FunctionType] that does not have an underpinning [Element]. class FunctionTypeElementType extends UndefinedElementType with Rendered, Callable { FunctionTypeElementType._( @@ -205,10 +205,10 @@ class ParameterizedElementType extends DefinedElementType with Rendered { /// An [ElementType] whose underlying type was referred to by a type alias. mixin Aliased implements ElementType { - Element2 get typeAliasElement2 => type.alias!.element2; + Element get typeAliasElement2 => type.alias!.element; @override - String get name => typeAliasElement2.name3!; + String get name => typeAliasElement2.name!; @override bool get isTypedef => true; @@ -253,7 +253,7 @@ class TypeParameterElementType extends DefinedElementType { String get nameWithGenericsPlain => '$name$nullabilitySuffix'; } -/// An [ElementType] associated with an [Element2]. +/// An [ElementType] associated with an [Element]. abstract class DefinedElementType extends ElementType { final ModelElement modelElement; @@ -263,7 +263,7 @@ abstract class DefinedElementType extends ElementType { factory DefinedElementType._from(DartType type, ModelElement modelElement, Library library, PackageGraph packageGraph) { - if (type is! TypeAliasElement2 && type.alias != null) { + if (type is! TypeAliasElement && type.alias != null) { // Here, `alias.element` signals that this is a type referring to an // alias. (`TypeAliasElement.alias.element` has different implications. // In that case it is an actual type alias of some kind (generic or @@ -288,7 +288,7 @@ abstract class DefinedElementType extends ElementType { } @override - String get name => type.documentableElement2!.name3!; + String get name => type.documentableElement2!.name!; @override String get fullyQualifiedName => modelElement.fullyQualifiedName; diff --git a/lib/src/model/accessor.dart b/lib/src/model/accessor.dart index 4bc5a76b83..f2b5c7129a 100644 --- a/lib/src/model/accessor.dart +++ b/lib/src/model/accessor.dart @@ -4,10 +4,10 @@ import 'dart:convert'; -import 'package:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/source/line_info.dart'; // ignore: implementation_imports -import 'package:analyzer/src/dart/element/member.dart' show ExecutableMember; +import 'package:analyzer/src/dart/element/member.dart' show SubstitutedExecutableElementImpl; import 'package:collection/collection.dart' show IterableExtension; import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; @@ -20,7 +20,7 @@ import 'package:dartdoc/src/warnings.dart'; class Accessor extends ModelElement { @override - final PropertyAccessorElement2 element; + final PropertyAccessorElement element; /// The combo ([Field] or [TopLevelVariable]) containing this accessor. /// @@ -31,7 +31,7 @@ class Accessor extends ModelElement { late final GetterSetterCombo enclosingCombo; Accessor(this.element, super.library, super.packageGraph, - {ExecutableMember? super.originalMember}); + {SubstitutedExecutableElementImpl? super.originalMember}); @override CharacterLocation? get characterLocation => element.isSynthetic @@ -39,8 +39,8 @@ class Accessor extends ModelElement { : super.characterLocation; @override - ExecutableMember? get originalMember => - super.originalMember as ExecutableMember?; + SubstitutedExecutableElementImpl? get originalMember => + super.originalMember as SubstitutedExecutableElementImpl?; late final Callable modelType = getTypeFor((originalMember ?? element).type, library) as Callable; @@ -49,7 +49,7 @@ class Accessor extends ModelElement { /// The [enclosingCombo] where this element was defined. late final GetterSetterCombo definingCombo = - getModelForElement(element.variable3!) as GetterSetterCombo; + getModelForElement(element.variable) as GetterSetterCombo; String get _sourceCode { if (!isSynthetic) { @@ -117,10 +117,10 @@ class Accessor extends ModelElement { } @override - ModelElement get enclosingElement => switch (element.enclosingElement2) { + ModelElement get enclosingElement => switch (element.enclosingElement) { LibraryFragment enclosingCompilationUnit => getModelForElement(enclosingCompilationUnit.element), - _ => getModelFor(element.enclosingElement2, library) + _ => getModelFor(element.enclosingElement, library) }; @override @@ -207,8 +207,8 @@ class ContainerAccessor extends Accessor with ContainerMember, Inheritable { @override ContainerAccessor? get overriddenElement { assert(packageGraph.allLibrariesAdded); - final parent = element.enclosingElement2; - if (parent is! InterfaceElement2) { + final parent = element.enclosingElement; + if (parent is! InterfaceElement) { return null; } for (final supertype in parent.allSupertypes) { @@ -223,12 +223,12 @@ class ContainerAccessor extends Accessor with ContainerMember, Inheritable { continue; } final parentContainer = - getModelForElement(supertype.element3) as InheritingContainer; + getModelForElement(supertype.element) as InheritingContainer; final possibleFields = parentContainer.declaredFields.where((f) => !f.isStatic); final fieldName = accessor.lookupName?.replaceFirst('=', ''); final foundField = - possibleFields.firstWhereOrNull((f) => f.element.name3 == fieldName); + possibleFields.firstWhereOrNull((f) => f.element.name == fieldName); if (foundField == null) { continue; } diff --git a/lib/src/model/annotation.dart b/lib/src/model/annotation.dart index 0897184f80..4ee553a25c 100644 --- a/lib/src/model/annotation.dart +++ b/lib/src/model/annotation.dart @@ -46,10 +46,10 @@ final class Annotation extends Attribute { : _modelType.linkedName; late final ElementType _modelType = switch (_annotation.element2) { - ConstructorElement2(:var returnType) => + ConstructorElement(:var returnType) => _packageGraph.getTypeFor(returnType, _library), - PropertyAccessorElement2(:var variable3?) => - (_packageGraph.getModelForElement(variable3) as GetterSetterCombo) + PropertyAccessorElement(:var variable) => + (_packageGraph.getModelForElement(variable) as GetterSetterCombo) .modelType, _ => throw StateError( 'non-callable element used as annotation?: ${_annotation.element2}') diff --git a/lib/src/model/canonicalization.dart b/lib/src/model/canonicalization.dart index 0556a02aa4..dc72ba3417 100644 --- a/lib/src/model/canonicalization.dart +++ b/lib/src/model/canonicalization.dart @@ -36,7 +36,7 @@ Library? canonicalLibraryCandidate(ModelElement modelElement) { if (modelElement is Library) return true; var lookup = l.element.exportNamespace.definedNames2[topLevelElementName]; return topLevelElement == - (lookup is PropertyAccessorElement2 ? lookup.variable3 : lookup); + (lookup is PropertyAccessorElement ? lookup.variable : lookup); }).toList(growable: true); if (candidateLibraries.isEmpty) { diff --git a/lib/src/model/comment_referable.dart b/lib/src/model/comment_referable.dart index 1816dbe1b6..fbfb2cd950 100644 --- a/lib/src/model/comment_referable.dart +++ b/lib/src/model/comment_referable.dart @@ -126,8 +126,8 @@ mixin CommentReferable implements Nameable { } ModelElement result; - if (resultElement is PropertyAccessorElement2) { - final variable = resultElement.variable3!; + if (resultElement is PropertyAccessorElement) { + final variable = resultElement.variable; if (variable.isSynthetic) { // First, cache the synthetic variable, so that the // PropertyAccessorElement getter and/or setter are set (see diff --git a/lib/src/model/documentation_comment.dart b/lib/src/model/documentation_comment.dart index 6aff687706..42efa3fee4 100644 --- a/lib/src/model/documentation_comment.dart +++ b/lib/src/model/documentation_comment.dart @@ -70,9 +70,7 @@ mixin DocumentationComment /// The rawest form of the documentation comment, including comment delimiters /// like `///`, `//`, `/*`, `*/`. - String get documentationComment => (element is Annotatable) - ? (element as Annotatable).documentationComment ?? '' - : ''; + String get documentationComment => element.documentationComment ?? ''; /// Whether `this` has a synthetic/inherited or local documentation comment, /// and false otherwise. diff --git a/lib/src/model/inheriting_container.dart b/lib/src/model/inheriting_container.dart index 5457a5e2c0..cffddbcb07 100644 --- a/lib/src/model/inheriting_container.dart +++ b/lib/src/model/inheriting_container.dart @@ -541,9 +541,9 @@ abstract class InheritingContainer extends Container { // Pick an appropriate [FieldElement] to represent this element. // Only hard when dealing with a synthetic [Field]. if (getter != null && setter == null) { - field = getterElement!.variable3 as FieldElement2; + field = getterElement!.variable as FieldElement; } else if (getter == null && setter != null) { - field = setterElement!.variable3 as FieldElement2; + field = setterElement!.variable as FieldElement; } else { // In this case: `getter != null && setter != null`. getter!; @@ -556,9 +556,9 @@ abstract class InheritingContainer extends Container { if (setterEnclosingElement is Class && setterEnclosingElement._isInheritingFrom( getter.enclosingElement as InheritingContainer)) { - field = setterElement!.variable3 as FieldElement2; + field = setterElement!.variable3 as FieldElement; } else { - field = getterElement!.variable3 as FieldElement2; + field = getterElement!.variable3 as FieldElement; } } } diff --git a/pubspec.yaml b/pubspec.yaml index cfd5e1333d..5f4a7978f0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -7,7 +7,7 @@ environment: sdk: ^3.6.0 dependencies: - analyzer: ^7.4.4 + analyzer: ^8.1.1 args: ^2.4.1 collection: ^1.17.0 crypto: ^3.0.3 diff --git a/tool/mustachio/codegen_runtime_renderer.dart b/tool/mustachio/codegen_runtime_renderer.dart index c54d3751a1..7c76212ec2 100644 --- a/tool/mustachio/codegen_runtime_renderer.dart +++ b/tool/mustachio/codegen_runtime_renderer.dart @@ -7,7 +7,7 @@ library; import 'dart:collection'; -import 'package:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/nullability_suffix.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:analyzer/dart/element/type_provider.dart'; @@ -48,18 +48,18 @@ class RuntimeRenderersBuilder { /// Maps a type to the name of the render function which can render that type /// as a context type. - final _typeToRenderFunctionName = {}; + final _typeToRenderFunctionName = {}; /// Maps a type to the name of the renderer class which can render that type /// as a context type. - final _typeToRendererClassName = {}; + final _typeToRendererClassName = {}; final Uri _sourceUri; final TypeProvider _typeProvider; final TypeSystem _typeSystem; - final Set _allVisibleElements; + final Set _allVisibleElements; /// Whether renderer classes are public. This should only be true for testing. final bool _rendererClassesArePublic; @@ -104,7 +104,7 @@ import '${path.basename(_sourceUri.path)}'; '''); specs.forEach(_addTypesForRendererSpec); - var builtRenderers = {}; + var builtRenderers = {}; var elementsToProcess = _typesToProcess.toList() ..sort((a, b) => a._typeName.compareTo(b._typeName)); @@ -135,21 +135,21 @@ import '${path.basename(_sourceUri.path)}'; spec.contextType.getters.forEach(_addPropertyToProcess); for (var mixin in spec.contextElement.mixins) { - _addTypeToProcess(mixin.element3, + _addTypeToProcess(mixin.element, isFullRenderer: true, includeRenderFunction: false); } var superclass = spec.contextElement.supertype; while (superclass != null) { // Any type specified with a renderer spec (`@Renderer`) is full. - _addTypeToProcess(superclass.element3, + _addTypeToProcess(superclass.element, isFullRenderer: true, includeRenderFunction: false); - for (var mixin in superclass.element3.mixins) { - _addTypeToProcess(mixin.element3, + for (var mixin in superclass.element.mixins) { + _addTypeToProcess(mixin.element, isFullRenderer: true, includeRenderFunction: false); } superclass.getters.forEach(_addPropertyToProcess); - superclass = superclass.element3.supertype; + superclass = superclass.element.supertype; } } @@ -717,17 +717,15 @@ extension on InterfaceElement2 { extension on GetterElement { // Whether this getter should be omitted from the runtime renderer code. bool get shouldBeOmitted { - var variable = variable3; return isPrivate || isStatic || - metadata2.hasInternal || - metadata2.hasProtected || - metadata2.hasVisibleForOverriding || - metadata2.hasVisibleForTesting || - variable == null || - variable.metadata2.hasInternal || - variable.metadata2.hasProtected || - variable.metadata2.hasVisibleForOverriding || - variable.metadata2.hasVisibleForTesting; + metadata.hasInternal || + metadata.hasProtected || + metadata.hasVisibleForOverriding || + metadata.hasVisibleForTesting || + variable.metadata.hasInternal || + variable.metadata.hasProtected || + variable.metadata.hasVisibleForOverriding || + variable.metadata.hasVisibleForTesting; } } diff --git a/tool/mustachio/utilities.dart b/tool/mustachio/utilities.dart index bf86a11a20..24e57a89f9 100644 --- a/tool/mustachio/utilities.dart +++ b/tool/mustachio/utilities.dart @@ -2,26 +2,26 @@ // 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:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; -extension InterfaceElementExtension on InterfaceElement2 { +extension InterfaceElementExtension on InterfaceElement { /// The type parameters, if any, as a String, including bounds and the angled /// brackets, otherwise a blank String. String get typeParametersString { - return asGenerics(typeParameters2.map((tp) => tp.displayString2())); + return asGenerics(typeParameters.map((tp) => tp.displayString())); } /// The type variables, if any, as a String, including the angled brackets, /// otherwise a blank String. String get typeVariablesString { - return asGenerics(typeParameters2.map((tp) => tp.name3!)); + return asGenerics(typeParameters.map((tp) => tp.name!)); } /// Returns the type parameters, and [extra], as they appear in a list of /// generics. String typeParametersStringWith(String extra) { return asGenerics([ - ...typeParameters2.map((tp) => tp.displayString2()), + ...typeParameters.map((tp) => tp.displayString()), extra, ]); } From c6f3dd47a830eb7a30eac0d373dcb52c52986dbc Mon Sep 17 00:00:00 2001 From: Fedor Shcheglov Date: Fri, 15 Aug 2025 16:15:34 -0700 Subject: [PATCH 02/14] 500 --- .../runtime_renderer_builder_test.dart | 38 +++++----- tool/mustachio/builder.dart | 6 +- tool/mustachio/codegen_aot_compiler.dart | 52 ++++++------- tool/mustachio/codegen_runtime_renderer.dart | 75 +++++++++---------- 4 files changed, 85 insertions(+), 86 deletions(-) diff --git a/test/mustachio/runtime_renderer_builder_test.dart b/test/mustachio/runtime_renderer_builder_test.dart index 197d317b4d..88832b03e2 100644 --- a/test/mustachio/runtime_renderer_builder_test.dart +++ b/test/mustachio/runtime_renderer_builder_test.dart @@ -8,7 +8,7 @@ library; import 'dart:io'; -import 'package:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:test/test.dart'; import 'package:test_descriptor/test_descriptor.dart' as d; @@ -16,7 +16,7 @@ import 'builder_test_base.dart'; void main() { group('builds a renderer class', () { - late final LibraryElement2 renderersLibrary; + late final LibraryElement renderersLibrary; late final String generatedContent; // Builders are fairly expensive (about 4 seconds per `testBuilder` call), @@ -61,23 +61,23 @@ class Baz {} test('for a class which is extended by a rendered class', () { // No render function is necessary. expect(renderersLibrary.getTopLevelFunction('_render_FooBase'), isNull); - expect(renderersLibrary.getClass2('_Renderer_FooBase'), isNotNull); + expect(renderersLibrary.getClass('_Renderer_FooBase'), isNotNull); }); test('for a class which is mixed into a rendered class', () { // No render function is necessary. expect(renderersLibrary.getTopLevelFunction('_render_Mix'), isNull); - expect(renderersLibrary.getClass2('_Renderer_Mix'), isNotNull); + expect(renderersLibrary.getClass('_Renderer_Mix'), isNotNull); }); test('for a type found in a getter', () { expect(renderersLibrary.getTopLevelFunction('_render_Bar'), isNotNull); - expect(renderersLibrary.getClass2('_Renderer_Bar'), isNotNull); + expect(renderersLibrary.getClass('_Renderer_Bar'), isNotNull); }); test('for a generic, bounded type found in a getter', () { expect(renderersLibrary.getTopLevelFunction('_render_Baz'), isNotNull); - expect(renderersLibrary.getClass2('_Renderer_Baz'), isNotNull); + expect(renderersLibrary.getClass('_Renderer_Baz'), isNotNull); }); test('with a property map', () { @@ -194,8 +194,8 @@ import 'annotations.dart'; expect(renderersLibrary.getTopLevelFunction('renderFoo'), isNotNull); expect(renderersLibrary.getTopLevelFunction('renderBar'), isNotNull); - expect(renderersLibrary.getClass2('_Renderer_Foo'), isNotNull); - expect(renderersLibrary.getClass2('_Renderer_Bar'), isNotNull); + expect(renderersLibrary.getClass('_Renderer_Foo'), isNotNull); + expect(renderersLibrary.getClass('_Renderer_Bar'), isNotNull); }); group('builds a renderer class for a generic type', () { @@ -270,18 +270,18 @@ class Baz {} var renderersLibrary = await resolveGeneratedLibrary2(runtimeRenderersPath); var fooRenderFunction = renderersLibrary.getTopLevelFunction('renderFoo')!; - expect(fooRenderFunction.typeParameters2, hasLength(1)); - var fBound = fooRenderFunction.typeParameters2.single.bound!; + expect(fooRenderFunction.typeParameters, hasLength(1)); + var fBound = fooRenderFunction.typeParameters.single.bound!; expect(fBound.getDisplayString(), equals('num')); - var fooRendererClass = renderersLibrary.getClass2('_Renderer_Foo')!; - expect(fooRendererClass.typeParameters2, hasLength(1)); - var cBound = fooRenderFunction.typeParameters2.single.bound!; + var fooRendererClass = renderersLibrary.getClass('_Renderer_Foo')!; + expect(fooRendererClass.typeParameters, hasLength(1)); + var cBound = fooRenderFunction.typeParameters.single.bound!; expect(cBound.getDisplayString(), equals('num')); }); group('does not generate a renderer', () { - late final LibraryElement2 renderersLibrary; + late final LibraryElement renderersLibrary; setUpAll(() async { await testMustachioBuilder(''' @@ -304,27 +304,27 @@ class Method {} test('found in a static getter', () { expect(renderersLibrary.getTopLevelFunction('_render_Static'), isNull); - expect(renderersLibrary.getClass2('_Renderer_Static'), isNull); + expect(renderersLibrary.getClass('_Renderer_Static'), isNull); }); test('found in a private getter', () { expect(renderersLibrary.getTopLevelFunction('_render_Private'), isNull); - expect(renderersLibrary.getClass2('_Renderer_Private'), isNull); + expect(renderersLibrary.getClass('_Renderer_Private'), isNull); }); test('found in a setter', () { expect(renderersLibrary.getTopLevelFunction('_render_Setter'), isNull); - expect(renderersLibrary.getClass2('_Renderer_Setter'), isNull); + expect(renderersLibrary.getClass('_Renderer_Setter'), isNull); }); test('found in a method', () { expect(renderersLibrary.getTopLevelFunction('_render_Method'), isNull); - expect(renderersLibrary.getClass2('_Renderer_Method'), isNull); + expect(renderersLibrary.getClass('_Renderer_Method'), isNull); }); test('for types not @visibleToMustache', () { expect(renderersLibrary.getTopLevelFunction('_render_String'), isNull); - expect(renderersLibrary.getClass2('_Renderer_String'), isNull); + expect(renderersLibrary.getClass('_Renderer_String'), isNull); }); }); } diff --git a/tool/mustachio/builder.dart b/tool/mustachio/builder.dart index c11080e398..96c87eb0c3 100644 --- a/tool/mustachio/builder.dart +++ b/tool/mustachio/builder.dart @@ -46,12 +46,12 @@ Future build( '${libraryResult.runtimeType}'); } - var library = libraryResult.element2; + var library = libraryResult.element; var typeProvider = library.typeProvider; var typeSystem = library.typeSystem; var rendererSpecs = {}; - for (var renderer in library.metadata2.annotations - .where((e) => e.element2!.enclosingElement2!.name3 == 'Renderer')) { + for (var renderer in library.metadata.annotations + .where((e) => e.element!.enclosingElement!.name == 'Renderer')) { rendererSpecs.add(_buildRendererSpec(renderer)); } diff --git a/tool/mustachio/codegen_aot_compiler.dart b/tool/mustachio/codegen_aot_compiler.dart index ab141ea626..4a80d81cf1 100644 --- a/tool/mustachio/codegen_aot_compiler.dart +++ b/tool/mustachio/codegen_aot_compiler.dart @@ -4,7 +4,7 @@ import 'dart:io'; -import 'package:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:analyzer/dart/element/type_provider.dart'; import 'package:analyzer/dart/element/type_system.dart'; @@ -213,22 +213,22 @@ Future _redirectingMethod( var buffer = StringBuffer()..write('String ${compiler._rendererName}'); buffer.writeTypeParameters(compiler._usedContextStack - .expand((c) => c.type.element3.typeParameters2)); + .expand((c) => c.type.element.typeParameters)); buffer.write('('); for (var context in compiler._usedContextStack) { - var contextElement = context.type.element3; + var contextElement = context.type.element; buffer.write(contextElement.displayName); - if (contextElement.typeParameters2.isNotEmpty) { + if (contextElement.typeParameters.isNotEmpty) { buffer.write('<'); } - for (var tp in contextElement.typeParameters2) { - buffer.write(tp.name3); - if (tp != contextElement.typeParameters2.last) { + for (var tp in contextElement.typeParameters) { + buffer.write(tp.name); + if (tp != contextElement.typeParameters.last) { buffer.write(', '); } } - if (contextElement.typeParameters2.isNotEmpty) { + if (contextElement.typeParameters.isNotEmpty) { buffer.write('>'); } buffer.write(' ${context.name}'); @@ -368,7 +368,7 @@ class _AotCompiler { // this should be perfectly possible. var referenceElements = buffer.writeTypeParameters( - _usedContexts.expand((c) => c.type.element3.typeParameters2), + _usedContexts.expand((c) => c.type.element.typeParameters), ); for (var element in referenceElements) { referenceUris.add(_elementUri(element)); @@ -376,19 +376,19 @@ class _AotCompiler { buffer.write('('); for (var context in _usedContexts) { - var contextElement = context.type.element3; + var contextElement = context.type.element; referenceUris.add(_elementUri(contextElement)); buffer.write(contextElement.displayName); - if (contextElement.typeParameters2.isNotEmpty) { + if (contextElement.typeParameters.isNotEmpty) { buffer.write('<'); } - for (var tp in contextElement.typeParameters2) { - buffer.write(tp.name3); - if (tp != contextElement.typeParameters2.last) { + for (var tp in contextElement.typeParameters) { + buffer.write(tp.name); + if (tp != contextElement.typeParameters.last) { buffer.write(', '); } } - if (contextElement.typeParameters2.isNotEmpty) { + if (contextElement.typeParameters.isNotEmpty) { buffer.write('>'); } buffer.write(' ${context.name}'); @@ -406,8 +406,8 @@ class _AotCompiler { } /// Returns the URI of [element] for use in generated import directives. - String _elementUri(Element2 element) { - var libraryElement = element.library2!; + String _elementUri(Element element) { + var libraryElement = element.library!; var libraryUri = libraryElement.firstFragment.source.uri; if (libraryUri.scheme == 'file') { return path.relative(libraryUri.path, @@ -577,8 +577,8 @@ class _BlockCompiler { // for [Iterable], and then use [DartType.asInstanceOf] to ultimately // determine that the inner type of the loop is, for example, // `Future`. - var iterableElement = typeProvider.iterableElement2; - var iterableType = variableLookup.type.asInstanceOf2(iterableElement)!; + var iterableElement = typeProvider.iterableElement; + var iterableType = variableLookup.type.asInstanceOf(iterableElement)!; var innerContextType = iterableType.typeArguments.first as InterfaceType; var innerContext = _VariableLookup(innerContextType, newContextName); _contextStack.push(innerContext); @@ -636,7 +636,7 @@ class _BlockCompiler { late _VariableLookup context; GetterElement? getter; for (var c in _contextStack) { - getter = c.type.lookUpGetter3(primaryName, contextType.element3.library2); + getter = c.type.lookUpGetter(primaryName, contextType.element.library); if (getter != null) { context = c; _usedContextTypes.add(c); @@ -661,7 +661,7 @@ class _BlockCompiler { : '${context.name}.$primaryName'; var remainingNames = [...key.skip(1)]; for (var secondaryKey in remainingNames) { - getter = type.lookUpGetter3(secondaryKey, type.element3.library2); + getter = type.lookUpGetter(secondaryKey, type.element.library); if (getter == null) { throw MustachioResolutionException(node.keySpan.message( "Failed to resolve '$secondaryKey' on ${context.type} while " @@ -919,9 +919,9 @@ extension on List { } extension on StringBuffer { - Set writeTypeParameters( - Iterable typeParameters) { - var referencedElements = {}; + Set writeTypeParameters( + Iterable typeParameters) { + var referencedElements = {}; var hasTypeParameters = false; for (var typeParameter in typeParameters) { if (!hasTypeParameters) { @@ -933,11 +933,11 @@ extension on StringBuffer { var bound = typeParameter.bound; if (bound == null) { - write(typeParameter.name3); + write(typeParameter.name); } else { var boundElement = bound.documentableElement2!; referencedElements.add(boundElement); - write('${typeParameter.name3} extends ${boundElement.name3!}'); + write('${typeParameter.name} extends ${boundElement.name!}'); } } if (hasTypeParameters) { diff --git a/tool/mustachio/codegen_runtime_renderer.dart b/tool/mustachio/codegen_runtime_renderer.dart index 7c76212ec2..7f6b395e5c 100644 --- a/tool/mustachio/codegen_runtime_renderer.dart +++ b/tool/mustachio/codegen_runtime_renderer.dart @@ -165,8 +165,7 @@ import '${path.basename(_sourceUri.path)}'; var type = _relevantTypeFrom(property.type.returnType); if (type == null) return; - var types = - _typesToProcess.where((rs) => rs._contextClass == type.element3); + var types = _typesToProcess.where((rs) => rs._contextClass == type.element); if (types.isNotEmpty) { assert(types.length == 1); if (types.first.includeRenderFunction) { @@ -178,10 +177,10 @@ import '${path.basename(_sourceUri.path)}'; _addTypeHierarchyToProcess( type, - isFullRenderer: _isVisibleToMustache(type.element3), + isFullRenderer: _isVisibleToMustache(type.element), // If [type.element] is not visible to mustache, then [renderSimple] will // be used, not [type.element]'s render function. - includeRenderFunction: _isVisibleToMustache(type.element3), + includeRenderFunction: _isVisibleToMustache(type.element), ); } @@ -198,8 +197,8 @@ import '${path.basename(_sourceUri.path)}'; InterfaceType? _relevantTypeFrom(DartType type) { if (type is InterfaceType) { if (_typeSystem.isAssignableTo(type, _typeProvider.iterableDynamicType)) { - var iterableElement = _typeProvider.iterableElement2; - var iterableType = type.asInstanceOf2(iterableElement)!; + var iterableElement = _typeProvider.iterableElement; + var iterableType = type.asInstanceOf(iterableElement)!; var innerType = iterableType.typeArguments.first; return _relevantTypeFrom(innerType); @@ -237,7 +236,7 @@ import '${path.basename(_sourceUri.path)}'; }) { while (type != null) { _addTypeToProcess( - type.element3, + type.element, isFullRenderer: isFullRenderer, includeRenderFunction: includeRenderFunction, ); @@ -248,18 +247,18 @@ import '${path.basename(_sourceUri.path)}'; _addPropertyToProcess(getter); } } - for (var mixin in type.element3.mixins) { + for (var mixin in type.element.mixins) { _addTypeHierarchyToProcess( mixin, isFullRenderer: isFullRenderer, includeRenderFunction: false, ); } - final typeElement = type.element3; - if (typeElement is MixinElement2) { + final typeElement = type.element; + if (typeElement is MixinElement) { for (var constraint in typeElement.superclassConstraints) { _addTypeToProcess( - constraint.element3, + constraint.element, isFullRenderer: isFullRenderer, includeRenderFunction: false, ); @@ -275,7 +274,7 @@ import '${path.basename(_sourceUri.path)}'; /// Adds [element] to the [_typesToProcess] queue, if it is not already there. void _addTypeToProcess( - InterfaceElement2 element, { + InterfaceElement element, { required bool isFullRenderer, required bool includeRenderFunction, }) { @@ -320,7 +319,7 @@ import '${path.basename(_sourceUri.path)}'; /// Returns whether [element] or any of its supertypes are "visible" to /// Mustache. - bool _isVisibleToMustache(InterfaceElement2 element) { + bool _isVisibleToMustache(InterfaceElement element) { if (_allVisibleElements.contains(element)) { return true; } @@ -328,7 +327,7 @@ import '${path.basename(_sourceUri.path)}'; if (supertype == null) { return false; } - return _isVisibleToMustache(supertype.element3); + return _isVisibleToMustache(supertype.element); } /// Builds render functions and the renderer class for [renderer]. @@ -425,7 +424,7 @@ class ${renderer._rendererClassName}${renderer._typeParametersString} _propertyMapCache.putIfAbsent($_contextTypeVariable, () => {'''); var supertype = contextClass.supertype; if (supertype != null) { - var superclassRendererName = _typeToRendererClassName[supertype.element3]; + var superclassRendererName = _typeToRendererClassName[supertype.element]; if (superclassRendererName != null) { var superMapName = '$superclassRendererName.propertyMap'; var generics = asGenerics([ @@ -442,7 +441,7 @@ class ${renderer._rendererClassName}${renderer._typeParametersString} // E. Similarly, `{...a, ...b, ...c}` will feature elements from `c` which // override `b` and `a`. for (var mixin in contextClass.mixins) { - var mixinRendererName = _typeToRendererClassName[mixin.element3]; + var mixinRendererName = _typeToRendererClassName[mixin.element]; if (mixinRendererName != null) { var mixinMapName = '$mixinRendererName.propertyMap'; var generics = asGenerics([ @@ -452,8 +451,8 @@ class ${renderer._rendererClassName}${renderer._typeParametersString} _buffer.writeln(' ...$mixinMapName$generics(),'); } } - for (var property in [...contextClass.getters2] - ..sort((a, b) => a.name3!.compareTo(b.name3!))) { + for (var property in [...contextClass.getters] + ..sort((a, b) => a.name!.compareTo(b.name!))) { var returnType = property.type.returnType; if (returnType is InterfaceType) { _writeProperty(renderer, property, returnType); @@ -475,17 +474,17 @@ class ${renderer._rendererClassName}${renderer._typeParametersString} if (property.shouldBeOmitted) return; - _buffer.writeln("'${property.name3}': Property("); + _buffer.writeln("'${property.name}': Property("); _buffer - .writeln('getValue: ($_contextTypeVariable c) => c.${property.name3},'); + .writeln('getValue: ($_contextTypeVariable c) => c.${property.name},'); - var getterName = property.name3; + var getterName = property.name; var getterTypeString = _typeSystem.promoteToNonNull(getterType).getDisplayString(); // Only add a `getProperties` function, which returns the property map for // [getterType], if [getterType] is a renderable type. - if (_typeToRendererClassName.containsKey(getterType.element3)) { - var rendererClassName = _typeToRendererClassName[getterType.element3]; + if (_typeToRendererClassName.containsKey(getterType.element)) { + var rendererClassName = _typeToRendererClassName[getterType.element]; _buffer.writeln(''' renderVariable: ($_contextTypeVariable c, @@ -523,8 +522,8 @@ renderVariable: } } else if (_typeSystem.isAssignableTo( getterType, _typeProvider.iterableDynamicType)) { - var iterableElement = _typeProvider.iterableElement2; - var iterableType = getterType.asInstanceOf2(iterableElement); + var iterableElement = _typeProvider.iterableElement; + var iterableType = getterType.asInstanceOf(iterableElement); // Not sure why [iterableType] would be null... unresolved type? if (iterableType != null) { var innerType = iterableType.typeArguments.first; @@ -538,10 +537,10 @@ renderVariable: var renderFunctionName = _typeToRenderFunctionName[innerTypeElement]; String renderCall; if (renderFunctionName == null) { - var typeName = innerTypeElement!.name3!; + var typeName = innerTypeElement!.name!; if (innerType is InterfaceType) { _invisibleGetters.putIfAbsent( - typeName, () => innerType.element3.allAccessorNames); + typeName, () => innerType.element.allAccessorNames); } renderCall = 'renderSimple(e, ast, r.template, sink, parent: r, ' "getters: _invisibleGetters['$typeName']!)"; @@ -566,12 +565,12 @@ renderIterable: // TODO(srawlins): Find a solution for this. We can track all of the // concrete types substituted for `E` for example. if (getterName is! TypeParameterType) { - var renderFunctionName = _typeToRenderFunctionName[getterType.element3]; + var renderFunctionName = _typeToRenderFunctionName[getterType.element]; String renderCall; if (renderFunctionName == null) { - var typeName = getterType.element3.name3!; + var typeName = getterType.element.name!; _invisibleGetters.putIfAbsent( - typeName, () => getterType.element3.allAccessorNames); + typeName, () => getterType.element.allAccessorNames); renderCall = 'renderSimple(c.$getterName, ast, r.template, sink, parent: r, ' "getters: _invisibleGetters['$typeName']!)"; @@ -618,7 +617,7 @@ renderValue: /// functions and the renderer class), and also to refer from one renderer to /// another. class _RendererInfo { - final InterfaceElement2 _contextClass; + final InterfaceElement _contextClass; /// The name of the top level render function. /// @@ -642,13 +641,13 @@ class _RendererInfo { String? publicApiFunctionName; factory _RendererInfo( - InterfaceElement2 contextClass, { + InterfaceElement contextClass, { bool public = false, bool isFullRenderer = true, bool includeRenderFunction = true, String? publicApiFunctionName, }) { - var typeBaseName = contextClass.name3; + var typeBaseName = contextClass.name; var renderFunctionName = '_render_$typeBaseName'; var rendererClassName = public ? 'Renderer_$typeBaseName' : '_Renderer_$typeBaseName'; @@ -672,7 +671,7 @@ class _RendererInfo { this.publicApiFunctionName, }); - String get _typeName => _contextClass.name3!; + String get _typeName => _contextClass.name!; final String _rendererClassName; @@ -703,13 +702,13 @@ class _RendererInfo { } } -extension on InterfaceElement2 { - /// A set of the names of all accessors on this [ClassElement2], including +extension on InterfaceElement { + /// A set of the names of all accessors on this [ClassElement], including /// supertypes. Set get allAccessorNames { return { - ...?supertype?.element3.allAccessorNames, - ...getters2.where((e) => e.isPublic && !e.isStatic).map((e) => e.name3!), + ...?supertype?.element.allAccessorNames, + ...getters.where((e) => e.isPublic && !e.isStatic).map((e) => e.name!), }; } } From 931f2cb95cce98ba95d6437c581e1961ad6a358b Mon Sep 17 00:00:00 2001 From: Fedor Shcheglov Date: Fri, 15 Aug 2025 16:23:06 -0700 Subject: [PATCH 03/14] 400 --- lib/src/model/annotation.dart | 12 +++---- lib/src/model/canonicalization.dart | 20 ++++++------ lib/src/model/category.dart | 4 +-- lib/src/model/class.dart | 14 ++++---- lib/src/model/comment_referable.dart | 10 +++--- lib/src/model/constructor.dart | 32 +++++++++---------- lib/src/model/container.dart | 18 +++++------ lib/src/model/container_member.dart | 2 +- lib/src/model/documentation_comment.dart | 8 ++--- lib/src/model/dynamic.dart | 4 +-- lib/src/model/enum.dart | 16 +++++----- lib/src/model/extension.dart | 26 +++++++-------- test/end2end/model_test.dart | 8 ++--- test/mustachio/aot_compiler_builder_test.dart | 4 +-- test/mustachio/builder_test_base.dart | 6 ++-- 15 files changed, 91 insertions(+), 93 deletions(-) diff --git a/lib/src/model/annotation.dart b/lib/src/model/annotation.dart index 4ee553a25c..63576d3ce2 100644 --- a/lib/src/model/annotation.dart +++ b/lib/src/model/annotation.dart @@ -4,7 +4,7 @@ import 'dart:convert'; -import 'package:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/model/attribute.dart'; import 'package:dartdoc/src/model/class.dart'; @@ -22,7 +22,7 @@ final class Annotation extends Attribute { final PackageGraph _packageGraph; Annotation(this._annotation, this._library, this._packageGraph) - : super(_annotation.element2!.name3!); + : super(_annotation.element!.name!); @override String get linkedNameWithParameters { @@ -40,19 +40,19 @@ final class Annotation extends Attribute { } @override - String get linkedName => _annotation.element2 is PropertyAccessorElement2 - ? _packageGraph.getModelForElement(_annotation.element2!).linkedName + String get linkedName => _annotation.element is PropertyAccessorElement + ? _packageGraph.getModelForElement(_annotation.element!).linkedName // TODO(jcollins-g): consider linking to constructor instead of type? : _modelType.linkedName; - late final ElementType _modelType = switch (_annotation.element2) { + late final ElementType _modelType = switch (_annotation.element) { ConstructorElement(:var returnType) => _packageGraph.getTypeFor(returnType, _library), PropertyAccessorElement(:var variable) => (_packageGraph.getModelForElement(variable) as GetterSetterCombo) .modelType, _ => throw StateError( - 'non-callable element used as annotation?: ${_annotation.element2}') + 'non-callable element used as annotation?: ${_annotation.element}') }; bool get isPublic { diff --git a/lib/src/model/canonicalization.dart b/lib/src/model/canonicalization.dart index dc72ba3417..d222c65d62 100644 --- a/lib/src/model/canonicalization.dart +++ b/lib/src/model/canonicalization.dart @@ -2,7 +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:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:dartdoc/src/model/model.dart'; import 'package:dartdoc/src/warnings.dart'; @@ -19,11 +19,11 @@ Library? canonicalLibraryCandidate(ModelElement modelElement) { // Since we're looking for a library, go up in the tree until we find it. var topLevelElement = modelElement.element; - while (topLevelElement.enclosingElement2 is! LibraryElement2 && - topLevelElement.enclosingElement2 != null) { - topLevelElement = topLevelElement.enclosingElement2!; + while (topLevelElement.enclosingElement is! LibraryElement && + topLevelElement.enclosingElement != null) { + topLevelElement = topLevelElement.enclosingElement!; } - var topLevelElementName = topLevelElement.name3; + var topLevelElementName = topLevelElement.name; if (topLevelElementName == null) { // Any member of an unnamed extension is not public, and has no // canonical library. @@ -84,16 +84,16 @@ final class _Canonicalization { } } - String _getElementLocation(Element2 element) { + String _getElementLocation(Element element) { var components = []; - Element2? ancestor = element; + Element? ancestor = element; while (ancestor != null) { - if (ancestor is LibraryElement2) { + if (ancestor is LibraryElement) { components.insert(0, ancestor.uri.toString()); } else { - components.insert(0, ancestor.name3!); + components.insert(0, ancestor.name!); } - ancestor = ancestor.enclosingElement2; + ancestor = ancestor.enclosingElement; } var buffer = StringBuffer(); var length = components.length; diff --git a/lib/src/model/category.dart b/lib/src/model/category.dart index e128e8552b..3c4caf34f8 100644 --- a/lib/src/model/category.dart +++ b/lib/src/model/category.dart @@ -2,7 +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:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/file_system/file_system.dart'; import 'package:dartdoc/src/dartdoc_options.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; @@ -78,7 +78,7 @@ class Category } @override - Element2? get element => null; + Element? get element => null; @override String get name => _categoryDefinition.displayName; diff --git a/lib/src/model/class.dart b/lib/src/model/class.dart index 8c206d77bb..3db1afbb6a 100644 --- a/lib/src/model/class.dart +++ b/lib/src/model/class.dart @@ -2,7 +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:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:dartdoc/src/model/kind.dart'; import 'package:dartdoc/src/model/model.dart'; @@ -15,7 +15,7 @@ import 'package:dartdoc/src/model/model.dart'; /// **inherited**: Filtered getters giving only inherited children. class Class extends InheritingContainer with Constructable, MixedInTypes { @override - final ClassElement2 element; + final ClassElement element; @override late final List allModelElements = [ @@ -29,8 +29,8 @@ class Class extends InheritingContainer with Constructable, MixedInTypes { Class(this.element, Library library, PackageGraph packageGraph) : super(library, packageGraph) { - if (element.name3 == 'Object' && - library.element.name3 == 'dart.core' && + if (element.name == 'Object' && + library.element.name == 'dart.core' && package.name == 'Dart') { packageGraph.objectClass = this; } @@ -46,11 +46,11 @@ class Class extends InheritingContainer with Constructable, MixedInTypes { bool get isBase => element.isBase && !element.isSealed; bool get isErrorOrException { - bool isError(InterfaceElement2 e) => - e.library2.isDartCore && (e.name3 == 'Exception' || e.name3 == 'Error'); + bool isError(InterfaceElement e) => + e.library.isDartCore && (e.name == 'Exception' || e.name == 'Error'); if (isError(element)) return true; - return element.allSupertypes.map((t) => t.element3).any(isError); + return element.allSupertypes.map((t) => t.element).any(isError); } @override diff --git a/lib/src/model/comment_referable.dart b/lib/src/model/comment_referable.dart index fbfb2cd950..893f6e3d96 100644 --- a/lib/src/model/comment_referable.dart +++ b/lib/src/model/comment_referable.dart @@ -8,7 +8,7 @@ library; import 'dart:core'; import 'package:analyzer/dart/analysis/features.dart'; -import 'package:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/scope.dart'; import 'package:collection/collection.dart'; import 'package:dartdoc/src/model/library.dart'; @@ -105,7 +105,7 @@ mixin CommentReferable implements Nameable { _ReferenceChildrenLookup referenceLookup, { required bool Function(CommentReferable?) filter, }) { - Element2? resultElement; + Element? resultElement; final scope = this.scope; if (scope != null) { resultElement = scope.lookupPreferGetter(referenceLookup.lookup); @@ -207,16 +207,16 @@ mixin CommentReferable implements Nameable { Library? get library => null; /// For testing / comparison only, get the comment referable from where this - /// `ElementType` was defined. Override where an [Element2] is available. + /// `ElementType` was defined. Override where an [Elemen2] is available. @internal CommentReferable get definingCommentReferable => this; } extension on Scope { /// Prefer the getter for a bundled lookup if both exist. - Element2? lookupPreferGetter(String id) { + Element? lookupPreferGetter(String id) { var result = lookup(id); - return result.getter2 ?? result.setter2; + return result.getter ?? result.setter; } } diff --git a/lib/src/model/constructor.dart b/lib/src/model/constructor.dart index 7e4c75de90..0503b76978 100644 --- a/lib/src/model/constructor.dart +++ b/lib/src/model/constructor.dart @@ -2,7 +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:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/source/line_info.dart'; import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; @@ -12,7 +12,7 @@ import 'package:dartdoc/src/model_utils.dart'; class Constructor extends ModelElement with ContainerMember, TypeParameters { @override - final ConstructorElement2 element; + final ConstructorElement element; Constructor(this.element, super.library, super.packageGraph); @@ -25,7 +25,7 @@ class Constructor extends ModelElement with ContainerMember, TypeParameters { return enclosingElement.characterLocation; } final lineInfo = unitElement.lineInfo; - var offset = element.firstFragment.nameOffset2 ?? + var offset = element.firstFragment.nameOffset ?? element.firstFragment.typeNameOffset; if (offset != null && offset >= 0) { return lineInfo.getLocation(offset); @@ -37,10 +37,10 @@ class Constructor extends ModelElement with ContainerMember, TypeParameters { bool get isPublic { if (!super.isPublic) return false; if (element.hasPrivateName) return false; - var class_ = element.enclosingElement2; + var class_ = element.enclosingElement; // Enums cannot be explicitly constructed or extended. - if (class_ is EnumElement2) return false; - if (class_ is ClassElement2) { + if (class_ is EnumElement) return false; + if (class_ is ClassElement) { if (element.isFactory) return true; if (class_.isSealed || (class_.isAbstract && class_.isFinal) || @@ -60,7 +60,7 @@ class Constructor extends ModelElement with ContainerMember, TypeParameters { @override Container get enclosingElement => - getModelFor(element.enclosingElement2, library) as Container; + getModelFor(element.enclosingElement, library) as Container; @override String get fileName => @@ -85,7 +85,7 @@ class Constructor extends ModelElement with ContainerMember, TypeParameters { @override bool get isConst => element.isConst; - bool get isUnnamedConstructor => element.name3 == 'new'; + bool get isUnnamedConstructor => element.name == 'new'; bool get isFactory => element.isFactory; @@ -100,11 +100,11 @@ class Constructor extends ModelElement with ContainerMember, TypeParameters { // TODO(jcollins-g): After the old lookup code is retired, rationalize // [name] around the conventions used in referenceChildren and replace // code there and elsewhere with simple references to the name. - '${enclosingElement.name}.${element.name3}'; + '${enclosingElement.name}.${element.name}'; @override String get nameWithGenerics { - var constructorName = element.name3!; + var constructorName = element.name!; if (constructorName == 'new') { return '${enclosingElement.name}$genericParameters'; } @@ -113,7 +113,7 @@ class Constructor extends ModelElement with ContainerMember, TypeParameters { String? get shortName { if (name.contains('.')) { - return name.substring(element.enclosingElement2.name3!.length + 1); + return name.substring(element.enclosingElement.name!.length + 1); } else { return name; } @@ -122,11 +122,11 @@ class Constructor extends ModelElement with ContainerMember, TypeParameters { @override late final Map referenceChildren = () { // Find the element that [parameter] is _really_ referring to. - Element2? dereferenceParameter(FormalParameterElement? parameter) => + Element? dereferenceParameter(FormalParameterElement? parameter) => switch (parameter) { - FieldFormalParameterElement2() => parameter.field2, - SuperFormalParameterElement2() => - dereferenceParameter(parameter.superConstructorParameter2), + FieldFormalParameterElement() => parameter.field, + SuperFormalParameterElement() => + dereferenceParameter(parameter.superConstructorParameter), _ => parameter }; @@ -142,5 +142,5 @@ class Constructor extends ModelElement with ContainerMember, TypeParameters { @override String get referenceName => - isUnnamedConstructor ? enclosingElement.name : element.name3!; + isUnnamedConstructor ? enclosingElement.name : element.name!; } diff --git a/lib/src/model/container.dart b/lib/src/model/container.dart index e74e6d2a64..2c139f3c97 100644 --- a/lib/src/model/container.dart +++ b/lib/src/model/container.dart @@ -2,7 +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:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/scope.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; import 'package:dartdoc/src/model/model.dart'; @@ -32,7 +32,7 @@ abstract class Container extends ModelElement Container(super.library, super.packageGraph); @override - Element2 get element; + Element get element; // TODO(jcollins-g): Implement a ContainerScope that flattens supertypes? @override @@ -41,20 +41,20 @@ abstract class Container extends ModelElement @override bool get hasParameters => false; - bool get isExtension => element is ExtensionElement2; + bool get isExtension => element is ExtensionElement; /// Whether this is an enum. - bool get isEnum => element is EnumElement2; + bool get isEnum => element is EnumElement; /// Whether this is an interface (e.g. class, enum, mixin, or extension type). - bool get isInterface => element is InterfaceElement2; + bool get isInterface => element is InterfaceElement; /// Whether this is a mixin. - bool get isMixin => element is MixinElement2; + bool get isMixin => element is MixinElement; /// Whether this container represents the Object class from 'dart:core'. bool get isDartCoreObject => - element.name3 == 'Object' && element.library2?.name3 == 'dart.core'; + element.name == 'Object' && element.library?.name == 'dart.core'; /// The model elements of all of the members of this container, including /// declared and inherited ones. @@ -158,9 +158,9 @@ abstract class Container extends ModelElement /// This container might be canonical for elements it does not contain. /// See [Inheritable.canonicalEnclosingContainer]. - bool containsElement(Element2? element) => _allElements.contains(element); + bool containsElement(Element? element) => _allElements.contains(element); - late final Set _allElements = + late final Set _allElements = allModelElements.map((e) => e.element).toSet(); bool get hasPublicStaticFields => staticFields.any((e) => e.isPublic); diff --git a/lib/src/model/container_member.dart b/lib/src/model/container_member.dart index c5f9c01f6b..8480ed5f5a 100644 --- a/lib/src/model/container_member.dart +++ b/lib/src/model/container_member.dart @@ -29,7 +29,7 @@ mixin ContainerMember on ModelElement { @protected @visibleForTesting late final Container definingEnclosingContainer = - getModelForElement(element.enclosingElement2!) as Container; + getModelForElement(element.enclosingElement!) as Container; @override Set get attributes => { diff --git a/lib/src/model/documentation_comment.dart b/lib/src/model/documentation_comment.dart index 42efa3fee4..2385e74c59 100644 --- a/lib/src/model/documentation_comment.dart +++ b/lib/src/model/documentation_comment.dart @@ -5,7 +5,7 @@ /// @docImport 'package:dartdoc/src/model/package_graph.dart'; library; -import 'package:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:args/args.dart'; import 'package:crypto/crypto.dart' as crypto; import 'package:dartdoc/src/model/documentable.dart'; @@ -41,7 +41,7 @@ final _htmlInjectRegExp = RegExp(r'([a-f0-9]+)'); mixin DocumentationComment implements Documentable, Warnable, Locatable, SourceCode { @override - Element2 get element; + Element get element; List? _documentationFrom; @@ -74,9 +74,7 @@ mixin DocumentationComment /// Whether `this` has a synthetic/inherited or local documentation comment, /// and false otherwise. - bool get hasDocumentationComment => - element is Annotatable && - (element as Annotatable).documentationComment != null; + bool get hasDocumentationComment => element.documentationComment != null; /// Whether the raw documentation comment is considered to be 'nodoc', an /// attribute indicating that any documentation should not be included in diff --git a/lib/src/model/dynamic.dart b/lib/src/model/dynamic.dart index 03f498099d..b56df501b2 100644 --- a/lib/src/model/dynamic.dart +++ b/lib/src/model/dynamic.dart @@ -2,7 +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:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; import 'package:dartdoc/src/model/kind.dart'; @@ -11,7 +11,7 @@ import 'package:dartdoc/src/model/model.dart'; class Dynamic extends ModelElement with HasNoPage { @override - final Element2 element; + final Element element; Dynamic(this.element, PackageGraph packageGraph) : super(Library.sentinel, packageGraph); diff --git a/lib/src/model/enum.dart b/lib/src/model/enum.dart index 9ec869294f..a7154ac9ce 100644 --- a/lib/src/model/enum.dart +++ b/lib/src/model/enum.dart @@ -3,14 +3,14 @@ // BSD-style license that can be found in the LICENSE file. import 'package:analyzer/dart/analysis/features.dart'; -import 'package:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:dartdoc/src/model/kind.dart'; import 'package:dartdoc/src/model/model.dart'; import 'package:meta/meta.dart'; class Enum extends InheritingContainer with Constructable, MixedInTypes { @override - final EnumElement2 element; + final EnumElement element; Enum(this.element, super.library, super.packageGraph); @@ -40,9 +40,9 @@ class Enum extends InheritingContainer with Constructable, MixedInTypes { @override late final List publicEnumValues = [ - for (var value in element.constants2) + for (var value in element.constants) getModelForPropertyInducingElement(value, library, - getter: getModelFor(value.getter2!, library) as ContainerAccessor, + getter: getModelFor(value.getter!, library) as ContainerAccessor, setter: null) as Field ]; @@ -69,7 +69,7 @@ class Enum extends InheritingContainer with Constructable, MixedInTypes { class EnumField extends Field { final int index; - EnumField.forConstant(this.index, FieldElement2 element, Library library, + EnumField.forConstant(this.index, FieldElement element, Library library, PackageGraph packageGraph, Accessor? getter) : super( element, library, packageGraph, getter as ContainerAccessor?, null); @@ -79,9 +79,9 @@ class EnumField extends Field { @override bool get hasConstantValueForDisplay { - final enum_ = element.enclosingElement2 as EnumElement2; + final enum_ = element.enclosingElement as EnumElement; final enumHasDefaultConstructor = - enum_.constructors2.any((c) => c.isDefaultConstructor); + enum_.constructors.any((c) => c.isDefaultConstructor); // If this enum does not have any explicit constructors (and so only has a // default constructor), then there is no meaningful constant initializer to // display. @@ -90,7 +90,7 @@ class EnumField extends Field { @override String get constantValueBase => - element.library2.featureSet.isEnabled(Feature.enhanced_enums) + element.library.featureSet.isEnabled(Feature.enhanced_enums) ? super.constantValueBase : renderedName; diff --git a/lib/src/model/extension.dart b/lib/src/model/extension.dart index df3207af5b..51897c674e 100644 --- a/lib/src/model/extension.dart +++ b/lib/src/model/extension.dart @@ -2,7 +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:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/nullability_suffix.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:dartdoc/src/element_type.dart'; @@ -16,7 +16,7 @@ import 'package:meta/meta.dart'; /// setters, operators). class Extension extends Container { @override - final ExtensionElement2 element; + final ExtensionElement element; late final ElementType extendedElement = getTypeFor(element.extendedType, library); @@ -35,7 +35,7 @@ class Extension extends Container { /// Whether this extension could apply to [container]. /// /// This makes some assumptions in its calculations. For example, all - /// [InheritingContainer]s represent [InterfaceElement2]s, so no care is taken + /// [InheritingContainer]s represent [InterfaceElement]s, so no care is taken /// to consider function types or record types. bool couldApplyTo(InheritingContainer container) { var extendedType = extendedElement.type; @@ -48,13 +48,13 @@ class Extension extends Container { extendedType = library.element.typeSystem.promoteToNonNull(extendedType); var otherType = container.modelType.type; if (otherType is InterfaceType) { - otherType = library.element.typeSystem.instantiateInterfaceToBounds2( - element: otherType.element3, + otherType = library.element.typeSystem.instantiateInterfaceToBounds( + element: otherType.element, nullabilitySuffix: NullabilitySuffix.none, ); for (var superType in [otherType, ...otherType.allSupertypes]) { - var isSameBaseType = superType.element3 == extendedType.element3; + var isSameBaseType = superType.element == extendedType.element; if (isSameBaseType && library.element.typeSystem.isSubtypeOf(extendedType, superType)) { return true; @@ -76,7 +76,7 @@ class Extension extends Container { instanceFields.wherePublic.toList(growable: false)..sort(byName); @override - late final List declaredMethods = element.methods2 + late final List declaredMethods = element.methods .map((e) => getModelFor(e, library, enclosingContainer: this) as Method) .toList(growable: false); @@ -95,17 +95,17 @@ class Extension extends Container { ]..sort(); @override - String get name => element.name3 == null ? '' : super.name; + String get name => element.name == null ? '' : super.name; @override - late final List declaredFields = element.fields2.map((field) { + late final List declaredFields = element.fields.map((field) { ContainerAccessor? getter, setter; - final fieldGetter = field.getter2; + final fieldGetter = field.getter; if (fieldGetter != null) { getter = ModelElement.for_(fieldGetter, library, packageGraph, enclosingContainer: this) as ContainerAccessor; } - final fieldSetter = field.setter2; + final fieldSetter = field.setter; if (fieldSetter != null) { setter = ModelElement.for_(fieldSetter, library, packageGraph, enclosingContainer: this) as ContainerAccessor; @@ -115,10 +115,10 @@ class Extension extends Container { }).toList(growable: false); @override - late final List typeParameters = element.typeParameters2 + late final List typeParameters = element.typeParameters .map((typeParameter) => getModelFor( typeParameter, - getModelForElement(typeParameter.enclosingElement2!.library2!) + getModelForElement(typeParameter.enclosingElement!.library!) as Library) as TypeParameter) .toList(growable: false); diff --git a/test/end2end/model_test.dart b/test/end2end/model_test.dart index 482ae95815..917a1932e9 100644 --- a/test/end2end/model_test.dart +++ b/test/end2end/model_test.dart @@ -4,7 +4,7 @@ // ignore_for_file: non_constant_identifier_names -import 'package:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:analyzer/source/line_info.dart'; import 'package:async/async.dart'; @@ -179,9 +179,9 @@ void main() async { 'Verify annotations and their type arguments render on type parameters ' 'for typedefs', skip: 'dart-lang/sdk#46064', () { - expect((F.aliasedType as FunctionType).typeParameters.first.metadata2, + expect((F.aliasedType as FunctionType).typeParameters.first.metadata, isNotEmpty); - expect((F.aliasedType as FunctionType).typeParameters.first.metadata2, + expect((F.aliasedType as FunctionType).typeParameters.first.metadata, isNotEmpty); // TODO(jcollins-g): add rendering verification once we have data from // analyzer. @@ -232,7 +232,7 @@ void main() async { void expectTypedefs(Typedef t, String modelTypeToString, Iterable genericParameters) { expect(t.modelType.toString(), equals(modelTypeToString)); - expect(t.element.typeParameters2.map((p) => p.toString()), + expect(t.element.typeParameters.map((p) => p.toString()), orderedEquals(genericParameters)); } diff --git a/test/mustachio/aot_compiler_builder_test.dart b/test/mustachio/aot_compiler_builder_test.dart index 2925bafa4e..883e6df3bb 100644 --- a/test/mustachio/aot_compiler_builder_test.dart +++ b/test/mustachio/aot_compiler_builder_test.dart @@ -108,8 +108,8 @@ class Baz {} await resolveGeneratedLibrary2(aotRenderersForHtmlPath); var fooRenderFunction = renderersLibrary.getTopLevelFunction('renderFoo')!; - expect(fooRenderFunction.typeParameters2, hasLength(1)); - var fBound = fooRenderFunction.typeParameters2.single.bound!; + expect(fooRenderFunction.typeParameters, hasLength(1)); + var fBound = fooRenderFunction.typeParameters.single.bound!; expect(fBound.getDisplayString(), equals('num')); }); diff --git a/test/mustachio/builder_test_base.dart b/test/mustachio/builder_test_base.dart index e77b584ad1..fd94c5a8f1 100644 --- a/test/mustachio/builder_test_base.dart +++ b/test/mustachio/builder_test_base.dart @@ -3,7 +3,7 @@ // BSD-style license that can be found in the LICENSE file. import 'package:analyzer/dart/analysis/results.dart'; -import 'package:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/file_system/physical_file_system.dart'; import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart' show AnalysisContextCollectionImpl; @@ -79,7 +79,7 @@ $sourceLibraryContent root: path.join(d.sandbox, 'foo_package')); } -Future resolveGeneratedLibrary2(String libraryPath) async { +Future resolveGeneratedLibrary2(String libraryPath) async { var contextCollection = AnalysisContextCollectionImpl( includedPaths: [d.sandbox], // TODO(jcollins-g): should we pass excluded directories here instead of @@ -96,5 +96,5 @@ Future resolveGeneratedLibrary2(String libraryPath) async { '${libraryResult.runtimeType}'); } - return libraryResult.element2; + return libraryResult.element; } From 8f40057cdf6607e23bd9ef94db0d90ce7a5a5a08 Mon Sep 17 00:00:00 2001 From: Fedor Shcheglov Date: Fri, 15 Aug 2025 16:28:34 -0700 Subject: [PATCH 04/14] 300 --- lib/src/model/extension_type.dart | 12 +-- lib/src/model/field.dart | 10 +-- lib/src/model/getter_setter_combo.dart | 9 +-- lib/src/model/inheritable.dart | 8 +- lib/src/model/inheriting_container.dart | 66 ++++++++-------- lib/src/model/library.dart | 100 ++++++++++++------------ 6 files changed, 102 insertions(+), 103 deletions(-) diff --git a/lib/src/model/extension_type.dart b/lib/src/model/extension_type.dart index c0771ce517..2cc15cae8e 100644 --- a/lib/src/model/extension_type.dart +++ b/lib/src/model/extension_type.dart @@ -2,7 +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:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; import 'package:dartdoc/src/model/kind.dart'; @@ -11,10 +11,10 @@ import 'package:meta/meta.dart'; class ExtensionType extends InheritingContainer with Constructable { @override - final ExtensionTypeElement2 element; + final ExtensionTypeElement element; late final ElementType representationType = - getTypeFor(element.representation2.type, library); + getTypeFor(element.representation.type, library); ExtensionType(this.element, super.library, super.packageGraph); @@ -40,13 +40,13 @@ class ExtensionType extends InheritingContainer with Constructable { bool get isSealed => false; @override - late final List declaredFields = element.fields2.map((field) { + late final List declaredFields = element.fields.map((field) { ContainerAccessor? getter, setter; - final fieldGetter = field.getter2; + final fieldGetter = field.getter; if (fieldGetter != null) { getter = ContainerAccessor(fieldGetter, library, packageGraph, this); } - final fieldSetter = field.setter2; + final fieldSetter = field.setter; if (fieldSetter != null) { setter = ContainerAccessor(fieldSetter, library, packageGraph, this); } diff --git a/lib/src/model/field.dart b/lib/src/model/field.dart index e9474c9f22..06d3fa7cd1 100644 --- a/lib/src/model/field.dart +++ b/lib/src/model/field.dart @@ -4,7 +4,7 @@ import 'dart:convert'; -import 'package:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:dartdoc/src/model/attribute.dart'; import 'package:dartdoc/src/model/kind.dart'; import 'package:dartdoc/src/model/model.dart'; @@ -13,7 +13,7 @@ class Field extends ModelElement with GetterSetterCombo, ContainerMember, Inheritable { @override - final FieldElement2 element; + final FieldElement element; @override final ContainerAccessor? getter; @@ -36,7 +36,7 @@ class Field extends ModelElement ) : isInherited = false, enclosingElement = - ModelElement.for_(element.enclosingElement2, library, packageGraph) + ModelElement.for_(element.enclosingElement, library, packageGraph) as Container, assert(getter != null || setter != null) { getter?.enclosingCombo = this; @@ -104,7 +104,7 @@ class Field extends ModelElement @override bool get isConst => element.isConst; - /// Whether the [FieldElement2] is covariant, or the first parameter for the + /// Whether the [FieldElement] is covariant, or the first parameter for the /// setter is covariant. @override bool get isCovariant => setter?.isCovariant == true || element.isCovariant; @@ -131,7 +131,7 @@ class Field extends ModelElement element.isAbstract ? 'abstract $kind' : kind.toString(); bool get isProvidedByExtension => - element.enclosingElement2 is ExtensionElement2; + element.enclosingElement is ExtensionElement; /// The [enclosingElement], which is expected to be an [Extension]. Extension get enclosingExtension => enclosingElement as Extension; diff --git a/lib/src/model/getter_setter_combo.dart b/lib/src/model/getter_setter_combo.dart index d3d3a84592..7e0fb85780 100644 --- a/lib/src/model/getter_setter_combo.dart +++ b/lib/src/model/getter_setter_combo.dart @@ -6,11 +6,10 @@ import 'dart:convert'; import 'package:analyzer/dart/ast/ast.dart' show Expression, InstanceCreationExpression; -import 'package:analyzer/dart/element/element2.dart' show Annotatable; import 'package:analyzer/source/line_info.dart'; // ignore: implementation_imports import 'package:analyzer/src/dart/element/element.dart' - show ConstVariableElement; + show VariableFragmentImpl; import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/model/accessor.dart'; import 'package:dartdoc/src/model/annotation.dart'; @@ -78,7 +77,7 @@ mixin GetterSetterCombo on ModelElement { bool get hasConstantValueForDisplay => false; late final Expression? _constantInitializer = - (element.firstFragment as ConstVariableElement).constantInitializer; + (element.firstFragment as VariableFragmentImpl).constantInitializer; String linkifyConstantValue(String original) { if (_constantInitializer is! InstanceCreationExpression) return original; @@ -213,13 +212,13 @@ mixin GetterSetterCombo on ModelElement { @override late final String documentationComment = _getterSetterDocumentationComment.isEmpty - ? (element as Annotatable).documentationComment ?? '' + ? element.documentationComment ?? '' : _getterSetterDocumentationComment; @override bool get hasDocumentationComment => _getterSetterDocumentationComment.isNotEmpty || - (element as Annotatable).documentationComment != null; + element.documentationComment != null; /// Derives a documentation comment for the combo by copying documentation /// from the [getter] and/or [setter]. diff --git a/lib/src/model/inheritable.dart b/lib/src/model/inheritable.dart index 17c72012b6..54937f6263 100644 --- a/lib/src/model/inheritable.dart +++ b/lib/src/model/inheritable.dart @@ -2,7 +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:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:collection/collection.dart' show IterableExtension; import 'package:dartdoc/src/model/attribute.dart'; import 'package:dartdoc/src/model/model.dart'; @@ -48,7 +48,7 @@ mixin Inheritable on ContainerMember { ?.allCanonicalModelElements .firstWhereOrNull((m) => m.name == name && - m is PropertyAccessorElement2 == this is PropertyAccessorElement2); + m is PropertyAccessorElement == this is PropertyAccessorElement); @override Container? computeCanonicalEnclosingContainer() { @@ -96,8 +96,8 @@ mixin Inheritable on ContainerMember { /// implementation. bool _isHiddenInterface(Container? c) => c != null && - c.element.name3 == 'Interceptor' && - c.element.library2?.name3 == '_interceptors'; + c.element.name == 'Interceptor' && + c.element.library?.name == '_interceptors'; /// All of the various supertypes of [enclosingElement], in a specific order. /// diff --git a/lib/src/model/inheriting_container.dart b/lib/src/model/inheriting_container.dart index cffddbcb07..e4d4b2be20 100644 --- a/lib/src/model/inheriting_container.dart +++ b/lib/src/model/inheriting_container.dart @@ -2,7 +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:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:collection/collection.dart' show IterableExtension; import 'package:dartdoc/src/element_type.dart'; @@ -19,7 +19,7 @@ import 'package:meta/meta.dart'; /// Note that [Constructor]s are not considered to be modifiers so a /// [hasModifiers] override is not necessary for this mixin. mixin Constructable implements InheritingContainer { - late final List constructors = element.constructors2 + late final List constructors = element.constructors .map((e) => getModelFor(e, library) as Constructor) .toList(growable: false); @@ -100,11 +100,11 @@ abstract class InheritingContainer extends Container { @visibleForTesting Iterable get inheritedMethods { - var methodNames = declaredMethods.map((m) => m.element.name3).toSet(); + var methodNames = declaredMethods.map((m) => m.element.name).toSet(); var inheritedMethodElements = element.inheritedMembers.values - .whereType() + .whereType() .where((e) => !e.isOperator) - .where((e) => !methodNames.contains(e.name3)); + .where((e) => !methodNames.contains(e.name)); return [ for (var e in inheritedMethodElements) @@ -117,9 +117,9 @@ abstract class InheritingContainer extends Container { var operatorNames = declaredOperators.map((o) => o.element.lookupName).toSet(); var inheritedOperatorElements = element.inheritedMembers.values - .whereType() + .whereType() .where((e) => e.isOperator) - .where((e) => !operatorNames.contains(e.name3)); + .where((e) => !operatorNames.contains(e.name)); return [ for (var e in inheritedOperatorElements) @@ -133,7 +133,7 @@ abstract class InheritingContainer extends Container { /// All fields defined on this container, _including inherited fields_. late final List _allFields = () { var inheritedAccessorElements = { - ...element.inheritedMembers.values.whereType() + ...element.inheritedMembers.values.whereType() }; // This structure keeps track of inherited accessors, allowing lookup @@ -143,11 +143,11 @@ abstract class InheritingContainer extends Container { // `.firstWhereOrNull((e) => e.isGetter)` and // `.firstWhereOrNull((e) => e.isSetter)` calls, which would be much simpler // if we used some sort of "pair" class instead. - var accessorMap = >{}; + var accessorMap = >{}; for (var accessorElement in inheritedAccessorElements) { accessorMap .putIfAbsent( - accessorElement.name3?.replaceFirst('=', '') ?? '', () => []) + accessorElement.name?.replaceFirst('=', '') ?? '', () => []) .add(accessorElement); } @@ -156,20 +156,20 @@ abstract class InheritingContainer extends Container { // For half-inherited fields, the analyzer only links the non-inherited // to the [FieldElement]. Compose our [Field] class by hand by looking up // inherited accessors that may be related. - for (var field in element.fields2) { - var getterElement = field.getter2; - if (getterElement == null && accessorMap.containsKey(field.name3)) { - getterElement = accessorMap[field.name3]! + for (var field in element.fields) { + var getterElement = field.getter; + if (getterElement == null && accessorMap.containsKey(field.name)) { + getterElement = accessorMap[field.name]! .firstWhereOrNull((e) => e is GetterElement) as GetterElement?; } - var setterElement = field.setter2; - if (setterElement == null && accessorMap.containsKey(field.name3)) { - setterElement = accessorMap[field.name3]! + var setterElement = field.setter; + if (setterElement == null && accessorMap.containsKey(field.name)) { + setterElement = accessorMap[field.name]! .firstWhereOrNull((e) => e is SetterElement) as SetterElement?; } fields.add(_createSingleField( getterElement, setterElement, inheritedAccessorElements, field)); - accessorMap.remove(field.name3); + accessorMap.remove(field.name); } // Now we only have inherited accessors who aren't associated with @@ -187,15 +187,15 @@ abstract class InheritingContainer extends Container { }(); @override - late final List declaredMethods = element.methods2 + late final List declaredMethods = element.methods .map((e) => getModelFor(e, library) as Method) .toList(growable: false); @override - late final List typeParameters = element.typeParameters2 + late final List typeParameters = element.typeParameters .map((typeParameter) => getModelFor( typeParameter, - getModelForElement(typeParameter.enclosingElement2!.library2!) + getModelForElement(typeParameter.enclosingElement!.library!) as Library) as TypeParameter) .toList(growable: false); @@ -229,7 +229,7 @@ abstract class InheritingContainer extends Container { getModelFor(element, library) as InheritingContainer; @override - InterfaceElement2 get element; + InterfaceElement get element; @override Library get enclosingElement => library; @@ -411,7 +411,7 @@ abstract class InheritingContainer extends Container { /// and so unlike other `public*` methods, is not a strict subset of /// [directInterfaces] (the direct interfaces). List get publicInterfaces { - var interfaceElements = {}; + var interfaceElements = {}; var interfaces = []; // Only interfaces with unique elements should be returned. Elements can @@ -421,7 +421,7 @@ abstract class InheritingContainer extends Container { // but there is no chance of type arguments differing, as that is illegal. void addInterfaceIfUnique(DefinedElementType type) { var firstPublicSuperElement = type.modelElement.element; - if (firstPublicSuperElement is InterfaceElement2) { + if (firstPublicSuperElement is InterfaceElement) { if (interfaceElements.add(firstPublicSuperElement)) { interfaces.add(type); } @@ -511,18 +511,18 @@ abstract class InheritingContainer extends Container { /// Creates a single Field. /// - /// If [field] is not specified, picks the [FieldElement2] from the - /// [PropertyAccessorElement2] whose enclosing class inherits from the other + /// If [field] is not specified, picks the [FieldElement] from the + /// [PropertyAccessorElement] whose enclosing class inherits from the other /// (defaulting to the getter) and constructs a [Field] using that. Field _createSingleField( - PropertyAccessorElement2? getterElement, - PropertyAccessorElement2? setterElement, - Set inheritedAccessors, - [FieldElement2? field]) { + PropertyAccessorElement? getterElement, + PropertyAccessorElement? setterElement, + Set inheritedAccessors, + [FieldElement? field]) { // Return a [ContainerAccessor] with `isInherited = true` if [element] is // in [inheritedAccessors]. ContainerAccessor? containerAccessorFrom( - PropertyAccessorElement2? element) { + PropertyAccessorElement? element) { if (element == null) return null; final enclosingContainer = inheritedAccessors.contains(element) ? this : null; @@ -556,9 +556,9 @@ abstract class InheritingContainer extends Container { if (setterEnclosingElement is Class && setterEnclosingElement._isInheritingFrom( getter.enclosingElement as InheritingContainer)) { - field = setterElement!.variable3 as FieldElement; + field = setterElement!.variable as FieldElement; } else { - field = getterElement!.variable3 as FieldElement; + field = getterElement!.variable as FieldElement; } } } diff --git a/lib/src/model/library.dart b/lib/src/model/library.dart index 6185e9f3fb..af62dbd1d5 100644 --- a/lib/src/model/library.dart +++ b/lib/src/model/library.dart @@ -3,7 +3,7 @@ // BSD-style license that can be found in the LICENSE file. import 'package:analyzer/dart/analysis/features.dart'; -import 'package:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/scope.dart'; import 'package:analyzer/source/line_info.dart'; // ignore: implementation_imports @@ -22,14 +22,14 @@ class _LibrarySentinel implements Library { class Library extends ModelElement with Categorization, TopLevelContainer, CanonicalFor { @override - final LibraryElement2 element; + final LibraryElement element; - /// The set of [Element2]s declared directly in this library. - final Set _localElements; + /// The set of [Element]s declared directly in this library. + final Set _localElements; - /// The set of [Element2]s exported by this library but not directly declared + /// The set of [Element]s exported by this library but not directly declared /// in this library. - final Set _exportedElements; + final Set _exportedElements; final String _restoredUri; @@ -58,17 +58,17 @@ class Library extends ModelElement var libraryElement = resolvedLibrary.element; - var localElements = { + var localElements = { ...libraryElement.firstFragment.getters.map((g) => g.element), ...libraryElement.firstFragment.setters.map((s) => s.element), - ...libraryElement.firstFragment.classes2.map((c) => c.element), - ...libraryElement.firstFragment.enums2.map((e) => e.element), - ...libraryElement.firstFragment.extensions2.map((e) => e.element), - ...libraryElement.firstFragment.extensionTypes2.map((e) => e.element), - ...libraryElement.firstFragment.functions2.map((f) => f.element), - ...libraryElement.firstFragment.mixins2.map((m) => m.element), - ...libraryElement.firstFragment.topLevelVariables2.map((v) => v.element), - ...libraryElement.firstFragment.typeAliases2.map((a) => a.element), + ...libraryElement.firstFragment.classes.map((c) => c.element), + ...libraryElement.firstFragment.enums.map((e) => e.element), + ...libraryElement.firstFragment.extensions.map((e) => e.element), + ...libraryElement.firstFragment.extensionTypes.map((e) => e.element), + ...libraryElement.firstFragment.functions.map((f) => f.element), + ...libraryElement.firstFragment.mixins.map((m) => m.element), + ...libraryElement.firstFragment.topLevelVariables.map((v) => v.element), + ...libraryElement.firstFragment.typeAliases.map((a) => a.element), }; var exportedElements = { ...libraryElement.exportNamespace.definedNames2.values @@ -94,14 +94,14 @@ class Library extends ModelElement @override CharacterLocation? get characterLocation { - if (element.firstFragment.nameOffset2 == null) { + if (element.firstFragment.nameOffset == null) { return CharacterLocation(1, 1); } return super.characterLocation; } @override - LibraryFragment get unitElement => element.library2.firstFragment; + LibraryFragment get unitElement => element.library.firstFragment; @override @@ -133,11 +133,11 @@ class Library extends ModelElement Map> get _prefixToLibrary { var prefixToLibrary = >{}; // It is possible to have overlapping prefixes. - for (var i in element.firstFragment.libraryImports2) { - var prefixName = i.prefix2?.element.name3; + for (var i in element.firstFragment.libraryImports) { + var prefixName = i.prefix?.element.name; if (prefixName == null) continue; // Ignore invalid imports. - var importedLibrary = i.importedLibrary2; + var importedLibrary = i.importedLibrary; if (importedLibrary != null) { prefixToLibrary .putIfAbsent(prefixName, () => {}) @@ -223,7 +223,7 @@ class Library extends ModelElement /// Whether a libary is anonymous, either because it has no library directive /// or it has a library directive without a name. - bool get isAnonymous => element.name3 == null || element.name3!.isEmpty; + bool get isAnonymous => element.name == null || element.name!.isEmpty; @override Kind get kind => Kind.library; @@ -238,14 +238,14 @@ class Library extends ModelElement // There are inconsistencies in library naming + URIs for the Dart // SDK libraries; we rationalize them here. if (source.uri.toString().contains('/')) { - return element.name3!.replaceFirst('dart.', 'dart:'); + return element.name!.replaceFirst('dart.', 'dart:'); } return source.uri.toString(); - } else if (element.name3!.isNotEmpty) { + } else if (element.name!.isNotEmpty) { // An empty name indicates that the library is "implicitly named" with the // empty string. That is, it either has no `library` directive, or it has // a `library` directive with no name. - return element.name3!; + return element.name!; } var baseName = pathContext.basename(source.fullName); if (baseName.endsWith('.dart')) { @@ -298,8 +298,8 @@ class Library extends ModelElement packageGraph.packageMetaProvider.fromElement(element, config.sdkDir); late final List classesAndExceptions = [ - ..._localElementsOfType(), - ..._exportedElementsOfType(), + ..._localElementsOfType(), + ..._exportedElementsOfType(), ]; @override @@ -314,8 +314,8 @@ class Library extends ModelElement @override late final List enums = [ - ..._localElementsOfType(), - ..._exportedElementsOfType(), + ..._localElementsOfType(), + ..._exportedElementsOfType(), ]; @override @@ -325,14 +325,14 @@ class Library extends ModelElement @override late final List extensions = [ - ..._localElementsOfType(), - ..._exportedElementsOfType(), + ..._localElementsOfType(), + ..._exportedElementsOfType(), ]; @override late final List extensionTypes = [ - ..._localElementsOfType(), - ..._exportedElementsOfType(), + ..._localElementsOfType(), + ..._exportedElementsOfType(), ]; @override @@ -343,8 +343,8 @@ class Library extends ModelElement @override late final List mixins = [ - ..._localElementsOfType(), - ..._exportedElementsOfType(), + ..._localElementsOfType(), + ..._exportedElementsOfType(), ]; @override @@ -355,20 +355,20 @@ class Library extends ModelElement @override late final List typedefs = [ - ..._localElementsOfType(), - ..._exportedElementsOfType(), + ..._localElementsOfType(), + ..._exportedElementsOfType(), ]; Iterable - _localElementsOfType() => + _localElementsOfType() => _localElements .whereType() .map((e) => packageGraph.getModelFor(e, this) as U); Iterable - _exportedElementsOfType() => + _exportedElementsOfType() => _exportedElements.whereType().map((e) { - var library = e.library2; + var library = e.library; if (library == null) { throw StateError("The library of '$e' is null!"); } @@ -380,31 +380,31 @@ class Library extends ModelElement Iterable get _localVariables { return { - ..._localElements.whereType(), + ..._localElements.whereType(), ..._localElements - .whereType() - .map((a) => a.variable3! as TopLevelVariableElement2), + .whereType() + .map((a) => a.variable as TopLevelVariableElement), }.map(_topLevelVariableFor); } Iterable get _exportedVariables { return { - ..._exportedElements.whereType(), + ..._exportedElements.whereType(), ..._exportedElements - .whereType() - .map((a) => a.variable3! as TopLevelVariableElement2), + .whereType() + .map((a) => a.variable as TopLevelVariableElement), }.map(_topLevelVariableFor); } TopLevelVariable _topLevelVariableFor( - TopLevelVariableElement2 topLevelVariableElement) { + TopLevelVariableElement topLevelVariableElement) { Accessor? getter; - var elementGetter = topLevelVariableElement.getter2; + var elementGetter = topLevelVariableElement.getter; if (elementGetter != null) { getter = packageGraph.getModelFor(elementGetter, this) as Accessor; } Accessor? setter; - var elementSetter = topLevelVariableElement.setter2; + var elementSetter = topLevelVariableElement.setter; if (elementSetter != null) { setter = packageGraph.getModelFor(elementSetter, this) as Accessor; } @@ -513,8 +513,8 @@ class Library extends ModelElement _ => null, }; return getModelForPropertyInducingElement( - member.element as TopLevelVariableElement2, - getModelForElement(member.element.library2!) as Library, + member.element as TopLevelVariableElement, + getModelForElement(member.element.library!) as Library, getter: getter, setter: setter, ).fullyQualifiedName; From d77700f7b3f23861b1fafeef7b798e23f448d0ab Mon Sep 17 00:00:00 2001 From: Fedor Shcheglov Date: Fri, 15 Aug 2025 16:40:12 -0700 Subject: [PATCH 05/14] 200 --- lib/src/model/method.dart | 32 +++--- lib/src/model/mixin.dart | 4 +- lib/src/model/model_element.dart | 191 +++++++++++++++---------------- 3 files changed, 112 insertions(+), 115 deletions(-) diff --git a/lib/src/model/method.dart b/lib/src/model/method.dart index 7a3186a6cf..d19747b283 100644 --- a/lib/src/model/method.dart +++ b/lib/src/model/method.dart @@ -2,10 +2,10 @@ // 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:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/source/line_info.dart'; // ignore: implementation_imports -import 'package:analyzer/src/dart/element/member.dart' show ExecutableMember; +import 'package:analyzer/src/dart/element/member.dart' show SubstitutedExecutableElementImpl; import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/model/attribute.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; @@ -16,7 +16,7 @@ class Method extends ModelElement with ContainerMember, Inheritable, TypeParameters { @override - final MethodElement2 element; + final MethodElement element; Container? _enclosingContainer; @@ -32,7 +32,7 @@ class Method extends ModelElement Method.inherited(this.element, this._enclosingContainer, super.library, super.packageGraph, - {ExecutableMember? super.originalMember}) + {SubstitutedExecutableElementImpl? super.originalMember}) : _isInherited = true { _calcTypeParameters(); } @@ -42,13 +42,13 @@ class Method extends ModelElement this._enclosingContainer, super.library, super.packageGraph, { - ExecutableMember? super.originalMember, + SubstitutedExecutableElementImpl? super.originalMember, }) : _isInherited = false { _calcTypeParameters(); } void _calcTypeParameters() { - typeParameters = element.typeParameters2.map((f) { + typeParameters = element.typeParameters.map((f) { return getModelFor(f, library) as TypeParameter; }).toList(growable: false); } @@ -68,7 +68,7 @@ class Method extends ModelElement @override Container get enclosingElement => _enclosingContainer ??= - getModelFor(element.enclosingElement2!, library) as Container; + getModelFor(element.enclosingElement!, library) as Container; @override String get aboveSidebarPath => enclosingElement.sidebarPath; @@ -96,7 +96,7 @@ class Method extends ModelElement bool get isOperator => false; bool get isProvidedByExtension => - element.enclosingElement2 is ExtensionElement2; + element.enclosingElement is ExtensionElement; /// The [enclosingElement], which is expected to be an [Extension]. Extension get enclosingExtension => enclosingElement as Extension; @@ -113,8 +113,8 @@ class Method extends ModelElement Kind get kind => Kind.method; @override - ExecutableMember? get originalMember => - super.originalMember as ExecutableMember?; + SubstitutedExecutableElementImpl? get originalMember => + super.originalMember as SubstitutedExecutableElementImpl?; late final Callable modelType = getTypeFor((originalMember ?? element).type, library) as Callable; @@ -122,17 +122,17 @@ class Method extends ModelElement @override Method? get overriddenElement { if (_enclosingContainer is Extension || - element.enclosingElement2 is ExtensionElement2) { + element.enclosingElement is ExtensionElement) { return null; } - var parent = element.enclosingElement2 as InterfaceElement2; + var parent = element.enclosingElement as InterfaceElement; for (var t in parent.allSupertypes) { - Element2? e = t.getMethod2(element.name3 ?? ''); + Element? e = t.getMethod(element.name ?? ''); if (e != null) { assert( - e.enclosingElement2 is InterfaceElement2, - 'Expected "${e.enclosingElement2?.name3}" to be a InterfaceElement, ' - 'but was ${e.enclosingElement2.runtimeType}', + e.enclosingElement is InterfaceElement, + 'Expected "${e.enclosingElement?.name}" to be a InterfaceElement, ' + 'but was ${e.enclosingElement.runtimeType}', ); return getModelForElement(e) as Method?; } diff --git a/lib/src/model/mixin.dart b/lib/src/model/mixin.dart index 2d9227ebec..afca0d3a87 100644 --- a/lib/src/model/mixin.dart +++ b/lib/src/model/mixin.dart @@ -2,7 +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:analyzer/dart/element/element2.dart'; +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/comment_referable.dart'; @@ -13,7 +13,7 @@ import 'package:meta/meta.dart'; class Mixin extends InheritingContainer { @override - final MixinElement2 element; + final MixinElement element; late final List superclassConstraints = [ ...element.superclassConstraints.where((e) => !e.isDartCoreObject).map( diff --git a/lib/src/model/model_element.dart b/lib/src/model/model_element.dart index 485ef28ece..188b38ce2b 100644 --- a/lib/src/model/model_element.dart +++ b/lib/src/model/model_element.dart @@ -8,12 +8,17 @@ library; import 'dart:collection'; import 'dart:convert'; -import 'package:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.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/member.dart' - show ExecutableMember, FieldMember, Member, ParameterMember; + show + SubstitutedExecutableElementImpl, + SubstitutedFieldElementImpl, + SubstitutedElementImpl, + SubstitutedFormalParameterElementImpl; import 'package:dartdoc/src/dartdoc_options.dart'; import 'package:dartdoc/src/model/annotation.dart'; import 'package:dartdoc/src/model/attribute.dart'; @@ -70,33 +75,34 @@ abstract class ModelElement DocumentationComment implements Comparable, Documentable { // TODO(jcollins-g): This really wants a "member that has a type" class. - final Member? _originalMember; + final SubstitutedElementImpl? _originalMember; final Library _library; final PackageGraph _packageGraph; - ModelElement(this._library, this._packageGraph, {Member? originalMember}) + ModelElement(this._library, this._packageGraph, + {SubstitutedElementImpl? originalMember}) : _originalMember = originalMember; - /// Returns a [ModelElement] for an [Element2], which can be a + /// Returns a [ModelElement] for an [Element], 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(Element2 e, PackageGraph p) { - if (e is MultiplyDefinedElement2) { + factory ModelElement.forElement(Element e, PackageGraph p) { + if (e is MultiplyDefinedElement) { // The code-to-document has static errors. We can pick the first // conflicting element and move on. - e = e.conflictingElements2.first; + e = e.conflictingElements.first; } var library = p.findButDoNotCreateLibraryFor(e) ?? Library.sentinel; - if (e is PropertyInducingElement2) { - var elementGetter = e.getter2; + if (e is PropertyInducingElement) { + var elementGetter = e.getter; var getter = elementGetter != null ? ModelElement.for_(elementGetter, library, p) as Accessor : null; - var elementSetter = e.setter2; + var elementSetter = e.setter; var setter = elementSetter != null ? ModelElement.for_(elementSetter, library, p) as Accessor : null; @@ -113,7 +119,7 @@ abstract class ModelElement /// [ModelElement.for_]. Specify [enclosingContainer] if and only if this is /// to be an inherited or extended object. factory ModelElement.forPropertyInducingElement( - PropertyInducingElement2 e, + PropertyInducingElement e, Library library, PackageGraph packageGraph, { required Accessor? getter, @@ -122,8 +128,8 @@ abstract class ModelElement }) { // TODO(jcollins-g): Refactor object model to instantiate 'ModelMembers' // for members? - if (e is Member) { - e = e.baseElement as PropertyInducingElement2; + if (e is SubstitutedElementImpl) { + e = e.baseElement as PropertyInducingElement; } // Return the cached ModelElement if it exists. @@ -134,11 +140,11 @@ abstract class ModelElement } ModelElement newModelElement; - if (e is TopLevelVariableElement2) { + if (e is TopLevelVariableElement) { assert(getter != null || setter != null); newModelElement = TopLevelVariable(e, library, packageGraph, getter, setter); - } else if (e is FieldElement2) { + } else if (e is FieldElement) { if (enclosingContainer is Extension) { newModelElement = Field(e, library, packageGraph, getter as ContainerAccessor?, setter as ContainerAccessor?); @@ -157,7 +163,7 @@ abstract class ModelElement var index = constantIndex.toIntValue()!; newModelElement = EnumField.forConstant(index, e, library, packageGraph, getter); - } else if (e.enclosingElement2 is ExtensionElement2) { + } else if (e.enclosingElement is ExtensionElement) { newModelElement = Field(e, library, packageGraph, getter as ContainerAccessor?, setter as ContainerAccessor?); } else { @@ -167,7 +173,7 @@ abstract class ModelElement } else { // Enum fields and extension getters can't be inherited, so this case is // simpler. - if (e.enclosingElement2 is ExtensionElement2) { + if (e.enclosingElement is ExtensionElement) { newModelElement = Field.providedByExtension( e, enclosingContainer, @@ -208,22 +214,22 @@ 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_( - Element2 e, Library library, PackageGraph packageGraph, + Element e, Library library, PackageGraph packageGraph, {Container? enclosingContainer}) { assert(library != Library.sentinel || e is FormalParameterElement || - e is TypeParameterElement2 || - e is GenericFunctionTypeElement2 || + e is TypeParameterElement || + e is GenericFunctionTypeElement || e.kind == ElementKind.DYNAMIC || e.kind == ElementKind.NEVER); - Member? originalMember; + SubstitutedElementImpl? originalMember; // TODO(jcollins-g): Refactor object model to instantiate 'ModelMembers' // for members? - if (e is ExecutableMember) { + if (e is SubstitutedExecutableElementImpl) { originalMember = e; e = e.baseElement; - } else if (e is FieldMember) { + } else if (e is SubstitutedFieldElementImpl) { originalMember = e; e = e.baseElement; } @@ -261,7 +267,7 @@ abstract class ModelElement /// Caches a newly-created [ModelElement] from [ModelElement.for_] or /// [ModelElement.forPropertyInducingElement]. static void _cacheNewModelElement( - Element2 e, ModelElement newModelElement, Library library, + Element e, ModelElement newModelElement, Library library, {Container? enclosingContainer}) { // TODO(jcollins-g): Reenable Parameter caching when dart-lang/sdk#30146 // is fixed? @@ -280,80 +286,81 @@ abstract class ModelElement } static ModelElement _constructFromElementDeclaration( - Element2 e, + Element e, Library library, PackageGraph packageGraph, { Container? enclosingContainer, - Member? originalMember, + SubstitutedElementImpl? originalMember, }) { return switch (e) { - 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), + LibraryElement() => packageGraph.findButDoNotCreateLibraryFor(e)!, + PrefixElement() => Prefix(e, library, packageGraph), + EnumElement() => Enum(e, library, packageGraph), + MixinElement() => Mixin(e, library, packageGraph), + ClassElement() => Class(e, library, packageGraph), + ExtensionElement() => Extension(e, library, packageGraph), + ExtensionTypeElement() => ExtensionType(e, library, packageGraph), TopLevelFunctionElement() => ModelFunction(e, library, packageGraph), - ConstructorElement2() => Constructor(e, library, packageGraph), - GenericFunctionTypeElement2() => - ModelFunctionTypedef(e as FunctionTypedElement2, library, packageGraph), - TypeAliasElement2(aliasedType: FunctionType()) => + ConstructorElement() => Constructor(e, library, packageGraph), + GenericFunctionTypeElement() => + ModelFunctionTypedef(e as FunctionTypedElement, library, packageGraph), + TypeAliasElement(aliasedType: FunctionType()) => FunctionTypedef(e, library, packageGraph), - TypeAliasElement2() - when e.aliasedType.documentableElement2 is InterfaceElement2 => + TypeAliasElement() + when e.aliasedType.documentableElement2 is InterfaceElement => ClassTypedef(e, library, packageGraph), - TypeAliasElement2() => GeneralizedTypedef(e, library, packageGraph), - MethodElement2(isOperator: true) when enclosingContainer == null => + TypeAliasElement() => GeneralizedTypedef(e, library, packageGraph), + MethodElement(isOperator: true) when enclosingContainer == null => Operator(e, library, packageGraph), - MethodElement2(isOperator: true) - when e.enclosingElement2 is ExtensionElement2 => + MethodElement(isOperator: true) + when e.enclosingElement is ExtensionElement => Operator.providedByExtension( e, enclosingContainer, library, packageGraph), - MethodElement2(isOperator: true) => Operator.inherited( + MethodElement(isOperator: true) => Operator.inherited( e, enclosingContainer, library, packageGraph, originalMember: originalMember), - MethodElement2(isOperator: false) when enclosingContainer == null => + MethodElement(isOperator: false) when enclosingContainer == null => Method(e, library, packageGraph), - MethodElement2(isOperator: false) - when e.enclosingElement2 is ExtensionElement2 => + MethodElement(isOperator: false) + when e.enclosingElement is ExtensionElement => Method.providedByExtension( e, enclosingContainer, library, packageGraph), - MethodElement2(isOperator: false) => Method.inherited( + MethodElement(isOperator: false) => Method.inherited( e, enclosingContainer, library, packageGraph, - originalMember: originalMember as ExecutableMember?), + originalMember: originalMember as SubstitutedExecutableElementImpl?), FormalParameterElement() => Parameter(e, library, packageGraph, - originalMember: originalMember as ParameterMember?), - PropertyAccessorElement2() => _constructFromPropertyAccessor( + originalMember: + originalMember as SubstitutedFormalParameterElementImpl?), + PropertyAccessorElement() => _constructFromPropertyAccessor( e, library, packageGraph, enclosingContainer: enclosingContainer, originalMember: originalMember, ), - TypeParameterElement2() => TypeParameter(e, library, packageGraph), + TypeParameterElement() => TypeParameter(e, library, packageGraph), _ => throw UnimplementedError('Unknown type ${e.runtimeType}'), }; } - /// Constructs a [ModelElement] from a [PropertyAccessorElement2]. + /// Constructs a [ModelElement] from a [PropertyAccessorElement]. static ModelElement _constructFromPropertyAccessor( - PropertyAccessorElement2 e, + PropertyAccessorElement e, Library library, PackageGraph packageGraph, { required Container? enclosingContainer, - required Member? originalMember, + required SubstitutedElementImpl? originalMember, }) { // Accessors can be part of a [Container], or a part of a [Library]. - if (e.enclosingElement2 is ExtensionElement2 || - e.enclosingElement2 is InterfaceElement2) { + if (e.enclosingElement is ExtensionElement || + e.enclosingElement is InterfaceElement) { if (enclosingContainer == null || enclosingContainer is Extension) { return ContainerAccessor(e, library, packageGraph, enclosingContainer); } return ContainerAccessor.inherited( e, library, packageGraph, enclosingContainer, - originalMember: originalMember as ExecutableMember?); + originalMember: originalMember as SubstitutedExecutableElementImpl?); } return Accessor(e, library, packageGraph); @@ -412,7 +419,7 @@ abstract class ModelElement return false; } - if (element case LibraryElement2(:var uri, :var firstFragment)) { + if (element case LibraryElement(:var uri, :var firstFragment)) { final url = uri.toString(); // Private Dart SDK libraries are not public. if (url.startsWith('dart:_') || @@ -428,12 +435,9 @@ abstract class ModelElement } } - if (element.nonSynthetic2 case Annotatable(:var metadata2)) { - if (metadata2.hasInternal) { - return false; - } + if (element.nonSynthetic.metadata.hasInternal) { + return false; } - return !element.hasPrivateName && !hasNodoc; }(); @@ -468,9 +472,9 @@ abstract class ModelElement /// Whether this is a function, or if it is an type alias to a function. bool get isCallable => - element is FunctionTypedElement2 || - (element is TypeAliasElement2 && - (element as TypeAliasElement2).aliasedType is FunctionType); + element is FunctionTypedElement || + (element is TypeAliasElement && + (element as TypeAliasElement).aliasedType is FunctionType); /// The canonical ModelElement for this ModelElement, or null if there isn't /// one. @@ -552,7 +556,7 @@ abstract class ModelElement documentationFrom.map((e) => e.documentationLocal).join('

')); @override - Element2 get element; + Element get element; @override String get location { @@ -590,13 +594,13 @@ abstract class ModelElement }(); @override - String get sourceFileName => element.library2!.firstFragment.source.fullName; + String get sourceFileName => element.library!.firstFragment.source.fullName; @override late final CharacterLocation? characterLocation = () { final lineInfo = unitElement.lineInfo; - final nameOffset = element.firstFragment.nameOffset2; + final nameOffset = element.firstFragment.nameOffset; assert(nameOffset != null && nameOffset >= 0, 'Invalid location data, $nameOffset, for element: $fullyQualifiedName'); if (nameOffset != null && nameOffset >= 0) { @@ -639,13 +643,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.annotations.isEmpty && element is PropertyInducingElement2) { - var pie = element as PropertyInducingElement2; + if (element.annotations.isEmpty && element is PropertyInducingElement) { + var pie = element as PropertyInducingElement; // The getter or the setter might be null – so the stored value may be // `true`, `false`, or `null` - var getterDeprecated = pie.getter2?.metadata2.hasDeprecated; - var setterDeprecated = pie.setter2?.metadata2.hasDeprecated; + var getterDeprecated = pie.getter?.metadata.hasDeprecated; + var setterDeprecated = pie.setter?.metadata.hasDeprecated; var deprecatedValues = [getterDeprecated, setterDeprecated].nonNulls; @@ -657,11 +661,7 @@ abstract class ModelElement return deprecatedValues.every((d) => d); } - if (element case Annotatable element) { - return element.metadata2.hasDeprecated; - } - - return false; + return element.metadata.hasDeprecated; } @override @@ -740,7 +740,7 @@ abstract class ModelElement @override String get oneLineDoc => elementDocumentation.asOneLiner; - Member? get originalMember => _originalMember; + SubstitutedElementImpl? get originalMember => _originalMember; @override PackageGraph get packageGraph => _packageGraph; @@ -762,23 +762,24 @@ abstract class ModelElement } final List params; - if (e is TypeAliasElement2) { + if (e is TypeAliasElement) { final aliasedType = e.aliasedType; if (aliasedType is FunctionType) { params = aliasedType.formalParameters; } else { return const []; } - } else if (e is ExecutableElement2) { + } else if (e is ExecutableElement) { if (_originalMember != null) { - assert(_originalMember is ExecutableMember); - params = (_originalMember as ExecutableMember).formalParameters; + assert(_originalMember is SubstitutedExecutableElementImpl); + params = (_originalMember as SubstitutedExecutableElementImpl) + .formalParameters; } else { params = e.formalParameters; } - } else if (e is FunctionTypedElement2) { + } else if (e is FunctionTypedElement) { if (_originalMember != null) { - params = (_originalMember as FunctionTypedElement2).formalParameters; + params = (_originalMember as FunctionTypedElement).formalParameters; } else { params = e.formalParameters; } @@ -822,23 +823,19 @@ extension on ElementAnnotation { /// /// At the moment, `pragma` is the only invisible annotation. bool get isVisibleAnnotation { - if (element2 == null) return false; + if (element == null) return false; - if (element2 case ConstructorElement2(:var enclosingElement2)) { - return !(enclosingElement2.name3 == 'pragma' && - enclosingElement2.library2.name3 == 'dart.core'); + if (element case ConstructorElement(:var enclosingElement)) { + return !(enclosingElement.name == 'pragma' && + enclosingElement.library.name == 'dart.core'); } return true; } } -extension on Element2 { +extension on Element { List get annotations { - if (this case Annotatable self) { - return self.metadata2.annotations; - } else { - return const []; - } + return metadata.annotations; } } From 52875b6cf7bbdd4ded557c920338518496e5ec22 Mon Sep 17 00:00:00 2001 From: Fedor Shcheglov Date: Fri, 15 Aug 2025 16:44:24 -0700 Subject: [PATCH 06/14] 100 --- lib/src/model/model_function.dart | 12 ++--- lib/src/model/model_node.dart | 8 ++-- lib/src/model/nameable.dart | 8 ++-- lib/src/model/never.dart | 4 +- lib/src/model/operator.dart | 10 ++--- lib/src/model/package.dart | 4 +- lib/src/model/package_builder.dart | 28 ++++++------ lib/src/model/package_graph.dart | 72 +++++++++++++++--------------- 8 files changed, 73 insertions(+), 73 deletions(-) diff --git a/lib/src/model/model_function.dart b/lib/src/model/model_function.dart index 9963a8f42b..d910700209 100644 --- a/lib/src/model/model_function.dart +++ b/lib/src/model/model_function.dart @@ -2,7 +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:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; import 'package:dartdoc/src/model/kind.dart'; @@ -16,7 +16,7 @@ class ModelFunction extends ModelFunctionTyped with Categorization { bool get isStatic => element.isStatic; @override - String get name => element.name3 ?? ''; + String get name => element.name ?? ''; @override TopLevelFunctionElement get element => @@ -25,22 +25,22 @@ class ModelFunction extends ModelFunctionTyped with Categorization { bool get isAsynchronous => element.firstFragment.isAsynchronous; } -/// A [ModelElement] for a [FunctionTypedElement2] that is part of an +/// A [ModelElement] for a [FunctionTypedElement] that is part of an /// explicit typedef. class ModelFunctionTypedef extends ModelFunctionTyped { ModelFunctionTypedef(super.element, super.library, super.packageGraph); @override - String get name => element.enclosingElement2!.name3!; + String get name => element.enclosingElement!.name!; } class ModelFunctionTyped extends ModelElement with TypeParameters { @override - final FunctionTypedElement2 element; + final FunctionTypedElement element; @override late final List typeParameters = [ - for (var p in element.typeParameters2) + for (var p in element.typeParameters) getModelFor(p, library) as TypeParameter, ]; diff --git a/lib/src/model/model_node.dart b/lib/src/model/model_node.dart index 05796fde17..09c23def01 100644 --- a/lib/src/model/model_node.dart +++ b/lib/src/model/model_node.dart @@ -7,13 +7,13 @@ import 'dart:convert'; import 'package:analyzer/dart/analysis/analysis_context.dart'; import 'package:analyzer/dart/analysis/results.dart'; import 'package:analyzer/dart/ast/ast.dart'; -import 'package:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:meta/meta.dart'; /// Stripped down information derived from [AstNode] containing only information /// needed to resurrect the source code of [_element]. class ModelNode { - final Element2 _element; + final Element _element; final AnalysisContext _analysisContext; final int _sourceEnd; final int _sourceOffset; @@ -23,7 +23,7 @@ class ModelNode { factory ModelNode( AstNode? sourceNode, - Element2 element, + Element element, AnalysisContext analysisContext, { CommentData? commentData, }) { @@ -115,7 +115,7 @@ class CommentDocImportData { /// Comment reference data is not available on the analyzer's Element model, so /// we store it in instances of this class after resolving libraries. class CommentReferenceData { - final Element2 element; + final Element element; final String name; final int offset; final int length; diff --git a/lib/src/model/nameable.dart b/lib/src/model/nameable.dart index b3fa84fe07..e28ca3a787 100644 --- a/lib/src/model/nameable.dart +++ b/lib/src/model/nameable.dart @@ -2,7 +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:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/type.dart' show DartType; import 'package:collection/collection.dart'; import 'package:dartdoc/src/element_type.dart'; @@ -54,7 +54,7 @@ mixin Nameable { /// /// A convenience method for [ModelElement.for_], see its documentation. ModelElement getModelFor( - Element2 element, + Element element, Library library, { Container? enclosingContainer, }) => @@ -69,7 +69,7 @@ mixin Nameable { /// /// A convenience method for [ModelElement.forElement], see its /// documentation. - ModelElement getModelForElement(Element2 element) => + ModelElement getModelForElement(Element element) => ModelElement.forElement(element, packageGraph); /// Returns the [ModelElement] for [element], instantiating it if needed. @@ -80,7 +80,7 @@ mixin Nameable { // immediately before calling this method, and I imagine could instead just // call `getModelFor`. ModelElement getModelForPropertyInducingElement( - PropertyInducingElement2 element, + PropertyInducingElement element, Library library, { required Accessor? getter, required Accessor? setter, diff --git a/lib/src/model/never.dart b/lib/src/model/never.dart index bc71ef7f6d..25b6813a3a 100644 --- a/lib/src/model/never.dart +++ b/lib/src/model/never.dart @@ -2,7 +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:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; import 'package:dartdoc/src/model/kind.dart'; import 'package:dartdoc/src/model/model.dart'; @@ -10,7 +10,7 @@ import 'package:dartdoc/src/model/model.dart'; class NeverType extends ModelElement with HasNoPage { @override - final Element2 element; + final Element element; NeverType(this.element, PackageGraph packageGraph) : super(Library.sentinel, packageGraph); diff --git a/lib/src/model/operator.dart b/lib/src/model/operator.dart index 708a8cdc1f..2a7e0f8b9b 100644 --- a/lib/src/model/operator.dart +++ b/lib/src/model/operator.dart @@ -4,7 +4,7 @@ // ignore: implementation_imports import 'package:analyzer/src/dart/element/member.dart' - show ExecutableMember, Member; + show SubstitutedExecutableElementImpl, SubstitutedElementImpl; import 'package:dartdoc/src/comment_references/parser.dart'; import 'package:dartdoc/src/model/model.dart'; @@ -16,17 +16,17 @@ class Operator extends Method { super.enclosingContainer, super.library, super.packageGraph, { - Member? originalMember, + SubstitutedElementImpl? originalMember, }) : super.providedByExtension( - originalMember: originalMember as ExecutableMember?); + originalMember: originalMember as SubstitutedExecutableElementImpl?); Operator.inherited( super.element, super.enclosingContainer, super.library, super.packageGraph, { - Member? originalMember, - }) : super.inherited(originalMember: originalMember as ExecutableMember?); + SubstitutedElementImpl? originalMember, + }) : super.inherited(originalMember: originalMember as SubstitutedExecutableElementImpl?); @override String get fullyQualifiedName => diff --git a/lib/src/model/package.dart b/lib/src/model/package.dart index 980dcfdf85..f4dec4758e 100644 --- a/lib/src/model/package.dart +++ b/lib/src/model/package.dart @@ -2,7 +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:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:dartdoc/src/dartdoc_options.dart'; import 'package:dartdoc/src/io_utils.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; @@ -374,7 +374,7 @@ class Package extends LibraryContainer final PackageMeta packageMeta; @override - Element2? get element => null; + Element? get element => null; @override List get containerOrder => config.packageOrder; diff --git a/lib/src/model/package_builder.dart b/lib/src/model/package_builder.dart index 7a1e9a5e13..19d193813a 100644 --- a/lib/src/model/package_builder.dart +++ b/lib/src/model/package_builder.dart @@ -7,7 +7,7 @@ import 'dart:async'; import 'package:analyzer/dart/analysis/analysis_context.dart'; import 'package:analyzer/dart/analysis/results.dart'; import 'package:analyzer/dart/ast/ast.dart'; -import 'package:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/file_system/file_system.dart'; // ignore: implementation_imports import 'package:analyzer/src/context/builder.dart' show EmbedderYamlLocator; @@ -215,10 +215,10 @@ class PubPackageBuilder implements PackageBuilder { /// Discovers and resolves libraries, invoking [addLibrary] with each result. /// /// Uses [processedLibraries] to prevent calling [addLibrary] more than once - /// with the same [LibraryElement2]. Adds each [LibraryElement2] found to + /// with the same [LibraryElement]. Adds each [LibraryElement] found to /// [processedLibraries]. Future _discoverLibraries(PackageGraph uninitializedPackageGraph, - Set processedLibraries, Set files) async { + Set processedLibraries, Set files) async { files = {...files}; // Discover Dart libraries in a loop. In each iteration of the loop, we take // a set of files (starting with the ones passed into the function), resolve @@ -435,7 +435,7 @@ class PubPackageBuilder implements PackageBuilder { var files = await _getFilesToDocument(); logInfo('Discovering libraries...'); - var foundLibraries = {}; + var foundLibraries = {}; await _discoverLibraries( uninitializedPackageGraph, foundLibraries, @@ -447,9 +447,9 @@ class PubPackageBuilder implements PackageBuilder { /// Throws an exception if any configured-to-be-included files were not found /// while gathering libraries. - void _checkForMissingIncludedFiles(Set foundLibraries) { + void _checkForMissingIncludedFiles(Set foundLibraries) { if (_config.include.isNotEmpty) { - var knownLibraryNames = foundLibraries.map((l) => l.name3); + var knownLibraryNames = foundLibraries.map((l) => l.name); var notFound = _config.include .difference(Set.of(knownLibraryNames)) .difference(_config.exclude); @@ -482,11 +482,11 @@ class PubPackageBuilder implements PackageBuilder { /// Contains the [ResolvedLibraryResult] and any additional information about /// the library. class DartDocResolvedLibrary { - final LibraryElement2 element; + final LibraryElement element; final List units; DartDocResolvedLibrary(ResolvedLibraryResult result) - : element = result.element2, + : element = result.element, units = result.units.map((unit) => unit.unit).toList(); } @@ -494,8 +494,8 @@ extension on Set { /// Adds [element]'s path and all of its part files' paths to `this`, and /// recursively adds the paths of all imported and exported libraries. /// - /// [element] must be a [LibraryElement2]. - void addFilesReferencedBy(LibraryElement2? element) { + /// [element] must be a [LibraryElement]. + void addFilesReferencedBy(LibraryElement? element) { if (element == null) return; for (var fragment in element.fragments) { @@ -509,13 +509,13 @@ extension on Set { var path = fragment.source.fullName; if (add(path)) { - var libraryImports = fragment.libraryImports2; + var libraryImports = fragment.libraryImports; for (var import in libraryImports) { - addFilesReferencedBy(import.importedLibrary2); + addFilesReferencedBy(import.importedLibrary); } - var libraryExports = fragment.libraryExports2; + var libraryExports = fragment.libraryExports; for (var export in libraryExports) { - addFilesReferencedBy(export.exportedLibrary2); + addFilesReferencedBy(export.exportedLibrary); } } } diff --git a/lib/src/model/package_graph.dart b/lib/src/model/package_graph.dart index 4c0de5897a..a329614c73 100644 --- a/lib/src/model/package_graph.dart +++ b/lib/src/model/package_graph.dart @@ -5,7 +5,7 @@ import 'dart:collection'; import 'package:analyzer/dart/analysis/analysis_context.dart'; -import 'package:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/file_system/file_system.dart'; import 'package:analyzer/source/source.dart'; // ignore: implementation_imports @@ -114,8 +114,8 @@ class PackageGraph with CommentReferable, Nameable { } /// Whether [libraryElement] should be included in the libraries-to-document. - bool _shouldIncludeLibrary(LibraryElement2 libraryElement) => - config.include.isEmpty || config.include.contains(libraryElement.name3); + bool _shouldIncludeLibrary(LibraryElement libraryElement) => + config.include.isEmpty || config.include.contains(libraryElement.name); /// Call after all libraries are added. Future initializePackageGraph() async { @@ -200,7 +200,7 @@ class PackageGraph with CommentReferable, Nameable { // Many ModelElements have the same ModelNode; don't build/cache this data // more than once for them. - final Map _modelNodes = {}; + final Map _modelNodes = {}; /// The Object class declared in the Dart SDK's 'dart:core' library. late InheritingContainer objectClass; @@ -303,7 +303,7 @@ class PackageGraph with CommentReferable, Nameable { addModelNode(declaration); } - ModelNode? getModelNodeFor(Element2 element2) => _modelNodes[element2]; + ModelNode? getModelNodeFor(Element element2) => _modelNodes[element2]; /// It is safe to cache values derived from the [_implementers] table if this /// is true. @@ -390,7 +390,7 @@ class PackageGraph with CommentReferable, Nameable { late final PackageWarningCounter packageWarningCounter = PackageWarningCounter(this); - final Set<(Element2? element, PackageWarning packageWarning, String? message)> + final Set<(Element? element, PackageWarning packageWarning, String? message)> _warnAlreadySeen = {}; void warnOnElement(Warnable? warnable, PackageWarning kind, @@ -505,8 +505,8 @@ class PackageGraph with CommentReferable, Nameable { Iterable get _documentedPackages => packages.where((p) => p.documentedWhere != DocumentLocation.missing); - /// A mapping from a [LibraryElement2] to all of the [Library]s that export it. - Map> _libraryExports = {}; + /// A mapping from a [LibraryElement] to all of the [Library]s that export it. + Map> _libraryExports = {}; /// Marks [publicLibrary] as a library that exports [libraryElement] and all /// libraries that [libraryElement] transitively exports. @@ -514,8 +514,8 @@ class PackageGraph with CommentReferable, Nameable { /// [alreadyTagged] is used internall to prevent visiting in cycles. void _tagExportsFor( final Library publicLibrary, - final LibraryElement2 libraryElement, { - Set<(Library, LibraryElement2)>? alreadyTagged, + final LibraryElement libraryElement, { + Set<(Library, LibraryElement)>? alreadyTagged, }) { alreadyTagged ??= {}; var key = (publicLibrary, libraryElement); @@ -526,8 +526,8 @@ class PackageGraph with CommentReferable, Nameable { // Mark that `publicLibrary` exports `libraryElement`. _libraryExports.putIfAbsent(libraryElement, () => {}).add(publicLibrary); for (var fragment in libraryElement.fragments) { - for (var exportedElement in fragment.libraryExports2) { - var exportedLibrary = exportedElement.exportedLibrary2; + for (var exportedElement in fragment.libraryExports) { + var exportedLibrary = exportedElement.exportedLibrary; if (exportedLibrary != null) { // Follow the exports down; as `publicLibrary` exports `libraryElement`, // it also exports each `exportedLibrary`. @@ -540,9 +540,9 @@ class PackageGraph with CommentReferable, Nameable { int _previousSizeOfAllLibraries = 0; - /// A mapping from a [LibraryElement2] to all of the [Library]s that export it, + /// A mapping from a [LibraryElement] to all of the [Library]s that export it, /// which is created if it is not yet populated. - Map> get libraryExports { + Map> get libraryExports { // The map must be reset if we're still in the middle of adding libraries // (though this shouldn't happen). if (_allLibraries.keys.length != _previousSizeOfAllLibraries) { @@ -559,9 +559,9 @@ class PackageGraph with CommentReferable, Nameable { return _libraryExports; } - /// A mapping from a [LibraryElement2] to all of the [Library]s that export it, + /// A mapping from a [LibraryElement] to all of the [Library]s that export it, /// which is created if it is not yet populated. - Map> get libraryExports2 { + Map> get libraryExports2 { // The map must be reset if we're still in the middle of adding libraries // (though this shouldn't happen). if (_allLibraries.keys.length != _previousSizeOfAllLibraries) { @@ -699,8 +699,8 @@ class PackageGraph with CommentReferable, Nameable { 'Object'; bool isAnnotationVisible(Class class_) => - class_.element.name3 == 'pragma' && - class_.element.library2.name3 == 'dart.core'; + class_.element.name == 'pragma' && + class_.element.library.name == 'dart.core'; @override String toString() { @@ -745,9 +745,9 @@ class PackageGraph with CommentReferable, Nameable { library = preferredClass.canonicalLibrary; } // For elements defined in extensions, they are canonical. - var enclosingElement = e.enclosingElement2; - if (enclosingElement is ExtensionElement2) { - library ??= getModelForElement(enclosingElement.library2) as Library?; + var enclosingElement = e.enclosingElement; + if (enclosingElement is ExtensionElement) { + library ??= getModelForElement(enclosingElement.library) as Library?; // TODO(keertip): Find a better way to exclude members of extensions // when libraries are specified using the "--include" flag. if (library != null && library.isDocumented) { @@ -758,10 +758,10 @@ class PackageGraph with CommentReferable, Nameable { // guesswork with member elements. var declaration = e.baseElement; ModelElement? canonicalModelElement; - if (e is ConstructorElement2 || - e is MethodElement2 || - e is FieldElement2 || - e is PropertyAccessorElement2) { + if (e is ConstructorElement || + e is MethodElement || + e is FieldElement || + e is PropertyAccessorElement) { var declarationModelElement = getModelForElement(declaration); e = declarationModelElement.element; canonicalModelElement = _findCanonicalModelElementForAmbiguous( @@ -769,13 +769,13 @@ class PackageGraph with CommentReferable, Nameable { preferredClass: preferredClass as InheritingContainer?); } else { if (library != null) { - if (e case PropertyInducingElement2(:var getter2, :var setter2)) { - var getterElement = getter2 == null + if (e case PropertyInducingElement(:var getter, :var setter)) { + var getterElement = getter == null ? null - : getModelFor(getter2, library) as Accessor; - var setterElement = setter2 == null + : getModelFor(getter, library) as Accessor; + var setterElement = setter == null ? null - : getModelFor(setter2, library) as Accessor; + : getModelFor(setter, library) as Accessor; canonicalModelElement = getModelForPropertyInducingElement(e, library, getter: getterElement, setter: setterElement); } else { @@ -788,7 +788,7 @@ class PackageGraph with CommentReferable, Nameable { } } // Prefer fields and top-level variables. - if (e is PropertyAccessorElement2 && canonicalModelElement is Accessor) { + if (e is PropertyAccessorElement && canonicalModelElement is Accessor) { canonicalModelElement = canonicalModelElement.enclosingCombo; } return canonicalModelElement; @@ -871,9 +871,9 @@ class PackageGraph with CommentReferable, Nameable { /// This is used when we might need a Library object that isn't actually /// a documentation entry point (for elements that have no Library within the /// set of canonical Libraries). - Library? findButDoNotCreateLibraryFor(Element2 e) { + Library? findButDoNotCreateLibraryFor(Element e) { // This is just a cache to avoid creating lots of libraries over and over. - return _allLibraries[e.library2?.firstFragment.source.fullName]; + return _allLibraries[e.library?.firstFragment.source.fullName]; } /// Gathers all of the model elements found in all of the libraries of all @@ -982,7 +982,7 @@ class PackageGraph with CommentReferable, Nameable { } class ConstructedModelElementsKey { - final Element2 element; + final Element element; final Container? enclosingElement; ConstructedModelElementsKey(this.element, this.enclosingElement); @@ -999,7 +999,7 @@ class ConstructedModelElementsKey { } class InheritableElementsKey { - final Element2 element; + final Element element; final Library library; InheritableElementsKey(this.element, this.library); @@ -1020,7 +1020,7 @@ extension on Comment { for (var reference in references) { var commentReferable = reference.expression; String name; - Element2? staticElement; + Element? staticElement; if (commentReferable case PropertyAccessImpl(:var propertyName)) { var target = commentReferable.target; if (target is! PrefixedIdentifierImpl) continue; From 73689ae54a94bea81bbce269b589ee47702ecf02 Mon Sep 17 00:00:00 2001 From: Fedor Shcheglov Date: Fri, 15 Aug 2025 16:48:40 -0700 Subject: [PATCH 07/14] all --- lib/src/model/parameter.dart | 28 +++++++++++++-------------- lib/src/model/prefix.dart | 16 +++++++-------- lib/src/model/top_level_variable.dart | 4 ++-- lib/src/model/type_parameter.dart | 16 +++++++-------- lib/src/model/typedef.dart | 8 ++++---- lib/src/model_utils.dart | 10 +++++----- lib/src/mustachio/annotations.dart | 4 ++-- lib/src/package_meta.dart | 13 ++++++++----- lib/src/type_utils.dart | 10 +++++----- lib/src/warnings.dart | 8 ++++---- test/classes_test.dart | 2 +- test/end2end/model_test.dart | 12 ++++++------ 12 files changed, 67 insertions(+), 64 deletions(-) diff --git a/lib/src/model/parameter.dart b/lib/src/model/parameter.dart index 7b4d573281..5224111e7c 100644 --- a/lib/src/model/parameter.dart +++ b/lib/src/model/parameter.dart @@ -2,28 +2,28 @@ // 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:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; + // ignore: implementation_imports -import 'package:analyzer/src/dart/element/member.dart' show ParameterMember; +import 'package:analyzer/src/dart/element/member.dart' + show SubstitutedFormalParameterElementImpl; import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; import 'package:dartdoc/src/model/kind.dart'; import 'package:dartdoc/src/model/model.dart'; class Parameter extends ModelElement with HasNoPage { - @override final FormalParameterElement element; Parameter(this.element, super.library, super.packageGraph, - {ParameterMember? super.originalMember}); + {SubstitutedFormalParameterElementImpl? super.originalMember}); - String? get defaultValue => - hasDefaultValue ? element.defaultValueCode : null; + String? get defaultValue => hasDefaultValue ? element.defaultValueCode : null; @override ModelElement? get enclosingElement { - final enclosingElement = element.enclosingElement2; + final enclosingElement = element.enclosingElement; return enclosingElement == null ? null : getModelFor(enclosingElement, library); @@ -39,7 +39,7 @@ class Parameter extends ModelElement with HasNoPage { @override String get htmlId { - final enclosingElement = element.enclosingElement2; + final enclosingElement = element.enclosingElement; if (enclosingElement == null) { return 'param-$name'; } @@ -47,13 +47,13 @@ class Parameter extends ModelElement with HasNoPage { if (enclosingName == 'new') { enclosingName = ''; } - if (enclosingElement is GenericFunctionTypeElement2) { + if (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 (Element2 e = enclosingElement; - e.enclosingElement2 != null; - e = e.enclosingElement2!) { + for (Element e = enclosingElement; + e.enclosingElement != null; + e = e.enclosingElement!) { enclosingName = e.lookupName; if (enclosingName != null && enclosingName.isNotEmpty) break; } @@ -101,8 +101,8 @@ class Parameter extends ModelElement with HasNoPage { } @override - ParameterMember? get originalMember => - super.originalMember as ParameterMember?; + SubstitutedFormalParameterElementImpl? get originalMember => + super.originalMember as SubstitutedFormalParameterElementImpl?; late final ElementType modelType = getTypeFor((originalMember ?? element).type, library); diff --git a/lib/src/model/prefix.dart b/lib/src/model/prefix.dart index c2faaa404b..0d19e3d4b9 100644 --- a/lib/src/model/prefix.dart +++ b/lib/src/model/prefix.dart @@ -2,22 +2,22 @@ // 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:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/scope.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; import 'package:dartdoc/src/model/kind.dart'; import 'package:dartdoc/src/model/model.dart'; -/// Represents a [PrefixElement2] for dartdoc. +/// Represents a [PrefixElement] for dartdoc. /// /// Like [Parameter], it doesn't have doc pages, but participates in lookups. /// Forwards to its referenced library if referred to directly. class Prefix extends ModelElement with HasNoPage { @override - final PrefixElement2 element; + final PrefixElement element; /// [library] is the library the prefix is defined in, not the [Library] - /// referred to by the [PrefixElement2]. + /// referred to by the [PrefixElement]. Prefix(this.element, super.library, super.packageGraph); @override @@ -28,13 +28,13 @@ class Prefix extends ModelElement with HasNoPage { late final Library associatedLibrary = getModelForElement(_importedLibraryElement) as Library; - LibraryElement2 get _importedLibraryElement { + LibraryElement get _importedLibraryElement { final importLists = - library.element.fragments.map((fragment) => fragment.libraryImports2); + library.element.fragments.map((fragment) => fragment.libraryImports); var libraryImport = importLists .expand((import) => import) - .firstWhere((i) => i.prefix2?.element == element); - var importedLibrary = libraryImport.importedLibrary2; + .firstWhere((i) => i.prefix?.element == element); + var importedLibrary = libraryImport.importedLibrary; if (importedLibrary == null) { var message = 'Unexpected null LibraryElement2 for imported library at ' '${library.element.firstFragment.source.uri}, at offset ' diff --git a/lib/src/model/top_level_variable.dart b/lib/src/model/top_level_variable.dart index 1863455c6f..60e69de4be 100644 --- a/lib/src/model/top_level_variable.dart +++ b/lib/src/model/top_level_variable.dart @@ -2,7 +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:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:dartdoc/src/model/attribute.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; import 'package:dartdoc/src/model/kind.dart'; @@ -13,7 +13,7 @@ class TopLevelVariable extends ModelElement with GetterSetterCombo, Categorization { @override - final TopLevelVariableElement2 element; + final TopLevelVariableElement element; @override final Accessor? getter; diff --git a/lib/src/model/type_parameter.dart b/lib/src/model/type_parameter.dart index 91a6cc9618..e320850e2c 100644 --- a/lib/src/model/type_parameter.dart +++ b/lib/src/model/type_parameter.dart @@ -2,7 +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:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; import 'package:dartdoc/src/model/kind.dart'; @@ -11,13 +11,13 @@ import 'package:dartdoc/src/model/model.dart'; class TypeParameter extends ModelElement with HasNoPage { @override - final TypeParameterElement2 element; + final TypeParameterElement element; TypeParameter(this.element, super.library, super.packageGraph); @override ModelElement get enclosingElement => - getModelFor(element.enclosingElement2!, library); + getModelFor(element.enclosingElement!, library); /// [TypeParameter]s don't have documentation pages, and don't link to the /// element on which they are declared. @@ -39,13 +39,13 @@ class TypeParameter extends ModelElement with HasNoPage { @override String get name => element.bound != null - ? '${element.name3} extends ${boundType!.nameWithGenerics}' - : element.name3!; + ? '${element.name} extends ${boundType!.nameWithGenerics}' + : element.name!; @override String get linkedName => element.bound != null - ? '${element.name3} extends ${boundType!.linkedName}' - : element.name3!; + ? '${element.name} extends ${boundType!.linkedName}' + : element.name!; @override late final Map referenceChildren = () { @@ -58,7 +58,7 @@ class TypeParameter extends ModelElement with HasNoPage { Iterable get referenceParents => [enclosingElement]; @override - String get referenceName => element.name3!; + String get referenceName => element.name!; } /// A mixin for [ModelElement]s which have type parameters. diff --git a/lib/src/model/typedef.dart b/lib/src/model/typedef.dart index b1395a0e77..6750547ed0 100644 --- a/lib/src/model/typedef.dart +++ b/lib/src/model/typedef.dart @@ -2,7 +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:analyzer/dart/element/element2.dart'; +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/comment_referable.dart'; @@ -13,7 +13,7 @@ abstract class Typedef extends ModelElement with TypeParameters, Categorization { @override - final TypeAliasElement2 element; + final TypeAliasElement element; Typedef(this.element, super.library, super.packageGraph); @@ -62,7 +62,7 @@ abstract class Typedef extends ModelElement Kind get kind => Kind.typedef; @override - List get typeParameters => element.typeParameters2 + List get typeParameters => element.typeParameters .map((f) => getModelFor(f, library) as TypeParameter) .toList(growable: false); @@ -130,7 +130,7 @@ class FunctionTypedef extends Typedef { 'Expected callable but: ${element.runtimeType} is FunctionTypedElement ' '|| (${element.runtimeType} is TypeAliasElement && ' '${element.aliasedType.runtimeType} is FunctionType) is not true for ' - '"${element.name3}" in "${element.library2}"'); + '"${element.name}" in "${element.library}"'); } @override diff --git a/lib/src/model_utils.dart b/lib/src/model_utils.dart index b772064bc9..e770369b7f 100644 --- a/lib/src/model_utils.dart +++ b/lib/src/model_utils.dart @@ -4,7 +4,7 @@ import 'dart:io' show Platform; -import 'package:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:dartdoc/src/failure.dart'; import 'package:dartdoc/src/model/model.dart'; import 'package:glob/glob.dart'; @@ -52,9 +52,9 @@ Iterable filterHasCanonical( return maybeHasCanonicalItems.where((me) => me.canonicalModelElement != null); } -extension ElementExtension on Element2 { +extension ElementExtension on Element { bool get hasPrivateName { - final name = name3; + final name = this.name; if (name == null) return false; if (name.startsWith('_')) { @@ -65,8 +65,8 @@ extension ElementExtension on Element2 { // GenericFunctionTypeElements have the name we care about in the enclosing // element. - if (self is GenericFunctionTypeElement2) { - var enclosingElementName = self.enclosingElement2?.name3; + if (self is GenericFunctionTypeElement) { + var enclosingElementName = self.enclosingElement?.name; if (enclosingElementName != null && enclosingElementName.startsWith('_')) { return true; diff --git a/lib/src/mustachio/annotations.dart b/lib/src/mustachio/annotations.dart index f2857a31e2..dc00aae5d2 100644 --- a/lib/src/mustachio/annotations.dart +++ b/lib/src/mustachio/annotations.dart @@ -5,7 +5,7 @@ // See the Mustachio README at tool/mustachio/README.md for high-level // documentation. -import 'package:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:meta/meta.dart'; @@ -89,5 +89,5 @@ class RendererSpec { this.standardHtmlTemplate, ); - InterfaceElement2 get contextElement => contextType.element3; + InterfaceElement get contextElement => contextType.element; } diff --git a/lib/src/package_meta.dart b/lib/src/package_meta.dart index 220e1d363c..65721e8f97 100644 --- a/lib/src/package_meta.dart +++ b/lib/src/package_meta.dart @@ -4,9 +4,10 @@ import 'dart:io' show Platform; -import 'package:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/file_system/file_system.dart'; import 'package:analyzer/file_system/physical_file_system.dart'; + // ignore: implementation_imports import 'package:analyzer/src/generated/sdk.dart' show DartSdk; import 'package:dartdoc/src/failure.dart'; @@ -49,13 +50,13 @@ final PackageMetaProvider pubPackageMetaProvider = PackageMetaProvider( /// Sets the supported way of constructing [PackageMeta] objects. /// /// These objects can be constructed from a filename, a directory -/// or a [LibraryElement2]. We allow different dartdoc implementations to +/// or a [LibraryElement]. We allow different dartdoc implementations to /// provide their own [PackageMeta] types. /// /// By using a different provider, these implementations can control how /// [PackageMeta] objects are built. class PackageMetaProvider { - final PackageMeta? Function(LibraryElement2, String, ResourceProvider) + final PackageMeta? Function(LibraryElement, String, ResourceProvider) _fromElement; final PackageMeta? Function(String, ResourceProvider) _fromFilename; final PackageMeta? Function(Folder, ResourceProvider) _fromDir; @@ -75,9 +76,11 @@ class PackageMetaProvider { this.defaultSdk, }); - PackageMeta? fromElement(LibraryElement2 library, String s) => + PackageMeta? fromElement(LibraryElement library, String s) => _fromElement(library, s, resourceProvider); + PackageMeta? fromFilename(String s) => _fromFilename(s, resourceProvider); + PackageMeta? fromDir(Folder dir) => _fromDir(dir, resourceProvider); } @@ -183,7 +186,7 @@ abstract class PubPackageMeta extends PackageMeta { } /// Use this instead of [fromDir] where possible. - static PackageMeta? fromElement(LibraryElement2 libraryElement, String sdkDir, + static PackageMeta? fromElement(LibraryElement libraryElement, String sdkDir, ResourceProvider resourceProvider) { if (libraryElement.isInSdk) { return PubPackageMeta.fromDir( diff --git a/lib/src/type_utils.dart b/lib/src/type_utils.dart index ae706b3e2b..3b3d158cb2 100644 --- a/lib/src/type_utils.dart +++ b/lib/src/type_utils.dart @@ -2,7 +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:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/type.dart'; extension DartTypeExtension on DartType { @@ -11,12 +11,12 @@ extension DartTypeExtension on DartType { /// /// For example, the documentable element of [DynamicType] is `null`, as there /// is no documentation for `dynamic` which we can link to. - TypeDefiningElement2? get documentableElement2 { + TypeDefiningElement? get documentableElement2 { final self = this; return switch (self) { - InterfaceType() => self.element3, - NeverType() => self.element3 as TypeDefiningElement2, - TypeParameterType() => self.element3, + InterfaceType() => self.element, + NeverType() => self.element as TypeDefiningElement, + TypeParameterType() => self.element, _ => null }; } diff --git a/lib/src/warnings.dart b/lib/src/warnings.dart index 2a02f55eaf..662e1516d0 100644 --- a/lib/src/warnings.dart +++ b/lib/src/warnings.dart @@ -5,7 +5,7 @@ import 'dart:io'; import 'dart:math' as math; -import 'package:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/file_system/file_system.dart'; import 'package:collection/collection.dart'; import 'package:dartdoc/src/dartdoc_options.dart'; @@ -95,7 +95,7 @@ List> createPackageWarningOptions( /// Something that package warnings can be reported on. Optionally associated /// with an analyzer [element]. mixin Warnable implements CommentReferable, Documentable, Locatable { - Element2? get element; + Element? get element; void warn( PackageWarning kind, { @@ -462,7 +462,7 @@ class PackageWarningOptions { } class PackageWarningCounter { - final Map>> _countedWarnings = {}; + final Map>> _countedWarnings = {}; final _items = []; final _displayedWarningCounts = {}; final PackageGraph packageGraph; @@ -479,7 +479,7 @@ class PackageWarningCounter { /// An unmodifiable map view of all counted warnings related by their element, /// warning type, and message. - UnmodifiableMapView>> + UnmodifiableMapView>> get countedWarnings => UnmodifiableMapView(_countedWarnings); PackageWarningCounter(this.packageGraph); diff --git a/test/classes_test.dart b/test/classes_test.dart index e22977d6ca..b86bbed31b 100644 --- a/test/classes_test.dart +++ b/test/classes_test.dart @@ -224,7 +224,7 @@ abstract class E = C with _D; var indexAssign = library.classes.named('E').inheritedOperators.named('operator []='); - expect(indexAssign.element.enclosingElement2!.name3, '_D'); + expect(indexAssign.element.enclosingElement!.name, '_D'); expect(indexAssign.canonicalEnclosingContainer!.name, 'E'); expect(indexAssign.canonicalModelElement!.enclosingElement!.name, 'E'); } diff --git a/test/end2end/model_test.dart b/test/end2end/model_test.dart index 917a1932e9..4f6fe4034f 100644 --- a/test/end2end/model_test.dart +++ b/test/end2end/model_test.dart @@ -913,21 +913,21 @@ void main() async { test('can import other libraries with unusual URIs', () { final importLists = fakeLibrary.element.fragments - .map((fragment) => fragment.libraryImports2); + .map((fragment) => fragment.libraryImports); final exportLists = fakeLibrary.element.fragments - .map((fragment) => fragment.libraryExports2); + .map((fragment) => fragment.libraryExports); final fakeLibraryImportedExported = { - for (final l in { + for (final l in { ...importLists .expand((imports) => imports) .map((import) => import.uri) .whereType() - .map((uri) => uri.library2), + .map((uri) => uri.library), ...exportLists .expand((exports) => exports) .map((export) => export.uri) .whereType() - .map((uri) => uri.library2) + .map((uri) => uri.library) }) packageGraph.getModelForElement(l) as Library }; @@ -3450,7 +3450,7 @@ String? topLevelFunction(int param1, bool param2, Cool coolBeans, test('inheritance of docs from SDK works for getter/setter combos', () { expect( ExtraSpecialListLength - .getter!.documentationFrom.first.element.library2!.name3, + .getter!.documentationFrom.first.element.library!.name, equals('dart.core')); expect(ExtraSpecialListLength.oneLineDoc == '', isFalse); }); From 30d88a0c7b93c13edbc82677bc88b754fcecd0a9 Mon Sep 17 00:00:00 2001 From: Fedor Shcheglov Date: Fri, 15 Aug 2025 17:07:15 -0700 Subject: [PATCH 08/14] Migrate resourceProvider.pathContext --- pubspec.yaml | 1 + test/html_generator_test.dart | 8 +++- test/libraries_test.dart | 9 ++-- .../runtime_renderer_render_test.dart | 6 ++- test/src/test_descriptor_utils.dart | 41 ++++++++++--------- test/src/utils.dart | 9 ++-- 6 files changed, 43 insertions(+), 31 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index 5f4a7978f0..de9f17383e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -23,6 +23,7 @@ dependencies: yaml: ^3.1.2 dev_dependencies: + analyzer_testing: ^0.1.2 async: ^2.11.0 dart_style: ^3.0.0 lints: ">=5.0.0 <7.0.0" diff --git a/test/html_generator_test.dart b/test/html_generator_test.dart index a2ca5722b0..8983c99e0b 100644 --- a/test/html_generator_test.dart +++ b/test/html_generator_test.dart @@ -4,6 +4,7 @@ import 'package:analyzer/file_system/file_system.dart'; import 'package:analyzer/file_system/memory_file_system.dart'; +import 'package:analyzer_testing/utilities/extensions/resource_provider.dart'; import 'package:dartdoc/src/dartdoc.dart' show DartdocFileWriter; import 'package:dartdoc/src/dartdoc_options.dart'; import 'package:dartdoc/src/generator/generator.dart'; @@ -69,8 +70,8 @@ void main() { HtmlGeneratorBackend(options, templates, writer, resourceProvider)); }); - File getConvertedFile(String filePath) => - resourceProvider.getFile(resourceProvider.convertPath(filePath)); + File getConvertedFile(String filePath) => resourceProvider.getFile( + ResourceProviderExtension(resourceProvider).convertPath(filePath)); tearDown(clearPackageMetaCache); @@ -126,11 +127,14 @@ const Matcher doesExist = _DoesExist(); class _DoesExist extends Matcher { const _DoesExist(); + @override bool matches(Object? item, Map matchState) => (item as Resource).exists; + @override Description describe(Description description) => description.add('exists'); + @override Description describeMismatch(Object? item, Description mismatchDescription, Map matchState, bool verbose) { diff --git a/test/libraries_test.dart b/test/libraries_test.dart index 25be790583..1364d3d54a 100644 --- a/test/libraries_test.dart +++ b/test/libraries_test.dart @@ -3,6 +3,7 @@ // BSD-style license that can be found in the LICENSE file. import 'package:analyzer/file_system/memory_file_system.dart'; +import 'package:analyzer_testing/utilities/extensions/resource_provider.dart'; import 'package:dartdoc/src/model/model.dart'; import 'package:test/test.dart'; import 'package:test_reflective_loader/test_reflective_loader.dart'; @@ -130,8 +131,10 @@ A doc comment. packageMetaProvider, packageConfigProvider, ); - final daName = resourceProvider.convertPath('d/a'); - final eaName = resourceProvider.convertPath('e/a'); + final daName = + ResourceProviderExtension(resourceProvider).convertPath('d/a'); + final eaName = + ResourceProviderExtension(resourceProvider).convertPath('e/a'); final daLibrary = packageGraph.libraries.displayNamed(daName); final eaLibrary = packageGraph.libraries.displayNamed(eaName); final bLibrary = packageGraph.libraries.displayNamed('b'); @@ -257,7 +260,7 @@ class LibrariesInAdditionalPackageTest extends DartdocTestBase { return bootPackageFromFiles( [ d.file('lib/lib1.dart', "import 'package:two/lib2.dart';"), - d.dir(resourceProvider.convertPath('vendor/two'), [ + d.dir(ResourceProviderExtension(resourceProvider).convertPath('vendor/two'), [ d.file('pubspec.yaml', ''' name: two version: 0.0.1 diff --git a/test/mustachio/runtime_renderer_render_test.dart b/test/mustachio/runtime_renderer_render_test.dart index 8f2db89f54..a70c8e758c 100644 --- a/test/mustachio/runtime_renderer_render_test.dart +++ b/test/mustachio/runtime_renderer_render_test.dart @@ -7,6 +7,7 @@ library; import 'package:analyzer/file_system/file_system.dart'; import 'package:analyzer/file_system/memory_file_system.dart'; +import 'package:analyzer_testing/utilities/extensions/resource_provider.dart'; import 'package:dartdoc/src/mustachio/renderer_base.dart'; import 'package:path/path.dart' as path show Context; import 'package:test/test.dart'; @@ -19,8 +20,9 @@ void main() { late path.Context pathContext; - File getFile(String path) => resourceProvider - .getFile(pathContext.canonicalize(resourceProvider.convertPath(path))); + File getFile(String path) => + resourceProvider.getFile(pathContext.canonicalize( + ResourceProviderExtension(resourceProvider).convertPath(path))); setUp(() { resourceProvider = MemoryResourceProvider(); diff --git a/test/src/test_descriptor_utils.dart b/test/src/test_descriptor_utils.dart index 0a71b65c6a..db17fbb64b 100644 --- a/test/src/test_descriptor_utils.dart +++ b/test/src/test_descriptor_utils.dart @@ -5,6 +5,7 @@ import 'dart:convert'; import 'package:analyzer/file_system/memory_file_system.dart'; +import 'package:analyzer_testing/utilities/extensions/resource_provider.dart'; import 'package:test_descriptor/test_descriptor.dart' as d; import 'package:yaml/yaml.dart' as yaml; @@ -109,28 +110,11 @@ Future createPackage( } } -extension DescriptorExtensions on d.Descriptor { - /// Creates this [d.Descriptor] in the [MemoryResourceProvider]. - /// - /// For a [d.DirectoryDescriptor], the subtree will be created. For a - /// [d.FileDescriptor], the file contents will be written. - Future createInMemory(MemoryResourceProvider resourceProvider, - [String? parent]) { - var self = this; - return switch (self) { - d.DirectoryDescriptor() => self.createInMemory(resourceProvider, parent), - d.FileDescriptor() => self.createInMemory(resourceProvider, parent!), - _ => throw StateError( - '$runtimeType is not a DirectoryDescriptor, nor a FileDescriptor!') - }; - } -} - extension on d.DirectoryDescriptor { Future createInMemory(MemoryResourceProvider resourceProvider, [String? parent]) async { - parent ??= resourceProvider.pathContext - .canonicalize(resourceProvider.convertPath('/temp')); + parent ??= resourceProvider.pathContext.canonicalize( + ResourceProviderExtension(resourceProvider).convertPath('/temp')); resourceProvider.newFolder(parent).create(); var fullPath = resourceProvider.pathContext.join(parent, name); resourceProvider.newFolder(fullPath).create(); @@ -145,9 +129,26 @@ extension on d.FileDescriptor { Future createInMemory( MemoryResourceProvider resourceProvider, String parent) async { var content = await readAsBytes().transform(utf8.decoder).join(''); - var fullPath = resourceProvider + var fullPath = ResourceProviderExtension(resourceProvider) .convertPath(resourceProvider.pathContext.join(parent, name)); resourceProvider.newFile(fullPath, content); return fullPath; } } + +extension DescriptorExtensions on d.Descriptor { + /// Creates this [d.Descriptor] in the [MemoryResourceProvider]. + /// + /// For a [d.DirectoryDescriptor], the subtree will be created. For a + /// [d.FileDescriptor], the file contents will be written. + Future createInMemory(MemoryResourceProvider resourceProvider, + [String? parent]) { + var self = this; + return switch (self) { + d.DirectoryDescriptor() => self.createInMemory(resourceProvider, parent), + d.FileDescriptor() => self.createInMemory(resourceProvider, parent!), + _ => throw StateError( + '$runtimeType is not a DirectoryDescriptor, nor a FileDescriptor!') + }; + } +} diff --git a/test/src/utils.dart b/test/src/utils.dart index cbac578590..36ece44dbf 100644 --- a/test/src/utils.dart +++ b/test/src/utils.dart @@ -9,6 +9,7 @@ import 'package:analyzer/file_system/memory_file_system.dart'; import 'package:analyzer/file_system/physical_file_system.dart'; import 'package:analyzer/src/dart/sdk/sdk.dart'; import 'package:analyzer/src/test_utilities/mock_sdk.dart'; +import 'package:analyzer_testing/utilities/extensions/resource_provider.dart'; import 'package:dartdoc/src/dartdoc_options.dart'; import 'package:dartdoc/src/failure.dart'; import 'package:dartdoc/src/generator/generator.dart'; @@ -136,8 +137,8 @@ FakePackageConfigProvider getTestPackageConfigProvider(String sdkPath) { PackageMetaProvider get testPackageMetaProvider { var resourceProvider = MemoryResourceProvider(); final sdkRoot = resourceProvider.getFolder( - resourceProvider.pathContext - .canonicalize(resourceProvider.convertPath('/sdk')), + resourceProvider.pathContext.canonicalize( + ResourceProviderExtension(resourceProvider).convertPath('/sdk')), ); createMockSdk( resourceProvider: resourceProvider, @@ -190,8 +191,8 @@ version: 0.0.1 homepage: https://github.com/dart-lang '''; var pathContext = resourceProvider.pathContext; - var projectsFolder = resourceProvider.getFolder( - pathContext.canonicalize(resourceProvider.convertPath('/projects'))); + var projectsFolder = resourceProvider.getFolder(pathContext.canonicalize( + ResourceProviderExtension(resourceProvider).convertPath('/projects'))); var projectFolder = projectsFolder.getChildAssumingFolder(packageName) ..create(); var projectRoot = projectFolder.path; From a052c70ae71aa051a8763b1bd7f978cc95602833 Mon Sep 17 00:00:00 2001 From: Fedor Shcheglov Date: Fri, 15 Aug 2025 17:15:57 -0700 Subject: [PATCH 09/14] regenerate --- .../templates.runtime_renderers.dart | 475 ++++++++---------- 1 file changed, 196 insertions(+), 279 deletions(-) diff --git a/lib/src/generator/templates.runtime_renderers.dart b/lib/src/generator/templates.runtime_renderers.dart index 03d0ada28e..329f6ed402 100644 --- a/lib/src/generator/templates.runtime_renderers.dart +++ b/lib/src/generator/templates.runtime_renderers.dart @@ -218,7 +218,7 @@ class _Renderer_Accessor extends RendererBase { self.renderSimpleVariable( c, remainingNames, - 'PropertyAccessorElement2', + 'PropertyAccessorElement', ), isNullValue: (CT_ c) => false, @@ -236,7 +236,7 @@ class _Renderer_Accessor extends RendererBase { r.template, sink, parent: r, - getters: _invisibleGetters['PropertyAccessorElement2']!, + getters: _invisibleGetters['PropertyAccessorElement']!, ); }, ), @@ -484,7 +484,7 @@ class _Renderer_Accessor extends RendererBase { self.renderSimpleVariable( c, remainingNames, - 'ExecutableMember', + 'SubstitutedExecutableElementImpl', ), isNullValue: (CT_ c) => c.originalMember == null, @@ -502,7 +502,8 @@ class _Renderer_Accessor extends RendererBase { r.template, sink, parent: r, - getters: _invisibleGetters['ExecutableMember']!, + getters: + _invisibleGetters['SubstitutedExecutableElementImpl']!, ); }, ), @@ -1652,11 +1653,7 @@ class _Renderer_Category extends RendererBase { getValue: (CT_ c) => c.element, renderVariable: (CT_ c, Property self, List remainingNames) => - self.renderSimpleVariable( - c, - remainingNames, - 'Element2', - ), + self.renderSimpleVariable(c, remainingNames, 'Element'), isNullValue: (CT_ c) => c.element == null, @@ -1673,7 +1670,7 @@ class _Renderer_Category extends RendererBase { r.template, sink, parent: r, - getters: _invisibleGetters['Element2']!, + getters: _invisibleGetters['Element']!, ); }, ), @@ -2677,7 +2674,7 @@ class _Renderer_Class extends RendererBase { self.renderSimpleVariable( c, remainingNames, - 'ClassElement2', + 'ClassElement', ), isNullValue: (CT_ c) => false, @@ -2695,7 +2692,7 @@ class _Renderer_Class extends RendererBase { r.template, sink, parent: r, - getters: _invisibleGetters['ClassElement2']!, + getters: _invisibleGetters['ClassElement']!, ); }, ), @@ -3441,7 +3438,7 @@ class _Renderer_Constructor extends RendererBase { self.renderSimpleVariable( c, remainingNames, - 'ConstructorElement2', + 'ConstructorElement', ), isNullValue: (CT_ c) => false, @@ -3459,7 +3456,7 @@ class _Renderer_Constructor extends RendererBase { r.template, sink, parent: r, - getters: _invisibleGetters['ConstructorElement2']!, + getters: _invisibleGetters['ConstructorElement']!, ); }, ), @@ -4612,11 +4609,7 @@ class _Renderer_Container extends RendererBase { getValue: (CT_ c) => c.element, renderVariable: (CT_ c, Property self, List remainingNames) => - self.renderSimpleVariable( - c, - remainingNames, - 'Element2', - ), + self.renderSimpleVariable(c, remainingNames, 'Element'), isNullValue: (CT_ c) => false, @@ -4633,7 +4626,7 @@ class _Renderer_Container extends RendererBase { r.template, sink, parent: r, - getters: _invisibleGetters['Element2']!, + getters: _invisibleGetters['Element']!, ); }, ), @@ -6511,11 +6504,7 @@ class _Renderer_DocumentationComment getValue: (CT_ c) => c.element, renderVariable: (CT_ c, Property self, List remainingNames) => - self.renderSimpleVariable( - c, - remainingNames, - 'Element2', - ), + self.renderSimpleVariable(c, remainingNames, 'Element'), isNullValue: (CT_ c) => false, @@ -6532,7 +6521,7 @@ class _Renderer_DocumentationComment r.template, sink, parent: r, - getters: _invisibleGetters['Element2']!, + getters: _invisibleGetters['Element']!, ); }, ), @@ -7128,7 +7117,7 @@ class _Renderer_Enum extends RendererBase { self.renderSimpleVariable( c, remainingNames, - 'EnumElement2', + 'EnumElement', ), isNullValue: (CT_ c) => false, @@ -7146,7 +7135,7 @@ class _Renderer_Enum extends RendererBase { r.template, sink, parent: r, - getters: _invisibleGetters['EnumElement2']!, + getters: _invisibleGetters['EnumElement']!, ); }, ), @@ -7654,7 +7643,7 @@ class _Renderer_Extension extends RendererBase { self.renderSimpleVariable( c, remainingNames, - 'ExtensionElement2', + 'ExtensionElement', ), isNullValue: (CT_ c) => false, @@ -7672,7 +7661,7 @@ class _Renderer_Extension extends RendererBase { r.template, sink, parent: r, - getters: _invisibleGetters['ExtensionElement2']!, + getters: _invisibleGetters['ExtensionElement']!, ); }, ), @@ -8371,7 +8360,7 @@ class _Renderer_ExtensionType extends RendererBase { self.renderSimpleVariable( c, remainingNames, - 'ExtensionTypeElement2', + 'ExtensionTypeElement', ), isNullValue: (CT_ c) => false, @@ -8389,7 +8378,7 @@ class _Renderer_ExtensionType extends RendererBase { r.template, sink, parent: r, - getters: _invisibleGetters['ExtensionTypeElement2']!, + getters: _invisibleGetters['ExtensionTypeElement']!, ); }, ), @@ -9423,7 +9412,7 @@ class _Renderer_Field extends RendererBase { self.renderSimpleVariable( c, remainingNames, - 'FieldElement2', + 'FieldElement', ), isNullValue: (CT_ c) => false, @@ -9441,7 +9430,7 @@ class _Renderer_Field extends RendererBase { r.template, sink, parent: r, - getters: _invisibleGetters['FieldElement2']!, + getters: _invisibleGetters['FieldElement']!, ); }, ), @@ -11678,7 +11667,7 @@ class _Renderer_InheritingContainer extends RendererBase { self.renderSimpleVariable( c, remainingNames, - 'InterfaceElement2', + 'InterfaceElement', ), isNullValue: (CT_ c) => false, @@ -11696,7 +11685,7 @@ class _Renderer_InheritingContainer extends RendererBase { r.template, sink, parent: r, - getters: _invisibleGetters['InterfaceElement2']!, + getters: _invisibleGetters['InterfaceElement']!, ); }, ), @@ -13095,7 +13084,7 @@ class _Renderer_Library extends RendererBase { self.renderSimpleVariable( c, remainingNames, - 'LibraryElement2', + 'LibraryElement', ), isNullValue: (CT_ c) => false, @@ -13113,7 +13102,7 @@ class _Renderer_Library extends RendererBase { r.template, sink, parent: r, - getters: _invisibleGetters['LibraryElement2']!, + getters: _invisibleGetters['LibraryElement']!, ); }, ), @@ -14879,7 +14868,7 @@ class _Renderer_Method extends RendererBase { self.renderSimpleVariable( c, remainingNames, - 'MethodElement2', + 'MethodElement', ), isNullValue: (CT_ c) => false, @@ -14897,7 +14886,7 @@ class _Renderer_Method extends RendererBase { r.template, sink, parent: r, - getters: _invisibleGetters['MethodElement2']!, + getters: _invisibleGetters['MethodElement']!, ); }, ), @@ -15142,7 +15131,7 @@ class _Renderer_Method extends RendererBase { self.renderSimpleVariable( c, remainingNames, - 'ExecutableMember', + 'SubstitutedExecutableElementImpl', ), isNullValue: (CT_ c) => c.originalMember == null, @@ -15160,7 +15149,8 @@ class _Renderer_Method extends RendererBase { r.template, sink, parent: r, - getters: _invisibleGetters['ExecutableMember']!, + getters: + _invisibleGetters['SubstitutedExecutableElementImpl']!, ); }, ), @@ -15737,7 +15727,7 @@ class _Renderer_Mixin extends RendererBase { self.renderSimpleVariable( c, remainingNames, - 'MixinElement2', + 'MixinElement', ), isNullValue: (CT_ c) => false, @@ -15755,7 +15745,7 @@ class _Renderer_Mixin extends RendererBase { r.template, sink, parent: r, - getters: _invisibleGetters['MixinElement2']!, + getters: _invisibleGetters['MixinElement']!, ); }, ), @@ -16486,11 +16476,7 @@ class _Renderer_ModelElement extends RendererBase { getValue: (CT_ c) => c.element, renderVariable: (CT_ c, Property self, List remainingNames) => - self.renderSimpleVariable( - c, - remainingNames, - 'Element2', - ), + self.renderSimpleVariable(c, remainingNames, 'Element'), isNullValue: (CT_ c) => false, @@ -16507,7 +16493,7 @@ class _Renderer_ModelElement extends RendererBase { r.template, sink, parent: r, - getters: _invisibleGetters['Element2']!, + getters: _invisibleGetters['Element']!, ); }, ), @@ -17210,7 +17196,11 @@ class _Renderer_ModelElement extends RendererBase { getValue: (CT_ c) => c.originalMember, renderVariable: (CT_ c, Property self, List remainingNames) => - self.renderSimpleVariable(c, remainingNames, 'Member'), + self.renderSimpleVariable( + c, + remainingNames, + 'SubstitutedElementImpl', + ), isNullValue: (CT_ c) => c.originalMember == null, @@ -17227,7 +17217,7 @@ class _Renderer_ModelElement extends RendererBase { r.template, sink, parent: r, - getters: _invisibleGetters['Member']!, + getters: _invisibleGetters['SubstitutedElementImpl']!, ); }, ), @@ -17749,7 +17739,7 @@ class _Renderer_ModelFunctionTyped extends RendererBase { self.renderSimpleVariable( c, remainingNames, - 'FunctionTypedElement2', + 'FunctionTypedElement', ), isNullValue: (CT_ c) => false, @@ -17767,7 +17757,7 @@ class _Renderer_ModelFunctionTyped extends RendererBase { r.template, sink, parent: r, - getters: _invisibleGetters['FunctionTypedElement2']!, + getters: _invisibleGetters['FunctionTypedElement']!, ); }, ), @@ -19041,11 +19031,7 @@ class _Renderer_Package extends RendererBase { getValue: (CT_ c) => c.element, renderVariable: (CT_ c, Property self, List remainingNames) => - self.renderSimpleVariable( - c, - remainingNames, - 'Element2', - ), + self.renderSimpleVariable(c, remainingNames, 'Element'), isNullValue: (CT_ c) => c.element == null, @@ -19062,7 +19048,7 @@ class _Renderer_Package extends RendererBase { r.template, sink, parent: r, - getters: _invisibleGetters['Element2']!, + getters: _invisibleGetters['Element']!, ); }, ), @@ -20157,13 +20143,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 renderError(PackageTemplateData context, Template template) { +String renderSearchPage(PackageTemplateData context, Template template) { var buffer = StringBuffer(); _render_PackageTemplateData(context, template.ast, template, buffer); return buffer.toString(); @@ -20491,7 +20477,7 @@ class _Renderer_Parameter extends RendererBase { self.renderSimpleVariable( c, remainingNames, - 'ParameterMember', + 'SubstitutedFormalParameterElementImpl', ), isNullValue: (CT_ c) => c.originalMember == null, @@ -20509,7 +20495,8 @@ class _Renderer_Parameter extends RendererBase { r.template, sink, parent: r, - getters: _invisibleGetters['ParameterMember']!, + getters: + _invisibleGetters['SubstitutedFormalParameterElementImpl']!, ); }, ), @@ -23602,7 +23589,7 @@ class _Renderer_TopLevelVariable extends RendererBase { self.renderSimpleVariable( c, remainingNames, - 'TopLevelVariableElement2', + 'TopLevelVariableElement', ), isNullValue: (CT_ c) => false, @@ -23620,7 +23607,7 @@ class _Renderer_TopLevelVariable extends RendererBase { r.template, sink, parent: r, - getters: _invisibleGetters['TopLevelVariableElement2']!, + getters: _invisibleGetters['TopLevelVariableElement']!, ); }, ), @@ -24033,7 +24020,7 @@ class _Renderer_TypeParameter extends RendererBase { self.renderSimpleVariable( c, remainingNames, - 'TypeParameterElement2', + 'TypeParameterElement', ), isNullValue: (CT_ c) => false, @@ -24051,7 +24038,7 @@ class _Renderer_TypeParameter extends RendererBase { r.template, sink, parent: r, - getters: _invisibleGetters['TypeParameterElement2']!, + getters: _invisibleGetters['TypeParameterElement']!, ); }, ), @@ -24694,7 +24681,7 @@ class _Renderer_Typedef extends RendererBase { self.renderSimpleVariable( c, remainingNames, - 'TypeAliasElement2', + 'TypeAliasElement', ), isNullValue: (CT_ c) => false, @@ -24712,7 +24699,7 @@ class _Renderer_Typedef extends RendererBase { r.template, sink, parent: r, - getters: _invisibleGetters['TypeAliasElement2']!, + getters: _invisibleGetters['TypeAliasElement']!, ); }, ), @@ -25378,11 +25365,7 @@ class _Renderer_Warnable extends RendererBase { getValue: (CT_ c) => c.element, renderVariable: (CT_ c, Property self, List remainingNames) => - self.renderSimpleVariable( - c, - remainingNames, - 'Element2', - ), + self.renderSimpleVariable(c, remainingNames, 'Element'), isNullValue: (CT_ c) => c.element == null, @@ -25399,7 +25382,7 @@ class _Renderer_Warnable extends RendererBase { r.template, sink, parent: r, - getters: _invisibleGetters['Element2']!, + getters: _invisibleGetters['Element']!, ); }, ), @@ -25440,7 +25423,7 @@ const _invisibleGetters = { 'lineNumber', 'runtimeType', }, - 'ClassElement2': { + 'ClassElement': { 'firstFragment', 'fragments', 'hasNonFinalField', @@ -25451,8 +25434,11 @@ const _invisibleGetters = { 'isDartCoreEnum', 'isDartCoreObject', 'isExhaustive', + 'isExtendableOutside', 'isFinal', + 'isImplementableOutside', 'isInterface', + 'isMixableOutside', 'isMixinApplication', 'isMixinClass', 'isSealed', @@ -25475,8 +25461,9 @@ const _invisibleGetters = { 'hasPublicConstructors', 'publicConstructorsSorted', }, - 'ConstructorElement2': { + 'ConstructorElement': { 'baseElement', + 'enclosingElement', 'enclosingElement2', 'firstFragment', 'fragments', @@ -25485,10 +25472,13 @@ const _invisibleGetters = { 'isDefaultConstructor', 'isFactory', 'isGenerative', + 'name', 'name3', + 'redirectedConstructor', 'redirectedConstructor2', 'returnType', 'runtimeType', + 'superConstructor', 'superConstructor2', }, 'ContainerModifier': { @@ -25582,10 +25572,13 @@ const _invisibleGetters = { 'qualifiedName', 'sourceFileName', }, - 'Element2': { + 'Element': { 'baseElement', + 'children', 'children2', 'displayName', + 'documentationComment', + 'enclosingElement', 'enclosingElement2', 'firstFragment', 'fragments', @@ -25595,116 +25588,47 @@ const _invisibleGetters = { 'isPublic', 'isSynthetic', 'kind', + 'library', 'library2', 'lookupName', + 'metadata', + 'name', 'name3', + 'nonSynthetic', 'nonSynthetic2', 'runtimeType', 'session', 'sinceSdkVersion', }, - 'EnumElement2': { + 'EnumElement': { + 'constants', 'constants2', 'firstFragment', 'fragments', 'hashCode', 'runtimeType', }, - 'ExecutableMember': { - 'baseElement', - 'children', - 'children2', - 'context', - 'declaration', - 'displayName', - 'documentationComment', - 'enclosingElement2', - 'enclosingElement3', - 'formalParameters', - 'fragments', - 'hasAlwaysThrows', - 'hasDeprecated', - 'hasDoNotStore', - 'hasDoNotSubmit', - 'hasFactory', - 'hasImmutable', - 'hasImplicitReturnType', - 'hasInternal', - 'hasIsTest', - 'hasIsTestGroup', - 'hasJS', - 'hasLiteral', - 'hasMustBeConst', - 'hasMustBeOverridden', - 'hasMustCallSuper', - 'hasNonVirtual', - 'hasOptionalTypeArgs', - 'hasOverride', - 'hasProtected', - 'hasRedeclare', - 'hasReopen', - 'hasRequired', - 'hasSealed', - 'hasUseResult', - 'hasVisibleForOverriding', - 'hasVisibleForTemplate', - 'hasVisibleForTesting', - 'hasVisibleOutsideTemplate', - 'hashCode', - 'id', - 'isAbstract', - 'isAsynchronous', - 'isAugmentation', - 'isExtensionTypeMember', - 'isExternal', - 'isGenerator', - 'isOperator', - 'isPrivate', - 'isPublic', - 'isSimplyBounded', - 'isStatic', - 'isSynchronous', - 'isSynthetic', - 'kind', - 'library', - 'library2', - 'librarySource', - 'location', - 'metadata', - 'metadata2', - 'name', - 'nameLength', - 'nameOffset', - 'nonSynthetic', - 'nonSynthetic2', - 'parameters', - 'returnType', - 'runtimeType', - 'session', - 'sinceSdkVersion', - 'substitution', - 'type', - 'typeParameters', - 'typeParameters2', - }, - 'ExtensionElement2': { + 'ExtensionElement': { 'extendedType', 'firstFragment', 'fragments', 'hashCode', 'runtimeType', }, - 'ExtensionTypeElement2': { + 'ExtensionTypeElement': { 'firstFragment', 'fragments', 'hashCode', + 'primaryConstructor', 'primaryConstructor2', + 'representation', 'representation2', 'runtimeType', 'typeErasure', }, - 'FieldElement2': { + 'FieldElement': { 'baseElement', + 'enclosingElement', 'enclosingElement2', 'firstFragment', 'fragments', @@ -25737,25 +25661,22 @@ const _invisibleGetters = { 'isRequiredPositional', 'isSuperFormal', 'runtimeType', + 'typeParameters', 'typeParameters2', }, 'FunctionType': { 'element', + 'element3', 'formalParameters', 'hashCode', 'namedParameterTypes', 'normalParameterTypes', 'optionalParameterTypes', - 'parameters', - 'positionalParameterTypes', - 'requiredPositionalParameterCount', 'returnType', 'runtimeType', - 'sortedNamedParameters', - 'typeFormals', 'typeParameters', }, - 'FunctionTypedElement2': { + 'FunctionTypedElement': { 'firstFragment', 'formalParameters', 'fragments', @@ -25815,8 +25736,9 @@ const _invisibleGetters = { 'overriddenDepth', 'overriddenElement', }, - 'InterfaceElement2': { + 'InterfaceElement': { 'allSupertypes', + 'constructors', 'constructors2', 'firstFragment', 'fragments', @@ -25829,6 +25751,7 @@ const _invisibleGetters = { 'runtimeType', 'supertype', 'thisType', + 'unnamedConstructor', 'unnamedConstructor2', }, 'Iterable': { @@ -25843,11 +25766,13 @@ const _invisibleGetters = { 'single', }, 'Kind': {'hashCode', 'index', 'runtimeType'}, - 'LibraryElement2': { + 'LibraryElement': { 'classes', + 'entryPoint', 'entryPoint2', 'enums', 'exportNamespace', + 'exportedLibraries', 'exportedLibraries2', 'extensionTypes', 'extensions', @@ -25861,7 +25786,9 @@ const _invisibleGetters = { 'isDartCore', 'isInSdk', 'languageVersion', + 'library', 'library2', + 'loadLibraryFunction', 'loadLibraryFunction2', 'mixins', 'publicNamespace', @@ -25876,20 +25803,30 @@ const _invisibleGetters = { 'uri', }, 'LibraryFragment': { + 'accessibleExtensions', 'accessibleExtensions2', + 'classes', 'classes2', 'element', 'enclosingFragment', + 'enums', 'enums2', + 'extensionTypes', 'extensionTypes2', + 'extensions', 'extensions2', + 'functions', 'functions2', 'getters', 'hashCode', + 'importedLibraries', 'importedLibraries2', + 'libraryExports', 'libraryExports2', + 'libraryImports', 'libraryImports2', 'lineInfo', + 'mixins', 'mixins2', 'nextFragment', 'offset', @@ -25900,7 +25837,9 @@ const _invisibleGetters = { 'scope', 'setters', 'source', + 'topLevelVariables', 'topLevelVariables2', + 'typeAliases', 'typeAliases2', }, 'List': {'hashCode', 'length', 'reversed', 'runtimeType'}, @@ -25922,62 +25861,7 @@ const _invisibleGetters = { 'runtimeType', 'values', }, - 'Member': { - 'baseElement', - 'children', - 'context', - 'declaration', - 'displayName', - 'documentationComment', - 'enclosingElement3', - 'hasAlwaysThrows', - 'hasDeprecated', - 'hasDoNotStore', - 'hasDoNotSubmit', - 'hasFactory', - 'hasImmutable', - 'hasInternal', - 'hasIsTest', - 'hasIsTestGroup', - 'hasJS', - 'hasLiteral', - 'hasMustBeConst', - 'hasMustBeOverridden', - 'hasMustCallSuper', - 'hasNonVirtual', - 'hasOptionalTypeArgs', - 'hasOverride', - 'hasProtected', - 'hasRedeclare', - 'hasReopen', - 'hasRequired', - 'hasSealed', - 'hasUseResult', - 'hasVisibleForOverriding', - 'hasVisibleForTemplate', - 'hasVisibleForTesting', - 'hasVisibleOutsideTemplate', - 'hashCode', - 'id', - 'isPrivate', - 'isPublic', - 'isSynthetic', - 'kind', - 'library', - 'librarySource', - 'location', - 'metadata', - 'metadata2', - 'name', - 'nameLength', - 'nameOffset', - 'nonSynthetic', - 'runtimeType', - 'session', - 'sinceSdkVersion', - 'substitution', - }, - 'MethodElement2': { + 'MethodElement': { 'baseElement', 'firstFragment', 'fragments', @@ -25985,11 +25869,12 @@ const _invisibleGetters = { 'isOperator', 'runtimeType', }, - 'MixinElement2': { + 'MixinElement': { 'firstFragment', 'fragments', 'hashCode', 'isBase', + 'isImplementableOutside', 'runtimeType', 'superclassConstraints', }, @@ -26049,103 +25934,133 @@ const _invisibleGetters = { 'runtimeType', 'version', }, - 'ParameterMember': { + 'ParameterizedType': {'hashCode', 'runtimeType', 'typeArguments'}, + 'PropertyAccessorElement': { + 'baseElement', + 'enclosingElement', + 'enclosingElement2', + 'firstFragment', + 'fragments', + 'hashCode', + 'runtimeType', + 'variable', + 'variable3', + }, + 'Scope': {'hashCode', 'runtimeType'}, + 'SubstitutedElementImpl': { + 'baseElement', + 'displayName', + 'hashCode', + 'id', + 'isPrivate', + 'isPublic', + 'isSynthetic', + 'kind', + 'lookupName', + 'name', + 'name3', + 'nonSynthetic', + 'nonSynthetic2', + 'runtimeType', + 'session', + 'substitution', + }, + 'SubstitutedExecutableElementImpl': { + 'baseElement', + 'children', + 'children2', + 'displayName', + 'documentationComment', + 'enclosingElement', + 'enclosingElement2', + 'firstFragment', + 'formalParameters', + 'fragments', + 'hasImplicitReturnType', + 'hashCode', + 'id', + 'isAbstract', + 'isExtensionTypeMember', + 'isExternal', + 'isPrivate', + 'isPublic', + 'isSimplyBounded', + 'isStatic', + 'isSynthetic', + 'kind', + 'library', + 'library2', + 'lookupName', + 'metadata', + 'metadata2', + 'name', + 'name3', + 'nonSynthetic', + 'nonSynthetic2', + 'returnType', + 'runtimeType', + 'session', + 'substitution', + 'type', + 'typeParameters', + 'typeParameters2', + }, + 'SubstitutedFormalParameterElementImpl': { 'baseElement', 'children', 'children2', 'constantInitializer', - 'constantInitializer2', - 'context', - 'declaration', 'defaultValueCode', 'displayName', 'documentationComment', - 'element', + 'enclosingElement', 'enclosingElement2', - 'enclosingElement3', 'firstFragment', 'formalParameters', 'fragments', - 'hasAlwaysThrows', 'hasDefaultValue', - 'hasDeprecated', - 'hasDoNotStore', - 'hasDoNotSubmit', - 'hasFactory', - 'hasImmutable', 'hasImplicitType', - 'hasInternal', - 'hasIsTest', - 'hasIsTestGroup', - 'hasJS', - 'hasLiteral', - 'hasMustBeConst', - 'hasMustBeOverridden', - 'hasMustCallSuper', - 'hasNonVirtual', - 'hasOptionalTypeArgs', - 'hasOverride', - 'hasProtected', - 'hasRedeclare', - 'hasReopen', - 'hasRequired', - 'hasSealed', - 'hasUseResult', - 'hasVisibleForOverriding', - 'hasVisibleForTemplate', - 'hasVisibleForTesting', - 'hasVisibleOutsideTemplate', 'hashCode', 'id', 'isConst', - 'isConstantEvaluated', 'isCovariant', 'isFinal', 'isInitializingFormal', 'isLate', + 'isNamed', + 'isOptional', + 'isOptionalNamed', + 'isOptionalPositional', + 'isPositional', 'isPrivate', 'isPublic', + 'isRequired', + 'isRequiredNamed', + 'isRequiredPositional', 'isStatic', 'isSuperFormal', 'isSynthetic', 'kind', 'library', 'library2', - 'librarySource', - 'location', 'lookupName', 'metadata', 'metadata2', 'name', 'name3', - 'nameLength', - 'nameOffset', 'nameShared', 'nonSynthetic', 'nonSynthetic2', 'parameterKind', - 'parameters', 'runtimeType', 'session', 'sinceSdkVersion', - 'source', 'substitution', 'type', 'typeParameters', 'typeParameters2', 'typeShared', }, - 'ParameterizedType': {'hashCode', 'runtimeType', 'typeArguments'}, - 'PropertyAccessorElement2': { - 'baseElement', - 'enclosingElement2', - 'firstFragment', - 'fragments', - 'hashCode', - 'runtimeType', - 'variable3', - }, - 'Scope': {'hashCode', 'runtimeType'}, 'TemplateOptions': { 'customFooterContent', 'customHeaderContent', @@ -26165,7 +26080,7 @@ const _invisibleGetters = { 'isEntryPoint', 'runtimeType', }, - 'TopLevelVariableElement2': { + 'TopLevelVariableElement': { 'baseElement', 'firstFragment', 'fragments', @@ -26173,16 +26088,18 @@ const _invisibleGetters = { 'isExternal', 'runtimeType', }, - 'TypeAliasElement2': { + 'TypeAliasElement': { + 'aliasedElement', 'aliasedElement2', 'aliasedType', + 'enclosingElement', 'enclosingElement2', 'firstFragment', 'fragments', 'hashCode', 'runtimeType', }, - 'TypeParameterElement2': { + 'TypeParameterElement': { 'baseElement', 'bound', 'firstFragment', From 72a019411fde6a6bba942226011ec07f638f80ec Mon Sep 17 00:00:00 2001 From: Fedor Shcheglov Date: Fri, 15 Aug 2025 18:45:33 -0700 Subject: [PATCH 10/14] Skip top-merge created fields. --- lib/src/model/inheriting_container.dart | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/src/model/inheriting_container.dart b/lib/src/model/inheriting_container.dart index e4d4b2be20..ffc9bb727f 100644 --- a/lib/src/model/inheriting_container.dart +++ b/lib/src/model/inheriting_container.dart @@ -179,6 +179,17 @@ abstract class InheritingContainer extends Container { elements.firstWhereOrNull((e) => e is GetterElement); final setterElement = elements.firstWhereOrNull((e) => e is SetterElement); + + final isNullOrTopMergeGetter = getterElement == null || + getterElement.enclosingElement == element && + !element.getters.contains(getterElement); + final isNullOrTopMergeSetter = setterElement == null || + setterElement.enclosingElement == element && + !element.setters.contains(setterElement); + if (isNullOrTopMergeGetter && isNullOrTopMergeSetter) { + return; + } + fields.add(_createSingleField( getterElement, setterElement, inheritedAccessorElements)); }); From 99656458d2c3171b70e3d61dc2707e477bd053dd Mon Sep 17 00:00:00 2001 From: Fedor Shcheglov Date: Sat, 16 Aug 2025 11:21:17 -0700 Subject: [PATCH 11/14] Replace member.dart with API classes --- lib/src/model/accessor.dart | 10 +- lib/src/model/method.dart | 10 +- lib/src/model/model_element.dart | 865 +++++++++++++++---------------- lib/src/model/operator.dart | 12 +- lib/src/model/parameter.dart | 10 +- 5 files changed, 442 insertions(+), 465 deletions(-) diff --git a/lib/src/model/accessor.dart b/lib/src/model/accessor.dart index f2b5c7129a..b821f80a40 100644 --- a/lib/src/model/accessor.dart +++ b/lib/src/model/accessor.dart @@ -6,8 +6,6 @@ import 'dart:convert'; import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/source/line_info.dart'; -// ignore: implementation_imports -import 'package:analyzer/src/dart/element/member.dart' show SubstitutedExecutableElementImpl; import 'package:collection/collection.dart' show IterableExtension; import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; @@ -31,7 +29,7 @@ class Accessor extends ModelElement { late final GetterSetterCombo enclosingCombo; Accessor(this.element, super.library, super.packageGraph, - {SubstitutedExecutableElementImpl? super.originalMember}); + {ExecutableElement? super.originalElement}); @override CharacterLocation? get characterLocation => element.isSynthetic @@ -39,8 +37,8 @@ class Accessor extends ModelElement { : super.characterLocation; @override - SubstitutedExecutableElementImpl? get originalMember => - super.originalMember as SubstitutedExecutableElementImpl?; + ExecutableElement? get originalMember => + super.originalMember as ExecutableElement?; late final Callable modelType = getTypeFor((originalMember ?? element).type, library) as Callable; @@ -182,7 +180,7 @@ class ContainerAccessor extends Accessor with ContainerMember, Inheritable { ContainerAccessor.inherited( super.element, super.library, super.packageGraph, this._enclosingElement, - {super.originalMember}) + {super.originalElement}) : isInherited = true; /// The index and values fields are never declared, and must be special cased. diff --git a/lib/src/model/method.dart b/lib/src/model/method.dart index d19747b283..662d938450 100644 --- a/lib/src/model/method.dart +++ b/lib/src/model/method.dart @@ -4,8 +4,6 @@ import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/source/line_info.dart'; -// ignore: implementation_imports -import 'package:analyzer/src/dart/element/member.dart' show SubstitutedExecutableElementImpl; import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/model/attribute.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; @@ -32,7 +30,7 @@ class Method extends ModelElement Method.inherited(this.element, this._enclosingContainer, super.library, super.packageGraph, - {SubstitutedExecutableElementImpl? super.originalMember}) + {ExecutableElement? super.originalElement}) : _isInherited = true { _calcTypeParameters(); } @@ -42,7 +40,7 @@ class Method extends ModelElement this._enclosingContainer, super.library, super.packageGraph, { - SubstitutedExecutableElementImpl? super.originalMember, + ExecutableElement? super.originalElement, }) : _isInherited = false { _calcTypeParameters(); } @@ -113,8 +111,8 @@ class Method extends ModelElement Kind get kind => Kind.method; @override - SubstitutedExecutableElementImpl? get originalMember => - super.originalMember as SubstitutedExecutableElementImpl?; + ExecutableElement? get originalMember => + super.originalMember as ExecutableElement?; late final Callable modelType = getTypeFor((originalMember ?? element).type, library) as Callable; diff --git a/lib/src/model/model_element.dart b/lib/src/model/model_element.dart index 188b38ce2b..93cd2fbc45 100644 --- a/lib/src/model/model_element.dart +++ b/lib/src/model/model_element.dart @@ -11,14 +11,6 @@ import 'dart:convert'; import 'package:analyzer/dart/element/element.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/member.dart' - show - SubstitutedExecutableElementImpl, - SubstitutedFieldElementImpl, - SubstitutedElementImpl, - SubstitutedFormalParameterElementImpl; import 'package:dartdoc/src/dartdoc_options.dart'; import 'package:dartdoc/src/model/annotation.dart'; import 'package:dartdoc/src/model/attribute.dart'; @@ -75,14 +67,258 @@ abstract class ModelElement DocumentationComment implements Comparable, Documentable { // TODO(jcollins-g): This really wants a "member that has a type" class. - final SubstitutedElementImpl? _originalMember; + final Element? _originalMember; final Library _library; final PackageGraph _packageGraph; - ModelElement(this._library, this._packageGraph, - {SubstitutedElementImpl? originalMember}) - : _originalMember = originalMember; + /// This element's [Annotation]s. + /// + /// Does not include annotations with `null` elements or that are otherwise + /// 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.annotations + .where((m) => m.isVisibleAnnotation) + .map((m) => Annotation(m, library, packageGraph)) + .toList(growable: false); + + @override + late final bool isPublic = () { + if (name.isEmpty) { + return false; + } + if (this is! Library) { + final canonicalLibrary = this.canonicalLibrary; + var isLibraryOrCanonicalLibraryPrivate = !library.isPublic && + (canonicalLibrary == null || !canonicalLibrary.isPublic); + if (library == Library.sentinel || isLibraryOrCanonicalLibraryPrivate) { + return false; + } + } + if (enclosingElement is Class && !(enclosingElement as Class).isPublic) { + return false; + } + // TODO(srawlins): Er, mixin? enum? + if (enclosingElement is Extension && + !(enclosingElement as Extension).isPublic) { + return false; + } + + if (element case LibraryElement(:var uri, :var firstFragment)) { + final url = uri.toString(); + // Private Dart SDK libraries are not public. + if (url.startsWith('dart:_') || + url.startsWith('dart:nativewrappers/') || + url == 'dart:nativewrappers') { + return false; + } + // Package-private libraries are not public. + var elementUri = firstFragment.source.uri; + if (elementUri.scheme == 'package' && + elementUri.pathSegments[1] == 'src') { + return false; + } + } + + if (element.nonSynthetic.metadata.hasInternal) { + return false; + } + return !element.hasPrivateName && !hasNodoc; + }(); + + @override + late final DartdocOptionContext config = + DartdocOptionContext.fromContextElement( + packageGraph.config, library.element, packageGraph.resourceProvider); + + /// The canonical ModelElement for this ModelElement, or null if there isn't + /// one. + late final ModelElement? canonicalModelElement = () { + final enclosingElement = this.enclosingElement; + var preferredClass = switch (enclosingElement) { + // TODO(srawlins): Add mixin. + Class() => enclosingElement, + Enum() => enclosingElement, + Extension() => enclosingElement, + ExtensionType() => enclosingElement, + _ => null, + }; + return packageGraph.findCanonicalModelElementFor(this, + preferredClass: preferredClass); + }(); + + late final String sourceHref = SourceLinker.fromElement(this).href(); + + /// A public, documented library which exports this [ModelElement], ideally in + /// [library]'s package. + late final Library? canonicalLibrary = () { + if (element.hasPrivateName) { + // Privately named elements can never have a canonical library. + return null; + } + + // This is not accurate if we are still constructing the Package. + assert(packageGraph.allLibrariesAdded); + + var definingLibraryIsLocalPublic = + packageGraph.localPublicLibraries.contains(library); + var possibleCanonicalLibrary = definingLibraryIsLocalPublic + ? library + : canonicalLibraryCandidate(this); + + if (possibleCanonicalLibrary != null) return possibleCanonicalLibrary; + + if (this case Inheritable(isInherited: true)) { + if (!config.linkToRemote && + packageGraph.publicLibraries.contains(library)) { + // If this is an element inherited from a container that isn't directly + // reexported, and we're not linking to remote, we can pretend that + // [library] is canonical. + return library; + } + } + + return null; + }(); + + @override + late final String qualifiedName = () { + var enclosingElement = this.enclosingElement; + + var result = name; + while (enclosingElement != null && enclosingElement is! Library) { + result = '${enclosingElement.name}.$result'; + enclosingElement = enclosingElement.enclosingElement; + } + return result; + }(); + + @override + late final CharacterLocation? characterLocation = () { + final lineInfo = unitElement.lineInfo; + + final nameOffset = element.firstFragment.nameOffset; + assert(nameOffset != null && nameOffset >= 0, + 'Invalid location data, $nameOffset, for element: $fullyQualifiedName'); + if (nameOffset != null && nameOffset >= 0) { + return lineInfo.getLocation(nameOffset); + } + return null; + }(); + + /// The name of this element, wrapped in an HTML link (an `` tag) if [href] + /// is non-`null`. + late final String linkedName = () { + var parts = linkedNameParts; + return '${parts.tag}${parts.text}${parts.endTag}'; + }(); + + // TODO(srawlins): This really smells like it should just be implemented in + // the subclasses. + late final List parameters = () { + final e = element; + if (!isCallable) { + throw StateError('$e (${e.runtimeType}) cannot have parameters'); + } + + final List params; + if (e is TypeAliasElement) { + final aliasedType = e.aliasedType; + if (aliasedType is FunctionType) { + params = aliasedType.formalParameters; + } else { + return const []; + } + } else if (e is ExecutableElement) { + if (_originalMember != null) { + assert(_originalMember is ExecutableElement); + params = (_originalMember as ExecutableElement).formalParameters; + } else { + params = e.formalParameters; + } + } else if (e is FunctionTypedElement) { + if (_originalMember != null) { + params = (_originalMember as FunctionTypedElement).formalParameters; + } else { + params = e.formalParameters; + } + } else { + return const []; + } + + return List.of( + params + .map((p) => ModelElement.for_(p, library, packageGraph) as Parameter), + growable: false, + ); + }(); + + @override + late final String sourceCode = const HtmlEscape().convert(super.sourceCode); + + ModelElement(this._library, this._packageGraph, {Element? originalElement}) + : _originalMember = originalElement; + + /// Returns a [ModelElement] from a non-property-inducing [e]. + /// + /// Do not construct any ModelElements except from this constructor or + /// [ModelElement.forPropertyInducingElement]. Specify [enclosingContainer] + /// if and only if this is to be an inherited or extended object. + // TODO(jcollins-g): this way of using the optional parameter is messy, + // clean that up. + // 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, + {Container? enclosingContainer}) { + assert(library != Library.sentinel || + e is FormalParameterElement || + e is TypeParameterElement || + e is GenericFunctionTypeElement || + e.kind == ElementKind.DYNAMIC || + e.kind == ElementKind.NEVER); + + Element? originalMember; + // TODO(jcollins-g): Refactor object model to instantiate 'ModelMembers' + // for members? + if (e is ExecutableElement) { + originalMember = e; + e = e.baseElement; + } else if (e is FieldElement) { + originalMember = e; + e = e.baseElement; + } + + // Return the cached ModelElement if it exists. + var key = ConstructedModelElementsKey(e, enclosingContainer); + var cachedModelElement = packageGraph.allConstructedModelElements[key]; + if (cachedModelElement != null) { + return cachedModelElement; + } + + if (e.kind == ElementKind.DYNAMIC) { + return packageGraph.allConstructedModelElements[key] = + Dynamic(e, packageGraph); + } + if (e.kind == ElementKind.NEVER) { + return packageGraph.allConstructedModelElements[key] = + NeverType(e, packageGraph); + } + + var newModelElement = ModelElement._constructFromElementDeclaration( + e, + library, + packageGraph, + enclosingContainer: enclosingContainer, + originalMember: originalMember, + ); + + _cacheNewModelElement(e, newModelElement, library, + enclosingContainer: enclosingContainer); + + return newModelElement; + } /// Returns a [ModelElement] for an [Element], which can be a /// property-inducing element or not. @@ -128,9 +364,7 @@ abstract class ModelElement }) { // TODO(jcollins-g): Refactor object model to instantiate 'ModelMembers' // for members? - if (e is SubstitutedElementImpl) { - e = e.baseElement as PropertyInducingElement; - } + e = e.baseElement as PropertyInducingElement; // Return the cached ModelElement if it exists. var cachedModelElement = packageGraph.allConstructedModelElements[ @@ -204,251 +438,7 @@ abstract class ModelElement return newModelElement; } - /// Returns a [ModelElement] from a non-property-inducing [e]. - /// - /// Do not construct any ModelElements except from this constructor or - /// [ModelElement.forPropertyInducingElement]. Specify [enclosingContainer] - /// if and only if this is to be an inherited or extended object. - // TODO(jcollins-g): this way of using the optional parameter is messy, - // clean that up. - // 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, - {Container? enclosingContainer}) { - assert(library != Library.sentinel || - e is FormalParameterElement || - e is TypeParameterElement || - e is GenericFunctionTypeElement || - e.kind == ElementKind.DYNAMIC || - e.kind == ElementKind.NEVER); - - SubstitutedElementImpl? originalMember; - // TODO(jcollins-g): Refactor object model to instantiate 'ModelMembers' - // for members? - if (e is SubstitutedExecutableElementImpl) { - originalMember = e; - e = e.baseElement; - } else if (e is SubstitutedFieldElementImpl) { - originalMember = e; - e = e.baseElement; - } - - // Return the cached ModelElement if it exists. - var key = ConstructedModelElementsKey(e, enclosingContainer); - var cachedModelElement = packageGraph.allConstructedModelElements[key]; - if (cachedModelElement != null) { - return cachedModelElement; - } - - if (e.kind == ElementKind.DYNAMIC) { - return packageGraph.allConstructedModelElements[key] = - Dynamic(e, packageGraph); - } - if (e.kind == ElementKind.NEVER) { - return packageGraph.allConstructedModelElements[key] = - NeverType(e, packageGraph); - } - - var newModelElement = ModelElement._constructFromElementDeclaration( - e, - library, - packageGraph, - enclosingContainer: enclosingContainer, - originalMember: originalMember, - ); - - _cacheNewModelElement(e, newModelElement, library, - enclosingContainer: enclosingContainer); - - return newModelElement; - } - - /// Caches a newly-created [ModelElement] from [ModelElement.for_] or - /// [ModelElement.forPropertyInducingElement]. - static void _cacheNewModelElement( - Element 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'); - if (library != Library.sentinel && newModelElement is! Parameter) { - runtimeStats.incrementAccumulator('modelElementCacheInsertion'); - var key = ConstructedModelElementsKey(e, enclosingContainer); - library.packageGraph.allConstructedModelElements[key] = newModelElement; - if (newModelElement is Inheritable) { - library.packageGraph.allInheritableElements - .putIfAbsent(InheritableElementsKey(e, library), () => {}) - .add(newModelElement); - } - } - } - - static ModelElement _constructFromElementDeclaration( - Element e, - Library library, - PackageGraph packageGraph, { - Container? enclosingContainer, - SubstitutedElementImpl? originalMember, - }) { - return switch (e) { - LibraryElement() => packageGraph.findButDoNotCreateLibraryFor(e)!, - PrefixElement() => Prefix(e, library, packageGraph), - EnumElement() => Enum(e, library, packageGraph), - MixinElement() => Mixin(e, library, packageGraph), - ClassElement() => Class(e, library, packageGraph), - ExtensionElement() => Extension(e, library, packageGraph), - ExtensionTypeElement() => ExtensionType(e, library, packageGraph), - TopLevelFunctionElement() => ModelFunction(e, library, packageGraph), - ConstructorElement() => Constructor(e, library, packageGraph), - GenericFunctionTypeElement() => - ModelFunctionTypedef(e as FunctionTypedElement, library, packageGraph), - TypeAliasElement(aliasedType: FunctionType()) => - FunctionTypedef(e, library, packageGraph), - TypeAliasElement() - when e.aliasedType.documentableElement2 is InterfaceElement => - ClassTypedef(e, library, packageGraph), - TypeAliasElement() => GeneralizedTypedef(e, library, packageGraph), - MethodElement(isOperator: true) when enclosingContainer == null => - Operator(e, library, packageGraph), - MethodElement(isOperator: true) - when e.enclosingElement is ExtensionElement => - Operator.providedByExtension( - e, enclosingContainer, library, packageGraph), - MethodElement(isOperator: true) => Operator.inherited( - e, enclosingContainer, library, packageGraph, - originalMember: originalMember), - MethodElement(isOperator: false) when enclosingContainer == null => - Method(e, library, packageGraph), - MethodElement(isOperator: false) - when e.enclosingElement is ExtensionElement => - Method.providedByExtension( - e, enclosingContainer, library, packageGraph), - MethodElement(isOperator: false) => Method.inherited( - e, enclosingContainer, library, packageGraph, - originalMember: originalMember as SubstitutedExecutableElementImpl?), - FormalParameterElement() => Parameter(e, library, packageGraph, - originalMember: - originalMember as SubstitutedFormalParameterElementImpl?), - PropertyAccessorElement() => _constructFromPropertyAccessor( - e, - library, - packageGraph, - enclosingContainer: enclosingContainer, - originalMember: originalMember, - ), - TypeParameterElement() => TypeParameter(e, library, packageGraph), - _ => throw UnimplementedError('Unknown type ${e.runtimeType}'), - }; - } - - /// Constructs a [ModelElement] from a [PropertyAccessorElement]. - static ModelElement _constructFromPropertyAccessor( - PropertyAccessorElement e, - Library library, - PackageGraph packageGraph, { - required Container? enclosingContainer, - required SubstitutedElementImpl? originalMember, - }) { - // Accessors can be part of a [Container], or a part of a [Library]. - if (e.enclosingElement is ExtensionElement || - e.enclosingElement is InterfaceElement) { - if (enclosingContainer == null || enclosingContainer is Extension) { - return ContainerAccessor(e, library, packageGraph, enclosingContainer); - } - - return ContainerAccessor.inherited( - e, library, packageGraph, enclosingContainer, - originalMember: originalMember as SubstitutedExecutableElementImpl?); - } - - return Accessor(e, library, packageGraph); - } - - /// The model element enclosing this one. - /// - /// As some examples: - /// * Instances of some subclasses have no enclosing element, like [Library] - /// and [Dynamic]. - /// * A [Container] is enclosed by a [Library]. - /// * A [Method] is enclosed by a [Container]. - /// * An [Accessor] is either enclosed by a [Container] or a [Library]. - ModelElement? get enclosingElement; - - // Stub for mustache, which would otherwise search enclosing elements to find - // names for members. - bool get hasCategoryNames => false; - - // Stub for mustache. - Iterable get displayedCategories => const []; - - @override - ModelNode? get modelNode => packageGraph.getModelNodeFor(element); - - /// This element's [Annotation]s. - /// - /// Does not include annotations with `null` elements or that are otherwise - /// 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.annotations - .where((m) => m.isVisibleAnnotation) - .map((m) => Annotation(m, library, packageGraph)) - .toList(growable: false); - - @override - late final bool isPublic = () { - if (name.isEmpty) { - return false; - } - if (this is! Library) { - final canonicalLibrary = this.canonicalLibrary; - var isLibraryOrCanonicalLibraryPrivate = !library.isPublic && - (canonicalLibrary == null || !canonicalLibrary.isPublic); - if (library == Library.sentinel || isLibraryOrCanonicalLibraryPrivate) { - return false; - } - } - if (enclosingElement is Class && !(enclosingElement as Class).isPublic) { - return false; - } - // TODO(srawlins): Er, mixin? enum? - if (enclosingElement is Extension && - !(enclosingElement as Extension).isPublic) { - return false; - } - - if (element case LibraryElement(:var uri, :var firstFragment)) { - final url = uri.toString(); - // Private Dart SDK libraries are not public. - if (url.startsWith('dart:_') || - url.startsWith('dart:nativewrappers/') || - url == 'dart:nativewrappers') { - return false; - } - // Package-private libraries are not public. - var elementUri = firstFragment.source.uri; - if (elementUri.scheme == 'package' && - elementUri.pathSegments[1] == 'src') { - return false; - } - } - - if (element.nonSynthetic.metadata.hasInternal) { - return false; - } - return !element.hasPrivateName && !hasNodoc; - }(); - - @override - late final DartdocOptionContext config = - DartdocOptionContext.fromContextElement( - packageGraph.config, library.element, packageGraph.resourceProvider); - - bool get hasAttributes => attributes.isNotEmpty; - - /// This element's attributes. + /// This element's attributes. /// /// This includes tags applied by Dartdoc for various attributes that should /// be called out. See [Attribute] for a list. @@ -470,32 +460,6 @@ abstract class ModelElement .join(); } - /// 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); - - /// The canonical ModelElement for this ModelElement, or null if there isn't - /// one. - late final ModelElement? canonicalModelElement = () { - final enclosingElement = this.enclosingElement; - var preferredClass = switch (enclosingElement) { - // TODO(srawlins): Add mixin. - Class() => enclosingElement, - Enum() => enclosingElement, - Extension() => enclosingElement, - ExtensionType() => enclosingElement, - _ => null, - }; - return packageGraph.findCanonicalModelElementFor(this, - preferredClass: preferredClass); - }(); - - bool get hasSourceHref => sourceHref.isNotEmpty; - - late final String sourceHref = SourceLinker.fromElement(this).href(); - Library get canonicalLibraryOrThrow { final canonicalLibrary = this.canonicalLibrary; if (canonicalLibrary == null) { @@ -505,69 +469,32 @@ abstract class ModelElement return canonicalLibrary; } - /// A public, documented library which exports this [ModelElement], ideally in - /// [library]'s package. - late final Library? canonicalLibrary = () { - if (element.hasPrivateName) { - // Privately named elements can never have a canonical library. - return null; - } - - // This is not accurate if we are still constructing the Package. - assert(packageGraph.allLibrariesAdded); - - var definingLibraryIsLocalPublic = - packageGraph.localPublicLibraries.contains(library); - var possibleCanonicalLibrary = definingLibraryIsLocalPublic - ? library - : canonicalLibraryCandidate(this); - - if (possibleCanonicalLibrary != null) return possibleCanonicalLibrary; - - if (this case Inheritable(isInherited: true)) { - if (!config.linkToRemote && - packageGraph.publicLibraries.contains(library)) { - // If this is an element inherited from a container that isn't directly - // reexported, and we're not linking to remote, we can pretend that - // [library] is canonical. - return library; - } - } - - return null; - }(); - + @internal @override - bool get isCanonical { - if (!isPublic) return false; - if (this is Library && library != canonicalLibrary) return false; - // If there's no inheritance to deal with, we're done. - if (this is! Inheritable) return true; - final self = this as Inheritable; - // If we're the defining element, or if the defining element is not in the - // set of libraries being documented, then this element should be treated as - // canonical (given `library == canonicalLibrary`). - return self.enclosingElement == self.canonicalEnclosingContainer; + CommentReferable get definingCommentReferable { + return getModelForElement(element); } + // Stub for mustache. + Iterable get displayedCategories => const []; + /// The documentaion, stripped of its comment syntax, like `///` characters. @override String get documentation => injectMacros( - documentationFrom.map((e) => e.documentationLocal).join('

')); - - @override - Element get element; - - @override - String get location { - // Call nothing from here that can emit warnings or you'll cause stack - // overflows. - var sourceUri = pathContext.toUri(sourceFileName); - if (characterLocation != null) { - return '($sourceUri:${characterLocation.toString()})'; - } - return '($sourceUri)'; - } + documentationFrom.map((e) => e.documentationLocal).join('

')); + + @override + Element get element; + + /// The model element enclosing this one. + /// + /// As some examples: + /// * Instances of some subclasses have no enclosing element, like [Library] + /// and [Dynamic]. + /// * A [Container] is enclosed by a [Library]. + /// * A [Method] is enclosed by a [Container]. + /// * An [Accessor] is either enclosed by a [Container] or a [Library]. + ModelElement? get enclosingElement; /// The name of the output file in which this element will be primarily /// documented. @@ -581,50 +508,21 @@ abstract class ModelElement String get fullyQualifiedName => this is Library ? name : '${library.name}.$qualifiedName'; - @override - late final String qualifiedName = () { - var enclosingElement = this.enclosingElement; - - var result = name; - while (enclosingElement != null && enclosingElement is! Library) { - result = '${enclosingElement.name}.$result'; - enclosingElement = enclosingElement.enclosingElement; - } - return result; - }(); - - @override - String get sourceFileName => element.library!.firstFragment.source.fullName; - - @override - late final CharacterLocation? characterLocation = () { - final lineInfo = unitElement.lineInfo; - - final nameOffset = element.firstFragment.nameOffset; - assert(nameOffset != null && nameOffset >= 0, - 'Invalid location data, $nameOffset, for element: $fullyQualifiedName'); - if (nameOffset != null && nameOffset >= 0) { - return lineInfo.getLocation(nameOffset); - } - return null; - }(); + bool get hasAnnotations => annotations.isNotEmpty; - LibraryFragment get unitElement { - Fragment? fragment = element.firstFragment; - while (fragment != null) { - if (fragment is LibraryFragment) return fragment; - fragment = fragment.enclosingFragment; - } - throw StateError('Unable to find enclosing LibraryFragment for $element'); - } + bool get hasAttributes => attributes.isNotEmpty; - bool get hasAnnotations => annotations.isNotEmpty; + // Stub for mustache, which would otherwise search enclosing elements to find + // names for members. + bool get hasCategoryNames => false; @override bool get hasDocumentation => documentation.isNotEmpty; bool get hasParameters => parameters.isNotEmpty; + bool get hasSourceHref => sourceHref.isNotEmpty; + /// If [canonicalLibrary] (or [Inheritable.canonicalEnclosingContainer], for /// [Inheritable] subclasses) is `null`, this is `null`. @override @@ -638,6 +536,25 @@ abstract class ModelElement String get htmlId => name; + /// 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); + + @override + bool get isCanonical { + if (!isPublic) return false; + if (this is Library && library != canonicalLibrary) return false; + // If there's no inheritance to deal with, we're done. + if (this is! Inheritable) return true; + final self = this as Inheritable; + // If we're the defining element, or if the defining element is not in the + // set of libraries being documented, then this element should be treated as + // canonical (given `library == canonicalLibrary`). + return self.enclosingElement == self.canonicalEnclosingContainer; + } + bool get isConst => false; bool get isDeprecated { @@ -674,6 +591,8 @@ abstract class ModelElement bool get isLate => false; + bool get isPublicAndPackageDocumented => isPublic && package.isDocumented; + /// A human-friendly name for the kind of element this is. @override Kind get kind; @@ -681,13 +600,6 @@ abstract class ModelElement @override Library get library => _library; - /// The name of this element, wrapped in an HTML link (an `` tag) if [href] - /// is non-`null`. - late final String linkedName = () { - var parts = linkedNameParts; - return '${parts.tag}${parts.text}${parts.endTag}'; - }(); - ({String tag, String text, String endTag}) get linkedNameParts { // If `name` is empty, we probably have the wrong Element association or // there's an analyzer issue. @@ -712,10 +624,7 @@ abstract class ModelElement ); } - ParameterRenderer get _parameterRenderer => const ParameterRendererHtml(); - - ParameterRenderer get _parameterRendererDetailed => - const ParameterRendererHtmlList(); + String get linkedObjectType => _packageGraph.dartCoreObject; /// The list of linked parameters, as inline HTML, including metadata. /// @@ -735,67 +644,52 @@ abstract class ModelElement _parameterRenderer.renderLinkedParams(parameters, showMetadata: false); @override - String get name => element.lookupName ?? ''; + String get location { + // Call nothing from here that can emit warnings or you'll cause stack + // overflows. + var sourceUri = pathContext.toUri(sourceFileName); + if (characterLocation != null) { + return '($sourceUri:${characterLocation.toString()})'; + } + return '($sourceUri)'; + } @override - String get oneLineDoc => elementDocumentation.asOneLiner; + ModelNode? get modelNode => packageGraph.getModelNodeFor(element); - SubstitutedElementImpl? get originalMember => _originalMember; + @override + String get name => element.lookupName ?? ''; @override - PackageGraph get packageGraph => _packageGraph; + String get oneLineDoc => elementDocumentation.asOneLiner; + + Element? get originalMember => _originalMember; @override Package get package => library.package; - bool get isPublicAndPackageDocumented => isPublic && package.isDocumented; + @override + PackageGraph get packageGraph => _packageGraph; @override p.Context get pathContext => packageGraph.resourceProvider.pathContext; - // TODO(srawlins): This really smells like it should just be implemented in - // the subclasses. - late final List parameters = () { - final e = element; - if (!isCallable) { - throw StateError('$e (${e.runtimeType}) cannot have parameters'); - } + @override + String get sourceFileName => element.library!.firstFragment.source.fullName; - final List params; - if (e is TypeAliasElement) { - final aliasedType = e.aliasedType; - if (aliasedType is FunctionType) { - params = aliasedType.formalParameters; - } else { - return const []; - } - } else if (e is ExecutableElement) { - if (_originalMember != null) { - assert(_originalMember is SubstitutedExecutableElementImpl); - params = (_originalMember as SubstitutedExecutableElementImpl) - .formalParameters; - } else { - params = e.formalParameters; - } - } else if (e is FunctionTypedElement) { - if (_originalMember != null) { - params = (_originalMember as FunctionTypedElement).formalParameters; - } else { - params = e.formalParameters; - } - } else { - return const []; + LibraryFragment get unitElement { + Fragment? fragment = element.firstFragment; + while (fragment != null) { + if (fragment is LibraryFragment) return fragment; + fragment = fragment.enclosingFragment; } + throw StateError('Unable to find enclosing LibraryFragment for $element'); + } - return List.of( - params - .map((p) => ModelElement.for_(p, library, packageGraph) as Parameter), - growable: false, - ); - }(); + ParameterRenderer get _parameterRenderer => const ParameterRendererHtml(); - @override - late final String sourceCode = const HtmlEscape().convert(super.sourceCode); + ParameterRenderer get _parameterRendererDetailed => + const ParameterRendererHtmlList(); @override int compareTo(Object other) { @@ -809,13 +703,106 @@ abstract class ModelElement @override String toString() => '$runtimeType $name'; - @internal - @override - CommentReferable get definingCommentReferable { - return getModelForElement(element); + /// Caches a newly-created [ModelElement] from [ModelElement.for_] or + /// [ModelElement.forPropertyInducingElement]. + static void _cacheNewModelElement( + Element 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'); + if (library != Library.sentinel && newModelElement is! Parameter) { + runtimeStats.incrementAccumulator('modelElementCacheInsertion'); + var key = ConstructedModelElementsKey(e, enclosingContainer); + library.packageGraph.allConstructedModelElements[key] = newModelElement; + if (newModelElement is Inheritable) { + library.packageGraph.allInheritableElements + .putIfAbsent(InheritableElementsKey(e, library), () => {}) + .add(newModelElement); + } + } } - String get linkedObjectType => _packageGraph.dartCoreObject; + static ModelElement _constructFromElementDeclaration( + Element e, + Library library, + PackageGraph packageGraph, { + Container? enclosingContainer, + Element? originalMember, + }) { + return switch (e) { + LibraryElement() => packageGraph.findButDoNotCreateLibraryFor(e)!, + PrefixElement() => Prefix(e, library, packageGraph), + EnumElement() => Enum(e, library, packageGraph), + MixinElement() => Mixin(e, library, packageGraph), + ClassElement() => Class(e, library, packageGraph), + ExtensionElement() => Extension(e, library, packageGraph), + ExtensionTypeElement() => ExtensionType(e, library, packageGraph), + TopLevelFunctionElement() => ModelFunction(e, library, packageGraph), + ConstructorElement() => Constructor(e, library, packageGraph), + GenericFunctionTypeElement() => + ModelFunctionTypedef(e as FunctionTypedElement, library, packageGraph), + TypeAliasElement(aliasedType: FunctionType()) => + FunctionTypedef(e, library, packageGraph), + TypeAliasElement() + when e.aliasedType.documentableElement2 is InterfaceElement => + ClassTypedef(e, library, packageGraph), + TypeAliasElement() => GeneralizedTypedef(e, library, packageGraph), + MethodElement(isOperator: true) when enclosingContainer == null => + Operator(e, library, packageGraph), + MethodElement(isOperator: true) + when e.enclosingElement is ExtensionElement => + Operator.providedByExtension( + e, enclosingContainer, library, packageGraph), + MethodElement(isOperator: true) => Operator.inherited( + e, enclosingContainer, library, packageGraph, + originalMember: originalMember), + MethodElement(isOperator: false) when enclosingContainer == null => + Method(e, library, packageGraph), + MethodElement(isOperator: false) + when e.enclosingElement is ExtensionElement => + Method.providedByExtension( + e, enclosingContainer, library, packageGraph), + MethodElement(isOperator: false) => Method.inherited( + e, enclosingContainer, library, packageGraph, + originalElement: originalMember as ExecutableElement?), + FormalParameterElement() => Parameter(e, library, packageGraph, + originalElement: originalMember as FormalParameterElement?), + PropertyAccessorElement() => _constructFromPropertyAccessor( + e, + library, + packageGraph, + enclosingContainer: enclosingContainer, + originalMember: originalMember, + ), + TypeParameterElement() => TypeParameter(e, library, packageGraph), + _ => throw UnimplementedError('Unknown type ${e.runtimeType}'), + }; + } + + /// Constructs a [ModelElement] from a [PropertyAccessorElement]. + static ModelElement _constructFromPropertyAccessor( + PropertyAccessorElement e, + Library library, + PackageGraph packageGraph, { + required Container? enclosingContainer, + required Element? originalMember, + }) { + // Accessors can be part of a [Container], or a part of a [Library]. + if (e.enclosingElement is ExtensionElement || + e.enclosingElement is InterfaceElement) { + if (enclosingContainer == null || enclosingContainer is Extension) { + return ContainerAccessor(e, library, packageGraph, enclosingContainer); + } + + return ContainerAccessor.inherited( + e, library, packageGraph, enclosingContainer, + originalElement: originalMember as ExecutableElement?); + } + + return Accessor(e, library, packageGraph); + } } extension on ElementAnnotation { diff --git a/lib/src/model/operator.dart b/lib/src/model/operator.dart index 2a7e0f8b9b..e835b46faf 100644 --- a/lib/src/model/operator.dart +++ b/lib/src/model/operator.dart @@ -2,9 +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. -// ignore: implementation_imports -import 'package:analyzer/src/dart/element/member.dart' - show SubstitutedExecutableElementImpl, SubstitutedElementImpl; +import 'package:analyzer/dart/element/element.dart'; import 'package:dartdoc/src/comment_references/parser.dart'; import 'package:dartdoc/src/model/model.dart'; @@ -16,17 +14,17 @@ class Operator extends Method { super.enclosingContainer, super.library, super.packageGraph, { - SubstitutedElementImpl? originalMember, + Element? originalMember, }) : super.providedByExtension( - originalMember: originalMember as SubstitutedExecutableElementImpl?); + originalElement: originalMember as ExecutableElement?); Operator.inherited( super.element, super.enclosingContainer, super.library, super.packageGraph, { - SubstitutedElementImpl? originalMember, - }) : super.inherited(originalMember: originalMember as SubstitutedExecutableElementImpl?); + Element? originalMember, + }) : super.inherited(originalElement: originalMember as ExecutableElement?); @override String get fullyQualifiedName => diff --git a/lib/src/model/parameter.dart b/lib/src/model/parameter.dart index 5224111e7c..c52e72109f 100644 --- a/lib/src/model/parameter.dart +++ b/lib/src/model/parameter.dart @@ -3,10 +3,6 @@ // BSD-style license that can be found in the LICENSE file. import 'package:analyzer/dart/element/element.dart'; - -// ignore: implementation_imports -import 'package:analyzer/src/dart/element/member.dart' - show SubstitutedFormalParameterElementImpl; import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; import 'package:dartdoc/src/model/kind.dart'; @@ -17,7 +13,7 @@ class Parameter extends ModelElement with HasNoPage { final FormalParameterElement element; Parameter(this.element, super.library, super.packageGraph, - {SubstitutedFormalParameterElementImpl? super.originalMember}); + {FormalParameterElement? super.originalElement}); String? get defaultValue => hasDefaultValue ? element.defaultValueCode : null; @@ -101,8 +97,8 @@ class Parameter extends ModelElement with HasNoPage { } @override - SubstitutedFormalParameterElementImpl? get originalMember => - super.originalMember as SubstitutedFormalParameterElementImpl?; + FormalParameterElement? get originalMember => + super.originalMember as FormalParameterElement?; late final ElementType modelType = getTypeFor((originalMember ?? element).type, library); From a8689640f0c53f0d33573a19bf8f95b72f8b0897 Mon Sep 17 00:00:00 2001 From: Fedor Shcheglov Date: Sat, 16 Aug 2025 11:26:53 -0700 Subject: [PATCH 12/14] Fix incorrect sorting --- lib/src/model/model_element.dart | 850 +++++++++++++++---------------- 1 file changed, 425 insertions(+), 425 deletions(-) diff --git a/lib/src/model/model_element.dart b/lib/src/model/model_element.dart index 93cd2fbc45..5693cd6999 100644 --- a/lib/src/model/model_element.dart +++ b/lib/src/model/model_element.dart @@ -72,254 +72,9 @@ abstract class ModelElement final PackageGraph _packageGraph; - /// This element's [Annotation]s. - /// - /// Does not include annotations with `null` elements or that are otherwise - /// 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.annotations - .where((m) => m.isVisibleAnnotation) - .map((m) => Annotation(m, library, packageGraph)) - .toList(growable: false); - - @override - late final bool isPublic = () { - if (name.isEmpty) { - return false; - } - if (this is! Library) { - final canonicalLibrary = this.canonicalLibrary; - var isLibraryOrCanonicalLibraryPrivate = !library.isPublic && - (canonicalLibrary == null || !canonicalLibrary.isPublic); - if (library == Library.sentinel || isLibraryOrCanonicalLibraryPrivate) { - return false; - } - } - if (enclosingElement is Class && !(enclosingElement as Class).isPublic) { - return false; - } - // TODO(srawlins): Er, mixin? enum? - if (enclosingElement is Extension && - !(enclosingElement as Extension).isPublic) { - return false; - } - - if (element case LibraryElement(:var uri, :var firstFragment)) { - final url = uri.toString(); - // Private Dart SDK libraries are not public. - if (url.startsWith('dart:_') || - url.startsWith('dart:nativewrappers/') || - url == 'dart:nativewrappers') { - return false; - } - // Package-private libraries are not public. - var elementUri = firstFragment.source.uri; - if (elementUri.scheme == 'package' && - elementUri.pathSegments[1] == 'src') { - return false; - } - } - - if (element.nonSynthetic.metadata.hasInternal) { - return false; - } - return !element.hasPrivateName && !hasNodoc; - }(); - - @override - late final DartdocOptionContext config = - DartdocOptionContext.fromContextElement( - packageGraph.config, library.element, packageGraph.resourceProvider); - - /// The canonical ModelElement for this ModelElement, or null if there isn't - /// one. - late final ModelElement? canonicalModelElement = () { - final enclosingElement = this.enclosingElement; - var preferredClass = switch (enclosingElement) { - // TODO(srawlins): Add mixin. - Class() => enclosingElement, - Enum() => enclosingElement, - Extension() => enclosingElement, - ExtensionType() => enclosingElement, - _ => null, - }; - return packageGraph.findCanonicalModelElementFor(this, - preferredClass: preferredClass); - }(); - - late final String sourceHref = SourceLinker.fromElement(this).href(); - - /// A public, documented library which exports this [ModelElement], ideally in - /// [library]'s package. - late final Library? canonicalLibrary = () { - if (element.hasPrivateName) { - // Privately named elements can never have a canonical library. - return null; - } - - // This is not accurate if we are still constructing the Package. - assert(packageGraph.allLibrariesAdded); - - var definingLibraryIsLocalPublic = - packageGraph.localPublicLibraries.contains(library); - var possibleCanonicalLibrary = definingLibraryIsLocalPublic - ? library - : canonicalLibraryCandidate(this); - - if (possibleCanonicalLibrary != null) return possibleCanonicalLibrary; - - if (this case Inheritable(isInherited: true)) { - if (!config.linkToRemote && - packageGraph.publicLibraries.contains(library)) { - // If this is an element inherited from a container that isn't directly - // reexported, and we're not linking to remote, we can pretend that - // [library] is canonical. - return library; - } - } - - return null; - }(); - - @override - late final String qualifiedName = () { - var enclosingElement = this.enclosingElement; - - var result = name; - while (enclosingElement != null && enclosingElement is! Library) { - result = '${enclosingElement.name}.$result'; - enclosingElement = enclosingElement.enclosingElement; - } - return result; - }(); - - @override - late final CharacterLocation? characterLocation = () { - final lineInfo = unitElement.lineInfo; - - final nameOffset = element.firstFragment.nameOffset; - assert(nameOffset != null && nameOffset >= 0, - 'Invalid location data, $nameOffset, for element: $fullyQualifiedName'); - if (nameOffset != null && nameOffset >= 0) { - return lineInfo.getLocation(nameOffset); - } - return null; - }(); - - /// The name of this element, wrapped in an HTML link (an `` tag) if [href] - /// is non-`null`. - late final String linkedName = () { - var parts = linkedNameParts; - return '${parts.tag}${parts.text}${parts.endTag}'; - }(); - - // TODO(srawlins): This really smells like it should just be implemented in - // the subclasses. - late final List parameters = () { - final e = element; - if (!isCallable) { - throw StateError('$e (${e.runtimeType}) cannot have parameters'); - } - - final List params; - if (e is TypeAliasElement) { - final aliasedType = e.aliasedType; - if (aliasedType is FunctionType) { - params = aliasedType.formalParameters; - } else { - return const []; - } - } else if (e is ExecutableElement) { - if (_originalMember != null) { - assert(_originalMember is ExecutableElement); - params = (_originalMember as ExecutableElement).formalParameters; - } else { - params = e.formalParameters; - } - } else if (e is FunctionTypedElement) { - if (_originalMember != null) { - params = (_originalMember as FunctionTypedElement).formalParameters; - } else { - params = e.formalParameters; - } - } else { - return const []; - } - - return List.of( - params - .map((p) => ModelElement.for_(p, library, packageGraph) as Parameter), - growable: false, - ); - }(); - - @override - late final String sourceCode = const HtmlEscape().convert(super.sourceCode); - ModelElement(this._library, this._packageGraph, {Element? originalElement}) : _originalMember = originalElement; - /// Returns a [ModelElement] from a non-property-inducing [e]. - /// - /// Do not construct any ModelElements except from this constructor or - /// [ModelElement.forPropertyInducingElement]. Specify [enclosingContainer] - /// if and only if this is to be an inherited or extended object. - // TODO(jcollins-g): this way of using the optional parameter is messy, - // clean that up. - // 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, - {Container? enclosingContainer}) { - assert(library != Library.sentinel || - e is FormalParameterElement || - e is TypeParameterElement || - e is GenericFunctionTypeElement || - e.kind == ElementKind.DYNAMIC || - e.kind == ElementKind.NEVER); - - Element? originalMember; - // TODO(jcollins-g): Refactor object model to instantiate 'ModelMembers' - // for members? - if (e is ExecutableElement) { - originalMember = e; - e = e.baseElement; - } else if (e is FieldElement) { - originalMember = e; - e = e.baseElement; - } - - // Return the cached ModelElement if it exists. - var key = ConstructedModelElementsKey(e, enclosingContainer); - var cachedModelElement = packageGraph.allConstructedModelElements[key]; - if (cachedModelElement != null) { - return cachedModelElement; - } - - if (e.kind == ElementKind.DYNAMIC) { - return packageGraph.allConstructedModelElements[key] = - Dynamic(e, packageGraph); - } - if (e.kind == ElementKind.NEVER) { - return packageGraph.allConstructedModelElements[key] = - NeverType(e, packageGraph); - } - - var newModelElement = ModelElement._constructFromElementDeclaration( - e, - library, - packageGraph, - enclosingContainer: enclosingContainer, - originalMember: originalMember, - ); - - _cacheNewModelElement(e, newModelElement, library, - enclosingContainer: enclosingContainer); - - return newModelElement; - } - /// Returns a [ModelElement] for an [Element], which can be a /// property-inducing element or not. /// @@ -438,17 +193,260 @@ abstract class ModelElement return newModelElement; } - /// This element's attributes. + /// Returns a [ModelElement] from a non-property-inducing [e]. /// - /// This includes tags applied by Dartdoc for various attributes that should - /// be called out. See [Attribute] for a list. - Set get attributes { - return { - // 'const' and 'static' are not needed here because 'const' and 'static' - // elements get their own sections in the doc. - if (isFinal) Attribute.final_, - if (isLate) Attribute.late_, - }; + /// Do not construct any ModelElements except from this constructor or + /// [ModelElement.forPropertyInducingElement]. Specify [enclosingContainer] + /// if and only if this is to be an inherited or extended object. + // TODO(jcollins-g): this way of using the optional parameter is messy, + // clean that up. + // 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, + {Container? enclosingContainer}) { + assert(library != Library.sentinel || + e is FormalParameterElement || + e is TypeParameterElement || + e is GenericFunctionTypeElement || + e.kind == ElementKind.DYNAMIC || + e.kind == ElementKind.NEVER); + + Element? originalMember; + // TODO(jcollins-g): Refactor object model to instantiate 'ModelMembers' + // for members? + if (e is ExecutableElement) { + originalMember = e; + e = e.baseElement; + } else if (e is ExecutableElement) { + originalMember = e; + e = e.baseElement; + } + + // Return the cached ModelElement if it exists. + var key = ConstructedModelElementsKey(e, enclosingContainer); + var cachedModelElement = packageGraph.allConstructedModelElements[key]; + if (cachedModelElement != null) { + return cachedModelElement; + } + + if (e.kind == ElementKind.DYNAMIC) { + return packageGraph.allConstructedModelElements[key] = + Dynamic(e, packageGraph); + } + if (e.kind == ElementKind.NEVER) { + return packageGraph.allConstructedModelElements[key] = + NeverType(e, packageGraph); + } + + var newModelElement = ModelElement._constructFromElementDeclaration( + e, + library, + packageGraph, + enclosingContainer: enclosingContainer, + originalMember: originalMember, + ); + + _cacheNewModelElement(e, newModelElement, library, + enclosingContainer: enclosingContainer); + + return newModelElement; + } + + /// Caches a newly-created [ModelElement] from [ModelElement.for_] or + /// [ModelElement.forPropertyInducingElement]. + static void _cacheNewModelElement( + Element 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'); + if (library != Library.sentinel && newModelElement is! Parameter) { + runtimeStats.incrementAccumulator('modelElementCacheInsertion'); + var key = ConstructedModelElementsKey(e, enclosingContainer); + library.packageGraph.allConstructedModelElements[key] = newModelElement; + if (newModelElement is Inheritable) { + library.packageGraph.allInheritableElements + .putIfAbsent(InheritableElementsKey(e, library), () => {}) + .add(newModelElement); + } + } + } + + static ModelElement _constructFromElementDeclaration( + Element e, + Library library, + PackageGraph packageGraph, { + Container? enclosingContainer, + Element? originalMember, + }) { + return switch (e) { + LibraryElement() => packageGraph.findButDoNotCreateLibraryFor(e)!, + PrefixElement() => Prefix(e, library, packageGraph), + EnumElement() => Enum(e, library, packageGraph), + MixinElement() => Mixin(e, library, packageGraph), + ClassElement() => Class(e, library, packageGraph), + ExtensionElement() => Extension(e, library, packageGraph), + ExtensionTypeElement() => ExtensionType(e, library, packageGraph), + TopLevelFunctionElement() => ModelFunction(e, library, packageGraph), + ConstructorElement() => Constructor(e, library, packageGraph), + GenericFunctionTypeElement() => + ModelFunctionTypedef(e as FunctionTypedElement, library, packageGraph), + TypeAliasElement(aliasedType: FunctionType()) => + FunctionTypedef(e, library, packageGraph), + TypeAliasElement() + when e.aliasedType.documentableElement2 is InterfaceElement => + ClassTypedef(e, library, packageGraph), + TypeAliasElement() => GeneralizedTypedef(e, library, packageGraph), + MethodElement(isOperator: true) when enclosingContainer == null => + Operator(e, library, packageGraph), + MethodElement(isOperator: true) + when e.enclosingElement is ExtensionElement => + Operator.providedByExtension( + e, enclosingContainer, library, packageGraph), + MethodElement(isOperator: true) => Operator.inherited( + e, enclosingContainer, library, packageGraph, + originalMember: originalMember), + MethodElement(isOperator: false) when enclosingContainer == null => + Method(e, library, packageGraph), + MethodElement(isOperator: false) + when e.enclosingElement is ExtensionElement => + Method.providedByExtension( + e, enclosingContainer, library, packageGraph), + MethodElement(isOperator: false) => Method.inherited( + e, enclosingContainer, library, packageGraph, + originalElement: originalMember as ExecutableElement?), + FormalParameterElement() => Parameter(e, library, packageGraph, + originalElement: originalMember as FormalParameterElement?), + PropertyAccessorElement() => _constructFromPropertyAccessor( + e, + library, + packageGraph, + enclosingContainer: enclosingContainer, + originalMember: originalMember, + ), + TypeParameterElement() => TypeParameter(e, library, packageGraph), + _ => throw UnimplementedError('Unknown type ${e.runtimeType}'), + }; + } + + /// Constructs a [ModelElement] from a [PropertyAccessorElement]. + static ModelElement _constructFromPropertyAccessor( + PropertyAccessorElement e, + Library library, + PackageGraph packageGraph, { + required Container? enclosingContainer, + required Element? originalMember, + }) { + // Accessors can be part of a [Container], or a part of a [Library]. + if (e.enclosingElement is ExtensionElement || + e.enclosingElement is InterfaceElement) { + if (enclosingContainer == null || enclosingContainer is Extension) { + return ContainerAccessor(e, library, packageGraph, enclosingContainer); + } + + return ContainerAccessor.inherited( + e, library, packageGraph, enclosingContainer, + originalElement: originalMember as ExecutableElement?); + } + + return Accessor(e, library, packageGraph); + } + + /// The model element enclosing this one. + /// + /// As some examples: + /// * Instances of some subclasses have no enclosing element, like [Library] + /// and [Dynamic]. + /// * A [Container] is enclosed by a [Library]. + /// * A [Method] is enclosed by a [Container]. + /// * An [Accessor] is either enclosed by a [Container] or a [Library]. + ModelElement? get enclosingElement; + + // Stub for mustache, which would otherwise search enclosing elements to find + // names for members. + bool get hasCategoryNames => false; + + // Stub for mustache. + Iterable get displayedCategories => const []; + + @override + ModelNode? get modelNode => packageGraph.getModelNodeFor(element); + + /// This element's [Annotation]s. + /// + /// Does not include annotations with `null` elements or that are otherwise + /// 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.annotations + .where((m) => m.isVisibleAnnotation) + .map((m) => Annotation(m, library, packageGraph)) + .toList(growable: false); + + @override + late final bool isPublic = () { + if (name.isEmpty) { + return false; + } + if (this is! Library) { + final canonicalLibrary = this.canonicalLibrary; + var isLibraryOrCanonicalLibraryPrivate = !library.isPublic && + (canonicalLibrary == null || !canonicalLibrary.isPublic); + if (library == Library.sentinel || isLibraryOrCanonicalLibraryPrivate) { + return false; + } + } + if (enclosingElement is Class && !(enclosingElement as Class).isPublic) { + return false; + } + // TODO(srawlins): Er, mixin? enum? + if (enclosingElement is Extension && + !(enclosingElement as Extension).isPublic) { + return false; + } + + if (element case LibraryElement(:var uri, :var firstFragment)) { + final url = uri.toString(); + // Private Dart SDK libraries are not public. + if (url.startsWith('dart:_') || + url.startsWith('dart:nativewrappers/') || + url == 'dart:nativewrappers') { + return false; + } + // Package-private libraries are not public. + var elementUri = firstFragment.source.uri; + if (elementUri.scheme == 'package' && + elementUri.pathSegments[1] == 'src') { + return false; + } + } + + if (element.nonSynthetic.metadata.hasInternal) { + return false; + } + return !element.hasPrivateName && !hasNodoc; + }(); + + @override + late final DartdocOptionContext config = + DartdocOptionContext.fromContextElement( + packageGraph.config, library.element, packageGraph.resourceProvider); + + bool get hasAttributes => attributes.isNotEmpty; + + /// This element's attributes. + /// + /// This includes tags applied by Dartdoc for various attributes that should + /// be called out. See [Attribute] for a list. + Set get attributes { + return { + // 'const' and 'static' are not needed here because 'const' and 'static' + // elements get their own sections in the doc. + if (isFinal) Attribute.final_, + if (isLate) Attribute.late_, + }; } String get attributesAsString { @@ -460,6 +458,32 @@ abstract class ModelElement .join(); } + /// 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); + + /// The canonical ModelElement for this ModelElement, or null if there isn't + /// one. + late final ModelElement? canonicalModelElement = () { + final enclosingElement = this.enclosingElement; + var preferredClass = switch (enclosingElement) { + // TODO(srawlins): Add mixin. + Class() => enclosingElement, + Enum() => enclosingElement, + Extension() => enclosingElement, + ExtensionType() => enclosingElement, + _ => null, + }; + return packageGraph.findCanonicalModelElementFor(this, + preferredClass: preferredClass); + }(); + + bool get hasSourceHref => sourceHref.isNotEmpty; + + late final String sourceHref = SourceLinker.fromElement(this).href(); + Library get canonicalLibraryOrThrow { final canonicalLibrary = this.canonicalLibrary; if (canonicalLibrary == null) { @@ -469,15 +493,51 @@ abstract class ModelElement return canonicalLibrary; } - @internal + /// A public, documented library which exports this [ModelElement], ideally in + /// [library]'s package. + late final Library? canonicalLibrary = () { + if (element.hasPrivateName) { + // Privately named elements can never have a canonical library. + return null; + } + + // This is not accurate if we are still constructing the Package. + assert(packageGraph.allLibrariesAdded); + + var definingLibraryIsLocalPublic = + packageGraph.localPublicLibraries.contains(library); + var possibleCanonicalLibrary = definingLibraryIsLocalPublic + ? library + : canonicalLibraryCandidate(this); + + if (possibleCanonicalLibrary != null) return possibleCanonicalLibrary; + + if (this case Inheritable(isInherited: true)) { + if (!config.linkToRemote && + packageGraph.publicLibraries.contains(library)) { + // If this is an element inherited from a container that isn't directly + // reexported, and we're not linking to remote, we can pretend that + // [library] is canonical. + return library; + } + } + + return null; + }(); + @override - CommentReferable get definingCommentReferable { - return getModelForElement(element); + bool get isCanonical { + if (!isPublic) return false; + if (this is Library && library != canonicalLibrary) return false; + // If there's no inheritance to deal with, we're done. + if (this is! Inheritable) return true; + final self = this as Inheritable; + // If we're the defining element, or if the defining element is not in the + // set of libraries being documented, then this element should be treated as + // canonical (given `library == canonicalLibrary`). + return self.enclosingElement == self.canonicalEnclosingContainer; } - // Stub for mustache. - Iterable get displayedCategories => const []; - /// The documentaion, stripped of its comment syntax, like `///` characters. @override String get documentation => injectMacros( @@ -486,15 +546,16 @@ abstract class ModelElement @override Element get element; - /// The model element enclosing this one. - /// - /// As some examples: - /// * Instances of some subclasses have no enclosing element, like [Library] - /// and [Dynamic]. - /// * A [Container] is enclosed by a [Library]. - /// * A [Method] is enclosed by a [Container]. - /// * An [Accessor] is either enclosed by a [Container] or a [Library]. - ModelElement? get enclosingElement; + @override + String get location { + // Call nothing from here that can emit warnings or you'll cause stack + // overflows. + var sourceUri = pathContext.toUri(sourceFileName); + if (characterLocation != null) { + return '($sourceUri:${characterLocation.toString()})'; + } + return '($sourceUri)'; + } /// The name of the output file in which this element will be primarily /// documented. @@ -508,21 +569,50 @@ abstract class ModelElement String get fullyQualifiedName => this is Library ? name : '${library.name}.$qualifiedName'; - bool get hasAnnotations => annotations.isNotEmpty; + @override + late final String qualifiedName = () { + var enclosingElement = this.enclosingElement; - bool get hasAttributes => attributes.isNotEmpty; + var result = name; + while (enclosingElement != null && enclosingElement is! Library) { + result = '${enclosingElement.name}.$result'; + enclosingElement = enclosingElement.enclosingElement; + } + return result; + }(); - // Stub for mustache, which would otherwise search enclosing elements to find - // names for members. - bool get hasCategoryNames => false; + @override + String get sourceFileName => element.library!.firstFragment.source.fullName; + + @override + late final CharacterLocation? characterLocation = () { + final lineInfo = unitElement.lineInfo; + + final nameOffset = element.firstFragment.nameOffset; + assert(nameOffset != null && nameOffset >= 0, + 'Invalid location data, $nameOffset, for element: $fullyQualifiedName'); + if (nameOffset != null && nameOffset >= 0) { + return lineInfo.getLocation(nameOffset); + } + return null; + }(); + + LibraryFragment get unitElement { + Fragment? fragment = element.firstFragment; + while (fragment != null) { + if (fragment is LibraryFragment) return fragment; + fragment = fragment.enclosingFragment; + } + throw StateError('Unable to find enclosing LibraryFragment for $element'); + } + + bool get hasAnnotations => annotations.isNotEmpty; @override bool get hasDocumentation => documentation.isNotEmpty; bool get hasParameters => parameters.isNotEmpty; - bool get hasSourceHref => sourceHref.isNotEmpty; - /// If [canonicalLibrary] (or [Inheritable.canonicalEnclosingContainer], for /// [Inheritable] subclasses) is `null`, this is `null`. @override @@ -536,25 +626,6 @@ abstract class ModelElement String get htmlId => name; - /// 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); - - @override - bool get isCanonical { - if (!isPublic) return false; - if (this is Library && library != canonicalLibrary) return false; - // If there's no inheritance to deal with, we're done. - if (this is! Inheritable) return true; - final self = this as Inheritable; - // If we're the defining element, or if the defining element is not in the - // set of libraries being documented, then this element should be treated as - // canonical (given `library == canonicalLibrary`). - return self.enclosingElement == self.canonicalEnclosingContainer; - } - bool get isConst => false; bool get isDeprecated { @@ -591,8 +662,6 @@ abstract class ModelElement bool get isLate => false; - bool get isPublicAndPackageDocumented => isPublic && package.isDocumented; - /// A human-friendly name for the kind of element this is. @override Kind get kind; @@ -600,6 +669,13 @@ abstract class ModelElement @override Library get library => _library; + /// The name of this element, wrapped in an HTML link (an `` tag) if [href] + /// is non-`null`. + late final String linkedName = () { + var parts = linkedNameParts; + return '${parts.tag}${parts.text}${parts.endTag}'; + }(); + ({String tag, String text, String endTag}) get linkedNameParts { // If `name` is empty, we probably have the wrong Element association or // there's an analyzer issue. @@ -624,7 +700,10 @@ abstract class ModelElement ); } - String get linkedObjectType => _packageGraph.dartCoreObject; + ParameterRenderer get _parameterRenderer => const ParameterRendererHtml(); + + ParameterRenderer get _parameterRendererDetailed => + const ParameterRendererHtmlList(); /// The list of linked parameters, as inline HTML, including metadata. /// @@ -643,20 +722,6 @@ abstract class ModelElement String? get linkedParamsNoMetadata => _parameterRenderer.renderLinkedParams(parameters, showMetadata: false); - @override - String get location { - // Call nothing from here that can emit warnings or you'll cause stack - // overflows. - var sourceUri = pathContext.toUri(sourceFileName); - if (characterLocation != null) { - return '($sourceUri:${characterLocation.toString()})'; - } - return '($sourceUri)'; - } - - @override - ModelNode? get modelNode => packageGraph.getModelNodeFor(element); - @override String get name => element.lookupName ?? ''; @@ -666,30 +731,58 @@ abstract class ModelElement Element? get originalMember => _originalMember; @override - Package get package => library.package; + PackageGraph get packageGraph => _packageGraph; @override - PackageGraph get packageGraph => _packageGraph; + Package get package => library.package; + + bool get isPublicAndPackageDocumented => isPublic && package.isDocumented; @override p.Context get pathContext => packageGraph.resourceProvider.pathContext; - @override - String get sourceFileName => element.library!.firstFragment.source.fullName; + // TODO(srawlins): This really smells like it should just be implemented in + // the subclasses. + late final List parameters = () { + final e = element; + if (!isCallable) { + throw StateError('$e (${e.runtimeType}) cannot have parameters'); + } - LibraryFragment get unitElement { - Fragment? fragment = element.firstFragment; - while (fragment != null) { - if (fragment is LibraryFragment) return fragment; - fragment = fragment.enclosingFragment; + final List params; + if (e is TypeAliasElement) { + final aliasedType = e.aliasedType; + if (aliasedType is FunctionType) { + params = aliasedType.formalParameters; + } else { + return const []; + } + } else if (e is ExecutableElement) { + if (_originalMember != null) { + assert(_originalMember is ExecutableElement); + params = (_originalMember as ExecutableElement).formalParameters; + } else { + params = e.formalParameters; + } + } else if (e is FunctionTypedElement) { + if (_originalMember != null) { + params = (_originalMember as FunctionTypedElement).formalParameters; + } else { + params = e.formalParameters; + } + } else { + return const []; } - throw StateError('Unable to find enclosing LibraryFragment for $element'); - } - ParameterRenderer get _parameterRenderer => const ParameterRendererHtml(); + return List.of( + params + .map((p) => ModelElement.for_(p, library, packageGraph) as Parameter), + growable: false, + ); + }(); - ParameterRenderer get _parameterRendererDetailed => - const ParameterRendererHtmlList(); + @override + late final String sourceCode = const HtmlEscape().convert(super.sourceCode); @override int compareTo(Object other) { @@ -703,106 +796,13 @@ abstract class ModelElement @override String toString() => '$runtimeType $name'; - /// Caches a newly-created [ModelElement] from [ModelElement.for_] or - /// [ModelElement.forPropertyInducingElement]. - static void _cacheNewModelElement( - Element 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'); - if (library != Library.sentinel && newModelElement is! Parameter) { - runtimeStats.incrementAccumulator('modelElementCacheInsertion'); - var key = ConstructedModelElementsKey(e, enclosingContainer); - library.packageGraph.allConstructedModelElements[key] = newModelElement; - if (newModelElement is Inheritable) { - library.packageGraph.allInheritableElements - .putIfAbsent(InheritableElementsKey(e, library), () => {}) - .add(newModelElement); - } - } - } - - static ModelElement _constructFromElementDeclaration( - Element e, - Library library, - PackageGraph packageGraph, { - Container? enclosingContainer, - Element? originalMember, - }) { - return switch (e) { - LibraryElement() => packageGraph.findButDoNotCreateLibraryFor(e)!, - PrefixElement() => Prefix(e, library, packageGraph), - EnumElement() => Enum(e, library, packageGraph), - MixinElement() => Mixin(e, library, packageGraph), - ClassElement() => Class(e, library, packageGraph), - ExtensionElement() => Extension(e, library, packageGraph), - ExtensionTypeElement() => ExtensionType(e, library, packageGraph), - TopLevelFunctionElement() => ModelFunction(e, library, packageGraph), - ConstructorElement() => Constructor(e, library, packageGraph), - GenericFunctionTypeElement() => - ModelFunctionTypedef(e as FunctionTypedElement, library, packageGraph), - TypeAliasElement(aliasedType: FunctionType()) => - FunctionTypedef(e, library, packageGraph), - TypeAliasElement() - when e.aliasedType.documentableElement2 is InterfaceElement => - ClassTypedef(e, library, packageGraph), - TypeAliasElement() => GeneralizedTypedef(e, library, packageGraph), - MethodElement(isOperator: true) when enclosingContainer == null => - Operator(e, library, packageGraph), - MethodElement(isOperator: true) - when e.enclosingElement is ExtensionElement => - Operator.providedByExtension( - e, enclosingContainer, library, packageGraph), - MethodElement(isOperator: true) => Operator.inherited( - e, enclosingContainer, library, packageGraph, - originalMember: originalMember), - MethodElement(isOperator: false) when enclosingContainer == null => - Method(e, library, packageGraph), - MethodElement(isOperator: false) - when e.enclosingElement is ExtensionElement => - Method.providedByExtension( - e, enclosingContainer, library, packageGraph), - MethodElement(isOperator: false) => Method.inherited( - e, enclosingContainer, library, packageGraph, - originalElement: originalMember as ExecutableElement?), - FormalParameterElement() => Parameter(e, library, packageGraph, - originalElement: originalMember as FormalParameterElement?), - PropertyAccessorElement() => _constructFromPropertyAccessor( - e, - library, - packageGraph, - enclosingContainer: enclosingContainer, - originalMember: originalMember, - ), - TypeParameterElement() => TypeParameter(e, library, packageGraph), - _ => throw UnimplementedError('Unknown type ${e.runtimeType}'), - }; + @internal + @override + CommentReferable get definingCommentReferable { + return getModelForElement(element); } - /// Constructs a [ModelElement] from a [PropertyAccessorElement]. - static ModelElement _constructFromPropertyAccessor( - PropertyAccessorElement e, - Library library, - PackageGraph packageGraph, { - required Container? enclosingContainer, - required Element? originalMember, - }) { - // Accessors can be part of a [Container], or a part of a [Library]. - if (e.enclosingElement is ExtensionElement || - e.enclosingElement is InterfaceElement) { - if (enclosingContainer == null || enclosingContainer is Extension) { - return ContainerAccessor(e, library, packageGraph, enclosingContainer); - } - - return ContainerAccessor.inherited( - e, library, packageGraph, enclosingContainer, - originalElement: originalMember as ExecutableElement?); - } - - return Accessor(e, library, packageGraph); - } + String get linkedObjectType => _packageGraph.dartCoreObject; } extension on ElementAnnotation { From 2bd708b7390b3a19f91307d67e9ff02b9ac40f87 Mon Sep 17 00:00:00 2001 From: Fedor Shcheglov Date: Sat, 16 Aug 2025 11:35:59 -0700 Subject: [PATCH 13/14] Generate --- .../templates.runtime_renderers.dart | 153 +++--------------- 1 file changed, 22 insertions(+), 131 deletions(-) diff --git a/lib/src/generator/templates.runtime_renderers.dart b/lib/src/generator/templates.runtime_renderers.dart index 329f6ed402..55cd858b0d 100644 --- a/lib/src/generator/templates.runtime_renderers.dart +++ b/lib/src/generator/templates.runtime_renderers.dart @@ -484,7 +484,7 @@ class _Renderer_Accessor extends RendererBase { self.renderSimpleVariable( c, remainingNames, - 'SubstitutedExecutableElementImpl', + 'ExecutableElement', ), isNullValue: (CT_ c) => c.originalMember == null, @@ -502,8 +502,7 @@ class _Renderer_Accessor extends RendererBase { r.template, sink, parent: r, - getters: - _invisibleGetters['SubstitutedExecutableElementImpl']!, + getters: _invisibleGetters['ExecutableElement']!, ); }, ), @@ -2363,7 +2362,7 @@ class _Renderer_Category extends RendererBase { } } -String renderCategoryRedirect(CategoryTemplateData context, Template template) { +String renderCategory(CategoryTemplateData context, Template template) { var buffer = StringBuffer(); _render_CategoryTemplateData(context, template.ast, template, buffer); return buffer.toString(); @@ -2613,7 +2612,7 @@ class _Renderer_CategoryTemplateData } } -String renderCategory(CategoryTemplateData context, Template template) { +String renderCategoryRedirect(CategoryTemplateData context, Template template) { var buffer = StringBuffer(); _render_CategoryTemplateData(context, template.ast, template, buffer); return buffer.toString(); @@ -15131,7 +15130,7 @@ class _Renderer_Method extends RendererBase { self.renderSimpleVariable( c, remainingNames, - 'SubstitutedExecutableElementImpl', + 'ExecutableElement', ), isNullValue: (CT_ c) => c.originalMember == null, @@ -15149,8 +15148,7 @@ class _Renderer_Method extends RendererBase { r.template, sink, parent: r, - getters: - _invisibleGetters['SubstitutedExecutableElementImpl']!, + getters: _invisibleGetters['ExecutableElement']!, ); }, ), @@ -17196,11 +17194,7 @@ class _Renderer_ModelElement extends RendererBase { getValue: (CT_ c) => c.originalMember, renderVariable: (CT_ c, Property self, List remainingNames) => - self.renderSimpleVariable( - c, - remainingNames, - 'SubstitutedElementImpl', - ), + self.renderSimpleVariable(c, remainingNames, 'Element'), isNullValue: (CT_ c) => c.originalMember == null, @@ -17217,7 +17211,7 @@ class _Renderer_ModelElement extends RendererBase { r.template, sink, parent: r, - getters: _invisibleGetters['SubstitutedElementImpl']!, + getters: _invisibleGetters['Element']!, ); }, ), @@ -20477,7 +20471,7 @@ class _Renderer_Parameter extends RendererBase { self.renderSimpleVariable( c, remainingNames, - 'SubstitutedFormalParameterElementImpl', + 'FormalParameterElement', ), isNullValue: (CT_ c) => c.originalMember == null, @@ -20495,8 +20489,7 @@ class _Renderer_Parameter extends RendererBase { r.template, sink, parent: r, - getters: - _invisibleGetters['SubstitutedFormalParameterElementImpl']!, + getters: _invisibleGetters['FormalParameterElement']!, ); }, ), @@ -25608,6 +25601,18 @@ const _invisibleGetters = { 'hashCode', 'runtimeType', }, + 'ExecutableElement': { + 'baseElement', + 'firstFragment', + 'fragments', + 'hasImplicitReturnType', + 'hashCode', + 'isAbstract', + 'isExtensionTypeMember', + 'isExternal', + 'isStatic', + 'runtimeType', + }, 'ExtensionElement': { 'extendedType', 'firstFragment', @@ -25947,120 +25952,6 @@ const _invisibleGetters = { 'variable3', }, 'Scope': {'hashCode', 'runtimeType'}, - 'SubstitutedElementImpl': { - 'baseElement', - 'displayName', - 'hashCode', - 'id', - 'isPrivate', - 'isPublic', - 'isSynthetic', - 'kind', - 'lookupName', - 'name', - 'name3', - 'nonSynthetic', - 'nonSynthetic2', - 'runtimeType', - 'session', - 'substitution', - }, - 'SubstitutedExecutableElementImpl': { - 'baseElement', - 'children', - 'children2', - 'displayName', - 'documentationComment', - 'enclosingElement', - 'enclosingElement2', - 'firstFragment', - 'formalParameters', - 'fragments', - 'hasImplicitReturnType', - 'hashCode', - 'id', - 'isAbstract', - 'isExtensionTypeMember', - 'isExternal', - 'isPrivate', - 'isPublic', - 'isSimplyBounded', - 'isStatic', - 'isSynthetic', - 'kind', - 'library', - 'library2', - 'lookupName', - 'metadata', - 'metadata2', - 'name', - 'name3', - 'nonSynthetic', - 'nonSynthetic2', - 'returnType', - 'runtimeType', - 'session', - 'substitution', - 'type', - 'typeParameters', - 'typeParameters2', - }, - 'SubstitutedFormalParameterElementImpl': { - 'baseElement', - 'children', - 'children2', - 'constantInitializer', - 'defaultValueCode', - 'displayName', - 'documentationComment', - 'enclosingElement', - 'enclosingElement2', - 'firstFragment', - 'formalParameters', - 'fragments', - 'hasDefaultValue', - 'hasImplicitType', - 'hashCode', - 'id', - 'isConst', - 'isCovariant', - 'isFinal', - 'isInitializingFormal', - 'isLate', - 'isNamed', - 'isOptional', - 'isOptionalNamed', - 'isOptionalPositional', - 'isPositional', - 'isPrivate', - 'isPublic', - 'isRequired', - 'isRequiredNamed', - 'isRequiredPositional', - 'isStatic', - 'isSuperFormal', - 'isSynthetic', - 'kind', - 'library', - 'library2', - 'lookupName', - 'metadata', - 'metadata2', - 'name', - 'name3', - 'nameShared', - 'nonSynthetic', - 'nonSynthetic2', - 'parameterKind', - 'runtimeType', - 'session', - 'sinceSdkVersion', - 'substitution', - 'type', - 'typeParameters', - 'typeParameters2', - 'typeShared', - }, 'TemplateOptions': { 'customFooterContent', 'customHeaderContent', From 897220682c622794c1cbdced9a996345ade2bc61 Mon Sep 17 00:00:00 2001 From: Fedor Shcheglov Date: Mon, 18 Aug 2025 14:36:19 -0700 Subject: [PATCH 14/14] changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 062c63a68a..e6564ce7a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ * Remove the deprecated `nodoc` option. * Remove the deprecated `include-external` option. * Refactor 404 error page to use div instead of p for search form. +* Require analyzer 8.1.1 APIs. +* Many internal migrations for analyzer APIs. ## 8.3.4 * The URL for category pages now uses _category name_ instead of