Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(639)

Side by Side Diff: pkg/front_end/lib/src/fasta/kernel/body_builder.dart

Issue 2930673002: Implement initializer asserts. (Closed)
Patch Set: Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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'
11 show Assert, FormalParameterType, MemberKind, optional;
11 12
12 import '../parser/identifier_context.dart' show IdentifierContext; 13 import '../parser/identifier_context.dart' show IdentifierContext;
13 14
14 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart'; 15 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart';
15 16
16 import 'package:front_end/src/fasta/kernel/utils.dart' show offsetForToken; 17 import 'package:front_end/src/fasta/kernel/utils.dart' show offsetForToken;
17 18
18 import 'package:front_end/src/fasta/type_inference/type_inferrer.dart' 19 import 'package:front_end/src/fasta/type_inference/type_inferrer.dart'
19 show TypeInferrer; 20 show TypeInferrer;
20 21
(...skipping 2421 matching lines...) Expand 10 before | Expand all | Expand 10 after
2442 exitLoopOrSwitch(result); 2443 exitLoopOrSwitch(result);
2443 } 2444 }
2444 2445
2445 @override 2446 @override
2446 void handleEmptyStatement(Token token) { 2447 void handleEmptyStatement(Token token) {
2447 debugEvent("EmptyStatement"); 2448 debugEvent("EmptyStatement");
2448 push(new EmptyStatement()); 2449 push(new EmptyStatement());
2449 } 2450 }
2450 2451
2451 @override 2452 @override
2452 void handleAssertStatement(Token assertKeyword, Token leftParenthesis, 2453 void beginAssert(Token assertKeyword, Assert kind) {
2453 Token commaToken, Token rightParenthesis, Token semicolonToken) { 2454 debugEvent("beginAssert");
2454 debugEvent("AssertStatement"); 2455 inInitializer = false;
kasperl 2017/06/08 10:23:14 Add a comment to explain why you have to turn this
ahe 2017/06/08 11:04:33 This value is never restored. I've added a comment
2455 Expression message = popForValueIfNotNull(commaToken);
2456 Expression condition = popForValue();
2457 push(new AssertStatement(condition, message));
2458 } 2456 }
2459 2457
2460 @override 2458 @override
2459 void endAssert(Token assertKeyword, Assert kind, Token leftParenthesis,
2460 Token commaToken, Token rightParenthesis, Token semicolonToken) {
2461 debugEvent("Assert");
2462 Expression message = popForValueIfNotNull(commaToken);
2463 Expression condition = popForValue();
2464 AssertStatement statement = new AssertStatement(condition, message);
2465 switch (kind) {
2466 case Assert.Statement:
2467 push(statement);
2468 break;
2469
2470 case Assert.Expression:
2471 push(buildCompileTimeError("`assert` can't be used as an expression."));
2472 break;
2473
2474 case Assert.Initializer:
2475 push(buildAssertInitializer(statement));
2476 break;
2477 }
2478 }
2479
2480 Initializer buildAssertInitializer(AssertStatement statement) {
2481 return new LocalInitializer(new VariableDeclaration.forValue(
kasperl 2017/06/08 10:23:14 It would be useful if you could explain the struct
ahe 2017/06/08 11:04:33 Done.
2482 buildMethodInvocation(
2483 new FunctionExpression(new FunctionNode(statement)),
2484 callName,
2485 new Arguments.empty(),
2486 statement.fileOffset,
2487 isConstantExpression: true,
2488 isImplicitCall: true)));
2489 }
2490
2491 @override
2461 void endYieldStatement(Token yieldToken, Token starToken, Token endToken) { 2492 void endYieldStatement(Token yieldToken, Token starToken, Token endToken) {
2462 debugEvent("YieldStatement"); 2493 debugEvent("YieldStatement");
2463 push(new KernelYieldStatement(popForValue(), isYieldStar: starToken != null) 2494 push(new KernelYieldStatement(popForValue(), isYieldStar: starToken != null)
2464 ..fileOffset = yieldToken.charOffset); 2495 ..fileOffset = yieldToken.charOffset);
2465 } 2496 }
2466 2497
2467 @override 2498 @override
2468 void beginSwitchBlock(Token token) { 2499 void beginSwitchBlock(Token token) {
2469 debugEvent("beginSwitchBlock"); 2500 debugEvent("beginSwitchBlock");
2470 enterLocalScope(); 2501 enterLocalScope();
(...skipping 951 matching lines...) Expand 10 before | Expand all | Expand 10 after
3422 if (starToken == null) { 3453 if (starToken == null) {
3423 return AsyncMarker.Async; 3454 return AsyncMarker.Async;
3424 } else { 3455 } else {
3425 assert(identical(starToken.stringValue, "*")); 3456 assert(identical(starToken.stringValue, "*"));
3426 return AsyncMarker.AsyncStar; 3457 return AsyncMarker.AsyncStar;
3427 } 3458 }
3428 } else { 3459 } else {
3429 return internalError("Unknown async modifier: $asyncToken"); 3460 return internalError("Unknown async modifier: $asyncToken");
3430 } 3461 }
3431 } 3462 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698