From a47880a98b7f16191acf586af2508c839f118851 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Thu, 16 Jun 2022 14:34:37 +0200 Subject: [PATCH] [stubs] add test which checks consistency between cls and decompiled stubs --- .../stub/files/AbstractClsStubBuilderTest.kt | 155 +--------- .../stub/files/AbstractStubBuilderTest.kt | 164 ++++++++++ .../decompiler-to-psi/build.gradle.kts | 12 +- .../AbstractByDecompiledPsiStubBuilderTest.kt | 37 +++ ...DecompiledPsiStubBuilderTestGenerated.java | 284 ++++++++++++++++++ .../analysis-api-generator/build.gradle.kts | 1 + .../tests/analysis/api/decompiled.kt | 10 + 7 files changed, 513 insertions(+), 150 deletions(-) create mode 100644 analysis/decompiled/decompiler-to-file-stubs/tests/org/jetbrains/kotlin/analysis/decompiler/stub/files/AbstractStubBuilderTest.kt create mode 100644 analysis/decompiled/decompiler-to-psi/tests/org/jetbrains/kotlin/analysis/decompiler/psi/AbstractByDecompiledPsiStubBuilderTest.kt create mode 100644 analysis/decompiled/decompiler-to-psi/tests/org/jetbrains/kotlin/analysis/decompiler/psi/ByDecompiledPsiStubBuilderTestGenerated.java diff --git a/analysis/decompiled/decompiler-to-file-stubs/tests/org/jetbrains/kotlin/analysis/decompiler/stub/files/AbstractClsStubBuilderTest.kt b/analysis/decompiled/decompiler-to-file-stubs/tests/org/jetbrains/kotlin/analysis/decompiler/stub/files/AbstractClsStubBuilderTest.kt index 199ee7ebf89..611c8c2ed94 100644 --- a/analysis/decompiled/decompiler-to-file-stubs/tests/org/jetbrains/kotlin/analysis/decompiler/stub/files/AbstractClsStubBuilderTest.kt +++ b/analysis/decompiled/decompiler-to-file-stubs/tests/org/jetbrains/kotlin/analysis/decompiler/stub/files/AbstractClsStubBuilderTest.kt @@ -1,160 +1,17 @@ /* - * 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.decompiler.stub.files -import com.intellij.core.CoreApplicationEnvironment -import com.intellij.openapi.vfs.VfsUtilCore import com.intellij.openapi.vfs.VirtualFile -import com.intellij.openapi.vfs.impl.jar.CoreJarFileSystem -import com.intellij.psi.PsiElement -import com.intellij.psi.impl.DebugUtil -import com.intellij.psi.stubs.StubElement +import com.intellij.psi.stubs.PsiFileStub import com.intellij.util.indexing.FileContentImpl -import org.jetbrains.kotlin.analysis.decompiler.stub.file.CachedAttributeData -import org.jetbrains.kotlin.analysis.decompiler.stub.file.ClsKotlinBinaryClassCache -import org.jetbrains.kotlin.analysis.decompiler.stub.file.FileAttributeService import org.jetbrains.kotlin.analysis.decompiler.stub.file.KotlinClsStubBuilder -import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment -import org.jetbrains.kotlin.name.SpecialNames -import org.jetbrains.kotlin.psi.stubs.impl.STUB_TO_STRING_PREFIX -import org.jetbrains.kotlin.test.* -import org.jetbrains.kotlin.utils.addIfNotNull -import java.io.DataInput -import java.io.DataOutput -import java.nio.file.Files -import java.nio.file.Path -import java.nio.file.Paths -import kotlin.io.path.absolutePathString -import kotlin.io.path.name -import kotlin.io.path.readText -import kotlin.streams.toList -abstract class AbstractClsStubBuilderTest : KotlinTestWithEnvironment() { - override fun createEnvironment(): KotlinCoreEnvironment { - return KotlinTestUtils.createEnvironmentWithMockJdkAndIdeaAnnotations(testRootDisposable, ConfigurationKind.JDK_NO_RUNTIME) +abstract class AbstractClsStubBuilderTest : AbstractStubBuilderTest() { + override fun getStubToTest(classFile: VirtualFile): PsiFileStub<*> { + return KotlinClsStubBuilder().buildFileStub(FileContentImpl.createByFile(classFile))!! } - - override fun setUp() { - super.setUp() - - with(environment.projectEnvironment.environment) { - registerApplicationServices() - } - } - - private fun CoreApplicationEnvironment.registerApplicationServices() { - registerApplicationService(FileAttributeService::class.java, DummyFileAttributeService) - registerApplicationService(ClsKotlinBinaryClassCache::class.java, ClsKotlinBinaryClassCache()) - } - - fun runTest(testDirectory: String) { - val testDirectoryPath = Paths.get(testDirectory) - val testData = TestData.createFromDirectory(testDirectoryPath) - - doTest(testData, useStringTable = true) - doTest(testData, useStringTable = false) - } - - - private fun doTest(testData: TestData, useStringTable: Boolean) { - val classFile = getClassFileToDecompile(testData, useStringTable) - testClsStubsForFile(classFile, testData) - } - - private fun testClsStubsForFile(classFile: VirtualFile, testData: TestData) { - val stubTreeFromCls = KotlinClsStubBuilder().buildFileStub(FileContentImpl.createByFile(classFile))!! - KotlinTestUtils.assertEqualsToFile(testData.expectedFile, stubTreeFromCls.serializeToString()) - } - - private fun getClassFileToDecompile(testData: TestData, useStringTable: Boolean): VirtualFile { - val extraOptions = buildList { - add("-Xallow-kotlin-package") - if (useStringTable) { - add("-Xuse-type-table") - } - } - - val library = CompilerTestUtil.compileJvmLibrary( - src = testData.directory.toFile(), - extraOptions = extraOptions, - ).toPath() - - return findClassFileByName(library, testData.jvmFileName) - } - - private fun findClassFileByName(library: Path, className: String): VirtualFile { - val jarFileSystem = environment.projectEnvironment.environment.jarFileSystem as CoreJarFileSystem - val root = jarFileSystem.refreshAndFindFileByPath(library.absolutePathString() + "!/")!! - val files = mutableSetOf() - VfsUtilCore.iterateChildrenRecursively( - root, - /*filter=*/{ virtualFile -> - virtualFile.isDirectory || virtualFile.name == "$className.class" - }, - /*iterator=*/{ virtualFile -> - if (!virtualFile.isDirectory) { - files.addIfNotNull(virtualFile) - } - true - }) - - return files.single() - } - -} - -private fun StubElement.serializeToString(): String { - return serializeStubToString(this) -} - -private fun serializeStubToString(stubElement: StubElement<*>): String { - val treeStr = DebugUtil.stubTreeToString(stubElement).replace(SpecialNames.SAFE_IDENTIFIER_FOR_NO_NAME.asString(), "") - - // Nodes are stored in form "NodeType:Node" and have too many repeating information for Kotlin stubs - // Remove all repeating information (See KotlinStubBaseImpl.toString()) - return treeStr.lines().joinToString(separator = "\n") { - if (it.contains(STUB_TO_STRING_PREFIX)) { - it.takeWhile(Char::isWhitespace) + it.substringAfter("KotlinStub$") - } else { - it - } - }.replace(", [", "[") -} - - -private data class TestData( - val directory: Path, - val mainKotlinFile: Path, - val expectedFile: Path, - val jvmFileName: String -) { - companion object { - fun createFromDirectory(directory: Path): TestData { - val allFiles = Files.list(directory).toList() - val mainKotlinFile = allFiles.single { path -> - path.name.replaceFirstChar { it.uppercaseChar() } == "${directory.name.removeSuffix("Kt")}.kt" - } - val jvmFileName = InTextDirectivesUtils.findStringWithPrefixes(mainKotlinFile.readText(), "JVM_FILE_NAME:") - ?: directory.name - return TestData( - directory = directory, - mainKotlinFile = mainKotlinFile, - expectedFile = allFiles.single { it.name == "${directory.name}.txt" }, - jvmFileName = jvmFileName, - ) - } - } -} - -object DummyFileAttributeService : FileAttributeService { - override fun write(file: VirtualFile, id: String, value: T, writeValueFun: (DataOutput, T) -> Unit): CachedAttributeData { - return CachedAttributeData(value, 0) - } - - override fun read(file: VirtualFile, id: String, readValueFun: (DataInput) -> T): CachedAttributeData? { - return null - } -} +} \ No newline at end of file diff --git a/analysis/decompiled/decompiler-to-file-stubs/tests/org/jetbrains/kotlin/analysis/decompiler/stub/files/AbstractStubBuilderTest.kt b/analysis/decompiled/decompiler-to-file-stubs/tests/org/jetbrains/kotlin/analysis/decompiler/stub/files/AbstractStubBuilderTest.kt new file mode 100644 index 00000000000..4bd6a642a0a --- /dev/null +++ b/analysis/decompiled/decompiler-to-file-stubs/tests/org/jetbrains/kotlin/analysis/decompiler/stub/files/AbstractStubBuilderTest.kt @@ -0,0 +1,164 @@ +/* + * Copyright 2010-2021 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.decompiler.stub.files + +import com.intellij.core.CoreApplicationEnvironment +import com.intellij.openapi.vfs.VfsUtilCore +import com.intellij.openapi.vfs.VirtualFile +import com.intellij.openapi.vfs.impl.jar.CoreJarFileSystem +import com.intellij.psi.PsiElement +import com.intellij.psi.impl.DebugUtil +import com.intellij.psi.stubs.StubElement +import org.jetbrains.kotlin.analysis.decompiler.stub.file.CachedAttributeData +import org.jetbrains.kotlin.analysis.decompiler.stub.file.ClsKotlinBinaryClassCache +import org.jetbrains.kotlin.analysis.decompiler.stub.file.FileAttributeService +import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment +import org.jetbrains.kotlin.name.SpecialNames +import org.jetbrains.kotlin.psi.stubs.impl.STUB_TO_STRING_PREFIX +import org.jetbrains.kotlin.test.* +import org.jetbrains.kotlin.utils.addIfNotNull +import java.io.DataInput +import java.io.DataOutput +import java.nio.file.Files +import java.nio.file.Path +import java.nio.file.Paths +import kotlin.io.path.absolutePathString +import kotlin.io.path.name +import kotlin.io.path.readText +import com.intellij.psi.stubs.PsiFileStub +import java.util.stream.Collectors + +abstract class AbstractStubBuilderTest : KotlinTestWithEnvironment() { + override fun createEnvironment(): KotlinCoreEnvironment { + return KotlinTestUtils.createEnvironmentWithMockJdkAndIdeaAnnotations(testRootDisposable, ConfigurationKind.JDK_NO_RUNTIME) + } + + override fun setUp() { + super.setUp() + + with(environment.projectEnvironment.environment) { + registerApplicationServices() + } + } + + private fun CoreApplicationEnvironment.registerApplicationServices() { + registerApplicationService(FileAttributeService::class.java, DummyFileAttributeService) + registerApplicationService(ClsKotlinBinaryClassCache::class.java, ClsKotlinBinaryClassCache()) + } + + fun runTest(testDirectory: String) { + val testDirectoryPath = Paths.get(testDirectory) + val testData = TestData.createFromDirectory(testDirectoryPath) + + doTest(testData, useStringTable = true) + doTest(testData, useStringTable = false) + } + + + private fun doTest(testData: TestData, useStringTable: Boolean) { + val classFile = getClassFileToDecompile(testData, useStringTable) + testClsStubsForFile(classFile, testData) + } + + private fun testClsStubsForFile(classFile: VirtualFile, testData: TestData) { + KotlinTestUtils.assertEqualsToFile(testData.expectedFile, getStubToTest(classFile).serializeToString()) + } + + protected abstract fun getStubToTest(classFile: VirtualFile): PsiFileStub<*> + + private fun getClassFileToDecompile(testData: TestData, useStringTable: Boolean): VirtualFile { + val extraOptions = buildList { + add("-Xallow-kotlin-package") + if (useStringTable) { + add("-Xuse-type-table") + } + addAll(testData.additionalCompilerOptions) + } + + val library = CompilerTestUtil.compileJvmLibrary( + src = testData.directory.toFile(), + extraOptions = extraOptions, + ).toPath() + + return findClassFileByName(library, testData.jvmFileName) + } + + private fun findClassFileByName(library: Path, className: String): VirtualFile { + val jarFileSystem = environment.projectEnvironment.environment.jarFileSystem as CoreJarFileSystem + val root = jarFileSystem.refreshAndFindFileByPath(library.absolutePathString() + "!/")!! + val files = mutableSetOf() + VfsUtilCore.iterateChildrenRecursively( + root, + /*filter=*/{ virtualFile -> + virtualFile.isDirectory || virtualFile.name == "$className.class" + }, + /*iterator=*/{ virtualFile -> + if (!virtualFile.isDirectory) { + files.addIfNotNull(virtualFile) + } + true + }) + + return files.single() + } + +} + +private fun StubElement.serializeToString(): String { + return serializeStubToString(this) +} + +private fun serializeStubToString(stubElement: StubElement<*>): String { + val treeStr = DebugUtil.stubTreeToString(stubElement).replace(SpecialNames.SAFE_IDENTIFIER_FOR_NO_NAME.asString(), "") + + // Nodes are stored in form "NodeType:Node" and have too many repeating information for Kotlin stubs + // Remove all repeating information (See KotlinStubBaseImpl.toString()) + return treeStr.lines().joinToString(separator = "\n") { + if (it.contains(STUB_TO_STRING_PREFIX)) { + it.takeWhile(Char::isWhitespace) + it.substringAfter("KotlinStub$") + } else { + it + } + }.replace(", [", "[") +} + + +private data class TestData( + val directory: Path, + val mainKotlinFile: Path, + val expectedFile: Path, + val jvmFileName: String, + val additionalCompilerOptions: List, +) { + companion object { + fun createFromDirectory(directory: Path): TestData { + val allFiles = Files.list(directory).collect(Collectors.toList()) + val mainKotlinFile = allFiles.single { path: Path -> + path.name.replaceFirstChar { Character.toUpperCase(it) } == "${directory.name.removeSuffix("Kt")}.kt" + } + val fileText = mainKotlinFile.readText() + val jvmFileName = InTextDirectivesUtils.findStringWithPrefixes(fileText, "JVM_FILE_NAME:") ?: directory.name + val additionalCompilerOptions = InTextDirectivesUtils.findListWithPrefixes(fileText, "// !LANGUAGE: ").map { "-XXLanguage:$it" } + return TestData( + directory = directory, + mainKotlinFile = mainKotlinFile, + expectedFile = allFiles.single { it.fileName.toString() == "${directory.name}.txt" }, + jvmFileName = jvmFileName, + additionalCompilerOptions = additionalCompilerOptions, + ) + } + } +} + +object DummyFileAttributeService : FileAttributeService { + override fun write(file: VirtualFile, id: String, value: T, writeValueFun: (DataOutput, T) -> Unit): CachedAttributeData { + return CachedAttributeData(value, 0) + } + + override fun read(file: VirtualFile, id: String, readValueFun: (DataInput) -> T): CachedAttributeData? { + return null + } +} diff --git a/analysis/decompiled/decompiler-to-psi/build.gradle.kts b/analysis/decompiled/decompiler-to-psi/build.gradle.kts index 33e40eb5b7f..2d37960d87e 100644 --- a/analysis/decompiled/decompiler-to-psi/build.gradle.kts +++ b/analysis/decompiled/decompiler-to-psi/build.gradle.kts @@ -11,9 +11,19 @@ dependencies { implementation(project(":analysis:decompiled:decompiler-to-stubs")) implementation(project(":analysis:decompiled:decompiler-to-file-stubs")) implementation(intellijCore()) + + testImplementation(projectTests(":compiler:tests-common")) + testImplementation(projectTests(":analysis:decompiled:decompiler-to-file-stubs")) } sourceSets { "main" { projectDefault() } - "test" { none() } + "test" { projectDefault() } } + +projectTest { + dependsOn(":dist") + workingDir = rootDir +} + +testsJar() \ No newline at end of file diff --git a/analysis/decompiled/decompiler-to-psi/tests/org/jetbrains/kotlin/analysis/decompiler/psi/AbstractByDecompiledPsiStubBuilderTest.kt b/analysis/decompiled/decompiler-to-psi/tests/org/jetbrains/kotlin/analysis/decompiler/psi/AbstractByDecompiledPsiStubBuilderTest.kt new file mode 100644 index 00000000000..f331afae4fc --- /dev/null +++ b/analysis/decompiled/decompiler-to-psi/tests/org/jetbrains/kotlin/analysis/decompiler/psi/AbstractByDecompiledPsiStubBuilderTest.kt @@ -0,0 +1,37 @@ +/* + * 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.decompiler.psi + +import com.intellij.ide.highlighter.JavaClassFileType +import com.intellij.openapi.extensions.LoadingOrder +import com.intellij.openapi.vfs.VirtualFile +import com.intellij.psi.ClassFileViewProviderFactory +import com.intellij.psi.FileTypeFileViewProviders +import com.intellij.psi.PsiManager +import com.intellij.psi.compiled.ClassFileDecompilers +import com.intellij.psi.stubs.PsiFileStub +import org.jetbrains.kotlin.analysis.decompiler.stub.files.AbstractStubBuilderTest +import org.jetbrains.kotlin.psi.stubs.elements.KtFileStubBuilder + +abstract class AbstractByDecompiledPsiStubBuilderTest : AbstractStubBuilderTest() { + override fun setUp() { + super.setUp() + + FileTypeFileViewProviders.INSTANCE.addExplicitExtension(JavaClassFileType.INSTANCE, ClassFileViewProviderFactory()) + + ClassFileDecompilers.getInstance().EP_NAME.point.apply { + registerExtension(KotlinClassFileDecompiler(), LoadingOrder.FIRST, testRootDisposable) + registerExtension(KotlinBuiltInDecompiler(), LoadingOrder.FIRST, testRootDisposable) + } + + } + + override fun getStubToTest(classFile: VirtualFile): PsiFileStub<*> { + val decompiledFile = PsiManager.getInstance(project).findFile(classFile) + ?: error("No decompiled file was found for $classFile") + return KtFileStubBuilder().buildStubTree(decompiledFile) as PsiFileStub<*> + } +} \ No newline at end of file diff --git a/analysis/decompiled/decompiler-to-psi/tests/org/jetbrains/kotlin/analysis/decompiler/psi/ByDecompiledPsiStubBuilderTestGenerated.java b/analysis/decompiled/decompiler-to-psi/tests/org/jetbrains/kotlin/analysis/decompiler/psi/ByDecompiledPsiStubBuilderTestGenerated.java new file mode 100644 index 00000000000..3cedd8b88b1 --- /dev/null +++ b/analysis/decompiled/decompiler-to-psi/tests/org/jetbrains/kotlin/analysis/decompiler/psi/ByDecompiledPsiStubBuilderTestGenerated.java @@ -0,0 +1,284 @@ +/* + * Copyright 2010-2021 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.decompiler.psi; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link GenerateNewCompilerTests.kt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder") +@TestDataPath("$PROJECT_ROOT") +public class ByDecompiledPsiStubBuilderTestGenerated extends AbstractByDecompiledPsiStubBuilderTest { + @Test + public void testAllFilesPresentInClsFileStubBuilder() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder"), Pattern.compile("^([^\\.]+)$"), null, false); + } + + @Test + @TestMetadata("AnnotatedFlexibleTypes") + public void testAnnotatedFlexibleTypes() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/AnnotatedFlexibleTypes/"); + } + + @Test + @TestMetadata("AnnotatedParameterInEnumConstructor") + public void testAnnotatedParameterInEnumConstructor() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/AnnotatedParameterInEnumConstructor/"); + } + + @Test + @TestMetadata("AnnotatedParameterInInnerClassConstructor") + public void testAnnotatedParameterInInnerClassConstructor() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/AnnotatedParameterInInnerClassConstructor/"); + } + + @Test + @TestMetadata("AnnotationClass") + public void testAnnotationClass() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/AnnotationClass/"); + } + + @Test + @TestMetadata("AnnotationValues") + public void testAnnotationValues() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/AnnotationValues/"); + } + + @Test + @TestMetadata("Annotations") + public void testAnnotations() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/Annotations/"); + } + + @Test + @TestMetadata("AnnotationsOnNullableTypes") + public void testAnnotationsOnNullableTypes() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/AnnotationsOnNullableTypes/"); + } + + @Test + @TestMetadata("AnnotationsOnParenthesizedTypes") + public void testAnnotationsOnParenthesizedTypes() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/AnnotationsOnParenthesizedTypes/"); + } + + @Test + @TestMetadata("AnonymousReturnWithGenericType") + public void testAnonymousReturnWithGenericType() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/AnonymousReturnWithGenericType/"); + } + + @Test + @TestMetadata("ClassMembers") + public void testClassMembers() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/ClassMembers/"); + } + + @Test + @TestMetadata("ClassObject") + public void testClassObject() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/ClassObject/"); + } + + @Test + @TestMetadata("Const") + public void testConst() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/Const/"); + } + + @Test + @TestMetadata("ContextReceivers") + public void testContextReceivers() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/ContextReceivers/"); + } + + @Test + @TestMetadata("Contracts") + public void testContracts() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/Contracts/"); + } + + @Test + @TestMetadata("DataClass") + public void testDataClass() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/DataClass/"); + } + + @Test + @TestMetadata("DefinitelyNotNullTypes") + public void testDefinitelyNotNullTypes() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/DefinitelyNotNullTypes/"); + } + + @Test + @TestMetadata("Delegation") + public void testDelegation() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/Delegation/"); + } + + @Test + @TestMetadata("DependencyOnNestedClasses") + public void testDependencyOnNestedClasses() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/DependencyOnNestedClasses/"); + } + + @Test + @TestMetadata("Enum") + public void testEnum() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/Enum/"); + } + + @Test + @TestMetadata("FlexibleTypes") + public void testFlexibleTypes() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/FlexibleTypes/"); + } + + @Test + @TestMetadata("FunInterfaceDeclaration") + public void testFunInterfaceDeclaration() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/FunInterfaceDeclaration/"); + } + + @Test + @TestMetadata("InheritingClasses") + public void testInheritingClasses() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/InheritingClasses/"); + } + + @Test + @TestMetadata("InnerClassEnumEntry") + public void testInnerClassEnumEntry() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/InnerClassEnumEntry/"); + } + + @Test + @TestMetadata("InnerTypes") + public void testInnerTypes() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/InnerTypes/"); + } + + @Test + @TestMetadata("LocalClass") + public void testLocalClass() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/LocalClass/"); + } + + @Test + @TestMetadata("Modifiers") + public void testModifiers() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/Modifiers/"); + } + + @Test + @TestMetadata("MultifileClass") + public void testMultifileClass() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/MultifileClass/"); + } + + @Test + @TestMetadata("NamedCompanionObject") + public void testNamedCompanionObject() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/NamedCompanionObject/"); + } + + @Test + @TestMetadata("NestedClasses") + public void testNestedClasses() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/NestedClasses/"); + } + + @Test + @TestMetadata("Objects") + public void testObjects() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/Objects/"); + } + + @Test + @TestMetadata("PrivateConstField") + public void testPrivateConstField() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/PrivateConstField/"); + } + + @Test + @TestMetadata("PrivateToThis") + public void testPrivateToThis() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/PrivateToThis/"); + } + + @Test + @TestMetadata("Sealed") + public void testSealed() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/Sealed/"); + } + + @Test + @TestMetadata("SecondaryConstructors") + public void testSecondaryConstructors() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/SecondaryConstructors/"); + } + + @Test + @TestMetadata("SuspendLambda") + public void testSuspendLambda() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/SuspendLambda/"); + } + + @Test + @TestMetadata("TopJvmPackageName") + public void testTopJvmPackageName() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/TopJvmPackageName/"); + } + + @Test + @TestMetadata("TopLevelMembersAnnotatedKt") + public void testTopLevelMembersAnnotatedKt() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/TopLevelMembersAnnotatedKt/"); + } + + @Test + @TestMetadata("TopLevelMembersKt") + public void testTopLevelMembersKt() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/TopLevelMembersKt/"); + } + + @Test + @TestMetadata("TypeAliases") + public void testTypeAliases() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/TypeAliases/"); + } + + @Test + @TestMetadata("TypeBoundsAndDelegationSpecifiers") + public void testTypeBoundsAndDelegationSpecifiers() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/TypeBoundsAndDelegationSpecifiers/"); + } + + @Test + @TestMetadata("TypeModifiers") + public void testTypeModifiers() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/TypeModifiers/"); + } + + @Test + @TestMetadata("TypeParams") + public void testTypeParams() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/TypeParams/"); + } + + @Test + @TestMetadata("Types") + public void testTypes() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/Types/"); + } +} diff --git a/generators/analysis-api-generator/build.gradle.kts b/generators/analysis-api-generator/build.gradle.kts index 388e32ced84..1159fec0475 100644 --- a/generators/analysis-api-generator/build.gradle.kts +++ b/generators/analysis-api-generator/build.gradle.kts @@ -19,6 +19,7 @@ dependencies { testApi(projectTests(":analysis:analysis-api-fe10")) testApi(projectTests(":analysis:analysis-api-standalone")) testApi(projectTests(":analysis:decompiled:decompiler-to-file-stubs")) + testApi(projectTests(":analysis:decompiled:decompiler-to-psi")) testApi(projectTests(":analysis:symbol-light-classes")) testApi(intellijCore()) testApiJUnit5() diff --git a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/decompiled.kt b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/decompiled.kt index d1d3dcf14c3..df6e06c4c8e 100644 --- a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/decompiled.kt +++ b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/decompiled.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.generators.tests.analysis.api +import org.jetbrains.kotlin.analysis.decompiler.psi.AbstractByDecompiledPsiStubBuilderTest import org.jetbrains.kotlin.analysis.decompiler.stub.files.AbstractClsStubBuilderTest import org.jetbrains.kotlin.generators.TestGroupSuite @@ -17,4 +18,13 @@ internal fun TestGroupSuite.generateDecompiledTests() { model("clsFileStubBuilder", extension = null, recursive = false) } } + + testGroup( + "analysis/decompiled/decompiler-to-psi/tests", + "analysis/decompiled/decompiler-to-file-stubs/testData", + ) { + testClass { + model("clsFileStubBuilder", extension = null, recursive = false) + } + } } \ No newline at end of file