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

Side by Side Diff: pkg/compiler/lib/src/constants/expressions.dart

Issue 1109393012: Allow use of deferred type-literals in non-constant contexts. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Address review Created 5 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, 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 dart2js.constants.expressions; 5 library dart2js.constants.expressions;
6 6
7 import '../dart2jslib.dart' show assertDebugMode; 7 import '../dart2jslib.dart' show assertDebugMode;
8 import '../dart_types.dart'; 8 import '../dart_types.dart';
9 import '../elements/elements.dart' show 9 import '../elements/elements.dart' show
10 ConstructorElement, 10 ConstructorElement,
11 Element, 11 Element,
12 FunctionElement, 12 FunctionElement,
13 PrefixElement,
13 VariableElement; 14 VariableElement;
14 import '../resolution/operators.dart'; 15 import '../resolution/operators.dart';
15 import '../universe/universe.dart' show CallStructure; 16 import '../universe/universe.dart' show CallStructure;
16 import 'values.dart'; 17 import 'values.dart';
17 18
18 enum ConstantExpressionKind { 19 enum ConstantExpressionKind {
19 BINARY, 20 BINARY,
20 BOOL, 21 BOOL,
21 CONCATENATE, 22 CONCATENATE,
22 CONDITIONAL, 23 CONDITIONAL,
23 CONSTRUCTED, 24 CONSTRUCTED,
25 DEFERRED,
24 DOUBLE, 26 DOUBLE,
25 ERRONEOUS, 27 ERRONEOUS,
26 FUNCTION, 28 FUNCTION,
27 IDENTICAL, 29 IDENTICAL,
28 INT, 30 INT,
29 LIST, 31 LIST,
30 MAP, 32 MAP,
31 NULL, 33 NULL,
32 STRING, 34 STRING,
33 SYMBOL, 35 SYMBOL,
(...skipping 565 matching lines...) Expand 10 before | Expand all | Expand 10 after
599 } 601 }
600 602
601 @override 603 @override
602 bool _equals(ConditionalConstantExpression other) { 604 bool _equals(ConditionalConstantExpression other) {
603 return condition == other.condition && 605 return condition == other.condition &&
604 trueExp == other.trueExp && 606 trueExp == other.trueExp &&
605 falseExp == other.falseExp; 607 falseExp == other.falseExp;
606 } 608 }
607 } 609 }
608 610
611 /// A constant expression referenced with a deferred prefix.
612 /// For example `lib.C`.
613 class DeferredConstantExpression extends ConstantExpression {
614 final ConstantValue value;
615 final ConstantExpression expression;
616 final PrefixElement prefix;
617
618 DeferredConstantExpression(this.value, this.expression, this.prefix);
619
620 ConstantExpressionKind get kind => ConstantExpressionKind.DEFERRED;
621
622 @override
623 int _computeHashCode() {
624 return 13 * expression.hashCode;
625 }
626
627 @override
628 bool _equals(DeferredConstantExpression other) {
629 return expression == other.expression;
630 }
631
632 @override
633 accept(ConstantExpressionVisitor visitor, [context]) {
634 return visitor.visitDeferred(this, context);
635 }
636 }
637
609 abstract class ConstantExpressionVisitor<C, R> { 638 abstract class ConstantExpressionVisitor<C, R> {
610 const ConstantExpressionVisitor(); 639 const ConstantExpressionVisitor();
611 640
612 R visit(ConstantExpression constant, C context) { 641 R visit(ConstantExpression constant, C context) {
613 return constant.accept(this, context); 642 return constant.accept(this, context);
614 } 643 }
615 644
616 R visitPrimitive(PrimitiveConstantExpression exp, C context); 645 R visitPrimitive(PrimitiveConstantExpression exp, C context);
617 R visitList(ListConstantExpression exp, C context); 646 R visitList(ListConstantExpression exp, C context);
618 R visitMap(MapConstantExpression exp, C context); 647 R visitMap(MapConstantExpression exp, C context);
619 R visitConstructed(ConstructedConstantExpression exp, C context); 648 R visitConstructed(ConstructedConstantExpression exp, C context);
620 R visitConcatenate(ConcatenateConstantExpression exp, C context); 649 R visitConcatenate(ConcatenateConstantExpression exp, C context);
621 R visitSymbol(SymbolConstantExpression exp, C context); 650 R visitSymbol(SymbolConstantExpression exp, C context);
622 R visitType(TypeConstantExpression exp, C context); 651 R visitType(TypeConstantExpression exp, C context);
623 R visitVariable(VariableConstantExpression exp, C context); 652 R visitVariable(VariableConstantExpression exp, C context);
624 R visitFunction(FunctionConstantExpression exp, C context); 653 R visitFunction(FunctionConstantExpression exp, C context);
625 R visitBinary(BinaryConstantExpression exp, C context); 654 R visitBinary(BinaryConstantExpression exp, C context);
626 R visitIdentical(IdenticalConstantExpression exp, C context); 655 R visitIdentical(IdenticalConstantExpression exp, C context);
627 R visitUnary(UnaryConstantExpression exp, C context); 656 R visitUnary(UnaryConstantExpression exp, C context);
628 R visitConditional(ConditionalConstantExpression exp, C context); 657 R visitConditional(ConditionalConstantExpression exp, C context);
658 R visitDeferred(DeferredConstantExpression exp, C context);
629 } 659 }
630 660
631 /// Represents the declaration of a constant [element] with value [expression]. 661 /// Represents the declaration of a constant [element] with value [expression].
632 // TODO(johnniwinther): Where does this class belong? 662 // TODO(johnniwinther): Where does this class belong?
633 class ConstDeclaration { 663 class ConstDeclaration {
634 final VariableElement element; 664 final VariableElement element;
635 final ConstantExpression expression; 665 final ConstantExpression expression;
636 666
637 ConstDeclaration(this.element, this.expression); 667 ConstDeclaration(this.element, this.expression);
638 } 668 }
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
801 831
802 @override 832 @override
803 void visitConditional(ConditionalConstantExpression exp, [_]) { 833 void visitConditional(ConditionalConstantExpression exp, [_]) {
804 write(exp, exp.condition, leftAssociative: false); 834 write(exp, exp.condition, leftAssociative: false);
805 sb.write(' ? '); 835 sb.write(' ? ');
806 write(exp, exp.trueExp); 836 write(exp, exp.trueExp);
807 sb.write(' : '); 837 sb.write(' : ');
808 write(exp, exp.falseExp); 838 write(exp, exp.falseExp);
809 } 839 }
810 840
841 @override
842 visitDeferred(DeferredConstantExpression exp, context) {
843 sb.write(exp.prefix.deferredImport.prefix.source);
844 sb.write('.');
845 write(exp, exp.expression);
846 }
847
811 String toString() => sb.toString(); 848 String toString() => sb.toString();
812 } 849 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/compile_time_constants.dart ('k') | pkg/compiler/lib/src/dart_backend/backend.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698