diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/codeInsight/DescriptorToDeclarationUtil.kt b/idea/idea-analysis/src/org/jetbrains/jet/plugin/codeInsight/DescriptorToDeclarationUtil.kt index 5649327ca30..2bc22b6abb9 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/codeInsight/DescriptorToDeclarationUtil.kt +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/codeInsight/DescriptorToDeclarationUtil.kt @@ -16,15 +16,20 @@ package org.jetbrains.jet.plugin.codeInsight -import org.jetbrains.jet.lang.psi.JetFile -import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor -import com.intellij.psi.PsiElement import com.intellij.openapi.project.Project +import com.intellij.psi.PsiElement +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor +import org.jetbrains.jet.lang.psi.JetFile import org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils -import org.jetbrains.jet.plugin.references.BuiltInsReferenceResolver import org.jetbrains.jet.plugin.libraries.DecompiledNavigationUtils +import org.jetbrains.jet.plugin.references.BuiltInsReferenceResolver +import java.util.HashSet +import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor +import com.intellij.psi.JavaPsiFacade +import com.intellij.util.containers.ContainerUtil +import org.jetbrains.jet.plugin.search.allScope -object DescriptorToDeclarationUtil { +public object DescriptorToDeclarationUtil { public fun getDeclaration(file: JetFile, descriptor: DeclarationDescriptor): PsiElement? { return getDeclaration(file.getProject(), descriptor) } @@ -38,7 +43,24 @@ object DescriptorToDeclarationUtil { return elements.firstOrNull() } - public fun findDecompiledAndBuiltInDeclarations(project: Project, descriptor: DeclarationDescriptor): Collection { + public fun resolveToPsiElements(project: Project, targetDescriptor: DeclarationDescriptor): Collection { + val result = HashSet() + + // todo: remove getOriginal() + val originalDescriptor = targetDescriptor.getOriginal() + result.addAll(DescriptorToSourceUtils.descriptorToDeclarations(originalDescriptor)) + result.addAll(DescriptorToDeclarationUtil.findDecompiledAndBuiltInDeclarations(project, originalDescriptor)) + + if (originalDescriptor is PackageViewDescriptor) { + val psiFacade = JavaPsiFacade.getInstance(project) + val fqName = (originalDescriptor as PackageViewDescriptor).getFqName().asString() + ContainerUtil.addIfNotNull(result, psiFacade.findPackage(fqName)) + ContainerUtil.addIfNotNull(result, psiFacade.findClass(fqName, project.allScope())) + } + return result + } + + private fun findDecompiledAndBuiltInDeclarations(project: Project, descriptor: DeclarationDescriptor): Collection { val libraryReferenceResolver = project.getComponent(javaClass()) val elements = libraryReferenceResolver!!.resolveBuiltInSymbol(descriptor) if (!elements.isEmpty()) { diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/references/JetReference.kt b/idea/idea-analysis/src/org/jetbrains/jet/plugin/references/JetReference.kt index f5397a8743b..f51ccf603a3 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/references/JetReference.kt +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/references/JetReference.kt @@ -27,16 +27,10 @@ import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor import org.jetbrains.jet.lang.resolve.BindingContext import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache import java.util.Collections -import java.util.HashSet -import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor -import com.intellij.psi.JavaPsiFacade import org.jetbrains.jet.lang.psi.JetReferenceExpression import org.jetbrains.jet.plugin.codeInsight.DescriptorToDeclarationUtil -import com.intellij.util.containers.ContainerUtil import org.jetbrains.jet.lang.psi.JetElement import org.jetbrains.jet.utils.keysToMap -import org.jetbrains.jet.plugin.search.allScope -import org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils public trait JetReference : PsiPolyVariantReference { public fun resolveToDescriptors(): Collection @@ -89,12 +83,12 @@ public abstract class AbstractJetReference(element: T) override fun resolveMap(): Map> { val context = AnalyzerFacadeWithCache.getContextForElement(expression) - return getTargetDescriptors(context) keysToMap { resolveToPsiElements(it) } + return getTargetDescriptors(context) keysToMap { DescriptorToDeclarationUtil.resolveToPsiElements(expression.getProject(), it) } } private fun resolveToPsiElements(context: BindingContext, targetDescriptors: Collection): Collection { if (targetDescriptors.isNotEmpty()) { - return targetDescriptors flatMap { target -> resolveToPsiElements(target) } + return targetDescriptors flatMap { target -> DescriptorToDeclarationUtil.resolveToPsiElements(expression.getProject(), target) } } val labelTargets = getLabelTargets(context) @@ -105,23 +99,6 @@ public abstract class AbstractJetReference(element: T) return Collections.emptySet() } - private fun resolveToPsiElements(targetDescriptor: DeclarationDescriptor): Collection { - val result = HashSet() - val project = expression.getProject() - // todo: remove getOriginal() - val originalDescriptor = targetDescriptor.getOriginal() - result.addAll(DescriptorToSourceUtils.descriptorToDeclarations(originalDescriptor)) - result.addAll(DescriptorToDeclarationUtil.findDecompiledAndBuiltInDeclarations(project, originalDescriptor)) - - if (originalDescriptor is PackageViewDescriptor) { - val psiFacade = JavaPsiFacade.getInstance(project) - val fqName = (originalDescriptor as PackageViewDescriptor).getFqName().asString() - ContainerUtil.addIfNotNull(result, psiFacade.findPackage(fqName)) - ContainerUtil.addIfNotNull(result, psiFacade.findClass(fqName, project.allScope())) - } - return result - } - protected abstract fun getTargetDescriptors(context: BindingContext): Collection private fun getLabelTargets(context: BindingContext): Collection? {