@@ -2154,16 +2154,9 @@ abstract class ScopedVisitor extends UnifyingAstVisitor<void> {
21542154
21552155 @override
21562156 void visitBlock (Block node) {
2157- Scope outerScope = nameScope;
2158- try {
2159- var enclosedScope = LocalScope (nameScope);
2160- BlockScope .elementsInBlock (node).forEach (enclosedScope.add);
2161- nameScope = enclosedScope;
2162- _setNodeNameScope (node, nameScope);
2157+ _withDeclaredLocals (node, node.statements, () {
21632158 super .visitBlock (node);
2164- } finally {
2165- nameScope = outerScope;
2166- }
2159+ });
21672160 }
21682161
21692162 @override
@@ -2296,11 +2289,7 @@ abstract class ScopedVisitor extends UnifyingAstVisitor<void> {
22962289
22972290 @override
22982291 void visitDeclaredIdentifier (DeclaredIdentifier node) {
2299- VariableElement element = node.declaredElement;
2300- // TODO(scheglov) Do we need this?
2301- if (element != null ) {
2302- _define (element);
2303- }
2292+ _define (node.declaredElement);
23042293 super .visitDeclaredIdentifier (node);
23052294 }
23062295
@@ -2467,15 +2456,9 @@ abstract class ScopedVisitor extends UnifyingAstVisitor<void> {
24672456
24682457 @override
24692458 void visitFunctionDeclaration (FunctionDeclaration node) {
2470- ExecutableElement element = node.declaredElement;
2471- // TODO(scheglov) Do we need this?
2472- if (element != null &&
2473- element.enclosingElement is ! CompilationUnitElement ) {
2474- _define (element);
2475- }
2476-
24772459 Scope outerScope = nameScope;
24782460 try {
2461+ var element = node.declaredElement;
24792462 nameScope = TypeParameterScope (
24802463 nameScope,
24812464 element.typeParameters,
@@ -2678,26 +2661,17 @@ abstract class ScopedVisitor extends UnifyingAstVisitor<void> {
26782661 @override
26792662 void visitSwitchCase (SwitchCase node) {
26802663 node.expression.accept (this );
2681- Scope outerNameScope = nameScope;
2682- try {
2683- nameScope = LocalScope (nameScope);
2684- _setNodeNameScope (node, nameScope);
2664+
2665+ _withDeclaredLocals (node, node.statements, () {
26852666 node.statements.accept (this );
2686- } finally {
2687- nameScope = outerNameScope;
2688- }
2667+ });
26892668 }
26902669
26912670 @override
26922671 void visitSwitchDefault (SwitchDefault node) {
2693- Scope outerNameScope = nameScope;
2694- try {
2695- nameScope = LocalScope (nameScope);
2696- _setNodeNameScope (node, nameScope);
2672+ _withDeclaredLocals (node, node.statements, () {
26972673 node.statements.accept (this );
2698- } finally {
2699- nameScope = outerNameScope;
2700- }
2674+ });
27012675 }
27022676
27032677 @override
@@ -2728,13 +2702,9 @@ abstract class ScopedVisitor extends UnifyingAstVisitor<void> {
27282702 @override
27292703 void visitVariableDeclaration (VariableDeclaration node) {
27302704 super .visitVariableDeclaration (node);
2731- if (node.parent.parent is ! TopLevelVariableDeclaration &&
2732- node.parent.parent is ! FieldDeclaration ) {
2733- // TODO(scheglov) Do we need this?
2734- VariableElement element = node.declaredElement;
2735- if (element != null ) {
2736- _define (element);
2737- }
2705+
2706+ if (node.parent.parent is ForParts ) {
2707+ _define (node.declaredElement);
27382708 }
27392709 }
27402710
@@ -2769,6 +2739,25 @@ abstract class ScopedVisitor extends UnifyingAstVisitor<void> {
27692739 (nameScope as LocalScope ).add (element);
27702740 }
27712741
2742+ void _withDeclaredLocals (
2743+ AstNode node,
2744+ List <Statement > statements,
2745+ void Function () f,
2746+ ) {
2747+ var outerScope = nameScope;
2748+ try {
2749+ var enclosedScope = LocalScope (nameScope);
2750+ BlockScope .elementsInStatements (statements).forEach (enclosedScope.add);
2751+
2752+ nameScope = enclosedScope;
2753+ _setNodeNameScope (node, nameScope);
2754+
2755+ f ();
2756+ } finally {
2757+ nameScope = outerScope;
2758+ }
2759+ }
2760+
27722761 /// Return the [Scope] to use while resolving inside the [node] .
27732762 ///
27742763 /// Not every node has the scope set, for example we set the scopes for
0 commit comments