diff options
Diffstat (limited to 'plugins/kotlin/analysis/src/org/jetbrains/kotlin/idea/decompiler/navigation/findDecompiledDeclaration.kt')
-rw-r--r-- | plugins/kotlin/analysis/src/org/jetbrains/kotlin/idea/decompiler/navigation/findDecompiledDeclaration.kt | 104 |
1 files changed, 3 insertions, 101 deletions
diff --git a/plugins/kotlin/analysis/src/org/jetbrains/kotlin/idea/decompiler/navigation/findDecompiledDeclaration.kt b/plugins/kotlin/analysis/src/org/jetbrains/kotlin/idea/decompiler/navigation/findDecompiledDeclaration.kt index bd20ecd998b7..038e61fe5928 100644 --- a/plugins/kotlin/analysis/src/org/jetbrains/kotlin/idea/decompiler/navigation/findDecompiledDeclaration.kt +++ b/plugins/kotlin/analysis/src/org/jetbrains/kotlin/idea/decompiler/navigation/findDecompiledDeclaration.kt @@ -5,32 +5,19 @@ package org.jetbrains.kotlin.idea.decompiler.navigation import com.intellij.openapi.project.Project import com.intellij.psi.search.EverythingGlobalScope import com.intellij.psi.search.GlobalSearchScope +import org.jetbrains.kotlin.analysis.decompiler.psi.file.KtDecompiledFile +import org.jetbrains.kotlin.analysis.decompiler.psi.text.ByDescriptorIndexer import org.jetbrains.kotlin.analyzer.ModuleInfo -import org.jetbrains.kotlin.builtins.DefaultBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns -import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsSignatures import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor import org.jetbrains.kotlin.idea.caches.project.BinaryModuleInfo -import org.jetbrains.kotlin.idea.caches.resolve.LOG -import org.jetbrains.kotlin.idea.decompiler.KtDecompiledFile -import org.jetbrains.kotlin.idea.decompiler.textBuilder.DecompiledTextIndexer -import org.jetbrains.kotlin.idea.decompiler.textBuilder.defaultDecompilerRendererOptions import org.jetbrains.kotlin.idea.stubindex.* -import org.jetbrains.kotlin.incremental.components.NoLookupLocation -import org.jetbrains.kotlin.psi.KtCallableDeclaration -import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtDeclaration -import org.jetbrains.kotlin.psi.KtDeclarationContainer -import org.jetbrains.kotlin.renderer.DescriptorRenderer -import org.jetbrains.kotlin.renderer.DescriptorRendererModifier import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe -import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe import org.jetbrains.kotlin.resolve.descriptorUtil.module -import org.jetbrains.kotlin.resolve.descriptorUtil.resolveTopLevelClass -import org.jetbrains.kotlin.types.ErrorUtils -import java.util.* +import org.jetbrains.kotlin.types.error.ErrorUtils fun findDecompiledDeclaration( project: Project, @@ -109,88 +96,3 @@ private fun findCandidateDeclarationsInIndex( else -> error("Referenced non local declaration that is not inside top level function, property, class or typealias:\n $referencedDescriptor") } } - -object ByDescriptorIndexer : DecompiledTextIndexer<String> { - override fun indexDescriptor(descriptor: DeclarationDescriptor): Collection<String> { - return listOf(descriptor.toStringKey()) - } - - 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 - if (original.index >= callableDeclaration.valueParameters.size) { - LOG.error( - "Parameter count mismatch for ${DescriptorRenderer.DEBUG_TEXT.render(callable)}[${original.index}] vs " + - callableDeclaration.valueParameterList?.text - ) - return null - } - return callableDeclaration.valueParameters[original.index] - } - - if (original is ConstructorDescriptor && original.isPrimary) { - val classOrObject = getDeclarationForDescriptor(original.containingDeclaration, file) as? KtClassOrObject - return classOrObject?.primaryConstructor ?: classOrObject - } - - val descriptorKey = original.toStringKey() - - if (!file.isContentsLoaded && original is MemberDescriptor) { - val hasDeclarationByKey = file.hasDeclarationWithKey(this, descriptorKey) || (getBuiltinsDescriptorKey(descriptor)?.let { - file.hasDeclarationWithKey( - this, - it - ) - } ?: false) - if (hasDeclarationByKey) { - val declarationContainer: KtDeclarationContainer? = when { - DescriptorUtils.isTopLevelDeclaration(original) -> file - original.containingDeclaration is ClassDescriptor -> - getDeclarationForDescriptor(original.containingDeclaration as ClassDescriptor, file) as? KtClassOrObject - else -> null - } - - if (declarationContainer != null) { - val descriptorName = original.name.asString() - val singleOrNull = declarationContainer.declarations.singleOrNull { it.name == descriptorName } - if (singleOrNull != null) { - return singleOrNull - } - } - } - } - - return file.getDeclaration(this, descriptorKey) ?: run { - return getBuiltinsDescriptorKey(descriptor)?.let { file.getDeclaration(this, it) } - } - } - - fun getBuiltinsDescriptorKey(descriptor: DeclarationDescriptor): String? { - if (descriptor !is ClassDescriptor) return null - - val classFqName = descriptor.fqNameUnsafe - if (!JvmBuiltInsSignatures.isSerializableInJava(classFqName)) return null - - val builtInDescriptor = - DefaultBuiltIns.Instance.builtInsModule.resolveTopLevelClass(classFqName.toSafe(), NoLookupLocation.FROM_IDE) - return builtInDescriptor?.toStringKey() - } - - private fun DeclarationDescriptor.toStringKey(): String { - return descriptorRendererForKeys.render(this) - } - - private val descriptorRendererForKeys = DescriptorRenderer.withOptions { - defaultDecompilerRendererOptions() - withDefinedIn = true - renderUnabbreviatedType = false - defaultParameterValueRenderer = null - } -} |