diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/JavaResolveExtension.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/JavaResolveExtension.kt index 7dbf34328ed..0cddb5c4000 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/JavaResolveExtension.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/JavaResolveExtension.kt @@ -20,6 +20,7 @@ package org.jetbrains.kotlin.idea.caches.resolve import com.intellij.psi.* import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.idea.util.ProjectRootsUtil import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.load.java.sources.JavaSourceElement import org.jetbrains.kotlin.load.java.structure.* @@ -28,8 +29,10 @@ import org.jetbrains.kotlin.resolve.jvm.JavaDescriptorResolver import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform import org.jetbrains.kotlin.resolve.scopes.JetScope -private fun PsiElement.getJavaDescriptorResolver(): JavaDescriptorResolver { - @suppress("DEPRECATED_SYMBOL_WITH_MESSAGE") +private fun PsiElement.getJavaDescriptorResolver(): JavaDescriptorResolver? { + if (!ProjectRootsUtil.isInProjectOrLibraryClassFile(this)) return null + + @Suppress("DEPRECATED_SYMBOL_WITH_MESSAGE") return KotlinCacheService.getInstance(project).getProjectService(JvmPlatform, this.getModuleInfo(), javaClass()) } @@ -37,17 +40,17 @@ fun PsiMethod.getJavaMethodDescriptor(): FunctionDescriptor? { val method = getOriginalElement() as? PsiMethod ?: return null val resolver = method.getJavaDescriptorResolver() return when { - method.isConstructor() -> resolver.resolveConstructor(JavaConstructorImpl(method)) - else -> resolver.resolveMethod(JavaMethodImpl(method)) + method.isConstructor() -> resolver?.resolveConstructor(JavaConstructorImpl(method)) + else -> resolver?.resolveMethod(JavaMethodImpl(method)) } } fun PsiClass.getJavaClassDescriptor(): ClassDescriptor? { - return getJavaDescriptorResolver().resolveClass(JavaClassImpl(this)) + return getJavaDescriptorResolver()?.resolveClass(JavaClassImpl(this)) } fun PsiField.getJavaFieldDescriptor(): PropertyDescriptor? { - return getJavaDescriptorResolver().resolveField(JavaFieldImpl(this)) + return getJavaDescriptorResolver()?.resolveField(JavaFieldImpl(this)) } fun PsiMember.getJavaMemberDescriptor(): DeclarationDescriptor? { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/util/ProjectRootsUtil.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/util/ProjectRootsUtil.kt index 26a30519c74..fbde5fcad72 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/util/ProjectRootsUtil.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/util/ProjectRootsUtil.kt @@ -18,9 +18,7 @@ package org.jetbrains.kotlin.idea.util import com.intellij.openapi.roots.ProjectFileIndex import com.intellij.psi.PsiElement -import kotlin.platform.platformStatic import org.jetbrains.kotlin.idea.util.application.runReadAction -import org.jetbrains.kotlin.idea.configuration.JetModuleTypeManager import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.PsiDirectory @@ -28,7 +26,7 @@ import com.intellij.ide.highlighter.JavaClassFileType import org.jetbrains.kotlin.idea.caches.resolve.JsProjectDetector public object ProjectRootsUtil { - platformStatic + @JvmStatic public fun isInContent(project: Project, file: VirtualFile, includeProjectSource: Boolean, includeLibrarySource: Boolean, includeLibraryClasses: Boolean, fileIndex: ProjectFileIndex = ProjectFileIndex.SERVICE.getInstance(project), @@ -49,7 +47,7 @@ public object ProjectRootsUtil { || (includeLibrarySource && !isClassFile && fileIndex.isInLibrarySource(file)) } - platformStatic + @JvmStatic public fun isInContent( element: PsiElement, includeProjectSource: Boolean, @@ -67,27 +65,32 @@ public object ProjectRootsUtil { } } - platformStatic + @JvmStatic public fun isInProjectSource(element: PsiElement): Boolean { return isInContent(element, includeProjectSource = true, includeLibrarySource = false, includeLibraryClasses = false) } - platformStatic + @JvmStatic public fun isInProjectOrLibSource(element: PsiElement): Boolean { return isInContent(element, includeProjectSource = true, includeLibrarySource = true, includeLibraryClasses = false) } - platformStatic + @JvmStatic public fun isInProjectOrLibraryContent(element: PsiElement): Boolean { return isInContent(element, includeProjectSource = true, includeLibrarySource = true, includeLibraryClasses = true) } - platformStatic + @JvmStatic + public fun isInProjectOrLibraryClassFile(element: PsiElement): Boolean { + return isInContent(element, includeProjectSource = true, includeLibrarySource = false, includeLibraryClasses = true) + } + + @JvmStatic public fun isLibraryClassFile(project: Project, file: VirtualFile): Boolean { return isInContent(project, file, includeProjectSource = false, includeLibrarySource = false, includeLibraryClasses = true) } - platformStatic + @JvmStatic public fun isLibraryFile(project: Project, file: VirtualFile): Boolean { return isInContent(project, file, includeProjectSource = false, includeLibrarySource = true, includeLibraryClasses = true) }