diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliLightClassGenerationSupport.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliLightClassGenerationSupport.kt index da1874ca568..7be311fbb58 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliLightClassGenerationSupport.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliLightClassGenerationSupport.kt @@ -36,6 +36,7 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.load.java.components.JavaDeprecationSettings import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.deprecation.CoroutineCompatibilitySupport @@ -68,6 +69,8 @@ class CliLightClassGenerationSupport(private val traceHolder: CliTraceHolder) : override val isReleasedCoroutine get() = languageVersionSettings.supportsFeature(LanguageFeature.ReleaseCoroutines) + override fun possiblyHasAlias(file: KtFile, shortName: Name): Boolean = true + override fun getConstantEvaluator(expression: KtExpression): org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator = ResolveEvaluator(moduleDescriptor, languageVersionSettings, expression.project) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightSupport.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightSupport.kt index 12ebcbf18c8..7a6a4742494 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightSupport.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightSupport.kt @@ -20,7 +20,8 @@ interface KtUltraLightSupport { val typeMapper: KotlinTypeMapper val moduleDescriptor: ModuleDescriptor val isReleasedCoroutine: Boolean - fun hasAlias(file: KtFile, shortName: Name?): Boolean = false + fun possiblyHasAlias(file: KtFile, shortName: Name): Boolean + fun getConstantEvaluator(expression: KtExpression): ConstantExpressionEvaluator companion object { @@ -52,6 +53,9 @@ class UltraLightSupportViaService(private val ktElement: KtElement) : KtUltraLig override val isReleasedCoroutine: Boolean get() = serviceProvidedSupport.isReleasedCoroutine + override fun possiblyHasAlias(file: KtFile, shortName: Name): Boolean = + serviceProvidedSupport.possiblyHasAlias(file, shortName) + override fun getConstantEvaluator(expression: KtExpression): ConstantExpressionEvaluator = serviceProvidedSupport.getConstantEvaluator(expression) } diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightUtils.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightUtils.kt index e3f93c8d1ac..d8082c6520c 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightUtils.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightUtils.kt @@ -16,13 +16,9 @@ import com.intellij.psi.impl.compiled.ClsTypeElementImpl import com.intellij.psi.impl.compiled.SignatureParsing import com.intellij.psi.impl.compiled.StubBuildingVisitor import com.intellij.psi.impl.light.* -import com.intellij.psi.util.CachedValueProvider -import com.intellij.psi.util.CachedValuesManager -import com.intellij.psi.util.PsiModificationTracker import com.intellij.psi.util.TypeConversionUtil import com.intellij.util.BitUtil.isSet import com.intellij.util.IncorrectOperationException -import com.intellij.util.containers.ConcurrentFactoryMap import com.intellij.util.containers.ContainerUtil import org.jetbrains.kotlin.asJava.LightClassGenerationSupport import org.jetbrains.kotlin.asJava.UltraLightClassModifierExtension @@ -46,10 +42,8 @@ import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.load.kotlin.TypeMappingMode import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.annotations.JVM_STATIC_ANNOTATION_FQ_NAME @@ -66,7 +60,6 @@ import org.jetbrains.kotlin.types.replace import org.jetbrains.kotlin.types.typeUtil.supertypes import org.jetbrains.org.objectweb.asm.Opcodes import java.text.StringCharacterIterator -import java.util.concurrent.ConcurrentMap private interface TypeParametersSupport { fun parameters(declaration: D): List @@ -493,9 +486,14 @@ inline fun KtFile.safeIsScript() = runReadAction { this.isScript() } inline fun KtFile.safeScript() = runReadAction { this.script } internal fun KtUltraLightSupport.findAnnotation(owner: KtAnnotated, fqName: FqName): Pair? { - val candidates = owner.annotationEntries.filter { - it.shortName == fqName.shortName() || hasAlias(owner.containingKtFile, it.shortName) - } + + val candidates = owner.annotationEntries + .filter { + it.shortName?.let { name -> + name == fqName.shortName() || possiblyHasAlias(owner.containingKtFile, name) + } ?: false + } + for (entry in candidates) { val descriptor = entry.analyzeAnnotation() if (descriptor?.fqName == fqName) { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt index c046e24cdbf..868ee5c92f0 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt @@ -68,6 +68,17 @@ class IDELightClassGenerationSupport(private val project: Project) : LightClassG JvmCodegenUtil.getModuleName(moduleDescriptor) } + override fun possiblyHasAlias(file: KtFile, shortName: Name): Boolean = + allAliases(file)[shortName.asString()] == true + + private fun allAliases(file: KtFile): ConcurrentMap = CachedValuesManager.getCachedValue(file) { + val importAliases = file.importDirectives.mapNotNull { it.aliasName }.toSet() + val map = ConcurrentFactoryMap.createMap { s -> + s in importAliases || KotlinTypeAliasShortNameIndex.getInstance().get(s, file.project, file.resolveScope).isNotEmpty() + } + CachedValueProvider.Result.create>(map, PsiModificationTracker.MODIFICATION_COUNT) + } + @OptIn(FrontendInternals::class) override val deprecationResolver: DeprecationResolver get() = resolutionFacade.getFrontendService(DeprecationResolver::class.java) @@ -132,19 +143,6 @@ class IDELightClassGenerationSupport(private val project: Project) : LightClassG override fun getUltraLightClassSupport(element: KtElement): KtUltraLightSupport = KtUltraLightSupportImpl(element) - private fun KtFile.hasAlias(shortName: Name?): Boolean { - if (shortName == null) return false - return allAliases(this)[shortName.asString()] == true - } - - private fun allAliases(file: KtFile): ConcurrentMap = CachedValuesManager.getCachedValue(file) { - val importAliases = file.importDirectives.mapNotNull { it.aliasName }.toSet() - val map = ConcurrentFactoryMap.createMap { s -> - s in importAliases || KotlinTypeAliasShortNameIndex.getInstance().get(s, project, file.resolveScope).isNotEmpty() - } - CachedValueProvider.Result.create>(map, PsiModificationTracker.MODIFICATION_COUNT) - } - private val scopeFileComparator = JavaElementFinder.byClasspathComparator(GlobalSearchScope.allScope(project)) override fun createDataHolderForClass(classOrObject: KtClassOrObject, builder: LightClassBuilder): LightClassDataHolder.ForClass {