New J2K: Add collection operations conversion

This commit is contained in:
Ilya Kirillov
2018-12-03 23:24:11 +03:00
committed by Ilya Kirillov
parent 254d2f8b67
commit a15f51950b
3 changed files with 40 additions and 1 deletions
@@ -54,6 +54,7 @@ object ConversionsRunner {
+InstanceOfConversion()
+ForConversion(context)
+ForInConversion()
+CollectionOperationsConversion(context)
+ArrayOperationsConversion(context)
+TypeMappingConversion(context)
@@ -0,0 +1,32 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.j2k.conversions
import org.jetbrains.kotlin.j2k.ConversionContext
import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.impl.JKFieldAccessExpressionImpl
class CollectionOperationsConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKQualifiedExpression) return recurse(element)
val receiverType = element.receiver.type(context) ?: return recurse(element)
if (!receiverType.isCollectionType(context.symbolProvider)) return recurse(element)
convertSizeCall(element.selector)?.also {
element.selector = it
}
return recurse(element)
}
private fun convertSizeCall(selector: JKExpression): JKFieldAccessExpressionImpl? {
if (selector !is JKMethodCallExpression) return null
return if (selector.identifier.name =="size") {
JKFieldAccessExpressionImpl(context.symbolProvider.provideByFqName("kotlin.collections.Collection.size"))
} else null
}
}
@@ -156,4 +156,10 @@ fun JKType.updateNullability(newNullability: Nullability): JKType =
}
fun JKJavaMethod.returnTypeNullability(context: ConversionContext): Nullability =
context.typeFlavorCalculator.methodNullability(psi()!!)
context.typeFlavorCalculator.methodNullability(psi()!!)
fun JKType.isCollectionType(symbolProvider: JKSymbolProvider): Boolean {
if (this !is JKClassType) return false
val collectionType = JKClassTypeImpl(symbolProvider.provideByFqName("java.util.Collection"), emptyList())
return this.isSubtypeOf(collectionType, symbolProvider)
}