[LL FIR, Java] fix resolve contract violation from java symbol provider from permits

To create a smart psi type pointer, IJ Platform uses resolve
We cannot use resolve from JavaSymbolProvider,
as it may lead to resolve contract violation

^KT-59243 Fixed
This commit is contained in:
Dmitrii Gridin
2023-06-12 14:17:10 +02:00
committed by Space Team
parent 5af8b9e819
commit 7631e90f12
13 changed files with 117 additions and 9 deletions
@@ -69,7 +69,9 @@ class JavaClassImpl(psiClassSource: JavaElementPsiSource<PsiClass>) : JavaClassi
get() = JavaElementUtil.isSealed(this)
override val permittedTypes: Collection<JavaClassifierType>
get() = classifierTypes(psi.permitsListTypes, sourceFactory)
get() = psi.permitsListTypes.convertIndexed { index, _ ->
JavaClassifierTypeImpl(sourceFactory.createPermittedTypeSource(psiElementSource, index))
}
override val isRecord: Boolean
get() = psi.isRecord
@@ -26,6 +26,14 @@ abstract class JavaElementSourceFactory {
abstract fun <TYPE : PsiType> createExpressionTypeSource(psiExpressionSource: JavaElementPsiSource<out PsiExpression>): JavaElementTypeSource<TYPE>
/**
* @see com.intellij.psi.PsiClass.getPermitsListTypes
*/
abstract fun createPermittedTypeSource(
psiTypeParameterSource: JavaElementPsiSource<out PsiClass>,
permittedTypeIndex: Int,
): JavaElementTypeSource<PsiClassType>
companion object {
@JvmStatic
fun getInstance(project: Project): JavaElementSourceFactory {
@@ -63,6 +71,13 @@ class JavaFixedElementSourceFactory : JavaElementSourceFactory() {
return createTypeSource(psiTypeParameterSource.psi.superTypes[superTypeIndex])
}
override fun createPermittedTypeSource(
psiTypeParameterSource: JavaElementPsiSource<out PsiClass>,
permittedTypeIndex: Int
): JavaElementTypeSource<PsiClassType> {
return createTypeSource(psiTypeParameterSource.psi.permitsListTypes[permittedTypeIndex])
}
override fun <TYPE : PsiType> createExpressionTypeSource(psiExpressionSource: JavaElementPsiSource<out PsiExpression>): JavaElementTypeSource<TYPE> {
@Suppress("UNCHECKED_CAST")
return createTypeSource(psiExpressionSource.psi.type as TYPE)