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

Side by Side Diff: pkg/front_end/lib/src/fasta/analyzer/ast_builder.dart

Issue 2751913002: Parse constructor field initializers with Fasta. (Closed)
Patch Set: Fix for DietListener test failure. Created 3 years, 9 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.analyzer.ast_builder; 5 library fasta.analyzer.ast_builder;
6 6
7 import 'package:analyzer/analyzer.dart'; 7 import 'package:analyzer/analyzer.dart';
8 import 'package:analyzer/dart/ast/ast_factory.dart' show AstFactory; 8 import 'package:analyzer/dart/ast/ast_factory.dart' show AstFactory;
9 import 'package:analyzer/dart/ast/standard_ast_factory.dart' as standard; 9 import 'package:analyzer/dart/ast/standard_ast_factory.dart' as standard;
10 import 'package:analyzer/dart/ast/token.dart' as analyzer show Token; 10 import 'package:analyzer/dart/ast/token.dart' as analyzer show Token;
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after
385 toAnalyzerToken(elseToken), 385 toAnalyzerToken(elseToken),
386 elsePart)); 386 elsePart));
387 } 387 }
388 388
389 void prepareInitializers() { 389 void prepareInitializers() {
390 debugEvent("prepareInitializers"); 390 debugEvent("prepareInitializers");
391 } 391 }
392 392
393 void handleNoInitializers() { 393 void handleNoInitializers() {
394 debugEvent("NoInitializers"); 394 debugEvent("NoInitializers");
395 push(NullValue.ConstructorInitializers);
395 } 396 }
396 397
397 void endInitializers(int count, Token beginToken, Token endToken) { 398 void endInitializers(int count, Token beginToken, Token endToken) {
398 debugEvent("Initializers"); 399 debugEvent("Initializers");
399 popList(count); 400 push(popList(count));
400 } 401 }
401 402
402 void endVariableInitializer(Token assignmentOperator) { 403 void endVariableInitializer(Token assignmentOperator) {
403 debugEvent("VariableInitializer"); 404 debugEvent("VariableInitializer");
404 assert(assignmentOperator.stringValue == "="); 405 assert(assignmentOperator.stringValue == "=");
405 Expression initializer = pop(); 406 Expression initializer = pop();
406 Identifier identifier = pop(); 407 Identifier identifier = pop();
407 // TODO(ahe): Don't push initializers, instead install them. 408 // TODO(ahe): Don't push initializers, instead install them.
408 push(ast.variableDeclaration( 409 push(ast.variableDeclaration(
409 identifier, toAnalyzerToken(assignmentOperator), initializer)); 410 identifier, toAnalyzerToken(assignmentOperator), initializer));
(...skipping 990 matching lines...) Expand 10 before | Expand all | Expand 10 after
1400 List<TypeParameter> typeParameters = popList(count); 1401 List<TypeParameter> typeParameters = popList(count);
1401 push(ast.typeParameterList(toAnalyzerToken(beginToken), typeParameters, 1402 push(ast.typeParameterList(toAnalyzerToken(beginToken), typeParameters,
1402 toAnalyzerToken(endToken))); 1403 toAnalyzerToken(endToken)));
1403 } 1404 }
1404 1405
1405 @override 1406 @override
1406 void endMethod(Token getOrSet, Token beginToken, Token endToken) { 1407 void endMethod(Token getOrSet, Token beginToken, Token endToken) {
1407 debugEvent("Method"); 1408 debugEvent("Method");
1408 FunctionBody body = pop(); 1409 FunctionBody body = pop();
1409 ConstructorName redirectedConstructor = null; // TODO(paulberry) 1410 ConstructorName redirectedConstructor = null; // TODO(paulberry)
1410 List<ConstructorInitializer> initializers = null; // TODO(paulberry) 1411 List<Object> initializerObjects = pop() ?? const [];
1411 Token separator = null; // TODO(paulberry) 1412 Token separator = null; // TODO(paulberry)
1412 FormalParameterList parameters = pop(); 1413 FormalParameterList parameters = pop();
1413 TypeParameterList typeParameters = pop(); // TODO(paulberry) 1414 TypeParameterList typeParameters = pop(); // TODO(paulberry)
1414 var name = pop(); 1415 var name = pop();
1415 TypeAnnotation returnType = pop(); // TODO(paulberry) 1416 TypeAnnotation returnType = pop(); // TODO(paulberry)
1416 _Modifiers modifiers = pop(); 1417 _Modifiers modifiers = pop();
1417 List<Annotation> metadata = pop(); 1418 List<Annotation> metadata = pop();
1418 Comment comment = pop(); 1419 Comment comment = pop();
1419 1420
1421 var initializers = <ConstructorInitializer>[];
1422 for (Object initializerObject in initializerObjects) {
1423 if (initializerObject is AssignmentExpression) {
1424 analyzer.Token thisKeyword;
1425 analyzer.Token period;
1426 SimpleIdentifier fieldName;
1427 Expression left = initializerObject.leftHandSide;
1428 if (left is PropertyAccess) {
1429 var thisExpression = left.target as ThisExpression;
1430 thisKeyword = thisExpression.thisKeyword;
1431 period = left.operator;
1432 fieldName = left.propertyName;
1433 } else {
1434 fieldName = left as SimpleIdentifier;
1435 }
1436 initializers.add(ast.constructorFieldInitializer(
1437 thisKeyword,
1438 period,
1439 fieldName,
1440 initializerObject.operator,
1441 initializerObject.rightHandSide));
1442 }
1443 }
1444
1420 void constructor(SimpleIdentifier returnType, analyzer.Token period, 1445 void constructor(SimpleIdentifier returnType, analyzer.Token period,
1421 SimpleIdentifier name) { 1446 SimpleIdentifier name) {
1422 push(ast.constructorDeclaration( 1447 push(ast.constructorDeclaration(
1423 comment, 1448 comment,
1424 metadata, 1449 metadata,
1425 toAnalyzerToken(modifiers?.externalKeyword), 1450 toAnalyzerToken(modifiers?.externalKeyword),
1426 toAnalyzerToken(modifiers?.finalConstOrVarKeyword), 1451 toAnalyzerToken(modifiers?.finalConstOrVarKeyword),
1427 null, // TODO(paulberry): factoryKeyword 1452 null, // TODO(paulberry): factoryKeyword
1428 ast.simpleIdentifier(returnType.token), 1453 ast.simpleIdentifier(returnType.token),
1429 period, 1454 period,
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after
1725 } else if (identical('static', s)) { 1750 } else if (identical('static', s)) {
1726 staticKeyword = token; 1751 staticKeyword = token;
1727 } else if (identical('var', s)) { 1752 } else if (identical('var', s)) {
1728 finalConstOrVarKeyword = token; 1753 finalConstOrVarKeyword = token;
1729 } else { 1754 } else {
1730 internalError('Unhandled modifier: $s'); 1755 internalError('Unhandled modifier: $s');
1731 } 1756 }
1732 } 1757 }
1733 } 1758 }
1734 } 1759 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698