From 9f5c0741bd46217a89c3cf4836dde9b62588a598 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Fri, 30 Oct 2015 17:16:26 +0300 Subject: [PATCH] KotlinLightField: create KotlinLightEnumConstant based on delegate psi, not whether could find original declaration This was not true for decompiled classes and led to enum entries from kotlin compiled files being unresolved in java --- .../kotlin/asJava/KotlinLightField.kt | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinLightField.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinLightField.kt index 94ff30c33f0..808092aa6df 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinLightField.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinLightField.kt @@ -25,7 +25,6 @@ import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtEnumEntry -import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext public interface KotlinLightField : PsiField, KotlinLightElement @@ -96,7 +95,7 @@ sealed class KotlinLightFieldImpl( override fun copy() = Factory.create(origin?.copy() as? KtDeclaration, delegate, containingClass) class KotlinLightEnumConstant( - origin: KtEnumEntry, + origin: KtEnumEntry?, enumConstant: PsiEnumConstant, containingClass: KotlinLightClass, private val initializingClass: PsiEnumConstantInitializer? @@ -121,17 +120,18 @@ sealed class KotlinLightFieldImpl( companion object Factory { fun create(origin: KtDeclaration?, delegate: PsiField, containingClass: KotlinLightClass): KotlinLightField { - if (origin is KtEnumEntry) { - assert(delegate is PsiEnumConstant) { "Field delegate should be an enum constant (${delegate.name}):\n${origin.getElementTextWithContext()}" } - val enumConstant = delegate as PsiEnumConstant - val enumConstantFqName = FqName(containingClass.getFqName().asString() + "." + origin.name) - val initializingClass = if (origin.declarations.isEmpty()) - null - else - KotlinLightClassForEnumEntry(delegate.manager, enumConstantFqName, origin, enumConstant) - return KotlinLightEnumConstant(origin, enumConstant, containingClass, initializingClass) + when (delegate) { + is PsiEnumConstant -> { + val kotlinEnumEntry = origin as? KtEnumEntry + val initializingClass = if (kotlinEnumEntry != null && kotlinEnumEntry.declarations.isNotEmpty()) { + val enumConstantFqName = FqName(containingClass.getFqName().asString() + "." + kotlinEnumEntry.name) + KotlinLightClassForEnumEntry(delegate.manager, enumConstantFqName, kotlinEnumEntry, delegate) + } + else null + return KotlinLightEnumConstant(kotlinEnumEntry, delegate, containingClass, initializingClass) + } + else -> return KotlinLightFieldForDeclaration(origin, delegate, containingClass) } - return KotlinLightFieldForDeclaration(origin, delegate, containingClass) } } }