From 438faf478b648fdb3480959b75374a38e098bc9f Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Sat, 10 Sep 2022 15:35:43 +0200 Subject: [PATCH] [lc] decompiled: extract common part to KotlinDeclarationInCompiledFileSearcher ^KT-53934 --- ...clarationInCompiledFileSearcherFE10Impl.kt | 33 +---------- ...KotlinDeclarationInCompiledFileSearcher.kt | 55 ++++++++++++++++++- .../LightMemberOriginForCompiledElement.kt | 11 +--- 3 files changed, 57 insertions(+), 42 deletions(-) diff --git a/analysis/decompiled/light-classes-for-decompiled-fe10/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/fe10/KotlinDeclarationInCompiledFileSearcherFE10Impl.kt b/analysis/decompiled/light-classes-for-decompiled-fe10/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/fe10/KotlinDeclarationInCompiledFileSearcherFE10Impl.kt index e9e7b6f9022..192cc51832f 100644 --- a/analysis/decompiled/light-classes-for-decompiled-fe10/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/fe10/KotlinDeclarationInCompiledFileSearcherFE10Impl.kt +++ b/analysis/decompiled/light-classes-for-decompiled-fe10/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/fe10/KotlinDeclarationInCompiledFileSearcherFE10Impl.kt @@ -12,12 +12,9 @@ import org.jetbrains.kotlin.analysis.decompiler.psi.file.KtClsFile import org.jetbrains.kotlin.analysis.decompiler.psi.text.BySignatureIndexer import org.jetbrains.kotlin.analysis.decompiler.psi.text.ClassNameAndSignature import org.jetbrains.kotlin.analysis.decompiler.psi.text.relativeClassName -import org.jetbrains.kotlin.asJava.syntheticAccessors import org.jetbrains.kotlin.load.kotlin.MemberSignature -import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtDeclaration -import org.jetbrains.kotlin.psi.allConstructors class KotlinDeclarationInCompiledFileSearcherFE10Impl : KotlinDeclarationInCompiledFileSearcher() { override fun findDeclarationInCompiledFile(file: KtClsFile, member: PsiMember, signature: MemberSignature): KtDeclaration? { @@ -26,7 +23,7 @@ class KotlinDeclarationInCompiledFileSearcherFE10Impl : KotlinDeclarationInCompi val memberName = member.name if (memberName != null && !file.isContentsLoaded && file.hasDeclarationWithKey(BySignatureIndexer, key)) { - findByStub(file, relativeClassName, member, memberName)?.let { return it } + findByStubs(file, relativeClassName, member, memberName)?.let { return it } } val declaration = file.getDeclaration(BySignatureIndexer, key) ?: return null @@ -37,31 +34,3 @@ class KotlinDeclarationInCompiledFileSearcherFE10Impl : KotlinDeclarationInCompi } } } - -private fun findByStub( - file: KtClsFile, - relativeClassName: List, - member: PsiMember, - memberName: String, -): KtDeclaration? { - val topClassOrObject = file.declarations.singleOrNull() as? KtClassOrObject - val container: KtClassOrObject = if (relativeClassName.isEmpty()) - topClassOrObject - else { - relativeClassName.fold(topClassOrObject) { classOrObject, name -> - classOrObject?.declarations?.singleOrNull { it.name == name.asString() } as? KtClassOrObject - } - } ?: return null - - return if (member is PsiMethod && member.isConstructor) { - container.takeIf { it.name == memberName }?.allConstructors?.singleOrNull() - } else { - val declarations = container.declarations - val names: Collection = if (member is PsiMethod) - member.syntheticAccessors.map(Name::asString) + memberName - else - listOf(memberName) - - declarations.singleOrNull { declaration -> declaration.name in names } - } -} diff --git a/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/origin/KotlinDeclarationInCompiledFileSearcher.kt b/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/origin/KotlinDeclarationInCompiledFileSearcher.kt index cc61eebb312..36c994e1b04 100644 --- a/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/origin/KotlinDeclarationInCompiledFileSearcher.kt +++ b/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/origin/KotlinDeclarationInCompiledFileSearcher.kt @@ -1,18 +1,71 @@ /* - * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ package org.jetbrains.kotlin.analysis.decompiled.light.classes.origin import com.intellij.openapi.application.ApplicationManager +import com.intellij.psi.PsiField import com.intellij.psi.PsiMember +import com.intellij.psi.PsiMethod import org.jetbrains.kotlin.analysis.decompiler.psi.file.KtClsFile +import org.jetbrains.kotlin.asJava.syntheticAccessors import org.jetbrains.kotlin.load.kotlin.MemberSignature +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.psi.allConstructors +import org.jetbrains.kotlin.type.MapPsiToAsmDesc abstract class KotlinDeclarationInCompiledFileSearcher { abstract fun findDeclarationInCompiledFile(file: KtClsFile, member: PsiMember, signature: MemberSignature): KtDeclaration? + fun findDeclarationInCompiledFile(file: KtClsFile, member: PsiMember): KtDeclaration? { + val signature = when (member) { + is PsiField -> { + val desc = MapPsiToAsmDesc.typeDesc(member.type) + MemberSignature.fromFieldNameAndDesc(member.name, desc) + } + + is PsiMethod -> { + val desc = MapPsiToAsmDesc.methodDesc(member) + val name = if (member.isConstructor) "" else member.name + MemberSignature.fromMethodNameAndDesc(name, desc) + } + + else -> null + } ?: return null + + return findDeclarationInCompiledFile(file, member, signature) + } + + protected fun findByStubs( + file: KtClsFile, + relativeClassName: List, + member: PsiMember, + memberName: String, + ): KtDeclaration? { + val topClassOrObject = file.declarations.singleOrNull() as? KtClassOrObject + val container: KtClassOrObject = if (relativeClassName.isEmpty()) + topClassOrObject + else { + relativeClassName.fold(topClassOrObject) { classOrObject, name -> + classOrObject?.declarations?.singleOrNull { it.name == name.asString() } as? KtClassOrObject + } + } ?: return null + + return if (member is PsiMethod && member.isConstructor) { + container.takeIf { it.name == memberName }?.allConstructors?.singleOrNull() + } else { + val declarations = container.declarations + val names: Collection = if (member is PsiMethod) + member.syntheticAccessors.map(Name::asString) + memberName + else + listOf(memberName) + + declarations.singleOrNull { declaration -> declaration.name in names } + } + } companion object { fun getInstance(): KotlinDeclarationInCompiledFileSearcher = diff --git a/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/origin/LightMemberOriginForCompiledElement.kt b/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/origin/LightMemberOriginForCompiledElement.kt index 8e3f1ae73a0..ec186451d87 100644 --- a/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/origin/LightMemberOriginForCompiledElement.kt +++ b/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/origin/LightMemberOriginForCompiledElement.kt @@ -13,10 +13,8 @@ import com.intellij.psi.PsiMethod import org.jetbrains.kotlin.analysis.decompiler.psi.file.KtClsFile import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin import org.jetbrains.kotlin.asJava.classes.lazyPub -import org.jetbrains.kotlin.load.kotlin.MemberSignature import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKind -import org.jetbrains.kotlin.type.MapPsiToAsmDesc interface LightMemberOriginForCompiledElement : LightMemberOrigin { val member: T @@ -49,9 +47,7 @@ data class LightMemberOriginForCompiledField(val psiField: PsiField, val file: K } override val originalElement: KtDeclaration? by lazyPub { - val desc = MapPsiToAsmDesc.typeDesc(psiField.type) - val signature = MemberSignature.fromFieldNameAndDesc(psiField.name, desc) - KotlinDeclarationInCompiledFileSearcher.getInstance().findDeclarationInCompiledFile(file, psiField, signature) + KotlinDeclarationInCompiledFileSearcher.getInstance().findDeclarationInCompiledFile(file, psiField) } } @@ -71,9 +67,6 @@ data class LightMemberOriginForCompiledMethod(val psiMethod: PsiMethod, val file } override val originalElement: KtDeclaration? by lazyPub { - val desc = MapPsiToAsmDesc.methodDesc(psiMethod) - val name = if (psiMethod.isConstructor) "" else psiMethod.name - val signature = MemberSignature.fromMethodNameAndDesc(name, desc) - KotlinDeclarationInCompiledFileSearcher.getInstance().findDeclarationInCompiledFile(file, psiMethod, signature) + KotlinDeclarationInCompiledFileSearcher.getInstance().findDeclarationInCompiledFile(file, psiMethod) } } \ No newline at end of file