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
This commit is contained in:
Roman Golyshev
2020-04-10 20:26:59 +03:00
committed by Alexander Podkhalyuzin
parent ec9c7c98cd
commit d7667209b2
6 changed files with 45 additions and 2 deletions
@@ -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")
}
}
@@ -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() {
}
@@ -0,0 +1,3 @@
package `try`.`package`
class PackageWithQuotes
@@ -0,0 +1 @@
try.package
@@ -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)
@@ -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)