From dec9fa032430916f92463d59e10c3920f716da8f Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Mon, 20 Mar 2017 16:50:45 +0300 Subject: [PATCH] SourceNavigationHelper: fix navigation to callables Previously we could differentiate between callables with the same name when relevant type declaration were in the same file only Problem manifested most severely when several copies of sources were attached to the same library --- .../navigation/SourceNavigationHelper.kt | 24 ++----------------- .../decompiler/navigation/library/extra.kt | 6 ++++- .../decompiler/navigation/library/main.kt | 5 ---- .../TypeWithSameShortName.decompiled.expected | 4 ++-- .../TypeWithSameShortName.source.expected | 6 ++--- 5 files changed, 12 insertions(+), 33 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/navigation/SourceNavigationHelper.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/navigation/SourceNavigationHelper.kt index 02b3b5054d1..da640a67245 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/navigation/SourceNavigationHelper.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/navigation/SourceNavigationHelper.kt @@ -19,7 +19,6 @@ package org.jetbrains.kotlin.idea.decompiler.navigation import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.module.Module import com.intellij.openapi.project.DumbService -import com.intellij.openapi.project.Project import com.intellij.openapi.roots.OrderEntry import com.intellij.openapi.roots.ProjectRootManager import com.intellij.openapi.vfs.VirtualFile @@ -31,14 +30,11 @@ import com.intellij.util.containers.ContainerUtil import gnu.trove.THashSet import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.asJava.toLightClass -import org.jetbrains.kotlin.builtins.DefaultBuiltIns -import org.jetbrains.kotlin.context.ContextForNewModule -import org.jetbrains.kotlin.context.ProjectContext import org.jetbrains.kotlin.descriptors.CallableDescriptor -import org.jetbrains.kotlin.frontend.di.createLazyResolveSession import org.jetbrains.kotlin.idea.caches.resolve.BinaryModuleInfo import org.jetbrains.kotlin.idea.caches.resolve.SourceForBinaryModuleInfo import org.jetbrains.kotlin.idea.caches.resolve.getModuleInfoByVirtualFile +import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor import org.jetbrains.kotlin.idea.decompiler.navigation.MemberMatching.* import org.jetbrains.kotlin.idea.stubindex.KotlinFullClassNameIndex import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelFunctionFqnNameIndex @@ -50,7 +46,6 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.platform.JavaToKotlinClassMap import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.debugText.getDebugText -import org.jetbrains.kotlin.resolve.lazy.KotlinCodeAnalyzer object SourceNavigationHelper { private val LOG = Logger.getInstance(SourceNavigationHelper::class.java) @@ -162,10 +157,8 @@ object SourceNavigationHelper { } } - val analyzer = createAnalyzer(candidates, declaration.project) - for (candidate in candidates) { - val candidateDescriptor = analyzer.resolveToDescriptor(candidate) as CallableDescriptor + val candidateDescriptor = candidate.resolveToDescriptor() as CallableDescriptor if (receiversMatch(declaration, candidateDescriptor) && valueParametersTypesMatch(declaration, candidateDescriptor) && typeParametersMatch(declaration as KtTypeParameterListOwner, candidateDescriptor.typeParameters)) { @@ -176,19 +169,6 @@ object SourceNavigationHelper { return null } - private fun createAnalyzer( - candidates: Collection, - project: Project - ): KotlinCodeAnalyzer { - val context = ContextForNewModule( - ProjectContext(project), Name.special(""), DefaultBuiltIns.Instance, null - ) - context.setDependencies(context.module, context.module.builtIns.builtInsModule) - val resolveSession = createLazyResolveSession(context, candidates.getContainingFiles()) - context.initializeModuleContents(resolveSession.packageFragmentProvider) - return resolveSession - } - private fun findFirstMatchingInIndex( entity: T, navigationKind: NavigationKind, diff --git a/idea/testData/decompiler/navigation/library/extra.kt b/idea/testData/decompiler/navigation/library/extra.kt index 3c89c06e307..19bae8f188f 100644 --- a/idea/testData/decompiler/navigation/library/extra.kt +++ b/idea/testData/decompiler/navigation/library/extra.kt @@ -1,4 +1,8 @@ package testData.libraries public fun func(str : kotlin.String) { -} \ No newline at end of file +} + +public fun processDouble(d: Double) {} + +public fun processDouble(d: kotlin.Double) {} \ No newline at end of file diff --git a/idea/testData/decompiler/navigation/library/main.kt b/idea/testData/decompiler/navigation/library/main.kt index 6045e163b19..8156b236733 100644 --- a/idea/testData/decompiler/navigation/library/main.kt +++ b/idea/testData/decompiler/navigation/library/main.kt @@ -111,11 +111,6 @@ public inline fun T.filter(predicate: (T)-> Boolean) : T? = this public class Double -public fun processDouble(d: Double) {} - -public fun processDouble(d: kotlin.Double) {} - - public fun funWithTypeParam(t: T) { } diff --git a/idea/testData/decompiler/navigation/usercode/TypeWithSameShortName.decompiled.expected b/idea/testData/decompiler/navigation/usercode/TypeWithSameShortName.decompiled.expected index aa4ab5e6bbe..0ed0b1e29a3 100644 --- a/idea/testData/decompiler/navigation/usercode/TypeWithSameShortName.decompiled.expected +++ b/idea/testData/decompiler/navigation/usercode/TypeWithSameShortName.decompiled.expected @@ -1,6 +1,6 @@ -Double.class + Double.class public final class Double public <3>constructor() { - MainKt.class + ExtraKt.class public fun <1>processDouble(d: kotlin.Double): kotlin.Unit { /* compiled code */ } public fun <2>processDouble(d: testData.libraries.Double): kotlin.Unit { /* compiled code */ } diff --git a/idea/testData/decompiler/navigation/usercode/TypeWithSameShortName.source.expected b/idea/testData/decompiler/navigation/usercode/TypeWithSameShortName.source.expected index 46dd7a79db7..9c2eb8e07e8 100644 --- a/idea/testData/decompiler/navigation/usercode/TypeWithSameShortName.source.expected +++ b/idea/testData/decompiler/navigation/usercode/TypeWithSameShortName.source.expected @@ -1,6 +1,6 @@ -main.kt -public class <3>Double - + extra.kt public fun <2>processDouble(d: Double) {} public fun <1>processDouble(d: kotlin.Double) {} + main.kt +public class <3>Double