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
This commit is contained in:
Pavel V. Talanov
2015-10-30 17:16:26 +03:00
parent 226c2e3b5c
commit 9f5c0741bd
@@ -25,7 +25,6 @@ import org.jetbrains.kotlin.idea.KotlinLanguage
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtEnumEntry import org.jetbrains.kotlin.psi.KtEnumEntry
import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext
public interface KotlinLightField : PsiField, KotlinLightElement<KtDeclaration, PsiField> public interface KotlinLightField : PsiField, KotlinLightElement<KtDeclaration, PsiField>
@@ -96,7 +95,7 @@ sealed class KotlinLightFieldImpl(
override fun copy() = Factory.create(origin?.copy() as? KtDeclaration, delegate, containingClass) override fun copy() = Factory.create(origin?.copy() as? KtDeclaration, delegate, containingClass)
class KotlinLightEnumConstant( class KotlinLightEnumConstant(
origin: KtEnumEntry, origin: KtEnumEntry?,
enumConstant: PsiEnumConstant, enumConstant: PsiEnumConstant,
containingClass: KotlinLightClass, containingClass: KotlinLightClass,
private val initializingClass: PsiEnumConstantInitializer? private val initializingClass: PsiEnumConstantInitializer?
@@ -121,17 +120,18 @@ sealed class KotlinLightFieldImpl(
companion object Factory { companion object Factory {
fun create(origin: KtDeclaration?, delegate: PsiField, containingClass: KotlinLightClass): KotlinLightField { fun create(origin: KtDeclaration?, delegate: PsiField, containingClass: KotlinLightClass): KotlinLightField {
if (origin is KtEnumEntry) { when (delegate) {
assert(delegate is PsiEnumConstant) { "Field delegate should be an enum constant (${delegate.name}):\n${origin.getElementTextWithContext()}" } is PsiEnumConstant -> {
val enumConstant = delegate as PsiEnumConstant val kotlinEnumEntry = origin as? KtEnumEntry
val enumConstantFqName = FqName(containingClass.getFqName().asString() + "." + origin.name) val initializingClass = if (kotlinEnumEntry != null && kotlinEnumEntry.declarations.isNotEmpty()) {
val initializingClass = if (origin.declarations.isEmpty()) val enumConstantFqName = FqName(containingClass.getFqName().asString() + "." + kotlinEnumEntry.name)
null KotlinLightClassForEnumEntry(delegate.manager, enumConstantFqName, kotlinEnumEntry, delegate)
else }
KotlinLightClassForEnumEntry(delegate.manager, enumConstantFqName, origin, enumConstant) else null
return KotlinLightEnumConstant(origin, enumConstant, containingClass, initializingClass) return KotlinLightEnumConstant(kotlinEnumEntry, delegate, containingClass, initializingClass)
}
else -> return KotlinLightFieldForDeclaration(origin, delegate, containingClass)
} }
return KotlinLightFieldForDeclaration(origin, delegate, containingClass)
} }
} }
} }