diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirCombinedJavaSymbolProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirCombinedJavaSymbolProvider.kt index 6c8fe0c84d3..e6c6851f5c1 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirCombinedJavaSymbolProvider.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirCombinedJavaSymbolProvider.kt @@ -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 -> diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt index 5596f0d5a39..3d716554f52 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt @@ -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 { diff --git a/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/load/java/structure/impl/JavaAnnotationImpl.java b/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/load/java/structure/impl/JavaAnnotationImpl.java index 0ca7930677e..d4d0baf2670 100644 --- a/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/load/java/structure/impl/JavaAnnotationImpl.java +++ b/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/load/java/structure/impl/JavaAnnotationImpl.java @@ -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 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; diff --git a/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/structure/javaElements.kt b/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/structure/javaElements.kt index 5b308973a26..4d09bf287b0 100644 --- a/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/structure/javaElements.kt +++ b/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/structure/javaElements.kt @@ -54,6 +54,10 @@ interface JavaAnnotation : JavaElement { val isFreshlySupportedTypeUseAnnotation: Boolean get() = false + fun isResolvedTo(fqName: FqName) : Boolean { + return classId?.asSingleFqName() == fqName + } + fun resolve(): JavaClass? }