Build local elements for variable initializers.

R=brianwilkerson@google.com

Change-Id: Ice81c47a812ec2421cb6516b6fbec340ed239d22
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/101100
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analyzer/lib/src/summary2/declaration_splicer.dart b/pkg/analyzer/lib/src/summary2/declaration_splicer.dart
index 708fd87..deef9dc 100644
--- a/pkg/analyzer/lib/src/summary2/declaration_splicer.dart
+++ b/pkg/analyzer/lib/src/summary2/declaration_splicer.dart
@@ -33,17 +33,16 @@
   }
 
   void _buildLocalElements(AstNode node) {
-    var holder = ElementHolder();
+    if (node == null) return;
 
+    var holder = ElementHolder();
     var elementBuilder = LocalElementBuilder(holder, _unitElement);
     node.accept(elementBuilder);
 
-    var element = _walker.element;
-    if (element is ExecutableElementImpl) {
-      element.encloseElements(holder.functions);
-      element.encloseElements(holder.labels);
-      element.encloseElements(holder.localVariables);
-    }
+    ElementImpl element = _walker.element;
+    element.encloseElements(holder.functions);
+    element.encloseElements(holder.labels);
+    element.encloseElements(holder.localVariables);
   }
 
   void _classDeclaration(ClassDeclaration full, ClassDeclaration partial) {
@@ -434,11 +433,9 @@
   ) {
     var element = _walker.getVariable();
     _match(partial.name, element);
+
     partial.initializer = full.initializer;
-    {
-      var elementBuilder = LocalElementBuilder(ElementHolder(), null);
-      partial.initializer?.accept(elementBuilder);
-    }
+    _buildLocalElements(partial.initializer);
   }
 
   void _variableDeclarationList(
diff --git a/pkg/analyzer/lib/src/summary2/top_level_inference.dart b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
index 0916c0d..52b911f 100644
--- a/pkg/analyzer/lib/src/summary2/top_level_inference.dart
+++ b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
@@ -183,12 +183,19 @@
   final _InferenceWalker _walker;
   final LibraryElement _library;
   final Scope _scope;
+  final PropertyInducingElementImpl _element;
   final VariableDeclaration _node;
 
   @override
   bool isEvaluated = false;
 
-  _InferenceNode(this._walker, this._library, this._scope, this._node);
+  _InferenceNode(
+    this._walker,
+    this._library,
+    this._scope,
+    this._element,
+    this._node,
+  );
 
   bool get isImplicitlyTypedInstanceField {
     VariableDeclarationList variables = _node.parent;
@@ -201,8 +208,7 @@
 
   @override
   List<_InferenceNode> computeDependencies() {
-    _node.initializer.accept(LocalElementBuilder(ElementHolder(), null));
-
+    _buildLocalElements();
     _resolveInitializer();
 
     var collector = _InferenceDependenciesCollector();
@@ -264,6 +270,12 @@
     isEvaluated = true;
   }
 
+  void _buildLocalElements() {
+    var holder = ElementHolder();
+    _node.initializer.accept(LocalElementBuilder(holder, null));
+    _element.encloseElements(holder.functions);
+  }
+
   void _resolveInitializer() {
     var astResolver = AstResolver(_walker._linker, _library, _scope);
     astResolver.resolve(_node.initializer, doAstRewrite: true);
@@ -344,7 +356,8 @@
     if (LazyAst.getType(node) != null) return;
 
     if (node.initializer != null) {
-      var inferenceNode = _InferenceNode(_walker, _library, _scope, node);
+      var inferenceNode =
+          _InferenceNode(_walker, _library, _scope, element, node);
       _walker._nodes[element] = inferenceNode;
       (element as PropertyInducingElementImpl).initializer =
           _FunctionElementForLink_Initializer(inferenceNode);