Do not try to resolve java elements outside of project roots
#EA-69067 Fixed #EA-64283 Fixed
This commit is contained in:
+9
-6
@@ -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<JavaDescriptorResolver>())
|
||||
}
|
||||
|
||||
@@ -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? {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user