[LL] don't include kotlin classes in combined java provider

do not resolve annotations when short name doesn't match
This commit is contained in:
Anna Kozlova
2023-02-10 23:00:31 +01:00
committed by teamcity
parent 6ba4e37696
commit d491fd2f70
4 changed files with 17 additions and 1 deletions
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.load.java.JavaClassFinder
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
import org.jetbrains.kotlin.load.java.createJavaClassFinder
import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl
import org.jetbrains.kotlin.name.ClassId
@@ -52,6 +53,7 @@ internal class LLFirCombinedJavaSymbolProvider private constructor(
private fun computeClassLikeSymbolByClassId(classId: ClassId): FirRegularClassSymbol? {
val javaClasses = javaClassFinder.findClasses(classId)
.filterNot { javaClass -> javaClass.annotations.any { it.isResolvedTo(JvmAnnotationNames.METADATA_FQ_NAME) } }
if (javaClasses.isEmpty()) return null
val (javaClass, provider) = selectFirstElementInClasspathOrder(javaClasses) { javaClass ->
@@ -53,7 +53,7 @@ val JavaClass.classKind: ClassKind
}
fun JavaClass.hasMetadataAnnotation(): Boolean =
annotations.any { it.classId?.asSingleFqName() == JvmAnnotationNames.METADATA_FQ_NAME }
annotations.any { it.isResolvedTo(JvmAnnotationNames.METADATA_FQ_NAME) }
internal fun Any?.createConstantOrError(session: FirSession): FirExpression {
return createConstantIfAny(session) ?: buildErrorExpression {
@@ -31,6 +31,7 @@ import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.name.Name;
import java.util.Collection;
import java.util.Objects;
import static org.jetbrains.kotlin.load.java.structure.impl.JavaElementCollectionFromPsiArrayUtil.namedAnnotationArguments;
@@ -95,6 +96,15 @@ public class JavaAnnotationImpl extends JavaElementImpl<PsiAnnotation> implement
return externalAnnotationManager.isExternalAnnotation(psi);
}
@Override
public boolean isResolvedTo(@NotNull FqName fqName) {
PsiJavaCodeReferenceElement referenceElement = getPsi().getNameReferenceElement();
if (referenceElement == null || !Objects.equals(referenceElement.getReferenceName(), fqName.shortNameOrSpecial().asString())) {
return false;
}
return getPsi().hasQualifiedName(fqName.asString());
}
@Override
public boolean isFreshlySupportedTypeUseAnnotation() {
return false;
@@ -54,6 +54,10 @@ interface JavaAnnotation : JavaElement {
val isFreshlySupportedTypeUseAnnotation: Boolean
get() = false
fun isResolvedTo(fqName: FqName) : Boolean {
return classId?.asSingleFqName() == fqName
}
fun resolve(): JavaClass?
}