Chromium Code Reviews| 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 /// Encapsulates how to invoke the analyzer resolver and overrides how it | 5 /// Encapsulates how to invoke the analyzer resolver and overrides how it |
| 6 /// computes types on expressions to use our restricted set of types. | 6 /// computes types on expressions to use our restricted set of types. |
| 7 library ddc.src.checker.resolver; | 7 library ddc.src.checker.resolver; |
| 8 | 8 |
| 9 import 'package:analyzer/analyzer.dart'; | 9 import 'package:analyzer/analyzer.dart'; |
| 10 import 'package:analyzer/src/generated/ast.dart'; | 10 import 'package:analyzer/src/generated/ast.dart'; |
| (...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 356 // otherLib.visibleLibraries.contains(thisLib), however because we are not | 356 // otherLib.visibleLibraries.contains(thisLib), however because we are not |
| 357 // inferring type on any library that belongs to a cycle or that contains | 357 // inferring type on any library that belongs to a cycle or that contains |
| 358 // parts, we know that this cannot be true. | 358 // parts, we know that this cannot be true. |
| 359 return thisLib == otherLib; | 359 return thisLib == otherLib; |
| 360 } | 360 } |
| 361 | 361 |
| 362 @override // to propagate types to identifiers | 362 @override // to propagate types to identifiers |
| 363 visitMethodInvocation(MethodInvocation node) { | 363 visitMethodInvocation(MethodInvocation node) { |
| 364 // TODO(sigmund): follow up with analyzer team - why is this needed? | 364 // TODO(sigmund): follow up with analyzer team - why is this needed? |
| 365 visitSimpleIdentifier(node.methodName); | 365 visitSimpleIdentifier(node.methodName); |
| 366 return super.visitMethodInvocation(node); | 366 super.visitMethodInvocation(node); |
| 367 | |
| 368 // Fix types for JS builtin calls. | |
| 369 // Analyzer has already computed them in the call above, we just need to | |
| 370 // save it as the method's static return type. | |
| 371 var e = node.methodName.staticElement; | |
| 372 if (e is FunctionElement && | |
| 373 e.library.name == '_foreign_helper' && | |
| 374 e.name == 'JS') { | |
| 375 node.staticType = node.propagatedType; | |
|
vsm
2015/02/27 17:20:05
We haven't been using propagatedType so far - not
Jennifer Messerly
2015/02/27 18:27:07
Analyzer is doing exactly the right logic:
https:/
vsm
2015/02/27 18:39:31
I agree, it's doing the right logic right now. I'
Jennifer Messerly
2015/02/27 18:48:09
I'm super confused :|
soundness -- what does that
vsm
2015/02/27 18:58:02
Sorry for belaboring the point. :-) Here's anoth
Jennifer Messerly
2015/02/27 19:24:48
ah, gotcha. yeah I see how someone could misunders
| |
| 376 } | |
| 367 } | 377 } |
| 368 | 378 |
| 369 // Review note: no longer need to override visitFunctionExpression, this is | 379 // Review note: no longer need to override visitFunctionExpression, this is |
| 370 // handled by the analyzer internally. | 380 // handled by the analyzer internally. |
| 371 // TODO(vsm): in visitbinaryExpression: check computeStaticReturnType result? | 381 // TODO(vsm): in visitbinaryExpression: check computeStaticReturnType result? |
| 372 // TODO(vsm): in visitConditionalExpression: check... LUB in rules? | 382 // TODO(vsm): in visitConditionalExpression: check... LUB in rules? |
| 373 // TODO(vsm): in visitFunctionDeclaration: Should we ever use the expression | 383 // TODO(vsm): in visitFunctionDeclaration: Should we ever use the expression |
| 374 // type in a (...) => expr or just the written type? | 384 // type in a (...) => expr or just the written type? |
| 375 | 385 |
| 376 } | 386 } |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 419 element.returnType.isDynamic && | 429 element.returnType.isDynamic && |
| 420 node.returnType == null) { | 430 node.returnType == null) { |
| 421 var type = searchTypeFor(element.enclosingElement.type, element); | 431 var type = searchTypeFor(element.enclosingElement.type, element); |
| 422 if (type != null && !type.returnType.isDynamic) { | 432 if (type != null && !type.returnType.isDynamic) { |
| 423 element.returnType = type.returnType; | 433 element.returnType = type.returnType; |
| 424 } | 434 } |
| 425 } | 435 } |
| 426 return res; | 436 return res; |
| 427 } | 437 } |
| 428 } | 438 } |
| OLD | NEW |