Stop using linked nodes for type parameters.
Change-Id: I5565bf6b0ec0b16da481abaaf5ffb1e3eb6343ca
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/200927
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 878a9c9..e31e14d 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -3469,12 +3469,6 @@
);
}
- @override
- List<TypeParameterElement> get typeParameters {
- // TODO(scheglov) remove the method
- return _typeParameterElements;
- }
-
/// Set the type parameters defined by this function type element to the given
/// [typeParameters].
set typeParameters(List<TypeParameterElement> typeParameters) {
@@ -5627,12 +5621,6 @@
/// [offset].
TypeParameterElementImpl(String name, int offset) : super(name, offset);
- TypeParameterElementImpl.forLinkedNode(
- ElementImpl enclosing, TypeParameterImpl linkedNode)
- : super.forLinkedNode(enclosing, null, linkedNode) {
- linkedNode.name.staticElement = this;
- }
-
/// Initialize a newly created synthetic type parameter element to have the
/// given [name], and with [synthetic] set to true.
TypeParameterElementImpl.synthetic(String name) : super(name, -1) {
@@ -5648,13 +5636,6 @@
}
DartType? get boundInternal {
- if (_bound != null) return _bound;
-
- final linkedNode = this.linkedNode;
- if (linkedNode is TypeParameter) {
- return _bound = linkedNode.bound?.type;
- }
-
return _bound;
}
@@ -5673,22 +5654,9 @@
@override
String get name {
- if (linkedNode != null) {
- var node = linkedNode as TypeParameter;
- return node.name.name;
- }
return super.name!;
}
- @override
- int get nameOffset {
- if (linkedNode != null) {
- return enclosingUnit.linkedContext!.getNameOffset(linkedNode!);
- }
-
- return super.nameOffset;
- }
-
Variance get variance {
return _variance ?? Variance.covariant;
}
@@ -5732,35 +5700,15 @@
/// Mixin representing an element which can have type parameters.
mixin TypeParameterizedElementMixin
implements _ExistingElementImpl, TypeParameterizedElement {
- /// A cached list containing the type parameters declared by this element
- /// directly, or `null` if the elements have not been created yet. This does
- /// not include type parameters that are declared by any enclosing elements.
- List<TypeParameterElement> _typeParameterElements =
- _Sentinel.typeParameterElement;
+ /// The type parameters declared by this element directly. This does not
+ /// include type parameters that are declared by any enclosing elements.
+ List<TypeParameterElement> _typeParameterElements = const [];
@override
bool get isSimplyBounded => true;
@override
List<TypeParameterElement> get typeParameters {
- if (!identical(_typeParameterElements, _Sentinel.typeParameterElement)) {
- return _typeParameterElements;
- }
-
- if (linkedNode != null) {
- var typeParameters = linkedContext!.getTypeParameters2(linkedNode!);
- if (typeParameters == null) {
- return _typeParameterElements = const [];
- }
- return _typeParameterElements = typeParameters.typeParameters
- .cast<TypeParameterImpl>()
- .map<TypeParameterElement>((node) {
- var element = node.declaredElement;
- element ??= TypeParameterElementImpl.forLinkedNode(this, node);
- return element;
- }).toList();
- }
-
return _typeParameterElements;
}
@@ -5984,6 +5932,4 @@
static final List<MethodElement> methodElement = List.unmodifiable([]);
static final List<PropertyAccessorElement> propertyAccessorElement =
List.unmodifiable([]);
- static final List<TypeParameterElement> typeParameterElement =
- List.unmodifiable([]);
}
diff --git a/pkg/analyzer/lib/src/summary2/bundle_writer.dart b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
index a1ad2d6..769e3f2 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
@@ -793,16 +793,10 @@
static FunctionType _toSyntheticFunctionType(FunctionType type) {
var typeParameters = type.typeFormals;
-
if (typeParameters.isEmpty) return type;
- var onlySyntheticTypeParameters = typeParameters.every((e) {
- return e is TypeParameterElementImpl && e.linkedNode == null;
- });
- if (onlySyntheticTypeParameters) return type;
-
- var parameters = getFreshTypeParameters(typeParameters);
- return parameters.applyToFunctionType(type);
+ var fresh = getFreshTypeParameters(typeParameters);
+ return fresh.applyToFunctionType(type);
}
}
diff --git a/pkg/analyzer/lib/src/summary2/reference_resolver.dart b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
index 187aa50..9169ffb 100644
--- a/pkg/analyzer/lib/src/summary2/reference_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
@@ -140,7 +140,6 @@
var element = node.declaredElement as ExtensionElementImpl;
- _createTypeParameterElements(element, node.typeParameters);
scope = TypeParameterScope(scope, element.typeParameters);
node.typeParameters?.accept(this);
@@ -167,7 +166,6 @@
var element = node.declaredElement as FieldFormalParameterElementImpl;
element.parameters; // create elements
- _createTypeParameterElements(element, node.typeParameters);
scope = TypeParameterScope(scope, element.typeParameters);
node.type?.accept(this);
@@ -190,10 +188,6 @@
var element = node.declaredElement as ExecutableElementImpl;
element.parameters; // create elements
- _createTypeParameterElements(
- element,
- node.functionExpression.typeParameters,
- );
scope = TypeParameterScope(outerScope, element.typeParameters);
LinkingNodeContext(node, scope);
@@ -237,7 +231,6 @@
var element = node.declaredElement as ParameterElementImpl;
element.parameters; // create elements
- _createTypeParameterElements(element, node.typeParameters);
scope = TypeParameterScope(scope, element.typeParameters);
node.returnType?.accept(this);
@@ -302,8 +295,6 @@
var element = node.declaredElement as ExecutableElementImpl;
element.parameters; // create elements
- _createTypeParameterElements(element, node.typeParameters);
-
scope = TypeParameterScope(scope, element.typeParameters);
LinkingNodeContext(node, scope);
@@ -421,9 +412,6 @@
bound.accept(this);
var element = node.declaredElement as TypeParameterElementImpl;
element.bound = bound.type;
- // TODO(scheglov) We should not need to do it here.
- // Only in the element builder, eventually.z
- linker.elementNodes[element] = node;
}
}
@@ -443,29 +431,6 @@
node.mixinTypes.accept(this);
}
- void _createTypeParameterElement(
- ElementImpl enclosingElement,
- TypeParameterImpl node,
- ) {
- var element = TypeParameterElementImpl.forLinkedNode(
- enclosingElement,
- node,
- );
- node.name.staticElement = element;
- }
-
- void _createTypeParameterElements(
- ElementImpl enclosingElement,
- TypeParameterList? typeParameterList,
- ) {
- if (typeParameterList == null) return;
-
- for (var typeParameter in typeParameterList.typeParameters) {
- typeParameter as TypeParameterImpl;
- _createTypeParameterElement(enclosingElement, typeParameter);
- }
- }
-
NullabilitySuffix _getNullabilitySuffix(bool hasQuestion) {
if (isNNBD) {
if (hasQuestion) {
diff --git a/pkg/analyzer/lib/src/summary2/types_builder.dart b/pkg/analyzer/lib/src/summary2/types_builder.dart
index 294a722..4f9d087 100644
--- a/pkg/analyzer/lib/src/summary2/types_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/types_builder.dart
@@ -81,10 +81,6 @@
builder.build();
}
- for (var declaration in nodes.declarations) {
- _declaration(declaration);
- }
-
// TODO(scheglov) generalize
_linker.elementNodes.forEach((element, node) {
if (element is GenericFunctionTypeElementImpl &&
@@ -96,6 +92,10 @@
}
});
+ for (var declaration in nodes.declarations) {
+ _declaration(declaration);
+ }
+
_MixinsInference(_linker).perform(nodes.declarations);
}