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

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-59133 fixed
This commit is contained in:
Ilya Kirillov
2023-06-07 14:56:56 +02:00
committed by Space Team
parent f590e88bdd
commit b8f15cbbb3
11 changed files with 114 additions and 1 deletions
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.load.java.structure.impl;
import com.intellij.psi.PsiAnnotationOwner;
import com.intellij.psi.PsiClassType;
import com.intellij.psi.PsiField;
import com.intellij.psi.PsiTypeParameter;
import org.jetbrains.annotations.NotNull;
@@ -25,10 +26,14 @@ import org.jetbrains.kotlin.load.java.structure.JavaClassifierType;
import org.jetbrains.kotlin.load.java.structure.JavaTypeParameter;
import org.jetbrains.kotlin.load.java.structure.impl.source.JavaElementPsiSource;
import org.jetbrains.kotlin.load.java.structure.impl.source.JavaElementSourceFactory;
import org.jetbrains.kotlin.load.java.structure.impl.source.JavaElementTypeSource;
import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.name.SpecialNames;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import static org.jetbrains.kotlin.load.java.structure.impl.JavaElementCollectionFromPsiArrayUtil.classifierTypes;
@@ -51,7 +56,16 @@ public class JavaTypeParameterImpl extends JavaClassifierImpl<PsiTypeParameter>
@Override
@NotNull
public Collection<JavaClassifierType> getUpperBounds() {
return classifierTypes(getPsi().getExtendsList().getReferencedTypes(), getSourceFactory());
PsiClassType[] referencedTypes = getPsi().getExtendsList().getReferencedTypes();
if (referencedTypes.length == 0) return Collections.emptyList();
Collection<JavaClassifierType> result = new ArrayList<>(referencedTypes.length);
JavaElementSourceFactory sourceFactory = getSourceFactory();
for (int boundIndex = 0; boundIndex < referencedTypes.length; boundIndex++) {
JavaElementTypeSource<PsiClassType> source =
sourceFactory.createTypeParameterUpperBoundTypeSource(psiElementSource, boundIndex);
result.add(new JavaClassifierTypeImpl(source));
}
return result;
}
@Nullable
@@ -14,6 +14,11 @@ abstract class JavaElementSourceFactory {
abstract fun <TYPE : PsiType> createVariableReturnTypeSource(psiVariableSource: JavaElementPsiSource<out PsiVariable>): JavaElementTypeSource<TYPE>
abstract fun <TYPE : PsiType> createMethodReturnTypeSource(psiMethodSource: JavaElementPsiSource<out PsiMethod>): JavaElementTypeSource<TYPE>
abstract fun <TYPE : PsiType> createTypeParameterUpperBoundTypeSource(
psiTypeParameterSource: JavaElementPsiSource<out PsiTypeParameter>,
boundIndex: Int,
): JavaElementTypeSource<TYPE>
abstract fun <TYPE : PsiType> createExpressionTypeSource(psiExpressionSource: JavaElementPsiSource<out PsiExpression>): JavaElementTypeSource<TYPE>
companion object {
@@ -38,6 +43,14 @@ class JavaFixedElementSourceFactory : JavaElementSourceFactory() {
return createTypeSource(psiVariableSource.psi.type as TYPE)
}
override fun <TYPE : PsiType> createTypeParameterUpperBoundTypeSource(
psiTypeParameterSource: JavaElementPsiSource<out PsiTypeParameter>,
boundIndex: Int
): JavaElementTypeSource<TYPE> {
@Suppress("UNCHECKED_CAST")
return createTypeSource(psiTypeParameterSource.psi.bounds[boundIndex] as TYPE)
}
override fun <TYPE : PsiType> createExpressionTypeSource(psiExpressionSource: JavaElementPsiSource<out PsiExpression>): JavaElementTypeSource<TYPE> {
@Suppress("UNCHECKED_CAST")