Do not throw when trying to resolve java outside project model
#KT-23444 Fixed #KT-22825 Fixed
This commit is contained in:
@@ -31,7 +31,7 @@ interface KotlinCacheService {
|
||||
}
|
||||
|
||||
fun getResolutionFacade(elements: List<KtElement>): 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?
|
||||
|
||||
+6
-2
@@ -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)
|
||||
}
|
||||
|
||||
+19
-11
@@ -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()]
|
||||
|
||||
+2
-5
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -529,7 +529,7 @@ fun KotlinChangeInfo.getAffectedCallables(): Collection<UsageInfo> = methodDescr
|
||||
|
||||
fun ChangeInfo.toJetChangeInfo(
|
||||
originalChangeSignatureDescriptor: KotlinMethodDescriptor,
|
||||
resolutionFacade: ResolutionFacade = method.javaResolutionFacade()
|
||||
resolutionFacade: ResolutionFacade
|
||||
): KotlinChangeInfo {
|
||||
val method = method as PsiMethod
|
||||
|
||||
|
||||
+3
-1
@@ -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<OriginalJavaMethodDescriptorWrapper>()
|
||||
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
|
||||
}
|
||||
|
||||
@@ -68,7 +68,11 @@ fun KotlinMemberInfo.getChildrenToAnalyze(): List<PsiElement> {
|
||||
}
|
||||
|
||||
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()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user