Adjust collection stubs generating to 'remove' transformation
See substitutedList* tests in Backend
This commit is contained in:
@@ -20,7 +20,9 @@ import org.jetbrains.kotlin.codegen.state.GenerationState
|
|||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.DECLARATION
|
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.DECLARATION
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
||||||
import org.jetbrains.kotlin.codegen.MutableClassDescriptor
|
import org.jetbrains.kotlin.load.java.SpecialSignatureInfo
|
||||||
|
import org.jetbrains.kotlin.load.java.getSpecialSignatureInfo
|
||||||
|
import org.jetbrains.kotlin.load.java.isBuiltinWithSpecialDescriptorInJvm
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.resolve.OverrideResolver
|
import org.jetbrains.kotlin.resolve.OverrideResolver
|
||||||
import org.jetbrains.kotlin.resolve.OverridingUtil
|
import org.jetbrains.kotlin.resolve.OverridingUtil
|
||||||
@@ -29,9 +31,7 @@ import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin
|
|||||||
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature
|
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature
|
||||||
import org.jetbrains.kotlin.types.*
|
import org.jetbrains.kotlin.types.*
|
||||||
import org.jetbrains.kotlin.types.checker.JetTypeChecker
|
import org.jetbrains.kotlin.types.checker.JetTypeChecker
|
||||||
import org.jetbrains.org.objectweb.asm.Opcodes.ACC_ABSTRACT
|
import org.jetbrains.org.objectweb.asm.Opcodes.*
|
||||||
import org.jetbrains.org.objectweb.asm.Opcodes.ACC_PUBLIC
|
|
||||||
import org.jetbrains.org.objectweb.asm.Opcodes.ACC_SYNTHETIC
|
|
||||||
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter
|
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter
|
||||||
import java.util.ArrayList
|
import java.util.ArrayList
|
||||||
import java.util.HashSet
|
import java.util.HashSet
|
||||||
@@ -97,8 +97,40 @@ class CollectionStubMethodGenerator(
|
|||||||
// errors when compiling Java against such classes because one of them doesn't seem to override the generic method
|
// errors when compiling Java against such classes because one of them doesn't seem to override the generic method
|
||||||
// declared in the Java Collection interface (can't override generic with erased). So we maintain an additional set of
|
// declared in the Java Collection interface (can't override generic with erased). So we maintain an additional set of
|
||||||
// methods which need to be generated with the ACC_SYNTHETIC flag
|
// methods which need to be generated with the ACC_SYNTHETIC flag
|
||||||
val originalSignature = method.findOverriddenFromDirectSuperClass(mutableClass)!!.getOriginal().signature()
|
val overriddenMethod = method.findOverriddenFromDirectSuperClass(mutableClass)!!
|
||||||
if (originalSignature.getAsmMethod() != signature.getAsmMethod()) {
|
val originalSignature = overriddenMethod.original.signature()
|
||||||
|
var specialSignature: JvmMethodSignature? = null
|
||||||
|
|
||||||
|
if (overriddenMethod.isBuiltinWithSpecialDescriptorInJvm()) {
|
||||||
|
// Stubs for remove(Ljava/lang/Object;)Z and remove(I) should not be synthetic
|
||||||
|
// Otherwise Javac will not see it
|
||||||
|
val overriddenMethodSignature = overriddenMethod.signature()
|
||||||
|
val genericSignatureInfo = overriddenMethod.getSpecialSignatureInfo()
|
||||||
|
|
||||||
|
val specialGenericSignature =
|
||||||
|
if (genericSignatureInfo != null)
|
||||||
|
genericSignatureInfo.signature
|
||||||
|
else
|
||||||
|
overriddenMethodSignature.genericsSignature
|
||||||
|
|
||||||
|
val (asmMethod, valueParameters) =
|
||||||
|
// if remove(E) in Kotlin -> remove(Object) in Java
|
||||||
|
// so choose original signature
|
||||||
|
if (genericSignatureInfo == SpecialSignatureInfo.GENERIC_PARAMETER)
|
||||||
|
Pair(originalSignature.asmMethod, originalSignature.valueParameters)
|
||||||
|
else
|
||||||
|
Pair(overriddenMethodSignature.asmMethod, overriddenMethodSignature.valueParameters)
|
||||||
|
|
||||||
|
specialSignature = JvmMethodSignature(
|
||||||
|
asmMethod,
|
||||||
|
specialGenericSignature,
|
||||||
|
valueParameters
|
||||||
|
)
|
||||||
|
|
||||||
|
methodStubsToGenerate.add(specialSignature)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (originalSignature.asmMethod != signature.asmMethod && originalSignature.asmMethod != specialSignature?.asmMethod) {
|
||||||
syntheticStubsToGenerate.add(originalSignature)
|
syntheticStubsToGenerate.add(originalSignature)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-1
@@ -138,7 +138,7 @@ private val CallableMemberDescriptor.isFromJava: Boolean
|
|||||||
private val CallableMemberDescriptor.propertyIfAccessor: CallableMemberDescriptor
|
private val CallableMemberDescriptor.propertyIfAccessor: CallableMemberDescriptor
|
||||||
get() = if (this is PropertyAccessorDescriptor) correspondingProperty else this
|
get() = if (this is PropertyAccessorDescriptor) correspondingProperty else this
|
||||||
|
|
||||||
val CallableMemberDescriptor.hasErasedValueParametersInJava: Boolean
|
private val CallableMemberDescriptor.hasErasedValueParametersInJava: Boolean
|
||||||
get() = fqNameOrNull() in BUILTIN_METHODS_ERASED_VALUE_PARAMETERS_FQ_NAMES
|
get() = fqNameOrNull() in BUILTIN_METHODS_ERASED_VALUE_PARAMETERS_FQ_NAMES
|
||||||
|
|
||||||
val Name.sameAsRenamedInJvmBuiltin: Boolean
|
val Name.sameAsRenamedInJvmBuiltin: Boolean
|
||||||
@@ -189,3 +189,8 @@ fun CallableMemberDescriptor.getSpecialSignatureInfo(): SpecialSignatureInfo? {
|
|||||||
else -> error("Unexpected kind of special builtin: $builtinFqName")
|
else -> error("Unexpected kind of special builtin: $builtinFqName")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun CallableMemberDescriptor.isBuiltinWithSpecialDescriptorInJvm(): Boolean {
|
||||||
|
if (!isFromBuiltins()) return false
|
||||||
|
return getSpecialSignatureInfo() == SpecialSignatureInfo.GENERIC_PARAMETER || overridesBuiltinSpecialDeclaration()
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user