Chromium Code Reviews| 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 part of resolution; | 5 part of resolution; |
| 6 | 6 |
| 7 abstract class TreeElements { | 7 abstract class TreeElements { |
| 8 Element get currentElement; | 8 Element get currentElement; |
| 9 Set<Node> get superUses; | 9 Set<Node> get superUses; |
| 10 | 10 |
| (...skipping 2957 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2968 error(node, MessageKind.NO_CATCH_NOR_FINALLY); | 2968 error(node, MessageKind.NO_CATCH_NOR_FINALLY); |
| 2969 } | 2969 } |
| 2970 visit(node.catchBlocks); | 2970 visit(node.catchBlocks); |
| 2971 visit(node.finallyBlock); | 2971 visit(node.finallyBlock); |
| 2972 } | 2972 } |
| 2973 | 2973 |
| 2974 visitCatchBlock(CatchBlock node) { | 2974 visitCatchBlock(CatchBlock node) { |
| 2975 compiler.backend.registerCatchStatement(world, mapping); | 2975 compiler.backend.registerCatchStatement(world, mapping); |
| 2976 // Check that if catch part is present, then | 2976 // Check that if catch part is present, then |
| 2977 // it has one or two formal parameters. | 2977 // it has one or two formal parameters. |
| 2978 VariableDefinitions exceptionDefinition; | |
| 2979 VariableDefinitions stackTraceDefinition; | |
| 2978 if (node.formals != null) { | 2980 if (node.formals != null) { |
| 2979 if (node.formals.isEmpty) { | 2981 Link<Node> link = node.formals.nodes; |
|
karlklose
2013/05/27 12:43:54
link -> formalsToProcess? formalsLink?
| |
| 2982 if (link.isEmpty) { | |
| 2980 error(node, MessageKind.EMPTY_CATCH_DECLARATION); | 2983 error(node, MessageKind.EMPTY_CATCH_DECLARATION); |
| 2981 } | 2984 } else { |
| 2982 if (!node.formals.nodes.tail.isEmpty) { | 2985 exceptionDefinition = link.head; |
| 2983 if (!node.formals.nodes.tail.tail.isEmpty) { | 2986 link = link.tail; |
| 2984 for (Node extra in node.formals.nodes.tail.tail) { | 2987 if (!link.isEmpty) { |
| 2985 error(extra, MessageKind.EXTRA_CATCH_DECLARATION); | 2988 stackTraceDefinition = link.head; |
| 2989 link = link.tail; | |
| 2990 if (!link.isEmpty) { | |
| 2991 for (Node extra in link) { | |
| 2992 error(extra, MessageKind.EXTRA_CATCH_DECLARATION); | |
| 2993 } | |
| 2986 } | 2994 } |
| 2995 compiler.backend.registerStackTraceInCatch(mapping); | |
| 2987 } | 2996 } |
| 2988 compiler.backend.registerStackTraceInCatch(mapping); | |
| 2989 } | 2997 } |
| 2990 | 2998 |
| 2991 // Check that the formals aren't optional and that they have no | 2999 // Check that the formals aren't optional and that they have no |
| 2992 // modifiers or type. | 3000 // modifiers or type. |
| 2993 for (Link<Node> link = node.formals.nodes; | 3001 for (link = node.formals.nodes; !link.isEmpty; link = link.tail) { |
| 2994 !link.isEmpty; | |
| 2995 link = link.tail) { | |
| 2996 // If the formal parameter is a node list, it means that it is a | 3002 // If the formal parameter is a node list, it means that it is a |
| 2997 // sequence of optional parameters. | 3003 // sequence of optional parameters. |
| 2998 NodeList nodeList = link.head.asNodeList(); | 3004 NodeList nodeList = link.head.asNodeList(); |
| 2999 if (nodeList != null) { | 3005 if (nodeList != null) { |
| 3000 error(nodeList, MessageKind.OPTIONAL_PARAMETER_IN_CATCH); | 3006 error(nodeList, MessageKind.OPTIONAL_PARAMETER_IN_CATCH); |
| 3001 } else { | 3007 } else { |
| 3002 VariableDefinitions declaration = link.head; | 3008 VariableDefinitions declaration = link.head; |
| 3003 for (Node modifier in declaration.modifiers.nodes) { | 3009 for (Node modifier in declaration.modifiers.nodes) { |
| 3004 error(modifier, MessageKind.PARAMETER_WITH_MODIFIER_IN_CATCH); | 3010 error(modifier, MessageKind.PARAMETER_WITH_MODIFIER_IN_CATCH); |
| 3005 } | 3011 } |
| 3006 TypeAnnotation type = declaration.type; | 3012 TypeAnnotation type = declaration.type; |
| 3007 if (type != null) { | 3013 if (type != null) { |
| 3008 error(type, MessageKind.PARAMETER_WITH_TYPE_IN_CATCH); | 3014 error(type, MessageKind.PARAMETER_WITH_TYPE_IN_CATCH); |
| 3009 } | 3015 } |
| 3010 } | 3016 } |
| 3011 } | 3017 } |
| 3012 } | 3018 } |
| 3013 | 3019 |
| 3014 Scope blockScope = new BlockScope(scope); | 3020 Scope blockScope = new BlockScope(scope); |
| 3015 var wasTypeRequired = typeRequired; | 3021 var wasTypeRequired = typeRequired; |
| 3016 typeRequired = true; | 3022 typeRequired = true; |
| 3017 doInCheckContext(() => visitIn(node.type, blockScope)); | 3023 doInCheckContext(() => visitIn(node.type, blockScope)); |
| 3018 typeRequired = wasTypeRequired; | 3024 typeRequired = wasTypeRequired; |
| 3019 visitIn(node.formals, blockScope); | 3025 visitIn(node.formals, blockScope); |
| 3020 var oldInCatchBlock = inCatchBlock; | 3026 var oldInCatchBlock = inCatchBlock; |
| 3021 inCatchBlock = true; | 3027 inCatchBlock = true; |
| 3022 visitIn(node.block, blockScope); | 3028 visitIn(node.block, blockScope); |
| 3023 inCatchBlock = oldInCatchBlock; | 3029 inCatchBlock = oldInCatchBlock; |
| 3030 | |
| 3031 if (node.type != null && exceptionDefinition != null) { | |
| 3032 DartType exceptionType = mapping.getType(node.type); | |
| 3033 Node exceptionVariable = exceptionDefinition.definitions.nodes.head; | |
| 3034 VariableElementX exceptionElement = mapping[exceptionVariable]; | |
| 3035 exceptionElement.variables.type = exceptionType; | |
| 3036 } | |
| 3037 if (stackTraceDefinition != null) { | |
| 3038 Node stackTraceVariable = stackTraceDefinition.definitions.nodes.head; | |
| 3039 VariableElementX stackTraceElement = mapping[stackTraceVariable]; | |
| 3040 world.registerInstantiatedClass(compiler.stackTraceClass, mapping); | |
| 3041 stackTraceElement.variables.type = compiler.stackTraceClass.rawType; | |
| 3042 } | |
| 3024 } | 3043 } |
| 3025 | 3044 |
| 3026 visitTypedef(Typedef node) { | 3045 visitTypedef(Typedef node) { |
| 3027 unimplemented(node, 'typedef'); | 3046 unimplemented(node, 'typedef'); |
| 3028 } | 3047 } |
| 3029 } | 3048 } |
| 3030 | 3049 |
| 3031 class TypeDefinitionVisitor extends MappingVisitor<DartType> { | 3050 class TypeDefinitionVisitor extends MappingVisitor<DartType> { |
| 3032 Scope scope; | 3051 Scope scope; |
| 3033 final TypeDeclarationElement enclosingElement; | 3052 final TypeDeclarationElement enclosingElement; |
| (...skipping 905 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3939 return e; | 3958 return e; |
| 3940 } | 3959 } |
| 3941 | 3960 |
| 3942 /// Assumed to be called by [resolveRedirectingFactory]. | 3961 /// Assumed to be called by [resolveRedirectingFactory]. |
| 3943 Element visitReturn(Return node) { | 3962 Element visitReturn(Return node) { |
| 3944 Node expression = node.expression; | 3963 Node expression = node.expression; |
| 3945 return finishConstructorReference(visit(expression), | 3964 return finishConstructorReference(visit(expression), |
| 3946 expression, expression); | 3965 expression, expression); |
| 3947 } | 3966 } |
| 3948 } | 3967 } |
| OLD | NEW |