Factor out duplicated mangling logic for functions into the base class
^KT-57777 Fixed ^KT-57818 Fixed
This commit is contained in:
committed by
Space Team
parent
8ae196d4fc
commit
02180e8685
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
|
||||
import org.jetbrains.kotlin.name.SpecialNames
|
||||
|
||||
/**
|
||||
* A base mangle computer that generates a mangled name for a Kotlin declaration represented by [FirDeclaration].
|
||||
@@ -76,71 +77,35 @@ open class FirMangleComputer(
|
||||
accept(visitor, null)
|
||||
}
|
||||
|
||||
private fun FirFunction.mangleFunction(isCtor: Boolean, isStatic: Boolean, container: FirDeclaration) {
|
||||
override fun FirDeclaration.asTypeParameterContainer(): FirMemberDeclaration? =
|
||||
this as? FirMemberDeclaration
|
||||
|
||||
isRealExpect = isRealExpect || (this as? FirMemberDeclaration)?.isExpect == true
|
||||
override fun getContextReceiverTypes(function: FirFunction): List<ConeKotlinType> =
|
||||
when (function) {
|
||||
is FirPropertyAccessor -> function.propertySymbol.fir.contextReceivers
|
||||
else -> function.contextReceivers
|
||||
}.map { it.typeRef.coneType }
|
||||
|
||||
if (container is FirMemberDeclaration) {
|
||||
typeParameterContainers.add(container)
|
||||
}
|
||||
visitParent()
|
||||
override fun getExtensionReceiverParameterType(function: FirFunction): ConeKotlinType? =
|
||||
function.receiverParameter?.typeRef?.coneType
|
||||
?: (function as? FirPropertyAccessor)?.propertySymbol?.fir?.receiverParameter?.typeRef?.coneType
|
||||
|
||||
builder.appendName(MangleConstant.FUNCTION_NAME_PREFIX)
|
||||
override fun getValueParameters(function: FirFunction): List<FirValueParameter> =
|
||||
function.valueParameters
|
||||
|
||||
platformSpecificFunctionName()?.let {
|
||||
builder.append(it)
|
||||
return
|
||||
}
|
||||
override fun getReturnType(function: FirFunction): ConeKotlinType = function.returnTypeRef.coneType
|
||||
|
||||
val name = this.irName
|
||||
builder.append(name.asString())
|
||||
override fun getTypeParametersWithIndices(
|
||||
function: FirFunction,
|
||||
container: FirDeclaration,
|
||||
): Iterable<IndexedValue<ConeTypeParameterLookupTag>> =
|
||||
(container as? FirTypeParametersOwner)
|
||||
?.typeParameters
|
||||
.orEmpty()
|
||||
.map { it.symbol.toLookupTag() }
|
||||
.withIndex()
|
||||
|
||||
platformSpecificSuffix()?.let {
|
||||
builder.append(MangleConstant.PLATFORM_FUNCTION_MARKER)
|
||||
builder.append(it)
|
||||
}
|
||||
|
||||
mangleSignature(isCtor, isStatic, container)
|
||||
}
|
||||
|
||||
private fun FirFunction.mangleSignature(isCtor: Boolean, isStatic: Boolean, container: FirDeclaration) {
|
||||
if (!mode.signature) {
|
||||
return
|
||||
}
|
||||
|
||||
if (isStatic) {
|
||||
builder.appendSignature(MangleConstant.STATIC_MEMBER_MARK)
|
||||
}
|
||||
|
||||
val contextReceivers = when (this) {
|
||||
is FirPropertyAccessor -> propertySymbol.fir.contextReceivers
|
||||
else -> this.contextReceivers
|
||||
}
|
||||
|
||||
contextReceivers.forEach {
|
||||
builder.appendSignature(MangleConstant.CONTEXT_RECEIVER_PREFIX)
|
||||
mangleType(builder, it.typeRef.coneType, moduleData.session)
|
||||
}
|
||||
|
||||
val receiverType = receiverParameter?.typeRef ?: (this as? FirPropertyAccessor)?.propertySymbol?.fir?.receiverParameter?.typeRef
|
||||
receiverType?.let {
|
||||
builder.appendSignature(MangleConstant.EXTENSION_RECEIVER_PREFIX)
|
||||
mangleType(builder, it.coneType, moduleData.session)
|
||||
}
|
||||
|
||||
valueParameters.collectForMangler(builder, MangleConstant.VALUE_PARAMETERS) {
|
||||
appendSignature(specialValueParamPrefix(it))
|
||||
mangleValueParameter(this, it, moduleData.session)
|
||||
}
|
||||
(container as? FirTypeParametersOwner)?.typeParameters?.withIndex()?.toList().orEmpty()
|
||||
.collectForMangler(builder, MangleConstant.TYPE_PARAMETERS) { (index, typeParameter) ->
|
||||
mangleTypeParameter(this, typeParameter.symbol.toLookupTag(), index, moduleData.session)
|
||||
}
|
||||
|
||||
if (!isCtor && !returnTypeRef.isUnit && addReturnType()) {
|
||||
mangleType(builder, returnTypeRef.coneType, moduleData.session)
|
||||
}
|
||||
}
|
||||
override fun isUnit(type: ConeKotlinType) = type.isUnit
|
||||
|
||||
@OptIn(SymbolInternals::class)
|
||||
override fun getEffectiveParent(typeParameter: ConeTypeParameterLookupTag): FirMemberDeclaration = typeParameter.symbol.fir.run {
|
||||
@@ -153,7 +118,8 @@ open class FirMangleComputer(
|
||||
|
||||
override fun isVararg(valueParameter: FirValueParameter) = valueParameter.isVararg
|
||||
|
||||
override fun getValueParameterType(valueParameter: FirValueParameter) = valueParameter.returnTypeRef.coneType
|
||||
override fun getValueParameterType(valueParameter: FirValueParameter): ConeKotlinType =
|
||||
valueParameter.returnTypeRef.coneType
|
||||
|
||||
override fun getIndexOfTypeParameter(typeParameter: ConeTypeParameterLookupTag, container: FirMemberDeclaration) =
|
||||
container.typeParameters.indexOf(typeParameter.symbol.fir)
|
||||
@@ -233,7 +199,6 @@ open class FirMangleComputer(
|
||||
override fun visitElement(element: FirElement) = error("unexpected element ${element.render()}")
|
||||
|
||||
override fun visitRegularClass(regularClass: FirRegularClass) {
|
||||
isRealExpect = isRealExpect or regularClass.isExpect
|
||||
typeParameterContainers.add(regularClass)
|
||||
regularClass.mangleSimpleDeclaration(regularClass.name.asString())
|
||||
}
|
||||
@@ -243,7 +208,6 @@ open class FirMangleComputer(
|
||||
}
|
||||
|
||||
override fun visitVariable(variable: FirVariable) {
|
||||
isRealExpect = isRealExpect or variable.isExpect
|
||||
typeParameterContainers.add(variable)
|
||||
variable.visitParent()
|
||||
|
||||
@@ -281,20 +245,37 @@ open class FirMangleComputer(
|
||||
typeAlias.mangleSimpleDeclaration(typeAlias.name.asString())
|
||||
|
||||
override fun visitSimpleFunction(simpleFunction: FirSimpleFunction) {
|
||||
isRealExpect = isRealExpect || simpleFunction.isExpect
|
||||
val isStatic = simpleFunction.isStatic
|
||||
simpleFunction.mangleFunction(false, isStatic, simpleFunction)
|
||||
simpleFunction.mangleFunction(
|
||||
name = simpleFunction.name,
|
||||
isConstructor = false,
|
||||
isStatic = simpleFunction.isStatic,
|
||||
container = simpleFunction,
|
||||
session = simpleFunction.moduleData.session
|
||||
)
|
||||
}
|
||||
|
||||
override fun visitConstructor(constructor: FirConstructor) =
|
||||
constructor.mangleFunction(isCtor = true, isStatic = false, constructor)
|
||||
override fun visitConstructor(constructor: FirConstructor) {
|
||||
constructor.mangleFunction(
|
||||
name = SpecialNames.INIT,
|
||||
isConstructor = true,
|
||||
isStatic = false,
|
||||
container = constructor,
|
||||
session = constructor.moduleData.session
|
||||
)
|
||||
}
|
||||
|
||||
override fun visitPropertyAccessor(propertyAccessor: FirPropertyAccessor) {
|
||||
if (propertyAccessor is FirSyntheticPropertyAccessor) {
|
||||
// No need to distinguish between the accessor and its delegate.
|
||||
visitSimpleFunction(propertyAccessor.delegate)
|
||||
} else {
|
||||
propertyAccessor.mangleFunction(isCtor = false, propertyAccessor.isStatic, propertyAccessor.propertySymbol.fir)
|
||||
propertyAccessor.mangleFunction(
|
||||
name = propertyAccessor.irName,
|
||||
isConstructor = false,
|
||||
isStatic = propertyAccessor.isStatic,
|
||||
container = propertyAccessor.propertySymbol.fir,
|
||||
session = propertyAccessor.moduleData.session
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,19 +9,31 @@ import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.name.SpecialNames
|
||||
|
||||
/**
|
||||
* The name that an IR node generated from this [FirCallableDeclaration] will have, e.g. `<init>` for constructors,
|
||||
* `<get-foo>` and `<set-foo>` for property accessors, name as is for variables and simple functions,
|
||||
* and `<anonymous>` for anonymous functions.
|
||||
*/
|
||||
val FirCallableDeclaration.irName: Name
|
||||
get() = when (this) {
|
||||
is FirConstructor -> SpecialNames.INIT
|
||||
is FirSimpleFunction -> this.name
|
||||
is FirPropertyAccessor -> this.irName
|
||||
is FirVariable -> this.name
|
||||
is FirPropertyAccessor -> {
|
||||
val prefix = when {
|
||||
isGetter -> "<get-"
|
||||
isSetter -> "<set-"
|
||||
else -> error("unknown property accessor kind $this")
|
||||
}
|
||||
Name.special(prefix + propertySymbol.fir.name + ">")
|
||||
}
|
||||
|
||||
else -> SpecialNames.ANONYMOUS
|
||||
is FirFunction -> SpecialNames.ANONYMOUS
|
||||
}
|
||||
|
||||
/**
|
||||
* The name that an IR node generated from this [FirPropertyAccessor] will have.
|
||||
*
|
||||
* If the corresponding property has name `foo`, this will return `<get-foo>` or `<set-foo>`.
|
||||
*/
|
||||
val FirPropertyAccessor.irName: Name
|
||||
get() {
|
||||
val prefix = when {
|
||||
isGetter -> "<get-"
|
||||
isSetter -> "<set-"
|
||||
else -> error("unknown property accessor kind $this")
|
||||
}
|
||||
return Name.special(prefix + propertySymbol.fir.name + ">")
|
||||
}
|
||||
|
||||
+99
-2
@@ -5,6 +5,7 @@
|
||||
|
||||
package org.jetbrains.kotlin.backend.common.serialization.mangle
|
||||
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.types.model.*
|
||||
|
||||
/**
|
||||
@@ -41,8 +42,6 @@ abstract class BaseKotlinMangleComputer<Declaration, Type, TypeParameter, ValueP
|
||||
|
||||
protected val typeParameterContainers = ArrayList<TypeParameterContainer>(4)
|
||||
|
||||
protected var isRealExpect = false
|
||||
|
||||
protected open fun FunctionDeclaration.platformSpecificFunctionName(): String? = null
|
||||
|
||||
protected open fun FunctionDeclaration.platformSpecificSuffix(): String? = null
|
||||
@@ -85,6 +84,13 @@ abstract class BaseKotlinMangleComputer<Declaration, Type, TypeParameter, ValueP
|
||||
|
||||
protected abstract fun Declaration.visitParent()
|
||||
|
||||
/**
|
||||
* Like [visitParent], but may have some logic that makes it suitable specifically for mangling function names.
|
||||
*/
|
||||
protected open fun Declaration.visitParentForFunctionMangling() {
|
||||
visitParent()
|
||||
}
|
||||
|
||||
protected abstract fun Declaration.visit()
|
||||
|
||||
final override fun computeMangle(declaration: Declaration): String {
|
||||
@@ -103,6 +109,97 @@ abstract class BaseKotlinMangleComputer<Declaration, Type, TypeParameter, ValueP
|
||||
builder.appendName(name)
|
||||
}
|
||||
|
||||
protected abstract fun getContextReceiverTypes(function: FunctionDeclaration): List<Type>
|
||||
|
||||
protected abstract fun getExtensionReceiverParameterType(function: FunctionDeclaration): Type?
|
||||
|
||||
protected abstract fun getValueParameters(function: FunctionDeclaration): List<ValueParameter>
|
||||
|
||||
protected abstract fun getReturnType(function: FunctionDeclaration): Type?
|
||||
|
||||
protected abstract fun isUnit(type: Type): Boolean
|
||||
|
||||
protected abstract fun getTypeParametersWithIndices(
|
||||
function: FunctionDeclaration,
|
||||
container: Declaration,
|
||||
): Iterable<IndexedValue<TypeParameter>>
|
||||
|
||||
protected open fun FunctionDeclaration.platformSpecificFunctionMarks(): List<String> = emptyList()
|
||||
|
||||
/**
|
||||
* Simply attempts to cast [Declaration] to [TypeParameterContainer].
|
||||
*/
|
||||
protected abstract fun Declaration.asTypeParameterContainer(): TypeParameterContainer?
|
||||
|
||||
protected fun FunctionDeclaration.mangleFunction(
|
||||
name: Name,
|
||||
isConstructor: Boolean,
|
||||
isStatic: Boolean,
|
||||
container: Declaration,
|
||||
session: Session
|
||||
) {
|
||||
|
||||
container.asTypeParameterContainer()?.let(typeParameterContainers::add)
|
||||
|
||||
container.visitParentForFunctionMangling()
|
||||
|
||||
builder.appendName(MangleConstant.FUNCTION_NAME_PREFIX)
|
||||
|
||||
platformSpecificFunctionName()?.let {
|
||||
builder.append(it)
|
||||
return
|
||||
}
|
||||
|
||||
builder.append(name.asString())
|
||||
|
||||
mangleSignature(isConstructor, isStatic, container, session)
|
||||
}
|
||||
|
||||
private fun FunctionDeclaration.mangleSignature(
|
||||
isConstructor: Boolean,
|
||||
isStatic: Boolean,
|
||||
typeParameterContainer: Declaration,
|
||||
session: Session
|
||||
) {
|
||||
if (!mode.signature) return
|
||||
|
||||
if (!isConstructor && isStatic) {
|
||||
builder.appendSignature(MangleConstant.STATIC_MEMBER_MARK)
|
||||
}
|
||||
|
||||
platformSpecificFunctionMarks().forEach { builder.appendSignature(it) }
|
||||
|
||||
getContextReceiverTypes(this).forEach {
|
||||
builder.appendSignature(MangleConstant.CONTEXT_RECEIVER_PREFIX)
|
||||
mangleType(builder, it, session)
|
||||
}
|
||||
|
||||
getExtensionReceiverParameterType(this)?.let {
|
||||
builder.appendSignature(MangleConstant.EXTENSION_RECEIVER_PREFIX)
|
||||
mangleType(builder, it, session)
|
||||
}
|
||||
|
||||
getValueParameters(this).collectForMangler(builder, MangleConstant.VALUE_PARAMETERS) {
|
||||
appendSignature(specialValueParamPrefix(it))
|
||||
mangleValueParameter(this, it, session)
|
||||
}
|
||||
|
||||
getTypeParametersWithIndices(this, typeParameterContainer).collectForMangler(builder, MangleConstant.TYPE_PARAMETERS) {
|
||||
mangleTypeParameter(this, it.value, it.index, session)
|
||||
}
|
||||
|
||||
getReturnType(this)?.let {
|
||||
if (!isConstructor && !isUnit(it) && (addReturnType() || addReturnTypeSpecialCase(this@mangleSignature))) {
|
||||
mangleType(builder, it, session)
|
||||
}
|
||||
}
|
||||
|
||||
platformSpecificSuffix()?.let {
|
||||
builder.appendSignature(MangleConstant.PLATFORM_FUNCTION_MARKER)
|
||||
builder.appendSignature(it)
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract fun mangleType(tBuilder: StringBuilder, type: Type, declarationSiteSession: Session)
|
||||
|
||||
protected open fun mangleTypePlatformSpecific(type: Type, tBuilder: StringBuilder) {}
|
||||
|
||||
+45
-57
@@ -5,6 +5,7 @@
|
||||
|
||||
package org.jetbrains.kotlin.backend.common.serialization.mangle.descriptor
|
||||
|
||||
import org.jetbrains.kotlin.backend.common.serialization.isExpectMember
|
||||
import org.jetbrains.kotlin.backend.common.serialization.mangle.*
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.ir.descriptors.IrImplementingDelegateDescriptor
|
||||
@@ -24,7 +25,7 @@ open class DescriptorMangleComputer(builder: StringBuilder, mode: MangleMode) :
|
||||
/*Type=*/KotlinType,
|
||||
/*TypeParameter=*/TypeParameterDescriptor,
|
||||
/*ValueParameter=*/ValueParameterDescriptor,
|
||||
/*TypeParameterContainer=*/DeclarationDescriptor,
|
||||
/*TypeParameterContainer=*/DeclarationDescriptor, // CallableDescriptor or ClassDescriptor
|
||||
/*FunctionDeclaration=*/FunctionDescriptor,
|
||||
/*Session=*/Nothing?,
|
||||
>(builder, mode) {
|
||||
@@ -49,61 +50,32 @@ open class DescriptorMangleComputer(builder: StringBuilder, mode: MangleMode) :
|
||||
private val CallableDescriptor.isRealStatic: Boolean
|
||||
get() = dispatchReceiverParameter == null && containingDeclaration !is PackageFragmentDescriptor
|
||||
|
||||
private fun FunctionDescriptor.mangleFunction(isCtor: Boolean, container: CallableDescriptor) {
|
||||
override fun DeclarationDescriptor.asTypeParameterContainer(): DeclarationDescriptor =
|
||||
this
|
||||
|
||||
isRealExpect = isRealExpect or isExpect
|
||||
override fun getContextReceiverTypes(function: FunctionDescriptor): List<KotlinType> =
|
||||
function.contextReceiverParameters.map { it.type }
|
||||
|
||||
typeParameterContainers.add(container)
|
||||
container.containingDeclaration.visit()
|
||||
override fun getExtensionReceiverParameterType(function: FunctionDescriptor): KotlinType? =
|
||||
function.extensionReceiverParameter?.type
|
||||
|
||||
builder.appendName(MangleConstant.FUNCTION_NAME_PREFIX)
|
||||
override fun getValueParameters(function: FunctionDescriptor): List<ValueParameterDescriptor> =
|
||||
function.valueParameters
|
||||
|
||||
platformSpecificFunctionName()?.let {
|
||||
builder.append(it)
|
||||
return
|
||||
}
|
||||
override fun getReturnType(function: FunctionDescriptor): KotlinType? =
|
||||
function.returnType
|
||||
|
||||
builder.append(name.asString())
|
||||
override fun getTypeParametersWithIndices(
|
||||
function: FunctionDescriptor,
|
||||
container: DeclarationDescriptor,
|
||||
): List<IndexedValue<TypeParameterDescriptor>> =
|
||||
(container as? CallableDescriptor)
|
||||
?.typeParameters
|
||||
.orEmpty()
|
||||
.filter { it.containingDeclaration == container }
|
||||
.map { IndexedValue(it.index, it) }
|
||||
|
||||
mangleSignature(isCtor, container)
|
||||
}
|
||||
|
||||
private fun FunctionDescriptor.mangleSignature(isCtor: Boolean, realTypeParameterContainer: CallableDescriptor) {
|
||||
|
||||
if (!mode.signature) return
|
||||
|
||||
if (!isCtor && realTypeParameterContainer.isRealStatic) {
|
||||
builder.appendSignature(MangleConstant.STATIC_MEMBER_MARK)
|
||||
}
|
||||
|
||||
contextReceiverParameters.forEach {
|
||||
builder.appendSignature(MangleConstant.CONTEXT_RECEIVER_PREFIX)
|
||||
mangleType(builder, it.type, null)
|
||||
}
|
||||
|
||||
extensionReceiverParameter?.let {
|
||||
builder.appendSignature(MangleConstant.EXTENSION_RECEIVER_PREFIX)
|
||||
mangleExtensionReceiverParameter(builder, it)
|
||||
}
|
||||
|
||||
valueParameters.collectForMangler(builder, MangleConstant.VALUE_PARAMETERS) {
|
||||
appendSignature(specialValueParamPrefix(it))
|
||||
mangleValueParameter(this, it, null)
|
||||
}
|
||||
realTypeParameterContainer.typeParameters.filter { it.containingDeclaration == realTypeParameterContainer }
|
||||
.collectForMangler(builder, MangleConstant.TYPE_PARAMETERS) { mangleTypeParameter(this, it, it.index, null) }
|
||||
|
||||
returnType?.run {
|
||||
if (!isCtor && !isUnit() && (addReturnType() || addReturnTypeSpecialCase(this@mangleSignature))) {
|
||||
mangleType(builder, this, null)
|
||||
}
|
||||
}
|
||||
|
||||
platformSpecificSuffix()?.let {
|
||||
builder.appendSignature(MangleConstant.PLATFORM_FUNCTION_MARKER)
|
||||
builder.appendSignature(it)
|
||||
}
|
||||
}
|
||||
override fun isUnit(type: KotlinType) = type.isUnit()
|
||||
|
||||
private fun mangleExtensionReceiverParameter(vpBuilder: StringBuilder, param: ReceiverParameterDescriptor) {
|
||||
mangleType(vpBuilder, param.type, null)
|
||||
@@ -111,7 +83,8 @@ open class DescriptorMangleComputer(builder: StringBuilder, mode: MangleMode) :
|
||||
|
||||
final override fun isVararg(valueParameter: ValueParameterDescriptor) = valueParameter.varargElementType != null
|
||||
|
||||
final override fun getValueParameterType(valueParameter: ValueParameterDescriptor) = valueParameter.type
|
||||
final override fun getValueParameterType(valueParameter: ValueParameterDescriptor): KotlinType =
|
||||
valueParameter.type
|
||||
|
||||
@Suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE")
|
||||
final override fun mangleType(tBuilder: StringBuilder, wrappedType: KotlinType, declarationSiteSession: Nothing?) {
|
||||
@@ -173,7 +146,13 @@ open class DescriptorMangleComputer(builder: StringBuilder, mode: MangleMode) :
|
||||
|
||||
private fun manglePropertyAccessor(accessor: PropertyAccessorDescriptor) {
|
||||
val property = accessor.correspondingProperty
|
||||
accessor.mangleFunction(false, property)
|
||||
accessor.mangleFunction(
|
||||
name = accessor.name,
|
||||
isConstructor = false,
|
||||
isStatic = property.isRealStatic,
|
||||
container = property,
|
||||
session = null
|
||||
)
|
||||
}
|
||||
|
||||
protected open fun visitModuleDeclaration(descriptor: ModuleDescriptor) = reportUnexpectedDescriptor(descriptor)
|
||||
@@ -189,7 +168,13 @@ open class DescriptorMangleComputer(builder: StringBuilder, mode: MangleMode) :
|
||||
override fun visitVariableDescriptor(descriptor: VariableDescriptor, data: Nothing?) = reportUnexpectedDescriptor(descriptor)
|
||||
|
||||
override fun visitFunctionDescriptor(descriptor: FunctionDescriptor, data: Nothing?) {
|
||||
descriptor.mangleFunction(false, descriptor)
|
||||
descriptor.mangleFunction(
|
||||
name = descriptor.name,
|
||||
isConstructor = false,
|
||||
isStatic = descriptor.isRealStatic,
|
||||
container = descriptor,
|
||||
session = null
|
||||
)
|
||||
}
|
||||
|
||||
override fun visitTypeParameterDescriptor(descriptor: TypeParameterDescriptor, data: Nothing?) {
|
||||
@@ -200,7 +185,6 @@ open class DescriptorMangleComputer(builder: StringBuilder, mode: MangleMode) :
|
||||
}
|
||||
|
||||
override fun visitClassDescriptor(descriptor: ClassDescriptor, data: Nothing?) {
|
||||
isRealExpect = isRealExpect or descriptor.isExpect
|
||||
typeParameterContainers.add(descriptor)
|
||||
descriptor.mangleSimpleDeclaration(descriptor.name.asString())
|
||||
}
|
||||
@@ -214,7 +198,13 @@ open class DescriptorMangleComputer(builder: StringBuilder, mode: MangleMode) :
|
||||
}
|
||||
|
||||
override fun visitConstructorDescriptor(constructorDescriptor: ConstructorDescriptor, data: Nothing?) {
|
||||
constructorDescriptor.mangleFunction(isCtor = true, container = constructorDescriptor)
|
||||
constructorDescriptor.mangleFunction(
|
||||
name = constructorDescriptor.name,
|
||||
isConstructor = true,
|
||||
isStatic = constructorDescriptor.isRealStatic,
|
||||
container = constructorDescriptor,
|
||||
session = null
|
||||
)
|
||||
}
|
||||
|
||||
override fun visitScriptDescriptor(scriptDescriptor: ScriptDescriptor, data: Nothing?) =
|
||||
@@ -230,8 +220,6 @@ open class DescriptorMangleComputer(builder: StringBuilder, mode: MangleMode) :
|
||||
|
||||
val extensionReceiver = actualDescriptor.extensionReceiverParameter
|
||||
|
||||
isRealExpect = isRealExpect or actualDescriptor.isExpect
|
||||
|
||||
typeParameterContainers.add(actualDescriptor)
|
||||
actualDescriptor.containingDeclaration.visit()
|
||||
|
||||
|
||||
+48
-65
@@ -40,8 +40,6 @@ open class IrMangleComputer(
|
||||
get() = throw UnsupportedOperationException("Builtins are unavailable")
|
||||
}
|
||||
|
||||
open fun IrFunction.platformSpecificFunctionMarks(): List<String> = emptyList()
|
||||
|
||||
override fun copy(newMode: MangleMode) = IrMangleComputer(builder, newMode, compatibleMode)
|
||||
|
||||
final override fun IrDeclaration.visitParent() {
|
||||
@@ -52,70 +50,47 @@ open class IrMangleComputer(
|
||||
acceptVoid(Visitor())
|
||||
}
|
||||
|
||||
private fun IrFunction.mangleFunction(isCtor: Boolean, isStatic: Boolean, container: IrDeclaration) {
|
||||
override fun IrDeclaration.asTypeParameterContainer(): IrDeclaration =
|
||||
this
|
||||
|
||||
isRealExpect = isRealExpect or isExpect
|
||||
|
||||
typeParameterContainers.add(container)
|
||||
val containerParent = container.parent
|
||||
val realParent =
|
||||
if (containerParent is IrField && containerParent.origin == IrDeclarationOrigin.DELEGATE) containerParent.parent else containerParent
|
||||
override fun IrDeclaration.visitParentForFunctionMangling() {
|
||||
val declarationParent = parent
|
||||
val realParent = if (declarationParent is IrField && declarationParent.origin == IrDeclarationOrigin.DELEGATE)
|
||||
declarationParent.parent
|
||||
else
|
||||
declarationParent
|
||||
realParent.acceptVoid(Visitor())
|
||||
|
||||
builder.appendName(MangleConstant.FUNCTION_NAME_PREFIX)
|
||||
|
||||
platformSpecificFunctionName()?.let {
|
||||
builder.append(it)
|
||||
return
|
||||
}
|
||||
|
||||
val funName = name.asString()
|
||||
|
||||
builder.append(funName)
|
||||
|
||||
mangleSignature(isCtor, isStatic)
|
||||
}
|
||||
|
||||
private fun IrFunction.mangleSignature(isCtor: Boolean, isStatic: Boolean) {
|
||||
if (!mode.signature) return
|
||||
override fun getContextReceiverTypes(function: IrFunction): List<IrType> =
|
||||
function
|
||||
.valueParameters
|
||||
.asSequence()
|
||||
.take(function.contextReceiverParametersCount)
|
||||
.filterNot { it.isHidden }
|
||||
.map { it.type }
|
||||
.toList()
|
||||
|
||||
if (isStatic) {
|
||||
builder.appendSignature(MangleConstant.STATIC_MEMBER_MARK)
|
||||
}
|
||||
override fun getExtensionReceiverParameterType(function: IrFunction) =
|
||||
function
|
||||
.extensionReceiverParameter
|
||||
?.takeUnless { it.isHidden }
|
||||
?.type
|
||||
|
||||
platformSpecificFunctionMarks().forEach {
|
||||
builder.appendSignature(it)
|
||||
}
|
||||
override fun getValueParameters(function: IrFunction): List<IrValueParameter> =
|
||||
function
|
||||
.valueParameters
|
||||
.asSequence()
|
||||
.drop(function.contextReceiverParametersCount)
|
||||
.filterNot { it.isHidden }
|
||||
.toList()
|
||||
|
||||
valueParameters.take(contextReceiverParametersCount).forEach {
|
||||
if (!it.isHidden) {
|
||||
builder.appendSignature(MangleConstant.CONTEXT_RECEIVER_PREFIX)
|
||||
mangleType(builder, it.type, null)
|
||||
}
|
||||
}
|
||||
override fun getReturnType(function: IrFunction) = function.returnType
|
||||
|
||||
extensionReceiverParameter?.let {
|
||||
if (!it.isHidden) {
|
||||
builder.appendSignature(MangleConstant.EXTENSION_RECEIVER_PREFIX)
|
||||
mangleValueParameter(builder, it, null)
|
||||
}
|
||||
}
|
||||
override fun getTypeParametersWithIndices(function: IrFunction, container: IrDeclaration): List<IndexedValue<IrTypeParameterSymbol>> =
|
||||
function.typeParameters.map { IndexedValue(it.index, it.symbol) }
|
||||
|
||||
valueParameters.drop(contextReceiverParametersCount).collectForMangler(builder, MangleConstant.VALUE_PARAMETERS) {
|
||||
if (!it.isHidden) {
|
||||
appendSignature(specialValueParamPrefix(it))
|
||||
mangleValueParameter(this, it, null)
|
||||
}
|
||||
}
|
||||
|
||||
typeParameters.collectForMangler(builder, MangleConstant.TYPE_PARAMETERS) {
|
||||
mangleTypeParameter(this, it.symbol, it.index, null)
|
||||
}
|
||||
|
||||
if (!isCtor && !returnType.isUnit() && (addReturnType() || addReturnTypeSpecialCase(this))) {
|
||||
mangleType(builder, returnType, null)
|
||||
}
|
||||
}
|
||||
override fun isUnit(type: IrType) = type.isUnit()
|
||||
|
||||
final override fun getEffectiveParent(typeParameter: IrTypeParameterSymbol): IrDeclaration = typeParameter.owner.run {
|
||||
when (val irParent = parent) {
|
||||
@@ -171,7 +146,6 @@ open class IrMangleComputer(
|
||||
}
|
||||
|
||||
override fun visitClass(declaration: IrClass) {
|
||||
isRealExpect = isRealExpect or declaration.isExpect
|
||||
typeParameterContainers.add(declaration)
|
||||
|
||||
val className = declaration.name.asString()
|
||||
@@ -188,7 +162,6 @@ open class IrMangleComputer(
|
||||
"Expected at least one accessor or backing field for property ${declaration.render()}"
|
||||
}
|
||||
|
||||
isRealExpect = isRealExpect or declaration.isExpect
|
||||
typeParameterContainers.add(declaration)
|
||||
declaration.visitParent()
|
||||
|
||||
@@ -268,16 +241,26 @@ open class IrMangleComputer(
|
||||
}
|
||||
|
||||
override fun visitSimpleFunction(declaration: IrSimpleFunction) {
|
||||
isRealExpect = isRealExpect or declaration.isExpect
|
||||
|
||||
val container = declaration.correspondingPropertySymbol?.owner ?: declaration
|
||||
val isStatic = declaration.dispatchReceiverParameter == null &&
|
||||
(container.parent !is IrPackageFragment && !container.parent.isFacadeClass)
|
||||
|
||||
declaration.mangleFunction(false, isStatic, container)
|
||||
declaration.mangleFunction(
|
||||
name = declaration.name,
|
||||
isConstructor = false,
|
||||
isStatic = isStatic,
|
||||
container = container,
|
||||
session = null
|
||||
)
|
||||
}
|
||||
|
||||
override fun visitConstructor(declaration: IrConstructor) =
|
||||
declaration.mangleFunction(isCtor = true, isStatic = false, declaration)
|
||||
override fun visitConstructor(declaration: IrConstructor) {
|
||||
declaration.mangleFunction(
|
||||
name = declaration.name,
|
||||
isConstructor = true,
|
||||
isStatic = false,
|
||||
container = declaration,
|
||||
session = null
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
// IGNORE_BACKEND: JS_IR
|
||||
// IGNORE_BACKEND: JS_IR_ES6
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: ANY
|
||||
// ^ KT-57777
|
||||
|
||||
class TestClass
|
||||
|
||||
interface TestInterface
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
// IGNORE_BACKEND: JS_IR_ES6
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: ANY
|
||||
// ^ KT-57775, KT-57777
|
||||
// ^ KT-57775
|
||||
|
||||
enum class TestEnum1 {
|
||||
TEST1, TEST2
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
// IGNORE_BACKEND: JS_IR_ES6
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: ANY
|
||||
// ^ KT-57775, KT-57777
|
||||
// ^ KT-57775
|
||||
|
||||
enum class TestFinalEnum1 {
|
||||
X1
|
||||
|
||||
@@ -3,9 +3,6 @@
|
||||
// FULL_JDK
|
||||
// WITH_STDLIB
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: ANY
|
||||
// ^ KT-57775, KT-57430, KT-57777
|
||||
|
||||
enum class MyEnum {
|
||||
Ok, Nope
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
// IGNORE_BACKEND: JS_IR_ES6
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: ANY
|
||||
// ^ KT-57775, KT-57777
|
||||
// ^ KT-57775
|
||||
|
||||
enum class A {
|
||||
X("asd"),
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
// IGNORE_BACKEND: JS_IR_ES6
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: ANY
|
||||
// ^ KT-57775, KT-57777
|
||||
// ^ KT-57775
|
||||
|
||||
enum class Test0(val x: Int) {
|
||||
ZERO;
|
||||
|
||||
-3
@@ -1,9 +1,6 @@
|
||||
// IGNORE_BACKEND: JS_IR
|
||||
// IGNORE_BACKEND: JS_IR_ES6
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: ANY
|
||||
// ^ KT-57777
|
||||
|
||||
annotation class TestAnn(val x: String)
|
||||
|
||||
@TestAnn("class")
|
||||
|
||||
Vendored
-4
@@ -1,9 +1,5 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
const val ONE = 1
|
||||
|
||||
annotation class A(val x: Int)
|
||||
|
||||
Vendored
-4
@@ -1,7 +1,3 @@
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
annotation class A(val x: String)
|
||||
|
||||
class Cell(var value: Int) {
|
||||
|
||||
-3
@@ -1,9 +1,6 @@
|
||||
// IGNORE_BACKEND: JS_IR
|
||||
// IGNORE_BACKEND: JS_IR_ES6
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: ANY
|
||||
// ^ KT-57777
|
||||
|
||||
enum class En { A, B, C, D }
|
||||
|
||||
annotation class TestAnn(val x: En)
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
annotation class TestAnn(val x: String)
|
||||
|
||||
@field:TestAnn("testVal.field")
|
||||
|
||||
-4
@@ -1,9 +1,5 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
annotation class TestAnn(val x: String)
|
||||
|
||||
@TestAnn("testVal.property")
|
||||
|
||||
-4
@@ -1,9 +1,5 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
annotation class TestAnn(val x: String)
|
||||
|
||||
val test1: String
|
||||
|
||||
Vendored
-4
@@ -1,9 +1,5 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
annotation class AnnParam
|
||||
|
||||
@setparam:AnnParam
|
||||
|
||||
-4
@@ -1,9 +1,5 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
annotation class Ann
|
||||
|
||||
class A {
|
||||
|
||||
@@ -1,7 +1,3 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
val test = try { } catch (e : Throwable) { }
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
const val I0 = 0
|
||||
const val I1 = 1
|
||||
const val I2 = I0 + I1 + I1
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
// FIR_IDENTICAL
|
||||
// !LANGUAGE: +ContextReceivers
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// ^ KT-57818
|
||||
|
||||
interface A {
|
||||
fun a(): Int
|
||||
}
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
@Deprecated("")
|
||||
val testVal = 1
|
||||
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
val String.test1 get() = 42
|
||||
|
||||
var String.test2
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// ^ KT-57818
|
||||
|
||||
class C<T>
|
||||
|
||||
object Delegate {
|
||||
|
||||
@@ -4,9 +4,6 @@
|
||||
// IGNORE_BACKEND_K2: JS_IR
|
||||
// IGNORE_BACKEND_K2: JS_IR_ES6
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: ANY
|
||||
// ^ KT-57777
|
||||
|
||||
// MODULE: lib
|
||||
// FILE: lib.kt
|
||||
expect enum class MyEnum {
|
||||
|
||||
+88
-2
@@ -1,7 +1,93 @@
|
||||
// FILE: main.kt
|
||||
// MODULE: <lib>
|
||||
// FILE: lib.kt
|
||||
|
||||
// CHECK:
|
||||
// Mangled name: MyEnum
|
||||
// Public signature: /MyEnum|null[1]
|
||||
expect enum class MyEnum : Enum<MyEnum> {
|
||||
// CHECK:
|
||||
// Mangled name: MyEnum#<init>(){}
|
||||
// Public signature: /MyEnum.<init>|-5645683436151566731[1]
|
||||
private expect constructor() /* primary */
|
||||
// CHECK:
|
||||
// Mangled name: MyEnum.BAR
|
||||
// Public signature: /MyEnum.BAR|null[1]
|
||||
BAR
|
||||
|
||||
// CHECK:
|
||||
// Mangled name: MyEnum.FOO
|
||||
// Public signature: /MyEnum.FOO|null[1]
|
||||
FOO
|
||||
|
||||
// CHECK:
|
||||
// Mangled name: MyEnum#valueOf#static(kotlin.String){}MyEnum
|
||||
// Public signature: /MyEnum.valueOf|4316550590519800984[1]
|
||||
expect fun valueOf(value: String): MyEnum
|
||||
|
||||
// CHECK JVM_IR:
|
||||
// Mangled name: MyEnum#values#static(){}kotlin.Array<MyEnum>
|
||||
// Public signature: /MyEnum.values|3097625172661156808[1]
|
||||
expect fun values(): Array<MyEnum>
|
||||
|
||||
// CHECK JVM_IR:
|
||||
// Mangled name: MyEnum#clone(){}kotlin.Any
|
||||
// Public signature: /MyEnum.clone|-6903128697527593263[1]
|
||||
protected expect /* fake */ override fun clone(): Any
|
||||
|
||||
// CHECK JVM_IR:
|
||||
// Mangled name: MyEnum#compareTo(MyEnum){}kotlin.Int
|
||||
// Public signature: /MyEnum.compareTo|2015858924903177055[1]
|
||||
expect /* fake */ override operator fun compareTo(other: MyEnum): Int
|
||||
|
||||
// CHECK JVM_IR:
|
||||
// Mangled name: MyEnum#equals(kotlin.Any?){}kotlin.Boolean
|
||||
// Public signature: /MyEnum.equals|722809408929142791[1]
|
||||
expect /* fake */ override operator fun equals(other: Any?): Boolean
|
||||
|
||||
// CHECK JVM_IR:
|
||||
// Mangled name: MyEnum#hashCode(){}kotlin.Int
|
||||
// Public signature: /MyEnum.hashCode|-8048879360829830756[1]
|
||||
expect /* fake */ override fun hashCode(): Int
|
||||
|
||||
// CHECK JVM_IR:
|
||||
// Mangled name: MyEnum#toString(){}kotlin.String
|
||||
// Public signature: /MyEnum.toString|6958853723545266802[1]
|
||||
expect /* fake */ override fun toString(): String
|
||||
|
||||
// CHECK JVM_IR:
|
||||
// Mangled name: MyEnum#static{}entries
|
||||
// Public signature: /MyEnum.entries|-5134227801081826149[1]
|
||||
expect val entries: EnumEntries<MyEnum>
|
||||
// CHECK:
|
||||
// Mangled name: MyEnum#<get-entries>#static(){}kotlin.enums.EnumEntries<MyEnum>
|
||||
// Public signature: /MyEnum.entries.<get-entries>|-3922959509726908718[1]
|
||||
get(): EnumEntries<MyEnum>
|
||||
|
||||
// CHECK JVM_IR:
|
||||
// Mangled name: MyEnum{}name
|
||||
// Public signature: /MyEnum.name|4231860309499509769[1]
|
||||
expect /* fake */ override val name: String
|
||||
// CHECK:
|
||||
// Mangled name: MyEnum#<get-name>(){}kotlin.String
|
||||
// Public signature: /MyEnum.name.<get-name>|-8006111524522882650[1]
|
||||
/* fake */ override get(): String
|
||||
|
||||
// CHECK JVM_IR:
|
||||
// Mangled name: MyEnum{}ordinal
|
||||
// Public signature: /MyEnum.ordinal|1912745122988592376[1]
|
||||
expect /* fake */ override val ordinal: Int
|
||||
// CHECK:
|
||||
// Mangled name: MyEnum#<get-ordinal>(){}kotlin.Int
|
||||
// Public signature: /MyEnum.ordinal.<get-ordinal>|-6902664390061762634[1]
|
||||
/* fake */ override get(): Int
|
||||
|
||||
}
|
||||
|
||||
// MODULE: main
|
||||
// FILE: main.kt
|
||||
|
||||
// CHECK JVM_IR:
|
||||
// Mangled name: MyEnum
|
||||
// Public signature: /MyEnum|null[0]
|
||||
enum class MyEnum : Enum<MyEnum> {
|
||||
// CHECK:
|
||||
@@ -46,7 +132,7 @@ enum class MyEnum : Enum<MyEnum> {
|
||||
// CHECK JVM_IR:
|
||||
// Mangled name: MyEnum#equals(kotlin.Any?){}kotlin.Boolean
|
||||
// Public signature: /MyEnum.equals|722809408929142791[0]
|
||||
/* fake */ override fun equals(other: Any?): Boolean
|
||||
/* fake */ override operator fun equals(other: Any?): Boolean
|
||||
|
||||
// CHECK JVM_IR:
|
||||
// Mangled name: MyEnum#hashCode(){}kotlin.Int
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: ANY
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JVM_IR
|
||||
// ^ KT-57429
|
||||
|
||||
val test1 = 42
|
||||
|
||||
@@ -1,7 +1,3 @@
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
val test1 : (String) -> String = { it }
|
||||
val test2 : Any.(Any) -> Any = { it.hashCode() }
|
||||
val test3 = { i: Int, j: Int -> }
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// ^ KT-57818
|
||||
|
||||
val test1 get() = 42
|
||||
|
||||
var test2 get() = 42; set(value) {}
|
||||
|
||||
-3
@@ -1,8 +1,5 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// ^ KT-57818
|
||||
|
||||
class Test1<T : U, U>
|
||||
|
||||
fun <T : U, U> test2() {}
|
||||
|
||||
-4
@@ -1,10 +1,6 @@
|
||||
// FIR_IDENTICAL
|
||||
// WITH_STDLIB
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
class MyClass(val value: String)
|
||||
|
||||
operator fun MyClass.provideDelegate(host: Any?, p: Any): String =
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
class Delegate(val value: String) {
|
||||
operator fun getValue(thisRef: Any?, property: Any?) = value
|
||||
}
|
||||
|
||||
@@ -1,7 +1,3 @@
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
val p = 0
|
||||
fun foo() = 1
|
||||
|
||||
|
||||
@@ -1,7 +1,3 @@
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
var p = 0
|
||||
|
||||
fun testVariable() {
|
||||
|
||||
@@ -1,7 +1,3 @@
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
class A
|
||||
|
||||
operator fun A.plusAssign(s: String) {}
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
class A {
|
||||
fun foo() {}
|
||||
val bar = 0
|
||||
|
||||
Vendored
+1
-1
@@ -1,4 +1,4 @@
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: ANY
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JVM_IR
|
||||
// ^ KT-57429
|
||||
|
||||
open class L<LL>(val ll: LL)
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
class A<T> {
|
||||
fun foo() {}
|
||||
val bar = 42
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: ANY
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JVM_IR
|
||||
// ^ KT-57433
|
||||
|
||||
package test
|
||||
|
||||
@@ -1,7 +1,3 @@
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
import Host.objectMember
|
||||
|
||||
object Host {
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// ^ KT-57818
|
||||
|
||||
fun <T> castFun(x: Any) = x as T
|
||||
|
||||
fun <T> Any.castExtFun() = this as T
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
class A
|
||||
|
||||
val test = A()
|
||||
|
||||
@@ -1,7 +1,3 @@
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
val p: Any? = null
|
||||
|
||||
fun foo(): Any? = null
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
// IGNORE_BACKEND: JS_IR_ES6
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: ANY
|
||||
// ^ KT-57777, KT-57427, KT-57430
|
||||
// ^ KT-57427, KT-57430
|
||||
|
||||
enum class X {
|
||||
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
// IGNORE_BACKEND: JS_IR
|
||||
// IGNORE_BACKEND: JS_IR_ES6
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: ANY
|
||||
// ^ KT-57777
|
||||
|
||||
enum class A { V1 }
|
||||
|
||||
fun testVariableAssignment_throws(a: A) {
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
val String.okext: String get() = "OK"
|
||||
fun String.test5() = okext
|
||||
|
||||
@@ -1,7 +1,3 @@
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
var testSimple: Int = 0
|
||||
set(value) {
|
||||
field = value
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
// WITH_STDLIB
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
fun interface Fn<T, R> {
|
||||
fun run(s: String, i: Int, t: T): R
|
||||
}
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// ^ KT-57818
|
||||
|
||||
val <T> T.id get() = this
|
||||
|
||||
val test = "abc".id
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: ANY
|
||||
// ^ KT-57436, KT-57429
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JVM_IR
|
||||
// ^ KT-57429
|
||||
|
||||
class Value<T>(var value: T = null as T, var text: String? = null)
|
||||
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// ^ KT-57818
|
||||
|
||||
inline fun <reified T : Any> Any.test1(): T? =
|
||||
if (this is T) this else null
|
||||
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
val test1 = "\uD83E\uDD17"
|
||||
val test2 = "\uD83E\uDD17\uD83E\uDD17"
|
||||
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: ANY
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JVM_IR
|
||||
// ^ KT-57429
|
||||
|
||||
class A<T>(private val value: T) {
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
import A.foo
|
||||
import A.bar
|
||||
import A.fooExt
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
// IGNORE_BACKEND: JS_IR
|
||||
// IGNORE_BACKEND: JS_IR_ES6
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: ANY
|
||||
// ^ KT-57777
|
||||
|
||||
object A
|
||||
|
||||
enum class En { X }
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
val ok = "OK"
|
||||
val ok2 = ok
|
||||
val ok3: String get() = "OK"
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
class A {
|
||||
fun foo() {}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: ANY
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JVM_IR
|
||||
// ^ KT-57433
|
||||
|
||||
package test
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
// WITH_STDLIB
|
||||
// !LANGUAGE: +ImplicitSignedToUnsignedIntegerConversion
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// ^ KT-57818
|
||||
|
||||
// FILE: signedToUnsignedConversions_annotation.kt
|
||||
|
||||
package kotlin.internal
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
fun foo(): String = ""
|
||||
val x = 42
|
||||
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
// IGNORE_BACKEND: JS_IR
|
||||
// IGNORE_BACKEND: JS_IR_ES6
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: ANY
|
||||
// ^ KT-57777
|
||||
|
||||
val n: Any? = null
|
||||
|
||||
enum class En(val x: String?) {
|
||||
|
||||
@@ -1,7 +1,3 @@
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
import Host.Nested
|
||||
|
||||
class C(x: Int)
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// ^ KT-57818
|
||||
|
||||
inline fun <reified T : Any> classRefFun() = T::class
|
||||
|
||||
inline fun <reified T : Any> Any.classRefExtFun() = T::class
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
// FIR_IDENTICAL
|
||||
// WITH_STDLIB
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// ^ KT-57818
|
||||
|
||||
val testSimpleUIntLiteral = 1u
|
||||
|
||||
val testSimpleUIntLiteralWithOverflow = 0xFFFF_FFFFu
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
// IGNORE_BACKEND: JS_IR
|
||||
// IGNORE_BACKEND: JS_IR_ES6
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: ANY
|
||||
// ^ KT-57777
|
||||
|
||||
enum class Enum { A }
|
||||
object A
|
||||
val a = 0
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
val test1 = arrayOf<String>()
|
||||
val test2 = arrayOf("1", "2", "3")
|
||||
val test3 = arrayOf("0", *test2, *test1, "4")
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// ^ KT-57818
|
||||
|
||||
val <T : CharSequence> T.gk: () -> T
|
||||
get() = { -> this }
|
||||
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
// IGNORE_BACKEND: JS_IR
|
||||
// IGNORE_BACKEND: JS_IR_ES6
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: ANY
|
||||
// ^ KT-57777
|
||||
|
||||
enum class En { A, B, C }
|
||||
|
||||
fun test() {
|
||||
|
||||
@@ -2,9 +2,6 @@
|
||||
// IGNORE_BACKEND: JS_IR
|
||||
// IGNORE_BACKEND: JS_IR_ES6
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: ANY
|
||||
// ^ KT-57777
|
||||
|
||||
enum class EE(val myName: String = this.toString().lowercase()) {
|
||||
ENTRY;
|
||||
}
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
// TARGET_BACKEND: JS_IR
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: ANY
|
||||
// ^ KT-57777
|
||||
|
||||
package events
|
||||
|
||||
external open class internal {
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
val test1 = { 42 }
|
||||
|
||||
val test2 = { }
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
// IGNORE_BACKEND: JS_IR_ES6
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: ANY
|
||||
// ^ KT-57775, KT-57430, KT-57777
|
||||
// ^ KT-57775, KT-57430
|
||||
|
||||
enum class Z {
|
||||
ENTRY {
|
||||
|
||||
-4
@@ -1,7 +1,3 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JS_IR
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: NATIVE
|
||||
// ^ KT-57818
|
||||
|
||||
val test = 2 + 2
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// !LANGUAGE: -ForbidUsingExtensionPropertyTypeParameterInDelegate
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: ANY
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JVM_IR
|
||||
// ^ KT-57429
|
||||
|
||||
import kotlin.reflect.KProperty1
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: ANY
|
||||
// MUTE_SIGNATURE_COMPARISON_K2: JVM_IR
|
||||
// ^ KT-57429, KT-57427
|
||||
|
||||
import kotlin.reflect.KMutableProperty
|
||||
|
||||
Reference in New Issue
Block a user