Elements. Migrate AstRewriter.
Change-Id: I111acffc6a74ee72e371bcdad2f0db2f1d4b0d20
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/411100
Reviewed-by: Phil Quitslund <pquitslund@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 580db6d..5f8574a 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -6698,7 +6698,7 @@
final Token name;
@override
- final ExtensionElement element;
+ final ExtensionElementImpl2 element2;
TypeArgumentListImpl? _typeArguments;
@@ -6715,7 +6715,7 @@
required this.name,
required TypeArgumentListImpl? typeArguments,
required ArgumentListImpl argumentList,
- required this.element,
+ required this.element2,
}) : _typeArguments = typeArguments,
_argumentList = argumentList {
_becomeParentOf(importPrefix);
@@ -6733,10 +6733,9 @@
@override
Token get beginToken => importPrefix?.name ?? name;
- @experimental
@override
- ExtensionElementImpl2 get element2 =>
- (element as ExtensionElementImpl).element;
+ ExtensionElementImpl get element =>
+ element2.firstFragment;
@override
Token get endToken => _argumentList.endToken;
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 643ecf4..037b8e0 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -6756,6 +6756,8 @@
@override
ConstructorElement? get unnamedConstructor {
+ // TODO(scheglov): this is a hack
+ firstFragment.constructors;
return constructors.firstWhereOrNull((element) => element.name.isEmpty);
}
diff --git a/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart b/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
index efc51f3..b84a934 100644
--- a/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
@@ -2,9 +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/element/element.dart';
+import 'package:analyzer/dart/element/element2.dart';
import 'package:analyzer/dart/element/scope.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/error/listener.dart';
@@ -47,16 +45,14 @@
var typeNode = node.constructorName.type;
var importPrefix = typeNode.importPrefix;
if (importPrefix == null) {
- var element = nameScope.lookup(typeNode.name2.lexeme).getter;
- if (element is FunctionElement ||
- element is MethodElement ||
- element is PropertyAccessorElement) {
+ var element = nameScope.lookup(typeNode.name2.lexeme).getter2;
+ if (element is ExecutableElement2) {
return _toMethodInvocationOfFunctionReference(
node: node,
function: SimpleIdentifierImpl(typeNode.name2),
);
- } else if (element is TypeAliasElementImpl &&
- element.aliasedElement is GenericFunctionTypeElement) {
+ } else if (element is TypeAliasElementImpl2 &&
+ element.aliasedElement2 is GenericFunctionTypeElement2) {
return _toMethodInvocationOfAliasedTypeLiteral(
node: node,
function: SimpleIdentifierImpl(typeNode.name2),
@@ -65,11 +61,11 @@
}
} else {
var prefixName = importPrefix.name.lexeme;
- var prefixElement = nameScope.lookup(prefixName).getter;
- if (prefixElement is PrefixElement) {
+ var prefixElement = nameScope.lookup(prefixName).getter2;
+ if (prefixElement is PrefixElement2) {
var prefixedName = typeNode.name2.lexeme;
- var element = prefixElement.scope.lookup(prefixedName).getter;
- if (element is FunctionElement) {
+ var element = prefixElement.scope.lookup(prefixedName).getter2;
+ if (element is TopLevelFunctionElement) {
return _toMethodInvocationOfFunctionReference(
node: node,
function: PrefixedIdentifierImpl(
@@ -78,8 +74,8 @@
identifier: SimpleIdentifierImpl(typeNode.name2),
),
);
- } else if (element is TypeAliasElementImpl &&
- element.aliasedElement is GenericFunctionTypeElement) {
+ } else if (element is TypeAliasElementImpl2 &&
+ element.aliasedElement2 is GenericFunctionTypeElement2) {
return _toMethodInvocationOfAliasedTypeLiteral(
node: node,
function: PrefixedIdentifierImpl(
@@ -138,23 +134,23 @@
// This isn't a constructor invocation because it's in a cascade.
return node;
}
- var element = nameScope.lookup(methodName.name).getter;
- if (element is InterfaceElement) {
+ var element = nameScope.lookup(methodName.name).getter2;
+ if (element is InterfaceElement2) {
return _toInstanceCreation_type(
node: node,
typeIdentifier: methodName,
);
- } else if (element is ExtensionElement) {
+ } else if (element is ExtensionElementImpl2) {
var extensionOverride = ExtensionOverrideImpl(
importPrefix: null,
name: methodName.token,
- element: element,
+ element2: element,
typeArguments: node.typeArguments,
argumentList: node.argumentList,
);
NodeReplacer.replace(node, extensionOverride);
return extensionOverride;
- } else if (element is TypeAliasElement &&
+ } else if (element is TypeAliasElement2 &&
element.aliasedType is InterfaceType) {
return _toInstanceCreation_type(
node: node,
@@ -167,8 +163,8 @@
// This isn't a constructor invocation because a null aware operator is
// being used.
}
- var element = nameScope.lookup(target.name).getter;
- if (element is InterfaceElement) {
+ var element = nameScope.lookup(target.name).getter2;
+ if (element is InterfaceElement2) {
// class C { C.named(); }
// C.named()
return _toInstanceCreation_type_constructor(
@@ -177,29 +173,29 @@
constructorIdentifier: methodName,
classElement: element,
);
- } else if (element is PrefixElement) {
+ } else if (element is PrefixElement2) {
// Possible cases: p.C() or p.C<>()
- var prefixedElement = element.scope.lookup(methodName.name).getter;
- if (prefixedElement is InterfaceElement) {
+ var prefixedElement = element.scope.lookup(methodName.name).getter2;
+ if (prefixedElement is InterfaceElement2) {
return _toInstanceCreation_prefix_type(
node: node,
prefixIdentifier: target,
typeIdentifier: methodName,
);
- } else if (prefixedElement is ExtensionElement) {
+ } else if (prefixedElement is ExtensionElementImpl2) {
var extensionOverride = ExtensionOverrideImpl(
importPrefix: ImportPrefixReferenceImpl(
name: target.token,
period: operator,
- )..element = element,
+ )..element2 = element,
name: node.methodName.token,
- element: prefixedElement,
+ element2: prefixedElement,
typeArguments: node.typeArguments,
argumentList: node.argumentList,
);
NodeReplacer.replace(node, extensionOverride);
return extensionOverride;
- } else if (prefixedElement is TypeAliasElement &&
+ } else if (prefixedElement is TypeAliasElement2 &&
prefixedElement.aliasedType is InterfaceType) {
return _toInstanceCreation_prefix_type(
node: node,
@@ -207,7 +203,7 @@
typeIdentifier: methodName,
);
}
- } else if (element is TypeAliasElement) {
+ } else if (element is TypeAliasElement2) {
var aliasedType = element.aliasedType;
if (aliasedType is InterfaceType) {
// class C { C.named(); }
@@ -217,32 +213,32 @@
node: node,
typeIdentifier: target,
constructorIdentifier: methodName,
- classElement: aliasedType.element,
+ classElement: aliasedType.element3,
);
}
}
} else if (target is PrefixedIdentifierImpl) {
// Possible case: p.C.n()
- var prefixElement = nameScope.lookup(target.prefix.name).getter;
- target.prefix.staticElement = prefixElement;
- if (prefixElement is PrefixElement) {
+ var prefixElement = nameScope.lookup(target.prefix.name).getter2;
+ target.prefix.element = prefixElement;
+ if (prefixElement is PrefixElement2) {
var prefixedName = target.identifier.name;
- var element = prefixElement.scope.lookup(prefixedName).getter;
- if (element is InterfaceElement) {
+ var element = prefixElement.scope.lookup(prefixedName).getter2;
+ if (element is InterfaceElement2) {
return _instanceCreation_prefix_type_name(
node: node,
typeNameIdentifier: target,
constructorIdentifier: methodName,
classElement: element,
);
- } else if (element is TypeAliasElement) {
+ } else if (element is TypeAliasElement2) {
var aliasedType = element.aliasedType;
if (aliasedType is InterfaceType) {
return _instanceCreation_prefix_type_name(
node: node,
typeNameIdentifier: target,
constructorIdentifier: methodName,
- classElement: aliasedType.element,
+ classElement: aliasedType.element3,
);
}
}
@@ -280,20 +276,20 @@
return node;
}
var prefix = node.prefix;
- var prefixElement = nameScope.lookup(prefix.name).getter;
- if (parent is ConstantPattern && prefixElement is PrefixElement) {
- var element = prefixElement.scope.lookup(node.identifier.name).getter;
- if (element is TypeDefiningElement) {
+ var prefixElement = nameScope.lookup(prefix.name).getter2;
+ if (parent is ConstantPattern && prefixElement is PrefixElement2) {
+ var element = prefixElement.scope.lookup(node.identifier.name).getter2;
+ if (element is TypeDefiningElement2) {
return _toPatternTypeLiteral(parent, node);
}
}
- if (prefixElement is InterfaceElement) {
+ if (prefixElement is InterfaceElement2) {
// Example:
// class C { C.named(); }
// C.named
return _toConstructorReference_prefixed(
node: node, classElement: prefixElement);
- } else if (prefixElement is TypeAliasElement) {
+ } else if (prefixElement is TypeAliasElement2) {
var aliasedType = prefixElement.aliasedType;
if (aliasedType is InterfaceType) {
// Example:
@@ -302,7 +298,7 @@
// X.named
return _toConstructorReference_prefixed(
node: node,
- classElement: aliasedType.element,
+ classElement: aliasedType.element3,
);
}
}
@@ -351,16 +347,16 @@
return node;
}
- Element? element;
+ Element2? element;
if (receiverIdentifier is SimpleIdentifierImpl) {
- element = nameScope.lookup(receiverIdentifier.name).getter;
+ element = nameScope.lookup(receiverIdentifier.name).getter2;
} else if (receiverIdentifier is PrefixedIdentifierImpl) {
var prefixElement =
- nameScope.lookup(receiverIdentifier.prefix.name).getter;
- if (prefixElement is PrefixElement) {
+ nameScope.lookup(receiverIdentifier.prefix.name).getter2;
+ if (prefixElement is PrefixElement2) {
element = prefixElement.scope
.lookup(receiverIdentifier.identifier.name)
- .getter;
+ .getter2;
} else {
// This expression is something like `foo.List<int>.filled` where `foo`
// is not an import prefix.
@@ -370,7 +366,7 @@
}
}
- if (element is InterfaceElement) {
+ if (element is InterfaceElement2) {
// Example:
// class C<T> { C.named(); }
// C<int>.named
@@ -380,7 +376,7 @@
typeArguments: typeArguments,
classElement: element,
);
- } else if (element is TypeAliasElement) {
+ } else if (element is TypeAliasElement2) {
var aliasedType = element.aliasedType;
if (aliasedType is InterfaceType) {
// Example:
@@ -391,7 +387,7 @@
node: node,
receiver: receiverIdentifier,
typeArguments: typeArguments,
- classElement: aliasedType.element,
+ classElement: aliasedType.element3,
);
}
}
@@ -414,8 +410,8 @@
AstNode simpleIdentifier(Scope nameScope, SimpleIdentifierImpl node) {
var parent = node.parent;
if (parent is ConstantPattern) {
- var element = nameScope.lookup(node.name).getter;
- if (element is TypeDefiningElement) {
+ var element = nameScope.lookup(node.name).getter2;
+ if (element is TypeDefiningElement2) {
return _toPatternTypeLiteral(parent, node);
}
}
@@ -427,10 +423,9 @@
required MethodInvocationImpl node,
required PrefixedIdentifierImpl typeNameIdentifier,
required SimpleIdentifierImpl constructorIdentifier,
- required InterfaceElement classElement,
+ required InterfaceElement2 classElement,
}) {
- var augmented = classElement.augmented;
- var constructorElement = augmented.getNamedConstructor(
+ var constructorElement = classElement.getNamedConstructor2(
constructorIdentifier.name,
);
if (constructorElement == null) {
@@ -472,12 +467,12 @@
AstNode _toConstructorReference_prefixed({
required PrefixedIdentifierImpl node,
- required InterfaceElement classElement,
+ required InterfaceElement2 classElement,
}) {
var name = node.identifier.name;
var constructorElement = name == 'new'
- ? classElement.unnamedConstructor
- : classElement.getNamedConstructor(name);
+ ? classElement.unnamedConstructor2
+ : classElement.getNamedConstructor2(name);
if (constructorElement == null) {
return node;
}
@@ -504,12 +499,12 @@
required PropertyAccessImpl node,
required IdentifierImpl receiver,
required TypeArgumentListImpl? typeArguments,
- required InterfaceElement classElement,
+ required InterfaceElement2 classElement,
}) {
var name = node.propertyName.name;
var constructorElement = name == 'new'
- ? classElement.unnamedConstructor
- : classElement.getNamedConstructor(name);
+ ? classElement.unnamedConstructor2
+ : classElement.getNamedConstructor2(name);
if (constructorElement == null && typeArguments == null) {
// If there is no constructor by this name, and no type arguments,
// do not rewrite the node. If there _are_ type arguments (like
@@ -594,11 +589,10 @@
required MethodInvocationImpl node,
required SimpleIdentifierImpl typeIdentifier,
required SimpleIdentifierImpl constructorIdentifier,
- required InterfaceElement classElement,
+ required InterfaceElement2 classElement,
}) {
var name = constructorIdentifier.name;
- var augmented = classElement.augmented;
- var constructorElement = augmented.getNamedConstructor(name);
+ var constructorElement = classElement.getNamedConstructor2(name);
if (constructorElement == null) {
return node;
}
@@ -636,7 +630,7 @@
MethodInvocation _toMethodInvocationOfAliasedTypeLiteral({
required InstanceCreationExpressionImpl node,
required Identifier function,
- required TypeAliasElementImpl element,
+ required TypeAliasElementImpl2 element,
}) {
var typeName = NamedTypeImpl(
importPrefix: node.constructorName.type.importPrefix,
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
index 15ec319..7fc3ba7 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
@@ -501,7 +501,7 @@
var node = ExtensionOverrideImpl(
importPrefix: importPrefix,
name: StringToken(TokenType.STRING, extensionName, -1),
- element: element,
+ element2: element.asElement2,
argumentList: argumentList,
typeArguments: typeArguments,
);
diff --git a/pkg/analyzer/lib/src/utilities/extensions/element.dart b/pkg/analyzer/lib/src/utilities/extensions/element.dart
index a72f2f5..74ffd79 100644
--- a/pkg/analyzer/lib/src/utilities/extensions/element.dart
+++ b/pkg/analyzer/lib/src/utilities/extensions/element.dart
@@ -386,7 +386,7 @@
}
extension ExtensionElementExtension on ExtensionElement {
- ExtensionElement2 get asElement2 {
+ ExtensionElementImpl2 get asElement2 {
return (this as ExtensionElementImpl).element;
}
}