New J2K: Use real method symbols in ArrayInitializerConversion

This commit is contained in:
Ilya Kirillov
2018-12-24 12:03:30 +03:00
committed by Ilya Kirillov
parent 71b194d0d6
commit ec1bc35df7
@@ -18,18 +18,20 @@ class ArrayInitializerConversion(private val context: ConversionContext) : Recur
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
var newElement = element var newElement = element
if (element is JKJavaNewArray) { if (element is JKJavaNewArray) {
val arrayType = element.type.type val arrayType = element.type.type.asPrimitiveType()
val arrayConstructorName =
if (arrayType != null)
CollectionLiteralResolver.PRIMITIVE_TYPE_TO_ARRAY[PrimitiveType.valueOf(arrayType.jvmPrimitiveType.name)]!!.asString()
else
CollectionLiteralResolver.ARRAY_OF_FUNCTION.asString()
newElement = JKJavaMethodCallExpressionImpl( newElement = JKJavaMethodCallExpressionImpl(
context.symbolProvider.provideByFqName( context.symbolProvider.provideByFqName("kotlin.$arrayConstructorName"),
if (arrayType is JKJavaPrimitiveType)
CollectionLiteralResolver.PRIMITIVE_TYPE_TO_ARRAY[PrimitiveType.valueOf(arrayType.jvmPrimitiveType.name)]!!.asString()
else
CollectionLiteralResolver.ARRAY_OF_FUNCTION.asString()
),
JKExpressionListImpl(element.initializer.also { element.initializer = emptyList() }) JKExpressionListImpl(element.initializer.also { element.initializer = emptyList() })
) )
} else if (element is JKJavaNewEmptyArray) { } else if (element is JKJavaNewEmptyArray) {
newElement = buildArrayInitializer(element.initializer.also { element.initializer = emptyList() }, element.type.type) newElement = buildArrayInitializer(
element.initializer.also { element.initializer = emptyList() }, element.type.type
)
} }
return recurse(newElement) return recurse(newElement)
@@ -37,19 +39,23 @@ class ArrayInitializerConversion(private val context: ConversionContext) : Recur
private fun buildArrayInitializer(dimensions: List<JKExpression>, type: JKType): JKExpression { private fun buildArrayInitializer(dimensions: List<JKExpression>, type: JKType): JKExpression {
if (dimensions.size == 1) { if (dimensions.size == 1) {
val methodOrConstructorReference = if (type !is JKJavaPrimitiveType) return if (type !is JKJavaPrimitiveType) {
context.symbolProvider.provideByFqName("kotlin/arrayOfNulls") JKJavaMethodCallExpressionImpl(
else context.symbolProvider.provideByFqName("kotlin/arrayOfNulls"),
JKUnresolvedMethod(arrayFqName(type).replace('/', '.')/*TODO resolve real reference*/) JKExpressionListImpl(dimensions[0]),
return JKJavaMethodCallExpressionImpl( JKTypeArgumentListImpl(listOf(JKTypeElementImpl(type.updateNullability(Nullability.NotNull))))
methodOrConstructorReference, )
JKExpressionListImpl(dimensions[0]), } else {
JKTypeArgumentListImpl(if (type is JKJavaPrimitiveType) emptyList() else listOf(JKTypeElementImpl(type))) JKJavaNewExpressionImpl(
) context.symbolProvider.provideByFqName(arrayFqName(type).replace('/', '.')),
JKExpressionListImpl(dimensions[0]),
JKTypeArgumentListImpl(emptyList())
)
}
} }
if (dimensions[1] !is JKStubExpression) { if (dimensions[1] !is JKStubExpression) {
return JKJavaMethodCallExpressionImpl( return JKJavaMethodCallExpressionImpl(
JKUnresolvedMethod("kotlin.Array"),//TODO resolve real reference context.symbolProvider.provideByFqName("kotlin.Array"),
JKExpressionListImpl( JKExpressionListImpl(
dimensions[0], dimensions[0],
JKLambdaExpressionImpl( JKLambdaExpressionImpl(