diff --git a/idea/ide-common/src/org/jetbrains/kotlin/caches/resolve/KotlinCacheService.kt b/idea/ide-common/src/org/jetbrains/kotlin/caches/resolve/KotlinCacheService.kt index d47377a7c55..adbd7e2414d 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/caches/resolve/KotlinCacheService.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/caches/resolve/KotlinCacheService.kt @@ -31,7 +31,7 @@ interface KotlinCacheService { } fun getResolutionFacade(elements: List): ResolutionFacade - fun getResolutionFacadeByFile(file: PsiFile, platform: TargetPlatform): ResolutionFacade + fun getResolutionFacadeByFile(file: PsiFile, platform: TargetPlatform): ResolutionFacade? fun getSuppressionCache(): KotlinSuppressCache fun getResolutionFacadeByModuleInfo(moduleInfo: ModuleInfo, platform: TargetPlatform): ResolutionFacade? diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt index 95932a008ba..79c16e2feb0 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt @@ -395,9 +395,13 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService { } } - override fun getResolutionFacadeByFile(file: PsiFile, platform: TargetPlatform): ResolutionFacade { + override fun getResolutionFacadeByFile(file: PsiFile, platform: TargetPlatform): ResolutionFacade? { + if (!ProjectRootsUtil.isInProjectOrLibraryContent(file)) { + return null + } + assert(file !is PsiCodeFragment) - assert(ProjectRootsUtil.isInProjectOrLibraryContent(file)) + val moduleInfo = file.getModuleInfo() return getResolutionFacadeByModuleInfo(moduleInfo, platform) } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/util/JavaResolveExtension.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/util/JavaResolveExtension.kt index ee424038ff0..ecec8e87fe8 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/util/JavaResolveExtension.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/util/JavaResolveExtension.kt @@ -37,8 +37,9 @@ import org.jetbrains.kotlin.resolve.jvm.JavaDescriptorResolver import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform import org.jetbrains.kotlin.resolve.scopes.MemberScope -@JvmOverloads -fun PsiMethod.getJavaMethodDescriptor(resolutionFacade: ResolutionFacade = javaResolutionFacade()): FunctionDescriptor? { +fun PsiMethod.getJavaMethodDescriptor(): FunctionDescriptor? = javaResolutionFacade()?.let { getJavaMethodDescriptor(it) } + +private fun PsiMethod.getJavaMethodDescriptor(resolutionFacade: ResolutionFacade): FunctionDescriptor? { val method = originalElement as? PsiMethod ?: return null if (method.containingClass == null || !Name.isValidIdentifier(method.name)) return null val resolver = method.getJavaDescriptorResolver(resolutionFacade) @@ -48,20 +49,19 @@ fun PsiMethod.getJavaMethodDescriptor(resolutionFacade: ResolutionFacade = javaR } } -@JvmOverloads -fun PsiClass.getJavaClassDescriptor(resolutionFacade: ResolutionFacade = javaResolutionFacade()): ClassDescriptor? { +fun PsiClass.getJavaClassDescriptor() = javaResolutionFacade()?.let { getJavaClassDescriptor(it) } + +fun PsiClass.getJavaClassDescriptor(resolutionFacade: ResolutionFacade): ClassDescriptor? { val psiClass = originalElement as? PsiClass ?: return null return psiClass.getJavaDescriptorResolver(resolutionFacade)?.resolveClass(JavaClassImpl(psiClass)) } -@JvmOverloads -fun PsiField.getJavaFieldDescriptor(resolutionFacade: ResolutionFacade = javaResolutionFacade()): PropertyDescriptor? { +private fun PsiField.getJavaFieldDescriptor(resolutionFacade: ResolutionFacade): PropertyDescriptor? { val field = originalElement as? PsiField ?: return null return field.getJavaDescriptorResolver(resolutionFacade)?.resolveField(JavaFieldImpl(field)) } -@JvmOverloads -fun PsiMember.getJavaMemberDescriptor(resolutionFacade: ResolutionFacade = javaResolutionFacade()): DeclarationDescriptor? { +fun PsiMember.getJavaMemberDescriptor(resolutionFacade: ResolutionFacade): DeclarationDescriptor? { return when (this) { is PsiClass -> getJavaClassDescriptor(resolutionFacade) is PsiMethod -> getJavaMethodDescriptor(resolutionFacade) @@ -70,8 +70,12 @@ fun PsiMember.getJavaMemberDescriptor(resolutionFacade: ResolutionFacade = javaR } } -@JvmOverloads -fun PsiMember.getJavaOrKotlinMemberDescriptor(resolutionFacade: ResolutionFacade = javaResolutionFacade()): DeclarationDescriptor? { +fun PsiMember.getJavaMemberDescriptor(): DeclarationDescriptor? = javaResolutionFacade()?.let { getJavaMemberDescriptor(it) } + +fun PsiMember.getJavaOrKotlinMemberDescriptor(): DeclarationDescriptor? = + javaResolutionFacade()?.let { getJavaOrKotlinMemberDescriptor(it) } + +fun PsiMember.getJavaOrKotlinMemberDescriptor(resolutionFacade: ResolutionFacade): DeclarationDescriptor? { val callable = unwrapped return when (callable) { is PsiMember -> getJavaMemberDescriptor(resolutionFacade) @@ -83,7 +87,11 @@ fun PsiMember.getJavaOrKotlinMemberDescriptor(resolutionFacade: ResolutionFacade } } -fun PsiParameter.getParameterDescriptor(resolutionFacade: ResolutionFacade = javaResolutionFacade()): ValueParameterDescriptor? { +fun PsiParameter.getParameterDescriptor(): ValueParameterDescriptor? = javaResolutionFacade()?.let { + getParameterDescriptor(it) +} + +fun PsiParameter.getParameterDescriptor(resolutionFacade: ResolutionFacade): ValueParameterDescriptor? { val method = declarationScope as? PsiMethod ?: return null val methodDescriptor = method.getJavaMethodDescriptor(resolutionFacade) ?: return null return methodDescriptor.valueParameters[parameterIndex()] diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/ExpressionsOfTypeProcessor.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/ExpressionsOfTypeProcessor.kt index a6da89d2c28..365e86f41a5 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/ExpressionsOfTypeProcessor.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/ExpressionsOfTypeProcessor.kt @@ -35,7 +35,6 @@ import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.KtNodeTypes import org.jetbrains.kotlin.asJava.classes.KtLightClass import org.jetbrains.kotlin.asJava.toLightClass -import org.jetbrains.kotlin.caches.resolve.KotlinCacheService import org.jetbrains.kotlin.compatibility.ExecutorProcessor import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.diagnostics.PsiDiagnosticUtils @@ -43,7 +42,7 @@ import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny -import org.jetbrains.kotlin.idea.caches.resolve.util.resolveToDescriptor +import org.jetbrains.kotlin.idea.caches.resolve.util.getJavaMemberDescriptor import org.jetbrains.kotlin.idea.refactoring.fqName.getKotlinFqName import org.jetbrains.kotlin.idea.references.KtDestructuringDeclarationReference import org.jetbrains.kotlin.idea.search.excludeFileTypes @@ -58,7 +57,6 @@ import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor import org.jetbrains.kotlin.load.java.sam.SingleAbstractMethodUtils import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.* -import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.types.KotlinType import java.util.* @@ -761,8 +759,7 @@ class ExpressionsOfTypeProcessor( if (psiClass != null) { testLog { "Resolved java class to descriptor: ${psiClass.qualifiedName}" } - val resolutionFacade = KotlinCacheService.getInstance(project).getResolutionFacadeByFile(psiClass.containingFile, JvmPlatform) - val classDescriptor = psiClass.resolveToDescriptor(resolutionFacade) as? JavaClassDescriptor + val classDescriptor = psiClass.getJavaMemberDescriptor() as? JavaClassDescriptor if (classDescriptor != null && SingleAbstractMethodUtils.getSingleAbstractMethodOrNull(classDescriptor) != null) { addSamInterfaceToProcess(psiClass) return true diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/KotlinIndicesHelper.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/KotlinIndicesHelper.kt index db0f294bd71..bbcb61596d3 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/KotlinIndicesHelper.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/KotlinIndicesHelper.kt @@ -26,10 +26,10 @@ import com.intellij.util.indexing.IdFilter import org.jetbrains.kotlin.asJava.elements.KtLightElement import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.caches.KotlinShortNamesCache -import org.jetbrains.kotlin.idea.caches.resolve.* -import org.jetbrains.kotlin.idea.caches.resolve.util.getJavaFieldDescriptor +import org.jetbrains.kotlin.idea.caches.resolve.resolveImportReference +import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny +import org.jetbrains.kotlin.idea.caches.resolve.unsafeResolveToDescriptor import org.jetbrains.kotlin.idea.caches.resolve.util.getJavaMemberDescriptor -import org.jetbrains.kotlin.idea.caches.resolve.util.getJavaMethodDescriptor import org.jetbrains.kotlin.idea.caches.resolve.util.resolveToDescriptor import org.jetbrains.kotlin.idea.core.extension.KotlinIndicesHelperExtension import org.jetbrains.kotlin.idea.resolve.ResolutionFacade @@ -441,7 +441,7 @@ class KotlinIndicesHelper( if (!method.hasModifierProperty(PsiModifier.STATIC)) continue if (filterOutPrivate && method.hasModifierProperty(PsiModifier.PRIVATE)) continue if (method.containingClass?.parent !is PsiFile) continue // only top-level classes - val descriptor = method.getJavaMethodDescriptor(resolutionFacade) ?: continue + val descriptor = method.getJavaMemberDescriptor(resolutionFacade) ?: continue val container = descriptor.containingDeclaration as? ClassDescriptor ?: continue if (descriptorKindFilter.accepts(descriptor) && descriptorFilter(descriptor)) { processor(descriptor) @@ -464,7 +464,7 @@ class KotlinIndicesHelper( for (field in shortNamesCache.getFieldsByName(name, scopeWithoutKotlin).filterNot { it is KtLightElement<*, *> }) { if (!field.hasModifierProperty(PsiModifier.STATIC)) continue if (filterOutPrivate && field.hasModifierProperty(PsiModifier.PRIVATE)) continue - val descriptor = field.getJavaFieldDescriptor() ?: continue + val descriptor = field.getJavaMemberDescriptor() ?: continue if (descriptorKindFilter.accepts(descriptor) && descriptorFilter(descriptor)) { processor(descriptor) } diff --git a/idea/src/org/jetbrains/kotlin/idea/conversion/copy/PlainTextPasteImportResolver.kt b/idea/src/org/jetbrains/kotlin/idea/conversion/copy/PlainTextPasteImportResolver.kt index 2ddc5cc34d8..4d134c2df26 100644 --- a/idea/src/org/jetbrains/kotlin/idea/conversion/copy/PlainTextPasteImportResolver.kt +++ b/idea/src/org/jetbrains/kotlin/idea/conversion/copy/PlainTextPasteImportResolver.kt @@ -19,12 +19,12 @@ package org.jetbrains.kotlin.idea.conversion.copy import com.intellij.psi.* import com.intellij.psi.search.PsiShortNamesCache import com.intellij.psi.util.PsiTreeUtil -import org.jetbrains.kotlin.caches.resolve.KotlinCacheService +import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility import org.jetbrains.kotlin.idea.caches.project.getNullableModuleInfo -import org.jetbrains.kotlin.idea.caches.resolve.* +import org.jetbrains.kotlin.idea.caches.resolve.analyzeWithContent +import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.caches.resolve.util.getJavaMemberDescriptor -import org.jetbrains.kotlin.idea.caches.resolve.util.resolveToDescriptor import org.jetbrains.kotlin.idea.core.isVisible import org.jetbrains.kotlin.idea.imports.canBeReferencedViaImport import org.jetbrains.kotlin.idea.references.mainReference @@ -35,7 +35,6 @@ import org.jetbrains.kotlin.psi.KtDotQualifiedExpression import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtImportDirective import org.jetbrains.kotlin.psi.psiUtil.referenceExpression -import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform import java.util.* @@ -128,10 +127,7 @@ class PlainTextPasteImportResolver(val dataForConversion: DataForConversion, val .mapNotNull { psiClass -> val containingFile = psiClass.containingFile if (ProjectRootsUtil.isInProjectOrLibraryContent(containingFile)) { - val resolutionFacade = KotlinCacheService.getInstance(project).getResolutionFacadeByFile( - containingFile, JvmPlatform - ) - psiClass to psiClass.resolveToDescriptor(resolutionFacade) + psiClass to psiClass.getJavaMemberDescriptor() as? ClassDescriptor } else { null diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeInfo.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeInfo.kt index e47bc3c4e60..2421043ca70 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeInfo.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeInfo.kt @@ -529,7 +529,7 @@ fun KotlinChangeInfo.getAffectedCallables(): Collection = methodDescr fun ChangeInfo.toJetChangeInfo( originalChangeSignatureDescriptor: KotlinMethodDescriptor, - resolutionFacade: ResolutionFacade = method.javaResolutionFacade() + resolutionFacade: ResolutionFacade ): KotlinChangeInfo { val method = method as PsiMethod diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureUsageProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureUsageProcessor.kt index 9face985a33..1f0484e256d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureUsageProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureUsageProcessor.kt @@ -46,6 +46,7 @@ import org.jetbrains.kotlin.idea.caches.project.moduleInfo import org.jetbrains.kotlin.idea.caches.resolve.* import org.jetbrains.kotlin.idea.caches.resolve.util.getJavaMethodDescriptor import org.jetbrains.kotlin.idea.caches.resolve.util.getJavaOrKotlinMemberDescriptor +import org.jetbrains.kotlin.idea.caches.resolve.util.javaResolutionFacade import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde import org.jetbrains.kotlin.idea.core.compareDescriptors import org.jetbrains.kotlin.idea.refactoring.* @@ -909,7 +910,8 @@ class KotlinChangeSignatureUsageProcessor : ChangeSignatureUsageProcessor { val descriptorWrapper = usages.firstIsInstanceOrNull() val methodDescriptor = (descriptorWrapper?.originalJavaMethodDescriptor) ?: return true - val javaMethodChangeInfo = changeInfo.toJetChangeInfo(methodDescriptor) + val resolutionFacade = (methodDescriptor.method as? PsiMethod)?.javaResolutionFacade() ?: return false + val javaMethodChangeInfo = changeInfo.toJetChangeInfo(methodDescriptor, resolutionFacade) for (info in usages) { (info as? JavaMethodKotlinUsageWithDelegate<*>)?.javaMethodChangeInfo = javaMethodChangeInfo } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/memberInfo/memberInfoUtils.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/memberInfo/memberInfoUtils.kt index eeb36a1e80c..2301263c03a 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/memberInfo/memberInfoUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/memberInfo/memberInfoUtils.kt @@ -68,7 +68,11 @@ fun KotlinMemberInfo.getChildrenToAnalyze(): List { } internal fun KtNamedDeclaration.resolveToDescriptorWrapperAware(resolutionFacade: ResolutionFacade? = null): DeclarationDescriptor { - if (this is KtPsiClassWrapper) return psiClass.getJavaClassDescriptor(resolutionFacade ?: psiClass.javaResolutionFacade())!! + if (this is KtPsiClassWrapper) { + (resolutionFacade ?: psiClass.javaResolutionFacade()) + ?.let { psiClass.getJavaClassDescriptor(it) } + ?.let { return it } + } return resolutionFacade?.resolveToDescriptor(this) ?: unsafeResolveToDescriptor() }