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