Index: lib/src/codegen/assignments_index.dart |
diff --git a/lib/src/codegen/assignments_index.dart b/lib/src/codegen/assignments_index.dart |
deleted file mode 100644 |
index 38402bcc7803dc030e6e8b2b27a18cd7809db005..0000000000000000000000000000000000000000 |
--- a/lib/src/codegen/assignments_index.dart |
+++ /dev/null |
@@ -1,145 +0,0 @@ |
-// Copyright (c) 2015, 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. |
- |
-import 'package:analyzer/dart/ast/token.dart'; |
-import 'package:analyzer/src/generated/ast.dart'; |
-import 'package:analyzer/src/generated/element.dart'; |
- |
-import 'ast_builder.dart'; |
- |
-/// Creates an index of variable assignments and declarations occurring in all |
-/// the provided [nodes]. |
-/// |
-/// Expands any compound assignment expression (e.g. `i += 2` yields an assigned |
-/// expression of `i + 2`), and treats declarations with no assignment as having |
-/// a `null` assigned expression. |
-Map<LocalVariableElement, List<Expression>> indexLocalAssignments( |
- Iterable<AstNode> nodes) { |
- var visitor = new _LocalAssignmentsVisitor(); |
- nodes.forEach((n) => n.accept(visitor)); |
- return visitor.assignedExpressions; |
-} |
- |
-/// Visits variable declarations and assignments and exposes an |
-/// [AssignmentIndex] interface. |
-/// |
-// TODO(ochafik): Introduce flow analysis (a variable may be nullable in |
-// some places and not in others). |
-class _LocalAssignmentsVisitor extends RecursiveAstVisitor { |
- final assignedExpressions = <LocalVariableElement, List<Expression>>{}; |
- |
- @override |
- visitVariableDeclaration(VariableDeclaration node) { |
- var element = node.element; |
- if (element is LocalVariableElement) { |
- _addAssignment(element, node.initializer ?? AstBuilder.nullLiteral()); |
- } |
- super.visitVariableDeclaration(node); |
- } |
- |
- @override |
- visitCatchClause(CatchClause node) { |
- for (var ident in [node.exceptionParameter, node.stackTraceParameter]) { |
- if (ident == null) continue; |
- assert(ident.staticElement is LocalVariableElement); |
- _addAssignment(ident.staticElement, AstBuilder.nullLiteral()); |
- } |
- } |
- |
- @override |
- visitAssignmentExpression(AssignmentExpression node) { |
- var lhs = node.leftHandSide; |
- var e = _getLocalVariable(lhs); |
- if (e != null) _addAssignment(e, node.rightHandSide); |
- super.visitAssignmentExpression(node); |
- } |
- |
- @override |
- visitBinaryExpression(BinaryExpression node) { |
- var op = node.operator.type; |
- if (op.isAssignmentOperator) { |
- var e = _getLocalVariable(node.leftOperand); |
- if (e != null) { |
- // TODO(ochafik): Once we have non-nullable types, compute the static |
- // type for this AST node. |
- _addAssignment( |
- e, |
- RawAstBuilder.binaryExpression(node.leftOperand, |
- _opToken(_expandAssignmentOp(op)), node.rightOperand)); |
- } |
- } |
- super.visitBinaryExpression(node); |
- } |
- |
- @override |
- visitPostfixExpression(PostfixExpression node) { |
- var op = node.operator.type; |
- if (op.isAssignmentOperator) { |
- // Treat `x++` as statically assigning `x + 1` to variable `x`. |
- var e = _getLocalVariable(node.operand); |
- if (e != null) _handleIncrOrDecr(e, node.operand, op); |
- } |
- super.visitPostfixExpression(node); |
- } |
- |
- @override |
- visitPrefixExpression(PrefixExpression node) { |
- var op = node.operator.type; |
- if (op.isAssignmentOperator) { |
- // Treat `++x` as statically assigning `x + 1` to variable `x`. |
- var e = _getLocalVariable(node.operand); |
- if (e != null) _handleIncrOrDecr(e, node.operand, op); |
- } |
- super.visitPrefixExpression(node); |
- } |
- |
- /// Note: we're not interested in differences between prefix & suffix. |
- _handleIncrOrDecr(LocalVariableElement e, Expression operand, TokenType op) { |
- if (!op.isIncrementOperator) throw new ArgumentError('Unexpected op: $op'); |
- // TODO(ochafik): Once we have non-nullable types, compute the static |
- // type for this AST node. |
- _addAssignment( |
- e, |
- RawAstBuilder.binaryExpression( |
- operand, _opToken(op), AstBuilder.integerLiteral(1))); |
- } |
- |
- void _addAssignment(VariableElement e, Expression value) => |
- assignedExpressions.putIfAbsent(e, () => <Expression>[]).add(value); |
- |
- LocalVariableElement _getLocalVariable(Expression target) { |
- if (target is SimpleIdentifier) { |
- var e = target.bestElement; |
- if (e is LocalVariableElement && e is! PropertyAccessorElement) { |
- return e; |
- } |
- } |
- return null; |
- } |
-} |
- |
-const Map<TokenType, TokenType> _opByAssignmentOp = const { |
- TokenType.AMPERSAND_EQ: TokenType.AMPERSAND, |
- TokenType.BAR_EQ: TokenType.BAR, |
- TokenType.CARET_EQ: TokenType.CARET, |
- TokenType.GT_GT_EQ: TokenType.GT_GT, |
- TokenType.LT_LT_EQ: TokenType.LT_LT, |
- TokenType.MINUS_EQ: TokenType.MINUS, |
- TokenType.PERCENT_EQ: TokenType.PERCENT, |
- TokenType.PLUS_EQ: TokenType.PLUS, |
- TokenType.QUESTION_QUESTION_EQ: TokenType.QUESTION_QUESTION, |
- TokenType.SLASH_EQ: TokenType.SLASH, |
- TokenType.STAR_EQ: TokenType.STAR, |
- TokenType.TILDE_SLASH_EQ: TokenType.TILDE_SLASH, |
-}; |
- |
-Token _opToken(TokenType t) => new Token(t, 0); |
- |
-/// Transforms `+=` to `+`, `??=` to `??`, etc. |
-TokenType _expandAssignmentOp(TokenType assignmentOp) { |
- assert(assignmentOp.isAssignmentOperator); |
- var op = _opByAssignmentOp[assignmentOp]; |
- if (op == null) throw new ArgumentError("Can't expand op $assignmentOp"); |
- return op; |
-} |