55import 'package:analyzer/dart/ast/ast.dart' ;
66import 'package:analyzer/dart/ast/visitor.dart' ;
77import 'package:analyzer/dart/element/element.dart' ;
8+ import 'package:analyzer/dart/element/element2.dart' ;
89import 'package:analyzer/source/source_range.dart' ;
910import 'package:analyzer_plugin/utilities/range_factory.dart' ;
1011
1112/// Computer of local elements and source ranges in which they are visible.
1213class VisibleRangesComputer extends GeneralizingAstVisitor <void > {
1314 final Map <LocalElement , SourceRange > _map = {};
1415
16+ final Map <PromotableElement2 , SourceRange > _map2 = {};
17+
1518 @override
1619 void visitCatchClause (CatchClause node) {
17- _addLocalVariable (node, node.exceptionParameter? .declaredElement);
18- _addLocalVariable (node, node.stackTraceParameter? .declaredElement);
20+ _addLocalVariable (node, node.exceptionParameter? .declaredElement,
21+ node.exceptionParameter? .declaredElement2);
22+ _addLocalVariable (node, node.stackTraceParameter? .declaredElement,
23+ node.stackTraceParameter? .declaredElement2);
1924 node.body.accept (this );
2025 }
2126
@@ -30,14 +35,25 @@ class VisibleRangesComputer extends GeneralizingAstVisitor<void> {
3035 _map[element] = range.node (body);
3136 }
3237 }
38+
39+ var element2 = node.declaredFragment? .element;
40+ if (element2 is FormalParameterElement ) {
41+ var body = _getFunctionBody (node);
42+ if (body is BlockFunctionBody ) {
43+ _map2[element2] = range.node (body);
44+ } else if (body is ExpressionFunctionBody ) {
45+ _map2[element2] = range.node (body);
46+ }
47+ }
3348 }
3449
3550 @override
3651 void visitForPartsWithDeclarations (ForPartsWithDeclarations node) {
3752 var loop = node.parent;
3853 if (loop != null ) {
3954 for (var variable in node.variables.variables) {
40- _addLocalVariable (loop, variable.declaredElement);
55+ _addLocalVariable (
56+ loop, variable.declaredElement, variable.declaredElement2);
4157 variable.initializer? .accept (this );
4258 }
4359 }
@@ -54,21 +70,41 @@ class VisibleRangesComputer extends GeneralizingAstVisitor<void> {
5470 super .visitFunctionDeclaration (node);
5571 }
5672
73+ @override
74+ void visitPatternVariableDeclaration (PatternVariableDeclaration node) {
75+ // TODO(brianwilkerson): Figure out why this isn't handled.
76+ super .visitPatternVariableDeclaration (node);
77+ }
78+
79+ @override
80+ void visitPatternVariableDeclarationStatement (
81+ PatternVariableDeclarationStatement node) {
82+ // TODO(brianwilkerson): Figure out why this isn't handled.
83+ super .visitPatternVariableDeclarationStatement (node);
84+ }
85+
5786 @override
5887 void visitVariableDeclarationStatement (VariableDeclarationStatement node) {
5988 var block = node.parent;
6089 if (block != null ) {
6190 for (var variable in node.variables.variables) {
62- _addLocalVariable (block, variable.declaredElement);
91+ _addLocalVariable (
92+ block, variable.declaredElement, variable.declaredElement2);
6393 variable.initializer? .accept (this );
6494 }
6595 }
6696 }
6797
68- void _addLocalVariable (AstNode scopeNode, Element ? element) {
98+ void _addLocalVariable (
99+ AstNode scopeNode, Element ? element, Element2 ? element2) {
69100 if (element is LocalVariableElement ) {
101+ // TODO(brianwilkerson): Figure out why this isn't `PromotableElement`. It
102+ // appears to be missing parameter elements.
70103 _map[element] = range.node (scopeNode);
71104 }
105+ if (element2 is PromotableElement2 ) {
106+ _map2[element2] = range.node (scopeNode);
107+ }
72108 }
73109
74110 static Map <LocalElement , SourceRange > forNode (AstNode unit) {
@@ -77,6 +113,12 @@ class VisibleRangesComputer extends GeneralizingAstVisitor<void> {
77113 return computer._map;
78114 }
79115
116+ static Map <PromotableElement2 , SourceRange > forNode2 (AstNode unit) {
117+ var computer = VisibleRangesComputer ();
118+ unit.accept (computer);
119+ return computer._map2;
120+ }
121+
80122 /// Return the body of the function that contains the given [parameter] , or
81123 /// `null` if no function body could be found.
82124 static FunctionBody ? _getFunctionBody (FormalParameter parameter) {
0 commit comments