| Index: pkg/front_end/lib/src/fasta/kernel/body_builder.dart
|
| diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
|
| index cd811698d09bc372a6d9b670082ebd9798a4127c..91af1efcd7e559d7de479775558f0ab479b44415 100644
|
| --- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
|
| +++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
|
| @@ -650,17 +650,7 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
|
|
|
| @override
|
| finishSend(Object receiver, Arguments arguments, int charOffset) {
|
| - bool isIdentical(Object receiver) {
|
| - return receiver is StaticAccessor &&
|
| - receiver.readTarget == coreTypes.identicalProcedure;
|
| - }
|
| -
|
| if (receiver is FastaAccessor) {
|
| - if (constantExpressionRequired &&
|
| - !isIdentical(receiver) &&
|
| - !receiver.isInitializer) {
|
| - addCompileTimeError(charOffset, "Not a constant expression.");
|
| - }
|
| return receiver.doInvocation(charOffset, arguments);
|
| } else {
|
| return buildMethodInvocation(
|
| @@ -694,6 +684,21 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
|
| }
|
|
|
| @override
|
| + void beginCaseExpression(Token caseKeyword) {
|
| + debugEvent("beginCaseExpression");
|
| + super.push(constantExpressionRequired);
|
| + constantExpressionRequired = true;
|
| + }
|
| +
|
| + @override
|
| + void endCaseExpression(Token colon) {
|
| + debugEvent("endCaseExpression");
|
| + Expression expression = popForValue();
|
| + constantExpressionRequired = pop();
|
| + super.push(expression);
|
| + }
|
| +
|
| + @override
|
| void handleBinaryExpression(Token token) {
|
| debugEvent("BinaryExpression");
|
| if (optional(".", token) || optional("..", token)) {
|
| @@ -1709,6 +1714,12 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
|
| }
|
|
|
| @override
|
| + void beginFormalParameters(Token token, MemberKind kind) {
|
| + super.push(constantExpressionRequired);
|
| + constantExpressionRequired = false;
|
| + }
|
| +
|
| + @override
|
| void endFormalParameters(
|
| int count, Token beginToken, Token endToken, MemberKind kind) {
|
| debugEvent("FormalParameters");
|
| @@ -1721,6 +1732,7 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
|
| popList(count) ?? <VariableDeclaration>[],
|
| optional,
|
| beginToken.charOffset);
|
| + constantExpressionRequired = pop();
|
| push(formals);
|
| if ((inCatchClause || functionNestingLevel != 0) &&
|
| kind != MemberKind.GeneralizedFunctionType) {
|
| @@ -1834,7 +1846,10 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
|
| token.charOffset)));
|
| } else {
|
| push(buildMethodInvocation(toValue(receiver), new Name(operator),
|
| - new Arguments.empty(), token.charOffset));
|
| + new Arguments.empty(), token.charOffset,
|
| + // This *could* be a constant expression, we can't know without
|
| + // evaluating [receiver].
|
| + isConstantExpression: true));
|
| }
|
| }
|
| }
|
| @@ -2776,9 +2791,15 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
|
| }
|
|
|
| @override
|
| + bool isIdentical(Member member) => member == coreTypes.identicalProcedure;
|
| +
|
| + @override
|
| Expression buildMethodInvocation(
|
| Expression receiver, Name name, Arguments arguments, int offset,
|
| {bool isConstantExpression: false, bool isNullAware: false}) {
|
| + if (constantExpressionRequired && !isConstantExpression) {
|
| + return buildCompileTimeError("Not a constant expression.", offset);
|
| + }
|
| if (isNullAware) {
|
| VariableDeclaration variable = new VariableDeclaration.forValue(receiver);
|
| return makeLet(
|
|
|