From d943ba357c785907eedb37238825af70a0c4b542 Mon Sep 17 00:00:00 2001 From: Keerti Parthasarathy Date: Tue, 21 Jan 2025 21:22:08 -0800 Subject: [PATCH 1/2] Elements. Migrate to Element2 --- lib/src/model/library.dart | 3 +- lib/src/warnings.dart | 10 ++++ test/documentation_comment_test.dart | 6 +- test/end2end/dartdoc_test.dart | 4 +- .../runtime_renderer_builder_test.dart | 48 +++++++-------- test/src/utils.dart | 2 - tool/mustachio/codegen_aot_compiler.dart | 60 +++++++++---------- 7 files changed, 67 insertions(+), 66 deletions(-) diff --git a/lib/src/model/library.dart b/lib/src/model/library.dart index 1864226681..a0670d3757 100644 --- a/lib/src/model/library.dart +++ b/lib/src/model/library.dart @@ -11,6 +11,7 @@ import 'package:analyzer/dart/element/scope.dart'; import 'package:analyzer/source/line_info.dart'; // ignore: implementation_imports import 'package:analyzer/src/dart/element/element.dart'; +// ignore: implementation_imports import 'package:dartdoc/src/model/comment_referable.dart'; import 'package:dartdoc/src/model/kind.dart'; import 'package:dartdoc/src/model/model.dart'; @@ -315,7 +316,7 @@ class Library extends ModelElement /// The real packageMeta, as opposed to the package we are documenting with. late final PackageMeta? packageMeta = - packageGraph.packageMetaProvider.fromElement(element2, config.sdkDir); + packageGraph.packageMetaProvider.fromElement(element as LibraryElementImpl, config.sdkDir); late final List classesAndExceptions = [ ..._localElementsOfType(), diff --git a/lib/src/warnings.dart b/lib/src/warnings.dart index 7273617581..a0a19a531a 100644 --- a/lib/src/warnings.dart +++ b/lib/src/warnings.dart @@ -8,7 +8,10 @@ import 'dart:io'; import 'dart:math' as math; import 'package:analyzer/dart/element/element.dart'; +import 'package:analyzer/dart/element/element2.dart'; import 'package:analyzer/file_system/file_system.dart'; +// ignore: implementation_imports +import 'package:analyzer/src/utilities/extensions/element.dart'; import 'package:collection/collection.dart'; import 'package:dartdoc/src/dartdoc_options.dart'; import 'package:dartdoc/src/logging.dart'; @@ -498,6 +501,13 @@ class PackageWarningCounter { UnmodifiableMapView>> get countedWarnings => UnmodifiableMapView(_countedWarnings); + /// An unmodifiable map view of all counted warnings related by their element, + /// warning type, and message. + UnmodifiableMapView>> + get countedWarnings2 => UnmodifiableMapView(_countedWarnings.map((key, + value) => + MapEntry(key != null ? (key.asElement2 as Element2) : null, value))); + PackageWarningCounter(this.packageGraph); /// Logs [packageWarning]. diff --git a/test/documentation_comment_test.dart b/test/documentation_comment_test.dart index 8eaaa3c592..0d2f108cf1 100644 --- a/test/documentation_comment_test.dart +++ b/test/documentation_comment_test.dart @@ -2,8 +2,6 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -// ignore_for_file: analyzer_use_new_elements - import 'package:analyzer/file_system/file_system.dart'; import 'package:dartdoc/src/dartdoc_options.dart'; import 'package:dartdoc/src/model/model.dart'; @@ -30,7 +28,7 @@ class DocumentationCommentTest extends DartdocTestBase { late ModelElement libraryModel; void expectNoWarnings() { - expect(packageGraph.packageWarningCounter.countedWarnings, isEmpty); + expect(packageGraph.packageWarningCounter.countedWarnings2, isEmpty); expect(packageGraph.packageWarningCounter.hasWarnings, isFalse); } @@ -863,7 +861,7 @@ class _HasWarning extends Matcher { Map matchState, bool verbose) { if (actual is ModelElement) { var warnings = actual - .packageGraph.packageWarningCounter.countedWarnings[actual.element]; + .packageGraph.packageWarningCounter.countedWarnings2[actual.element2]; if (warnings == null) { return mismatchDescription.add('has no warnings'); } diff --git a/test/end2end/dartdoc_test.dart b/test/end2end/dartdoc_test.dart index 928ea9e421..959cc69b85 100644 --- a/test/end2end/dartdoc_test.dart +++ b/test/end2end/dartdoc_test.dart @@ -2,8 +2,6 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -// ignore_for_file: analyzer_use_new_elements - import 'dart:async'; import 'package:analyzer/file_system/file_system.dart'; @@ -84,7 +82,7 @@ void main() { await buildDartdoc(['--allow-tools'], testPackageToolError, tempDir); var results = await dartdoc.generateDocsBase(); var p = results.packageGraph; - var unresolvedToolErrors = p.packageWarningCounter.countedWarnings.values + var unresolvedToolErrors = p.packageWarningCounter.countedWarnings2.values .map((e) => e[PackageWarning.toolError] ?? {}) .expand((element) => element); diff --git a/test/mustachio/runtime_renderer_builder_test.dart b/test/mustachio/runtime_renderer_builder_test.dart index 536ac68f3f..ce5c21ae59 100644 --- a/test/mustachio/runtime_renderer_builder_test.dart +++ b/test/mustachio/runtime_renderer_builder_test.dart @@ -2,15 +2,13 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -// ignore_for_file: analyzer_use_new_elements - @TestOn('vm && !windows') @Timeout.factor(2) library; import 'dart:io'; -import 'package:analyzer/dart/element/element.dart'; +import 'package:analyzer/dart/element/element2.dart'; import 'package:test/test.dart'; import 'package:test_descriptor/test_descriptor.dart' as d; @@ -18,7 +16,7 @@ import 'builder_test_base.dart'; void main() { group('builds a renderer class', () { - late final LibraryElement renderersLibrary; + late final LibraryElement2 renderersLibrary; late final String generatedContent; // Builders are fairly expensive (about 4 seconds per `testBuilder` call), @@ -42,7 +40,7 @@ abstract class Foo extends FooBase with Mix { class Bar {} class Baz {} '''); - renderersLibrary = await resolveGeneratedLibrary(runtimeRenderersPath); + renderersLibrary = await resolveGeneratedLibrary2(runtimeRenderersPath); generatedContent = await File(runtimeRenderersPath).readAsString(); }); @@ -63,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.getClass('_Renderer_FooBase'), isNotNull); + expect(renderersLibrary.getClass2('_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.getClass('_Renderer_Mix'), isNotNull); + expect(renderersLibrary.getClass2('_Renderer_Mix'), isNotNull); }); test('for a type found in a getter', () { expect(renderersLibrary.getTopLevelFunction('_render_Bar'), isNotNull); - expect(renderersLibrary.getClass('_Renderer_Bar'), isNotNull); + expect(renderersLibrary.getClass2('_Renderer_Bar'), isNotNull); }); test('for a generic, bounded type found in a getter', () { expect(renderersLibrary.getTopLevelFunction('_render_Baz'), isNotNull); - expect(renderersLibrary.getClass('_Renderer_Baz'), isNotNull); + expect(renderersLibrary.getClass2('_Renderer_Baz'), isNotNull); }); test('with a property map', () { @@ -190,12 +188,12 @@ class Baz {} library foo; import 'annotations.dart'; '''); - var renderersLibrary = await resolveGeneratedLibrary(runtimeRenderersPath); + var renderersLibrary = await resolveGeneratedLibrary2(runtimeRenderersPath); expect(renderersLibrary.getTopLevelFunction('renderFoo'), isNotNull); expect(renderersLibrary.getTopLevelFunction('renderBar'), isNotNull); - expect(renderersLibrary.getClass('_Renderer_Foo'), isNotNull); - expect(renderersLibrary.getClass('_Renderer_Bar'), isNotNull); + expect(renderersLibrary.getClass2('_Renderer_Foo'), isNotNull); + expect(renderersLibrary.getClass2('_Renderer_Bar'), isNotNull); }); group('builds a renderer class for a generic type', () { @@ -267,21 +265,21 @@ class Foo { class Bar {} class Baz {} '''); - var renderersLibrary = await resolveGeneratedLibrary(runtimeRenderersPath); + var renderersLibrary = await resolveGeneratedLibrary2(runtimeRenderersPath); var fooRenderFunction = renderersLibrary.getTopLevelFunction('renderFoo')!; - expect(fooRenderFunction.typeParameters, hasLength(1)); - var fBound = fooRenderFunction.typeParameters.single.bound!; + expect(fooRenderFunction.typeParameters2, hasLength(1)); + var fBound = fooRenderFunction.typeParameters2.single.bound!; expect(fBound.getDisplayString(), equals('num')); - var fooRendererClass = renderersLibrary.getClass('_Renderer_Foo')!; - expect(fooRendererClass.typeParameters, hasLength(1)); - var cBound = fooRenderFunction.typeParameters.single.bound!; + var fooRendererClass = renderersLibrary.getClass2('_Renderer_Foo')!; + expect(fooRendererClass.typeParameters2, hasLength(1)); + var cBound = fooRenderFunction.typeParameters2.single.bound!; expect(cBound.getDisplayString(), equals('num')); }); group('does not generate a renderer', () { - late final LibraryElement renderersLibrary; + late final LibraryElement2 renderersLibrary; setUpAll(() async { await testMustachioBuilder(''' @@ -299,32 +297,32 @@ class Private {} class Setter {} class Method {} '''); - renderersLibrary = await resolveGeneratedLibrary(runtimeRenderersPath); + renderersLibrary = await resolveGeneratedLibrary2(runtimeRenderersPath); }); test('found in a static getter', () { expect(renderersLibrary.getTopLevelFunction('_render_Static'), isNull); - expect(renderersLibrary.getClass('_Renderer_Static'), isNull); + expect(renderersLibrary.getClass2('_Renderer_Static'), isNull); }); test('found in a private getter', () { expect(renderersLibrary.getTopLevelFunction('_render_Private'), isNull); - expect(renderersLibrary.getClass('_Renderer_Private'), isNull); + expect(renderersLibrary.getClass2('_Renderer_Private'), isNull); }); test('found in a setter', () { expect(renderersLibrary.getTopLevelFunction('_render_Setter'), isNull); - expect(renderersLibrary.getClass('_Renderer_Setter'), isNull); + expect(renderersLibrary.getClass2('_Renderer_Setter'), isNull); }); test('found in a method', () { expect(renderersLibrary.getTopLevelFunction('_render_Method'), isNull); - expect(renderersLibrary.getClass('_Renderer_Method'), isNull); + expect(renderersLibrary.getClass2('_Renderer_Method'), isNull); }); test('for types not @visibleToMustache', () { expect(renderersLibrary.getTopLevelFunction('_render_String'), isNull); - expect(renderersLibrary.getClass('_Renderer_String'), isNull); + expect(renderersLibrary.getClass2('_Renderer_String'), isNull); }); }); } diff --git a/test/src/utils.dart b/test/src/utils.dart index 28f5d2ae01..d43db63a8b 100644 --- a/test/src/utils.dart +++ b/test/src/utils.dart @@ -2,8 +2,6 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -// ignore_for_file: analyzer_use_new_elements - import 'dart:io'; import 'package:analyzer/file_system/file_system.dart'; diff --git a/tool/mustachio/codegen_aot_compiler.dart b/tool/mustachio/codegen_aot_compiler.dart index 6d99c41e1b..114b20cdde 100644 --- a/tool/mustachio/codegen_aot_compiler.dart +++ b/tool/mustachio/codegen_aot_compiler.dart @@ -2,11 +2,9 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -// ignore_for_file: analyzer_use_new_elements - import 'dart:io'; -import 'package:analyzer/dart/element/element.dart'; +import 'package:analyzer/dart/element/element2.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:analyzer/dart/element/type_provider.dart'; import 'package:analyzer/dart/element/type_system.dart'; @@ -217,22 +215,22 @@ Future _redirectingMethod( var buffer = StringBuffer()..write('String ${compiler._rendererName}'); buffer.writeTypeParameters( - compiler._usedContextStack.expand((c) => c.type.element.typeParameters)); + compiler._usedContextStack.expand((c) => c.type.element3.typeParameters2)); buffer.write('('); for (var context in compiler._usedContextStack) { - var contextElement = context.type.element; + var contextElement = context.type.element3; buffer.write(contextElement.displayName); - if (contextElement.typeParameters.isNotEmpty) { + if (contextElement.typeParameters2.isNotEmpty) { buffer.write('<'); } - for (var tp in contextElement.typeParameters) { - buffer.write(tp.name); - if (tp != contextElement.typeParameters.last) { + for (var tp in contextElement.typeParameters2) { + buffer.write(tp.name3); + if (tp != contextElement.typeParameters2.last) { buffer.write(', '); } } - if (contextElement.typeParameters.isNotEmpty) { + if (contextElement.typeParameters2.isNotEmpty) { buffer.write('>'); } buffer.write(' ${context.name}'); @@ -372,7 +370,7 @@ class _AotCompiler { // this should be perfectly possible. var referenceElements = buffer.writeTypeParameters( - _usedContexts.expand((c) => c.type.element.typeParameters), + _usedContexts.expand((c) => c.type.element3.typeParameters2), ); for (var element in referenceElements) { referenceUris.add(_elementUri(element)); @@ -380,19 +378,19 @@ class _AotCompiler { buffer.write('('); for (var context in _usedContexts) { - var contextElement = context.type.element; + var contextElement = context.type.element3; referenceUris.add(_elementUri(contextElement)); buffer.write(contextElement.displayName); - if (contextElement.typeParameters.isNotEmpty) { + if (contextElement.typeParameters2.isNotEmpty) { buffer.write('<'); } - for (var tp in contextElement.typeParameters) { - buffer.write(tp.name); - if (tp != contextElement.typeParameters.last) { + for (var tp in contextElement.typeParameters2) { + buffer.write(tp.name3); + if (tp != contextElement.typeParameters2.last) { buffer.write(', '); } } - if (contextElement.typeParameters.isNotEmpty) { + if (contextElement.typeParameters2.isNotEmpty) { buffer.write('>'); } buffer.write(' ${context.name}'); @@ -410,9 +408,9 @@ class _AotCompiler { } /// Returns the URI of [element] for use in generated import directives. - String _elementUri(Element element) { - var libraryElement = element.library!; - var libraryUri = libraryElement.source.uri; + String _elementUri(Element2 element) { + var libraryElement = element.library2!; + var libraryUri = libraryElement.firstFragment.source.uri; if (libraryUri.scheme == 'file') { return path.relative(libraryUri.path, from: path.absolute(path.dirname(_buildData._sourcePath))); @@ -581,8 +579,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.iterableElement; - var iterableType = variableLookup.type.asInstanceOf(iterableElement)!; + var iterableElement = typeProvider.iterableElement2; + var iterableType = variableLookup.type.asInstanceOf2(iterableElement)!; var innerContextType = iterableType.typeArguments.first as InterfaceType; var innerContext = _VariableLookup(innerContextType, newContextName); _contextStack.push(innerContext); @@ -638,9 +636,9 @@ class _BlockCompiler { var primaryName = key[0]; late _VariableLookup context; - PropertyAccessorElement? getter; + GetterElement? getter; for (var c in _contextStack) { - getter = c.type.lookUpGetter2(primaryName, contextType.element.library); + getter = c.type.lookUpGetter3(primaryName, contextType.element3.library2); if (getter != null) { context = c; _usedContextTypes.add(c); @@ -665,7 +663,7 @@ class _BlockCompiler { : '${context.name}.$primaryName'; var remainingNames = [...key.skip(1)]; for (var secondaryKey in remainingNames) { - getter = type.lookUpGetter2(secondaryKey, type.element.library); + getter = type.lookUpGetter3(secondaryKey, type.element3.library2); if (getter == null) { throw MustachioResolutionException(node.keySpan.message( "Failed to resolve '$secondaryKey' on ${context.type} while " @@ -923,9 +921,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) { @@ -937,11 +935,11 @@ extension on StringBuffer { var bound = typeParameter.bound; if (bound == null) { - write(typeParameter.name); + write(typeParameter.name3); } else { - var boundElement = bound.documentableElement!; + var boundElement = bound.documentableElement2!; referencedElements.add(boundElement); - write('${typeParameter.name} extends ${boundElement.name!}'); + write('${typeParameter.name3} extends ${boundElement.name3!}'); } } if (hasTypeParameters) { From f704d84adaede23a2bef9015a09d3aee9351891a Mon Sep 17 00:00:00 2001 From: Keerti Parthasarathy Date: Fri, 24 Jan 2025 08:16:46 -0800 Subject: [PATCH 2/2] Address comments --- lib/src/model/library.dart | 6 +++--- lib/src/warnings.dart | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/src/model/library.dart b/lib/src/model/library.dart index a0670d3757..5f09fe3c55 100644 --- a/lib/src/model/library.dart +++ b/lib/src/model/library.dart @@ -10,7 +10,7 @@ import 'package:analyzer/dart/element/element2.dart'; import 'package:analyzer/dart/element/scope.dart'; import 'package:analyzer/source/line_info.dart'; // ignore: implementation_imports -import 'package:analyzer/src/dart/element/element.dart'; +import 'package:analyzer/src/utilities/extensions/element.dart'; // ignore: implementation_imports import 'package:dartdoc/src/model/comment_referable.dart'; import 'package:dartdoc/src/model/kind.dart'; @@ -30,7 +30,7 @@ class Library extends ModelElement final LibraryElement element; @override - LibraryElement2 get element2 => element as LibraryElementImpl; + LibraryElement2 get element2 => element.asElement2; /// The set of [Element]s declared directly in this library. final Set _localElements; @@ -316,7 +316,7 @@ class Library extends ModelElement /// The real packageMeta, as opposed to the package we are documenting with. late final PackageMeta? packageMeta = - packageGraph.packageMetaProvider.fromElement(element as LibraryElementImpl, config.sdkDir); + packageGraph.packageMetaProvider.fromElement(element.asElement2, config.sdkDir); late final List classesAndExceptions = [ ..._localElementsOfType(), diff --git a/lib/src/warnings.dart b/lib/src/warnings.dart index a0a19a531a..020278c9c4 100644 --- a/lib/src/warnings.dart +++ b/lib/src/warnings.dart @@ -506,7 +506,7 @@ class PackageWarningCounter { UnmodifiableMapView>> get countedWarnings2 => UnmodifiableMapView(_countedWarnings.map((key, value) => - MapEntry(key != null ? (key.asElement2 as Element2) : null, value))); + MapEntry(key?.asElement2, value))); PackageWarningCounter(this.packageGraph);