| Index: pkg/analysis_services/lib/src/correction/statement_analyzer.dart
|
| diff --git a/pkg/analysis_services/lib/src/correction/statement_analyzer.dart b/pkg/analysis_services/lib/src/correction/statement_analyzer.dart
|
| deleted file mode 100644
|
| index a18307bad4b9aafdc5a2edc43bbded94f4d4e7e6..0000000000000000000000000000000000000000
|
| --- a/pkg/analysis_services/lib/src/correction/statement_analyzer.dart
|
| +++ /dev/null
|
| @@ -1,233 +0,0 @@
|
| -// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
|
| -// for details. All rights reserved. Use of this source code is governed by a
|
| -// BSD-style license that can be found in the LICENSE file.
|
| -
|
| -library services.src.correction.statement_analyzer;
|
| -
|
| -import 'package:analysis_services/correction/status.dart';
|
| -import 'package:analysis_services/src/correction/selection_analyzer.dart';
|
| -import 'package:analysis_services/src/correction/source_range.dart';
|
| -import 'package:analysis_services/src/correction/util.dart';
|
| -import 'package:analyzer/src/generated/ast.dart';
|
| -import 'package:analyzer/src/generated/element.dart';
|
| -import 'package:analyzer/src/generated/scanner.dart';
|
| -import 'package:analyzer/src/generated/source.dart';
|
| -
|
| -
|
| -/**
|
| - * Returns [Token]s of the given Dart source, not `null`, may be empty if no
|
| - * tokens or some exception happens.
|
| - */
|
| -List<Token> _getTokens(String text) {
|
| - try {
|
| - List<Token> tokens = <Token>[];
|
| - Scanner scanner = new Scanner(null, new CharSequenceReader(text), null);
|
| - Token token = scanner.tokenize();
|
| - while (token.type != TokenType.EOF) {
|
| - tokens.add(token);
|
| - token = token.next;
|
| - }
|
| - return tokens;
|
| - } catch (e) {
|
| - return new List<Token>(0);
|
| - }
|
| -}
|
| -
|
| -
|
| -/**
|
| - * Analyzer to check if a selection covers a valid set of statements of AST.
|
| - */
|
| -class StatementAnalyzer extends SelectionAnalyzer {
|
| - final CompilationUnit unit;
|
| -
|
| - RefactoringStatus _status = new RefactoringStatus();
|
| -
|
| - StatementAnalyzer(this.unit, SourceRange selection) : super(selection);
|
| -
|
| - /**
|
| - * Returns the [RefactoringStatus] result of selection checking.
|
| - */
|
| - RefactoringStatus get status => _status;
|
| -
|
| - /**
|
| - * Records fatal error with given message.
|
| - */
|
| - void invalidSelection(String message) {
|
| - invalidSelection2(message, null);
|
| - }
|
| -
|
| - /**
|
| - * Records fatal error with given message and [RefactoringStatusContext].
|
| - */
|
| - void invalidSelection2(String message, RefactoringStatusContext context) {
|
| - _status.addFatalError(message, context);
|
| - reset();
|
| - }
|
| -
|
| - @override
|
| - Object visitCompilationUnit(CompilationUnit node) {
|
| - super.visitCompilationUnit(node);
|
| - if (!hasSelectedNodes) {
|
| - return null;
|
| - }
|
| - // check that selection does not begin/end in comment
|
| - {
|
| - int selectionStart = selection.offset;
|
| - int selectionEnd = selection.end;
|
| - List<SourceRange> commentRanges = getCommentRanges(unit);
|
| - for (SourceRange commentRange in commentRanges) {
|
| - if (commentRange.contains(selectionStart)) {
|
| - invalidSelection("Selection begins inside a comment.");
|
| - }
|
| - if (commentRange.containsExclusive(selectionEnd)) {
|
| - invalidSelection("Selection ends inside a comment.");
|
| - }
|
| - }
|
| - }
|
| - // more checks
|
| - if (!_status.hasFatalError) {
|
| - _checkSelectedNodes(node);
|
| - }
|
| - return null;
|
| - }
|
| -
|
| - @override
|
| - Object visitDoStatement(DoStatement node) {
|
| - super.visitDoStatement(node);
|
| - List<AstNode> selectedNodes = this.selectedNodes;
|
| - if (_contains(selectedNodes, node.body)) {
|
| - invalidSelection(
|
| - "Operation not applicable to a 'do' statement's body and expression.");
|
| - }
|
| - return null;
|
| - }
|
| -
|
| - @override
|
| - Object visitForStatement(ForStatement node) {
|
| - super.visitForStatement(node);
|
| - List<AstNode> selectedNodes = this.selectedNodes;
|
| - bool containsInit =
|
| - _contains(selectedNodes, node.initialization) ||
|
| - _contains(selectedNodes, node.variables);
|
| - bool containsCondition = _contains(selectedNodes, node.condition);
|
| - bool containsUpdaters = _containsAny(selectedNodes, node.updaters);
|
| - bool containsBody = _contains(selectedNodes, node.body);
|
| - if (containsInit && containsCondition) {
|
| - invalidSelection(
|
| - "Operation not applicable to a 'for' statement's initializer and condition.");
|
| - } else if (containsCondition && containsUpdaters) {
|
| - invalidSelection(
|
| - "Operation not applicable to a 'for' statement's condition and updaters.");
|
| - } else if (containsUpdaters && containsBody) {
|
| - invalidSelection(
|
| - "Operation not applicable to a 'for' statement's updaters and body.");
|
| - }
|
| - return null;
|
| - }
|
| -
|
| - @override
|
| - Object visitSwitchStatement(SwitchStatement node) {
|
| - super.visitSwitchStatement(node);
|
| - List<AstNode> selectedNodes = this.selectedNodes;
|
| - List<SwitchMember> switchMembers = node.members;
|
| - for (AstNode selectedNode in selectedNodes) {
|
| - if (switchMembers.contains(selectedNode)) {
|
| - invalidSelection(
|
| - "Selection must either cover whole switch statement or parts of a single case block.");
|
| - break;
|
| - }
|
| - }
|
| - return null;
|
| - }
|
| -
|
| - @override
|
| - Object visitTryStatement(TryStatement node) {
|
| - super.visitTryStatement(node);
|
| - AstNode firstSelectedNode = this.firstSelectedNode;
|
| - if (firstSelectedNode != null) {
|
| - if (firstSelectedNode == node.body ||
|
| - firstSelectedNode == node.finallyBlock) {
|
| - invalidSelection(
|
| - "Selection must either cover whole try statement or parts of try, catch, or finally block.");
|
| - } else {
|
| - List<CatchClause> catchClauses = node.catchClauses;
|
| - for (CatchClause catchClause in catchClauses) {
|
| - if (firstSelectedNode == catchClause ||
|
| - firstSelectedNode == catchClause.body ||
|
| - firstSelectedNode == catchClause.exceptionParameter) {
|
| - invalidSelection(
|
| - "Selection must either cover whole try statement or parts of try, catch, or finally block.");
|
| - }
|
| - }
|
| - }
|
| - }
|
| - return null;
|
| - }
|
| -
|
| - @override
|
| - Object visitWhileStatement(WhileStatement node) {
|
| - super.visitWhileStatement(node);
|
| - List<AstNode> selectedNodes = this.selectedNodes;
|
| - if (_contains(selectedNodes, node.condition) &&
|
| - _contains(selectedNodes, node.body)) {
|
| - invalidSelection(
|
| - "Operation not applicable to a while statement's expression and body.");
|
| - }
|
| - return null;
|
| - }
|
| -
|
| - /**
|
| - * Checks final selected [AstNode]s after processing [CompilationUnit].
|
| - */
|
| - void _checkSelectedNodes(CompilationUnit unit) {
|
| - List<AstNode> nodes = selectedNodes;
|
| - // some tokens before first selected node
|
| - {
|
| - AstNode firstNode = nodes[0];
|
| - SourceRange rangeBeforeFirstNode = rangeStartStart(selection, firstNode);
|
| - if (_hasTokens(rangeBeforeFirstNode)) {
|
| - invalidSelection2(
|
| - "The beginning of the selection contains characters that do not belong to a statement.",
|
| - new RefactoringStatusContext.forUnit(unit, rangeBeforeFirstNode));
|
| - }
|
| - }
|
| - // some tokens after last selected node
|
| - {
|
| - AstNode lastNode = nodes.last;
|
| - SourceRange rangeAfterLastNode = rangeEndEnd(lastNode, selection);
|
| - if (_hasTokens(rangeAfterLastNode)) {
|
| - invalidSelection2(
|
| - "The end of the selection contains characters that do not belong to a statement.",
|
| - new RefactoringStatusContext.forUnit(unit, rangeAfterLastNode));
|
| - }
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Returns `true` if there are [Token]s in the given [SourceRange].
|
| - */
|
| - bool _hasTokens(SourceRange range) {
|
| - CompilationUnitElement unitElement = unit.element;
|
| - String fullText = unitElement.context.getContents(unitElement.source).data;
|
| - String rangeText = fullText.substring(range.offset, range.end);
|
| - return _getTokens(rangeText).isNotEmpty;
|
| - }
|
| -
|
| - /**
|
| - * Returns `true` if [nodes] contains [node].
|
| - */
|
| - static bool _contains(List<AstNode> nodes, AstNode node) =>
|
| - nodes.contains(node);
|
| -
|
| - /**
|
| - * Returns `true` if [nodes] contains one of the [otherNodes].
|
| - */
|
| - static bool _containsAny(List<AstNode> nodes, List<AstNode> otherNodes) {
|
| - for (AstNode otherNode in otherNodes) {
|
| - if (nodes.contains(otherNode)) {
|
| - return true;
|
| - }
|
| - }
|
| - return false;
|
| - }
|
| -}
|
|
|