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

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

Issue 2911023002: Various checks for constant expressions. (Closed)
Patch Set: Remove unneeded check. 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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(
« no previous file with comments | « no previous file | 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