New J2K: Implement primitive type case for ImplicitInitializerConversion
This commit is contained in:
committed by
Ilya Kirillov
parent
fb3c7e87a1
commit
f14aa2292f
@@ -37,6 +37,7 @@ object ConversionsRunner {
|
|||||||
+ArrayInitializerConversion(context)
|
+ArrayInitializerConversion(context)
|
||||||
+TryStatementConversion(context)
|
+TryStatementConversion(context)
|
||||||
+ImplicitInitializerConversion()
|
+ImplicitInitializerConversion()
|
||||||
|
+PrimitiveTypesInitializersConversion(context)
|
||||||
+DefaultArgumentsConversion(context)
|
+DefaultArgumentsConversion(context)
|
||||||
+FieldToPropertyConversion(context)
|
+FieldToPropertyConversion(context)
|
||||||
+PrintlnConversion(context)
|
+PrintlnConversion(context)
|
||||||
|
|||||||
@@ -135,7 +135,14 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
|
|||||||
fun PsiJavaToken.toJK(): JKOperator = JKJavaOperatorImpl.tokenToOperator[tokenType] ?: error("Unsupported token-type: $tokenType")
|
fun PsiJavaToken.toJK(): JKOperator = JKJavaOperatorImpl.tokenToOperator[tokenType] ?: error("Unsupported token-type: $tokenType")
|
||||||
|
|
||||||
fun PsiPrefixExpression.toJK(): JKExpression {
|
fun PsiPrefixExpression.toJK(): JKExpression {
|
||||||
return JKPrefixExpressionImpl(operand.toJK(), operationSign.toJK())
|
return JKPrefixExpressionImpl(operand.toJK(), operationSign.toJK()).let {
|
||||||
|
if (it.operator.token.text in listOf("+", "-") && it.expression is JKLiteralExpression) {
|
||||||
|
JKJavaLiteralExpressionImpl(
|
||||||
|
it.operator.token.text + (it.expression as JKLiteralExpression).literal,
|
||||||
|
(it.expression as JKLiteralExpression).type
|
||||||
|
)
|
||||||
|
} else it
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun PsiPostfixExpression.toJK(): JKExpression {
|
fun PsiPostfixExpression.toJK(): JKExpression {
|
||||||
|
|||||||
@@ -6,8 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.j2k.conversions
|
package org.jetbrains.kotlin.j2k.conversions
|
||||||
|
|
||||||
import org.jetbrains.kotlin.j2k.tree.*
|
import org.jetbrains.kotlin.j2k.tree.*
|
||||||
import org.jetbrains.kotlin.j2k.tree.impl.JKNullLiteral
|
import org.jetbrains.kotlin.j2k.tree.impl.*
|
||||||
import org.jetbrains.kotlin.j2k.tree.impl.JKUnresolvedClassType
|
|
||||||
|
|
||||||
class ImplicitInitializerConversion : RecursiveApplicableConversionBase() {
|
class ImplicitInitializerConversion : RecursiveApplicableConversionBase() {
|
||||||
override fun applyToElement(element: JKTreeElement): JKTreeElement {
|
override fun applyToElement(element: JKTreeElement): JKTreeElement {
|
||||||
@@ -15,9 +14,24 @@ class ImplicitInitializerConversion : RecursiveApplicableConversionBase() {
|
|||||||
|
|
||||||
if (element.initializer !is JKStubExpression) return recurse(element)
|
if (element.initializer !is JKStubExpression) return recurse(element)
|
||||||
|
|
||||||
if (element.type.type is JKClassType || element.type.type is JKUnresolvedClassType) element.initializer = JKNullLiteral()
|
val fieldType = element.type.type
|
||||||
|
val newInitializer = when (fieldType) {
|
||||||
|
is JKClassType, is JKUnresolvedClassType -> JKNullLiteral()
|
||||||
|
is JKJavaPrimitiveType -> createPrimitiveTypeInitializer(fieldType)
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
newInitializer?.also {
|
||||||
|
element.initializer = it
|
||||||
|
}
|
||||||
return element
|
return element
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun createPrimitiveTypeInitializer(primitiveType: JKJavaPrimitiveType): JKJavaLiteralExpression =
|
||||||
|
when (primitiveType) {
|
||||||
|
is JKJavaPrimitiveTypeImpl.BOOLEAN ->
|
||||||
|
JKJavaLiteralExpressionImpl("false", JKLiteralExpression.LiteralType.BOOLEAN)
|
||||||
|
else ->
|
||||||
|
JKJavaLiteralExpressionImpl("0", JKLiteralExpression.LiteralType.INT)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -31,6 +31,8 @@ class LiteralConversion : RecursiveApplicableConversionBase() {
|
|||||||
text
|
text
|
||||||
.replace("d", "", true)
|
.replace("d", "", true)
|
||||||
.replace(".e", "e", true)
|
.replace(".e", "e", true)
|
||||||
|
.replace(".f", "", true)
|
||||||
|
.replace("f", "", true)
|
||||||
|
|
||||||
if (!newText.contains(".") && !newText.contains("e", true))
|
if (!newText.contains(".") && !newText.contains("e", true))
|
||||||
newText += "."
|
newText += "."
|
||||||
@@ -47,7 +49,11 @@ class LiteralConversion : RecursiveApplicableConversionBase() {
|
|||||||
return JKKtLiteralExpressionImpl(
|
return JKKtLiteralExpressionImpl(
|
||||||
text.replace(".f", "f", true)
|
text.replace(".f", "f", true)
|
||||||
.replace("F", "f")
|
.replace("F", "f")
|
||||||
.replace(".e", "e", true),
|
.replace(".e", "e", true)
|
||||||
|
.let {
|
||||||
|
if (!it.endsWith("f")) "${it}f"
|
||||||
|
else it
|
||||||
|
},
|
||||||
FLOAT
|
FLOAT
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+55
@@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* 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.copyTree
|
||||||
|
import org.jetbrains.kotlin.j2k.copyTreeAndDetach
|
||||||
|
import org.jetbrains.kotlin.j2k.tree.*
|
||||||
|
import org.jetbrains.kotlin.j2k.tree.impl.*
|
||||||
|
|
||||||
|
class PrimitiveTypesInitializersConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() {
|
||||||
|
override fun applyToElement(element: JKTreeElement): JKTreeElement {
|
||||||
|
if (element !is JKJavaField) return recurse(element)
|
||||||
|
val literalInitializer = element.initializer as? JKJavaLiteralExpression ?: return recurse(element)
|
||||||
|
val literalType = literalInitializer.type.toPrimitiveType() ?: return recurse(element)
|
||||||
|
val fieldType = element.type.type as? JKJavaPrimitiveType ?: return recurse(element)
|
||||||
|
|
||||||
|
createPrimitiveTypeInitializer(literalInitializer.copyTreeAndDetach(), literalType, fieldType)?.also {
|
||||||
|
element.initializer = it
|
||||||
|
}
|
||||||
|
return element
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun createPrimitiveTypeInitializer(
|
||||||
|
literal: JKJavaLiteralExpression,
|
||||||
|
literalType: JKJavaPrimitiveType,
|
||||||
|
fieldType: JKJavaPrimitiveType
|
||||||
|
): JKExpression? {
|
||||||
|
if (literalType == fieldType) return null
|
||||||
|
if (literalType == JKJavaPrimitiveTypeImpl.INT
|
||||||
|
&& fieldType == JKJavaPrimitiveTypeImpl.LONG
|
||||||
|
) return null
|
||||||
|
|
||||||
|
if (literalType.isNumberType() && fieldType.isNumberType()) {
|
||||||
|
return JKJavaLiteralExpressionImpl(
|
||||||
|
literal.literal,
|
||||||
|
fieldType.toLiteralType() ?: JKLiteralExpression.LiteralType.INT
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
val conversionFunctionName = "to${fieldType.jvmPrimitiveType.javaKeywordName.capitalize()}"
|
||||||
|
return JKQualifiedExpressionImpl(
|
||||||
|
literal,
|
||||||
|
JKKtQualifierImpl.DOT,
|
||||||
|
JKJavaMethodCallExpressionImpl(
|
||||||
|
context.symbolProvider.provideByFqName("kotlin.$conversionFunctionName"),
|
||||||
|
JKExpressionListImpl()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,7 +6,6 @@
|
|||||||
package org.jetbrains.kotlin.j2k.tree
|
package org.jetbrains.kotlin.j2k.tree
|
||||||
|
|
||||||
import com.intellij.psi.*
|
import com.intellij.psi.*
|
||||||
import com.intellij.util.reverse
|
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||||
@@ -165,3 +164,33 @@ fun JKType.isCollectionType(symbolProvider: JKSymbolProvider): Boolean {
|
|||||||
val collectionType = JKClassTypeImpl(symbolProvider.provideByFqName("java.util.Collection"), emptyList())
|
val collectionType = JKClassTypeImpl(symbolProvider.provideByFqName("java.util.Collection"), emptyList())
|
||||||
return this.isSubtypeOf(collectionType, symbolProvider)
|
return this.isSubtypeOf(collectionType, symbolProvider)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun JKLiteralExpression.LiteralType.toPrimitiveType(): JKJavaPrimitiveType? =
|
||||||
|
when (this) {
|
||||||
|
JKLiteralExpression.LiteralType.CHAR -> JKJavaPrimitiveTypeImpl.CHAR
|
||||||
|
JKLiteralExpression.LiteralType.BOOLEAN -> JKJavaPrimitiveTypeImpl.BOOLEAN
|
||||||
|
JKLiteralExpression.LiteralType.INT -> JKJavaPrimitiveTypeImpl.INT
|
||||||
|
JKLiteralExpression.LiteralType.LONG -> JKJavaPrimitiveTypeImpl.LONG
|
||||||
|
JKLiteralExpression.LiteralType.FLOAT -> JKJavaPrimitiveTypeImpl.FLOAT
|
||||||
|
JKLiteralExpression.LiteralType.DOUBLE -> JKJavaPrimitiveTypeImpl.DOUBLE
|
||||||
|
JKLiteralExpression.LiteralType.STRING -> null
|
||||||
|
JKLiteralExpression.LiteralType.NULL -> null
|
||||||
|
}
|
||||||
|
|
||||||
|
fun JKJavaPrimitiveType.toLiteralType(): JKLiteralExpression.LiteralType? =
|
||||||
|
when (this) {
|
||||||
|
JKJavaPrimitiveTypeImpl.CHAR -> JKLiteralExpression.LiteralType.CHAR
|
||||||
|
JKJavaPrimitiveTypeImpl.BOOLEAN -> JKLiteralExpression.LiteralType.BOOLEAN
|
||||||
|
JKJavaPrimitiveTypeImpl.INT -> JKLiteralExpression.LiteralType.INT
|
||||||
|
JKJavaPrimitiveTypeImpl.LONG -> JKLiteralExpression.LiteralType.LONG
|
||||||
|
JKJavaPrimitiveTypeImpl.CHAR -> JKLiteralExpression.LiteralType.CHAR
|
||||||
|
JKJavaPrimitiveTypeImpl.DOUBLE -> JKLiteralExpression.LiteralType.DOUBLE
|
||||||
|
JKJavaPrimitiveTypeImpl.FLOAT -> JKLiteralExpression.LiteralType.FLOAT
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
|
||||||
|
fun JKJavaPrimitiveType.isNumberType() =
|
||||||
|
this == JKJavaPrimitiveTypeImpl.INT ||
|
||||||
|
this == JKJavaPrimitiveTypeImpl.LONG ||
|
||||||
|
this == JKJavaPrimitiveTypeImpl.FLOAT ||
|
||||||
|
this == JKJavaPrimitiveTypeImpl.DOUBLE
|
||||||
Reference in New Issue
Block a user