Skip to content

Commit 5e26cb6

Browse files
authored
Elements. Migrate to Element2 (#3967)
1 parent 021c397 commit 5e26cb6

File tree

12 files changed

+159
-45
lines changed

12 files changed

+159
-45
lines changed

lib/src/dartdoc_options.dart

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
// ignore_for_file: analyzer_use_new_elements
6-
75
/// dartdoc's dartdoc_options.yaml configuration file follows similar loading
86
/// semantics to that of analysis_options.yaml,
97
/// [documented here](https://dart.dev/guides/language/analysis-options).
@@ -16,7 +14,7 @@ library;
1614

1715
import 'dart:io' show exitCode, stderr, stdout;
1816

19-
import 'package:analyzer/dart/element/element.dart';
17+
import 'package:analyzer/dart/element/element2.dart';
2018
import 'package:analyzer/file_system/file_system.dart';
2119
import 'package:args/args.dart';
2220
import 'package:dartdoc/src/dartdoc.dart' show dartdocVersion, programName;
@@ -1130,18 +1128,18 @@ class DartdocOptionContext extends DartdocOptionContextBase
11301128
/// Build a DartdocOptionContext from an analyzer element (using its source
11311129
/// location).
11321130
factory DartdocOptionContext.fromElement(DartdocOptionSet optionSet,
1133-
LibraryElement libraryElement, ResourceProvider resourceProvider) {
1131+
LibraryElement2 libraryElement, ResourceProvider resourceProvider) {
11341132
return DartdocOptionContext(
11351133
optionSet,
1136-
resourceProvider.getFile(libraryElement.source.fullName),
1134+
resourceProvider.getFile(libraryElement.firstFragment.source.fullName),
11371135
resourceProvider);
11381136
}
11391137

11401138
/// Build a DartdocOptionContext from an existing [DartdocOptionContext] and a
1141-
/// new analyzer [Element].
1139+
/// new analyzer [Element2].
11421140
factory DartdocOptionContext.fromContextElement(
11431141
DartdocOptionContext optionContext,
1144-
LibraryElement libraryElement,
1142+
LibraryElement2 libraryElement,
11451143
ResourceProvider resourceProvider) {
11461144
return DartdocOptionContext.fromElement(
11471145
optionContext.optionSet, libraryElement, resourceProvider);

lib/src/element_type.dart

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,11 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
// ignore_for_file: analyzer_use_new_elements
6-
75
/// The models used to represent Dart types, all subclasses of [ElementType].
86
///
97
/// The only entrypoint for constructing these classes is [ElementType.for_].
108
library;
119

12-
import 'package:analyzer/dart/element/element.dart';
1310
import 'package:analyzer/dart/element/element2.dart';
1411
import 'package:analyzer/dart/element/nullability_suffix.dart';
1512
import 'package:analyzer/dart/element/type.dart';
@@ -37,13 +34,13 @@ abstract class ElementType with CommentReferable, Nameable {
3734
factory ElementType.for_(
3835
DartType type, Library library, PackageGraph packageGraph) {
3936
runtimeStats.incrementAccumulator('elementTypeInstantiation');
40-
var fElement = type.documentableElement;
37+
var fElement = type.documentableElement2;
4138
if (fElement == null ||
4239
fElement.kind == ElementKind.DYNAMIC ||
4340
fElement.kind == ElementKind.NEVER) {
4441
return UndefinedElementType._from(type, library, packageGraph);
4542
}
46-
var modelElement = packageGraph.getModelForElement(fElement);
43+
var modelElement = packageGraph.getModelForElement2(fElement);
4744
return DefinedElementType._from(type, modelElement, library, packageGraph);
4845
}
4946

@@ -70,7 +67,7 @@ abstract class ElementType with CommentReferable, Nameable {
7067
String toString() => '$type';
7168
}
7269

73-
/// An [ElementType] that isn't pinned to an [Element] (or one that is, but
70+
/// An [ElementType] that isn't pinned to an [Element2] (or one that is, but
7471
/// whose element is irrelevant).
7572
class UndefinedElementType extends ElementType {
7673
UndefinedElementType._(super.type, super.library, super.packageGraph)
@@ -105,9 +102,9 @@ class UndefinedElementType extends ElementType {
105102
// We can not simply throw here because not all SDK libraries resolve
106103
// all types.
107104
if (type is InvalidType) return 'dynamic';
108-
assert(const {'Never'}.contains(type.documentableElement?.name),
105+
assert(const {'Never'}.contains(type.documentableElement2?.name3),
109106
'Unrecognized type for UndefinedElementType: $type');
110-
return type.documentableElement!.name!;
107+
return type.documentableElement2!.name3!;
111108
}
112109

113110
@override
@@ -132,15 +129,15 @@ class UndefinedElementType extends ElementType {
132129
Iterable<CommentReferable>? get referenceGrandparentOverrides => null;
133130
}
134131

135-
/// A [FunctionType] that does not have an underpinning [Element].
132+
/// A [FunctionType] that does not have an underpinning [Element2].
136133
class FunctionTypeElementType extends UndefinedElementType
137134
with Rendered, Callable {
138135
FunctionTypeElementType._(
139136
FunctionType super.type, super.library, super.packageGraph)
140137
: super._();
141138

142-
List<TypeParameter> get typeFormals => type.typeFormals
143-
.map((p) => getModelFor(p, library) as TypeParameter)
139+
List<TypeParameter> get typeFormals => type.typeParameters
140+
.map((p) => getModelFor2(p, library) as TypeParameter)
144141
.toList(growable: false);
145142

146143
@override
@@ -208,18 +205,16 @@ class ParameterizedElementType extends DefinedElementType with Rendered {
208205

209206
/// An [ElementType] whose underlying type was referred to by a type alias.
210207
mixin Aliased implements ElementType {
211-
Element get typeAliasElement => type.alias!.element;
212-
213208
Element2 get typeAliasElement2 => type.alias!.element2;
214209

215210
@override
216-
String get name => typeAliasElement.name!;
211+
String get name => typeAliasElement2.name3!;
217212

218213
@override
219214
bool get isTypedef => true;
220215

221216
late final ModelElement aliasElement =
222-
ModelElement.forElement(typeAliasElement, packageGraph);
217+
ModelElement.forElement2(typeAliasElement2, packageGraph);
223218

224219
late final List<ElementType> aliasArguments = type.alias!.typeArguments
225220
.map((f) => getTypeFor(f, library))
@@ -258,7 +253,7 @@ class TypeParameterElementType extends DefinedElementType {
258253
String get nameWithGenericsPlain => '$name$nullabilitySuffix';
259254
}
260255

261-
/// An [ElementType] associated with an [Element].
256+
/// An [ElementType] associated with an [Element2].
262257
abstract class DefinedElementType extends ElementType {
263258
final ModelElement modelElement;
264259

@@ -268,7 +263,7 @@ abstract class DefinedElementType extends ElementType {
268263

269264
factory DefinedElementType._from(DartType type, ModelElement modelElement,
270265
Library library, PackageGraph packageGraph) {
271-
if (type is! TypeAliasElement && type.alias != null) {
266+
if (type is! TypeAliasElement2 && type.alias != null) {
272267
// Here, `alias.element` signals that this is a type referring to an
273268
// alias. (`TypeAliasElement.alias.element` has different implications.
274269
// In that case it is an actual type alias of some kind (generic or
@@ -293,7 +288,7 @@ abstract class DefinedElementType extends ElementType {
293288
}
294289

295290
@override
296-
String get name => type.documentableElement!.name!;
291+
String get name => type.documentableElement2!.name3!;
297292

298293
@override
299294
String get fullyQualifiedName => modelElement.fullyQualifiedName;
@@ -327,14 +322,14 @@ abstract class DefinedElementType extends ElementType {
327322
@internal
328323
@override
329324
CommentReferable get definingCommentReferable =>
330-
ModelElement.forElement(modelElement.element, packageGraph);
325+
ModelElement.forElement2(modelElement.element2, packageGraph);
331326
}
332327

333328
/// Any callable [ElementType] will mix-in this class, whether anonymous or not,
334329
/// unless it is an alias reference.
335330
mixin Callable on ElementType {
336-
List<Parameter> get parameters => type.parameters
337-
.map((p) => getModelFor(p, library) as Parameter)
331+
List<Parameter> get parameters => type.formalParameters
332+
.map((p) => getModelFor2(p, library) as Parameter)
338333
.toList(growable: false);
339334

340335
late final ElementType returnType = getTypeFor(type.returnType, library);

lib/src/generator/generator_frontend.dart

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
// ignore_for_file: analyzer_use_new_elements
6-
75
import 'package:dartdoc/src/generator/generator.dart';
86
import 'package:dartdoc/src/generator/generator_backend.dart';
97
import 'package:dartdoc/src/generator/templates.dart';
@@ -151,7 +149,7 @@ class GeneratorFrontEnd implements Generator {
151149
for (var lib in package.libraries.whereDocumented) {
152150
if (!multiplePackages) {
153151
logInfo('Generating docs for library ${lib.breadcrumbName} from '
154-
'${lib.element.source.uri}...');
152+
'${lib.element2.firstFragment.source.uri}...');
155153
}
156154
if (!lib.isAnonymous && !lib.hasDocumentation) {
157155
packageGraph.warnOnElement(lib, PackageWarning.noLibraryLevelDocs);

lib/src/generator/templates.runtime_renderers.dart

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14112,7 +14112,7 @@ class _Renderer_LibraryContainer extends RendererBase<LibraryContainer> {
1411214112
}
1411314113
}
1411414114

14115-
String renderLibraryRedirect(LibraryTemplateData context, Template template) {
14115+
String renderLibrary(LibraryTemplateData context, Template template) {
1411614116
var buffer = StringBuffer();
1411714117
_render_LibraryTemplateData(context, template.ast, template, buffer);
1411814118
return buffer.toString();
@@ -14358,7 +14358,7 @@ class _Renderer_LibraryTemplateData extends RendererBase<LibraryTemplateData> {
1435814358
}
1435914359
}
1436014360

14361-
String renderLibrary(LibraryTemplateData context, Template template) {
14361+
String renderLibraryRedirect(LibraryTemplateData context, Template template) {
1436214362
var buffer = StringBuffer();
1436314363
_render_LibraryTemplateData(context, template.ast, template, buffer);
1436414364
return buffer.toString();
@@ -16631,6 +16631,34 @@ class _Renderer_ModelElement extends RendererBase<ModelElement> {
1663116631
);
1663216632
},
1663316633
),
16634+
'element2': Property(
16635+
getValue: (CT_ c) => c.element2,
16636+
renderVariable:
16637+
(CT_ c, Property<CT_> self, List<String> remainingNames) =>
16638+
self.renderSimpleVariable(
16639+
c,
16640+
remainingNames,
16641+
'Element2',
16642+
),
16643+
16644+
isNullValue: (CT_ c) => false,
16645+
16646+
renderValue: (
16647+
CT_ c,
16648+
RendererBase<CT_> r,
16649+
List<MustachioNode> ast,
16650+
StringSink sink,
16651+
) {
16652+
renderSimple(
16653+
c.element2,
16654+
ast,
16655+
r.template,
16656+
sink,
16657+
parent: r,
16658+
getters: _invisibleGetters['Element2']!,
16659+
);
16660+
},
16661+
),
1663416662
'enclosingElement': Property(
1663516663
getValue: (CT_ c) => c.enclosingElement,
1663616664
renderVariable: (
@@ -25825,6 +25853,26 @@ const _invisibleGetters = {
2582525853
'sinceSdkVersion',
2582625854
'source',
2582725855
},
25856+
'Element2': {
25857+
'baseElement',
25858+
'children2',
25859+
'displayName',
25860+
'enclosingElement2',
25861+
'firstFragment',
25862+
'fragments',
25863+
'hashCode',
25864+
'id',
25865+
'isPrivate',
25866+
'isPublic',
25867+
'isSynthetic',
25868+
'kind',
25869+
'library2',
25870+
'lookupName',
25871+
'name3',
25872+
'nonSynthetic2',
25873+
'runtimeType',
25874+
'session',
25875+
},
2582825876
'EnumElement': {
2582925877
'augmentation',
2583025878
'augmentationTarget',

lib/src/model/library.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class Library extends ModelElement
2828
@override
2929
final LibraryElement element;
3030

31+
@override
3132
LibraryElement2 get element2 => element as LibraryElementImpl;
3233

3334
/// The set of [Element]s declared directly in this library.

lib/src/model/model_element.dart

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,14 @@ import 'dart:collection';
1111
import 'dart:convert';
1212

1313
import 'package:analyzer/dart/element/element.dart';
14+
import 'package:analyzer/dart/element/element2.dart';
1415
import 'package:analyzer/dart/element/type.dart' show FunctionType;
1516
import 'package:analyzer/source/line_info.dart';
1617
// ignore: implementation_imports
1718
import 'package:analyzer/src/dart/element/member.dart'
1819
show ExecutableMember, Member, ParameterMember;
20+
// ignore: implementation_imports
21+
import 'package:analyzer/src/utilities/extensions/element.dart';
1922
import 'package:dartdoc/src/dartdoc_options.dart';
2023
import 'package:dartdoc/src/model/annotation.dart';
2124
import 'package:dartdoc/src/model/attribute.dart';
@@ -109,6 +112,15 @@ abstract class ModelElement
109112
return ModelElement.for_(e, library, p);
110113
}
111114

115+
/// Returns a [ModelElement] for an [Element2], which can be a
116+
/// property-inducing element or not.
117+
///
118+
/// This constructor is used when the caller does not know the element's
119+
/// library, or whether it is property-inducing.
120+
factory ModelElement.forElement2(Element2 e, PackageGraph p) {
121+
return ModelElement.forElement(e.asElement!, p);
122+
}
123+
112124
/// Returns a [ModelElement] for a property-inducing element.
113125
///
114126
/// Do not construct any [ModelElement]s except from this constructor or
@@ -432,7 +444,7 @@ abstract class ModelElement
432444
@override
433445
late final DartdocOptionContext config =
434446
DartdocOptionContext.fromContextElement(
435-
packageGraph.config, library.element, packageGraph.resourceProvider);
447+
packageGraph.config, library.element2, packageGraph.resourceProvider);
436448

437449
bool get hasAttributes => attributes.isNotEmpty;
438450

@@ -546,6 +558,8 @@ abstract class ModelElement
546558
@override
547559
Element get element;
548560

561+
Element2 get element2 => element.asElement2!;
562+
549563
@override
550564
String get location {
551565
// Call nothing from here that can emit warnings or you'll cause stack

lib/src/model/nameable.dart

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55
// ignore_for_file: analyzer_use_new_elements
66

77
import 'package:analyzer/dart/element/element.dart';
8+
import 'package:analyzer/dart/element/element2.dart';
89
import 'package:analyzer/dart/element/type.dart' show DartType;
10+
// ignore: implementation_imports
11+
import 'package:analyzer/src/utilities/extensions/element.dart';
912
import 'package:collection/collection.dart';
1013
import 'package:dartdoc/src/element_type.dart';
1114
import 'package:dartdoc/src/model/accessor.dart';
@@ -66,13 +69,35 @@ mixin Nameable {
6669
enclosingContainer: enclosingContainer,
6770
);
6871

72+
/// Returns the [ModelElement] for [element], instantiating it if needed.
73+
///
74+
/// A convenience method for [ModelElement.for_], see its documentation.
75+
ModelElement getModelFor2(
76+
Element2 element,
77+
Library library, {
78+
Container? enclosingContainer,
79+
}) =>
80+
ModelElement.for_(
81+
element.asElement!,
82+
library,
83+
packageGraph,
84+
enclosingContainer: enclosingContainer,
85+
);
86+
6987
/// Returns the [ModelElement] for [element], instantiating it if needed.
7088
///
7189
/// A convenience method for [ModelElement.forElement], see its
7290
/// documentation.
7391
ModelElement getModelForElement(Element element) =>
7492
ModelElement.forElement(element, packageGraph);
7593

94+
/// Returns the [ModelElement] for [element], instantiating it if needed.
95+
///
96+
/// A convenience method for [ModelElement.forElement], see its
97+
/// documentation.
98+
ModelElement getModelForElement2(Element2 element) =>
99+
ModelElement.forElement(element.asElement!, packageGraph);
100+
76101
/// Returns the [ModelElement] for [element], instantiating it if needed.
77102
///
78103
/// A convenience method for [ModelElement.forPropertyInducingElement], see

lib/src/model/typedef.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ abstract class Typedef extends ModelElement
1919
@override
2020
final TypeAliasElement element;
2121

22+
@override
2223
TypeAliasElement2 get element2 => element.asElement2;
2324

2425
Typedef(this.element, super.library, super.packageGraph);

0 commit comments

Comments
 (0)