Allow enum entries in double colon LHS with LV = 1.0

#KT-16782 Fixed
This commit is contained in:
Alexander Udalov
2017-03-09 12:22:10 +03:00
parent 39055229a1
commit d21d362f0f
6 changed files with 57 additions and 2 deletions
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.codeFragmentUtil.suppressDiagnosticsInDebugMode
import org.jetbrains.kotlin.psi.psiUtil.getTopmostParentQualifiedExpressionForSelector
import org.jetbrains.kotlin.resolve.calls.CallExpressionElement
import org.jetbrains.kotlin.resolve.calls.unrollToLeftMostQualifiedExpression
import org.jetbrains.kotlin.resolve.descriptorUtil.module
@@ -119,7 +120,10 @@ class QualifiedExpressionResolver {
private fun checkNotEnumEntry(descriptor: DeclarationDescriptor?, trace: BindingTrace, expression: KtSimpleNameExpression) {
if (descriptor != null && DescriptorUtils.isEnumEntry(descriptor)) {
trace.report(Errors.ENUM_ENTRY_AS_TYPE.on(expression))
val qualifiedParent = expression.getTopmostParentQualifiedExpressionForSelector()
if (qualifiedParent == null || qualifiedParent.parent !is KtDoubleColonExpression) {
trace.report(Errors.ENUM_ENTRY_AS_TYPE.on(expression))
}
}
}
@@ -423,7 +423,9 @@ class DoubleColonExpressionResolver(
val classDescriptor = resultingDescriptor.classDescriptor
if (classDescriptor.companionObjectDescriptor != null) return null
if (DescriptorUtils.isObject(classDescriptor)) {
if (DescriptorUtils.isObject(classDescriptor) ||
(!languageVersionSettings.supportsFeature(LanguageFeature.BoundCallableReferences) &&
DescriptorUtils.isEnumEntry(classDescriptor))) {
return DoubleColonLHS.Expression(typeInfo, isObjectQualifier = true)
}
}
@@ -13,6 +13,11 @@ val fail2 = <!UNSUPPORTED_FEATURE!>O<!>::hashCode
val ok2 = O::Y
val ok3 = O.Y::hashCode
enum class E {
Entry
}
val ok4 = E.Entry::hashCode
fun hashCode() {}
val fail3 = <!UNSUPPORTED_FEATURE!>""<!>::hashCode
@@ -8,6 +8,7 @@ public val fail5: kotlin.reflect.KFunction0<kotlin.Int>
public val ok1: kotlin.reflect.KFunction1<C, kotlin.Int>
public val ok2: kotlin.reflect.KFunction0<O.Y>
public val ok3: kotlin.reflect.KFunction1<O.Y, kotlin.Int>
public val ok4: kotlin.reflect.KFunction1<E.Entry, kotlin.Int>
public fun hashCode(): kotlin.Unit
public final class C {
@@ -24,6 +25,25 @@ public final class C {
}
}
public final enum class E : kotlin.Enum<E> {
enum entry Entry
private constructor E()
public final override /*1*/ /*fake_override*/ val name: kotlin.String
public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int
protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any
public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: E): kotlin.Int
public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
protected/*protected and package*/ final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun finalize(): kotlin.Unit
public final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun getDeclaringClass(): java.lang.Class<E!>!
public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
// Static members
public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): E
public final /*synthesized*/ fun values(): kotlin.Array<E>
}
public object O {
private constructor O()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@@ -7,6 +7,10 @@ val ok2 = C.Companion::class
object O
val ok3 = O::class
enum class E {
Entry
}
val ok4 = E.Entry::class
val fail1 = <!UNSUPPORTED_FEATURE!>""<!>::class
val fail2 = <!NULLABLE_TYPE_IN_CLASS_LITERAL_LHS!>String?::class<!>
@@ -7,6 +7,7 @@ public val fail4: kotlin.reflect.KClass<out C.Companion>
public val ok1: kotlin.reflect.KClass<C>
public val ok2: kotlin.reflect.KClass<C.Companion>
public val ok3: kotlin.reflect.KClass<O>
public val ok4: kotlin.reflect.KClass<E.Entry>
public final class C {
public constructor C()
@@ -22,6 +23,25 @@ public final class C {
}
}
public final enum class E : kotlin.Enum<E> {
enum entry Entry
private constructor E()
public final override /*1*/ /*fake_override*/ val name: kotlin.String
public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int
protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any
public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: E): kotlin.Int
public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
protected/*protected and package*/ final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun finalize(): kotlin.Unit
public final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun getDeclaringClass(): java.lang.Class<E!>!
public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
// Static members
public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): E
public final /*synthesized*/ fun values(): kotlin.Array<E>
}
public object O {
private constructor O()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean