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

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

Issue 2904673003: Remove AstFactory from the front end. (Closed)
Patch Set: Created 3 years, 7 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' show FormalParameterType, MemberKind, optional;
11 11
12 import '../parser/identifier_context.dart' show IdentifierContext; 12 import '../parser/identifier_context.dart' show IdentifierContext;
13 13
14 import 'package:front_end/src/fasta/builder/ast_factory.dart' show AstFactory;
15
16 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart' 14 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart'
ahe 2017/05/24 18:12:57 FWIW, I think it makes sense to remove the show cl
Paul Berry 2017/05/24 18:24:11 Agreed, it's not adding much value at this point :
17 show 15 show
18 KernelArguments, 16 KernelArguments,
17 KernelAsExpression,
18 KernelAwaitExpression,
19 KernelBlock,
20 KernelBoolLiteral,
21 KernelConditionalExpression,
22 KernelConstructorInvocation,
23 KernelDirectMethodInvocation,
24 KernelDirectPropertyGet,
25 KernelDoubleLiteral,
26 KernelExpressionStatement,
27 KernelFactoryConstructorInvocation,
19 KernelField, 28 KernelField,
20 KernelFunctionDeclaration, 29 KernelFunctionDeclaration,
30 KernelFunctionExpression,
31 KernelIfStatement,
32 KernelIntLiteral,
33 KernelIsExpression,
34 KernelIsNotExpression,
35 KernelListLiteral,
36 KernelLogicalExpression,
37 KernelMapLiteral,
38 KernelNot,
39 KernelNullLiteral,
40 KernelRethrow,
21 KernelReturnStatement, 41 KernelReturnStatement,
42 KernelStaticGet,
43 KernelStaticInvocation,
44 KernelStringConcatenation,
45 KernelStringLiteral,
46 KernelSuperMethodInvocation,
47 KernelSuperPropertyGet,
48 KernelSymbolLiteral,
49 KernelThisExpression,
50 KernelThrow,
51 KernelTypeLiteral,
52 KernelVariableDeclaration,
22 KernelYieldStatement; 53 KernelYieldStatement;
23 54
24 import 'package:front_end/src/fasta/kernel/utils.dart' show offsetForToken; 55 import 'package:front_end/src/fasta/kernel/utils.dart' show offsetForToken;
25 56
26 import 'package:front_end/src/fasta/type_inference/type_inference_engine.dart' 57 import 'package:front_end/src/fasta/type_inference/type_inference_engine.dart'
27 show FieldNode; 58 show FieldNode;
28 59
29 import 'package:front_end/src/fasta/type_inference/type_inferrer.dart' 60 import 'package:front_end/src/fasta/type_inference/type_inferrer.dart'
30 show TypeInferrer; 61 show TypeInferrer;
31 62
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 final Scope enclosingScope; 125 final Scope enclosingScope;
95 126
96 final bool isDartLibrary; 127 final bool isDartLibrary;
97 128
98 @override 129 @override
99 final Uri uri; 130 final Uri uri;
100 131
101 final TypeInferrer _typeInferrer; 132 final TypeInferrer _typeInferrer;
102 133
103 @override 134 @override
104 final AstFactory astFactory;
105
106 @override
107 final TypePromoter<Expression, VariableDeclaration> typePromoter; 135 final TypePromoter<Expression, VariableDeclaration> typePromoter;
108 136
109 /// If not `null`, dependencies on fields are accumulated into this list. 137 /// If not `null`, dependencies on fields are accumulated into this list.
110 /// 138 ///
111 /// If `null`, no dependency information is recorded. 139 /// If `null`, no dependency information is recorded.
112 final List<FieldNode> fieldDependencies; 140 final List<FieldNode> fieldDependencies;
113 141
114 /// Only used when [member] is a constructor. It tracks if an implicit super 142 /// Only used when [member] is a constructor. It tracks if an implicit super
115 /// initializer is needed. 143 /// initializer is needed.
116 /// 144 ///
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 KernelLibraryBuilder library, 181 KernelLibraryBuilder library,
154 this.member, 182 this.member,
155 Scope scope, 183 Scope scope,
156 this.formalParameterScope, 184 this.formalParameterScope,
157 this.hierarchy, 185 this.hierarchy,
158 this.coreTypes, 186 this.coreTypes,
159 this.classBuilder, 187 this.classBuilder,
160 this.isInstanceMember, 188 this.isInstanceMember,
161 this.uri, 189 this.uri,
162 this._typeInferrer, 190 this._typeInferrer,
163 this.astFactory,
164 {this.fieldDependencies}) 191 {this.fieldDependencies})
165 : enclosingScope = scope, 192 : enclosingScope = scope,
166 library = library, 193 library = library,
167 isDartLibrary = library.uri.scheme == "dart", 194 isDartLibrary = library.uri.scheme == "dart",
168 needsImplicitSuperInitializer = 195 needsImplicitSuperInitializer =
169 coreTypes.objectClass != classBuilder?.cls, 196 coreTypes.objectClass != classBuilder?.cls,
170 typePromoter = _typeInferrer.typePromoter, 197 typePromoter = _typeInferrer.typePromoter,
171 super(scope); 198 super(scope);
172 199
173 bool get hasParserError => recoverableErrors.isNotEmpty; 200 bool get hasParserError => recoverableErrors.isNotEmpty;
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
256 var statement = statements[i]; 283 var statement = statements[i];
257 if (statement is List) { 284 if (statement is List) {
258 copy ??= new List<Statement>.from(statements.getRange(0, i)); 285 copy ??= new List<Statement>.from(statements.getRange(0, i));
259 // TODO(sigmund): remove this assignment (issue #28651) 286 // TODO(sigmund): remove this assignment (issue #28651)
260 Iterable subStatements = statement; 287 Iterable subStatements = statement;
261 copy.addAll(subStatements); 288 copy.addAll(subStatements);
262 } else if (copy != null) { 289 } else if (copy != null) {
263 copy.add(statement); 290 copy.add(statement);
264 } 291 }
265 } 292 }
266 return astFactory.block(copy ?? statements, beginToken); 293 return new KernelBlock(copy ?? statements)
294 ..fileOffset = offsetForToken(beginToken);
267 } 295 }
268 296
269 Statement popStatementIfNotNull(Object value) { 297 Statement popStatementIfNotNull(Object value) {
270 return value == null ? null : popStatement(); 298 return value == null ? null : popStatement();
271 } 299 }
272 300
273 Statement popStatement() { 301 Statement popStatement() {
274 var statement = pop(); 302 var statement = pop();
275 if (statement is List) { 303 if (statement is List) {
276 return new Block(new List<Statement>.from(statement)); 304 return new Block(new List<Statement>.from(statement));
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
489 KernelFunctionBuilder builder = member; 517 KernelFunctionBuilder builder = member;
490 builder.body = body; 518 builder.body = body;
491 if (formals?.optional != null) { 519 if (formals?.optional != null) {
492 Iterator<FormalParameterBuilder> formalBuilders = 520 Iterator<FormalParameterBuilder> formalBuilders =
493 builder.formals.skip(formals.required.length).iterator; 521 builder.formals.skip(formals.required.length).iterator;
494 for (VariableDeclaration parameter in formals.optional.formals) { 522 for (VariableDeclaration parameter in formals.optional.formals) {
495 bool hasMore = formalBuilders.moveNext(); 523 bool hasMore = formalBuilders.moveNext();
496 assert(hasMore); 524 assert(hasMore);
497 VariableDeclaration realParameter = formalBuilders.current.target; 525 VariableDeclaration realParameter = formalBuilders.current.target;
498 Expression initializer = 526 Expression initializer =
499 parameter.initializer ?? astFactory.nullLiteral(null); 527 parameter.initializer ?? new KernelNullLiteral();
500 realParameter.initializer = initializer..parent = realParameter; 528 realParameter.initializer = initializer..parent = realParameter;
501 } 529 }
502 } 530 }
503 if (builder is KernelConstructorBuilder) { 531 if (builder is KernelConstructorBuilder) {
504 finishConstructor(builder, asyncModifier); 532 finishConstructor(builder, asyncModifier);
505 } else if (builder is KernelProcedureBuilder) { 533 } else if (builder is KernelProcedureBuilder) {
506 builder.asyncModifier = asyncModifier; 534 builder.asyncModifier = asyncModifier;
507 } else { 535 } else {
508 internalError("Unhandled: ${builder.runtimeType}"); 536 internalError("Unhandled: ${builder.runtimeType}");
509 } 537 }
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
553 /// >and no body is provided, then c implicitly has an empty body {}. 581 /// >and no body is provided, then c implicitly has an empty body {}.
554 /// We use an empty statement instead. 582 /// We use an empty statement instead.
555 constructor.function.body = new EmptyStatement(); 583 constructor.function.body = new EmptyStatement();
556 constructor.function.body.parent = constructor.function; 584 constructor.function.body.parent = constructor.function;
557 } 585 }
558 } 586 }
559 587
560 @override 588 @override
561 void endExpressionStatement(Token token) { 589 void endExpressionStatement(Token token) {
562 debugEvent("ExpressionStatement"); 590 debugEvent("ExpressionStatement");
563 push(astFactory.expressionStatement(popForEffect())); 591 push(new KernelExpressionStatement(popForEffect()));
564 } 592 }
565 593
566 @override 594 @override
567 void endArguments(int count, Token beginToken, Token endToken) { 595 void endArguments(int count, Token beginToken, Token endToken) {
568 debugEvent("Arguments"); 596 debugEvent("Arguments");
569 List arguments = popList(count) ?? <Expression>[]; 597 List arguments = popList(count) ?? <Expression>[];
570 int firstNamedArgumentIndex = arguments.length; 598 int firstNamedArgumentIndex = arguments.length;
571 for (int i = 0; i < arguments.length; i++) { 599 for (int i = 0; i < arguments.length; i++) {
572 var node = arguments[i]; 600 var node = arguments[i];
573 if (node is NamedExpression) { 601 if (node is NamedExpression) {
574 firstNamedArgumentIndex = 602 firstNamedArgumentIndex =
575 i < firstNamedArgumentIndex ? i : firstNamedArgumentIndex; 603 i < firstNamedArgumentIndex ? i : firstNamedArgumentIndex;
576 } else { 604 } else {
577 arguments[i] = toValue(node); 605 arguments[i] = toValue(node);
578 if (i > firstNamedArgumentIndex) { 606 if (i > firstNamedArgumentIndex) {
579 arguments[i] = new NamedExpression( 607 arguments[i] = new NamedExpression(
580 "#$i", 608 "#$i",
581 buildCompileTimeError( 609 buildCompileTimeError(
582 "Expected named argument.", arguments[i].fileOffset)); 610 "Expected named argument.", arguments[i].fileOffset));
583 } 611 }
584 } 612 }
585 } 613 }
586 if (firstNamedArgumentIndex < arguments.length) { 614 if (firstNamedArgumentIndex < arguments.length) {
587 List<Expression> positional = new List<Expression>.from( 615 List<Expression> positional = new List<Expression>.from(
588 arguments.getRange(0, firstNamedArgumentIndex)); 616 arguments.getRange(0, firstNamedArgumentIndex));
589 List<NamedExpression> named = new List<NamedExpression>.from( 617 List<NamedExpression> named = new List<NamedExpression>.from(
590 arguments.getRange(firstNamedArgumentIndex, arguments.length)); 618 arguments.getRange(firstNamedArgumentIndex, arguments.length));
591 push(astFactory.arguments(positional, named: named)); 619 push(new KernelArguments(positional, named: named));
592 } else { 620 } else {
593 push(astFactory.arguments(arguments)); 621 push(new KernelArguments(arguments));
594 } 622 }
595 } 623 }
596 624
597 @override 625 @override
598 void handleParenthesizedExpression(BeginGroupToken token) { 626 void handleParenthesizedExpression(BeginGroupToken token) {
599 debugEvent("ParenthesizedExpression"); 627 debugEvent("ParenthesizedExpression");
600 push(new ParenthesizedExpression(this, popForValue(), token.endGroup)); 628 push(new ParenthesizedExpression(this, popForValue(), token.endGroup));
601 } 629 }
602 630
603 @override 631 @override
604 void endSend(Token beginToken, Token endToken) { 632 void endSend(Token beginToken, Token endToken) {
605 debugEvent("Send"); 633 debugEvent("Send");
606 Arguments arguments = pop(); 634 Arguments arguments = pop();
607 List<DartType> typeArguments = pop(); 635 List<DartType> typeArguments = pop();
608 Object receiver = pop(); 636 Object receiver = pop();
609 if (arguments != null && typeArguments != null) { 637 if (arguments != null && typeArguments != null) {
610 assert(arguments.types.isEmpty); 638 assert(arguments.types.isEmpty);
611 astFactory.setExplicitArgumentTypes(arguments, typeArguments); 639 KernelArguments.setExplicitArgumentTypes(arguments, typeArguments);
612 } else { 640 } else {
613 assert(typeArguments == null); 641 assert(typeArguments == null);
614 } 642 }
615 if (receiver is Identifier) { 643 if (receiver is Identifier) {
616 Name name = new Name(receiver.name, library.library); 644 Name name = new Name(receiver.name, library.library);
617 if (arguments == null) { 645 if (arguments == null) {
618 push(new IncompletePropertyAccessor(this, beginToken, name)); 646 push(new IncompletePropertyAccessor(this, beginToken, name));
619 } else { 647 } else {
620 push(new SendAccessor(this, beginToken, name, arguments)); 648 push(new SendAccessor(this, beginToken, name, arguments));
621 } 649 }
(...skipping 13 matching lines...) Expand all
635 663
636 if (receiver is FastaAccessor) { 664 if (receiver is FastaAccessor) {
637 if (constantExpressionRequired && 665 if (constantExpressionRequired &&
638 !isIdentical(receiver) && 666 !isIdentical(receiver) &&
639 !receiver.isInitializer) { 667 !receiver.isInitializer) {
640 addCompileTimeError(charOffset, "Not a constant expression."); 668 addCompileTimeError(charOffset, "Not a constant expression.");
641 } 669 }
642 return receiver.doInvocation(charOffset, arguments); 670 return receiver.doInvocation(charOffset, arguments);
643 } else { 671 } else {
644 return buildMethodInvocation( 672 return buildMethodInvocation(
645 astFactory, toValue(receiver), callName, arguments, charOffset); 673 toValue(receiver), callName, arguments, charOffset);
646 } 674 }
647 } 675 }
648 676
649 @override 677 @override
650 void beginCascade(Token token) { 678 void beginCascade(Token token) {
651 debugEvent("beginCascade"); 679 debugEvent("beginCascade");
652 Expression expression = popForValue(); 680 Expression expression = popForValue();
653 if (expression is CascadeReceiver) { 681 if (expression is CascadeReceiver) {
654 push(expression); 682 push(expression);
655 push(new VariableAccessor(this, token, expression.variable)); 683 push(new VariableAccessor(this, token, expression.variable));
(...skipping 25 matching lines...) Expand all
681 return doLogicalExpression(token); 709 return doLogicalExpression(token);
682 } 710 }
683 if (optional("??", token)) return doIfNull(token); 711 if (optional("??", token)) return doIfNull(token);
684 if (optional("?.", token)) return doIfNotNull(token); 712 if (optional("?.", token)) return doIfNotNull(token);
685 Expression argument = popForValue(); 713 Expression argument = popForValue();
686 var receiver = pop(); 714 var receiver = pop();
687 bool isSuper = false; 715 bool isSuper = false;
688 if (receiver is ThisAccessor && receiver.isSuper) { 716 if (receiver is ThisAccessor && receiver.isSuper) {
689 ThisAccessor thisAccessorReceiver = receiver; 717 ThisAccessor thisAccessorReceiver = receiver;
690 isSuper = true; 718 isSuper = true;
691 receiver = astFactory.thisExpression(thisAccessorReceiver.token); 719 receiver = new KernelThisExpression()
720 ..fileOffset = offsetForToken(thisAccessorReceiver.token);
692 } 721 }
693 push(buildBinaryOperator(toValue(receiver), token, argument, isSuper)); 722 push(buildBinaryOperator(toValue(receiver), token, argument, isSuper));
694 } 723 }
695 724
696 Expression buildBinaryOperator( 725 Expression buildBinaryOperator(
697 Expression a, Token token, Expression b, bool isSuper) { 726 Expression a, Token token, Expression b, bool isSuper) {
698 bool negate = false; 727 bool negate = false;
699 String operator = token.stringValue; 728 String operator = token.stringValue;
700 if (identical("!=", operator)) { 729 if (identical("!=", operator)) {
701 operator = "=="; 730 operator = "==";
702 negate = true; 731 negate = true;
703 } 732 }
704 if (!isBinaryOperator(operator) && !isMinusOperator(operator)) { 733 if (!isBinaryOperator(operator) && !isMinusOperator(operator)) {
705 return buildCompileTimeError( 734 return buildCompileTimeError(
706 "Not an operator: '$operator'.", token.charOffset); 735 "Not an operator: '$operator'.", token.charOffset);
707 } else { 736 } else {
708 Expression result = makeBinary(astFactory, a, new Name(operator), null, b, 737 Expression result =
709 offset: token.charOffset); 738 makeBinary(a, new Name(operator), null, b, offset: token.charOffset);
710 if (isSuper) { 739 if (isSuper) {
711 result = toSuperMethodInvocation(result); 740 result = toSuperMethodInvocation(result);
712 } 741 }
713 return negate ? astFactory.not(null, result) : result; 742 return negate ? new KernelNot(result) : result;
714 } 743 }
715 } 744 }
716 745
717 void doLogicalExpression(Token token) { 746 void doLogicalExpression(Token token) {
718 Expression argument = popForValue(); 747 Expression argument = popForValue();
719 Expression receiver = popForValue(); 748 Expression receiver = popForValue();
720 push(astFactory.logicalExpression(receiver, token.stringValue, argument)); 749 push(new KernelLogicalExpression(receiver, token.stringValue, argument));
721 } 750 }
722 751
723 /// Handle `a ?? b`. 752 /// Handle `a ?? b`.
724 void doIfNull(Token token) { 753 void doIfNull(Token token) {
725 Expression b = popForValue(); 754 Expression b = popForValue();
726 Expression a = popForValue(); 755 Expression a = popForValue();
727 VariableDeclaration variable = new VariableDeclaration.forValue(a); 756 VariableDeclaration variable = new VariableDeclaration.forValue(a);
728 push(makeLet( 757 push(makeLet(
729 variable, 758 variable,
730 new ConditionalExpression( 759 new ConditionalExpression(buildIsNull(new VariableGet(variable)), b,
731 buildIsNull(astFactory, new VariableGet(variable)), 760 new VariableGet(variable), const DynamicType())));
732 b,
733 new VariableGet(variable),
734 const DynamicType())));
735 } 761 }
736 762
737 /// Handle `a?.b(...)`. 763 /// Handle `a?.b(...)`.
738 void doIfNotNull(Token token) { 764 void doIfNotNull(Token token) {
739 IncompleteSend send = pop(); 765 IncompleteSend send = pop();
740 push(send.withReceiver(pop(), isNullAware: true)); 766 push(send.withReceiver(pop(), isNullAware: true));
741 } 767 }
742 768
743 void doDotOrCascadeExpression(Token token) { 769 void doDotOrCascadeExpression(Token token) {
744 // TODO(ahe): Handle null-aware. 770 // TODO(ahe): Handle null-aware.
745 IncompleteSend send = pop(); 771 IncompleteSend send = pop();
746 Object receiver = optional(".", token) ? pop() : popForValue(); 772 Object receiver = optional(".", token) ? pop() : popForValue();
747 push(send.withReceiver(receiver)); 773 push(send.withReceiver(receiver));
748 } 774 }
749 775
750 @override 776 @override
751 Expression toSuperMethodInvocation(MethodInvocation node) { 777 Expression toSuperMethodInvocation(MethodInvocation node) {
752 Member target = lookupSuperMember(node.name); 778 Member target = lookupSuperMember(node.name);
753 bool isNoSuchMethod = target == null; 779 bool isNoSuchMethod = target == null;
754 if (target is Procedure) { 780 if (target is Procedure) {
755 if (!target.isAccessor) { 781 if (!target.isAccessor) {
756 if (areArgumentsCompatible(target.function, node.arguments)) { 782 if (areArgumentsCompatible(target.function, node.arguments)) {
757 // TODO(ahe): Use [DirectMethodInvocation] when possible. 783 // TODO(ahe): Use [DirectMethodInvocation] when possible.
758 Expression result = astFactory.directMethodInvocation( 784 Expression result = new KernelDirectMethodInvocation(
759 new ThisExpression(), target, node.arguments); 785 new ThisExpression(), target, node.arguments);
760 result = astFactory.superMethodInvocation( 786 result =
761 null, node.name, node.arguments, null); 787 new KernelSuperMethodInvocation(node.name, node.arguments, null);
762 return result; 788 return result;
763 } else { 789 } else {
764 isNoSuchMethod = true; 790 isNoSuchMethod = true;
765 } 791 }
766 } 792 }
767 } 793 }
768 if (isNoSuchMethod) { 794 if (isNoSuchMethod) {
769 return throwNoSuchMethodError( 795 return throwNoSuchMethodError(
770 node.name.name, node.arguments, node.fileOffset, 796 node.name.name, node.arguments, node.fileOffset,
771 isSuper: true); 797 isSuper: true);
772 } 798 }
773 // TODO(ahe): Use [DirectPropertyGet] when possible. 799 // TODO(ahe): Use [DirectPropertyGet] when possible.
774 Expression receiver = 800 Expression receiver =
775 astFactory.directPropertyGet(new ThisExpression(), target); 801 new KernelDirectPropertyGet(new ThisExpression(), target);
776 receiver = astFactory.superPropertyGet(node.name, target); 802 receiver = new KernelSuperPropertyGet(node.name, target);
777 return buildMethodInvocation( 803 return buildMethodInvocation(
778 astFactory, receiver, callName, node.arguments, node.fileOffset); 804 receiver, callName, node.arguments, node.fileOffset);
779 } 805 }
780 806
781 bool areArgumentsCompatible(FunctionNode function, Arguments arguments) { 807 bool areArgumentsCompatible(FunctionNode function, Arguments arguments) {
782 // TODO(ahe): Implement this. 808 // TODO(ahe): Implement this.
783 return true; 809 return true;
784 } 810 }
785 811
786 @override 812 @override
787 Expression throwNoSuchMethodError( 813 Expression throwNoSuchMethodError(
788 String name, Arguments arguments, int charOffset, 814 String name, Arguments arguments, int charOffset,
789 {bool isSuper: false, isGetter: false, isSetter: false}) { 815 {bool isSuper: false, isGetter: false, isSetter: false}) {
790 String errorName = isSuper ? "super.$name" : name; 816 String errorName = isSuper ? "super.$name" : name;
791 String message; 817 String message;
792 if (isGetter) { 818 if (isGetter) {
793 message = "Getter not found: '$errorName'."; 819 message = "Getter not found: '$errorName'.";
794 } else if (isSetter) { 820 } else if (isSetter) {
795 message = "Setter not found: '$errorName'."; 821 message = "Setter not found: '$errorName'.";
796 } else { 822 } else {
797 message = "Method not found: '$errorName'."; 823 message = "Method not found: '$errorName'.";
798 } 824 }
799 if (constantExpressionRequired) { 825 if (constantExpressionRequired) {
800 return buildCompileTimeError(message, charOffset); 826 return buildCompileTimeError(message, charOffset);
801 } 827 }
802 warning(message, charOffset); 828 warning(message, charOffset);
803 Constructor constructor = 829 Constructor constructor =
804 coreTypes.noSuchMethodErrorClass.constructors.first; 830 coreTypes.noSuchMethodErrorClass.constructors.first;
805 return new Throw(new ConstructorInvocation( 831 return new Throw(new ConstructorInvocation(
806 constructor, 832 constructor,
807 astFactory.arguments(<Expression>[ 833 new KernelArguments(<Expression>[
808 astFactory.nullLiteral(null), 834 new KernelNullLiteral(),
809 new SymbolLiteral(name), 835 new SymbolLiteral(name),
810 new ListLiteral(arguments.positional), 836 new ListLiteral(arguments.positional),
811 new MapLiteral(arguments.named.map((arg) { 837 new MapLiteral(arguments.named.map((arg) {
812 return new MapEntry(new SymbolLiteral(arg.name), arg.value); 838 return new MapEntry(new SymbolLiteral(arg.name), arg.value);
813 }).toList()), 839 }).toList()),
814 astFactory.nullLiteral(null) 840 new KernelNullLiteral()
815 ]))); 841 ])));
816 } 842 }
817 843
818 @override 844 @override
819 Member lookupSuperMember(Name name, {bool isSetter: false}) { 845 Member lookupSuperMember(Name name, {bool isSetter: false}) {
820 Class superclass = classBuilder.cls.superclass; 846 Class superclass = classBuilder.cls.superclass;
821 return superclass == null 847 return superclass == null
822 ? null 848 ? null
823 : hierarchy.getDispatchTarget(superclass, name, setter: isSetter); 849 : hierarchy.getDispatchTarget(superclass, name, setter: isSetter);
824 } 850 }
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
886 assert(builder == null); 912 assert(builder == null);
887 if (constantExpressionRequired) { 913 if (constantExpressionRequired) {
888 return new UnresolvedAccessor(this, n, token); 914 return new UnresolvedAccessor(this, n, token);
889 } 915 }
890 return new ThisPropertyAccessor(this, token, n, null, null); 916 return new ThisPropertyAccessor(this, token, n, null, null);
891 } else if (isDartLibrary && 917 } else if (isDartLibrary &&
892 name == "main" && 918 name == "main" &&
893 library.uri.path == "_builtin" && 919 library.uri.path == "_builtin" &&
894 member?.name == "_getMainClosure") { 920 member?.name == "_getMainClosure") {
895 // TODO(ahe): https://github.com/dart-lang/sdk/issues/28989 921 // TODO(ahe): https://github.com/dart-lang/sdk/issues/28989
896 return astFactory.nullLiteral(token); 922 return new KernelNullLiteral()..fileOffset = offsetForToken(token);
897 } else { 923 } else {
898 return new UnresolvedAccessor(this, n, token); 924 return new UnresolvedAccessor(this, n, token);
899 } 925 }
900 } else if (builder.isTypeDeclaration) { 926 } else if (builder.isTypeDeclaration) {
901 if (constantExpressionRequired && 927 if (constantExpressionRequired &&
902 builder.isTypeVariable && 928 builder.isTypeVariable &&
903 !member.isConstructor) { 929 !member.isConstructor) {
904 addCompileTimeError( 930 addCompileTimeError(
905 offsetForToken(token), "Not a constant expression."); 931 offsetForToken(token), "Not a constant expression.");
906 } 932 }
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
984 debugEvent("StringPart"); 1010 debugEvent("StringPart");
985 push(token); 1011 push(token);
986 } 1012 }
987 1013
988 @override 1014 @override
989 void endLiteralString(int interpolationCount, Token endToken) { 1015 void endLiteralString(int interpolationCount, Token endToken) {
990 debugEvent("endLiteralString"); 1016 debugEvent("endLiteralString");
991 if (interpolationCount == 0) { 1017 if (interpolationCount == 0) {
992 Token token = pop(); 1018 Token token = pop();
993 String value = unescapeString(token.lexeme); 1019 String value = unescapeString(token.lexeme);
994 push(astFactory.stringLiteral(value, token)); 1020 push(new KernelStringLiteral(value)..fileOffset = offsetForToken(token));
995 } else { 1021 } else {
996 List parts = popList(1 + interpolationCount * 2); 1022 List parts = popList(1 + interpolationCount * 2);
997 Token first = parts.first; 1023 Token first = parts.first;
998 Token last = parts.last; 1024 Token last = parts.last;
999 Quote quote = analyzeQuote(first.lexeme); 1025 Quote quote = analyzeQuote(first.lexeme);
1000 List<Expression> expressions = <Expression>[]; 1026 List<Expression> expressions = <Expression>[];
1001 // Contains more than just \' or \". 1027 // Contains more than just \' or \".
1002 if (first.lexeme.length > 1) { 1028 if (first.lexeme.length > 1) {
1003 String value = unescapeFirstStringPart(first.lexeme, quote); 1029 String value = unescapeFirstStringPart(first.lexeme, quote);
1004 expressions.add(astFactory.stringLiteral(value, first)); 1030 expressions.add(
1031 new KernelStringLiteral(value)..fileOffset = offsetForToken(first));
1005 } 1032 }
1006 for (int i = 1; i < parts.length - 1; i++) { 1033 for (int i = 1; i < parts.length - 1; i++) {
1007 var part = parts[i]; 1034 var part = parts[i];
1008 if (part is Token) { 1035 if (part is Token) {
1009 if (part.lexeme.length != 0) { 1036 if (part.lexeme.length != 0) {
1010 String value = unescape(part.lexeme, quote); 1037 String value = unescape(part.lexeme, quote);
1011 expressions.add(astFactory.stringLiteral(value, part)); 1038 expressions.add(new KernelStringLiteral(value)
1039 ..fileOffset = offsetForToken(part));
1012 } 1040 }
1013 } else { 1041 } else {
1014 expressions.add(toValue(part)); 1042 expressions.add(toValue(part));
1015 } 1043 }
1016 } 1044 }
1017 // Contains more than just \' or \". 1045 // Contains more than just \' or \".
1018 if (last.lexeme.length > 1) { 1046 if (last.lexeme.length > 1) {
1019 String value = unescapeLastStringPart(last.lexeme, quote); 1047 String value = unescapeLastStringPart(last.lexeme, quote);
1020 expressions.add(astFactory.stringLiteral(value, last)); 1048 expressions.add(
1049 new KernelStringLiteral(value)..fileOffset = offsetForToken(last));
1021 } 1050 }
1022 push(astFactory.stringConcatenation(expressions, endToken)); 1051 push(new KernelStringConcatenation(expressions)
1052 ..fileOffset = offsetForToken(endToken));
1023 } 1053 }
1024 } 1054 }
1025 1055
1026 @override 1056 @override
1027 void handleScript(Token token) { 1057 void handleScript(Token token) {
1028 debugEvent("Script"); 1058 debugEvent("Script");
1029 } 1059 }
1030 1060
1031 @override 1061 @override
1032 void handleStringJuxtaposition(int literalCount) { 1062 void handleStringJuxtaposition(int literalCount) {
1033 debugEvent("StringJuxtaposition"); 1063 debugEvent("StringJuxtaposition");
1034 List<Expression> parts = popListForValue(literalCount); 1064 List<Expression> parts = popListForValue(literalCount);
1035 List<Expression> expressions; 1065 List<Expression> expressions;
1036 // Flatten string juxtapositions of string interpolation. 1066 // Flatten string juxtapositions of string interpolation.
1037 for (int i = 0; i < parts.length; i++) { 1067 for (int i = 0; i < parts.length; i++) {
1038 Expression part = parts[i]; 1068 Expression part = parts[i];
1039 if (part is StringConcatenation) { 1069 if (part is StringConcatenation) {
1040 if (expressions == null) { 1070 if (expressions == null) {
1041 expressions = parts.sublist(0, i); 1071 expressions = parts.sublist(0, i);
1042 } 1072 }
1043 expressions.addAll(part.expressions); 1073 expressions.addAll(part.expressions);
1044 } else { 1074 } else {
1045 if (expressions != null) { 1075 if (expressions != null) {
1046 expressions.add(part); 1076 expressions.add(part);
1047 } 1077 }
1048 } 1078 }
1049 } 1079 }
1050 push(astFactory.stringConcatenation(expressions ?? parts, null)); 1080 push(new KernelStringConcatenation(expressions ?? parts));
1051 } 1081 }
1052 1082
1053 @override 1083 @override
1054 void handleLiteralInt(Token token) { 1084 void handleLiteralInt(Token token) {
1055 debugEvent("LiteralInt"); 1085 debugEvent("LiteralInt");
1056 push(astFactory.intLiteral(int.parse(token.lexeme), token)); 1086 push(new KernelIntLiteral(int.parse(token.lexeme))
1087 ..fileOffset = offsetForToken(token));
1057 } 1088 }
1058 1089
1059 @override 1090 @override
1060 void handleEmptyFunctionBody(Token semicolon) { 1091 void handleEmptyFunctionBody(Token semicolon) {
1061 debugEvent("ExpressionFunctionBody"); 1092 debugEvent("ExpressionFunctionBody");
1062 endBlockFunctionBody(0, null, semicolon); 1093 endBlockFunctionBody(0, null, semicolon);
1063 } 1094 }
1064 1095
1065 @override 1096 @override
1066 void handleExpressionFunctionBody(Token arrowToken, Token endToken) { 1097 void handleExpressionFunctionBody(Token arrowToken, Token endToken) {
(...skipping 28 matching lines...) Expand all
1095 typePromoter.enterElse(); 1126 typePromoter.enterElse();
1096 super.endThenStatement(token); 1127 super.endThenStatement(token);
1097 } 1128 }
1098 1129
1099 @override 1130 @override
1100 void endIfStatement(Token ifToken, Token elseToken) { 1131 void endIfStatement(Token ifToken, Token elseToken) {
1101 Statement elsePart = popStatementIfNotNull(elseToken); 1132 Statement elsePart = popStatementIfNotNull(elseToken);
1102 Statement thenPart = popStatement(); 1133 Statement thenPart = popStatement();
1103 Expression condition = popForValue(); 1134 Expression condition = popForValue();
1104 typePromoter.exitConditional(); 1135 typePromoter.exitConditional();
1105 push(astFactory.ifStatement(condition, thenPart, elsePart)); 1136 push(new KernelIfStatement(condition, thenPart, elsePart));
1106 } 1137 }
1107 1138
1108 @override 1139 @override
1109 void endVariableInitializer(Token assignmentOperator) { 1140 void endVariableInitializer(Token assignmentOperator) {
1110 debugEvent("VariableInitializer"); 1141 debugEvent("VariableInitializer");
1111 assert(assignmentOperator.stringValue == "="); 1142 assert(assignmentOperator.stringValue == "=");
1112 pushNewLocalVariable(popForValue(), equalsToken: assignmentOperator); 1143 pushNewLocalVariable(popForValue(), equalsToken: assignmentOperator);
1113 } 1144 }
1114 1145
1115 @override 1146 @override
1116 void handleNoVariableInitializer(Token token) { 1147 void handleNoVariableInitializer(Token token) {
1117 debugEvent("NoVariableInitializer"); 1148 debugEvent("NoVariableInitializer");
1118 pushNewLocalVariable(null); 1149 pushNewLocalVariable(null);
1119 } 1150 }
1120 1151
1121 void pushNewLocalVariable(Expression initializer, {Token equalsToken}) { 1152 void pushNewLocalVariable(Expression initializer, {Token equalsToken}) {
1122 Identifier identifier = pop(); 1153 Identifier identifier = pop();
1123 assert(currentLocalVariableModifiers != -1); 1154 assert(currentLocalVariableModifiers != -1);
1124 bool isConst = (currentLocalVariableModifiers & constMask) != 0; 1155 bool isConst = (currentLocalVariableModifiers & constMask) != 0;
1125 bool isFinal = (currentLocalVariableModifiers & finalMask) != 0; 1156 bool isFinal = (currentLocalVariableModifiers & finalMask) != 0;
1126 assert(isConst == constantExpressionRequired); 1157 assert(isConst == constantExpressionRequired);
1127 push(astFactory.variableDeclaration( 1158 push(new KernelVariableDeclaration(identifier.name, functionNestingLevel,
1128 identifier.name, identifier.token, functionNestingLevel,
1129 initializer: initializer, 1159 initializer: initializer,
1130 type: currentLocalVariableType, 1160 type: currentLocalVariableType,
1131 isFinal: isFinal, 1161 isFinal: isFinal,
1132 isConst: isConst, 1162 isConst: isConst)
1133 equalsToken: equalsToken)); 1163 ..fileOffset = offsetForToken(identifier.token)
1164 ..fileEqualsOffset = offsetForToken(equalsToken));
1134 } 1165 }
1135 1166
1136 @override 1167 @override
1137 void endFieldInitializer(Token assignmentOperator, Token token) { 1168 void endFieldInitializer(Token assignmentOperator, Token token) {
1138 debugEvent("FieldInitializer"); 1169 debugEvent("FieldInitializer");
1139 assert(assignmentOperator.stringValue == "="); 1170 assert(assignmentOperator.stringValue == "=");
1140 push(popForValue()); 1171 push(popForValue());
1141 } 1172 }
1142 1173
1143 @override 1174 @override
1144 void handleNoFieldInitializer(Token token) { 1175 void handleNoFieldInitializer(Token token) {
1145 debugEvent("NoFieldInitializer"); 1176 debugEvent("NoFieldInitializer");
1146 if (constantExpressionRequired) { 1177 if (constantExpressionRequired) {
1147 addCompileTimeError( 1178 addCompileTimeError(
1148 token.charOffset, "const field must have initializer."); 1179 token.charOffset, "const field must have initializer.");
1149 // Creating a null value to prevent the Dart VM from crashing. 1180 // Creating a null value to prevent the Dart VM from crashing.
1150 push(astFactory.nullLiteral(token)); 1181 push(new KernelNullLiteral()..fileOffset = offsetForToken(token));
1151 } else { 1182 } else {
1152 push(NullValue.FieldInitializer); 1183 push(NullValue.FieldInitializer);
1153 } 1184 }
1154 } 1185 }
1155 1186
1156 @override 1187 @override
1157 void endInitializedIdentifier(Token nameToken) { 1188 void endInitializedIdentifier(Token nameToken) {
1158 // TODO(ahe): Use [InitializedIdentifier] here? 1189 // TODO(ahe): Use [InitializedIdentifier] here?
1159 debugEvent("InitializedIdentifier"); 1190 debugEvent("InitializedIdentifier");
1160 VariableDeclaration variable = pop(); 1191 VariableDeclaration variable = pop();
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1198 exitLocalScope(); 1229 exitLocalScope();
1199 push(block); 1230 push(block);
1200 } 1231 }
1201 1232
1202 @override 1233 @override
1203 void handleAssignmentExpression(Token token) { 1234 void handleAssignmentExpression(Token token) {
1204 debugEvent("AssignmentExpression"); 1235 debugEvent("AssignmentExpression");
1205 Expression value = popForValue(); 1236 Expression value = popForValue();
1206 var accessor = pop(); 1237 var accessor = pop();
1207 if (accessor is TypeDeclarationBuilder) { 1238 if (accessor is TypeDeclarationBuilder) {
1208 push(wrapInvalid(astFactory 1239 push(wrapInvalid(new KernelTypeLiteral(
1209 .typeLiteral(accessor.buildTypesWithBuiltArguments(library, null)))); 1240 accessor.buildTypesWithBuiltArguments(library, null))));
1210 } else if (accessor is! FastaAccessor) { 1241 } else if (accessor is! FastaAccessor) {
1211 push(buildCompileTimeError("Can't assign to this.", token.charOffset)); 1242 push(buildCompileTimeError("Can't assign to this.", token.charOffset));
1212 } else { 1243 } else {
1213 push(new DelayedAssignment( 1244 push(new DelayedAssignment(
1214 this, token, accessor, value, token.stringValue)); 1245 this, token, accessor, value, token.stringValue));
1215 } 1246 }
1216 } 1247 }
1217 1248
1218 @override 1249 @override
1219 void enterLoop(int charOffset) { 1250 void enterLoop(int charOffset) {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1257 } 1288 }
1258 if (variableOrExpression is VariableDeclaration) { 1289 if (variableOrExpression is VariableDeclaration) {
1259 variables.add(variableOrExpression); 1290 variables.add(variableOrExpression);
1260 } else if (variableOrExpression is List) { 1291 } else if (variableOrExpression is List) {
1261 // TODO(sigmund): remove this assignment (see issue #28651) 1292 // TODO(sigmund): remove this assignment (see issue #28651)
1262 Iterable vars = variableOrExpression; 1293 Iterable vars = variableOrExpression;
1263 variables.addAll(vars); 1294 variables.addAll(vars);
1264 } else if (variableOrExpression == null) { 1295 } else if (variableOrExpression == null) {
1265 // Do nothing. 1296 // Do nothing.
1266 } else if (variableOrExpression is Expression) { 1297 } else if (variableOrExpression is Expression) {
1267 begin = astFactory.expressionStatement(variableOrExpression); 1298 begin = new KernelExpressionStatement(variableOrExpression);
1268 } else { 1299 } else {
1269 return internalError("Unhandled: ${variableOrExpression.runtimeType}"); 1300 return internalError("Unhandled: ${variableOrExpression.runtimeType}");
1270 } 1301 }
1271 exitLocalScope(); 1302 exitLocalScope();
1272 JumpTarget continueTarget = exitContinueTarget(); 1303 JumpTarget continueTarget = exitContinueTarget();
1273 JumpTarget breakTarget = exitBreakTarget(); 1304 JumpTarget breakTarget = exitBreakTarget();
1274 if (continueTarget.hasUsers) { 1305 if (continueTarget.hasUsers) {
1275 body = new LabeledStatement(body); 1306 body = new LabeledStatement(body);
1276 continueTarget.resolveContinues(body); 1307 continueTarget.resolveContinues(body);
1277 } 1308 }
1278 Statement result = new ForStatement(variables, condition, updates, body); 1309 Statement result = new ForStatement(variables, condition, updates, body);
1279 if (begin != null) { 1310 if (begin != null) {
1280 result = new Block(<Statement>[begin, result]); 1311 result = new Block(<Statement>[begin, result]);
1281 } 1312 }
1282 if (breakTarget.hasUsers) { 1313 if (breakTarget.hasUsers) {
1283 result = new LabeledStatement(result); 1314 result = new LabeledStatement(result);
1284 breakTarget.resolveBreaks(result); 1315 breakTarget.resolveBreaks(result);
1285 } 1316 }
1286 exitLoopOrSwitch(result); 1317 exitLoopOrSwitch(result);
1287 } 1318 }
1288 1319
1289 @override 1320 @override
1290 void endAwaitExpression(Token keyword, Token endToken) { 1321 void endAwaitExpression(Token keyword, Token endToken) {
1291 debugEvent("AwaitExpression"); 1322 debugEvent("AwaitExpression");
1292 push(astFactory.awaitExpression(keyword, popForValue())); 1323 push(new KernelAwaitExpression(popForValue())
1324 ..fileOffset = offsetForToken(keyword));
1293 } 1325 }
1294 1326
1295 @override 1327 @override
1296 void handleAsyncModifier(Token asyncToken, Token starToken) { 1328 void handleAsyncModifier(Token asyncToken, Token starToken) {
1297 debugEvent("AsyncModifier"); 1329 debugEvent("AsyncModifier");
1298 push(asyncMarkerFromTokens(asyncToken, starToken)); 1330 push(asyncMarkerFromTokens(asyncToken, starToken));
1299 } 1331 }
1300 1332
1301 @override 1333 @override
1302 void handleLiteralList( 1334 void handleLiteralList(
1303 int count, Token beginToken, Token constKeyword, Token endToken) { 1335 int count, Token beginToken, Token constKeyword, Token endToken) {
1304 debugEvent("LiteralList"); 1336 debugEvent("LiteralList");
1305 List<Expression> expressions = popListForValue(count); 1337 List<Expression> expressions = popListForValue(count);
1306 List<DartType> typeArguments = pop(); 1338 List<DartType> typeArguments = pop();
1307 DartType typeArgument; 1339 DartType typeArgument;
1308 if (typeArguments != null) { 1340 if (typeArguments != null) {
1309 typeArgument = typeArguments.first; 1341 typeArgument = typeArguments.first;
1310 if (typeArguments.length > 1) { 1342 if (typeArguments.length > 1) {
1311 typeArgument = null; 1343 typeArgument = null;
1312 warningNotError( 1344 warningNotError(
1313 "Too many type arguments on List literal.", beginToken.charOffset); 1345 "Too many type arguments on List literal.", beginToken.charOffset);
1314 } 1346 }
1315 } 1347 }
1316 push(astFactory.listLiteral(expressions, typeArgument, constKeyword != null, 1348 push(new KernelListLiteral(expressions,
1317 constKeyword ?? beginToken)); 1349 typeArgument: typeArgument, isConst: constKeyword != null)
1350 ..fileOffset = offsetForToken(constKeyword ?? beginToken));
1318 } 1351 }
1319 1352
1320 @override 1353 @override
1321 void handleLiteralBool(Token token) { 1354 void handleLiteralBool(Token token) {
1322 debugEvent("LiteralBool"); 1355 debugEvent("LiteralBool");
1323 bool value = optional("true", token); 1356 bool value = optional("true", token);
1324 assert(value || optional("false", token)); 1357 assert(value || optional("false", token));
1325 push(astFactory.boolLiteral(value, token)); 1358 push(new KernelBoolLiteral(value)..fileOffset = offsetForToken(token));
1326 } 1359 }
1327 1360
1328 @override 1361 @override
1329 void handleLiteralDouble(Token token) { 1362 void handleLiteralDouble(Token token) {
1330 debugEvent("LiteralDouble"); 1363 debugEvent("LiteralDouble");
1331 push(astFactory.doubleLiteral(double.parse(token.lexeme), token)); 1364 push(new KernelDoubleLiteral(double.parse(token.lexeme))
1365 ..fileOffset = offsetForToken(token));
1332 } 1366 }
1333 1367
1334 @override 1368 @override
1335 void handleLiteralNull(Token token) { 1369 void handleLiteralNull(Token token) {
1336 debugEvent("LiteralNull"); 1370 debugEvent("LiteralNull");
1337 push(astFactory.nullLiteral(token)); 1371 push(new KernelNullLiteral()..fileOffset = offsetForToken(token));
1338 } 1372 }
1339 1373
1340 @override 1374 @override
1341 void handleLiteralMap( 1375 void handleLiteralMap(
1342 int count, Token beginToken, Token constKeyword, Token endToken) { 1376 int count, Token beginToken, Token constKeyword, Token endToken) {
1343 debugEvent("LiteralMap"); 1377 debugEvent("LiteralMap");
1344 List<MapEntry> entries = popList(count) ?? <MapEntry>[]; 1378 List<MapEntry> entries = popList(count) ?? <MapEntry>[];
1345 List<DartType> typeArguments = pop(); 1379 List<DartType> typeArguments = pop();
1346 DartType keyType = const DynamicType(); 1380 DartType keyType = const DynamicType();
1347 DartType valueType = const DynamicType(); 1381 DartType valueType = const DynamicType();
1348 if (typeArguments != null) { 1382 if (typeArguments != null) {
1349 if (typeArguments.length != 2) { 1383 if (typeArguments.length != 2) {
1350 keyType = const DynamicType(); 1384 keyType = const DynamicType();
1351 valueType = const DynamicType(); 1385 valueType = const DynamicType();
1352 warningNotError( 1386 warningNotError(
1353 "Map literal requires two type arguments.", beginToken.charOffset); 1387 "Map literal requires two type arguments.", beginToken.charOffset);
1354 } else { 1388 } else {
1355 keyType = typeArguments[0]; 1389 keyType = typeArguments[0];
1356 valueType = typeArguments[1]; 1390 valueType = typeArguments[1];
1357 } 1391 }
1358 } 1392 }
1359 push(astFactory.mapLiteral(beginToken, constKeyword, entries, 1393 push(new KernelMapLiteral(entries,
1360 keyType: keyType, valueType: valueType)); 1394 keyType: keyType, valueType: valueType, isConst: constKeyword != null)
1395 ..fileOffset = constKeyword?.charOffset ?? offsetForToken(beginToken));
1361 } 1396 }
1362 1397
1363 @override 1398 @override
1364 void endLiteralMapEntry(Token colon, Token endToken) { 1399 void endLiteralMapEntry(Token colon, Token endToken) {
1365 debugEvent("LiteralMapEntry"); 1400 debugEvent("LiteralMapEntry");
1366 Expression value = popForValue(); 1401 Expression value = popForValue();
1367 Expression key = popForValue(); 1402 Expression key = popForValue();
1368 push(new MapEntry(key, value)); 1403 push(new MapEntry(key, value));
1369 } 1404 }
1370 1405
(...skipping 13 matching lines...) Expand all
1384 String value; 1419 String value;
1385 if (identifierCount == 1) { 1420 if (identifierCount == 1) {
1386 value = symbolPartToString(pop()); 1421 value = symbolPartToString(pop());
1387 } else { 1422 } else {
1388 List parts = popList(identifierCount); 1423 List parts = popList(identifierCount);
1389 value = symbolPartToString(parts.first); 1424 value = symbolPartToString(parts.first);
1390 for (int i = 1; i < parts.length; i++) { 1425 for (int i = 1; i < parts.length; i++) {
1391 value += ".${symbolPartToString(parts[i])}"; 1426 value += ".${symbolPartToString(parts[i])}";
1392 } 1427 }
1393 } 1428 }
1394 push(astFactory.symbolLiteral(hashToken, value)); 1429 push(
1430 new KernelSymbolLiteral(value)..fileOffset = offsetForToken(hashToken));
1395 } 1431 }
1396 1432
1397 DartType kernelTypeFromString( 1433 DartType kernelTypeFromString(
1398 String name, List<DartType> arguments, int charOffset) { 1434 String name, List<DartType> arguments, int charOffset) {
1399 Builder builder = scope.lookup(name, charOffset, uri); 1435 Builder builder = scope.lookup(name, charOffset, uri);
1400 if (builder == null) { 1436 if (builder == null) {
1401 warning("Type not found: '$name'.", charOffset); 1437 warning("Type not found: '$name'.", charOffset);
1402 return const DynamicType(); 1438 return const DynamicType();
1403 } else { 1439 } else {
1404 return kernelTypeFromBuilder(builder, arguments, charOffset); 1440 return kernelTypeFromBuilder(builder, arguments, charOffset);
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
1505 void handleVoidKeyword(Token token) { 1541 void handleVoidKeyword(Token token) {
1506 debugEvent("VoidKeyword"); 1542 debugEvent("VoidKeyword");
1507 push(const VoidType()); 1543 push(const VoidType());
1508 } 1544 }
1509 1545
1510 @override 1546 @override
1511 void handleAsOperator(Token operator, Token endToken) { 1547 void handleAsOperator(Token operator, Token endToken) {
1512 debugEvent("AsOperator"); 1548 debugEvent("AsOperator");
1513 DartType type = pop(); 1549 DartType type = pop();
1514 Expression expression = popForValue(); 1550 Expression expression = popForValue();
1515 push(astFactory.asExpression(expression, operator, type)); 1551 push(new KernelAsExpression(expression, type)
1552 ..fileOffset = offsetForToken(operator));
1516 } 1553 }
1517 1554
1518 @override 1555 @override
1519 void handleIsOperator(Token operator, Token not, Token endToken) { 1556 void handleIsOperator(Token operator, Token not, Token endToken) {
1520 debugEvent("IsOperator"); 1557 debugEvent("IsOperator");
1521 DartType type = pop(); 1558 DartType type = pop();
1522 Expression operand = popForValue(); 1559 Expression operand = popForValue();
1523 bool isInverted = not != null; 1560 bool isInverted = not != null;
1524 Expression isExpression = 1561 var offset = offsetForToken(operator);
1525 astFactory.isExpression(operand, type, operator, isInverted); 1562 Expression isExpression = isInverted
1563 ? new KernelIsNotExpression(operand, type, offset)
1564 : new KernelIsExpression(operand, type)
1565 ..fileOffset = offset;
1526 if (operand is VariableGet) { 1566 if (operand is VariableGet) {
1527 typePromoter.handleIsCheck(isExpression, isInverted, operand.variable, 1567 typePromoter.handleIsCheck(isExpression, isInverted, operand.variable,
1528 type, functionNestingLevel); 1568 type, functionNestingLevel);
1529 } 1569 }
1530 push(isExpression); 1570 push(isExpression);
1531 } 1571 }
1532 1572
1533 @override 1573 @override
1534 void handleConditionalExpression(Token question, Token colon) { 1574 void handleConditionalExpression(Token question, Token colon) {
1535 debugEvent("ConditionalExpression"); 1575 debugEvent("ConditionalExpression");
1536 Expression elseExpression = popForValue(); 1576 Expression elseExpression = popForValue();
1537 Expression thenExpression = popForValue(); 1577 Expression thenExpression = popForValue();
1538 Expression condition = popForValue(); 1578 Expression condition = popForValue();
1539 push(astFactory.conditionalExpression( 1579 push(new KernelConditionalExpression(
1540 condition, thenExpression, elseExpression)); 1580 condition, thenExpression, elseExpression));
1541 } 1581 }
1542 1582
1543 @override 1583 @override
1544 void endThrowExpression(Token throwToken, Token endToken) { 1584 void endThrowExpression(Token throwToken, Token endToken) {
1545 debugEvent("ThrowExpression"); 1585 debugEvent("ThrowExpression");
1546 Expression expression = popForValue(); 1586 Expression expression = popForValue();
1547 if (constantExpressionRequired) { 1587 if (constantExpressionRequired) {
1548 push(buildCompileTimeError( 1588 push(buildCompileTimeError(
1549 "Not a constant expression.", throwToken.charOffset)); 1589 "Not a constant expression.", throwToken.charOffset));
1550 } else { 1590 } else {
1551 push(astFactory.throwExpression(throwToken, expression)); 1591 push(
1592 new KernelThrow(expression)..fileOffset = offsetForToken(throwToken));
1552 } 1593 }
1553 } 1594 }
1554 1595
1555 @override 1596 @override
1556 void endFormalParameter(Token thisKeyword, Token nameToken, 1597 void endFormalParameter(Token thisKeyword, Token nameToken,
1557 FormalParameterType kind, MemberKind memberKind) { 1598 FormalParameterType kind, MemberKind memberKind) {
1558 debugEvent("FormalParameter"); 1599 debugEvent("FormalParameter");
1559 if (thisKeyword != null) { 1600 if (thisKeyword != null) {
1560 if (!inConstructor) { 1601 if (!inConstructor) {
1561 addCompileTimeError(thisKeyword.charOffset, 1602 addCompileTimeError(thisKeyword.charOffset,
(...skipping 27 matching lines...) Expand all
1589 } else if (thisKeyword == null) { 1630 } else if (thisKeyword == null) {
1590 variable = builder.build(library); 1631 variable = builder.build(library);
1591 variable.initializer = name.initializer; 1632 variable.initializer = name.initializer;
1592 } else if (builder.isField && builder.parent == classBuilder) { 1633 } else if (builder.isField && builder.parent == classBuilder) {
1593 FieldBuilder field = builder; 1634 FieldBuilder field = builder;
1594 if (type != null) { 1635 if (type != null) {
1595 nit("Ignoring type on 'this' parameter '${name.name}'.", 1636 nit("Ignoring type on 'this' parameter '${name.name}'.",
1596 thisKeyword.charOffset); 1637 thisKeyword.charOffset);
1597 } 1638 }
1598 type = field.target.type; 1639 type = field.target.type;
1599 variable = astFactory.variableDeclaration( 1640 variable = new KernelVariableDeclaration(
1600 name.name, name.token, functionNestingLevel, 1641 name.name, functionNestingLevel,
1601 type: type, 1642 type: type,
1602 initializer: name.initializer, 1643 initializer: name.initializer,
1603 isFinal: isFinal, 1644 isFinal: isFinal,
1604 isConst: isConst); 1645 isConst: isConst)
1646 ..fileOffset = offsetForToken(name.token);
1605 } else { 1647 } else {
1606 addCompileTimeError(offsetForToken(name.token), 1648 addCompileTimeError(offsetForToken(name.token),
1607 "'${name.name}' isn't a field in this class."); 1649 "'${name.name}' isn't a field in this class.");
1608 } 1650 }
1609 } 1651 }
1610 variable ??= astFactory.variableDeclaration( 1652 variable ??= new KernelVariableDeclaration(name?.name, functionNestingLevel,
1611 name?.name, name?.token, functionNestingLevel,
1612 type: type, 1653 type: type,
1613 initializer: name?.initializer, 1654 initializer: name?.initializer,
1614 isFinal: isFinal, 1655 isFinal: isFinal,
1615 isConst: isConst); 1656 isConst: isConst)
1657 ..fileOffset = offsetForToken(name?.token);
1616 push(variable); 1658 push(variable);
1617 } 1659 }
1618 1660
1619 @override 1661 @override
1620 void endOptionalFormalParameters( 1662 void endOptionalFormalParameters(
1621 int count, Token beginToken, Token endToken) { 1663 int count, Token beginToken, Token endToken) {
1622 debugEvent("OptionalFormalParameters"); 1664 debugEvent("OptionalFormalParameters");
1623 FormalParameterType kind = optional("{", beginToken) 1665 FormalParameterType kind = optional("{", beginToken)
1624 ? FormalParameterType.NAMED 1666 ? FormalParameterType.NAMED
1625 : FormalParameterType.POSITIONAL; 1667 : FormalParameterType.POSITIONAL;
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
1763 push(IndexAccessor.make( 1805 push(IndexAccessor.make(
1764 this, openCurlyBracket, toValue(receiver), index, null, null)); 1806 this, openCurlyBracket, toValue(receiver), index, null, null));
1765 } 1807 }
1766 } 1808 }
1767 1809
1768 @override 1810 @override
1769 void handleUnaryPrefixExpression(Token token) { 1811 void handleUnaryPrefixExpression(Token token) {
1770 debugEvent("UnaryPrefixExpression"); 1812 debugEvent("UnaryPrefixExpression");
1771 var receiver = pop(); 1813 var receiver = pop();
1772 if (optional("!", token)) { 1814 if (optional("!", token)) {
1773 push(astFactory.not(token, toValue(receiver))); 1815 push(
1816 new KernelNot(toValue(receiver))..fileOffset = offsetForToken(token));
1774 } else { 1817 } else {
1775 String operator = token.stringValue; 1818 String operator = token.stringValue;
1776 if (optional("-", token)) { 1819 if (optional("-", token)) {
1777 operator = "unary-"; 1820 operator = "unary-";
1778 } 1821 }
1779 if (receiver is ThisAccessor && receiver.isSuper) { 1822 if (receiver is ThisAccessor && receiver.isSuper) {
1780 push(toSuperMethodInvocation(buildMethodInvocation( 1823 push(toSuperMethodInvocation(buildMethodInvocation(
1781 astFactory, 1824 new KernelThisExpression()
1782 astFactory.thisExpression(receiver.token), 1825 ..fileOffset = offsetForToken(receiver.token),
1783 new Name(operator), 1826 new Name(operator),
1784 new Arguments.empty(), 1827 new Arguments.empty(),
1785 token.charOffset))); 1828 token.charOffset)));
1786 } else { 1829 } else {
1787 push(buildMethodInvocation(astFactory, toValue(receiver), 1830 push(buildMethodInvocation(toValue(receiver), new Name(operator),
1788 new Name(operator), new Arguments.empty(), token.charOffset)); 1831 new Arguments.empty(), token.charOffset));
1789 } 1832 }
1790 } 1833 }
1791 } 1834 }
1792 1835
1793 Name incrementOperator(Token token) { 1836 Name incrementOperator(Token token) {
1794 if (optional("++", token)) return plusName; 1837 if (optional("++", token)) return plusName;
1795 if (optional("--", token)) return minusName; 1838 if (optional("--", token)) return minusName;
1796 return internalError("Unknown increment operator: ${token.lexeme}"); 1839 return internalError("Unknown increment operator: ${token.lexeme}");
1797 } 1840 }
1798 1841
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
1880 {bool isConst: false, int charOffset: -1}) { 1923 {bool isConst: false, int charOffset: -1}) {
1881 List<TypeParameter> typeParameters = target.function.typeParameters; 1924 List<TypeParameter> typeParameters = target.function.typeParameters;
1882 if (target is Constructor) { 1925 if (target is Constructor) {
1883 assert(!target.enclosingClass.isAbstract); 1926 assert(!target.enclosingClass.isAbstract);
1884 typeParameters = target.enclosingClass.typeParameters; 1927 typeParameters = target.enclosingClass.typeParameters;
1885 } 1928 }
1886 if (!checkArguments(target.function, arguments, typeParameters)) { 1929 if (!checkArguments(target.function, arguments, typeParameters)) {
1887 return throwNoSuchMethodError(target.name.name, arguments, charOffset); 1930 return throwNoSuchMethodError(target.name.name, arguments, charOffset);
1888 } 1931 }
1889 if (target is Constructor) { 1932 if (target is Constructor) {
1890 return astFactory.constructorInvocation(target, arguments, 1933 return new KernelConstructorInvocation(target, arguments,
1934 isConst: isConst)
1935 ..fileOffset = charOffset;
1936 } else if (target is Procedure && target.kind == ProcedureKind.Factory) {
1937 return new KernelFactoryConstructorInvocation(target, arguments,
1891 isConst: isConst) 1938 isConst: isConst)
1892 ..fileOffset = charOffset; 1939 ..fileOffset = charOffset;
1893 } else { 1940 } else {
1894 return astFactory.staticInvocation(target, arguments, isConst: isConst) 1941 return new KernelStaticInvocation(target, arguments, isConst: isConst)
1895 ..fileOffset = charOffset; 1942 ..fileOffset = charOffset;
1896 } 1943 }
1897 } 1944 }
1898 1945
1899 @override 1946 @override
1900 bool checkArguments(FunctionNode function, Arguments arguments, 1947 bool checkArguments(FunctionNode function, Arguments arguments,
1901 List<TypeParameter> typeParameters) { 1948 List<TypeParameter> typeParameters) {
1902 if (arguments.positional.length < function.requiredParameterCount || 1949 if (arguments.positional.length < function.requiredParameterCount ||
1903 arguments.positional.length > function.positionalParameters.length) { 1950 arguments.positional.length > function.positionalParameters.length) {
1904 return false; 1951 return false;
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
1971 var type = pop(); 2018 var type = pop();
1972 bool savedConstantExpressionRequired = pop(); 2019 bool savedConstantExpressionRequired = pop();
1973 () { 2020 () {
1974 if (arguments == null) { 2021 if (arguments == null) {
1975 push(buildCompileTimeError("No arguments.", nameToken.charOffset)); 2022 push(buildCompileTimeError("No arguments.", nameToken.charOffset));
1976 return; 2023 return;
1977 } 2024 }
1978 2025
1979 if (typeArguments != null) { 2026 if (typeArguments != null) {
1980 assert(arguments.types.isEmpty); 2027 assert(arguments.types.isEmpty);
1981 astFactory.setExplicitArgumentTypes(arguments, typeArguments); 2028 KernelArguments.setExplicitArgumentTypes(arguments, typeArguments);
1982 } 2029 }
1983 2030
1984 String errorName; 2031 String errorName;
1985 if (type is ClassBuilder) { 2032 if (type is ClassBuilder) {
1986 Builder b = type.findConstructorOrFactory(name, token.charOffset, uri); 2033 Builder b = type.findConstructorOrFactory(name, token.charOffset, uri);
1987 Member target; 2034 Member target;
1988 if (b == null) { 2035 if (b == null) {
1989 // Not found. Reported below. 2036 // Not found. Reported below.
1990 } else if (b.isConstructor) { 2037 } else if (b.isConstructor) {
1991 if (type.isAbstract) { 2038 if (type.isAbstract) {
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
2065 debugEvent("NamedArgument"); 2112 debugEvent("NamedArgument");
2066 Expression value = popForValue(); 2113 Expression value = popForValue();
2067 Identifier identifier = pop(); 2114 Identifier identifier = pop();
2068 push(new NamedExpression(identifier.name, value)); 2115 push(new NamedExpression(identifier.name, value));
2069 } 2116 }
2070 2117
2071 @override 2118 @override
2072 void endFunctionName(Token beginToken, Token token) { 2119 void endFunctionName(Token beginToken, Token token) {
2073 debugEvent("FunctionName"); 2120 debugEvent("FunctionName");
2074 Identifier name = pop(); 2121 Identifier name = pop();
2075 VariableDeclaration variable = astFactory.variableDeclaration( 2122 VariableDeclaration variable = new KernelVariableDeclaration(
2076 name.name, name.token, functionNestingLevel, 2123 name.name, functionNestingLevel,
2077 isFinal: true, isLocalFunction: true); 2124 isFinal: true, isLocalFunction: true)
2125 ..fileOffset = offsetForToken(name.token);
2078 push(new KernelFunctionDeclaration( 2126 push(new KernelFunctionDeclaration(
2079 variable, new FunctionNode(new InvalidStatement())) 2127 variable, new FunctionNode(new InvalidStatement()))
2080 ..fileOffset = beginToken.charOffset); 2128 ..fileOffset = beginToken.charOffset);
2081 declareVariable(variable); 2129 declareVariable(variable);
2082 enterLocalScope(); 2130 enterLocalScope();
2083 } 2131 }
2084 2132
2085 void enterFunction() { 2133 void enterFunction() {
2086 debugEvent("enterFunction"); 2134 debugEvent("enterFunction");
2087 functionNestingLevel++; 2135 functionNestingLevel++;
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
2147 Statement body = popStatement(); 2195 Statement body = popStatement();
2148 AsyncMarker asyncModifier = pop(); 2196 AsyncMarker asyncModifier = pop();
2149 exitLocalScope(); 2197 exitLocalScope();
2150 FormalParameters formals = pop(); 2198 FormalParameters formals = pop();
2151 exitFunction(); 2199 exitFunction();
2152 List<TypeParameter> typeParameters = pop(); 2200 List<TypeParameter> typeParameters = pop();
2153 FunctionNode function = formals.addToFunction(new FunctionNode(body, 2201 FunctionNode function = formals.addToFunction(new FunctionNode(body,
2154 typeParameters: typeParameters, asyncMarker: asyncModifier) 2202 typeParameters: typeParameters, asyncMarker: asyncModifier)
2155 ..fileOffset = beginToken.charOffset 2203 ..fileOffset = beginToken.charOffset
2156 ..fileEndOffset = token.charOffset); 2204 ..fileEndOffset = token.charOffset);
2157 push(astFactory.functionExpression(function, beginToken)); 2205 push(new KernelFunctionExpression(function)
2206 ..fileOffset = offsetForToken(beginToken));
2158 } 2207 }
2159 2208
2160 @override 2209 @override
2161 void endDoWhileStatement( 2210 void endDoWhileStatement(
2162 Token doKeyword, Token whileKeyword, Token endToken) { 2211 Token doKeyword, Token whileKeyword, Token endToken) {
2163 debugEvent("DoWhileStatement"); 2212 debugEvent("DoWhileStatement");
2164 Expression condition = popForValue(); 2213 Expression condition = popForValue();
2165 Statement body = popStatement(); 2214 Statement body = popStatement();
2166 JumpTarget continueTarget = exitContinueTarget(); 2215 JumpTarget continueTarget = exitContinueTarget();
2167 JumpTarget breakTarget = exitBreakTarget(); 2216 JumpTarget breakTarget = exitBreakTarget();
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
2213 /// for (lvalue in expression) body 2262 /// for (lvalue in expression) body
2214 /// 2263 ///
2215 /// This is normalized to: 2264 /// This is normalized to:
2216 /// 2265 ///
2217 /// for (final #t in expression) { 2266 /// for (final #t in expression) {
2218 /// lvalue = #t; 2267 /// lvalue = #t;
2219 /// body; 2268 /// body;
2220 /// } 2269 /// }
2221 variable = new VariableDeclaration.forValue(null); 2270 variable = new VariableDeclaration.forValue(null);
2222 body = combineStatements( 2271 body = combineStatements(
2223 astFactory.expressionStatement(lvalue 2272 new KernelExpressionStatement(lvalue
2224 .buildAssignment(new VariableGet(variable), voidContext: true)), 2273 .buildAssignment(new VariableGet(variable), voidContext: true)),
2225 body); 2274 body);
2226 } else { 2275 } else {
2227 variable = new VariableDeclaration.forValue(buildCompileTimeError( 2276 variable = new VariableDeclaration.forValue(buildCompileTimeError(
2228 "Expected lvalue, but got ${lvalue}", forToken.next.next.charOffset)); 2277 "Expected lvalue, but got ${lvalue}", forToken.next.next.charOffset));
2229 } 2278 }
2230 Statement result = new ForInStatement(variable, expression, body, 2279 Statement result = new ForInStatement(variable, expression, body,
2231 isAsync: awaitToken != null) 2280 isAsync: awaitToken != null)
2232 ..fileOffset = body.fileOffset; 2281 ..fileOffset = body.fileOffset;
2233 if (breakTarget.hasUsers) { 2282 if (breakTarget.hasUsers) {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
2275 } 2324 }
2276 target.continueTarget.resolveContinues(statement); 2325 target.continueTarget.resolveContinues(statement);
2277 } 2326 }
2278 push(statement); 2327 push(statement);
2279 } 2328 }
2280 2329
2281 @override 2330 @override
2282 void endRethrowStatement(Token rethrowToken, Token endToken) { 2331 void endRethrowStatement(Token rethrowToken, Token endToken) {
2283 debugEvent("RethrowStatement"); 2332 debugEvent("RethrowStatement");
2284 if (inCatchBlock) { 2333 if (inCatchBlock) {
2285 push(astFactory 2334 push(new KernelExpressionStatement(
2286 .expressionStatement(astFactory.rethrowExpression(rethrowToken))); 2335 new KernelRethrow()..fileOffset = offsetForToken(rethrowToken)));
2287 } else { 2336 } else {
2288 push(buildCompileTimeErrorStatement( 2337 push(buildCompileTimeErrorStatement(
2289 "'rethrow' can only be used in catch clauses.", 2338 "'rethrow' can only be used in catch clauses.",
2290 rethrowToken.charOffset)); 2339 rethrowToken.charOffset));
2291 } 2340 }
2292 } 2341 }
2293 2342
2294 @override 2343 @override
2295 void handleFinallyBlock(Token finallyKeyword) { 2344 void handleFinallyBlock(Token finallyKeyword) {
2296 debugEvent("FinallyBlock"); 2345 debugEvent("FinallyBlock");
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
2570 } 2619 }
2571 return super.handleUnrecoverableError(token, message); 2620 return super.handleUnrecoverableError(token, message);
2572 } 2621 }
2573 2622
2574 @override 2623 @override
2575 Expression buildCompileTimeError(error, [int charOffset = -1]) { 2624 Expression buildCompileTimeError(error, [int charOffset = -1]) {
2576 addCompileTimeError(charOffset, error); 2625 addCompileTimeError(charOffset, error);
2577 String message = formatUnexpected(uri, charOffset, error); 2626 String message = formatUnexpected(uri, charOffset, error);
2578 Builder constructor = library.loader.getCompileTimeError(); 2627 Builder constructor = library.loader.getCompileTimeError();
2579 return new Throw(buildStaticInvocation(constructor.target, 2628 return new Throw(buildStaticInvocation(constructor.target,
2580 astFactory.arguments(<Expression>[new StringLiteral(message)]))); 2629 new KernelArguments(<Expression>[new StringLiteral(message)])));
2581 } 2630 }
2582 2631
2583 Expression buildAbstractClassInstantiationError(String className, 2632 Expression buildAbstractClassInstantiationError(String className,
2584 [int charOffset = -1]) { 2633 [int charOffset = -1]) {
2585 warning("The class '$className' is abstract and can't be instantiated.", 2634 warning("The class '$className' is abstract and can't be instantiated.",
2586 charOffset); 2635 charOffset);
2587 Builder constructor = library.loader.getAbstractClassInstantiationError(); 2636 Builder constructor = library.loader.getAbstractClassInstantiationError();
2588 return new Throw(buildStaticInvocation(constructor.target, 2637 return new Throw(buildStaticInvocation(constructor.target,
2589 astFactory.arguments(<Expression>[new StringLiteral(className)]))); 2638 new KernelArguments(<Expression>[new StringLiteral(className)])));
2590 } 2639 }
2591 2640
2592 Statement buildCompileTimeErrorStatement(error, [int charOffset = -1]) { 2641 Statement buildCompileTimeErrorStatement(error, [int charOffset = -1]) {
2593 return astFactory 2642 return new KernelExpressionStatement(
2594 .expressionStatement(buildCompileTimeError(error, charOffset)); 2643 buildCompileTimeError(error, charOffset));
2595 } 2644 }
2596 2645
2597 @override 2646 @override
2598 Initializer buildInvalidIntializer(Expression expression, 2647 Initializer buildInvalidIntializer(Expression expression,
2599 [int charOffset = -1]) { 2648 [int charOffset = -1]) {
2600 needsImplicitSuperInitializer = false; 2649 needsImplicitSuperInitializer = false;
2601 return new LocalInitializer(new VariableDeclaration.forValue(expression)) 2650 return new LocalInitializer(new VariableDeclaration.forValue(expression))
2602 ..fileOffset = charOffset; 2651 ..fileOffset = charOffset;
2603 } 2652 }
2604 2653
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
2696 @override 2745 @override
2697 StaticGet makeStaticGet(Member readTarget, Token token) { 2746 StaticGet makeStaticGet(Member readTarget, Token token) {
2698 // TODO(paulberry): only record the dependencies mandated by the top level 2747 // TODO(paulberry): only record the dependencies mandated by the top level
2699 // type inference spec. 2748 // type inference spec.
2700 if (fieldDependencies != null && readTarget is KernelField) { 2749 if (fieldDependencies != null && readTarget is KernelField) {
2701 var fieldNode = _typeInferrer.getFieldNodeForReadTarget(readTarget); 2750 var fieldNode = _typeInferrer.getFieldNodeForReadTarget(readTarget);
2702 if (fieldNode != null) { 2751 if (fieldNode != null) {
2703 fieldDependencies.add(fieldNode); 2752 fieldDependencies.add(fieldNode);
2704 } 2753 }
2705 } 2754 }
2706 return astFactory.staticGet(readTarget, token); 2755 return new KernelStaticGet(readTarget)..fileOffset = offsetForToken(token);
2707 } 2756 }
2708 } 2757 }
2709 2758
2710 class Identifier { 2759 class Identifier {
2711 final Token token; 2760 final Token token;
2712 String get name => token.lexeme; 2761 String get name => token.lexeme;
2713 2762
2714 Identifier(this.token); 2763 Identifier(this.token);
2715 2764
2716 Expression get initializer => null; 2765 Expression get initializer => null;
(...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after
3188 if (starToken == null) { 3237 if (starToken == null) {
3189 return AsyncMarker.Async; 3238 return AsyncMarker.Async;
3190 } else { 3239 } else {
3191 assert(identical(starToken.stringValue, "*")); 3240 assert(identical(starToken.stringValue, "*"));
3192 return AsyncMarker.AsyncStar; 3241 return AsyncMarker.AsyncStar;
3193 } 3242 }
3194 } else { 3243 } else {
3195 return internalError("Unknown async modifier: $asyncToken"); 3244 return internalError("Unknown async modifier: $asyncToken");
3196 } 3245 }
3197 } 3246 }
OLDNEW
« no previous file with comments | « pkg/front_end/lib/src/fasta/builder/ast_factory.dart ('k') | pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698