Allow enum entries in double colon LHS with LV = 1.0
#KT-16782 Fixed
This commit is contained in:
@@ -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))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+3
-1
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
+5
@@ -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
|
||||
|
||||
+20
@@ -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
|
||||
|
||||
+4
@@ -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<!>
|
||||
|
||||
+20
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user