Remove "legacy" mode of jvm-abi-gen plugin
#KT-55375 Fixed
This commit is contained in:
committed by
Space Team
parent
77c68fc809
commit
9f269b83aa
@@ -461,10 +461,7 @@ public class FunctionCodegen {
|
|||||||
boolean staticInCompanionObject
|
boolean staticInCompanionObject
|
||||||
) {
|
) {
|
||||||
OwnerKind contextKind = methodContext.getContextKind();
|
OwnerKind contextKind = methodContext.getContextKind();
|
||||||
if (!state.getClassBuilderMode().generateBodies
|
if (!state.getClassBuilderMode().generateBodies || isAbstractMethod(functionDescriptor, contextKind, state.getJvmDefaultMode())) {
|
||||||
|| isAbstractMethod(functionDescriptor, contextKind, state.getJvmDefaultMode())
|
|
||||||
|| shouldSkipMethodBodyInAbiMode(state.getClassBuilderMode(), origin)
|
|
||||||
) {
|
|
||||||
generateLocalVariableTable(
|
generateLocalVariableTable(
|
||||||
mv,
|
mv,
|
||||||
jvmSignature,
|
jvmSignature,
|
||||||
@@ -497,13 +494,6 @@ public class FunctionCodegen {
|
|||||||
endVisit(mv, null, origin.getElement());
|
endVisit(mv, null, origin.getElement());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean shouldSkipMethodBodyInAbiMode(@NotNull ClassBuilderMode classBuilderMode, @NotNull JvmDeclarationOrigin origin) {
|
|
||||||
if (classBuilderMode != ClassBuilderMode.ABI) return false;
|
|
||||||
|
|
||||||
DeclarationDescriptor descriptor = origin.getDescriptor();
|
|
||||||
return descriptor != null && !InlineUtil.isInlineOrContainingInline(descriptor);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void generateParameterAnnotations(
|
public static void generateParameterAnnotations(
|
||||||
@NotNull FunctionDescriptor functionDescriptor,
|
@NotNull FunctionDescriptor functionDescriptor,
|
||||||
@NotNull MethodVisitor mv,
|
@NotNull MethodVisitor mv,
|
||||||
|
|||||||
@@ -179,24 +179,6 @@ fun main(args: Array<String>) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
testGroup(
|
|
||||||
"plugins/jvm-abi-gen/test", "plugins/jvm-abi-gen/testData",
|
|
||||||
testRunnerMethodName = "runTestWithCustomIgnoreDirective",
|
|
||||||
additionalRunnerArguments = listOf("\"// IGNORE_BACKEND_LEGACY: \"")
|
|
||||||
) {
|
|
||||||
testClass<AbstractLegacyCompareJvmAbiTest> {
|
|
||||||
model("compare", recursive = false, extension = null, targetBackend = TargetBackend.JVM_IR)
|
|
||||||
}
|
|
||||||
|
|
||||||
testClass<AbstractLegacyJvmAbiContentTest> {
|
|
||||||
model("content", recursive = false, extension = null, targetBackend = TargetBackend.JVM_IR)
|
|
||||||
}
|
|
||||||
|
|
||||||
testClass<AbstractLegacyCompileAgainstJvmAbiTest> {
|
|
||||||
model("compile", recursive = false, extension = null, targetBackend = TargetBackend.JVM_IR)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
testGroup("plugins/sam-with-receiver/tests-gen", "plugins/sam-with-receiver/testData") {
|
testGroup("plugins/sam-with-receiver/tests-gen", "plugins/sam-with-receiver/testData") {
|
||||||
testClass<AbstractSamWithReceiverScriptTest> {
|
testClass<AbstractSamWithReceiverScriptTest> {
|
||||||
model("script", extension = "kts")
|
model("script", extension = "kts")
|
||||||
|
|||||||
-239
@@ -1,239 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2018 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.jvm.abi
|
|
||||||
|
|
||||||
import com.intellij.openapi.project.Project
|
|
||||||
import com.intellij.openapi.util.io.FileUtil
|
|
||||||
import org.jetbrains.kotlin.analyzer.AnalysisResult
|
|
||||||
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
|
|
||||||
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
|
|
||||||
import org.jetbrains.kotlin.cli.common.messages.MessageRenderer
|
|
||||||
import org.jetbrains.kotlin.cli.common.messages.OutputMessageUtil
|
|
||||||
import org.jetbrains.kotlin.cli.common.messages.PrintingMessageCollector
|
|
||||||
import org.jetbrains.kotlin.codegen.*
|
|
||||||
import org.jetbrains.kotlin.codegen.state.GenerationState
|
|
||||||
import org.jetbrains.kotlin.compilerRunner.OutputItemsCollector
|
|
||||||
import org.jetbrains.kotlin.config.CommonConfigurationKeys
|
|
||||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
|
||||||
import org.jetbrains.kotlin.config.JVMConfigurationKeys
|
|
||||||
import org.jetbrains.kotlin.config.languageVersionSettings
|
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
|
||||||
import org.jetbrains.kotlin.diagnostics.Severity
|
|
||||||
import org.jetbrains.kotlin.incremental.isClassFile
|
|
||||||
import org.jetbrains.kotlin.jvm.abi.asm.AbiClassBuilder
|
|
||||||
import org.jetbrains.kotlin.jvm.abi.asm.FilterInnerClassesVisitor
|
|
||||||
import org.jetbrains.kotlin.jvm.abi.asm.InnerClassesCollectingVisitor
|
|
||||||
import org.jetbrains.kotlin.load.kotlin.FileBasedKotlinClass
|
|
||||||
import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader
|
|
||||||
import org.jetbrains.kotlin.metadata.ProtoBuf
|
|
||||||
import org.jetbrains.kotlin.metadata.deserialization.Flags
|
|
||||||
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil
|
|
||||||
import org.jetbrains.kotlin.modules.TargetId
|
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
|
||||||
import org.jetbrains.kotlin.resolve.BindingTrace
|
|
||||||
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
|
|
||||||
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin
|
|
||||||
import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisHandlerExtension
|
|
||||||
import org.jetbrains.kotlin.utils.toMetadataVersion
|
|
||||||
import org.jetbrains.org.objectweb.asm.ClassReader
|
|
||||||
import org.jetbrains.org.objectweb.asm.ClassVisitor
|
|
||||||
import org.jetbrains.org.objectweb.asm.ClassWriter
|
|
||||||
import org.jetbrains.org.objectweb.asm.Opcodes
|
|
||||||
import java.io.File
|
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
class JvmAbiAnalysisHandlerExtension(
|
|
||||||
compilerConfiguration: CompilerConfiguration
|
|
||||||
) : AnalysisHandlerExtension {
|
|
||||||
private val compilerConfiguration: CompilerConfiguration = compilerConfiguration.copy().apply {
|
|
||||||
put(JVMConfigurationKeys.IR, false)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun analysisCompleted(
|
|
||||||
project: Project,
|
|
||||||
module: ModuleDescriptor,
|
|
||||||
bindingTrace: BindingTrace,
|
|
||||||
files: Collection<KtFile>
|
|
||||||
): AnalysisResult? {
|
|
||||||
val bindingContext = bindingTrace.bindingContext
|
|
||||||
if (bindingContext.diagnostics.any { it.severity == Severity.ERROR }) return null
|
|
||||||
|
|
||||||
val targetId = TargetId(
|
|
||||||
name = compilerConfiguration[CommonConfigurationKeys.MODULE_NAME] ?: module.name.asString(),
|
|
||||||
type = "java-production"
|
|
||||||
)
|
|
||||||
|
|
||||||
val generationState = GenerationState.Builder(
|
|
||||||
project,
|
|
||||||
AbiBinaries,
|
|
||||||
module,
|
|
||||||
bindingContext,
|
|
||||||
compilerConfiguration
|
|
||||||
).targetId(targetId).build()
|
|
||||||
KotlinCodegenFacade.compileCorrectFiles(files, generationState, DefaultCodegenFactory)
|
|
||||||
|
|
||||||
val outputDir = compilerConfiguration.get(JVMConfigurationKeys.OUTPUT_DIRECTORY)!!
|
|
||||||
val outputs = ArrayList<AbiOutput>()
|
|
||||||
|
|
||||||
for (outputFile in generationState.factory.asList()) {
|
|
||||||
val file = File(outputDir, outputFile.relativePath)
|
|
||||||
outputs.add(AbiOutput(file, outputFile.sourceFiles, outputFile.asByteArray()))
|
|
||||||
}
|
|
||||||
|
|
||||||
// private/local/synthetic class removal is temporarily turned off, because the implementation
|
|
||||||
// was not correct: it was not taking into account that private/local classes could be used
|
|
||||||
// from inline functions
|
|
||||||
// todo: implement correct removal
|
|
||||||
//removeUnneededClasses(outputs)
|
|
||||||
|
|
||||||
val messageCollector = compilerConfiguration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY)
|
|
||||||
?: PrintingMessageCollector(System.err, MessageRenderer.PLAIN_FULL_PATHS, false)
|
|
||||||
val reportOutputFiles = generationState.configuration.getBoolean(CommonConfigurationKeys.REPORT_OUTPUT_FILES)
|
|
||||||
val outputItemsCollector =
|
|
||||||
OutputItemsCollector { sourceFiles, outputFile ->
|
|
||||||
messageCollector.report(CompilerMessageSeverity.OUTPUT, OutputMessageUtil.formatOutputMessage(sourceFiles, outputFile))
|
|
||||||
}.takeIf { reportOutputFiles }
|
|
||||||
outputs.forEach { it.flush(outputItemsCollector) }
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes private or local classes from outputs
|
|
||||||
*/
|
|
||||||
// todo: fix usage (see analysisCompleted)
|
|
||||||
@Suppress("unused")
|
|
||||||
private fun removeUnneededClasses(outputs: Iterable<AbiOutput>) {
|
|
||||||
// maps internal names of classes: class -> inner classes
|
|
||||||
val innerClasses = HashMap<String, Collection<String>>()
|
|
||||||
val internalNameToFile = HashMap<String, File>()
|
|
||||||
|
|
||||||
for (output in outputs) {
|
|
||||||
if (!output.file.isClassFile()) continue
|
|
||||||
|
|
||||||
val visitor = InnerClassesCollectingVisitor()
|
|
||||||
output.accept(visitor)
|
|
||||||
val outputInternalName = visitor.ownInternalName
|
|
||||||
internalNameToFile[outputInternalName] = output.file
|
|
||||||
innerClasses[outputInternalName] = visitor.innerClasses
|
|
||||||
}
|
|
||||||
|
|
||||||
// internal names of removed files
|
|
||||||
val classesToRemoveQueue = ArrayDeque<String>()
|
|
||||||
for (output in outputs) {
|
|
||||||
if (!output.file.isClassFile()) continue
|
|
||||||
|
|
||||||
val classData = output.classData(compilerConfiguration) ?: continue
|
|
||||||
val header = classData.classHeader
|
|
||||||
val isNeededForAbi = when (header.kind) {
|
|
||||||
KotlinClassHeader.Kind.CLASS -> {
|
|
||||||
val (_, classProto) = JvmProtoBufUtil.readClassDataFrom(header.data!!, header.strings!!)
|
|
||||||
val visibility = Flags.VISIBILITY.get(classProto.flags)
|
|
||||||
visibility != ProtoBuf.Visibility.PRIVATE && visibility != ProtoBuf.Visibility.LOCAL
|
|
||||||
}
|
|
||||||
KotlinClassHeader.Kind.SYNTHETIC_CLASS -> false
|
|
||||||
else -> true
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isNeededForAbi) {
|
|
||||||
val jvmClassName = JvmClassName.byClassId(classData.classId)
|
|
||||||
classesToRemoveQueue.add(jvmClassName.internalName)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// we can remove inner classes of removed classes
|
|
||||||
val classesToRemove = HashSet<String>()
|
|
||||||
classesToRemove.addAll(classesToRemoveQueue)
|
|
||||||
while (classesToRemoveQueue.isNotEmpty()) {
|
|
||||||
val classToRemove = classesToRemoveQueue.removeFirst()
|
|
||||||
innerClasses[classToRemove]?.forEach {
|
|
||||||
if (classesToRemove.add(it)) {
|
|
||||||
classesToRemoveQueue.add(it)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val classFilesToRemove = classesToRemove.mapTo(HashSet()) { internalNameToFile[it] }
|
|
||||||
for (output in outputs) {
|
|
||||||
if (!output.file.isClassFile()) continue
|
|
||||||
|
|
||||||
if (output.file in classFilesToRemove) {
|
|
||||||
output.delete()
|
|
||||||
} else {
|
|
||||||
output.transform { writer ->
|
|
||||||
FilterInnerClassesVisitor(classesToRemove, Opcodes.API_VERSION, writer)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private object AbiBinaries : ClassBuilderFactory {
|
|
||||||
override fun getClassBuilderMode(): ClassBuilderMode =
|
|
||||||
ClassBuilderMode.ABI
|
|
||||||
|
|
||||||
override fun newClassBuilder(origin: JvmDeclarationOrigin): ClassBuilder =
|
|
||||||
AbiClassBuilder(ClassWriter(0))
|
|
||||||
|
|
||||||
override fun asText(builder: ClassBuilder): String =
|
|
||||||
throw UnsupportedOperationException("AbiBinaries generator asked for text")
|
|
||||||
|
|
||||||
override fun asBytes(builder: ClassBuilder): ByteArray {
|
|
||||||
val visitor = builder.visitor as ClassWriter
|
|
||||||
return visitor.toByteArray()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun close() {}
|
|
||||||
}
|
|
||||||
|
|
||||||
private data class ClassData(
|
|
||||||
val classId: ClassId,
|
|
||||||
val classVersion: Int,
|
|
||||||
val classHeader: KotlinClassHeader
|
|
||||||
)
|
|
||||||
|
|
||||||
private class AbiOutput(
|
|
||||||
val file: File,
|
|
||||||
val sources: List<File>,
|
|
||||||
// null bytes means that file should not be written
|
|
||||||
private var bytes: ByteArray?
|
|
||||||
) {
|
|
||||||
fun classData(compilerConfiguration: CompilerConfiguration): ClassData? =
|
|
||||||
when {
|
|
||||||
bytes == null -> null
|
|
||||||
!file.isClassFile() -> null
|
|
||||||
else -> FileBasedKotlinClass.create(
|
|
||||||
bytes!!, compilerConfiguration.languageVersionSettings.languageVersion.toMetadataVersion()
|
|
||||||
) { classId, classVersion, classHeader, _ ->
|
|
||||||
ClassData(classId, classVersion, classHeader)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun delete() {
|
|
||||||
bytes = null
|
|
||||||
}
|
|
||||||
|
|
||||||
fun transform(fn: (writer: ClassWriter) -> ClassVisitor) {
|
|
||||||
val bytes = bytes ?: return
|
|
||||||
val cr = ClassReader(bytes)
|
|
||||||
val cw = ClassWriter(0)
|
|
||||||
val visitor = fn(cw)
|
|
||||||
cr.accept(visitor, 0)
|
|
||||||
this.bytes = cw.toByteArray()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun accept(visitor: ClassVisitor) {
|
|
||||||
val bytes = bytes ?: return
|
|
||||||
val cr = ClassReader(bytes)
|
|
||||||
cr.accept(visitor, 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun flush(outputItemsCollector: OutputItemsCollector?) {
|
|
||||||
val bytes = bytes ?: return
|
|
||||||
outputItemsCollector?.add(sources, file)
|
|
||||||
FileUtil.writeToFile(file, bytes)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -22,27 +22,18 @@ class JvmAbiCommandLineProcessor : CommandLineProcessor {
|
|||||||
"Output path for generated files. This can be either a directory or a jar file.",
|
"Output path for generated files. This can be either a directory or a jar file.",
|
||||||
true
|
true
|
||||||
)
|
)
|
||||||
|
|
||||||
val LEGACY_ABI_GEN_OPTION: CliOption =
|
|
||||||
CliOption(
|
|
||||||
"useLegacyAbiGen",
|
|
||||||
"true|false",
|
|
||||||
"Use the legacy two pass implementation of jvm-abi-gen.",
|
|
||||||
false
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override val pluginId: String
|
override val pluginId: String
|
||||||
get() = COMPILER_PLUGIN_ID
|
get() = COMPILER_PLUGIN_ID
|
||||||
|
|
||||||
override val pluginOptions: Collection<CliOption>
|
override val pluginOptions: Collection<CliOption>
|
||||||
get() = listOf(OUTPUT_PATH_OPTION, LEGACY_ABI_GEN_OPTION)
|
get() = listOf(OUTPUT_PATH_OPTION)
|
||||||
|
|
||||||
override fun processOption(option: AbstractCliOption, value: String, configuration: CompilerConfiguration) {
|
override fun processOption(option: AbstractCliOption, value: String, configuration: CompilerConfiguration) {
|
||||||
when (option) {
|
when (option) {
|
||||||
OUTPUT_PATH_OPTION -> configuration.put(JvmAbiConfigurationKeys.OUTPUT_PATH, value)
|
OUTPUT_PATH_OPTION -> configuration.put(JvmAbiConfigurationKeys.OUTPUT_PATH, value)
|
||||||
LEGACY_ABI_GEN_OPTION -> configuration.put(JvmAbiConfigurationKeys.LEGACY_ABI_GEN, value == "true")
|
|
||||||
else -> throw CliOptionProcessingException("Unknown option: ${option.optionName}")
|
else -> throw CliOptionProcessingException("Unknown option: ${option.optionName}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,47 +6,23 @@
|
|||||||
package org.jetbrains.kotlin.jvm.abi
|
package org.jetbrains.kotlin.jvm.abi
|
||||||
|
|
||||||
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
|
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
|
||||||
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
|
|
||||||
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
|
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
|
||||||
import org.jetbrains.kotlin.codegen.extensions.ClassBuilderInterceptorExtension
|
import org.jetbrains.kotlin.codegen.extensions.ClassBuilderInterceptorExtension
|
||||||
import org.jetbrains.kotlin.codegen.extensions.ClassFileFactoryFinalizerExtension
|
import org.jetbrains.kotlin.codegen.extensions.ClassFileFactoryFinalizerExtension
|
||||||
import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar
|
import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar
|
||||||
import org.jetbrains.kotlin.config.CommonConfigurationKeys
|
|
||||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
import org.jetbrains.kotlin.config.CompilerConfiguration
|
||||||
import org.jetbrains.kotlin.config.JVMConfigurationKeys
|
import org.jetbrains.kotlin.config.JVMConfigurationKeys
|
||||||
import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisHandlerExtension
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
class JvmAbiComponentRegistrar : CompilerPluginRegistrar() {
|
class JvmAbiComponentRegistrar : CompilerPluginRegistrar() {
|
||||||
override fun ExtensionStorage.registerExtensions(configuration: CompilerConfiguration) {
|
override fun ExtensionStorage.registerExtensions(configuration: CompilerConfiguration) {
|
||||||
val outputPath = configuration.getNotNull(JvmAbiConfigurationKeys.OUTPUT_PATH)
|
val outputPath = configuration.getNotNull(JvmAbiConfigurationKeys.OUTPUT_PATH)
|
||||||
val messageCollector = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, MessageCollector.NONE)
|
val messageCollector = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, MessageCollector.NONE)
|
||||||
if (configuration.get(JvmAbiConfigurationKeys.LEGACY_ABI_GEN, false)) {
|
configuration.put(JVMConfigurationKeys.RETAIN_OUTPUT_IN_MEMORY, true)
|
||||||
if (configuration.getBoolean(CommonConfigurationKeys.USE_FIR)) {
|
val builderExtension = JvmAbiClassBuilderInterceptor()
|
||||||
messageCollector.report(CompilerMessageSeverity.ERROR, "Legacy jvm-abi-gen does not support K2 compiler.")
|
val outputExtension = JvmAbiOutputExtension(File(outputPath), builderExtension.abiClassInfo, messageCollector)
|
||||||
} else {
|
ClassBuilderInterceptorExtension.registerExtension(builderExtension)
|
||||||
messageCollector.report(
|
ClassFileFactoryFinalizerExtension.registerExtension(outputExtension)
|
||||||
CompilerMessageSeverity.STRONG_WARNING,
|
|
||||||
"Legacy jvm-abi-gen is deprecated and will be removed in a future version. " +
|
|
||||||
"Please migrate to the new jvm-abi-gen implementation."
|
|
||||||
)
|
|
||||||
}
|
|
||||||
// Use the two-pass implementation
|
|
||||||
if (outputPath.endsWith(".jar")) {
|
|
||||||
messageCollector.report(CompilerMessageSeverity.ERROR, "Legacy jvm-abi-gen does not support jar output.")
|
|
||||||
}
|
|
||||||
val extension = JvmAbiAnalysisHandlerExtension(configuration.copy().apply {
|
|
||||||
put(JVMConfigurationKeys.OUTPUT_DIRECTORY, File(outputPath))
|
|
||||||
})
|
|
||||||
AnalysisHandlerExtension.registerExtension(extension)
|
|
||||||
} else {
|
|
||||||
// Use the single-pass implementation, using the new ABI flag in the metadata.
|
|
||||||
configuration.put(JVMConfigurationKeys.RETAIN_OUTPUT_IN_MEMORY, true)
|
|
||||||
val builderExtension = JvmAbiClassBuilderInterceptor()
|
|
||||||
val outputExtension = JvmAbiOutputExtension(File(outputPath), builderExtension.abiClassInfo, messageCollector)
|
|
||||||
ClassBuilderInterceptorExtension.registerExtension( builderExtension)
|
|
||||||
ClassFileFactoryFinalizerExtension.registerExtension( outputExtension)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override val supportsK2: Boolean
|
override val supportsK2: Boolean
|
||||||
|
|||||||
@@ -9,8 +9,5 @@ import org.jetbrains.kotlin.config.CompilerConfigurationKey
|
|||||||
|
|
||||||
object JvmAbiConfigurationKeys {
|
object JvmAbiConfigurationKeys {
|
||||||
val OUTPUT_PATH: CompilerConfigurationKey<String> =
|
val OUTPUT_PATH: CompilerConfigurationKey<String> =
|
||||||
CompilerConfigurationKey.create<String>(JvmAbiCommandLineProcessor.OUTPUT_PATH_OPTION.description)
|
CompilerConfigurationKey.create(JvmAbiCommandLineProcessor.OUTPUT_PATH_OPTION.description)
|
||||||
|
}
|
||||||
val LEGACY_ABI_GEN: CompilerConfigurationKey<Boolean> =
|
|
||||||
CompilerConfigurationKey.create<Boolean>(JvmAbiCommandLineProcessor.LEGACY_ABI_GEN_OPTION.description)
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,88 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2018 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.jvm.abi.asm
|
|
||||||
|
|
||||||
import com.intellij.psi.PsiElement
|
|
||||||
import org.jetbrains.kotlin.codegen.AbstractClassBuilder
|
|
||||||
import org.jetbrains.kotlin.descriptors.MemberDescriptor
|
|
||||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
|
||||||
import org.jetbrains.kotlin.resolve.inline.InlineUtil.isInlineOrContainingInline
|
|
||||||
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin
|
|
||||||
import org.jetbrains.org.objectweb.asm.ClassVisitor
|
|
||||||
import org.jetbrains.org.objectweb.asm.FieldVisitor
|
|
||||||
import org.jetbrains.org.objectweb.asm.MethodVisitor
|
|
||||||
import org.jetbrains.org.objectweb.asm.Opcodes
|
|
||||||
|
|
||||||
internal class AbiClassBuilder(private val cv: ClassVisitor) : AbstractClassBuilder() {
|
|
||||||
override fun getVisitor(): ClassVisitor = cv
|
|
||||||
|
|
||||||
override fun newMethod(
|
|
||||||
origin: JvmDeclarationOrigin,
|
|
||||||
access: Int,
|
|
||||||
name: String,
|
|
||||||
desc: String,
|
|
||||||
signature: String?,
|
|
||||||
exceptions: Array<out String>?
|
|
||||||
): MethodVisitor {
|
|
||||||
// if both descriptor's and access's visibilities are private, we can generate an empty method
|
|
||||||
// 1. we need to check a descriptor, because inline reified functions
|
|
||||||
// might have a non-private visibility in ABI, but they are private in bytecode
|
|
||||||
// 2. we need to check an access, because synthetic methods
|
|
||||||
// for default parameters have private visibility, but public in bytecode
|
|
||||||
val descriptor = origin.descriptor as? MemberDescriptor
|
|
||||||
if (isPrivate(access) && descriptor != null && isPrivate(descriptor) || isClinit(name, access)) return EMPTY_METHOD_VISITOR
|
|
||||||
|
|
||||||
val mv = super.newMethod(origin, access, name, desc, signature, exceptions)
|
|
||||||
// inline function bodies are part of ABI,
|
|
||||||
// but non-inline functions can be thrown out
|
|
||||||
if (isInlineOrContainingInline(descriptor)) return mv
|
|
||||||
|
|
||||||
return ReplaceWithEmptyMethodVisitor(
|
|
||||||
delegate = mv,
|
|
||||||
access = access,
|
|
||||||
name = name,
|
|
||||||
desc = desc,
|
|
||||||
signature = signature,
|
|
||||||
exceptions = exceptions
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun newField(
|
|
||||||
origin: JvmDeclarationOrigin,
|
|
||||||
access: Int,
|
|
||||||
name: String,
|
|
||||||
desc: String,
|
|
||||||
signature: String?,
|
|
||||||
value: Any?
|
|
||||||
): FieldVisitor {
|
|
||||||
if (isPrivate(access) && !isInlineOrContainingInline(origin.descriptor)) return EMPTY_FIELD_VISITOR
|
|
||||||
|
|
||||||
return super.newField(origin, access, name, desc, signature, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun defineClass(
|
|
||||||
origin: PsiElement?,
|
|
||||||
version: Int,
|
|
||||||
access: Int,
|
|
||||||
name: String,
|
|
||||||
signature: String?,
|
|
||||||
superName: String,
|
|
||||||
interfaces: Array<out String>
|
|
||||||
) {
|
|
||||||
if (isPrivate(access)) return
|
|
||||||
|
|
||||||
super.defineClass(origin, version, access, name, signature, superName, interfaces)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun isPrivate(descriptor: MemberDescriptor): Boolean =
|
|
||||||
descriptor.visibility == DescriptorVisibilities.PRIVATE
|
|
||||||
|
|
||||||
private fun isPrivate(access: Int): Boolean =
|
|
||||||
(access and Opcodes.ACC_PRIVATE) == Opcodes.ACC_PRIVATE
|
|
||||||
|
|
||||||
private fun isClinit(name: String, access: Int): Boolean =
|
|
||||||
name == "<clinit>" && (access and Opcodes.ACC_STATIC) == Opcodes.ACC_STATIC
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2018 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.jvm.abi.asm
|
|
||||||
|
|
||||||
import org.jetbrains.org.objectweb.asm.ClassVisitor
|
|
||||||
|
|
||||||
internal class FilterInnerClassesVisitor(
|
|
||||||
private val innerClassesToFilter: Set<String>,
|
|
||||||
api: Int,
|
|
||||||
cv: ClassVisitor
|
|
||||||
) : ClassVisitor(api, cv) {
|
|
||||||
override fun visitInnerClass(name: String, outerName: String?, innerName: String?, access: Int) {
|
|
||||||
if (name in innerClassesToFilter) return
|
|
||||||
|
|
||||||
super.visitInnerClass(name, outerName, innerName, access)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-30
@@ -1,30 +0,0 @@
|
|||||||
package org.jetbrains.kotlin.jvm.abi.asm
|
|
||||||
|
|
||||||
import org.jetbrains.org.objectweb.asm.ClassVisitor
|
|
||||||
import org.jetbrains.org.objectweb.asm.Opcodes
|
|
||||||
|
|
||||||
internal class InnerClassesCollectingVisitor : ClassVisitor(Opcodes.API_VERSION) {
|
|
||||||
lateinit var ownInternalName: String
|
|
||||||
private set
|
|
||||||
|
|
||||||
private val myInnerClasses = arrayListOf<String>()
|
|
||||||
val innerClasses: List<String>
|
|
||||||
get() = myInnerClasses
|
|
||||||
|
|
||||||
override fun visit(
|
|
||||||
version: Int,
|
|
||||||
access: Int,
|
|
||||||
name: String,
|
|
||||||
signature: String?,
|
|
||||||
superName: String?,
|
|
||||||
interfaces: Array<out String>?
|
|
||||||
) {
|
|
||||||
super.visit(version, access, name, signature, superName, interfaces)
|
|
||||||
ownInternalName = name
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun visitInnerClass(name: String, outerName: String?, innerName: String?, access: Int) {
|
|
||||||
super.visitInnerClass(name, outerName, innerName, access)
|
|
||||||
myInnerClasses.add(name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-25
@@ -1,25 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2018 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.jvm.abi.asm
|
|
||||||
|
|
||||||
import org.jetbrains.kotlin.codegen.TransformationMethodVisitor
|
|
||||||
import org.jetbrains.org.objectweb.asm.*
|
|
||||||
import org.jetbrains.org.objectweb.asm.tree.MethodNode
|
|
||||||
|
|
||||||
internal class ReplaceWithEmptyMethodVisitor(
|
|
||||||
delegate: MethodVisitor,
|
|
||||||
access: Int,
|
|
||||||
name: String,
|
|
||||||
desc: String,
|
|
||||||
signature: String?,
|
|
||||||
exceptions: Array<out String>?
|
|
||||||
) : TransformationMethodVisitor(delegate, access, name, desc, signature, exceptions, api = Opcodes.API_VERSION) {
|
|
||||||
override fun performTransformations(methodNode: MethodNode) {
|
|
||||||
methodNode.instructions.clear()
|
|
||||||
methodNode.localVariables.clear()
|
|
||||||
methodNode.tryCatchBlocks.clear()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-11
@@ -1,11 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2020 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.jvm.abi
|
|
||||||
|
|
||||||
abstract class AbstractLegacyCompareJvmAbiTest : AbstractCompareJvmAbiTest() {
|
|
||||||
override val useLegacyAbiGen: Boolean
|
|
||||||
get() = true
|
|
||||||
}
|
|
||||||
-11
@@ -1,11 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2020 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.jvm.abi
|
|
||||||
|
|
||||||
abstract class AbstractLegacyCompileAgainstJvmAbiTest : AbstractCompileAgainstJvmAbiTest() {
|
|
||||||
override val useLegacyAbiGen: Boolean
|
|
||||||
get() = true
|
|
||||||
}
|
|
||||||
-11
@@ -1,11 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2020 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.jvm.abi
|
|
||||||
|
|
||||||
abstract class AbstractLegacyJvmAbiContentTest : AbstractJvmAbiContentTest() {
|
|
||||||
override val useLegacyAbiGen: Boolean
|
|
||||||
get() = true
|
|
||||||
}
|
|
||||||
Generated
-127
@@ -1,127 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.jvm.abi;
|
|
||||||
|
|
||||||
import com.intellij.testFramework.TestDataPath;
|
|
||||||
import org.jetbrains.kotlin.test.JUnit3RunnerWithInners;
|
|
||||||
import org.jetbrains.kotlin.test.KotlinTestUtils;
|
|
||||||
import org.jetbrains.kotlin.test.util.KtTestUtil;
|
|
||||||
import org.jetbrains.kotlin.test.TargetBackend;
|
|
||||||
import org.jetbrains.kotlin.test.TestMetadata;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.GenerateTestsKt}. DO NOT MODIFY MANUALLY */
|
|
||||||
@SuppressWarnings("all")
|
|
||||||
@TestMetadata("plugins/jvm-abi-gen/testData/compare")
|
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
|
||||||
public class LegacyCompareJvmAbiTestGenerated extends AbstractLegacyCompareJvmAbiTest {
|
|
||||||
private void runTest(String testDataFilePath) throws Exception {
|
|
||||||
KotlinTestUtils.runTestWithCustomIgnoreDirective(this::doTest, TargetBackend.JVM_IR, testDataFilePath, "// IGNORE_BACKEND_LEGACY: ");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testAllFilesPresentInCompare() throws Exception {
|
|
||||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("plugins/jvm-abi-gen/testData/compare"), Pattern.compile("^([^\\.]+)$"), null, TargetBackend.JVM_IR, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("anonymousObjects")
|
|
||||||
public void testAnonymousObjects() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compare/anonymousObjects/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("classFlags")
|
|
||||||
public void testClassFlags() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compare/classFlags/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("classPrivateMemebers")
|
|
||||||
public void testClassPrivateMemebers() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compare/classPrivateMemebers/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("clinit")
|
|
||||||
public void testClinit() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compare/clinit/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("constant")
|
|
||||||
public void testConstant() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compare/constant/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("declarationOrderInline")
|
|
||||||
public void testDeclarationOrderInline() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compare/declarationOrderInline/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("declarationOrderInlineCall")
|
|
||||||
public void testDeclarationOrderInlineCall() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compare/declarationOrderInlineCall/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("declarationOrderPrivateInline")
|
|
||||||
public void testDeclarationOrderPrivateInline() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compare/declarationOrderPrivateInline/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("functionBody")
|
|
||||||
public void testFunctionBody() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compare/functionBody/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("inlineFunInPrivateClass")
|
|
||||||
public void testInlineFunInPrivateClass() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compare/inlineFunInPrivateClass/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("inlineFunInPrivateNestedClass")
|
|
||||||
public void testInlineFunInPrivateNestedClass() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compare/inlineFunInPrivateNestedClass/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("inlineFunctionBody")
|
|
||||||
public void testInlineFunctionBody() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compare/inlineFunctionBody/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("lambdas")
|
|
||||||
public void testLambdas() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compare/lambdas/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("parameterName")
|
|
||||||
public void testParameterName() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compare/parameterName/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("privateTypealias")
|
|
||||||
public void testPrivateTypealias() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compare/privateTypealias/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("returnType")
|
|
||||||
public void testReturnType() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compare/returnType/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("superClass")
|
|
||||||
public void testSuperClass() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compare/superClass/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("syntheticAccessors")
|
|
||||||
public void testSyntheticAccessors() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compare/syntheticAccessors/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("topLevelPrivateMembers")
|
|
||||||
public void testTopLevelPrivateMembers() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compare/topLevelPrivateMembers/");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Generated
-137
@@ -1,137 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.jvm.abi;
|
|
||||||
|
|
||||||
import com.intellij.testFramework.TestDataPath;
|
|
||||||
import org.jetbrains.kotlin.test.JUnit3RunnerWithInners;
|
|
||||||
import org.jetbrains.kotlin.test.KotlinTestUtils;
|
|
||||||
import org.jetbrains.kotlin.test.util.KtTestUtil;
|
|
||||||
import org.jetbrains.kotlin.test.TargetBackend;
|
|
||||||
import org.jetbrains.kotlin.test.TestMetadata;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.GenerateTestsKt}. DO NOT MODIFY MANUALLY */
|
|
||||||
@SuppressWarnings("all")
|
|
||||||
@TestMetadata("plugins/jvm-abi-gen/testData/compile")
|
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
|
||||||
public class LegacyCompileAgainstJvmAbiTestGenerated extends AbstractLegacyCompileAgainstJvmAbiTest {
|
|
||||||
private void runTest(String testDataFilePath) throws Exception {
|
|
||||||
KotlinTestUtils.runTestWithCustomIgnoreDirective(this::doTest, TargetBackend.JVM_IR, testDataFilePath, "// IGNORE_BACKEND_LEGACY: ");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testAllFilesPresentInCompile() throws Exception {
|
|
||||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("plugins/jvm-abi-gen/testData/compile"), Pattern.compile("^([^\\.]+)$"), null, TargetBackend.JVM_IR, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("anonymousObject")
|
|
||||||
public void testAnonymousObject() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compile/anonymousObject/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("classes")
|
|
||||||
public void testClasses() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compile/classes/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("clinit")
|
|
||||||
public void testClinit() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compile/clinit/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("inlineAnnotationInstantiation")
|
|
||||||
public void testInlineAnnotationInstantiation() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compile/inlineAnnotationInstantiation/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("inlineAnonymousObject")
|
|
||||||
public void testInlineAnonymousObject() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compile/inlineAnonymousObject/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("inlineCapture")
|
|
||||||
public void testInlineCapture() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compile/inlineCapture/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("inlineClassWithPrivateConstructor")
|
|
||||||
public void testInlineClassWithPrivateConstructor() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compile/inlineClassWithPrivateConstructor/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("inlineClassWithPrivateConstructorK2")
|
|
||||||
public void testInlineClassWithPrivateConstructorK2() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compile/inlineClassWithPrivateConstructorK2/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("inlineNoRegeneration")
|
|
||||||
public void testInlineNoRegeneration() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compile/inlineNoRegeneration/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("inlineReifiedFunction")
|
|
||||||
public void testInlineReifiedFunction() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compile/inlineReifiedFunction/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("inlineWhenMappings")
|
|
||||||
public void testInlineWhenMappings() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compile/inlineWhenMappings/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("innerObjectRegeneration")
|
|
||||||
public void testInnerObjectRegeneration() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compile/innerObjectRegeneration/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("kt-40133")
|
|
||||||
public void testKt_40133() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compile/kt-40133/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("kt-40340")
|
|
||||||
public void testKt_40340() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compile/kt-40340/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("privateAnnotationsFromJavaApp")
|
|
||||||
public void testPrivateAnnotationsFromJavaApp() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaApp/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("privateAnnotationsFromJavaLib")
|
|
||||||
public void testPrivateAnnotationsFromJavaLib() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaLib/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("privateClassesFromJavaApp")
|
|
||||||
public void testPrivateClassesFromJavaApp() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaApp/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("privateClassesFromJavaLib")
|
|
||||||
public void testPrivateClassesFromJavaLib() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaLib/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("privateOnlyConstructors")
|
|
||||||
public void testPrivateOnlyConstructors() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compile/privateOnlyConstructors/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("privateValueClassConstructor")
|
|
||||||
public void testPrivateValueClassConstructor() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compile/privateValueClassConstructor/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("topLevel")
|
|
||||||
public void testTopLevel() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/compile/topLevel/");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Generated
-72
@@ -1,72 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.jvm.abi;
|
|
||||||
|
|
||||||
import com.intellij.testFramework.TestDataPath;
|
|
||||||
import org.jetbrains.kotlin.test.JUnit3RunnerWithInners;
|
|
||||||
import org.jetbrains.kotlin.test.KotlinTestUtils;
|
|
||||||
import org.jetbrains.kotlin.test.util.KtTestUtil;
|
|
||||||
import org.jetbrains.kotlin.test.TargetBackend;
|
|
||||||
import org.jetbrains.kotlin.test.TestMetadata;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.GenerateTestsKt}. DO NOT MODIFY MANUALLY */
|
|
||||||
@SuppressWarnings("all")
|
|
||||||
@TestMetadata("plugins/jvm-abi-gen/testData/content")
|
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
|
||||||
public class LegacyJvmAbiContentTestGenerated extends AbstractLegacyJvmAbiContentTest {
|
|
||||||
private void runTest(String testDataFilePath) throws Exception {
|
|
||||||
KotlinTestUtils.runTestWithCustomIgnoreDirective(this::doTest, TargetBackend.JVM_IR, testDataFilePath, "// IGNORE_BACKEND_LEGACY: ");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testAllFilesPresentInContent() throws Exception {
|
|
||||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("plugins/jvm-abi-gen/testData/content"), Pattern.compile("^([^\\.]+)$"), null, TargetBackend.JVM_IR, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("annotation")
|
|
||||||
public void testAnnotation() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/content/annotation/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("annotationInstantiation")
|
|
||||||
public void testAnnotationInstantiation() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/content/annotationInstantiation/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("anonymousAnnotationInstantiation")
|
|
||||||
public void testAnonymousAnnotationInstantiation() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/content/anonymousAnnotationInstantiation/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("anonymousWhenMapping")
|
|
||||||
public void testAnonymousWhenMapping() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/content/anonymousWhenMapping/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("class")
|
|
||||||
public void testClass() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/content/class/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("innerClasses")
|
|
||||||
public void testInnerClasses() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/content/innerClasses/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("kt50005")
|
|
||||||
public void testKt50005() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/content/kt50005/");
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("whenMapping")
|
|
||||||
public void testWhenMapping() throws Exception {
|
|
||||||
runTest("plugins/jvm-abi-gen/testData/content/whenMapping/");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
// IGNORE_BACKEND_LEGACY: JVM_IR
|
|
||||||
-1
@@ -1,2 +1 @@
|
|||||||
// IGNORE_BACKEND_LEGACY: JVM_IR
|
|
||||||
// IGNORE_BACKEND: JVM_IR
|
// IGNORE_BACKEND: JVM_IR
|
||||||
|
|||||||
-1
@@ -1,2 +1 @@
|
|||||||
// IGNORE_BACKEND_LEGACY: JVM_IR
|
|
||||||
// NO_SOURCE_DEBUG_EXTENSION
|
// NO_SOURCE_DEBUG_EXTENSION
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
// IGNORE_BACKEND_LEGACY: JVM_IR
|
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
// IGNORE_BACKEND_LEGACY: JVM_IR
|
|
||||||
@@ -1,2 +1 @@
|
|||||||
// IGNORE_BACKEND_LEGACY: JVM_IR
|
|
||||||
// NO_SOURCE_DEBUG_EXTENSION
|
// NO_SOURCE_DEBUG_EXTENSION
|
||||||
|
|||||||
-1
@@ -1 +0,0 @@
|
|||||||
// IGNORE_BACKEND_LEGACY: JVM_IR
|
|
||||||
-1
@@ -1,2 +1 @@
|
|||||||
// USE_K2
|
// USE_K2
|
||||||
// IGNORE_BACKEND_LEGACY: JVM_IR
|
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
// IGNORE_BACKEND_LEGACY: JVM_IR
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
// IGNORE_BACKEND_LEGACY: JVM_IR
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
// IGNORE_BACKEND_LEGACY: JVM_IR
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
// IGNORE_BACKEND_LEGACY: JVM_IR
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
// IGNORE_BACKEND_LEGACY: JVM_IR
|
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
// IGNORE_BACKEND_LEGACY: JVM_IR
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
// IGNORE_BACKEND_LEGACY: JVM_IR
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
// IGNORE_BACKEND_LEGACY: JVM_IR
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
// IGNORE_BACKEND_LEGACY: JVM_IR
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
// IGNORE_BACKEND_LEGACY: JVM_IR
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
// IGNORE_BACKEND_LEGACY: JVM_IR
|
|
||||||
Reference in New Issue
Block a user