From d7667209b25578f1c5d31ddbf0ec4edd551492ed Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Fri, 10 Apr 2020 20:26:59 +0300 Subject: [PATCH] KT-37144 Respect quotes in package name during decompilation - Odd package names (for example `try` in `arrow-core`) were pasted as-is to the decompiled text - Because of this, stub checks were failing, forcing completion to start over and over again, as if something changed in the files - See EA-5572315 for the error - ^KT-37144 Fixed --- .../textBuilder/buildDecompiledText.kt | 3 ++- .../PackageWithQuotes.expected.kt | 7 +++++++ .../PackageWithQuotes/PackageWithQuotes.kt | 3 +++ .../PackageWithQuotes/package.txt | 1 + .../textBuilder/AbstractDecompiledTextTest.kt | 15 ++++++++++++++- .../JvmDecompiledTextTestGenerated.java | 18 ++++++++++++++++++ 6 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 idea/testData/decompiler/decompiledTextJvm/PackageWithQuotes.expected.kt create mode 100644 idea/testData/decompiler/decompiledTextJvm/PackageWithQuotes/PackageWithQuotes.kt create mode 100644 idea/testData/decompiler/decompiledTextJvm/PackageWithQuotes/package.txt diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/buildDecompiledText.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/buildDecompiledText.kt index 70eed77bbb8..acb73204f0f 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/buildDecompiledText.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/buildDecompiledText.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.idea.decompiler.textBuilder import com.intellij.openapi.util.TextRange import org.jetbrains.kotlin.contracts.description.ContractProviderKey import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.idea.core.quoteIfNeeded import org.jetbrains.kotlin.idea.decompiler.navigation.ByDescriptorIndexer import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.psiUtil.quoteIfNeeded @@ -46,7 +47,7 @@ fun buildDecompiledText( builder.append("// IntelliJ API Decompiler stub source generated from a class file\n" + "// Implementation of methods is not available") builder.append("\n\n") if (!packageFqName.isRoot) { - builder.append("package ").append(packageFqName).append("\n\n") + builder.append("package ").append(packageFqName.quoteIfNeeded()).append("\n\n") } } diff --git a/idea/testData/decompiler/decompiledTextJvm/PackageWithQuotes.expected.kt b/idea/testData/decompiler/decompiledTextJvm/PackageWithQuotes.expected.kt new file mode 100644 index 00000000000..359cbaf79d5 --- /dev/null +++ b/idea/testData/decompiler/decompiledTextJvm/PackageWithQuotes.expected.kt @@ -0,0 +1,7 @@ +// IntelliJ API Decompiler stub source generated from a class file +// Implementation of methods is not available + +package `try`.`package` + +public final class PackageWithQuotes public constructor() { +} \ No newline at end of file diff --git a/idea/testData/decompiler/decompiledTextJvm/PackageWithQuotes/PackageWithQuotes.kt b/idea/testData/decompiler/decompiledTextJvm/PackageWithQuotes/PackageWithQuotes.kt new file mode 100644 index 00000000000..c88bd2c46ba --- /dev/null +++ b/idea/testData/decompiler/decompiledTextJvm/PackageWithQuotes/PackageWithQuotes.kt @@ -0,0 +1,3 @@ +package `try`.`package` + +class PackageWithQuotes \ No newline at end of file diff --git a/idea/testData/decompiler/decompiledTextJvm/PackageWithQuotes/package.txt b/idea/testData/decompiler/decompiledTextJvm/PackageWithQuotes/package.txt new file mode 100644 index 00000000000..8e87ddafd96 --- /dev/null +++ b/idea/testData/decompiler/decompiledTextJvm/PackageWithQuotes/package.txt @@ -0,0 +1 @@ +try.package diff --git a/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/AbstractDecompiledTextTest.kt b/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/AbstractDecompiledTextTest.kt index ef3038ec7d7..2287f43f6f7 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/AbstractDecompiledTextTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/AbstractDecompiledTextTest.kt @@ -12,17 +12,30 @@ import com.intellij.openapi.roots.OrderRootType import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.PsiFile import com.intellij.util.indexing.FileContentImpl +import com.intellij.util.io.exists +import com.intellij.util.io.readText import org.jetbrains.kotlin.idea.decompiler.classFile.KotlinClsStubBuilder import org.jetbrains.kotlin.idea.decompiler.classFile.KtClsFile import org.jetbrains.kotlin.idea.decompiler.stubBuilder.serializeToString import org.jetbrains.kotlin.psi.KtPsiFactory import org.jetbrains.kotlin.psi.stubs.elements.KtFileStubBuilder import org.junit.Assert +import java.nio.file.Paths import kotlin.test.assertTrue abstract class AbstractDecompiledTextTest(baseDirectory: String, allowKotlinPackage: Boolean) : AbstractDecompiledTextBaseTest(baseDirectory, allowKotlinPackage = allowKotlinPackage) { - override fun getFileToDecompile(): VirtualFile = getClassFile(TEST_PACKAGE, getTestName(false), module!!) + + private val CUSTOM_PACKAGE_FILE = "package.txt" + + override fun getFileToDecompile(): VirtualFile { + val className = getTestName(false) + + val customPackageFile = Paths.get(TEST_DATA_PATH, className, CUSTOM_PACKAGE_FILE) + val testFilePackage = customPackageFile.takeIf { it.exists() }?.readText()?.trimEnd() ?: TEST_PACKAGE + + return getClassFile(testFilePackage, className, module!!) + } override fun checkStubConsistency(file: VirtualFile, decompiledText: String) { val fileWithDecompiledText = KtPsiFactory(project).createFile(decompiledText) diff --git a/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/JvmDecompiledTextTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/JvmDecompiledTextTestGenerated.java index 0f49a4b6400..010e6720afa 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/JvmDecompiledTextTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/JvmDecompiledTextTestGenerated.java @@ -43,6 +43,11 @@ public class JvmDecompiledTextTestGenerated extends AbstractJvmDecompiledTextTes runTest("idea/testData/decompiler/decompiledTextJvm/MultifileClass/"); } + @TestMetadata("PackageWithQuotes") + public void testPackageWithQuotes() throws Exception { + runTest("idea/testData/decompiler/decompiledTextJvm/PackageWithQuotes/"); + } + @TestMetadata("TestKt") public void testTestKt() throws Exception { runTest("idea/testData/decompiler/decompiledTextJvm/TestKt/"); @@ -92,6 +97,19 @@ public class JvmDecompiledTextTestGenerated extends AbstractJvmDecompiledTextTes } } + @TestMetadata("idea/testData/decompiler/decompiledTextJvm/PackageWithQuotes") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class PackageWithQuotes extends AbstractJvmDecompiledTextTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + public void testAllFilesPresentInPackageWithQuotes() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/testData/decompiler/decompiledTextJvm/PackageWithQuotes"), Pattern.compile("^([^\\.]+)$"), null, true); + } + } + @TestMetadata("idea/testData/decompiler/decompiledTextJvm/TestKt") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)