From 04f7a2a910f1e7dd812447b1e89baebdc9e048b8 Mon Sep 17 00:00:00 2001 From: Konstantin Shcheglov Date: Thu, 9 Mar 2023 17:00:48 +0000 Subject: [PATCH] Simplify implementation of FindNode.singleX getters. Change-Id: I434cf2371dee4269747b21413d6d15cbd4fa4e3c Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/287672 Commit-Queue: Konstantin Shcheglov Reviewed-by: Brian Wilkerson --- .../lib/src/test_utilities/find_node.dart | 166 ++++-------------- .../test/generated/utilities_test.dart | 2 +- .../dart/analysis/driver_resolution_test.dart | 2 +- 3 files changed, 37 insertions(+), 133 deletions(-) diff --git a/pkg/analyzer/lib/src/test_utilities/find_node.dart b/pkg/analyzer/lib/src/test_utilities/find_node.dart index 73f0c3a5bdf..2acb7553be6 100644 --- a/pkg/analyzer/lib/src/test_utilities/find_node.dart +++ b/pkg/analyzer/lib/src/test_utilities/find_node.dart @@ -3,6 +3,7 @@ // BSD-style license that can be found in the LICENSE file. import 'package:analyzer/dart/ast/ast.dart'; +import 'package:analyzer/dart/ast/visitor.dart'; import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/src/dart/ast/utilities.dart'; import 'package:analyzer/src/test_utilities/function_ast_visitor.dart'; @@ -13,11 +14,6 @@ class FindNode { FindNode(this.content, this.unit); - LibraryDirective get libraryDirective { - return unit.directives.singleWhere((d) => d is LibraryDirective) - as LibraryDirective; - } - List get methodInvocations { var result = []; unit.accept( @@ -28,143 +24,30 @@ class FindNode { return result; } - /// Returns the [Block], there must be only one. - Block get singleBlock { - var nodes = []; - unit.accept( - FunctionAstVisitor( - block: (node) { - nodes.add(node); - }, - ), - ); - return nodes.single; - } + Block get singleBlock => _single(); - /// Returns the [ForElement], there must be only one. - ForElement get singleForElement { - var nodes = []; - unit.accept( - FunctionAstVisitor( - forElement: (node) { - nodes.add(node); - }, - ), - ); - return nodes.single; - } + ForElement get singleForElement => _single(); - /// Returns the [ForStatement], there must be only one. - ForStatement get singleForStatement { - var nodes = []; - unit.accept( - FunctionAstVisitor( - forStatement: (node) { - nodes.add(node); - }, - ), - ); - return nodes.single; - } + ForStatement get singleForStatement => _single(); - /// Returns the [GuardedPattern], there must be only one. - GuardedPattern get singleGuardedPattern { - var nodes = []; - unit.accept( - FunctionAstVisitor( - guardedPattern: (node) { - nodes.add(node); - }, - ), - ); - return nodes.single; - } + GuardedPattern get singleGuardedPattern => _single(); - /// Returns the [IfElement], there must be only one. - IfElement get singleIfElement { - var nodes = []; - unit.accept( - FunctionAstVisitor( - ifElement: (node) { - nodes.add(node); - }, - ), - ); - return nodes.single; - } + IfElement get singleIfElement => _single(); - /// Returns the [IfStatement], there must be only one. - IfStatement get singleIfStatement { - var nodes = []; - unit.accept( - FunctionAstVisitor( - ifStatement: (node) { - nodes.add(node); - }, - ), - ); - return nodes.single; - } + IfStatement get singleIfStatement => _single(); - /// Returns the [PatternAssignment], there must be only one. - PatternAssignment get singlePatternAssignment { - var nodes = []; - unit.accept( - FunctionAstVisitor( - patternAssignment: nodes.add, - ), - ); - return nodes.single; - } + LibraryDirective get singleLibraryDirective => _single(); - /// Returns the [PatternVariableDeclaration], there must be only one. - PatternVariableDeclaration get singlePatternVariableDeclaration { - var nodes = []; - unit.accept( - FunctionAstVisitor( - patternVariableDeclaration: nodes.add, - ), - ); - return nodes.single; - } + PatternAssignment get singlePatternAssignment => _single(); + + PatternVariableDeclaration get singlePatternVariableDeclaration => _single(); - /// Returns the [PatternVariableDeclarationStatement], there must be only one. PatternVariableDeclarationStatement - get singlePatternVariableDeclarationStatement { - var nodes = []; - unit.accept( - FunctionAstVisitor( - patternVariableDeclarationStatement: nodes.add, - ), - ); - return nodes.single; - } + get singlePatternVariableDeclarationStatement => _single(); - /// Returns the [SwitchExpression], there must be only one. - SwitchExpression get singleSwitchExpression { - var nodes = []; - unit.accept( - FunctionAstVisitor( - switchExpression: (node) { - nodes.add(node); - }, - ), - ); - return nodes.single; - } + SwitchExpression get singleSwitchExpression => _single(); - /// Returns the [SwitchPatternCase], there must be only one. - SwitchPatternCase get singleSwitchPatternCase { - var nodes = []; - unit.accept( - FunctionAstVisitor( - switchPatternCase: (node) { - nodes.add(node); - }, - ), - ); - return nodes.single; - } + SwitchPatternCase get singleSwitchPatternCase => _single(); AdjacentStrings adjacentStrings(String search) { return _node(search, (n) => n is AdjacentStrings); @@ -889,4 +772,25 @@ class FindNode { } return result as T; } + + /// If [unit] has exactly one node of type [T], returns it. + /// Otherwise, throws. + T _single() { + final visitor = _TypedNodeVisitor(); + unit.accept(visitor); + return visitor.nodes.single; + } +} + +class _TypedNodeVisitor + extends GeneralizingAstVisitor { + final List nodes = []; + + @override + void visitNode(AstNode node) { + if (node is T) { + nodes.add(node); + } + super.visitNode(node); + } } diff --git a/pkg/analyzer/test/generated/utilities_test.dart b/pkg/analyzer/test/generated/utilities_test.dart index 527f6b54278..af345be3a42 100644 --- a/pkg/analyzer/test/generated/utilities_test.dart +++ b/pkg/analyzer/test/generated/utilities_test.dart @@ -1266,7 +1266,7 @@ void f() { @myA2 library foo; '''); - var node = findNode.libraryDirective; + var node = findNode.singleLibraryDirective; _assertAnnotatedNode(node); _assertReplacementForChildren( destination: node, diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart index f0baf3f190e..02747dddc9b 100644 --- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart +++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart @@ -230,7 +230,7 @@ const a = 1; '''); await resolveTestFile(); - var directive = findNode.libraryDirective; + var directive = findNode.singleLibraryDirective; expect(directive.metadata, hasLength(1)); Annotation annotation = directive.metadata[0];