Elements. Migrate SuperConstructorResolver.

Change-Id: Ifd6d712f10b0d97a20e92a0be2d411111aca2852
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/410562
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Phil Quitslund <pquitslund@google.com>
This commit is contained in:
Konstantin Shcheglov
2025-02-19 10:38:49 -08:00
committed by Commit Queue
parent 7d45894908
commit 1da4e8d3da
3 changed files with 33 additions and 26 deletions
@@ -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<T>(ElementVisitor2<T> visitor) {
return visitor.visitConstructorElement(this);
+7 -2
View File
@@ -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<Uri, LibraryBuilder> builders = {};
final Map<ElementImpl, ast.AstNode> elementNodes = Map.identity();
final Map<Object, ast.AstNode> 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<LibraryFileKind> inputLibraries,
@@ -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;
}
}