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:
@@ -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)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user