[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
@@ -48,7 +48,6 @@ internal class JavaElementDelegatingExpressionTypeSourceWithSmartPointer<TYPE :
}
}
internal class JavaElementDelegatingTypeParameterBoundTypeSourceWithSmartPointer<TYPE : PsiType>(
override val psiPointer: SmartPsiElementPointer<out PsiTypeParameter>,
private val boundIndex: Int,
@@ -68,3 +67,11 @@ internal class JavaElementDelegatingSuperTypeSourceWithSmartPointer(
) : JavaElementDelegatingTypeSourceWithSmartPointer<PsiClass, PsiClassType>() {
override fun getType(psi: PsiClass): PsiClassType = psi.superTypes[superTypeIndex]
}
internal class JavaElementDelegatingPermittedTypeSourceWithSmartPointer(
override val psiPointer: SmartPsiElementPointer<out PsiClass>,
private val permittedTypeIndex: Int,
override val factory: JavaElementSourceFactory,
) : JavaElementDelegatingTypeSourceWithSmartPointer<PsiClass, PsiClassType>() {
override fun getType(psi: PsiClass): PsiClassType = psi.permitsListTypes[permittedTypeIndex]
}
@@ -61,4 +61,16 @@ class JavaElementSourceWithSmartPointerFactory(project: Project) : JavaElementSo
require(psiExpressionSource is JavaElementPsiSourceWithSmartPointer)
return JavaElementDelegatingExpressionTypeSourceWithSmartPointer(psiExpressionSource.pointer, psiExpressionSource.factory)
}
override fun createPermittedTypeSource(
psiTypeParameterSource: JavaElementPsiSource<out PsiClass>,
permittedTypeIndex: Int
): JavaElementTypeSource<PsiClassType> {
require(psiTypeParameterSource is JavaElementPsiSourceWithSmartPointer)
return JavaElementDelegatingPermittedTypeSourceWithSmartPointer(
psiTypeParameterSource.pointer,
permittedTypeIndex,
psiTypeParameterSource.factory,
)
}
}