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.name.Name
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.codeFragmentUtil.suppressDiagnosticsInDebugMode
|
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.CallExpressionElement
|
||||||
import org.jetbrains.kotlin.resolve.calls.unrollToLeftMostQualifiedExpression
|
import org.jetbrains.kotlin.resolve.calls.unrollToLeftMostQualifiedExpression
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.module
|
import org.jetbrains.kotlin.resolve.descriptorUtil.module
|
||||||
@@ -119,7 +120,10 @@ class QualifiedExpressionResolver {
|
|||||||
|
|
||||||
private fun checkNotEnumEntry(descriptor: DeclarationDescriptor?, trace: BindingTrace, expression: KtSimpleNameExpression) {
|
private fun checkNotEnumEntry(descriptor: DeclarationDescriptor?, trace: BindingTrace, expression: KtSimpleNameExpression) {
|
||||||
if (descriptor != null && DescriptorUtils.isEnumEntry(descriptor)) {
|
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
|
val classDescriptor = resultingDescriptor.classDescriptor
|
||||||
if (classDescriptor.companionObjectDescriptor != null) return null
|
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)
|
return DoubleColonLHS.Expression(typeInfo, isObjectQualifier = true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
@@ -13,6 +13,11 @@ val fail2 = <!UNSUPPORTED_FEATURE!>O<!>::hashCode
|
|||||||
val ok2 = O::Y
|
val ok2 = O::Y
|
||||||
val ok3 = O.Y::hashCode
|
val ok3 = O.Y::hashCode
|
||||||
|
|
||||||
|
enum class E {
|
||||||
|
Entry
|
||||||
|
}
|
||||||
|
val ok4 = E.Entry::hashCode
|
||||||
|
|
||||||
fun hashCode() {}
|
fun hashCode() {}
|
||||||
|
|
||||||
val fail3 = <!UNSUPPORTED_FEATURE!>""<!>::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 ok1: kotlin.reflect.KFunction1<C, kotlin.Int>
|
||||||
public val ok2: kotlin.reflect.KFunction0<O.Y>
|
public val ok2: kotlin.reflect.KFunction0<O.Y>
|
||||||
public val ok3: kotlin.reflect.KFunction1<O.Y, kotlin.Int>
|
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 fun hashCode(): kotlin.Unit
|
||||||
|
|
||||||
public final class C {
|
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 {
|
public object O {
|
||||||
private constructor O()
|
private constructor O()
|
||||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
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
|
object O
|
||||||
val ok3 = O::class
|
val ok3 = O::class
|
||||||
|
|
||||||
|
enum class E {
|
||||||
|
Entry
|
||||||
|
}
|
||||||
|
val ok4 = E.Entry::class
|
||||||
|
|
||||||
val fail1 = <!UNSUPPORTED_FEATURE!>""<!>::class
|
val fail1 = <!UNSUPPORTED_FEATURE!>""<!>::class
|
||||||
val fail2 = <!NULLABLE_TYPE_IN_CLASS_LITERAL_LHS!>String?::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 ok1: kotlin.reflect.KClass<C>
|
||||||
public val ok2: kotlin.reflect.KClass<C.Companion>
|
public val ok2: kotlin.reflect.KClass<C.Companion>
|
||||||
public val ok3: kotlin.reflect.KClass<O>
|
public val ok3: kotlin.reflect.KClass<O>
|
||||||
|
public val ok4: kotlin.reflect.KClass<E.Entry>
|
||||||
|
|
||||||
public final class C {
|
public final class C {
|
||||||
public constructor 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 {
|
public object O {
|
||||||
private constructor O()
|
private constructor O()
|
||||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
|||||||
Reference in New Issue
Block a user