From 827b56e27726dea526075171d67ccf32b51e12aa Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Mon, 26 Sep 2016 18:34:19 +0300 Subject: [PATCH] Navigation to binaries: support navigation to type alias constructors #KT-13479 Fixed --- .../descriptors/impl/TypeAliasConstructorDescriptor.kt | 3 ++- .../idea/decompiler/navigation/findDecompiledDeclaration.kt | 6 ++++++ .../navigation/usercode/TypeAlias.decompiled.expected | 2 +- idea/testData/decompiler/navigation/usercode/TypeAlias.kt | 1 + .../navigation/usercode/TypeAlias.source.expected | 2 +- 5 files changed, 11 insertions(+), 3 deletions(-) diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/TypeAliasConstructorDescriptor.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/TypeAliasConstructorDescriptor.kt index aec213e1aeb..58e83def730 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/TypeAliasConstructorDescriptor.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/TypeAliasConstructorDescriptor.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.types.Variance interface TypeAliasConstructorDescriptor : ConstructorDescriptor { val underlyingConstructorDescriptor: ClassConstructorDescriptor + val typeAliasDescriptor: TypeAliasDescriptor override fun getContainingDeclaration(): TypeAliasDescriptor @@ -45,7 +46,7 @@ interface TypeAliasConstructorDescriptor : ConstructorDescriptor { } class TypeAliasConstructorDescriptorImpl private constructor( - val typeAliasDescriptor: TypeAliasDescriptor, + override val typeAliasDescriptor: TypeAliasDescriptor, override val underlyingConstructorDescriptor: ClassConstructorDescriptor, original: TypeAliasConstructorDescriptor?, annotations: Annotations, diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/navigation/findDecompiledDeclaration.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/navigation/findDecompiledDeclaration.kt index 29c7b385a57..6d737421bff 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/navigation/findDecompiledDeclaration.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/navigation/findDecompiledDeclaration.kt @@ -20,6 +20,7 @@ import com.intellij.openapi.project.Project import com.intellij.psi.search.EverythingGlobalScope import org.jetbrains.kotlin.builtins.DefaultBuiltIns import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor import org.jetbrains.kotlin.idea.decompiler.KtDecompiledFile import org.jetbrains.kotlin.idea.decompiler.textBuilder.DecompiledTextIndexer import org.jetbrains.kotlin.idea.stubindex.* @@ -81,6 +82,7 @@ private fun findCandidateDeclarationsInIndex( } val topLevelDeclaration = DescriptorUtils.getParentOfType(referencedDescriptor, PropertyDescriptor::class.java, false) + ?: DescriptorUtils.getParentOfType(referencedDescriptor, TypeAliasConstructorDescriptor::class.java, false)?.typeAliasDescriptor ?: DescriptorUtils.getParentOfType(referencedDescriptor, FunctionDescriptor::class.java, false) ?: DescriptorUtils.getParentOfType(referencedDescriptor, TypeAliasDescriptor::class.java, false) ?: return emptyList() @@ -109,6 +111,10 @@ object ByDescriptorIndexer : DecompiledTextIndexer { internal fun getDeclarationForDescriptor(descriptor: DeclarationDescriptor, file: KtDecompiledFile): KtDeclaration? { val original = descriptor.original + if (original is TypeAliasConstructorDescriptor) { + return getDeclarationForDescriptor(original.typeAliasDescriptor, file) + } + if (original is ValueParameterDescriptor) { val callable = original.containingDeclaration val callableDeclaration = getDeclarationForDescriptor(callable, file) as? KtCallableDeclaration ?: return null diff --git a/idea/testData/decompiler/navigation/usercode/TypeAlias.decompiled.expected b/idea/testData/decompiler/navigation/usercode/TypeAlias.decompiled.expected index 613dcd0f6a4..634321e45af 100644 --- a/idea/testData/decompiler/navigation/usercode/TypeAlias.decompiled.expected +++ b/idea/testData/decompiler/navigation/usercode/TypeAlias.decompiled.expected @@ -1,2 +1,2 @@ MainKt.class -public typealias <1>SimpleClassAlias = testData.libraries.SimpleClass +public typealias <1><2>SimpleClassAlias = testData.libraries.SimpleClass diff --git a/idea/testData/decompiler/navigation/usercode/TypeAlias.kt b/idea/testData/decompiler/navigation/usercode/TypeAlias.kt index 2558361c6eb..e7c04edf172 100644 --- a/idea/testData/decompiler/navigation/usercode/TypeAlias.kt +++ b/idea/testData/decompiler/navigation/usercode/TypeAlias.kt @@ -1,4 +1,5 @@ import testData.libraries.* fun foo(c: SimpleClassAlias) { + val s = SimpleClassAlias() } \ No newline at end of file diff --git a/idea/testData/decompiler/navigation/usercode/TypeAlias.source.expected b/idea/testData/decompiler/navigation/usercode/TypeAlias.source.expected index 2681f1bc3a3..0d475691e37 100644 --- a/idea/testData/decompiler/navigation/usercode/TypeAlias.source.expected +++ b/idea/testData/decompiler/navigation/usercode/TypeAlias.source.expected @@ -1,2 +1,2 @@ main.kt -typealias <1>SimpleClassAlias = SimpleClass +typealias <1><2>SimpleClassAlias = SimpleClass