From a15f51950b8e92ae7425baf274c3962eb88728a8 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Mon, 3 Dec 2018 23:24:11 +0300 Subject: [PATCH] New J2K: Add collection operations conversion --- .../jetbrains/kotlin/j2k/ConversionsRunner.kt | 1 + .../CollectionOperationsConversion.kt | 32 +++++++++++++++++++ .../org/jetbrains/kotlin/j2k/tree/types.kt | 8 ++++- 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/CollectionOperationsConversion.kt diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt index f8d29470b95..7e05396130b 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt @@ -54,6 +54,7 @@ object ConversionsRunner { +InstanceOfConversion() +ForConversion(context) +ForInConversion() + +CollectionOperationsConversion(context) +ArrayOperationsConversion(context) +TypeMappingConversion(context) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/CollectionOperationsConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/CollectionOperationsConversion.kt new file mode 100644 index 00000000000..5da4702c333 --- /dev/null +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/CollectionOperationsConversion.kt @@ -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 + } +} \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt index a6ba488feca..42630ac791e 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt @@ -156,4 +156,10 @@ fun JKType.updateNullability(newNullability: Nullability): JKType = } fun JKJavaMethod.returnTypeNullability(context: ConversionContext): Nullability = - context.typeFlavorCalculator.methodNullability(psi()!!) \ No newline at end of file + 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) +} \ No newline at end of file