New J2K: Do not convert class to object in ClassToObjectPromotionConversion when it has inheritors

This commit is contained in:
Ilya Kirillov
2018-11-08 16:49:57 +03:00
committed by Ilya Kirillov
parent 70def791c0
commit 55c304827a
2 changed files with 8 additions and 3 deletions
@@ -48,7 +48,7 @@ object ConversionsRunner {
+InnerClassConversion() +InnerClassConversion()
+ModifiersConversion(context) +ModifiersConversion(context)
+StaticsToCompanionExtractConversion() +StaticsToCompanionExtractConversion()
+ClassToObjectPromotionConversion() +ClassToObjectPromotionConversion(context)
+PolyadicExpressionConversion() +PolyadicExpressionConversion()
+SwitchStatementConversion(context) +SwitchStatementConversion(context)
+InstanceOfConversion() +InstanceOfConversion()
@@ -5,13 +5,15 @@
package org.jetbrains.kotlin.j2k.conversions package org.jetbrains.kotlin.j2k.conversions
import org.jetbrains.kotlin.j2k.ConversionContext
import org.jetbrains.kotlin.j2k.tree.JKClass import org.jetbrains.kotlin.j2k.tree.JKClass
import org.jetbrains.kotlin.j2k.tree.JKKtPrimaryConstructor import org.jetbrains.kotlin.j2k.tree.JKKtPrimaryConstructor
import org.jetbrains.kotlin.j2k.tree.JKTreeElement import org.jetbrains.kotlin.j2k.tree.JKTreeElement
import org.jetbrains.kotlin.j2k.tree.impl.JKClassImpl import org.jetbrains.kotlin.j2k.tree.impl.JKClassImpl
import org.jetbrains.kotlin.j2k.tree.impl.psi
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
class ClassToObjectPromotionConversion : RecursiveApplicableConversionBase() { class ClassToObjectPromotionConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element is JKClass && element.classKind == JKClass.ClassKind.CLASS) { if (element is JKClass && element.classKind == JKClass.ClassKind.CLASS) {
val companion = val companion =
@@ -27,7 +29,7 @@ class ClassToObjectPromotionConversion : RecursiveApplicableConversionBase() {
} }
} }
if (allDeclarationsMatches) { if (allDeclarationsMatches && !element.hasInheritors()) {
companion.invalidate() companion.invalidate()
element.invalidate() element.invalidate()
return recurse( return recurse(
@@ -46,4 +48,7 @@ class ClassToObjectPromotionConversion : RecursiveApplicableConversionBase() {
return recurse(element) return recurse(element)
} }
private fun JKClass.hasInheritors() =
context.converter.converterServices.oldServices.referenceSearcher.hasInheritors(psi()!!)
} }