From 1da4e8d3dace989eaa6cdbfb9c54fa823c65c31e Mon Sep 17 00:00:00 2001 From: Konstantin Shcheglov Date: Wed, 19 Feb 2025 10:38:49 -0800 Subject: [PATCH] Elements. Migrate SuperConstructorResolver. Change-Id: Ifd6d712f10b0d97a20e92a0be2d411111aca2852 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/410562 Commit-Queue: Konstantin Shcheglov Reviewed-by: Phil Quitslund --- .../lib/src/dart/element/element.dart | 4 ++ pkg/analyzer/lib/src/summary2/link.dart | 9 +++- .../summary2/super_constructor_resolver.dart | 46 +++++++++---------- 3 files changed, 33 insertions(+), 26 deletions(-) diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart index aa2c5de1344..401e91b9bf4 100644 --- a/pkg/analyzer/lib/src/dart/element/element.dart +++ b/pkg/analyzer/lib/src/dart/element/element.dart @@ -1718,6 +1718,10 @@ class ConstructorElementImpl2 extends ExecutableElementImpl2 (firstFragment.superConstructor?.declaration as ConstructorElementImpl?) ?.element; + set superConstructor2(ConstructorElement2? value) { + firstFragment.superConstructor = value?.asElement; + } + @override T? accept2(ElementVisitor2 visitor) { return visitor.visitConstructorElement(this); diff --git a/pkg/analyzer/lib/src/summary2/link.dart b/pkg/analyzer/lib/src/summary2/link.dart index 542baa2e55e..6d35597c3fc 100644 --- a/pkg/analyzer/lib/src/summary2/link.dart +++ b/pkg/analyzer/lib/src/summary2/link.dart @@ -12,7 +12,6 @@ import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/element2.dart'; import 'package:analyzer/src/context/context.dart'; import 'package:analyzer/src/dart/analysis/file_state.dart'; -import 'package:analyzer/src/dart/element/element.dart'; import 'package:analyzer/src/dart/element/inheritance_manager3.dart'; import 'package:analyzer/src/dart/element/name_union.dart'; import 'package:analyzer/src/summary2/bundle_writer.dart'; @@ -52,7 +51,7 @@ class Linker { /// Libraries that are being linked. final Map builders = {}; - final Map elementNodes = Map.identity(); + final Map elementNodes = Map.identity(); late InheritanceManager3 inheritance; // TODO(scheglov): cache it @@ -87,6 +86,12 @@ class Linker { return elementNodes[element.asElement]; } + /// If the [fragment] is part of a library being linked, return the node + /// from which it was created. + ast.AstNode? getLinkingNode3(Fragment fragment) { + return elementNodes[fragment]; + } + void link({ required OperationPerformanceImpl performance, required List inputLibraries, diff --git a/pkg/analyzer/lib/src/summary2/super_constructor_resolver.dart b/pkg/analyzer/lib/src/summary2/super_constructor_resolver.dart index 04d13c0156d..55535f24743 100644 --- a/pkg/analyzer/lib/src/summary2/super_constructor_resolver.dart +++ b/pkg/analyzer/lib/src/summary2/super_constructor_resolver.dart @@ -2,10 +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_for_file: analyzer_use_new_elements - import 'package:analyzer/dart/ast/ast.dart'; -import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/src/dart/element/element.dart'; import 'package:analyzer/src/summary2/link.dart'; @@ -18,19 +15,18 @@ class SuperConstructorResolver { void perform() { for (var builder in _linker.builders.values) { - for (var unitElement in builder.element.units) { - for (var classElement in unitElement.classes) { - for (var constructorElement in classElement.constructors) { - _constructor(classElement, constructorElement); - } + for (var classElement in builder.element.classes) { + for (var constructorElement in classElement.constructors2) { + _constructor(classElement, constructorElement); } } } } - void _constructor(ClassElement classElement, ConstructorElement element) { - element as ConstructorElementImpl; - + void _constructor( + ClassElementImpl2 classElement, + ConstructorElementImpl2 element, + ) { // Constructors of mixin applications are already configured. if (classElement.isMixinApplication) { return; @@ -42,24 +38,26 @@ class SuperConstructorResolver { } var invokesDefaultSuperConstructor = true; - var node = _linker.getLinkingNode(element); - if (node is ConstructorDeclaration) { - for (var initializer in node.initializers) { - if (initializer is RedirectingConstructorInvocation) { - invokesDefaultSuperConstructor = false; - } else if (initializer is SuperConstructorInvocation) { - invokesDefaultSuperConstructor = false; - var name = initializer.constructorName?.name ?? ''; - element.superConstructor = classElement.supertype?.constructors - .where((element) => element.name == name) - .firstOrNull; + for (var fragment in element.fragments) { + var node = _linker.getLinkingNode3(fragment); + if (node is ConstructorDeclaration) { + for (var initializer in node.initializers) { + if (initializer is RedirectingConstructorInvocation) { + invokesDefaultSuperConstructor = false; + } else if (initializer is SuperConstructorInvocation) { + invokesDefaultSuperConstructor = false; + var name = initializer.constructorName?.name ?? 'new'; + element.superConstructor2 = classElement.supertype?.constructors2 + .where((element) => element.name3 == name) + .firstOrNull; + } } } } if (invokesDefaultSuperConstructor) { - element.superConstructor = classElement.supertype?.constructors - .where((element) => element.name.isEmpty) + element.superConstructor2 = classElement.supertype?.constructors2 + .where((element) => element.name3 == 'new') .firstOrNull; } }