Chromium Code Reviews| 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..44c2be83a2294b81f58d44e70dc816dd83ac294c 100644 |
| --- a/compiler/java/com/google/dart/compiler/resolver/Resolver.java |
| +++ b/compiler/java/com/google/dart/compiler/resolver/Resolver.java |
| @@ -34,13 +34,13 @@ import com.google.dart.compiler.ast.DartInitializer; |
| import com.google.dart.compiler.ast.DartIntegerLiteral; |
| import com.google.dart.compiler.ast.DartInvocation; |
| import com.google.dart.compiler.ast.DartLabel; |
| -import com.google.dart.compiler.ast.DartLiteral; |
| import com.google.dart.compiler.ast.DartMapLiteral; |
| import com.google.dart.compiler.ast.DartMethodDefinition; |
| import com.google.dart.compiler.ast.DartMethodInvocation; |
| import com.google.dart.compiler.ast.DartNamedExpression; |
| import com.google.dart.compiler.ast.DartNewExpression; |
| import com.google.dart.compiler.ast.DartNode; |
| +import com.google.dart.compiler.ast.DartNodeTraverser; |
| import com.google.dart.compiler.ast.DartParameter; |
| import com.google.dart.compiler.ast.DartPropertyAccess; |
| import com.google.dart.compiler.ast.DartRedirectConstructorInvocation; |
| @@ -54,7 +54,6 @@ import com.google.dart.compiler.ast.DartSwitchStatement; |
| import com.google.dart.compiler.ast.DartThisExpression; |
| import com.google.dart.compiler.ast.DartTryStatement; |
| import com.google.dart.compiler.ast.DartTypeNode; |
| -import com.google.dart.compiler.ast.DartTypedLiteral; |
| import com.google.dart.compiler.ast.DartUnit; |
| import com.google.dart.compiler.ast.DartUnqualifiedInvocation; |
| import com.google.dart.compiler.ast.DartVariable; |
| @@ -338,20 +337,15 @@ 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. |
| - } |
| - |
| - private void checkConstantLiteral(DartExpression defaultExpr) { |
| - if ((!(defaultExpr instanceof DartLiteral)) |
| - || ((defaultExpr instanceof DartTypedLiteral) |
| - && (!((DartTypedLiteral) defaultExpr).isConst()))) { |
| - resolutionError(defaultExpr, DartCompilerErrorCode.EXPECTED_CONSTANT_LITERAL); |
| + private void checkConstantExpression(DartExpression expr) { |
| + if (expr != null) { |
| + DartNodeTraverser<Void> v = CompileTimeConstVisitor.create(typeProvider, context); |
| + expr.accept(v); |
| } |
| } |
| @@ -363,19 +357,23 @@ public class Resolver { |
| boolean isFinal = modifiers.isFinal(); |
| boolean isTopLevel = ElementKind.of(currentHolder).equals(ElementKind.LIBRARY); |
| + if (isTopLevel && isFinal) { |
| + modifiers.makeStatic(); |
|
ngeoffray
2011/10/17 10:59:38
This is weird. You should not change the modifiers
|
| + } |
| + |
| if (expression != null) { |
| - if (isStatic || isTopLevel) { |
| - checkConstantExpression(expression); |
| - } else { |
| - // TODO(5200401): Only allow constant literals for inline field initializers for now. |
| - checkConstantLiteral(expression); |
| - } |
| resolve(expression); |
| + 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 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 +852,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 +1229,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.isStatic() && modifiers.isFinal() && variable.getValue() != null) { |
| + resolveConstantExpression(variable.getValue()); |
| + node.setType(variable.getValue().getType()); |
| } |
| } |
| } |