| Index: pkg/compiler/lib/src/compile_time_constants.dart
|
| diff --git a/pkg/compiler/lib/src/compile_time_constants.dart b/pkg/compiler/lib/src/compile_time_constants.dart
|
| index 1c066ed2c0485add0ec9bd279654610dc58306a5..71962e88957bcc163fdc0d7df455753022b6ab8c 100644
|
| --- a/pkg/compiler/lib/src/compile_time_constants.dart
|
| +++ b/pkg/compiler/lib/src/compile_time_constants.dart
|
| @@ -414,10 +414,7 @@ class CompileTimeConstantEvaluator extends Visitor<AstConstant> {
|
| AstConstant evaluate(Node node) {
|
| // TODO(johnniwinther): should there be a visitErrorNode?
|
| if (node is ErrorNode) return new ErroneousAstConstant(context, node);
|
| - AstConstant result = node.accept(this);
|
| - assert(invariant(node, !isEvaluatingConstant || result != null,
|
| - message: "No AstConstant computed for the node."));
|
| - return result;
|
| + return node.accept(this);
|
| }
|
|
|
| AstConstant evaluateConstant(Node node) {
|
| @@ -425,8 +422,7 @@ class CompileTimeConstantEvaluator extends Visitor<AstConstant> {
|
| isEvaluatingConstant = true;
|
| AstConstant result = node.accept(this);
|
| isEvaluatingConstant = oldIsEvaluatingConstant;
|
| - assert(invariant(node, result != null,
|
| - message: "No AstConstant computed for the node."));
|
| + assert(result != null);
|
| return result;
|
| }
|
|
|
| @@ -465,8 +461,8 @@ class CompileTimeConstantEvaluator extends Visitor<AstConstant> {
|
| !link.isEmpty;
|
| link = link.tail) {
|
| AstConstant argument = evaluateConstant(link.head);
|
| - if (argument == null || argument.isError) {
|
| - return argument;
|
| + if (argument == null) {
|
| + return null;
|
| }
|
| argumentExpressions.add(argument.expression);
|
| argumentValues.add(argument.value);
|
| @@ -492,12 +488,12 @@ class CompileTimeConstantEvaluator extends Visitor<AstConstant> {
|
| link = link.tail) {
|
| LiteralMapEntry entry = link.head;
|
| AstConstant key = evaluateConstant(entry.key);
|
| - if (key == null || key.isError) {
|
| - return key;
|
| + if (key == null) {
|
| + return null;
|
| }
|
| AstConstant value = evaluateConstant(entry.value);
|
| - if (value == null || value.isError) {
|
| - return value;
|
| + if (value == null) {
|
| + return null;
|
| }
|
| if (!map.containsKey(key.value)) {
|
| keyValues.add(key.value);
|
| @@ -534,12 +530,7 @@ class CompileTimeConstantEvaluator extends Visitor<AstConstant> {
|
| AstConstant visitStringJuxtaposition(StringJuxtaposition node) {
|
| AstConstant left = evaluate(node.first);
|
| AstConstant right = evaluate(node.second);
|
| - if (left == null || left.isError) {
|
| - return left;
|
| - }
|
| - if (right == null || right.isError) {
|
| - return right;
|
| - }
|
| + if (left == null || right == null) return null;
|
| StringConstantValue leftValue = left.value;
|
| StringConstantValue rightValue = right.value;
|
| return new AstConstant(
|
| @@ -553,16 +544,16 @@ class CompileTimeConstantEvaluator extends Visitor<AstConstant> {
|
| AstConstant visitStringInterpolation(StringInterpolation node) {
|
| List<ConstantExpression> subexpressions = <ConstantExpression>[];
|
| AstConstant initialString = evaluate(node.string);
|
| - if (initialString == null || initialString.isError) {
|
| - return initialString;
|
| + if (initialString == null) {
|
| + return null;
|
| }
|
| subexpressions.add(initialString.expression);
|
| StringConstantValue initialStringValue = initialString.value;
|
| DartString accumulator = initialStringValue.primitiveValue;
|
| for (StringInterpolationPart part in node.parts) {
|
| AstConstant subexpression = evaluate(part.expression);
|
| - if (subexpression == null || subexpression.isError) {
|
| - return subexpression;
|
| + if (subexpression == null) {
|
| + return null;
|
| }
|
| subexpressions.add(subexpression.expression);
|
| ConstantValue expression = subexpression.value;
|
| @@ -587,6 +578,7 @@ class CompileTimeConstantEvaluator extends Visitor<AstConstant> {
|
| accumulator =
|
| new DartString.concat(accumulator, partStringValue.primitiveValue);
|
| }
|
| + ;
|
| return new AstConstant(
|
| context,
|
| node,
|
| @@ -733,8 +725,8 @@ class CompileTimeConstantEvaluator extends Visitor<AstConstant> {
|
| } else if (send.isPrefix) {
|
| assert(send.isOperator);
|
| AstConstant receiverConstant = evaluate(send.receiver);
|
| - if (receiverConstant == null || receiverConstant.isError) {
|
| - return receiverConstant;
|
| + if (receiverConstant == null) {
|
| + return null;
|
| }
|
| Operator node = send.selector;
|
| UnaryOperator operator = UnaryOperator.parse(node.source);
|
| @@ -755,11 +747,8 @@ class CompileTimeConstantEvaluator extends Visitor<AstConstant> {
|
| assert(send.argumentCount() == 1);
|
| AstConstant left = evaluate(send.receiver);
|
| AstConstant right = evaluate(send.argumentsNode.nodes.head);
|
| - if (left == null || left.isError) {
|
| - return left;
|
| - }
|
| - if (right == null || right.isError) {
|
| - return right;
|
| + if (left == null || right == null) {
|
| + return null;
|
| }
|
| ConstantValue leftValue = left.value;
|
| ConstantValue rightValue = right.value;
|
| @@ -807,8 +796,8 @@ class CompileTimeConstantEvaluator extends Visitor<AstConstant> {
|
|
|
| AstConstant visitConditional(Conditional node) {
|
| AstConstant condition = evaluate(node.condition);
|
| - if (condition == null || condition.isError) {
|
| - return condition;
|
| + if (condition == null) {
|
| + return null;
|
| } else if (!condition.value.isBool) {
|
| DartType conditionType = condition.value.getType(coreTypes);
|
| if (isEvaluatingConstant) {
|
| @@ -820,11 +809,8 @@ class CompileTimeConstantEvaluator extends Visitor<AstConstant> {
|
| }
|
| AstConstant thenExpression = evaluate(node.thenExpression);
|
| AstConstant elseExpression = evaluate(node.elseExpression);
|
| - if (thenExpression == null || thenExpression.isError) {
|
| - return thenExpression;
|
| - }
|
| - if (elseExpression == null || elseExpression.isError) {
|
| - return elseExpression;
|
| + if (thenExpression == null || elseExpression == null) {
|
| + return null;
|
| }
|
| BoolConstantValue boolCondition = condition.value;
|
| return new AstConstant(
|
| @@ -992,43 +978,48 @@ class CompileTimeConstantEvaluator extends Visitor<AstConstant> {
|
| ConstantValue defaultValue = normalizedArguments[1].value;
|
|
|
| if (firstArgument.isNull) {
|
| - return reportNotCompileTimeConstant(
|
| + reporter.reportErrorMessage(
|
| normalizedArguments[0].node, MessageKind.NULL_NOT_ALLOWED);
|
| + return null;
|
| }
|
|
|
| if (!firstArgument.isString) {
|
| DartType type = defaultValue.getType(coreTypes);
|
| - return reportNotCompileTimeConstant(
|
| + reporter.reportErrorMessage(
|
| normalizedArguments[0].node,
|
| MessageKind.NOT_ASSIGNABLE,
|
| {'fromType': type, 'toType': coreTypes.stringType});
|
| + return null;
|
| }
|
|
|
| if (constructor.isIntFromEnvironmentConstructor &&
|
| !(defaultValue.isNull || defaultValue.isInt)) {
|
| DartType type = defaultValue.getType(coreTypes);
|
| - return reportNotCompileTimeConstant(
|
| + reporter.reportErrorMessage(
|
| normalizedArguments[1].node,
|
| MessageKind.NOT_ASSIGNABLE,
|
| {'fromType': type, 'toType': coreTypes.intType});
|
| + return null;
|
| }
|
|
|
| if (constructor.isBoolFromEnvironmentConstructor &&
|
| !(defaultValue.isNull || defaultValue.isBool)) {
|
| DartType type = defaultValue.getType(coreTypes);
|
| - return reportNotCompileTimeConstant(
|
| + reporter.reportErrorMessage(
|
| normalizedArguments[1].node,
|
| MessageKind.NOT_ASSIGNABLE,
|
| {'fromType': type, 'toType': coreTypes.boolType});
|
| + return null;
|
| }
|
|
|
| if (constructor.isStringFromEnvironmentConstructor &&
|
| !(defaultValue.isNull || defaultValue.isString)) {
|
| DartType type = defaultValue.getType(coreTypes);
|
| - return reportNotCompileTimeConstant(
|
| + reporter.reportErrorMessage(
|
| normalizedArguments[1].node,
|
| MessageKind.NOT_ASSIGNABLE,
|
| {'fromType': type, 'toType': coreTypes.stringType});
|
| + return null;
|
| }
|
|
|
| String name = firstArgument.primitiveValue.slowToString();
|
| @@ -1112,11 +1103,6 @@ class CompileTimeConstantEvaluator extends Visitor<AstConstant> {
|
| fieldConstants.forEach((FieldElement field, AstConstant astConstant) {
|
| fieldValues[field] = astConstant.value;
|
| });
|
| - for (AstConstant fieldValue in fieldConstants.values) {
|
| - if (fieldValue.isError) {
|
| - return fieldValue;
|
| - }
|
| - }
|
| return new AstConstant(
|
| context,
|
| node,
|
| @@ -1129,18 +1115,13 @@ class CompileTimeConstantEvaluator extends Visitor<AstConstant> {
|
| return node.expression.accept(this);
|
| }
|
|
|
| - AstConstant reportNotCompileTimeConstant(Node node, MessageKind message,
|
| - [Map arguments = const {}]) {
|
| - reporter.reportErrorMessage(node, message, arguments);
|
| - return new AstConstant(context, node, new ErroneousConstantExpression(),
|
| - new NullConstantValue());
|
| - }
|
| -
|
| AstConstant signalNotCompileTimeConstant(Node node,
|
| - {MessageKind message: MessageKind.NOT_A_COMPILE_TIME_CONSTANT,
|
| - Map arguments: const {}}) {
|
| + {MessageKind message: MessageKind.NOT_A_COMPILE_TIME_CONSTANT}) {
|
| if (isEvaluatingConstant) {
|
| - return reportNotCompileTimeConstant(node, message, arguments);
|
| + reporter.reportErrorMessage(node, message);
|
| +
|
| + return new AstConstant(context, node, new ErroneousConstantExpression(),
|
| + new NullConstantValue());
|
| }
|
| // Else we don't need to do anything. The final handler is only
|
| // optimistically trying to compile constants. So it is normal that we
|
| @@ -1391,8 +1372,6 @@ class AstConstant {
|
| value);
|
| }
|
|
|
| - bool get isError => expression.kind == ConstantExpressionKind.ERRONEOUS;
|
| -
|
| String toString() => expression.toString();
|
| }
|
|
|
|
|