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 com.intellij.psi.*
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
|
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil
|
||||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||||
import org.jetbrains.kotlin.load.java.sources.JavaSourceElement
|
import org.jetbrains.kotlin.load.java.sources.JavaSourceElement
|
||||||
import org.jetbrains.kotlin.load.java.structure.*
|
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.jvm.platform.JvmPlatform
|
||||||
import org.jetbrains.kotlin.resolve.scopes.JetScope
|
import org.jetbrains.kotlin.resolve.scopes.JetScope
|
||||||
|
|
||||||
private fun PsiElement.getJavaDescriptorResolver(): JavaDescriptorResolver {
|
private fun PsiElement.getJavaDescriptorResolver(): JavaDescriptorResolver? {
|
||||||
@suppress("DEPRECATED_SYMBOL_WITH_MESSAGE")
|
if (!ProjectRootsUtil.isInProjectOrLibraryClassFile(this)) return null
|
||||||
|
|
||||||
|
@Suppress("DEPRECATED_SYMBOL_WITH_MESSAGE")
|
||||||
return KotlinCacheService.getInstance(project).getProjectService(JvmPlatform, this.getModuleInfo(), javaClass<JavaDescriptorResolver>())
|
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 method = getOriginalElement() as? PsiMethod ?: return null
|
||||||
val resolver = method.getJavaDescriptorResolver()
|
val resolver = method.getJavaDescriptorResolver()
|
||||||
return when {
|
return when {
|
||||||
method.isConstructor() -> resolver.resolveConstructor(JavaConstructorImpl(method))
|
method.isConstructor() -> resolver?.resolveConstructor(JavaConstructorImpl(method))
|
||||||
else -> resolver.resolveMethod(JavaMethodImpl(method))
|
else -> resolver?.resolveMethod(JavaMethodImpl(method))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun PsiClass.getJavaClassDescriptor(): ClassDescriptor? {
|
fun PsiClass.getJavaClassDescriptor(): ClassDescriptor? {
|
||||||
return getJavaDescriptorResolver().resolveClass(JavaClassImpl(this))
|
return getJavaDescriptorResolver()?.resolveClass(JavaClassImpl(this))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun PsiField.getJavaFieldDescriptor(): PropertyDescriptor? {
|
fun PsiField.getJavaFieldDescriptor(): PropertyDescriptor? {
|
||||||
return getJavaDescriptorResolver().resolveField(JavaFieldImpl(this))
|
return getJavaDescriptorResolver()?.resolveField(JavaFieldImpl(this))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun PsiMember.getJavaMemberDescriptor(): DeclarationDescriptor? {
|
fun PsiMember.getJavaMemberDescriptor(): DeclarationDescriptor? {
|
||||||
|
|||||||
@@ -18,9 +18,7 @@ package org.jetbrains.kotlin.idea.util
|
|||||||
|
|
||||||
import com.intellij.openapi.roots.ProjectFileIndex
|
import com.intellij.openapi.roots.ProjectFileIndex
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import kotlin.platform.platformStatic
|
|
||||||
import org.jetbrains.kotlin.idea.util.application.runReadAction
|
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.project.Project
|
||||||
import com.intellij.openapi.vfs.VirtualFile
|
import com.intellij.openapi.vfs.VirtualFile
|
||||||
import com.intellij.psi.PsiDirectory
|
import com.intellij.psi.PsiDirectory
|
||||||
@@ -28,7 +26,7 @@ import com.intellij.ide.highlighter.JavaClassFileType
|
|||||||
import org.jetbrains.kotlin.idea.caches.resolve.JsProjectDetector
|
import org.jetbrains.kotlin.idea.caches.resolve.JsProjectDetector
|
||||||
|
|
||||||
public object ProjectRootsUtil {
|
public object ProjectRootsUtil {
|
||||||
platformStatic
|
@JvmStatic
|
||||||
public fun isInContent(project: Project, file: VirtualFile, includeProjectSource: Boolean,
|
public fun isInContent(project: Project, file: VirtualFile, includeProjectSource: Boolean,
|
||||||
includeLibrarySource: Boolean, includeLibraryClasses: Boolean,
|
includeLibrarySource: Boolean, includeLibraryClasses: Boolean,
|
||||||
fileIndex: ProjectFileIndex = ProjectFileIndex.SERVICE.getInstance(project),
|
fileIndex: ProjectFileIndex = ProjectFileIndex.SERVICE.getInstance(project),
|
||||||
@@ -49,7 +47,7 @@ public object ProjectRootsUtil {
|
|||||||
|| (includeLibrarySource && !isClassFile && fileIndex.isInLibrarySource(file))
|
|| (includeLibrarySource && !isClassFile && fileIndex.isInLibrarySource(file))
|
||||||
}
|
}
|
||||||
|
|
||||||
platformStatic
|
@JvmStatic
|
||||||
public fun isInContent(
|
public fun isInContent(
|
||||||
element: PsiElement,
|
element: PsiElement,
|
||||||
includeProjectSource: Boolean,
|
includeProjectSource: Boolean,
|
||||||
@@ -67,27 +65,32 @@ public object ProjectRootsUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
platformStatic
|
@JvmStatic
|
||||||
public fun isInProjectSource(element: PsiElement): Boolean {
|
public fun isInProjectSource(element: PsiElement): Boolean {
|
||||||
return isInContent(element, includeProjectSource = true, includeLibrarySource = false, includeLibraryClasses = false)
|
return isInContent(element, includeProjectSource = true, includeLibrarySource = false, includeLibraryClasses = false)
|
||||||
}
|
}
|
||||||
|
|
||||||
platformStatic
|
@JvmStatic
|
||||||
public fun isInProjectOrLibSource(element: PsiElement): Boolean {
|
public fun isInProjectOrLibSource(element: PsiElement): Boolean {
|
||||||
return isInContent(element, includeProjectSource = true, includeLibrarySource = true, includeLibraryClasses = false)
|
return isInContent(element, includeProjectSource = true, includeLibrarySource = true, includeLibraryClasses = false)
|
||||||
}
|
}
|
||||||
|
|
||||||
platformStatic
|
@JvmStatic
|
||||||
public fun isInProjectOrLibraryContent(element: PsiElement): Boolean {
|
public fun isInProjectOrLibraryContent(element: PsiElement): Boolean {
|
||||||
return isInContent(element, includeProjectSource = true, includeLibrarySource = true, includeLibraryClasses = true)
|
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 {
|
public fun isLibraryClassFile(project: Project, file: VirtualFile): Boolean {
|
||||||
return isInContent(project, file, includeProjectSource = false, includeLibrarySource = false, includeLibraryClasses = true)
|
return isInContent(project, file, includeProjectSource = false, includeLibrarySource = false, includeLibraryClasses = true)
|
||||||
}
|
}
|
||||||
|
|
||||||
platformStatic
|
@JvmStatic
|
||||||
public fun isLibraryFile(project: Project, file: VirtualFile): Boolean {
|
public fun isLibraryFile(project: Project, file: VirtualFile): Boolean {
|
||||||
return isInContent(project, file, includeProjectSource = false, includeLibrarySource = true, includeLibraryClasses = true)
|
return isInContent(project, file, includeProjectSource = false, includeLibrarySource = true, includeLibraryClasses = true)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user