| Index: compiler/java/com/google/dart/compiler/resolver/Resolver.java
|
| diff --git a/compiler/java/com/google/dart/compiler/resolver/Resolver.java b/compiler/java/com/google/dart/compiler/resolver/Resolver.java
|
| index 7af6cf664b40f2c339ae930a08c7bd6e17b947fd..e5cbda346f2d7b638843359e1fcbb75672bc8925 100644
|
| --- a/compiler/java/com/google/dart/compiler/resolver/Resolver.java
|
| +++ b/compiler/java/com/google/dart/compiler/resolver/Resolver.java
|
| @@ -59,6 +59,7 @@ import com.google.dart.compiler.ast.DartUnit;
|
| import com.google.dart.compiler.ast.DartUnqualifiedInvocation;
|
| import com.google.dart.compiler.ast.DartVariable;
|
| import com.google.dart.compiler.ast.DartVariableStatement;
|
| +import com.google.dart.compiler.ast.DartVisitor;
|
| import com.google.dart.compiler.ast.DartWhileStatement;
|
| import com.google.dart.compiler.ast.Modifiers;
|
| import com.google.dart.compiler.type.FunctionType;
|
| @@ -338,20 +339,33 @@ public class Resolver {
|
| return member;
|
| }
|
|
|
| - private void resolveConstantExpression(DartExpression defaultExpr) {
|
| - resolve(defaultExpr);
|
| - checkConstantExpression(defaultExpr);
|
| + private void resolveConstantExpression(DartExpression expr) {
|
| + resolve(expr);
|
| + checkConstantExpression(expr);
|
| }
|
|
|
| - private void checkConstantExpression(DartExpression defaultExpr) {
|
| - // See bug 4568007.
|
| + // See bug 4568007.
|
| + private void checkConstantExpression(DartExpression expr) {
|
| + if (expr != null) {
|
| + DartVisitor v = CompileTimeConstVisitor.create(typeProvider, context);
|
| + v.accept(expr);
|
| + }
|
| }
|
|
|
| - private void checkConstantLiteral(DartExpression defaultExpr) {
|
| - if ((!(defaultExpr instanceof DartLiteral))
|
| - || ((defaultExpr instanceof DartTypedLiteral)
|
| - && (!((DartTypedLiteral) defaultExpr).isConst()))) {
|
| - resolutionError(defaultExpr, DartCompilerErrorCode.EXPECTED_CONSTANT_LITERAL);
|
| + private void checkConstantLiteral(DartExpression expr) {
|
| + boolean isConstant = true;
|
| + if (expr instanceof DartStringInterpolation) {
|
| + isConstant = false;
|
| + } else if (expr instanceof DartLiteral) {
|
| + if (expr instanceof DartTypedLiteral && !((DartTypedLiteral) expr).isConst()){
|
| + isConstant = false;
|
| + }
|
| + } else {
|
| + isConstant = false;
|
| + }
|
| +
|
| + if (!isConstant) {
|
| + resolutionError(expr, DartCompilerErrorCode.EXPECTED_CONSTANT_LITERAL);
|
| }
|
| }
|
|
|
| @@ -364,18 +378,23 @@ public class Resolver {
|
| boolean isTopLevel = ElementKind.of(currentHolder).equals(ElementKind.LIBRARY);
|
|
|
| if (expression != null) {
|
| + resolve(expression);
|
| if (isStatic || isTopLevel) {
|
| checkConstantExpression(expression);
|
| + // Now, this constant has a type. Save it for future reference
|
| + Element element = node.getSymbol();
|
| + if (expression.getType() != null) {
|
| + Elements.setType(element, expression.getType());
|
| + }
|
| } else {
|
| // TODO(5200401): Only allow constant literals for inline field initializers for now.
|
| checkConstantLiteral(expression);
|
| }
|
| - resolve(expression);
|
| } else if (isStatic && isFinal) {
|
| resolutionError(node, DartCompilerErrorCode.STATIC_FINAL_REQUIRES_VALUE);
|
| }
|
|
|
| - // If field is an acessor, both getter and setter need to be visited (if present).
|
| + // If field is an accessor, both getter and setter need to be visited (if present).
|
| FieldElement field = node.getSymbol();
|
| if (field.getGetter() != null) {
|
| resolve(field.getGetter().getNode());
|
| @@ -854,8 +873,15 @@ public class Resolver {
|
|
|
| @Override
|
| public Element visitNewExpression(DartNewExpression x) {
|
| +
|
| this.visit(x.getArgs());
|
|
|
| + if (x.isConst()) {
|
| + for (DartExpression arg : x.getArgs()) {
|
| + checkConstantExpression(arg);
|
| + }
|
| + }
|
| +
|
| Element element = x.getConstructor().accept(getContext().new Selector() {
|
| // Only 'new' expressions can have a type in a property access.
|
| @Override public Element visitTypeNode(DartTypeNode type) {
|
| @@ -1224,13 +1250,15 @@ public class Resolver {
|
| private void checkVariableStatement(DartVariableStatement node,
|
| DartVariable variable,
|
| boolean isImplicitlyInitialized) {
|
| - if (node.getModifiers().isFinal()) {
|
| + Modifiers modifiers = node.getModifiers();
|
| + if (modifiers.isFinal()) {
|
| if (!isImplicitlyInitialized && (variable.getValue() == null)) {
|
| resolutionError(variable.getName(), DartCompilerErrorCode.CONSTANTS_MUST_BE_INITIALIZED);
|
| } else if (isImplicitlyInitialized && (variable.getValue() != null)) {
|
| resolutionError(variable.getName(), DartCompilerErrorCode.CANNOT_BE_INITIALIZED);
|
| - } else {
|
| - checkConstantExpression(variable.getValue());
|
| + } else if (modifiers.isConstant() && variable.getValue() != null) {
|
| + resolveConstantExpression(variable.getValue());
|
| + node.setType(variable.getValue().getType());
|
| }
|
| }
|
| }
|
|
|