OLD | NEW |
---|---|
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 fasta.body_builder; | 5 library fasta.body_builder; |
6 | 6 |
7 import '../fasta_codes.dart' | 7 import '../fasta_codes.dart' |
8 show FastaMessage, codeExpectedButGot, codeExpectedFunctionBody; | 8 show FastaMessage, codeExpectedButGot, codeExpectedFunctionBody; |
9 | 9 |
10 import '../parser/parser.dart' show FormalParameterType, MemberKind, optional; | 10 import '../parser/parser.dart' show FormalParameterType, MemberKind, optional; |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
298 if (outerSwitchScope == null) { | 298 if (outerSwitchScope == null) { |
299 addCompileTimeError(-1, "Label not found: '$name'."); | 299 addCompileTimeError(-1, "Label not found: '$name'."); |
300 } else { | 300 } else { |
301 outerSwitchScope.forwardDeclareLabel(name, builder); | 301 outerSwitchScope.forwardDeclareLabel(name, builder); |
302 } | 302 } |
303 }); | 303 }); |
304 } | 304 } |
305 switchScope = outerSwitchScope; | 305 switchScope = outerSwitchScope; |
306 } | 306 } |
307 | 307 |
308 void declareVariable(VariableDeclaration variable) { | |
309 InputError error = scope.declare( | |
310 variable.name, | |
311 new KernelVariableBuilder( | |
312 variable, member ?? classBuilder ?? library, uri), | |
313 variable.fileOffset, | |
314 uri); | |
315 if (error != null) { | |
ahe
2017/05/23 15:04:24
This is currently dead code as error is always nul
| |
316 addCompileTimeError( | |
317 variable.fileOffset, | |
318 "Can't declare '${variable.name}' because it was already used in " | |
319 "this scope."); | |
320 library.addCompileTimeError(error.charOffset, error.error, | |
321 fileUri: error.uri); | |
322 } | |
323 } | |
324 | |
308 @override | 325 @override |
309 JumpTarget createJumpTarget(JumpTargetKind kind, int charOffset) { | 326 JumpTarget createJumpTarget(JumpTargetKind kind, int charOffset) { |
310 return new JumpTarget(kind, functionNestingLevel, member, charOffset); | 327 return new JumpTarget(kind, functionNestingLevel, member, charOffset); |
311 } | 328 } |
312 | 329 |
313 @override | 330 @override |
314 void endMetadata(Token beginToken, Token periodBeforeName, Token endToken) { | 331 void endMetadata(Token beginToken, Token periodBeforeName, Token endToken) { |
315 debugEvent("Metadata"); | 332 debugEvent("Metadata"); |
316 pop(); // Arguments. | 333 pop(); // Arguments. |
317 popIfNotNull(periodBeforeName); // Postfix. | 334 popIfNotNull(periodBeforeName); // Postfix. |
(...skipping 818 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1136 } | 1153 } |
1137 } | 1154 } |
1138 | 1155 |
1139 @override | 1156 @override |
1140 void endInitializedIdentifier(Token nameToken) { | 1157 void endInitializedIdentifier(Token nameToken) { |
1141 // TODO(ahe): Use [InitializedIdentifier] here? | 1158 // TODO(ahe): Use [InitializedIdentifier] here? |
1142 debugEvent("InitializedIdentifier"); | 1159 debugEvent("InitializedIdentifier"); |
1143 VariableDeclaration variable = pop(); | 1160 VariableDeclaration variable = pop(); |
1144 variable.fileOffset = nameToken.charOffset; | 1161 variable.fileOffset = nameToken.charOffset; |
1145 push(variable); | 1162 push(variable); |
1146 scope[variable.name] = new KernelVariableBuilder( | 1163 declareVariable(variable); |
1147 variable, member ?? classBuilder ?? library, uri); | |
1148 } | 1164 } |
1149 | 1165 |
1150 @override | 1166 @override |
1151 void beginVariablesDeclaration(Token token) { | 1167 void beginVariablesDeclaration(Token token) { |
1152 debugEvent("beginVariablesDeclaration"); | 1168 debugEvent("beginVariablesDeclaration"); |
1153 DartType type = pop(); | 1169 DartType type = pop(); |
1154 int modifiers = Modifier.validate(pop()); | 1170 int modifiers = Modifier.validate(pop()); |
1155 super.push(currentLocalVariableModifiers); | 1171 super.push(currentLocalVariableModifiers); |
1156 super.push(currentLocalVariableType ?? NullValue.Type); | 1172 super.push(currentLocalVariableType ?? NullValue.Type); |
1157 currentLocalVariableType = type; | 1173 currentLocalVariableType = type; |
(...skipping 897 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2055 @override | 2071 @override |
2056 void endFunctionName(Token beginToken, Token token) { | 2072 void endFunctionName(Token beginToken, Token token) { |
2057 debugEvent("FunctionName"); | 2073 debugEvent("FunctionName"); |
2058 Identifier name = pop(); | 2074 Identifier name = pop(); |
2059 VariableDeclaration variable = astFactory.variableDeclaration( | 2075 VariableDeclaration variable = astFactory.variableDeclaration( |
2060 name.name, name.token, functionNestingLevel, | 2076 name.name, name.token, functionNestingLevel, |
2061 isFinal: true, isLocalFunction: true); | 2077 isFinal: true, isLocalFunction: true); |
2062 push(new KernelFunctionDeclaration( | 2078 push(new KernelFunctionDeclaration( |
2063 variable, new FunctionNode(new InvalidStatement())) | 2079 variable, new FunctionNode(new InvalidStatement())) |
2064 ..fileOffset = beginToken.charOffset); | 2080 ..fileOffset = beginToken.charOffset); |
2065 scope[variable.name] = new KernelVariableBuilder( | 2081 declareVariable(variable); |
2066 variable, member ?? classBuilder ?? library, uri); | |
2067 enterLocalScope(); | 2082 enterLocalScope(); |
2068 } | 2083 } |
2069 | 2084 |
2070 void enterFunction() { | 2085 void enterFunction() { |
2071 debugEvent("enterFunction"); | 2086 debugEvent("enterFunction"); |
2072 functionNestingLevel++; | 2087 functionNestingLevel++; |
2073 push(switchScope ?? NullValue.SwitchScope); | 2088 push(switchScope ?? NullValue.SwitchScope); |
2074 switchScope = null; | 2089 switchScope = null; |
2075 push(inCatchBlock); | 2090 push(inCatchBlock); |
2076 inCatchBlock = false; | 2091 inCatchBlock = false; |
(...skipping 584 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2661 } | 2676 } |
2662 for (Expression argument in expressions.reversed) { | 2677 for (Expression argument in expressions.reversed) { |
2663 expression = new Let( | 2678 expression = new Let( |
2664 new VariableDeclaration.forValue(argument, isFinal: true), | 2679 new VariableDeclaration.forValue(argument, isFinal: true), |
2665 expression); | 2680 expression); |
2666 } | 2681 } |
2667 return expression; | 2682 return expression; |
2668 } | 2683 } |
2669 | 2684 |
2670 @override | 2685 @override |
2686 void addCompileTimeErrorFromMessage(FastaMessage message) { | |
2687 library.addCompileTimeError(message.charOffset, message.message, | |
2688 fileUri: message.uri); | |
2689 } | |
2690 | |
2691 @override | |
2671 void debugEvent(String name) { | 2692 void debugEvent(String name) { |
2672 // printEvent(name); | 2693 // printEvent(name); |
2673 } | 2694 } |
2674 | 2695 |
2675 @override | 2696 @override |
2676 StaticGet makeStaticGet(Member readTarget, Token token) { | 2697 StaticGet makeStaticGet(Member readTarget, Token token) { |
2677 // TODO(paulberry): only record the dependencies mandated by the top level | 2698 // TODO(paulberry): only record the dependencies mandated by the top level |
2678 // type inference spec. | 2699 // type inference spec. |
2679 if (fieldDependencies != null && readTarget is KernelField) { | 2700 if (fieldDependencies != null && readTarget is KernelField) { |
2680 var fieldNode = _typeInferrer.getFieldNodeForReadTarget(readTarget); | 2701 var fieldNode = _typeInferrer.getFieldNodeForReadTarget(readTarget); |
(...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3167 if (starToken == null) { | 3188 if (starToken == null) { |
3168 return AsyncMarker.Async; | 3189 return AsyncMarker.Async; |
3169 } else { | 3190 } else { |
3170 assert(identical(starToken.stringValue, "*")); | 3191 assert(identical(starToken.stringValue, "*")); |
3171 return AsyncMarker.AsyncStar; | 3192 return AsyncMarker.AsyncStar; |
3172 } | 3193 } |
3173 } else { | 3194 } else { |
3174 return internalError("Unknown async modifier: $asyncToken"); | 3195 return internalError("Unknown async modifier: $asyncToken"); |
3175 } | 3196 } |
3176 } | 3197 } |
OLD | NEW |