| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 dart2js.resolution.members; | 5 library dart2js.resolution.members; |
| 6 | 6 |
| 7 import '../common.dart'; | 7 import '../common.dart'; |
| 8 import '../common/names.dart' show Selectors; | 8 import '../common/names.dart' show Selectors; |
| 9 import '../common/resolution.dart' show Resolution; | 9 import '../common/resolution.dart' show Resolution; |
| 10 import '../compile_time_constants.dart'; | 10 import '../compile_time_constants.dart'; |
| (...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 449 addToScope(parameterElement); | 449 addToScope(parameterElement); |
| 450 } | 450 } |
| 451 parameterNodes = parameterNodes.tail; | 451 parameterNodes = parameterNodes.tail; |
| 452 }); | 452 }); |
| 453 addDeferredAction(enclosingElement, () { | 453 addDeferredAction(enclosingElement, () { |
| 454 functionSignature.forEachOptionalParameter((ParameterElementX parameter) { | 454 functionSignature.forEachOptionalParameter((ParameterElementX parameter) { |
| 455 parameter.constant = | 455 parameter.constant = |
| 456 resolver.constantCompiler.compileConstant(parameter); | 456 resolver.constantCompiler.compileConstant(parameter); |
| 457 }); | 457 }); |
| 458 }); | 458 }); |
| 459 registry.registerCheckedModeCheck(functionSignature.returnType); | 459 if (!functionSignature.returnType.isDynamic) { |
| 460 registry.registerTypeUse( |
| 461 new TypeUse.checkedModeCheck(functionSignature.returnType)); |
| 462 } |
| 460 functionSignature.forEachParameter((ParameterElement element) { | 463 functionSignature.forEachParameter((ParameterElement element) { |
| 461 registry.registerCheckedModeCheck(element.type); | 464 if (!element.type.isDynamic) { |
| 465 registry.registerTypeUse(new TypeUse.checkedModeCheck(element.type)); |
| 466 } |
| 462 }); | 467 }); |
| 463 } | 468 } |
| 464 | 469 |
| 465 ResolutionResult visitAssert(Assert node) { | 470 ResolutionResult visitAssert(Assert node) { |
| 466 if (!options.enableAssertMessage) { | 471 if (!options.enableAssertMessage) { |
| 467 if (node.hasMessage) { | 472 if (node.hasMessage) { |
| 468 reporter.reportErrorMessage( | 473 reporter.reportErrorMessage( |
| 469 node, MessageKind.EXPERIMENTAL_ASSERT_MESSAGE); | 474 node, MessageKind.EXPERIMENTAL_ASSERT_MESSAGE); |
| 470 } | 475 } |
| 471 } | 476 } |
| (...skipping 1871 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2343 } else { | 2348 } else { |
| 2344 // TODO(johnniwinther): Handle invalid this access as an | 2349 // TODO(johnniwinther): Handle invalid this access as an |
| 2345 // [AccessSemantics]. | 2350 // [AccessSemantics]. |
| 2346 return handleErroneousAccess(node, name, semantics); | 2351 return handleErroneousAccess(node, name, semantics); |
| 2347 } | 2352 } |
| 2348 } | 2353 } |
| 2349 ResolutionResult result = visitExpressionPrefix(node.receiver); | 2354 ResolutionResult result = visitExpressionPrefix(node.receiver); |
| 2350 if (result.kind == ResultKind.PREFIX) { | 2355 if (result.kind == ResultKind.PREFIX) { |
| 2351 return handlePrefixSend(node, name, result); | 2356 return handlePrefixSend(node, name, result); |
| 2352 } else if (node.isConditional) { | 2357 } else if (node.isConditional) { |
| 2353 registry.registerConstantLiteral(new NullConstantExpression()); | |
| 2354 registry.registerDynamicUse(new DynamicUse(Selectors.equals, null)); | |
| 2355 return handleDynamicAccessSemantics( | 2358 return handleDynamicAccessSemantics( |
| 2356 node, name, new DynamicAccess.ifNotNullProperty(name)); | 2359 node, name, new DynamicAccess.ifNotNullProperty(name)); |
| 2357 } else { | 2360 } else { |
| 2358 // Handle dynamic property access, like `a.b` or `a.b()` where `a` is not | 2361 // Handle dynamic property access, like `a.b` or `a.b()` where `a` is not |
| 2359 // a prefix or class. | 2362 // a prefix or class. |
| 2360 // TODO(johnniwinther): Use the `element` of [result]. | 2363 // TODO(johnniwinther): Use the `element` of [result]. |
| 2361 return handleDynamicAccessSemantics( | 2364 return handleDynamicAccessSemantics( |
| 2362 node, name, new DynamicAccess.dynamicProperty(name)); | 2365 node, name, new DynamicAccess.dynamicProperty(name)); |
| 2363 } | 2366 } |
| 2364 } | 2367 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 2378 } else { | 2381 } else { |
| 2379 // TODO(johnniwinther): Handle invalid this access as an | 2382 // TODO(johnniwinther): Handle invalid this access as an |
| 2380 // [AccessSemantics]. | 2383 // [AccessSemantics]. |
| 2381 return handleUpdate(node, name, semantics); | 2384 return handleUpdate(node, name, semantics); |
| 2382 } | 2385 } |
| 2383 } | 2386 } |
| 2384 ResolutionResult result = visitExpressionPrefix(node.receiver); | 2387 ResolutionResult result = visitExpressionPrefix(node.receiver); |
| 2385 if (result.kind == ResultKind.PREFIX) { | 2388 if (result.kind == ResultKind.PREFIX) { |
| 2386 return handlePrefixSendSet(node, name, result); | 2389 return handlePrefixSendSet(node, name, result); |
| 2387 } else if (node.isConditional) { | 2390 } else if (node.isConditional) { |
| 2388 registry.registerConstantLiteral(new NullConstantExpression()); | |
| 2389 registry.registerDynamicUse(new DynamicUse(Selectors.equals, null)); | |
| 2390 return handleDynamicUpdateSemantics( | 2391 return handleDynamicUpdateSemantics( |
| 2391 node, name, null, new DynamicAccess.ifNotNullProperty(name)); | 2392 node, name, null, new DynamicAccess.ifNotNullProperty(name)); |
| 2392 } else { | 2393 } else { |
| 2393 // Handle dynamic property access, like `a.b = c`, `a.b++` or `a.b += c` | 2394 // Handle dynamic property access, like `a.b = c`, `a.b++` or `a.b += c` |
| 2394 // where `a` is not a prefix or class. | 2395 // where `a` is not a prefix or class. |
| 2395 // TODO(johnniwinther): Use the `element` of [result]. | 2396 // TODO(johnniwinther): Use the `element` of [result]. |
| 2396 return handleDynamicUpdateSemantics( | 2397 return handleDynamicUpdateSemantics( |
| 2397 node, name, null, new DynamicAccess.dynamicProperty(name)); | 2398 node, name, null, new DynamicAccess.dynamicProperty(name)); |
| 2398 } | 2399 } |
| 2399 } | 2400 } |
| (...skipping 1672 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4072 inConstContext: inConstContext)); | 4073 inConstContext: inConstContext)); |
| 4073 } | 4074 } |
| 4074 | 4075 |
| 4075 DartType resolveTypeAnnotation(TypeAnnotation node, | 4076 DartType resolveTypeAnnotation(TypeAnnotation node, |
| 4076 {bool malformedIsError: false, | 4077 {bool malformedIsError: false, |
| 4077 bool deferredIsMalformed: true, | 4078 bool deferredIsMalformed: true, |
| 4078 bool registerCheckedModeCheck: true}) { | 4079 bool registerCheckedModeCheck: true}) { |
| 4079 DartType type = typeResolver.resolveTypeAnnotation(this, node, | 4080 DartType type = typeResolver.resolveTypeAnnotation(this, node, |
| 4080 malformedIsError: malformedIsError, | 4081 malformedIsError: malformedIsError, |
| 4081 deferredIsMalformed: deferredIsMalformed); | 4082 deferredIsMalformed: deferredIsMalformed); |
| 4082 if (registerCheckedModeCheck) { | 4083 if (registerCheckedModeCheck && !type.isDynamic) { |
| 4083 registry.registerCheckedModeCheck(type); | 4084 registry.registerTypeUse(new TypeUse.checkedModeCheck(type)); |
| 4084 } | 4085 } |
| 4085 return type; | 4086 return type; |
| 4086 } | 4087 } |
| 4087 | 4088 |
| 4088 ResolutionResult visitLiteralList(LiteralList node) { | 4089 ResolutionResult visitLiteralList(LiteralList node) { |
| 4089 bool isValidAsConstant = true; | 4090 bool isValidAsConstant = true; |
| 4090 sendIsMemberAccess = false; | 4091 sendIsMemberAccess = false; |
| 4091 | 4092 |
| 4092 NodeList arguments = node.typeArguments; | 4093 NodeList arguments = node.typeArguments; |
| 4093 DartType typeArgument; | 4094 DartType typeArgument; |
| (...skipping 505 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4599 continueLabels[labelName] = labelElement; | 4600 continueLabels[labelName] = labelElement; |
| 4600 } | 4601 } |
| 4601 cases = cases.tail; | 4602 cases = cases.tail; |
| 4602 // Test that only the last case, if any, is a default case. | 4603 // Test that only the last case, if any, is a default case. |
| 4603 if (switchCase.defaultKeyword != null && !cases.isEmpty) { | 4604 if (switchCase.defaultKeyword != null && !cases.isEmpty) { |
| 4604 reporter.reportErrorMessage( | 4605 reporter.reportErrorMessage( |
| 4605 switchCase, MessageKind.INVALID_CASE_DEFAULT); | 4606 switchCase, MessageKind.INVALID_CASE_DEFAULT); |
| 4606 } | 4607 } |
| 4607 if (cases.isNotEmpty && switchCase.statements.isNotEmpty) { | 4608 if (cases.isNotEmpty && switchCase.statements.isNotEmpty) { |
| 4608 Node last = switchCase.statements.last; | 4609 Node last = switchCase.statements.last; |
| 4609 if (last.asReturn() == null && | 4610 if (last.asBreakStatement() == null && |
| 4610 last.asBreakStatement() == null && | |
| 4611 last.asContinueStatement() == null && | 4611 last.asContinueStatement() == null && |
| 4612 (last.asExpressionStatement() == null || | 4612 last.asThrow() == null && |
| 4613 last.asExpressionStatement().expression.asThrow() == null)) { | 4613 last.asReturn() == null) { |
| 4614 registry.registerFeature(Feature.FALL_THROUGH_ERROR); | 4614 registry.registerFeature(Feature.FALL_THROUGH_ERROR); |
| 4615 } | 4615 } |
| 4616 } | 4616 } |
| 4617 } | 4617 } |
| 4618 | 4618 |
| 4619 addDeferredAction(enclosingElement, () { | 4619 addDeferredAction(enclosingElement, () { |
| 4620 checkCaseExpressions(node); | 4620 checkCaseExpressions(node); |
| 4621 }); | 4621 }); |
| 4622 | 4622 |
| 4623 statementScope.enterSwitch(breakElement, continueLabels); | 4623 statementScope.enterSwitch(breakElement, continueLabels); |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4743 } | 4743 } |
| 4744 return const NoneResult(); | 4744 return const NoneResult(); |
| 4745 } | 4745 } |
| 4746 } | 4746 } |
| 4747 | 4747 |
| 4748 /// Looks up [name] in [scope] and unwraps the result. | 4748 /// Looks up [name] in [scope] and unwraps the result. |
| 4749 Element lookupInScope( | 4749 Element lookupInScope( |
| 4750 DiagnosticReporter reporter, Node node, Scope scope, String name) { | 4750 DiagnosticReporter reporter, Node node, Scope scope, String name) { |
| 4751 return Elements.unwrap(scope.lookup(name), reporter, node); | 4751 return Elements.unwrap(scope.lookup(name), reporter, node); |
| 4752 } | 4752 } |
| OLD | NEW |