| 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 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library dev_compiler.src.checker.rules; | 5 library dev_compiler.src.checker.rules; |
| 6 | 6 |
| 7 import 'package:analyzer/src/generated/ast.dart'; | 7 import 'package:analyzer/src/generated/ast.dart'; |
| 8 import 'package:analyzer/src/generated/element.dart'; | 8 import 'package:analyzer/src/generated/element.dart'; |
| 9 import 'package:analyzer/src/generated/resolver.dart'; | 9 import 'package:analyzer/src/generated/resolver.dart'; |
| 10 | 10 |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 var t = getStaticType(applicand); | 68 var t = getStaticType(applicand); |
| 69 if (t is InterfaceType) { | 69 if (t is InterfaceType) { |
| 70 return getCallMethodType(t); | 70 return getCallMethodType(t); |
| 71 } | 71 } |
| 72 if (t is FunctionType) return t; | 72 if (t is FunctionType) return t; |
| 73 return null; | 73 return null; |
| 74 } | 74 } |
| 75 | 75 |
| 76 DartType elementType(Element e); | 76 DartType elementType(Element e); |
| 77 | 77 |
| 78 bool isDynamic(DartType t); | |
| 79 bool isDynamicTarget(Expression expr); | 78 bool isDynamicTarget(Expression expr); |
| 80 bool isDynamicCall(Expression call); | 79 bool isDynamicCall(Expression call); |
| 81 } | 80 } |
| 82 | 81 |
| 82 // TODO(jmesserly): this is unused. |
| 83 class DartRules extends TypeRules { | 83 class DartRules extends TypeRules { |
| 84 DartRules(TypeProvider provider) : super(provider); | 84 DartRules(TypeProvider provider) : super(provider); |
| 85 | 85 |
| 86 MissingTypeReporter reportMissingType = null; | 86 MissingTypeReporter reportMissingType = null; |
| 87 | 87 |
| 88 bool isSubTypeOf(DartType t1, DartType t2) { | 88 bool isSubTypeOf(DartType t1, DartType t2) { |
| 89 return t1.isSubtypeOf(t2); | 89 return t1.isSubtypeOf(t2); |
| 90 } | 90 } |
| 91 | 91 |
| 92 bool isAssignable(DartType t1, DartType t2) { | 92 bool isAssignable(DartType t1, DartType t2) { |
| (...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 458 } | 458 } |
| 459 if (c is Cast) return DownCast.create(this, expr, c, reason: reason); | 459 if (c is Cast) return DownCast.create(this, expr, c, reason: reason); |
| 460 assert(false); | 460 assert(false); |
| 461 return null; | 461 return null; |
| 462 } | 462 } |
| 463 | 463 |
| 464 DartType elementType(Element e) { | 464 DartType elementType(Element e) { |
| 465 return (e as dynamic).type; | 465 return (e as dynamic).type; |
| 466 } | 466 } |
| 467 | 467 |
| 468 bool isDynamic(DartType t) => options.ignoreTypes || t.isDynamic; | |
| 469 | |
| 470 /// Returns `true` if the target expression is dynamic. | 468 /// Returns `true` if the target expression is dynamic. |
| 471 bool isDynamicTarget(Expression target) => | 469 // TODO(jmesserly): remove this in favor of utils? Or a static method here? |
| 472 options.ignoreTypes || utils.isDynamicTarget(target); | 470 bool isDynamicTarget(Expression target) => utils.isDynamicTarget(target); |
| 473 | 471 |
| 474 /// Returns `true` if the expression is a dynamic function call or method | 472 /// Returns `true` if the expression is a dynamic function call or method |
| 475 /// invocation. | 473 /// invocation. |
| 476 bool isDynamicCall(Expression call) { | 474 bool isDynamicCall(Expression call) { |
| 477 if (options.ignoreTypes) return true; | |
| 478 var t = getTypeAsCaller(call); | 475 var t = getTypeAsCaller(call); |
| 479 // TODO(leafp): This will currently return true if t is Function | 476 // TODO(leafp): This will currently return true if t is Function |
| 480 // This is probably the most correct thing to do for now, since | 477 // This is probably the most correct thing to do for now, since |
| 481 // this code is also used by the back end. Maybe revisit at some | 478 // this code is also used by the back end. Maybe revisit at some |
| 482 // point? | 479 // point? |
| 483 if (t == null) return true; | 480 if (t == null) return true; |
| 484 // Dynamic as the parameter type is treated as bottom. A function with | 481 // Dynamic as the parameter type is treated as bottom. A function with |
| 485 // a dynamic parameter type requires a dynamic call in general. | 482 // a dynamic parameter type requires a dynamic call in general. |
| 486 // However, as an optimization, if we have an original definition, we know | 483 // However, as an optimization, if we have an original definition, we know |
| 487 // dynamic is reified as Object - in this case a regular call is fine. | 484 // dynamic is reified as Object - in this case a regular call is fine. |
| (...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 781 var entries = e.entries; | 778 var entries = e.entries; |
| 782 bool inferEntry(MapLiteralEntry entry) { | 779 bool inferEntry(MapLiteralEntry entry) { |
| 783 return _inferExpression(entry.key, kType, errors) && | 780 return _inferExpression(entry.key, kType, errors) && |
| 784 _inferExpression(entry.value, vType, errors); | 781 _inferExpression(entry.value, vType, errors); |
| 785 } | 782 } |
| 786 var b = entries.every(inferEntry); | 783 var b = entries.every(inferEntry); |
| 787 if (b) annotateMapLiteral(e, targs); | 784 if (b) annotateMapLiteral(e, targs); |
| 788 return b; | 785 return b; |
| 789 } | 786 } |
| 790 } | 787 } |
| OLD | NEW |