From cf98fb56128ba13c02fdf8a53af68e5912b6b008 Mon Sep 17 00:00:00 2001 From: Pavel Kirpichenkov Date: Fri, 25 Aug 2023 18:20:56 +0300 Subject: [PATCH] [Tests] Add .knm stub consistency test The test compares stub trees built from .knm files directly and from the decompiled text. Test data for .class decompiler is reused, JVM-specific cases are ignored KT-61354 --- .../AnnotatedFlexibleTypes.kt | 3 + .../Annotations/Annotations.kt | 4 + .../AnnotationsOnNullableTypes.kt | 2 + .../ContextReceiversOnFunctionType.kt | 2 +- .../LocalClass/LocalClass.kt | 3 + .../clsFileStubBuilder/Modifiers/Modifiers.kt | 4 + .../TopLevelMembersKt/TopLevelMembers.kt | 3 + .../stub/files/AbstractDecompiledClassTest.kt | 10 +- .../stub/files/AbstractStubBuilderTest.kt | 4 +- analysis/decompiled/native/build.gradle.kts | 4 + .../konan/KlibMetadataDecompiler.kt | 4 + ...bstractDecompiledKnmStubConsistencyTest.kt | 172 ++++++++++ ...edKnmStubConsistencyFe10TestGenerated.java | 308 ++++++++++++++++++ ...iledKnmStubConsistencyK2TestGenerated.java | 308 ++++++++++++++++++ .../analysis-api-generator/build.gradle.kts | 1 + .../tests/analysis/api/decompiled.kt | 14 + 16 files changed, 841 insertions(+), 5 deletions(-) create mode 100644 analysis/decompiled/native/tests/org/jetbrains/kotlin/analysis/decompiler/konan/AbstractDecompiledKnmStubConsistencyTest.kt create mode 100644 analysis/decompiled/native/tests/org/jetbrains/kotlin/analysis/decompiler/konan/DecompiledKnmStubConsistencyFe10TestGenerated.java create mode 100644 analysis/decompiled/native/tests/org/jetbrains/kotlin/analysis/decompiler/konan/DecompiledKnmStubConsistencyK2TestGenerated.java diff --git a/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/AnnotatedFlexibleTypes/AnnotatedFlexibleTypes.kt b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/AnnotatedFlexibleTypes/AnnotatedFlexibleTypes.kt index d29f2c788ee..72379a129a9 100644 --- a/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/AnnotatedFlexibleTypes/AnnotatedFlexibleTypes.kt +++ b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/AnnotatedFlexibleTypes/AnnotatedFlexibleTypes.kt @@ -1,3 +1,6 @@ +// KNM_K2_IGNORE +// KNM_FE10_IGNORE + package test public class AnnotatedFlexibleTypes(val javaClass: d.JavaClass) { diff --git a/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/Annotations/Annotations.kt b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/Annotations/Annotations.kt index 80b4bcf9121..87463be2c33 100644 --- a/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/Annotations/Annotations.kt +++ b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/Annotations/Annotations.kt @@ -1,3 +1,7 @@ +// Issue: KTIJ-26788 (need stdlib for lazy) +// KNM_K2_IGNORE +// KNM_FE10_IGNORE + @a public class Annotations private @a constructor(private @property:a @param:a val c1: Int, @property:a @param:a val c2: Int) { @a() val hasValueArguments = 42 diff --git a/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/AnnotationsOnNullableTypes/AnnotationsOnNullableTypes.kt b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/AnnotationsOnNullableTypes/AnnotationsOnNullableTypes.kt index 311a08b5390..b06464e320f 100644 --- a/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/AnnotationsOnNullableTypes/AnnotationsOnNullableTypes.kt +++ b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/AnnotationsOnNullableTypes/AnnotationsOnNullableTypes.kt @@ -1,3 +1,5 @@ +// Issue: KTIJ-26761 +// KNM_K2_IGNORE public class AnnotationsOnNullableTypes { fun B<@A C?>.receiverArgument() {} diff --git a/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/ContextReceiversOnFunctionType/ContextReceiversOnFunctionType.kt b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/ContextReceiversOnFunctionType/ContextReceiversOnFunctionType.kt index 2a7273049c9..c7a95ef351c 100644 --- a/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/ContextReceiversOnFunctionType/ContextReceiversOnFunctionType.kt +++ b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/ContextReceiversOnFunctionType/ContextReceiversOnFunctionType.kt @@ -1,7 +1,7 @@ // FIR_IDENTICAL // JVM_FILE_NAME: ContextReceiversOnFunctionTypeKt // !LANGUAGE: +ContextReceivers - +// KNM_K2_IGNORE fun f(g: context(A, B) Int.(Int) -> Int) {} class A { diff --git a/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/LocalClass/LocalClass.kt b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/LocalClass/LocalClass.kt index c020119eb73..6935059833a 100644 --- a/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/LocalClass/LocalClass.kt +++ b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/LocalClass/LocalClass.kt @@ -1,4 +1,7 @@ // FIR_IDENTICAL +// KNM_K2_IGNORE +// KNM_FE10_IGNORE + package test class LocalClass { diff --git a/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/Modifiers/Modifiers.kt b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/Modifiers/Modifiers.kt index f59daea86a3..d5dde6a9a9e 100644 --- a/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/Modifiers/Modifiers.kt +++ b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/Modifiers/Modifiers.kt @@ -1,3 +1,7 @@ +// Issue: KTIJ-26788 (need stdlib for Continuation) +// KNM_K2_IGNORE +// KNM_FE10_IGNORE + package test import kotlin.coroutines.* diff --git a/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/TopLevelMembersKt/TopLevelMembers.kt b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/TopLevelMembersKt/TopLevelMembers.kt index 3b9ae59b162..557b9a913ba 100644 --- a/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/TopLevelMembersKt/TopLevelMembers.kt +++ b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/TopLevelMembersKt/TopLevelMembers.kt @@ -1,3 +1,6 @@ +// Issue: KTIJ-26761 +// KNM_K2_IGNORE + package foo.TopLevelMembers fun funWithBlockBody() { diff --git a/analysis/decompiled/decompiler-to-file-stubs/tests/org/jetbrains/kotlin/analysis/decompiler/stub/files/AbstractDecompiledClassTest.kt b/analysis/decompiled/decompiler-to-file-stubs/tests/org/jetbrains/kotlin/analysis/decompiler/stub/files/AbstractDecompiledClassTest.kt index 012cbcdfa55..69baa6287db 100644 --- a/analysis/decompiled/decompiler-to-file-stubs/tests/org/jetbrains/kotlin/analysis/decompiler/stub/files/AbstractDecompiledClassTest.kt +++ b/analysis/decompiled/decompiler-to-file-stubs/tests/org/jetbrains/kotlin/analysis/decompiler/stub/files/AbstractDecompiledClassTest.kt @@ -144,9 +144,7 @@ internal data class TestData( 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 mainKotlinFile = findMainTestKotlinFile(directory) val fileText = mainKotlinFile.readText() val jvmFileName = InTextDirectivesUtils.findStringWithPrefixes(fileText, "JVM_FILE_NAME:") ?: directory.name val additionalCompilerOptions = InTextDirectivesUtils.findListWithPrefixes(fileText, "// !LANGUAGE: ").map { "-XXLanguage:$it" } @@ -179,3 +177,9 @@ internal data class TestData( } } +fun findMainTestKotlinFile(directory: Path): Path { + val allFiles = Files.list(directory).collect(Collectors.toList()) + return allFiles.singleOrNull { path: Path -> + path.name.replaceFirstChar { Character.toUpperCase(it) } == "${directory.name.removeSuffix("Kt")}.kt" + } ?: error("Test directory should contain a single primary kt source 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 index 30f9e1897a9..25bd269b808 100644 --- 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 @@ -10,6 +10,7 @@ import com.intellij.psi.PsiElement import com.intellij.psi.impl.DebugUtil import com.intellij.psi.stubs.PsiFileStub import com.intellij.psi.stubs.StubElement +import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.psi.stubs.impl.STUB_TO_STRING_PREFIX import org.jetbrains.kotlin.test.KotlinTestUtils @@ -40,7 +41,8 @@ abstract class AbstractStubBuilderTest : AbstractDecompiledClassTest() { protected abstract fun getStubToTest(classFile: VirtualFile): PsiFileStub<*> } -private fun StubElement.serializeToString(): String { +@TestOnly +fun StubElement.serializeToString(): String { return serializeStubToString(this) } diff --git a/analysis/decompiled/native/build.gradle.kts b/analysis/decompiled/native/build.gradle.kts index 65d071d38a7..8790c026e1d 100644 --- a/analysis/decompiled/native/build.gradle.kts +++ b/analysis/decompiled/native/build.gradle.kts @@ -22,6 +22,10 @@ dependencies { api(project(":js:js.serializer")) api(project(":kotlin-util-klib-metadata")) compileOnly(intellijCore()) + + testImplementation(projectTests(":compiler:tests-common")) + testImplementation(projectTests(":compiler:tests-common-new")) + testImplementation(projectTests(":analysis:decompiled:decompiler-to-file-stubs")) } testsJar() diff --git a/analysis/decompiled/native/src/org/jetbrains/kotlin/analysis/decompiler/konan/KlibMetadataDecompiler.kt b/analysis/decompiled/native/src/org/jetbrains/kotlin/analysis/decompiler/konan/KlibMetadataDecompiler.kt index a46f5d0c2a1..6d56e7cc134 100644 --- a/analysis/decompiled/native/src/org/jetbrains/kotlin/analysis/decompiler/konan/KlibMetadataDecompiler.kt +++ b/analysis/decompiled/native/src/org/jetbrains/kotlin/analysis/decompiler/konan/KlibMetadataDecompiler.kt @@ -9,6 +9,7 @@ import com.intellij.openapi.fileTypes.FileTypeRegistry import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.PsiManager import com.intellij.psi.compiled.ClassFileDecompilers +import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.analysis.decompiler.psi.KotlinDecompiledFileViewProvider import org.jetbrains.kotlin.analysis.decompiler.psi.text.DecompiledText import org.jetbrains.kotlin.analysis.decompiler.psi.text.createIncompatibleAbiVersionDecompiledText @@ -69,4 +70,7 @@ abstract class KlibMetadataDecompiler( null -> createIncompatibleAbiVersionDecompiledText(expectedBinaryVersion(), invalidBinaryVersion()) } } + + @TestOnly + internal fun buildDecompiledTextForTests(virtualFile: VirtualFile): DecompiledText = buildDecompiledText(virtualFile) } \ No newline at end of file diff --git a/analysis/decompiled/native/tests/org/jetbrains/kotlin/analysis/decompiler/konan/AbstractDecompiledKnmStubConsistencyTest.kt b/analysis/decompiled/native/tests/org/jetbrains/kotlin/analysis/decompiler/konan/AbstractDecompiledKnmStubConsistencyTest.kt new file mode 100644 index 00000000000..e414f3a5434 --- /dev/null +++ b/analysis/decompiled/native/tests/org/jetbrains/kotlin/analysis/decompiler/konan/AbstractDecompiledKnmStubConsistencyTest.kt @@ -0,0 +1,172 @@ +/* + * Copyright 2010-2023 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.konan + +import com.intellij.openapi.vfs.VfsUtilCore +import com.intellij.openapi.vfs.VirtualFile +import com.intellij.openapi.vfs.impl.jar.CoreJarFileSystem +import com.intellij.psi.PsiManager +import com.intellij.util.indexing.FileContentImpl +import org.jetbrains.kotlin.analysis.decompiler.stub.files.findMainTestKotlinFile +import org.jetbrains.kotlin.analysis.decompiler.stub.files.serializeToString +import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles +import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment +import org.jetbrains.kotlin.library.KLIB_METADATA_FILE_EXTENSION_WITH_DOT +import org.jetbrains.kotlin.psi.stubs.elements.KtFileStubBuilder +import org.jetbrains.kotlin.test.* +import org.jetbrains.kotlin.test.directives.model.Directive +import org.jetbrains.kotlin.test.directives.model.DirectiveApplicability +import org.jetbrains.kotlin.test.directives.model.SimpleDirective +import org.jetbrains.kotlin.test.directives.model.SimpleDirectivesContainer +import org.jetbrains.kotlin.test.util.KtTestUtil +import org.jetbrains.kotlin.utils.addIfNotNull +import org.junit.Assert +import java.io.File +import java.nio.file.Files +import java.nio.file.Path +import java.nio.file.Paths +import java.util.stream.Collectors +import kotlin.io.path.absolutePathString +import kotlin.io.path.extension + +abstract class AbstractDecompiledKnmStubConsistencyFe10Test : AbstractDecompiledKnmStubConsistencyTest() { + private object Directives : SimpleDirectivesContainer() { + val KNM_FE10_IGNORE by directive( + description = "Ignore test for KNM files with FE10 K/N Decompiler", + applicability = DirectiveApplicability.Global, + ) + } + + override val ignoreDirective: SimpleDirective + get() = Directives.KNM_FE10_IGNORE + + override fun createDecompiler(): KlibMetadataDecompiler<*> { + return KotlinNativeMetadataDecompiler() + } +} + +abstract class AbstractDecompiledKnmStubConsistencyK2Test : AbstractDecompiledKnmStubConsistencyTest() { + private object Directives : SimpleDirectivesContainer() { + val KNM_K2_IGNORE by directive( + description = "Ignore test for KNM files with K2 K/N Decompiler", + applicability = DirectiveApplicability.Global, + ) + } + + override val ignoreDirective: SimpleDirective + get() = Directives.KNM_K2_IGNORE + + override fun createDecompiler(): KlibMetadataDecompiler<*> { + return K2KotlinNativeMetadataDecompiler() + } +} + + +abstract class AbstractDecompiledKnmStubConsistencyTest : KotlinTestWithEnvironment() { + abstract val ignoreDirective: Directive + abstract fun createDecompiler(): KlibMetadataDecompiler<*> + + override fun createEnvironment(): KotlinCoreEnvironment { + return KotlinCoreEnvironment.createForTests( + ApplicationEnvironmentDisposer.ROOT_DISPOSABLE, + KotlinTestUtils.newConfiguration( + ConfigurationKind.JDK_NO_RUNTIME, + TestJdkKind.MOCK_JDK, + ), + EnvironmentConfigFiles.METADATA_CONFIG_FILES, + ) + } + + override fun setUp() { + super.setUp() + + environment.projectEnvironment.environment.registerFileType( + KlibMetaFileType, KlibMetaFileType.defaultExtension + ) + } + + fun runTest(testDirectory: String) { + val testDirectoryPath = Paths.get(testDirectory) + withKnmIgnoreDirective(testDirectoryPath) { doTest(testDirectoryPath) } + } + + private fun isTestIgnored(testDirectory: Path): Boolean { + val mainKotlinFile = findMainTestKotlinFile(testDirectory).toFile() + return InTextDirectivesUtils.isDirectiveDefined(mainKotlinFile.readText(), "// ${ignoreDirective.name}") + } + + private fun withKnmIgnoreDirective(testDirectory: Path, block: () -> Unit) { + val isIgnored = isTestIgnored(testDirectory) + + try { + block() + } catch (e: Throwable) { + if (isIgnored) return + else throw e + } + + if (isIgnored) error("The test is passing. Please, remove the `// ${ignoreDirective.name}` directive") + } + + private fun doTest(testDirectoryPath: Path) { + val commonKlib = compileCommonKlib(testDirectoryPath) + val files = getKnmFilesFromKlib(commonKlib) + + for (knmFile in files) { + checkKnmStubConsistency(knmFile) + } + } + + private fun compileCommonKlib(testDirectory: Path): File { + val ktFiles = Files.list(testDirectory).filter { it.extension == "kt" }.collect(Collectors.toList()) + val testKlib = KtTestUtil.tmpDir("testLibrary").resolve("library.klib") + KlibTestUtil.compileCommonSourcesToKlib( + ktFiles.map(Path::toFile), + libraryName = "library", + testKlib, + ) + + return testKlib + } + + private fun getKnmFilesFromKlib(klib: File): List { + val path = klib.toPath() + val jarFileSystem = environment.projectEnvironment.environment.jarFileSystem as CoreJarFileSystem + val root = jarFileSystem.refreshAndFindFileByPath(path.absolutePathString() + "!/")!! + val files = mutableListOf() + VfsUtilCore.iterateChildrenRecursively( + root, + { virtualFile -> virtualFile.isDirectory || virtualFile.name.endsWith(KLIB_METADATA_FILE_EXTENSION_WITH_DOT) }, + { virtualFile -> + if (!virtualFile.isDirectory) { + files.addIfNotNull(virtualFile) + } + true + }) + + return files + } + + private fun checkKnmStubConsistency(knmFile: VirtualFile) { + val stubTreeBinaryFile = createDecompiler().stubBuilder.buildFileStub(FileContentImpl.createByFile(knmFile, environment.project))!! + + val fileViewProviderForDecompiledFile = K2KotlinNativeMetadataDecompiler().createFileViewProvider( + knmFile, PsiManager.getInstance(project), physical = false, + ) + + val stubTreeForDecompiledFile = KtFileStubBuilder().buildStubTree( + KlibDecompiledFile(fileViewProviderForDecompiledFile) { virtualFile -> + createDecompiler().buildDecompiledTextForTests(virtualFile) + } + ) + + Assert.assertEquals( + "PSI and deserialized stubs don't match", + stubTreeForDecompiledFile.serializeToString(), + stubTreeBinaryFile.serializeToString() + ) + } +} diff --git a/analysis/decompiled/native/tests/org/jetbrains/kotlin/analysis/decompiler/konan/DecompiledKnmStubConsistencyFe10TestGenerated.java b/analysis/decompiled/native/tests/org/jetbrains/kotlin/analysis/decompiler/konan/DecompiledKnmStubConsistencyFe10TestGenerated.java new file mode 100644 index 00000000000..c7062610f0e --- /dev/null +++ b/analysis/decompiled/native/tests/org/jetbrains/kotlin/analysis/decompiler/konan/DecompiledKnmStubConsistencyFe10TestGenerated.java @@ -0,0 +1,308 @@ +/* + * Copyright 2010-2023 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.konan; + +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 org.jetbrains.kotlin.generators.tests.analysis.api.GenerateAnalysisApiTestsKt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder") +@TestDataPath("$PROJECT_ROOT") +public class DecompiledKnmStubConsistencyFe10TestGenerated extends AbstractDecompiledKnmStubConsistencyFe10Test { + @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("ContextReceiversCallableMembers") + public void testContextReceiversCallableMembers() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/ContextReceiversCallableMembers/"); + } + + @Test + @TestMetadata("ContextReceiversOnClass") + public void testContextReceiversOnClass() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/ContextReceiversOnClass/"); + } + + @Test + @TestMetadata("ContextReceiversOnFunctionType") + public void testContextReceiversOnFunctionType() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/ContextReceiversOnFunctionType/"); + } + + @Test + @TestMetadata("ContextReceiversOnTopLevelCallables") + public void testContextReceiversOnTopLevelCallables() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/ContextReceiversOnTopLevelCallables/"); + } + + @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("SpecialNames") + public void testSpecialNames() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/SpecialNames/"); + } + + @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/analysis/decompiled/native/tests/org/jetbrains/kotlin/analysis/decompiler/konan/DecompiledKnmStubConsistencyK2TestGenerated.java b/analysis/decompiled/native/tests/org/jetbrains/kotlin/analysis/decompiler/konan/DecompiledKnmStubConsistencyK2TestGenerated.java new file mode 100644 index 00000000000..6e93e561154 --- /dev/null +++ b/analysis/decompiled/native/tests/org/jetbrains/kotlin/analysis/decompiler/konan/DecompiledKnmStubConsistencyK2TestGenerated.java @@ -0,0 +1,308 @@ +/* + * Copyright 2010-2023 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.konan; + +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 org.jetbrains.kotlin.generators.tests.analysis.api.GenerateAnalysisApiTestsKt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder") +@TestDataPath("$PROJECT_ROOT") +public class DecompiledKnmStubConsistencyK2TestGenerated extends AbstractDecompiledKnmStubConsistencyK2Test { + @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("ContextReceiversCallableMembers") + public void testContextReceiversCallableMembers() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/ContextReceiversCallableMembers/"); + } + + @Test + @TestMetadata("ContextReceiversOnClass") + public void testContextReceiversOnClass() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/ContextReceiversOnClass/"); + } + + @Test + @TestMetadata("ContextReceiversOnFunctionType") + public void testContextReceiversOnFunctionType() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/ContextReceiversOnFunctionType/"); + } + + @Test + @TestMetadata("ContextReceiversOnTopLevelCallables") + public void testContextReceiversOnTopLevelCallables() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/ContextReceiversOnTopLevelCallables/"); + } + + @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("SpecialNames") + public void testSpecialNames() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/SpecialNames/"); + } + + @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 bf2eeb81ca2..9dd7d0f4281 100644 --- a/generators/analysis-api-generator/build.gradle.kts +++ b/generators/analysis-api-generator/build.gradle.kts @@ -23,6 +23,7 @@ dependencies { testImplementation(projectTests(":analysis:decompiled:decompiler-to-file-stubs")) testImplementation(projectTests(":analysis:decompiled:decompiler-to-psi")) testImplementation(projectTests(":analysis:symbol-light-classes")) + testImplementation(projectTests(":analysis:decompiled:native")) testImplementation(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 533bc7fe8ea..bae81659e5b 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,8 @@ package org.jetbrains.kotlin.generators.tests.analysis.api +import org.jetbrains.kotlin.analysis.decompiler.konan.AbstractDecompiledKnmStubConsistencyFe10Test +import org.jetbrains.kotlin.analysis.decompiler.konan.AbstractDecompiledKnmStubConsistencyK2Test import org.jetbrains.kotlin.analysis.decompiler.psi.AbstractByDecompiledPsiStubBuilderK2CompilerTest import org.jetbrains.kotlin.analysis.decompiler.psi.AbstractByDecompiledPsiStubBuilderTest import org.jetbrains.kotlin.analysis.decompiler.stub.files.AbstractAdditionalStubInfoK2CompilerTest @@ -52,4 +54,16 @@ internal fun TestGroupSuite.generateDecompiledTests() { model("clsFileStubBuilder", extension = null, recursive = false) } } + + testGroup( + "analysis/decompiled/native/tests", + "analysis/decompiled/decompiler-to-file-stubs/testData", + ) { + testClass { + model("clsFileStubBuilder", extension = null, recursive = false) + } + testClass { + model("clsFileStubBuilder", extension = null, recursive = false) + } + } } \ No newline at end of file