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:
committed by
Commit Queue
parent
7d45894908
commit
1da4e8d3da
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user