OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
2 | 2 |
3 // for details. All rights reserved. Use of this source code is governed by a | 3 // for details. All rights reserved. Use of this source code is governed by a |
4 // BSD-style license that can be found in the LICENSE file. | 4 // BSD-style license that can be found in the LICENSE file. |
5 | 5 |
6 import 'dart:collection' show HashMap, HashSet; | 6 import 'dart:collection' show HashMap, HashSet; |
7 import 'dart:math' show min, max; | 7 import 'dart:math' show min, max; |
8 | 8 |
9 import 'package:analyzer/analyzer.dart' hide ConstantEvaluator; | 9 import 'package:analyzer/analyzer.dart' hide ConstantEvaluator; |
10 import 'package:analyzer/dart/ast/ast.dart'; | 10 import 'package:analyzer/dart/ast/ast.dart'; |
(...skipping 3213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3224 op = op.substring(0, op.length - 1); // remove trailing '=' | 3224 op = op.substring(0, op.length - 1); // remove trailing '=' |
3225 return _emitOpAssign(left, right, op, node.staticElement, context: node); | 3225 return _emitOpAssign(left, right, op, node.staticElement, context: node); |
3226 } | 3226 } |
3227 | 3227 |
3228 JS.MetaLet _emitOpAssign( | 3228 JS.MetaLet _emitOpAssign( |
3229 Expression left, Expression right, String op, MethodElement element, | 3229 Expression left, Expression right, String op, MethodElement element, |
3230 {Expression context}) { | 3230 {Expression context}) { |
3231 if (op == '??') { | 3231 if (op == '??') { |
3232 // Desugar `l ??= r` as ((x) => x == null ? l = r : x)(l) | 3232 // Desugar `l ??= r` as ((x) => x == null ? l = r : x)(l) |
3233 // Note that if `x` contains subexpressions, we need to ensure those | 3233 // Note that if `x` contains subexpressions, we need to ensure those |
3234 // are also evaluated only once. This is similar to desguaring for | 3234 // are also evaluated only once. This is similar to desugaring for |
3235 // postfix expressions like `i++`. | 3235 // postfix expressions like `i++`. |
3236 | 3236 |
3237 // Handle the left hand side, to ensure each of its subexpressions are | 3237 // Handle the left hand side, to ensure each of its subexpressions are |
3238 // evaluated only once. | 3238 // evaluated only once. |
3239 var vars = <JS.MetaLetVariable, JS.Expression>{}; | 3239 var vars = <JS.MetaLetVariable, JS.Expression>{}; |
3240 var x = _bindLeftHandSide(vars, left, context: left); | 3240 var x = _bindLeftHandSide(vars, left, context: left); |
3241 // Capture the result of evaluating the left hand side in a temp. | 3241 // Capture the result of evaluating the left hand side in a temp. |
3242 var t = _bindValue(vars, 't', x, context: x); | 3242 var t = _bindValue(vars, 't', x, context: x); |
3243 return new JS.MetaLet(vars, [ | 3243 return new JS.MetaLet(vars, [ |
3244 js.call('# == null ? # : #', [_visit(t), _emitSet(x, right), _visit(t)]) | 3244 js.call('# == null ? # : #', [_visit(t), _emitSet(x, right), _visit(t)]) |
(...skipping 1134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4379 Expression node, JS.Expression uncoerced) { | 4379 Expression node, JS.Expression uncoerced) { |
4380 // Don't coerce if the parent will coerce. | 4380 // Don't coerce if the parent will coerce. |
4381 AstNode parent = _parentOperation(node); | 4381 AstNode parent = _parentOperation(node); |
4382 if (_nodeIsBitwiseOperation(parent)) return uncoerced; | 4382 if (_nodeIsBitwiseOperation(parent)) return uncoerced; |
4383 | 4383 |
4384 // Don't do a no-op coerce if the most significant bit is zero. | 4384 // Don't do a no-op coerce if the most significant bit is zero. |
4385 if (_is31BitUnsigned(node)) return uncoerced; | 4385 if (_is31BitUnsigned(node)) return uncoerced; |
4386 | 4386 |
4387 // If the consumer of the expression is '==' or '!=' with a constant that | 4387 // If the consumer of the expression is '==' or '!=' with a constant that |
4388 // fits in 31 bits, adding a coercion does not change the result of the | 4388 // fits in 31 bits, adding a coercion does not change the result of the |
4389 // comparision, e.g. `a & ~b == 0`. | 4389 // comparison, e.g. `a & ~b == 0`. |
4390 if (parent is BinaryExpression) { | 4390 if (parent is BinaryExpression) { |
4391 var tokenType = parent.operator.type; | 4391 var tokenType = parent.operator.type; |
4392 Expression left = parent.leftOperand; | 4392 Expression left = parent.leftOperand; |
4393 Expression right = parent.rightOperand; | 4393 Expression right = parent.rightOperand; |
4394 if (tokenType == TokenType.EQ_EQ || tokenType == TokenType.BANG_EQ) { | 4394 if (tokenType == TokenType.EQ_EQ || tokenType == TokenType.BANG_EQ) { |
4395 const int MAX = 0x7fffffff; | 4395 const int MAX = 0x7fffffff; |
4396 if (_asIntInRange(right, 0, MAX) != null) return uncoerced; | 4396 if (_asIntInRange(right, 0, MAX) != null) return uncoerced; |
4397 if (_asIntInRange(left, 0, MAX) != null) return uncoerced; | 4397 if (_asIntInRange(left, 0, MAX) != null) return uncoerced; |
4398 } else if (tokenType == TokenType.GT_GT) { | 4398 } else if (tokenType == TokenType.GT_GT) { |
4399 if (_isDefinitelyNonNegative(left) && | 4399 if (_isDefinitelyNonNegative(left) && |
(...skipping 1728 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6128 if (targetIdentifier.staticElement is! PrefixElement) return false; | 6128 if (targetIdentifier.staticElement is! PrefixElement) return false; |
6129 var prefix = targetIdentifier.staticElement as PrefixElement; | 6129 var prefix = targetIdentifier.staticElement as PrefixElement; |
6130 | 6130 |
6131 // The library the prefix is referring to must come from a deferred import. | 6131 // The library the prefix is referring to must come from a deferred import. |
6132 var containingLibrary = resolutionMap | 6132 var containingLibrary = resolutionMap |
6133 .elementDeclaredByCompilationUnit(target.root as CompilationUnit) | 6133 .elementDeclaredByCompilationUnit(target.root as CompilationUnit) |
6134 .library; | 6134 .library; |
6135 var imports = containingLibrary.getImportsWithPrefix(prefix); | 6135 var imports = containingLibrary.getImportsWithPrefix(prefix); |
6136 return imports.length == 1 && imports[0].isDeferred; | 6136 return imports.length == 1 && imports[0].isDeferred; |
6137 } | 6137 } |
OLD | NEW |