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

Unified Diff: pkg/compiler/lib/src/constants/expressions.dart

Issue 1166723002: Add StringLengthConstantExpression (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Update .fromEnvironment test expectations. 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/compiler/lib/src/compile_time_constants.dart ('k') | pkg/docgen/lib/src/models/model_helpers.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/constants/expressions.dart
diff --git a/pkg/compiler/lib/src/constants/expressions.dart b/pkg/compiler/lib/src/constants/expressions.dart
index 0c6a6ac8795f0ace9761a22530c484b75f32e21f..32c678984d3bcbbc2d6db039965031bcace59e40 100644
--- a/pkg/compiler/lib/src/constants/expressions.dart
+++ b/pkg/compiler/lib/src/constants/expressions.dart
@@ -38,6 +38,7 @@ enum ConstantExpressionKind {
NULL,
STRING,
STRING_FROM_ENVIRONMENT,
+ STRING_LENGTH,
SYMBOL,
TYPE,
UNARY,
@@ -1002,6 +1003,50 @@ class UnaryConstantExpression extends ConstantExpression {
};
}
+
+/// A string length constant expression like `a.length`.
+class StringLengthConstantExpression extends ConstantExpression {
+ final ConstantValue value;
+ final ConstantExpression expression;
+
+ StringLengthConstantExpression(this.value, this.expression);
+
+ ConstantExpressionKind get kind => ConstantExpressionKind.STRING_LENGTH;
+
+ accept(ConstantExpressionVisitor visitor, [context]) {
+ return visitor.visitStringLength(this, context);
+ }
+
+ @override
+ ConstantValue evaluate(Environment environment,
+ ConstantSystem constantSystem) {
+ ConstantValue value = expression.evaluate(environment, constantSystem);
+ if (value.isString) {
+ StringConstantValue stringValue = value;
+ return constantSystem.createInt(stringValue.primitiveValue.length);
+ }
+ return new NonConstantValue();
+ }
+
+ ConstantExpression apply(NormalizedArguments arguments) {
+ return new StringLengthConstantExpression(
+ value,
+ expression.apply(arguments));
+ }
+
+ int get precedence => 15;
+
+ @override
+ int _computeHashCode() {
+ return 23 * expression.hashCode;
+ }
+
+ @override
+ bool _equals(StringLengthConstantExpression other) {
+ return expression == other.expression;
+ }
+}
+
/// A constant conditional expression like `a ? b : c`.
class ConditionalConstantExpression extends ConstantExpression {
final ConstantValue value;
@@ -1135,7 +1180,7 @@ class NamedArgumentReference extends ConstantExpression {
abstract class FromEnvironmentConstantExpression extends ConstantExpression {
final ConstantValue value;
- final String name;
+ final ConstantExpression name;
final ConstantExpression defaultValue;
FromEnvironmentConstantExpression(this.value, this.name, this.defaultValue);
@@ -1159,7 +1204,7 @@ class BoolFromEnvironmentConstantExpression
BoolFromEnvironmentConstantExpression(
ConstantValue value,
- String name,
+ ConstantExpression name,
ConstantExpression defaultValue)
: super(value, name, defaultValue);
@@ -1174,19 +1219,35 @@ class BoolFromEnvironmentConstantExpression
@override
ConstantValue evaluate(Environment environment,
ConstantSystem constantSystem) {
- String text = environment.readFromEnvironment(name);
+ ConstantValue nameConstantValue =
+ name.evaluate(environment, constantSystem);
+ ConstantValue defaultConstantValue;
+ if (defaultValue != null) {
+ defaultConstantValue =
+ defaultValue.evaluate(environment, constantSystem);
+ } else {
+ defaultConstantValue = constantSystem.createBool(false);
+ }
+ if (!nameConstantValue.isString) {
+ return new NonConstantValue();
+ }
+ StringConstantValue nameStringConstantValue = nameConstantValue;
+ String text = environment.readFromEnvironment(
+ nameStringConstantValue.primitiveValue.slowToString());
if (text == 'true') {
return constantSystem.createBool(true);
} else if (text == 'false') {
return constantSystem.createBool(false);
} else {
- return defaultValue.evaluate(environment, constantSystem);
+ return defaultConstantValue;
}
}
ConstantExpression apply(NormalizedArguments arguments) {
return new BoolFromEnvironmentConstantExpression(
- null, name, defaultValue.apply(arguments));
+ null,
+ name.apply(arguments),
+ defaultValue != null ? defaultValue.apply(arguments) : null);
}
}
@@ -1196,7 +1257,7 @@ class IntFromEnvironmentConstantExpression
IntFromEnvironmentConstantExpression(
ConstantValue value,
- String name,
+ ConstantExpression name,
ConstantExpression defaultValue)
: super(value, name, defaultValue);
@@ -1211,13 +1272,27 @@ class IntFromEnvironmentConstantExpression
@override
ConstantValue evaluate(Environment environment,
ConstantSystem constantSystem) {
+ ConstantValue nameConstantValue =
+ name.evaluate(environment, constantSystem);
+ ConstantValue defaultConstantValue;
+ if (defaultValue != null) {
+ defaultConstantValue =
+ defaultValue.evaluate(environment, constantSystem);
+ } else {
+ defaultConstantValue = constantSystem.createNull();
+ }
+ if (!nameConstantValue.isString) {
+ return new NonConstantValue();
+ }
+ StringConstantValue nameStringConstantValue = nameConstantValue;
+ String text = environment.readFromEnvironment(
+ nameStringConstantValue.primitiveValue.slowToString());
int value;
- String text = environment.readFromEnvironment(name);
if (text != null) {
value = int.parse(text, onError: (_) => null);
}
if (value == null) {
- return defaultValue.evaluate(environment, constantSystem);
+ return defaultConstantValue;
} else {
return constantSystem.createInt(value);
}
@@ -1225,7 +1300,9 @@ class IntFromEnvironmentConstantExpression
ConstantExpression apply(NormalizedArguments arguments) {
return new IntFromEnvironmentConstantExpression(
- null, name, defaultValue.apply(arguments));
+ null,
+ name.apply(arguments),
+ defaultValue != null ? defaultValue.apply(arguments) : null);
}
}
@@ -1235,7 +1312,7 @@ class StringFromEnvironmentConstantExpression
StringFromEnvironmentConstantExpression(
ConstantValue value,
- String name,
+ ConstantExpression name,
ConstantExpression defaultValue)
: super(value, name, defaultValue);
@@ -1250,9 +1327,23 @@ class StringFromEnvironmentConstantExpression
@override
ConstantValue evaluate(Environment environment,
ConstantSystem constantSystem) {
- String text = environment.readFromEnvironment(name);
+ ConstantValue nameConstantValue =
+ name.evaluate(environment, constantSystem);
+ ConstantValue defaultConstantValue;
+ if (defaultValue != null) {
+ defaultConstantValue =
+ defaultValue.evaluate(environment, constantSystem);
+ } else {
+ defaultConstantValue = constantSystem.createNull();
+ }
+ if (!nameConstantValue.isString) {
+ return new NonConstantValue();
+ }
+ StringConstantValue nameStringConstantValue = nameConstantValue;
+ String text = environment.readFromEnvironment(
+ nameStringConstantValue.primitiveValue.slowToString());
if (text == null) {
- return defaultValue.evaluate(environment, constantSystem);
+ return defaultConstantValue;
} else {
return constantSystem.createString(new DartString.literal(text));
}
@@ -1260,7 +1351,9 @@ class StringFromEnvironmentConstantExpression
ConstantExpression apply(NormalizedArguments arguments) {
return new StringFromEnvironmentConstantExpression(
- null, name, defaultValue.apply(arguments));
+ null,
+ name.apply(arguments),
+ defaultValue != null ? defaultValue.apply(arguments) : null);
}
}
@@ -1286,6 +1379,11 @@ class DeferredConstantExpression extends ConstantExpression {
return 13 * expression.hashCode;
}
+ ConstantExpression apply(NormalizedArguments arguments) {
+ return new DeferredConstantExpression(
+ value, expression.apply(arguments), prefix);
+ }
+
@override
bool _equals(DeferredConstantExpression other) {
return expression == other.expression;
@@ -1320,6 +1418,7 @@ abstract class ConstantExpressionVisitor<R, A> {
R visitBinary(BinaryConstantExpression exp, A context);
R visitIdentical(IdenticalConstantExpression exp, A context);
R visitUnary(UnaryConstantExpression exp, A context);
+ R visitStringLength(StringLengthConstantExpression exp, A context);
R visitConditional(ConditionalConstantExpression exp, A context);
R visitBoolFromEnvironment(BoolFromEnvironmentConstantExpression exp,
A context);
@@ -1346,8 +1445,8 @@ class ConstExpPrinter extends ConstantExpressionVisitor {
final StringBuffer sb = new StringBuffer();
void write(ConstantExpression parent,
- ConstantExpression child,
- {bool leftAssociative: true}) {
+ ConstantExpression child,
+ {bool leftAssociative: true}) {
if (child.precedence < parent.precedence ||
!leftAssociative && child.precedence == parent.precedence) {
sb.write('(');
@@ -1443,11 +1542,11 @@ class ConstExpPrinter extends ConstantExpressionVisitor {
void visitConstructed(ConstructedConstantExpression exp, [_]) {
sb.write('const ');
sb.write(exp.target.enclosingClass.name);
+ writeTypeArguments(exp.type);
if (exp.target.name != '') {
sb.write('.');
sb.write(exp.target.name);
}
- writeTypeArguments(exp.type);
sb.write('(');
bool needsComma = false;
@@ -1530,6 +1629,12 @@ class ConstExpPrinter extends ConstantExpressionVisitor {
}
@override
+ void visitStringLength(StringLengthConstantExpression exp, [_]) {
+ write(exp, exp.expression, leftAssociative: false);
+ sb.write('.length');
+ }
+
+ @override
void visitConditional(ConditionalConstantExpression exp, [_]) {
write(exp, exp.condition, leftAssociative: false);
sb.write(' ? ');
@@ -1560,23 +1665,35 @@ class ConstExpPrinter extends ConstantExpressionVisitor {
@override
void visitBoolFromEnvironment(BoolFromEnvironmentConstantExpression exp,
[_]) {
- sb.write('const bool.fromEnvironment("${exp.name}", defaultValue: ');
- visit(exp.defaultValue);
+ sb.write('const bool.fromEnvironment(');
+ visit(exp.name);
+ if (exp.defaultValue != null) {
+ sb.write(', defaultValue: ');
+ visit(exp.defaultValue);
+ }
sb.write(')');
}
@override
void visitIntFromEnvironment(IntFromEnvironmentConstantExpression exp, [_]) {
- sb.write('const int.fromEnvironment("${exp.name}", defaultValue: ');
- visit(exp.defaultValue);
+ sb.write('const int.fromEnvironment(');
+ visit(exp.name);
+ if (exp.defaultValue != null) {
+ sb.write(', defaultValue: ');
+ visit(exp.defaultValue);
+ }
sb.write(')');
}
@override
void visitStringFromEnvironment(StringFromEnvironmentConstantExpression exp,
[_]) {
- sb.write('const String.fromEnvironment("${exp.name}", defaultValue: ');
- visit(exp.defaultValue);
+ sb.write('const String.fromEnvironment(');
+ visit(exp.name);
+ if (exp.defaultValue != null) {
+ sb.write(', defaultValue: ');
+ visit(exp.defaultValue);
+ }
sb.write(')');
}
« no previous file with comments | « pkg/compiler/lib/src/compile_time_constants.dart ('k') | pkg/docgen/lib/src/models/model_helpers.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698