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);
   }