Do not try to resolve java elements outside of project roots

#EA-69067 Fixed
 #EA-64283 Fixed
This commit is contained in:
Denis Zharkov
2015-09-10 20:52:07 +03:00
parent 00d834cf73
commit 9c69a64789
2 changed files with 21 additions and 15 deletions
@@ -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)
}