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

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

Issue 2968093003: Improve parsing of function expressions. (Closed)
Patch Set: Update to new message API. Created 3 years, 5 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' show Message; 7 import '../fasta_codes.dart' show Message;
8 8
9 import '../fasta_codes.dart' as fasta; 9 import '../fasta_codes.dart' as fasta;
10 10
(...skipping 2419 matching lines...) Expand 10 before | Expand all | Expand 10 after
2430 } 2430 }
2431 2431
2432 void exitFunction() { 2432 void exitFunction() {
2433 debugEvent("exitFunction"); 2433 debugEvent("exitFunction");
2434 functionNestingLevel--; 2434 functionNestingLevel--;
2435 inCatchBlock = pop(); 2435 inCatchBlock = pop();
2436 switchScope = pop(); 2436 switchScope = pop();
2437 } 2437 }
2438 2438
2439 @override 2439 @override
2440 void beginFunction(Token token) { 2440 void beginFunctionDeclaration(Token token) {
2441 debugEvent("beginFunction"); 2441 debugEvent("beginNamedFunctionExpression");
2442 enterFunction(); 2442 enterFunction();
2443 } 2443 }
2444 2444
2445 @override 2445 @override
2446 void beginUnnamedFunction(Token token) { 2446 void beginNamedFunctionExpression(Token token) {
2447 debugEvent("beginUnnamedFunction"); 2447 debugEvent("beginNamedFunctionExpression");
2448 enterFunction(); 2448 enterFunction();
2449 } 2449 }
2450 2450
2451 @override 2451 @override
2452 void endFunction(Token getOrSet, Token endToken) { 2452 void beginFunctionExpression(Token token) {
2453 debugEvent("Function"); 2453 debugEvent("beginFunctionExpression");
2454 enterFunction();
2455 }
2456
2457 @override
2458 void endNamedFunctionExpression(Token endToken) {
2459 debugEvent("NamedFunctionExpression");
2454 Statement body = popStatement(); 2460 Statement body = popStatement();
2455 AsyncMarker asyncModifier = pop(); 2461 AsyncMarker asyncModifier = pop();
2456 if (functionNestingLevel != 0) { 2462 if (functionNestingLevel != 0) {
2457 exitLocalScope(); 2463 exitLocalScope();
2458 } 2464 }
2459 FormalParameters formals = pop(); 2465 FormalParameters formals = pop();
2460 List<TypeParameter> typeParameters = typeVariableBuildersToKernel(pop()); 2466 List<TypeParameter> typeParameters = typeVariableBuildersToKernel(pop());
2461 push(formals.addToFunction(new FunctionNode(body, 2467
2462 typeParameters: typeParameters, asyncMarker: asyncModifier) 2468 exitLocalScope();
2463 ..fileOffset = formals.charOffset 2469 KernelFunctionDeclaration declaration = pop();
2464 ..fileEndOffset = endToken.charOffset)); 2470 VariableDeclaration variable = declaration.variable;
2471 var returnType = pop();
2472 returnType ??= const DynamicType();
2473 pop(); // Modifiers.
2474 exitFunction();
2475
2476 variable.initializer = new KernelFunctionExpression(formals.addToFunction(
2477 new FunctionNode(body,
2478 typeParameters: typeParameters, asyncMarker: asyncModifier)
2479 ..fileOffset = formals.charOffset
2480 ..fileEndOffset = endToken.charOffset))
2481 ..parent = variable
2482 ..fileOffset = formals.charOffset;
2483 push(new Let(variable, new VariableGet(variable)));
2465 } 2484 }
2466 2485
2467 @override 2486 @override
2468 void endFunctionDeclaration(Token token) { 2487 void endFunctionDeclaration(Token endToken) {
2469 debugEvent("FunctionDeclaration"); 2488 debugEvent("FunctionDeclaration");
2470 FunctionNode function = pop(); 2489 Statement body = popStatement();
2490 AsyncMarker asyncModifier = pop();
2491 if (functionNestingLevel != 0) {
2492 exitLocalScope();
2493 }
2494 FormalParameters formals = pop();
2495 List<TypeParameter> typeParameters = typeVariableBuildersToKernel(pop());
2496 FunctionNode function = formals.addToFunction(new FunctionNode(body,
2497 typeParameters: typeParameters, asyncMarker: asyncModifier)
2498 ..fileOffset = formals.charOffset
2499 ..fileEndOffset = endToken.charOffset);
2471 exitLocalScope(); 2500 exitLocalScope();
2472 var declaration = pop(); 2501 var declaration = pop();
2473 var returnType = pop(); 2502 var returnType = pop();
2474 var hasImplicitReturnType = returnType == null; 2503 var hasImplicitReturnType = returnType == null;
2475 returnType ??= const DynamicType(); 2504 returnType ??= const DynamicType();
2476 pop(); // Modifiers. 2505 pop(); // Modifiers.
2477 exitFunction(); 2506 exitFunction();
2478 if (declaration is FunctionDeclaration) { 2507 if (declaration is FunctionDeclaration) {
2479 KernelFunctionDeclaration.setHasImplicitReturnType( 2508 KernelFunctionDeclaration.setHasImplicitReturnType(
2480 declaration, hasImplicitReturnType); 2509 declaration, hasImplicitReturnType);
2481 function.returnType = returnType; 2510 function.returnType = returnType;
2482 declaration.variable.type = function.functionType; 2511 declaration.variable.type = function.functionType;
2483 declaration.function = function; 2512 declaration.function = function;
2484 function.parent = declaration; 2513 function.parent = declaration;
2485 } else { 2514 } else {
2486 // If [declaration] isn't a [FunctionDeclaration], it must be because 2515 // If [declaration] isn't a [FunctionDeclaration], it must be because
2487 // there was a compile-time error. 2516 // there was a compile-time error.
2488 2517
2489 // TODO(paulberry): ensure that when integrating with analyzer, type 2518 // TODO(paulberry): ensure that when integrating with analyzer, type
2490 // inference is still performed for the dropped declaration. 2519 // inference is still performed for the dropped declaration.
2491 assert(library.hasCompileTimeErrors); 2520 assert(library.hasCompileTimeErrors);
2492 } 2521 }
2493 push(declaration); 2522 push(declaration);
2494 } 2523 }
2495 2524
2496 @override 2525 @override
2497 void endUnnamedFunction(Token beginToken, Token token) { 2526 void endFunctionExpression(Token beginToken, Token token) {
2498 debugEvent("UnnamedFunction"); 2527 debugEvent("FunctionExpression");
2499 Statement body = popStatement(); 2528 Statement body = popStatement();
2500 AsyncMarker asyncModifier = pop(); 2529 AsyncMarker asyncModifier = pop();
2501 exitLocalScope(); 2530 exitLocalScope();
2502 FormalParameters formals = pop(); 2531 FormalParameters formals = pop();
2503 exitFunction(); 2532 exitFunction();
2504 List<TypeParameter> typeParameters = typeVariableBuildersToKernel(pop()); 2533 List<TypeParameter> typeParameters = typeVariableBuildersToKernel(pop());
2505 FunctionNode function = formals.addToFunction(new FunctionNode(body, 2534 FunctionNode function = formals.addToFunction(new FunctionNode(body,
2506 typeParameters: typeParameters, asyncMarker: asyncModifier) 2535 typeParameters: typeParameters, asyncMarker: asyncModifier)
2507 ..fileOffset = beginToken.charOffset 2536 ..fileOffset = beginToken.charOffset
2508 ..fileEndOffset = token.charOffset); 2537 ..fileEndOffset = token.charOffset);
(...skipping 1286 matching lines...) Expand 10 before | Expand all | Expand 10 after
3795 if (starToken == null) { 3824 if (starToken == null) {
3796 return AsyncMarker.Async; 3825 return AsyncMarker.Async;
3797 } else { 3826 } else {
3798 assert(identical(starToken.stringValue, "*")); 3827 assert(identical(starToken.stringValue, "*"));
3799 return AsyncMarker.AsyncStar; 3828 return AsyncMarker.AsyncStar;
3800 } 3829 }
3801 } else { 3830 } else {
3802 return deprecated_internalProblem("Unknown async modifier: $asyncToken"); 3831 return deprecated_internalProblem("Unknown async modifier: $asyncToken");
3803 } 3832 }
3804 } 3833 }
OLDNEW
« no previous file with comments | « pkg/front_end/lib/src/fasta/fasta_codes_generated.dart ('k') | pkg/front_end/lib/src/fasta/parser/listener.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698