Empty vararg support and SyntheticJavaPropertyDescriptor properties

This commit is contained in:
Michael Bogdanov
2016-10-03 17:16:44 +03:00
committed by Dmitry Petrov
parent 45ebe354ee
commit 29d1231b97
@@ -32,9 +32,11 @@ import org.jetbrains.kotlin.ir.declarations.IrVariable
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.util.render import org.jetbrains.kotlin.ir.util.render
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue
import org.jetbrains.kotlin.resolve.jvm.AsmTypes import org.jetbrains.kotlin.resolve.jvm.AsmTypes
import org.jetbrains.kotlin.resolve.jvm.AsmTypes.JAVA_THROWABLE_TYPE import org.jetbrains.kotlin.resolve.jvm.AsmTypes.JAVA_THROWABLE_TYPE
import org.jetbrains.kotlin.resolve.jvm.AsmTypes.OBJECT_TYPE import org.jetbrains.kotlin.resolve.jvm.AsmTypes.OBJECT_TYPE
import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.org.objectweb.asm.Label import org.jetbrains.org.objectweb.asm.Label
import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.Type
@@ -169,7 +171,8 @@ class ExpressionCodegen(
} }
val args = expression.descriptor.valueParameters.mapIndexed { i, valueParameterDescriptor -> val args = expression.descriptor.valueParameters.mapIndexed { i, valueParameterDescriptor ->
expression.getValueArgument(i) ?: DefaultArg(i) expression.getValueArgument(i) ?:
if (valueParameterDescriptor.hasDefaultValue()) DefaultArg(i) else Vararg(i)
} }
val defaultMask = DefaultCallArgs(callable.valueParameterTypes.size) val defaultMask = DefaultCallArgs(callable.valueParameterTypes.size)
@@ -182,6 +185,10 @@ class ExpressionCodegen(
pushDefaultValueOnStack(callable.valueParameterTypes[i], mv) pushDefaultValueOnStack(callable.valueParameterTypes[i], mv)
defaultMask.mark(expression.index) defaultMask.mark(expression.index)
} }
is Vararg -> {
mv.aconst(null)
//empty vararg
}
else -> TODO() else -> TODO()
} }
} }
@@ -486,6 +493,15 @@ class ExpressionCodegen(
//TODO where is best to unwrap? //TODO where is best to unwrap?
descriptor = descriptor.underlyingConstructorDescriptor descriptor = descriptor.underlyingConstructorDescriptor
} }
if (descriptor is CallableMemberDescriptor && JvmCodegenUtil.getDirectMember(descriptor) is SyntheticJavaPropertyDescriptor) {
val propertyDescriptor = JvmCodegenUtil.getDirectMember(descriptor) as SyntheticJavaPropertyDescriptor
if (descriptor is PropertyGetterDescriptor) {
descriptor = propertyDescriptor.getMethod
}
else {
descriptor = propertyDescriptor.setMethod!!
}
}
return typeMapper.mapToCallableMethod(descriptor as FunctionDescriptor, isSuper) return typeMapper.mapToCallableMethod(descriptor as FunctionDescriptor, isSuper)
} }
@@ -497,3 +513,5 @@ class ExpressionCodegen(
} }
private class DefaultArg(val index: Int) private class DefaultArg(val index: Int)
private class Vararg(val index: Int)