IC mangling: Replace compiler hack with configuration flag
This commit is contained in:
@@ -44,6 +44,7 @@ import org.jetbrains.kotlin.codegen.when.SwitchCodegen;
|
|||||||
import org.jetbrains.kotlin.codegen.when.SwitchCodegenProvider;
|
import org.jetbrains.kotlin.codegen.when.SwitchCodegenProvider;
|
||||||
import org.jetbrains.kotlin.config.ApiVersion;
|
import org.jetbrains.kotlin.config.ApiVersion;
|
||||||
import org.jetbrains.kotlin.config.JVMAssertionsMode;
|
import org.jetbrains.kotlin.config.JVMAssertionsMode;
|
||||||
|
import org.jetbrains.kotlin.config.JVMConfigurationKeys;
|
||||||
import org.jetbrains.kotlin.config.LanguageFeature;
|
import org.jetbrains.kotlin.config.LanguageFeature;
|
||||||
import org.jetbrains.kotlin.descriptors.*;
|
import org.jetbrains.kotlin.descriptors.*;
|
||||||
import org.jetbrains.kotlin.descriptors.impl.AnonymousFunctionDescriptor;
|
import org.jetbrains.kotlin.descriptors.impl.AnonymousFunctionDescriptor;
|
||||||
@@ -2686,7 +2687,9 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
|||||||
|
|
||||||
CallableMethod method = typeMapper.mapToCallableMethod(fd, superCall, null, resolvedCall);
|
CallableMethod method = typeMapper.mapToCallableMethod(fd, superCall, null, resolvedCall);
|
||||||
|
|
||||||
if (method.getAsmMethod().getName().contains("-")) {
|
if (method.getAsmMethod().getName().contains("-") &&
|
||||||
|
!state.getConfiguration().getBoolean(JVMConfigurationKeys.USE_OLD_INLINE_CLASSES_MANGLING_SCHEME)
|
||||||
|
) {
|
||||||
Boolean classFileContainsMethod =
|
Boolean classFileContainsMethod =
|
||||||
InlineClassesCodegenUtilKt.classFileContainsMethod(fd, state, method.getAsmMethod());
|
InlineClassesCodegenUtilKt.classFileContainsMethod(fd, state, method.getAsmMethod());
|
||||||
if (classFileContainsMethod != null && !classFileContainsMethod) {
|
if (classFileContainsMethod != null && !classFileContainsMethod) {
|
||||||
@@ -2912,7 +2915,9 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
|||||||
|
|
||||||
sourceCompiler.initializeInlineFunctionContext(functionDescriptor);
|
sourceCompiler.initializeInlineFunctionContext(functionDescriptor);
|
||||||
JvmMethodSignature signature = typeMapper.mapSignatureWithGeneric(functionDescriptor, sourceCompiler.getContextKind());
|
JvmMethodSignature signature = typeMapper.mapSignatureWithGeneric(functionDescriptor, sourceCompiler.getContextKind());
|
||||||
if (signature.getAsmMethod().getName().contains("-")) {
|
if (signature.getAsmMethod().getName().contains("-") &&
|
||||||
|
!state.getConfiguration().getBoolean(JVMConfigurationKeys.USE_OLD_INLINE_CLASSES_MANGLING_SCHEME)
|
||||||
|
) {
|
||||||
Boolean classFileContainsMethod =
|
Boolean classFileContainsMethod =
|
||||||
InlineClassesCodegenUtilKt.classFileContainsMethod(functionDescriptor, state, signature.getAsmMethod());
|
InlineClassesCodegenUtilKt.classFileContainsMethod(functionDescriptor, state, signature.getAsmMethod());
|
||||||
if (classFileContainsMethod != null && !classFileContainsMethod) {
|
if (classFileContainsMethod != null && !classFileContainsMethod) {
|
||||||
|
|||||||
+4
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.codegen.createFreeFakeLocalPropertyDescriptor
|
|||||||
import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings.*
|
import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings.*
|
||||||
import org.jetbrains.kotlin.codegen.state.GenerationState
|
import org.jetbrains.kotlin.codegen.state.GenerationState
|
||||||
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapperBase
|
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapperBase
|
||||||
|
import org.jetbrains.kotlin.config.JVMConfigurationKeys
|
||||||
import org.jetbrains.kotlin.config.JvmDefaultMode
|
import org.jetbrains.kotlin.config.JvmDefaultMode
|
||||||
import org.jetbrains.kotlin.config.LanguageFeature
|
import org.jetbrains.kotlin.config.LanguageFeature
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
@@ -60,6 +61,7 @@ class JvmSerializerExtension @JvmOverloads constructor(
|
|||||||
override val metadataVersion = state.metadataVersion
|
override val metadataVersion = state.metadataVersion
|
||||||
private val jvmDefaultMode = state.jvmDefaultMode
|
private val jvmDefaultMode = state.jvmDefaultMode
|
||||||
private val approximator = state.typeApproximator
|
private val approximator = state.typeApproximator
|
||||||
|
private val useOldManglingScheme = state.configuration.getBoolean(JVMConfigurationKeys.USE_OLD_INLINE_CLASSES_MANGLING_SCHEME)
|
||||||
|
|
||||||
override fun shouldUseTypeTable(): Boolean = useTypeTable
|
override fun shouldUseTypeTable(): Boolean = useTypeTable
|
||||||
override fun shouldSerializeFunction(descriptor: FunctionDescriptor): Boolean {
|
override fun shouldSerializeFunction(descriptor: FunctionDescriptor): Boolean {
|
||||||
@@ -399,4 +401,6 @@ class JvmSerializerExtension @JvmOverloads constructor(
|
|||||||
override fun releaseCoroutines(): Boolean {
|
override fun releaseCoroutines(): Boolean {
|
||||||
return languageVersionSettings.supportsFeature(LanguageFeature.ReleaseCoroutines)
|
return languageVersionSettings.supportsFeature(LanguageFeature.ReleaseCoroutines)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun useOldInlineClassesManglingScheme(): Boolean = useOldManglingScheme
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -17,7 +17,8 @@ class KotlinToJvmSignatureMapperImpl : KotlinToJvmSignatureMapper {
|
|||||||
private val typeMapper = KotlinTypeMapper(
|
private val typeMapper = KotlinTypeMapper(
|
||||||
BindingContext.EMPTY, ClassBuilderMode.LIGHT_CLASSES,
|
BindingContext.EMPTY, ClassBuilderMode.LIGHT_CLASSES,
|
||||||
JvmProtoBufUtil.DEFAULT_MODULE_NAME,
|
JvmProtoBufUtil.DEFAULT_MODULE_NAME,
|
||||||
KotlinTypeMapper.LANGUAGE_VERSION_SETTINGS_DEFAULT// TODO use proper LanguageVersionSettings
|
KotlinTypeMapper.LANGUAGE_VERSION_SETTINGS_DEFAULT,// TODO use proper LanguageVersionSettings
|
||||||
|
useOldInlineClassesManglingScheme = false
|
||||||
)
|
)
|
||||||
|
|
||||||
override fun mapToJvmMethodSignature(function: FunctionDescriptor) = typeMapper.mapAsmMethod(function)
|
override fun mapToJvmMethodSignature(function: FunctionDescriptor) = typeMapper.mapAsmMethod(function)
|
||||||
|
|||||||
+2
-1
@@ -55,7 +55,8 @@ class BuilderFactoryForDuplicateSignatureDiagnostics(
|
|||||||
|
|
||||||
private val mapAsmMethod: (FunctionDescriptor) -> Method = KotlinTypeMapper(
|
private val mapAsmMethod: (FunctionDescriptor) -> Method = KotlinTypeMapper(
|
||||||
// Avoid errors when some classes are not loaded for some reason
|
// Avoid errors when some classes are not loaded for some reason
|
||||||
bindingContext, ClassBuilderMode.LIGHT_CLASSES, moduleName, languageVersionSettings, isIrBackend = false
|
bindingContext, ClassBuilderMode.LIGHT_CLASSES, moduleName, languageVersionSettings, isIrBackend = false,
|
||||||
|
useOldInlineClassesManglingScheme = false
|
||||||
)::mapAsmMethod
|
)::mapAsmMethod
|
||||||
|
|
||||||
private val reportDiagnosticsTasks = ArrayList<() -> Unit>()
|
private val reportDiagnosticsTasks = ArrayList<() -> Unit>()
|
||||||
|
|||||||
@@ -214,6 +214,7 @@ class GenerationState private constructor(
|
|||||||
classBuilderMode,
|
classBuilderMode,
|
||||||
this.moduleName,
|
this.moduleName,
|
||||||
languageVersionSettings,
|
languageVersionSettings,
|
||||||
|
configuration.getBoolean(JVMConfigurationKeys.USE_OLD_INLINE_CLASSES_MANGLING_SCHEME),
|
||||||
IncompatibleClassTrackerImpl(extraJvmDiagnosticsTrace),
|
IncompatibleClassTrackerImpl(extraJvmDiagnosticsTrace),
|
||||||
target,
|
target,
|
||||||
isIrBackend
|
isIrBackend
|
||||||
|
|||||||
@@ -83,6 +83,7 @@ class KotlinTypeMapper @JvmOverloads constructor(
|
|||||||
val classBuilderMode: ClassBuilderMode,
|
val classBuilderMode: ClassBuilderMode,
|
||||||
private val moduleName: String,
|
private val moduleName: String,
|
||||||
val languageVersionSettings: LanguageVersionSettings,
|
val languageVersionSettings: LanguageVersionSettings,
|
||||||
|
private val useOldInlineClassesManglingScheme: Boolean,
|
||||||
private val incompatibleClassTracker: IncompatibleClassTracker = IncompatibleClassTracker.DoNothing,
|
private val incompatibleClassTracker: IncompatibleClassTracker = IncompatibleClassTracker.DoNothing,
|
||||||
val jvmTarget: JvmTarget = JvmTarget.DEFAULT,
|
val jvmTarget: JvmTarget = JvmTarget.DEFAULT,
|
||||||
private val isIrBackend: Boolean = false,
|
private val isIrBackend: Boolean = false,
|
||||||
@@ -91,7 +92,11 @@ class KotlinTypeMapper @JvmOverloads constructor(
|
|||||||
) : KotlinTypeMapperBase() {
|
) : KotlinTypeMapperBase() {
|
||||||
private val isReleaseCoroutines = languageVersionSettings.supportsFeature(LanguageFeature.ReleaseCoroutines)
|
private val isReleaseCoroutines = languageVersionSettings.supportsFeature(LanguageFeature.ReleaseCoroutines)
|
||||||
val jvmDefaultMode = languageVersionSettings.getFlag(JvmAnalysisFlags.jvmDefaultMode)
|
val jvmDefaultMode = languageVersionSettings.getFlag(JvmAnalysisFlags.jvmDefaultMode)
|
||||||
var useOldManglingRulesForFunctionAcceptingInlineClass: Boolean = false
|
var useOldManglingRulesForFunctionAcceptingInlineClass: Boolean = useOldInlineClassesManglingScheme
|
||||||
|
set(value) {
|
||||||
|
require(!useOldInlineClassesManglingScheme)
|
||||||
|
field = value
|
||||||
|
}
|
||||||
|
|
||||||
private val typeMappingConfiguration = object : TypeMappingConfiguration<Type> {
|
private val typeMappingConfiguration = object : TypeMappingConfiguration<Type> {
|
||||||
override fun commonSupertype(types: Collection<KotlinType>): KotlinType {
|
override fun commonSupertype(types: Collection<KotlinType>): KotlinType {
|
||||||
|
|||||||
@@ -22,8 +22,6 @@ import java.util.*
|
|||||||
|
|
||||||
const val NOT_INLINE_CLASS_PARAMETER_PLACEHOLDER = "_"
|
const val NOT_INLINE_CLASS_PARAMETER_PLACEHOLDER = "_"
|
||||||
|
|
||||||
private fun FunctionDescriptor.isFunctionFromStdlib(): Boolean = fqNameSafe.startsWith(Name.identifier("kotlin"))
|
|
||||||
|
|
||||||
class InfoForMangling(
|
class InfoForMangling(
|
||||||
val fqName: FqNameUnsafe,
|
val fqName: FqNameUnsafe,
|
||||||
val isInline: Boolean,
|
val isInline: Boolean,
|
||||||
@@ -96,7 +94,7 @@ fun getManglingSuffixBasedOnKotlinSignature(
|
|||||||
val unwrappedDescriptor = descriptor.unwrapInitialDescriptorForSuspendFunction()
|
val unwrappedDescriptor = descriptor.unwrapInitialDescriptorForSuspendFunction()
|
||||||
|
|
||||||
val resultNew = collectFunctionSignatureForManglingSuffix(
|
val resultNew = collectFunctionSignatureForManglingSuffix(
|
||||||
useOldManglingRules = useOldManglingRules || descriptor.isFunctionFromStdlib(),
|
useOldManglingRules = useOldManglingRules,
|
||||||
requiresFunctionNameManglingForParameterTypes = requiresFunctionNameManglingForParameterTypes(descriptor),
|
requiresFunctionNameManglingForParameterTypes = requiresFunctionNameManglingForParameterTypes(descriptor),
|
||||||
fqNamesForMangling =
|
fqNamesForMangling =
|
||||||
(listOfNotNull(descriptor.extensionReceiverParameter?.type) + descriptor.valueParameters.map { it.type })
|
(listOfNotNull(descriptor.extensionReceiverParameter?.type) + descriptor.valueParameters.map { it.type })
|
||||||
|
|||||||
+6
@@ -412,6 +412,12 @@ class K2JVMCompilerArguments : CommonCompilerArguments() {
|
|||||||
)
|
)
|
||||||
var useOldSpilledVarTypeAnalysis: Boolean by FreezableVar(false)
|
var useOldSpilledVarTypeAnalysis: Boolean by FreezableVar(false)
|
||||||
|
|
||||||
|
@Argument(
|
||||||
|
value = "-Xuse-14-inline-classes-mangling-scheme",
|
||||||
|
description = "Use 1.4 inline classes mangling scheme instead of 1.4.30 one"
|
||||||
|
)
|
||||||
|
var useOldInlineClassesManglingScheme: Boolean by FreezableVar(false)
|
||||||
|
|
||||||
override fun configureAnalysisFlags(collector: MessageCollector): MutableMap<AnalysisFlag<*>, Any> {
|
override fun configureAnalysisFlags(collector: MessageCollector): MutableMap<AnalysisFlag<*>, Any> {
|
||||||
val result = super.configureAnalysisFlags(collector)
|
val result = super.configureAnalysisFlags(collector)
|
||||||
result[JvmAnalysisFlags.strictMetadataVersionSemantics] = strictMetadataVersionSemantics
|
result[JvmAnalysisFlags.strictMetadataVersionSemantics] = strictMetadataVersionSemantics
|
||||||
|
|||||||
+1
@@ -87,6 +87,7 @@ class CliLightClassGenerationSupport(
|
|||||||
ClassBuilderMode.LIGHT_CLASSES,
|
ClassBuilderMode.LIGHT_CLASSES,
|
||||||
moduleName,
|
moduleName,
|
||||||
languageVersionSettings,
|
languageVersionSettings,
|
||||||
|
useOldInlineClassesManglingScheme = false,
|
||||||
jvmTarget = JvmTarget.JVM_1_8,
|
jvmTarget = JvmTarget.JVM_1_8,
|
||||||
typePreprocessor = KotlinType::cleanFromAnonymousTypes,
|
typePreprocessor = KotlinType::cleanFromAnonymousTypes,
|
||||||
namePreprocessor = ::tryGetPredefinedName
|
namePreprocessor = ::tryGetPredefinedName
|
||||||
|
|||||||
@@ -231,6 +231,7 @@ fun CompilerConfiguration.configureAdvancedJvmOptions(arguments: K2JVMCompilerAr
|
|||||||
put(CLIConfigurationKeys.ALLOW_KOTLIN_PACKAGE, arguments.allowKotlinPackage)
|
put(CLIConfigurationKeys.ALLOW_KOTLIN_PACKAGE, arguments.allowKotlinPackage)
|
||||||
put(JVMConfigurationKeys.USE_SINGLE_MODULE, arguments.singleModule)
|
put(JVMConfigurationKeys.USE_SINGLE_MODULE, arguments.singleModule)
|
||||||
put(JVMConfigurationKeys.USE_OLD_SPILLED_VAR_TYPE_ANALYSIS, arguments.useOldSpilledVarTypeAnalysis)
|
put(JVMConfigurationKeys.USE_OLD_SPILLED_VAR_TYPE_ANALYSIS, arguments.useOldSpilledVarTypeAnalysis)
|
||||||
|
put(JVMConfigurationKeys.USE_OLD_INLINE_CLASSES_MANGLING_SCHEME, arguments.useOldInlineClassesManglingScheme)
|
||||||
|
|
||||||
arguments.declarationsOutputPath?.let { put(JVMConfigurationKeys.DECLARATIONS_JSON_PATH, it) }
|
arguments.declarationsOutputPath?.let { put(JVMConfigurationKeys.DECLARATIONS_JSON_PATH, it) }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -137,4 +137,7 @@ public class JVMConfigurationKeys {
|
|||||||
|
|
||||||
public static final CompilerConfigurationKey<Boolean> USE_OLD_SPILLED_VAR_TYPE_ANALYSIS =
|
public static final CompilerConfigurationKey<Boolean> USE_OLD_SPILLED_VAR_TYPE_ANALYSIS =
|
||||||
CompilerConfigurationKey.create("Use old, SourceInterpreter-based analysis for fields, used for spilled variables in coroutines");
|
CompilerConfigurationKey.create("Use old, SourceInterpreter-based analysis for fields, used for spilled variables in coroutines");
|
||||||
|
|
||||||
|
public static final CompilerConfigurationKey<Boolean> USE_OLD_INLINE_CLASSES_MANGLING_SCHEME =
|
||||||
|
CompilerConfigurationKey.create("Use old, 1.4 version of inline classes mangling scheme");
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-3
@@ -61,8 +61,6 @@ object InlineClassAbi {
|
|||||||
return irClass.primaryConstructor!!.valueParameters[0].type
|
return irClass.primaryConstructor!!.valueParameters[0].type
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun IrFunction.isFunctionFromStdlib(): Boolean = fqNameForIrSerialization.startsWith(Name.identifier("kotlin"))
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a mangled name for a function taking inline class arguments
|
* Returns a mangled name for a function taking inline class arguments
|
||||||
* to avoid clashes between overloaded methods.
|
* to avoid clashes between overloaded methods.
|
||||||
@@ -99,7 +97,7 @@ object InlineClassAbi {
|
|||||||
alwaysMangleReturnType: Boolean = false
|
alwaysMangleReturnType: Boolean = false
|
||||||
): String? {
|
): String? {
|
||||||
val signatureForMangling = collectFunctionSignatureForManglingSuffix(
|
val signatureForMangling = collectFunctionSignatureForManglingSuffix(
|
||||||
useOldManglingRules = useOldMangleRules || irFunction.isFunctionFromStdlib(),
|
useOldManglingRules = useOldMangleRules,
|
||||||
requiresFunctionNameManglingForParameterTypes = irFunction.fullValueParameterList.any { it.type.requiresMangling },
|
requiresFunctionNameManglingForParameterTypes = irFunction.fullValueParameterList.any { it.type.requiresMangling },
|
||||||
fqNamesForMangling = irFunction.fullValueParameterList.map {
|
fqNamesForMangling = irFunction.fullValueParameterList.map {
|
||||||
it.type.asInfoForMangling()
|
it.type.asInfoForMangling()
|
||||||
|
|||||||
+8
-2
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.backend.jvm.codegen.classFileContainsMethod
|
|||||||
import org.jetbrains.kotlin.backend.jvm.ir.isStaticInlineClassReplacement
|
import org.jetbrains.kotlin.backend.jvm.ir.isStaticInlineClassReplacement
|
||||||
import org.jetbrains.kotlin.backend.jvm.lower.inlineclasses.InlineClassAbi.mangledNameFor
|
import org.jetbrains.kotlin.backend.jvm.lower.inlineclasses.InlineClassAbi.mangledNameFor
|
||||||
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
|
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
|
||||||
|
import org.jetbrains.kotlin.config.JVMConfigurationKeys
|
||||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.addValueParameter
|
import org.jetbrains.kotlin.ir.builders.declarations.addValueParameter
|
||||||
@@ -221,8 +222,13 @@ class MemoizedInlineClassReplacements(
|
|||||||
if (noFakeOverride) {
|
if (noFakeOverride) {
|
||||||
isFakeOverride = false
|
isFakeOverride = false
|
||||||
}
|
}
|
||||||
name = mangledNameFor(function, mangleReturnTypes, false)
|
val useOldManglingScheme = context.state.configuration.getBoolean(JVMConfigurationKeys.USE_OLD_INLINE_CLASSES_MANGLING_SCHEME)
|
||||||
if (name.asString().contains("-") && classFileContainsMethod(function, context, name.asString()) == false) {
|
name = mangledNameFor(function, mangleReturnTypes, useOldManglingScheme)
|
||||||
|
if (
|
||||||
|
!useOldManglingScheme &&
|
||||||
|
name.asString().contains("-") &&
|
||||||
|
classFileContainsMethod(function, context, name.asString()) == false
|
||||||
|
) {
|
||||||
name = mangledNameFor(function, mangleReturnTypes, true)
|
name = mangledNameFor(function, mangleReturnTypes, true)
|
||||||
}
|
}
|
||||||
returnType = function.returnType
|
returnType = function.returnType
|
||||||
|
|||||||
+1
-1
@@ -362,7 +362,7 @@ class DescriptorSerializer private constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (descriptor.hasInlineClassTypesInSignature()) {
|
if (descriptor.hasInlineClassTypesInSignature()) {
|
||||||
if (descriptor.fqNameSafe.startsWith(Name.identifier("kotlin"))) {
|
if (extension.useOldInlineClassesManglingScheme()) {
|
||||||
builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses))
|
builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses))
|
||||||
} else {
|
} else {
|
||||||
builder.addVersionRequirement(
|
builder.addVersionRequirement(
|
||||||
|
|||||||
@@ -94,4 +94,6 @@ abstract class SerializerExtension {
|
|||||||
}
|
}
|
||||||
|
|
||||||
open fun releaseCoroutines(): Boolean = false
|
open fun releaseCoroutines(): Boolean = false
|
||||||
|
|
||||||
|
open fun useOldInlineClassesManglingScheme(): Boolean = false
|
||||||
}
|
}
|
||||||
|
|||||||
+2
@@ -112,6 +112,8 @@ where advanced options include:
|
|||||||
-Xuse-javac Use javac for Java source and class files analysis
|
-Xuse-javac Use javac for Java source and class files analysis
|
||||||
-Xuse-old-class-files-reading Use old class files reading implementation. This may slow down the build and cause problems with Groovy interop.
|
-Xuse-old-class-files-reading Use old class files reading implementation. This may slow down the build and cause problems with Groovy interop.
|
||||||
Should be used in case of problems with the new implementation
|
Should be used in case of problems with the new implementation
|
||||||
|
-Xuse-14-inline-classes-mangling-scheme
|
||||||
|
Use 1.4 inline classes mangling scheme instead of 1.4.30 one
|
||||||
-Xuse-old-spilled-var-type-analysis
|
-Xuse-old-spilled-var-type-analysis
|
||||||
Use old, SourceInterpreter-based analysis for fields, used for spilled variables in coroutines
|
Use old, SourceInterpreter-based analysis for fields, used for spilled variables in coroutines
|
||||||
-Xuse-type-table Use type table in metadata serialization
|
-Xuse-type-table Use type table in metadata serialization
|
||||||
|
|||||||
+1
@@ -1,3 +1,4 @@
|
|||||||
|
// KOTLIN_CONFIGURATION_FLAGS: +JVM.USE_OLD_INLINE_CLASSES_MANGLING_SCHEME
|
||||||
// FILE: 1.kt
|
// FILE: 1.kt
|
||||||
package test
|
package test
|
||||||
|
|
||||||
|
|||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
inline class IC(val x: String)
|
||||||
|
|
||||||
|
typealias ICAlias = IC
|
||||||
|
|
||||||
|
class Ctor(ic: IC)
|
||||||
|
|
||||||
|
fun simpleFun(f: IC) {}
|
||||||
|
fun aliasedFun(f: ICAlias) {}
|
||||||
|
|
||||||
|
val simpleProp: IC = IC("")
|
||||||
|
|
||||||
|
fun result(r: List<Result<Any>?>) {}
|
||||||
|
|
||||||
|
abstract class Foo : List<IC>
|
||||||
|
interface Bar<T : IC>
|
||||||
+12
-4
@@ -203,18 +203,26 @@ abstract class AbstractVersionRequirementTest : TestCaseWithTmpdir() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testInlineClassesAndRelevantDeclarations() {
|
fun testInlineClassesAndRelevantDeclarations13() {
|
||||||
doTest(
|
doTest(
|
||||||
VersionRequirement.Version(1, 3), DeprecationLevel.ERROR, null, ProtoBuf.VersionRequirement.VersionKind.LANGUAGE_VERSION, null,
|
VersionRequirement.Version(1, 3), DeprecationLevel.ERROR, null, ProtoBuf.VersionRequirement.VersionKind.LANGUAGE_VERSION, null,
|
||||||
fqNamesWithRequirements = listOf(
|
fqNamesWithRequirements = listOf(
|
||||||
"test.IC",
|
"test.IC",
|
||||||
"test.Ctor.<init>",
|
"test.Ctor.<init>",
|
||||||
|
"test.Foo",
|
||||||
|
"test.Bar",
|
||||||
|
"test.simpleProp"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun testInlineClassesAndRelevantDeclarations1430() {
|
||||||
|
doTest(
|
||||||
|
VersionRequirement.Version(1, 4, 30), DeprecationLevel.ERROR, null, ProtoBuf.VersionRequirement.VersionKind.COMPILER_VERSION, null,
|
||||||
|
fqNamesWithRequirements = listOf(
|
||||||
"test.simpleFun",
|
"test.simpleFun",
|
||||||
"test.aliasedFun",
|
"test.aliasedFun",
|
||||||
"test.simpleProp",
|
|
||||||
"test.result",
|
"test.result",
|
||||||
"test.Foo",
|
|
||||||
"test.Bar"
|
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -145,26 +145,38 @@ class JvmVersionRequirementTest : AbstractVersionRequirementTest() {
|
|||||||
doTest(
|
doTest(
|
||||||
VersionRequirement.Version(1, 3, 0), DeprecationLevel.ERROR, null, LANGUAGE_VERSION, null,
|
VersionRequirement.Version(1, 3, 0), DeprecationLevel.ERROR, null, LANGUAGE_VERSION, null,
|
||||||
fqNamesWithRequirements = listOf(
|
fqNamesWithRequirements = listOf(
|
||||||
"test.C.returnsInlineClassTypeJvmName",
|
|
||||||
"test.returnsInlineClassType",
|
|
||||||
"test.propertyOfInlineClassType"
|
"test.propertyOfInlineClassType"
|
||||||
),
|
),
|
||||||
shouldBeSingleRequirement = true,
|
shouldBeSingleRequirement = true,
|
||||||
customLanguageVersion = LanguageVersion.KOTLIN_1_4
|
customLanguageVersion = LanguageVersion.KOTLIN_1_4
|
||||||
)
|
)
|
||||||
// In Kotlin 1.3, all functions and properties returning inline class values are NOT mangled,
|
|
||||||
// and have "since 1.3" version requirement for inline class in signature only.
|
|
||||||
doTest(
|
doTest(
|
||||||
VersionRequirement.Version(1, 3, 0), DeprecationLevel.ERROR, null, LANGUAGE_VERSION, null,
|
VersionRequirement.Version(1, 3, 0), DeprecationLevel.ERROR, null, LANGUAGE_VERSION, null,
|
||||||
fqNamesWithRequirements = listOf(
|
fqNamesWithRequirements = listOf(
|
||||||
"test.returnsInlineClassType",
|
|
||||||
"test.propertyOfInlineClassType",
|
|
||||||
"test.C.returnsInlineClassType",
|
|
||||||
"test.C.propertyOfInlineClassType"
|
"test.C.propertyOfInlineClassType"
|
||||||
),
|
),
|
||||||
shouldBeSingleRequirement = true,
|
shouldBeSingleRequirement = true,
|
||||||
customLanguageVersion = LanguageVersion.KOTLIN_1_3
|
customLanguageVersion = LanguageVersion.KOTLIN_1_3
|
||||||
)
|
)
|
||||||
|
// In Kotlin 1.3, all functions and properties returning inline class values are NOT mangled,
|
||||||
|
// and have "since 1.3" version requirement for inline class in signature only.
|
||||||
|
doTest(
|
||||||
|
VersionRequirement.Version(1, 4, 30), DeprecationLevel.ERROR, null, COMPILER_VERSION, null,
|
||||||
|
fqNamesWithRequirements = listOf(
|
||||||
|
"test.C.returnsInlineClassTypeJvmName",
|
||||||
|
"test.returnsInlineClassType"
|
||||||
|
),
|
||||||
|
shouldBeSingleRequirement = true,
|
||||||
|
customLanguageVersion = LanguageVersion.KOTLIN_1_4
|
||||||
|
)
|
||||||
|
doTest(
|
||||||
|
VersionRequirement.Version(1, 4, 30), DeprecationLevel.ERROR, null, COMPILER_VERSION, null,
|
||||||
|
fqNamesWithRequirements = listOf(
|
||||||
|
"test.C.returnsInlineClassType"
|
||||||
|
),
|
||||||
|
shouldBeSingleRequirement = false,
|
||||||
|
customLanguageVersion = LanguageVersion.KOTLIN_1_4
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testSuspendFun_1_2() {
|
fun testSuspendFun_1_2() {
|
||||||
|
|||||||
+1
@@ -81,6 +81,7 @@ class IDELightClassGenerationSupport(project: Project) : LightClassGenerationSup
|
|||||||
KotlinTypeMapper(
|
KotlinTypeMapper(
|
||||||
BindingContext.EMPTY, ClassBuilderMode.LIGHT_CLASSES,
|
BindingContext.EMPTY, ClassBuilderMode.LIGHT_CLASSES,
|
||||||
moduleName, languageVersionSettings,
|
moduleName, languageVersionSettings,
|
||||||
|
useOldInlineClassesManglingScheme = false,
|
||||||
jvmTarget = JvmTarget.JVM_1_8,
|
jvmTarget = JvmTarget.JVM_1_8,
|
||||||
typePreprocessor = KotlinType::cleanFromAnonymousTypes,
|
typePreprocessor = KotlinType::cleanFromAnonymousTypes,
|
||||||
namePreprocessor = ::tryGetPredefinedName
|
namePreprocessor = ::tryGetPredefinedName
|
||||||
|
|||||||
+2
-1
@@ -342,7 +342,8 @@ abstract class FileRankingCalculator(private val checkClassFqName: Boolean = tru
|
|||||||
bindingContext,
|
bindingContext,
|
||||||
ClassBuilderMode.LIGHT_CLASSES,
|
ClassBuilderMode.LIGHT_CLASSES,
|
||||||
"debugger",
|
"debugger",
|
||||||
KotlinTypeMapper.LANGUAGE_VERSION_SETTINGS_DEFAULT // TODO use proper LanguageVersionSettings
|
KotlinTypeMapper.LANGUAGE_VERSION_SETTINGS_DEFAULT, // TODO use proper LanguageVersionSettings
|
||||||
|
useOldInlineClassesManglingScheme = false
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -195,7 +195,8 @@ class ParcelableDeclarationChecker : DeclarationChecker {
|
|||||||
bindingContext,
|
bindingContext,
|
||||||
ClassBuilderMode.FULL,
|
ClassBuilderMode.FULL,
|
||||||
descriptor.module.name.asString(),
|
descriptor.module.name.asString(),
|
||||||
languageVersionSettings
|
languageVersionSettings,
|
||||||
|
useOldInlineClassesManglingScheme = false
|
||||||
)
|
)
|
||||||
|
|
||||||
for (parameter in primaryConstructor?.valueParameters.orEmpty<KtParameter>()) {
|
for (parameter in primaryConstructor?.valueParameters.orEmpty<KtParameter>()) {
|
||||||
|
|||||||
+2
-1
@@ -212,7 +212,8 @@ open class ParcelizeDeclarationChecker : DeclarationChecker {
|
|||||||
bindingContext,
|
bindingContext,
|
||||||
ClassBuilderMode.FULL,
|
ClassBuilderMode.FULL,
|
||||||
descriptor.module.name.asString(),
|
descriptor.module.name.asString(),
|
||||||
languageVersionSettings
|
languageVersionSettings,
|
||||||
|
useOldInlineClassesManglingScheme = false
|
||||||
)
|
)
|
||||||
|
|
||||||
for (parameter in primaryConstructor?.valueParameters.orEmpty<KtParameter>()) {
|
for (parameter in primaryConstructor?.valueParameters.orEmpty<KtParameter>()) {
|
||||||
|
|||||||
+2
-1
@@ -35,7 +35,8 @@ class IdeaKotlinUastResolveProviderService : KotlinUastResolveProviderService {
|
|||||||
override fun getTypeMapper(element: KtElement): KotlinTypeMapper? {
|
override fun getTypeMapper(element: KtElement): KotlinTypeMapper? {
|
||||||
return KotlinTypeMapper(
|
return KotlinTypeMapper(
|
||||||
getBindingContext(element), ClassBuilderMode.LIGHT_CLASSES,
|
getBindingContext(element), ClassBuilderMode.LIGHT_CLASSES,
|
||||||
JvmProtoBufUtil.DEFAULT_MODULE_NAME, element.languageVersionSettings
|
JvmProtoBufUtil.DEFAULT_MODULE_NAME, element.languageVersionSettings,
|
||||||
|
useOldInlineClassesManglingScheme = false
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -60,7 +60,8 @@ class UastAnalysisHandlerExtension : AnalysisHandlerExtension {
|
|||||||
val typeMapper = KotlinTypeMapper(
|
val typeMapper = KotlinTypeMapper(
|
||||||
bindingContext, ClassBuilderMode.LIGHT_CLASSES,
|
bindingContext, ClassBuilderMode.LIGHT_CLASSES,
|
||||||
JvmProtoBufUtil.DEFAULT_MODULE_NAME,
|
JvmProtoBufUtil.DEFAULT_MODULE_NAME,
|
||||||
KotlinTypeMapper.LANGUAGE_VERSION_SETTINGS_DEFAULT // TODO use proper LanguageVersionSettings
|
KotlinTypeMapper.LANGUAGE_VERSION_SETTINGS_DEFAULT, // TODO use proper LanguageVersionSettings
|
||||||
|
useOldInlineClassesManglingScheme = false
|
||||||
)
|
)
|
||||||
this.typeMapper = typeMapper
|
this.typeMapper = typeMapper
|
||||||
return typeMapper
|
return typeMapper
|
||||||
|
|||||||
Reference in New Issue
Block a user