From 6096b1fd56fd9b53b0bd989c5b212b5856abe696 Mon Sep 17 00:00:00 2001 From: Dimach Date: Wed, 6 Jun 2018 17:32:51 +0300 Subject: [PATCH] New J2K: Java polyadic expression --- .../org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt | 4 ++++ j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt | 12 ++++++++++++ j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt | 7 +++++++ .../jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt | 1 + .../kotlin/j2k/tree/visitors/JKVisitorVoid.kt | 2 ++ 5 files changed, 26 insertions(+) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt index 885dca3f945..a34e1bed76f 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt @@ -58,6 +58,10 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) { is PsiConditionalExpression -> JKIfElseExpressionImpl( condition.toJK(), thenExpression.toJK(), elseExpression.toJK() ) + is PsiPolyadicExpression -> JKJavaPolyadicExpressionImpl( + operands.map { it.toJK() }, + Array(operands.lastIndex) { getTokenBeforeOperand(operands[it + 1]) }.map { it?.toJK() ?: TODO() } + ) else -> { throw RuntimeException("Not supported: ${this::class}") } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt index 24a3fd4d21b..90f768454ce 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt @@ -176,4 +176,16 @@ class JKJavaInstanceOfExpressionImpl(expression: JKExpression, type: JKTypeEleme override var expression by child(expression) override fun accept(visitor: JKVisitor, data: D): R = visitor.visitJavaInstanceOfExpression(this, data) +} + +class JKJavaPolyadicExpressionImpl(operands: List, override var tokens: List) : JKJavaPolyadicExpression, + JKBranchElementBase() { + override var operands by children(operands) + + override fun getTokenBeforeOperand(operand: JKExpression): JKOperator? { + val index = operands.indexOf(operand) + return if (index < 1 || index > tokens.size) null else tokens[index - 1] + } + + override fun accept(visitor: JKVisitor, data: D): R = visitor.visitJavaPolyadicExpression(this, data) } \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt index 5263e6382ce..131d16cfdf9 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt @@ -87,4 +87,11 @@ interface JKJavaForLoopStatement : JKLoopStatement { interface JKJavaInstanceOfExpression : JKExpression { var expression: JKExpression var type: JKTypeElement +} + +interface JKJavaPolyadicExpression : JKExpression { + var operands: List + var tokens: List + + fun getTokenBeforeOperand(operand: JKExpression): JKOperator? } \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt index 3a4e006d4a9..04290775760 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt @@ -65,6 +65,7 @@ interface JKVisitor { fun visitJavaAssertStatement(javaAssertStatement: JKJavaAssertStatement, data: D): R = visitStatement(javaAssertStatement, data) fun visitJavaForLoopStatement(javaForLoopStatement: JKJavaForLoopStatement, data: D): R = visitLoopStatement(javaForLoopStatement, data) fun visitJavaInstanceOfExpression(javaInstanceOfExpression: JKJavaInstanceOfExpression, data: D): R = visitExpression(javaInstanceOfExpression, data) + fun visitJavaPolyadicExpression(javaPolyadicExpression: JKJavaPolyadicExpression, data: D): R = visitExpression(javaPolyadicExpression, data) fun visitKtProperty(ktProperty: JKKtProperty, data: D): R = visitField(ktProperty, data) fun visitKtFunction(ktFunction: JKKtFunction, data: D): R = visitMethod(ktFunction, data) fun visitKtConstructor(ktConstructor: JKKtConstructor, data: D): R = visitDeclaration(ktConstructor, data) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt index fe72a16ea0b..1e2df77d95d 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt @@ -127,6 +127,8 @@ interface JKVisitorVoid : JKVisitor { override fun visitJavaForLoopStatement(javaForLoopStatement: JKJavaForLoopStatement, data: Nothing?) = visitJavaForLoopStatement(javaForLoopStatement) fun visitJavaInstanceOfExpression(javaInstanceOfExpression: JKJavaInstanceOfExpression) = visitExpression(javaInstanceOfExpression, null) override fun visitJavaInstanceOfExpression(javaInstanceOfExpression: JKJavaInstanceOfExpression, data: Nothing?) = visitJavaInstanceOfExpression(javaInstanceOfExpression) + fun visitJavaPolyadicExpression(javaPolyadicExpression: JKJavaPolyadicExpression) = visitExpression(javaPolyadicExpression, null) + override fun visitJavaPolyadicExpression(javaPolyadicExpression: JKJavaPolyadicExpression, data: Nothing?) = visitJavaPolyadicExpression(javaPolyadicExpression) fun visitKtProperty(ktProperty: JKKtProperty) = visitField(ktProperty, null) override fun visitKtProperty(ktProperty: JKKtProperty, data: Nothing?) = visitKtProperty(ktProperty) fun visitKtFunction(ktFunction: JKKtFunction) = visitMethod(ktFunction, null)