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 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)
} }