diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/impl/JavaPropertyInitializerEvaluatorImpl.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/impl/JavaPropertyInitializerEvaluatorImpl.java index 3e82ac19226..b49747434bd 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/impl/JavaPropertyInitializerEvaluatorImpl.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/impl/JavaPropertyInitializerEvaluatorImpl.java @@ -18,6 +18,7 @@ package org.jetbrains.jet.lang.resolve.java.structure.impl; import com.intellij.psi.PsiExpression; import com.intellij.psi.impl.JavaConstantExpressionEvaluator; +import com.intellij.psi.util.PsiUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; @@ -43,4 +44,11 @@ public class JavaPropertyInitializerEvaluatorImpl implements JavaPropertyInitial } return null; } + + @Override + public boolean isNotNullCompileTimeConstant(@NotNull JavaField field) { + // PsiUtil.isCompileTimeConstant returns false for null-initialized fields, + // see com.intellij.psi.util.IsConstantExpressionVisitor.visitLiteralExpression() + return PsiUtil.isCompileTimeConstant(((JavaFieldImpl) field).getPsi()); + } } diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaMemberScope.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaMemberScope.kt index bf191d553fe..750a4887733 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaMemberScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaMemberScope.kt @@ -287,10 +287,18 @@ public abstract class LazyJavaMemberScope( private fun getPropertyType(field: JavaField): JetType { // Fields do not have their own generic parameters - val propertyType = c.typeResolver.transformJavaType(field.getType(), LazyJavaTypeAttributes(c, field, TypeUsage.MEMBER_SIGNATURE_INVARIANT)) - if (!PLATFORM_TYPES && field.isFinal() && field.isStatic()) { + val finalStatic = field.isFinal() && field.isStatic() + + // simple static constants should not have flexible types: + val allowFlexible = PLATFORM_TYPES && !(finalStatic && c.javaPropertyInitializerEvaluator.isNotNullCompileTimeConstant(field)) + val propertyType = c.typeResolver.transformJavaType( + field.getType(), + LazyJavaTypeAttributes(c, field, TypeUsage.MEMBER_SIGNATURE_INVARIANT, allowFlexible) + ) + if ((!allowFlexible || !PLATFORM_TYPES) && finalStatic) { return TypeUtils.makeNotNullable(propertyType) } + return propertyType } diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/structure/JavaPropertyInitializerEvaluator.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/structure/JavaPropertyInitializerEvaluator.java index 2b5ebd9ec30..8208633657f 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/structure/JavaPropertyInitializerEvaluator.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/structure/JavaPropertyInitializerEvaluator.java @@ -24,4 +24,6 @@ import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; public interface JavaPropertyInitializerEvaluator { @Nullable CompileTimeConstant getInitializerConstant(@NotNull JavaField field, @NotNull PropertyDescriptor descriptor); + + boolean isNotNullCompileTimeConstant(@NotNull JavaField field); }