J2K: do not drop formatting for expressions with operator
This commit is contained in:
@@ -116,7 +116,7 @@ class CodeConverter(
|
|||||||
}
|
}
|
||||||
else if (expression is PsiPrefixExpression && expression.isLiteralWithSign()) {
|
else if (expression is PsiPrefixExpression && expression.isLiteralWithSign()) {
|
||||||
val operandConverted = convertExpression(expression.getOperand(), expectedType)
|
val operandConverted = convertExpression(expression.getOperand(), expectedType)
|
||||||
convertedExpression = PrefixExpression(expression.getOperationSign().getText(), operandConverted)
|
convertedExpression = PrefixExpression(Operator(expression.getOperationSign().getTokenType()).assignPrototype(expression.getOperationSign()), operandConverted)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
val conversion = PRIMITIVE_TYPE_CONVERSIONS[expectedTypeStr]
|
val conversion = PRIMITIVE_TYPE_CONVERSIONS[expectedTypeStr]
|
||||||
|
|||||||
@@ -379,7 +379,7 @@ class Converter private constructor(
|
|||||||
val superExpression = SuperExpression(Identifier.Empty).assignNoPrototype()
|
val superExpression = SuperExpression(Identifier.Empty).assignNoPrototype()
|
||||||
val superAccess = QualifiedExpression(superExpression, propertyInfo.identifier).assignNoPrototype()
|
val superAccess = QualifiedExpression(superExpression, propertyInfo.identifier).assignNoPrototype()
|
||||||
val valueIdentifier = Identifier("value", false).assignNoPrototype()
|
val valueIdentifier = Identifier("value", false).assignNoPrototype()
|
||||||
val assignment = AssignmentExpression(superAccess, valueIdentifier, "=").assignNoPrototype()
|
val assignment = AssignmentExpression(superAccess, valueIdentifier, Operator.EQ).assignNoPrototype()
|
||||||
val body = Block(listOf(assignment), LBrace().assignNoPrototype(), RBrace().assignNoPrototype()).assignNoPrototype()
|
val body = Block(listOf(assignment), LBrace().assignNoPrototype(), RBrace().assignNoPrototype()).assignNoPrototype()
|
||||||
val parameter = FunctionParameter(valueIdentifier, propertyType, FunctionParameter.VarValModifier.None, Annotations.Empty, Modifiers.Empty).assignNoPrototype()
|
val parameter = FunctionParameter(valueIdentifier, propertyType, FunctionParameter.VarValModifier.None, Annotations.Empty, Modifiers.Empty).assignNoPrototype()
|
||||||
val parameterList = ParameterList(listOf(parameter)).assignNoPrototype()
|
val parameterList = ParameterList(listOf(parameter)).assignNoPrototype()
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ package org.jetbrains.kotlin.j2k
|
|||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.psi.*
|
import com.intellij.psi.*
|
||||||
import com.intellij.psi.search.GlobalSearchScope
|
import com.intellij.psi.search.GlobalSearchScope
|
||||||
import com.intellij.psi.tree.IElementType
|
|
||||||
import com.intellij.psi.util.MethodSignature
|
import com.intellij.psi.util.MethodSignature
|
||||||
import com.intellij.psi.util.MethodSignatureUtil
|
import com.intellij.psi.util.MethodSignatureUtil
|
||||||
import com.intellij.psi.util.PsiTreeUtil
|
import com.intellij.psi.util.PsiTreeUtil
|
||||||
@@ -28,6 +27,7 @@ import org.jetbrains.kotlin.asJava.KtLightField
|
|||||||
import org.jetbrains.kotlin.asJava.KtLightMethod
|
import org.jetbrains.kotlin.asJava.KtLightMethod
|
||||||
import org.jetbrains.kotlin.builtins.PrimitiveType
|
import org.jetbrains.kotlin.builtins.PrimitiveType
|
||||||
import org.jetbrains.kotlin.j2k.ast.*
|
import org.jetbrains.kotlin.j2k.ast.*
|
||||||
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
|
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
|
||||||
@@ -85,23 +85,23 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter {
|
|||||||
|
|
||||||
override fun visitAssignmentExpression(expression: PsiAssignmentExpression) {
|
override fun visitAssignmentExpression(expression: PsiAssignmentExpression) {
|
||||||
val tokenType = expression.getOperationSign().getTokenType()
|
val tokenType = expression.getOperationSign().getTokenType()
|
||||||
val secondOp = when(tokenType) {
|
|
||||||
JavaTokenType.GTGTEQ -> "shr"
|
|
||||||
JavaTokenType.LTLTEQ -> "shl"
|
|
||||||
JavaTokenType.XOREQ -> "xor"
|
|
||||||
JavaTokenType.ANDEQ -> "and"
|
|
||||||
JavaTokenType.OREQ -> "or"
|
|
||||||
JavaTokenType.GTGTGTEQ -> "ushr"
|
|
||||||
else -> ""
|
|
||||||
}
|
|
||||||
|
|
||||||
val lhs = codeConverter.convertExpression(expression.getLExpression())
|
val lhs = codeConverter.convertExpression(expression.getLExpression())
|
||||||
val rhs = codeConverter.convertExpression(expression.getRExpression()!!, expression.getLExpression().getType())
|
val rhs = codeConverter.convertExpression(expression.getRExpression()!!, expression.getLExpression().getType())
|
||||||
if (!secondOp.isEmpty()) {
|
|
||||||
result = AssignmentExpression(lhs, BinaryExpression(lhs, rhs, secondOp).assignNoPrototype(), " = ")
|
val secondOp = when(tokenType) {
|
||||||
|
JavaTokenType.GTGTEQ, JavaTokenType.LTLTEQ, JavaTokenType.GTGTGTEQ,
|
||||||
|
JavaTokenType.XOREQ, JavaTokenType.OREQ,
|
||||||
|
JavaTokenType.ANDEQ -> true
|
||||||
|
else -> false
|
||||||
|
}
|
||||||
|
|
||||||
|
val operator = Operator(tokenType).assignPrototype(expression.operationSign)
|
||||||
|
if (secondOp) {
|
||||||
|
result = AssignmentExpression(lhs, BinaryExpression(lhs, rhs, operator).assignNoPrototype(), Operator.EQ)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
result = AssignmentExpression(lhs, rhs, expression.getOperationSign().getText()!!)
|
result = AssignmentExpression(lhs, rhs, operator)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -121,13 +121,13 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter {
|
|||||||
result = MethodCallExpression.buildNotNull(leftConverted, "ushr", listOf(rightConverted))
|
result = MethodCallExpression.buildNotNull(leftConverted, "ushr", listOf(rightConverted))
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
var operatorString = getOperatorString(operationTokenType)
|
var operator = Operator(operationTokenType)
|
||||||
if (operationTokenType == JavaTokenType.EQEQ || operationTokenType == JavaTokenType.NE) {
|
if (operationTokenType == JavaTokenType.EQEQ || operationTokenType == JavaTokenType.NE) {
|
||||||
if (!canKeepEqEq(left, right)) {
|
if (!canKeepEqEq(left, right)) {
|
||||||
operatorString += "="
|
operator = if (operationTokenType == JavaTokenType.EQEQ) Operator(KtTokens.EQEQEQ) else Operator(KtTokens.EXCLEQEQEQ)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
result = BinaryExpression(leftConverted, rightConverted, operatorString)
|
result = BinaryExpression(leftConverted, rightConverted, operator.assignPrototype(expression.operationSign))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -283,7 +283,7 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter {
|
|||||||
|
|
||||||
1 /* setter */ -> {
|
1 /* setter */ -> {
|
||||||
val argument = codeConverter.convertExpression(arguments[if (isExtension) 1 else 0])
|
val argument = codeConverter.convertExpression(arguments[if (isExtension) 1 else 0])
|
||||||
result = AssignmentExpression(propertyAccess, argument, "=")
|
result = AssignmentExpression(propertyAccess, argument, Operator.EQ)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -383,7 +383,7 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun visitPostfixExpression(expression: PsiPostfixExpression) {
|
override fun visitPostfixExpression(expression: PsiPostfixExpression) {
|
||||||
result = PostfixExpression(getOperatorString(expression.getOperationSign().getTokenType()),
|
result = PostfixExpression(Operator(expression.getOperationSign().getTokenType()).assignPrototype(expression.operationSign),
|
||||||
codeConverter.convertExpression(expression.getOperand()))
|
codeConverter.convertExpression(expression.getOperand()))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -393,11 +393,11 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter {
|
|||||||
if (token == JavaTokenType.TILDE) {
|
if (token == JavaTokenType.TILDE) {
|
||||||
result = MethodCallExpression.buildNotNull(operand, "inv")
|
result = MethodCallExpression.buildNotNull(operand, "inv")
|
||||||
}
|
}
|
||||||
else if (token == JavaTokenType.EXCL && operand is BinaryExpression && operand.op == "==") { // happens when equals is converted to ==
|
else if (token == JavaTokenType.EXCL && operand is BinaryExpression && operand.op.asString() == "==") { // happens when equals is converted to ==
|
||||||
result = BinaryExpression(operand.left, operand.right, "!=")
|
result = BinaryExpression(operand.left, operand.right, Operator(JavaTokenType.NE).assignPrototype(expression.operand))
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
result = PrefixExpression(getOperatorString(token), operand)
|
result = PrefixExpression(Operator(token).assignPrototype(expression.operand), operand)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -499,8 +499,17 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun visitPolyadicExpression(expression: PsiPolyadicExpression) {
|
override fun visitPolyadicExpression(expression: PsiPolyadicExpression) {
|
||||||
val args = expression.getOperands().map { codeConverter.convertExpression(it, expression.getType()) }
|
val commentsAndSpacesInheritance = CommentsAndSpacesInheritance.LINE_BREAKS
|
||||||
result = PolyadicExpression(args, getOperatorString(expression.getOperationTokenType()))
|
val args = expression.getOperands().map {
|
||||||
|
codeConverter.convertExpression(it, expression.getType()).assignPrototype(it, commentsAndSpacesInheritance)
|
||||||
|
}
|
||||||
|
val operators = expression.getOperands().map {
|
||||||
|
expression.getTokenBeforeOperand(it)?.let {
|
||||||
|
Operator(it.tokenType).assignPrototype(it, commentsAndSpacesInheritance)
|
||||||
|
}
|
||||||
|
}.filterNotNull()
|
||||||
|
|
||||||
|
result = PolyadicExpression(args, operators).assignPrototype(expression)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun convertArguments(expression: PsiCallExpression, isExtension: Boolean = false): List<Expression> {
|
private fun convertArguments(expression: PsiCallExpression, isExtension: Boolean = false): List<Expression> {
|
||||||
@@ -530,34 +539,6 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getOperatorString(tokenType: IElementType): String {
|
|
||||||
return when(tokenType) {
|
|
||||||
JavaTokenType.EQEQ -> "=="
|
|
||||||
JavaTokenType.NE -> "!="
|
|
||||||
JavaTokenType.ANDAND -> "&&"
|
|
||||||
JavaTokenType.OROR -> "||"
|
|
||||||
JavaTokenType.GT -> ">"
|
|
||||||
JavaTokenType.LT -> "<"
|
|
||||||
JavaTokenType.GE -> ">="
|
|
||||||
JavaTokenType.LE -> "<="
|
|
||||||
JavaTokenType.EXCL -> "!"
|
|
||||||
JavaTokenType.PLUS -> "+"
|
|
||||||
JavaTokenType.MINUS -> "-"
|
|
||||||
JavaTokenType.ASTERISK -> "*"
|
|
||||||
JavaTokenType.DIV -> "/"
|
|
||||||
JavaTokenType.PERC -> "%"
|
|
||||||
JavaTokenType.GTGT -> "shr"
|
|
||||||
JavaTokenType.LTLT -> "shl"
|
|
||||||
JavaTokenType.XOR -> "xor"
|
|
||||||
JavaTokenType.AND -> "and"
|
|
||||||
JavaTokenType.OR -> "or"
|
|
||||||
JavaTokenType.GTGTGT -> "ushr"
|
|
||||||
JavaTokenType.PLUSPLUS -> "++"
|
|
||||||
JavaTokenType.MINUSMINUS -> "--"
|
|
||||||
else -> "" //System.out.println("UNSUPPORTED TOKEN TYPE: " + tokenType?.toString())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun visitLambdaExpression(expression: PsiLambdaExpression) {
|
override fun visitLambdaExpression(expression: PsiLambdaExpression) {
|
||||||
val parameters = expression.parameterList
|
val parameters = expression.parameterList
|
||||||
val convertedParameters = ParameterList(parameters.parameters.map {
|
val convertedParameters = ParameterList(parameters.parameters.map {
|
||||||
|
|||||||
@@ -270,8 +270,8 @@ class ForConverter(
|
|||||||
}
|
}
|
||||||
|
|
||||||
val converted = codeConverter.convertExpression(bound)
|
val converted = codeConverter.convertExpression(bound)
|
||||||
val sign = if (correction > 0) "+" else "-"
|
val sign = if (correction > 0) JavaTokenType.PLUS else JavaTokenType.MINUS
|
||||||
return BinaryExpression(converted, LiteralExpression(Math.abs(correction).toString()).assignNoPrototype(), sign).assignNoPrototype()
|
return BinaryExpression(converted, LiteralExpression(Math.abs(correction).toString()).assignNoPrototype(), Operator(sign).assignPrototype(bound)).assignNoPrototype()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun PsiStatement.toContinuedLoop(): PsiLoopStatement? {
|
private fun PsiStatement.toContinuedLoop(): PsiLoopStatement? {
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ enum class SpecialMethod(val qualifiedClassName: String?, val methodName: String
|
|||||||
|
|
||||||
override fun convertCall(qualifier: PsiExpression?, arguments: Array<PsiExpression>, typeArgumentsConverted: List<Type>, codeConverter: CodeConverter): Expression? {
|
override fun convertCall(qualifier: PsiExpression?, arguments: Array<PsiExpression>, typeArgumentsConverted: List<Type>, codeConverter: CodeConverter): Expression? {
|
||||||
if (qualifier == null || qualifier is PsiSuperExpression) return null
|
if (qualifier == null || qualifier is PsiSuperExpression) return null
|
||||||
return BinaryExpression(codeConverter.convertExpression(qualifier), codeConverter.convertExpression(arguments.single()), "==")
|
return BinaryExpression(codeConverter.convertExpression(qualifier), codeConverter.convertExpression(arguments.single()), Operator.EQEQ)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -148,7 +148,7 @@ enum class SpecialMethod(val qualifiedClassName: String?, val methodName: String
|
|||||||
|
|
||||||
OBJECTS_EQUALS("java.util.Objects", "equals", 2) {
|
OBJECTS_EQUALS("java.util.Objects", "equals", 2) {
|
||||||
override fun convertCall(qualifier: PsiExpression?, arguments: Array<PsiExpression>, typeArgumentsConverted: List<Type>, codeConverter: CodeConverter)
|
override fun convertCall(qualifier: PsiExpression?, arguments: Array<PsiExpression>, typeArgumentsConverted: List<Type>, codeConverter: CodeConverter)
|
||||||
= BinaryExpression(codeConverter.convertExpression(arguments[0]), codeConverter.convertExpression(arguments[1]), "==")
|
= BinaryExpression(codeConverter.convertExpression(arguments[0]), codeConverter.convertExpression(arguments[1]), Operator.EQEQ)
|
||||||
},
|
},
|
||||||
|
|
||||||
COLLECTIONS_EMPTY_LIST(Collections::class.java.name, "emptyList", 0) {
|
COLLECTIONS_EMPTY_LIST(Collections::class.java.name, "emptyList", 0) {
|
||||||
@@ -178,7 +178,7 @@ enum class SpecialMethod(val qualifiedClassName: String?, val methodName: String
|
|||||||
|
|
||||||
STRING_TRIM(JAVA_LANG_STRING, "trim", 0) {
|
STRING_TRIM(JAVA_LANG_STRING, "trim", 0) {
|
||||||
override fun convertCall(qualifier: PsiExpression?, arguments: Array<PsiExpression>, typeArgumentsConverted: List<Type>, codeConverter: CodeConverter): Expression? {
|
override fun convertCall(qualifier: PsiExpression?, arguments: Array<PsiExpression>, typeArgumentsConverted: List<Type>, codeConverter: CodeConverter): Expression? {
|
||||||
val comparison = BinaryExpression(Identifier("it", isNullable = false).assignNoPrototype(), LiteralExpression("' '").assignNoPrototype(), "<=").assignNoPrototype()
|
val comparison = BinaryExpression(Identifier("it", isNullable = false).assignNoPrototype(), LiteralExpression("' '").assignNoPrototype(), Operator(JavaTokenType.LE).assignNoPrototype()).assignNoPrototype()
|
||||||
return MethodCallExpression.buildNotNull(
|
return MethodCallExpression.buildNotNull(
|
||||||
codeConverter.convertExpression(qualifier), "trim",
|
codeConverter.convertExpression(qualifier), "trim",
|
||||||
listOf(LambdaExpression(null, Block.of(comparison).assignNoPrototype())), emptyList())
|
listOf(LambdaExpression(null, Block.of(comparison).assignNoPrototype())), emptyList())
|
||||||
@@ -423,7 +423,7 @@ private fun addIgnoreCaseArgument(
|
|||||||
ignoreCaseArgument: PsiExpression? = null
|
ignoreCaseArgument: PsiExpression? = null
|
||||||
): Expression {
|
): Expression {
|
||||||
val ignoreCaseExpression = ignoreCaseArgument?.let { codeConverter.convertExpression(it) } ?: LiteralExpression("true").assignNoPrototype()
|
val ignoreCaseExpression = ignoreCaseArgument?.let { codeConverter.convertExpression(it) } ?: LiteralExpression("true").assignNoPrototype()
|
||||||
val ignoreCaseArgumentExpression = AssignmentExpression(Identifier("ignoreCase").assignNoPrototype(), ignoreCaseExpression, "=").assignNoPrototype()
|
val ignoreCaseArgumentExpression = AssignmentExpression(Identifier("ignoreCase").assignNoPrototype(), ignoreCaseExpression, Operator.EQ).assignNoPrototype()
|
||||||
return MethodCallExpression.build(codeConverter.convertExpression(qualifier), methodName,
|
return MethodCallExpression.build(codeConverter.convertExpression(qualifier), methodName,
|
||||||
codeConverter.convertExpressions(arguments) + ignoreCaseArgumentExpression,
|
codeConverter.convertExpressions(arguments) + ignoreCaseArgumentExpression,
|
||||||
typeArgumentsConverted, false)
|
typeArgumentsConverted, false)
|
||||||
|
|||||||
@@ -16,8 +16,11 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.j2k.ast
|
package org.jetbrains.kotlin.j2k.ast
|
||||||
|
|
||||||
|
import com.intellij.psi.JavaTokenType
|
||||||
|
import com.intellij.psi.tree.IElementType
|
||||||
import org.jetbrains.kotlin.j2k.CodeBuilder
|
import org.jetbrains.kotlin.j2k.CodeBuilder
|
||||||
import org.jetbrains.kotlin.j2k.append
|
import org.jetbrains.kotlin.j2k.append
|
||||||
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
|
|
||||||
class ArrayAccessExpression(val expression: Expression, val index: Expression, val lvalue: Boolean) : Expression() {
|
class ArrayAccessExpression(val expression: Expression, val index: Expression, val lvalue: Boolean) : Expression() {
|
||||||
override fun generateCode(builder: CodeBuilder) {
|
override fun generateCode(builder: CodeBuilder) {
|
||||||
@@ -27,7 +30,7 @@ class ArrayAccessExpression(val expression: Expression, val index: Expression, v
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class AssignmentExpression(val left: Expression, val right: Expression, val op: String) : Expression() {
|
class AssignmentExpression(val left: Expression, val right: Expression, val op: Operator) : Expression() {
|
||||||
override fun generateCode(builder: CodeBuilder) {
|
override fun generateCode(builder: CodeBuilder) {
|
||||||
builder.appendOperand(this, left).append(" ").append(op).append(" ").appendOperand(this, right)
|
builder.appendOperand(this, left).append(" ").append(op).append(" ").appendOperand(this, right)
|
||||||
}
|
}
|
||||||
@@ -48,7 +51,7 @@ class BangBangExpression(val expr: Expression) : Expression() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class BinaryExpression(val left: Expression, val right: Expression, val op: String) : Expression() {
|
class BinaryExpression(val left: Expression, val right: Expression, val op: Operator) : Expression() {
|
||||||
override fun generateCode(builder: CodeBuilder) {
|
override fun generateCode(builder: CodeBuilder) {
|
||||||
builder.appendOperand(this, left, false).append(" ").append(op).append(" ").appendOperand(this, right, true)
|
builder.appendOperand(this, left, false).append(" ").append(op).append(" ").appendOperand(this, right, true)
|
||||||
}
|
}
|
||||||
@@ -78,7 +81,7 @@ class ParenthesizedExpression(val expression: Expression) : Expression() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class PrefixExpression(val op: String, val expression: Expression) : Expression() {
|
class PrefixExpression(val op: Operator, val expression: Expression) : Expression() {
|
||||||
override fun generateCode(builder: CodeBuilder){
|
override fun generateCode(builder: CodeBuilder){
|
||||||
builder.append(op).appendOperand(this, expression)
|
builder.append(op).appendOperand(this, expression)
|
||||||
}
|
}
|
||||||
@@ -87,7 +90,7 @@ class PrefixExpression(val op: String, val expression: Expression) : Expression(
|
|||||||
get() = expression.isNullable
|
get() = expression.isNullable
|
||||||
}
|
}
|
||||||
|
|
||||||
class PostfixExpression(val op: String, val expression: Expression) : Expression() {
|
class PostfixExpression(val op: Operator, val expression: Expression) : Expression() {
|
||||||
override fun generateCode(builder: CodeBuilder) {
|
override fun generateCode(builder: CodeBuilder) {
|
||||||
builder.appendOperand(this, expression) append op
|
builder.appendOperand(this, expression) append op
|
||||||
}
|
}
|
||||||
@@ -118,9 +121,72 @@ class QualifiedExpression(val qualifier: Expression, val identifier: Expression)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class PolyadicExpression(val expressions: List<Expression>, val token: String) : Expression() {
|
class PolyadicExpression(val expressions: List<Expression>, val operators: List<Operator>) : Expression() {
|
||||||
override fun generateCode(builder: CodeBuilder) {
|
override fun generateCode(builder: CodeBuilder) {
|
||||||
builder.append(expressions, " " + token + " ")
|
assert(expressions.size == operators.size + 1)
|
||||||
|
for ((i, expression) in expressions.withIndex()) {
|
||||||
|
builder.append(expression)
|
||||||
|
if (i < operators.size) {
|
||||||
|
builder.append(" ")
|
||||||
|
builder.append(operators[i])
|
||||||
|
builder.append(" ")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
open class Operator(val operatorType: IElementType): Expression() {
|
||||||
|
override fun generateCode(builder: CodeBuilder) {
|
||||||
|
builder.append(asString(operatorType))
|
||||||
|
}
|
||||||
|
|
||||||
|
fun asString() = asString(operatorType)
|
||||||
|
|
||||||
|
private fun asString(tokenType: IElementType): String {
|
||||||
|
return when(tokenType) {
|
||||||
|
JavaTokenType.EQ -> "="
|
||||||
|
JavaTokenType.EQEQ -> "=="
|
||||||
|
JavaTokenType.NE -> "!="
|
||||||
|
JavaTokenType.ANDAND -> "&&"
|
||||||
|
JavaTokenType.OROR -> "||"
|
||||||
|
JavaTokenType.GT -> ">"
|
||||||
|
JavaTokenType.LT -> "<"
|
||||||
|
JavaTokenType.GE -> ">="
|
||||||
|
JavaTokenType.LE -> "<="
|
||||||
|
JavaTokenType.EXCL -> "!"
|
||||||
|
JavaTokenType.PLUS -> "+"
|
||||||
|
JavaTokenType.MINUS -> "-"
|
||||||
|
JavaTokenType.ASTERISK -> "*"
|
||||||
|
JavaTokenType.DIV -> "/"
|
||||||
|
JavaTokenType.PERC -> "%"
|
||||||
|
JavaTokenType.PLUSEQ -> "+="
|
||||||
|
JavaTokenType.MINUSEQ -> "-="
|
||||||
|
JavaTokenType.ASTERISKEQ -> "*="
|
||||||
|
JavaTokenType.DIVEQ -> "/="
|
||||||
|
JavaTokenType.PERCEQ -> "%="
|
||||||
|
JavaTokenType.GTGT -> "shr"
|
||||||
|
JavaTokenType.LTLT -> "shl"
|
||||||
|
JavaTokenType.XOR -> "xor"
|
||||||
|
JavaTokenType.AND -> "and"
|
||||||
|
JavaTokenType.OR -> "or"
|
||||||
|
JavaTokenType.GTGTGT -> "ushr"
|
||||||
|
JavaTokenType.GTGTEQ -> "shr"
|
||||||
|
JavaTokenType.LTLTEQ -> "shl"
|
||||||
|
JavaTokenType.XOREQ -> "xor"
|
||||||
|
JavaTokenType.ANDEQ -> "and"
|
||||||
|
JavaTokenType.OREQ -> "or"
|
||||||
|
JavaTokenType.GTGTGTEQ -> "ushr"
|
||||||
|
JavaTokenType.PLUSPLUS -> "++"
|
||||||
|
JavaTokenType.MINUSMINUS -> "--"
|
||||||
|
KtTokens.EQEQEQ -> "==="
|
||||||
|
KtTokens.EXCLEQEQEQ -> "!=="
|
||||||
|
else -> "" //System.out.println("UNSUPPORTED TOKEN TYPE: " + tokenType?.toString())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
val EQEQ = Operator(JavaTokenType.EQEQ).assignNoPrototype()
|
||||||
|
val EQ = Operator(JavaTokenType.EQ).assignNoPrototype()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.j2k.ast
|
package org.jetbrains.kotlin.j2k.ast
|
||||||
|
|
||||||
import org.jetbrains.kotlin.j2k.*
|
import org.jetbrains.kotlin.j2k.CodeBuilder
|
||||||
|
|
||||||
fun String.withSuffix(suffix: String): String = if (isEmpty()) "" else this + suffix
|
fun String.withSuffix(suffix: String): String = if (isEmpty()) "" else this + suffix
|
||||||
fun String.withPrefix(prefix: String): String = if (isEmpty()) "" else prefix + this
|
fun String.withPrefix(prefix: String): String = if (isEmpty()) "" else prefix + this
|
||||||
@@ -43,7 +43,7 @@ private fun Expression.precedence(): Int? {
|
|||||||
|
|
||||||
is TypeCastExpression -> 2
|
is TypeCastExpression -> 2
|
||||||
|
|
||||||
is BinaryExpression -> when(op) {
|
is BinaryExpression -> when(op.asString()) {
|
||||||
"*", "/", "%" -> 3
|
"*", "/", "%" -> 3
|
||||||
"+", "-" -> 4
|
"+", "-" -> 4
|
||||||
"?:" -> 7
|
"?:" -> 7
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ package org.jetbrains.kotlin.j2k.usageProcessing
|
|||||||
import com.intellij.psi.*
|
import com.intellij.psi.*
|
||||||
import org.jetbrains.kotlin.j2k.AccessorKind
|
import org.jetbrains.kotlin.j2k.AccessorKind
|
||||||
import org.jetbrains.kotlin.j2k.CodeConverter
|
import org.jetbrains.kotlin.j2k.CodeConverter
|
||||||
import org.jetbrains.kotlin.j2k.ResolverForConverter
|
|
||||||
import org.jetbrains.kotlin.j2k.ast.*
|
import org.jetbrains.kotlin.j2k.ast.*
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
|
|
||||||
@@ -43,7 +42,7 @@ class AccessorToPropertyProcessing(val accessorMethod: PsiMethod, val accessorKi
|
|||||||
else {
|
else {
|
||||||
if (arguments.size() != 1) return null // incorrect call
|
if (arguments.size() != 1) return null // incorrect call
|
||||||
val argument = codeConverter.convertExpression(arguments[0])
|
val argument = codeConverter.convertExpression(arguments[0])
|
||||||
return AssignmentExpression(propertyAccess, argument, "=")
|
return AssignmentExpression(propertyAccess, argument, Operator.EQ)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ internal enum class Color : Runnable {
|
|||||||
WHITE, BLACK, RED, YELLOW, BLUE;
|
WHITE, BLACK, RED, YELLOW, BLUE;
|
||||||
|
|
||||||
override fun run() {
|
override fun run() {
|
||||||
println("name()=" + name + ", toString()=" + toString())
|
println("name()=" + name +
|
||||||
|
", toString()=" + toString())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
//file
|
//file
|
||||||
import kotlinApi.*;
|
import kotlinApi.*;
|
||||||
|
|
||||||
|
//TODO: Formatter works incorrectly
|
||||||
class A {
|
class A {
|
||||||
int foo(KotlinClass c) {
|
int foo(KotlinClass c) {
|
||||||
return c.getNullableProperty().length()
|
return c.getNullableProperty().length()
|
||||||
|
|||||||
@@ -1,7 +1,15 @@
|
|||||||
import kotlinApi.*
|
import kotlinApi.*
|
||||||
|
|
||||||
|
//TODO: Formatter works incorrectly
|
||||||
internal class A {
|
internal class A {
|
||||||
fun foo(c: KotlinClass): Int {
|
fun foo(c: KotlinClass): Int {
|
||||||
return c.nullableProperty!!.length + c.property.length + KotlinClass.nullableStaticVar!! + KotlinClass.staticVar + KotlinClass.nullableStaticFun(1)!! + KotlinClass.staticFun(1) + nullableGlobalFunction("")!!.length + globalFunction("").length
|
return c.nullableProperty!!.length
|
||||||
|
+c.property.length
|
||||||
|
+KotlinClass.nullableStaticVar!!
|
||||||
|
+KotlinClass.staticVar
|
||||||
|
+KotlinClass.nullableStaticFun(1)!!
|
||||||
|
+KotlinClass.staticFun(1)
|
||||||
|
+nullableGlobalFunction("")!!.length
|
||||||
|
+globalFunction("").length
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4,6 +4,8 @@ internal class C {
|
|||||||
fun foo(): Int {
|
fun foo(): Int {
|
||||||
KotlinObject.property1 = 1
|
KotlinObject.property1 = 1
|
||||||
KotlinObject.property2 = 2
|
KotlinObject.property2 = 2
|
||||||
return KotlinObject.foo() + KotlinObject.property1 + KotlinObject.property2
|
return KotlinObject.foo() +
|
||||||
|
KotlinObject.property1 +
|
||||||
|
KotlinObject.property2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
public class A {
|
||||||
|
public static final String TEXT1 = "text1.\n" +
|
||||||
|
"text2\n" +
|
||||||
|
"text3";
|
||||||
|
|
||||||
|
|
||||||
|
public static final String TEXT2 = "text1\n"
|
||||||
|
+ "text2\n"
|
||||||
|
+ "text3";
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
object A {
|
||||||
|
val TEXT1 = "text1.\n" +
|
||||||
|
"text2\n" +
|
||||||
|
"text3"
|
||||||
|
|
||||||
|
|
||||||
|
val TEXT2 = "text1\n"
|
||||||
|
+ "text2\n"
|
||||||
|
+ "text3"
|
||||||
|
}
|
||||||
@@ -3941,6 +3941,21 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("j2k/testData/fileOrElement/strings")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
public static class Strings extends AbstractJavaToKotlinConverterForWebDemoTest {
|
||||||
|
public void testAllFilesPresentInStrings() throws Exception {
|
||||||
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("j2k/testData/fileOrElement/strings"), Pattern.compile("^(.+)\\.java$"), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("formattedString.java")
|
||||||
|
public void testFormattedString() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/strings/formattedString.java");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("j2k/testData/fileOrElement/superExpression")
|
@TestMetadata("j2k/testData/fileOrElement/superExpression")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
|||||||
@@ -3941,6 +3941,21 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("j2k/testData/fileOrElement/strings")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
public static class Strings extends AbstractJavaToKotlinConverterSingleFileTest {
|
||||||
|
public void testAllFilesPresentInStrings() throws Exception {
|
||||||
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("j2k/testData/fileOrElement/strings"), Pattern.compile("^(.+)\\.java$"), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("formattedString.java")
|
||||||
|
public void testFormattedString() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/strings/formattedString.java");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("j2k/testData/fileOrElement/superExpression")
|
@TestMetadata("j2k/testData/fileOrElement/superExpression")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
|||||||
Reference in New Issue
Block a user