New J2K: While, switch, conditional expression, moved if.

This commit is contained in:
Dimach
2018-05-30 19:28:20 +03:00
committed by Ilya Kirillov
parent d718fae6d9
commit 6dc8933a93
7 changed files with 122 additions and 35 deletions
@@ -55,6 +55,9 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
is PsiInstanceOfExpression -> toJK()
is PsiThisExpression -> JKThisExpressionImpl()
is PsiSuperExpression -> JKSuperExpressionImpl()
is PsiConditionalExpression -> JKIfElseExpressionImpl(
condition.toJK(), JKExpressionStatementImpl(thenExpression.toJK()), JKExpressionStatementImpl(elseExpression.toJK())
)
else -> {
throw RuntimeException("Not supported: ${this::class}")
}
@@ -300,14 +303,25 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
is PsiDeclarationStatement -> JKDeclarationStatementImpl(declaredElements.toJK())
is PsiAssertStatement -> JKJavaAssertStatementImpl(with(expressionTreeMapper) { assertCondition.toJK() },
with(expressionTreeMapper) { assertDescription.toJK() })
is PsiIfStatement -> if (elseElement == null)
JKJavaIfStatementImpl(with(expressionTreeMapper) { condition.toJK() }, thenBranch.toJK())
else
JKJavaIfElseStatementImpl(with(expressionTreeMapper) { condition.toJK() }, thenBranch.toJK(), elseBranch.toJK())
is PsiIfStatement -> JKExpressionStatementImpl(
if (elseElement == null)
JKIfExpressionImpl(with(expressionTreeMapper) { condition.toJK() }, thenBranch.toJK())
else
JKIfElseExpressionImpl(with(expressionTreeMapper) { condition.toJK() }, thenBranch.toJK(), elseBranch.toJK())
)
is PsiForStatement -> JKJavaForLoopStatementImpl(
initialization.toJK(), with(expressionTreeMapper) { condition.toJK() }, update.toJK(), body.toJK()
)
is PsiBlockStatement -> JKBlockStatementImpl(codeBlock.toJK())
is PsiWhileStatement -> JKWhileStatementImpl(with(expressionTreeMapper) { condition.toJK() }, body.toJK())
is PsiDoWhileStatement -> JKDoWhileStatementImpl(body.toJK(), with(expressionTreeMapper) { condition.toJK() })
is PsiSwitchStatement -> JKSwitchStatementImpl(with(expressionTreeMapper) { expression.toJK() }, body?.toJK() ?: TODO())
is PsiSwitchLabelStatement -> if (isDefaultCase) JKSwitchDefaultLabelStatementImpl() else
JKSwitchLabelStatementImpl(with(expressionTreeMapper) { caseValue.toJK() })
is PsiBreakStatement -> {
labelIdentifier?.also { TODO("Label break") }
JKBreakStatementImpl()
}
else -> TODO("for ${this::class}")
}
}
@@ -162,22 +162,6 @@ class JKJavaAssertStatementImpl(condition: JKExpression, description: JKExpressi
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaAssertStatement(this, data)
}
class JKJavaIfStatementImpl(condition: JKExpression, thenBranch: JKStatement) : JKJavaIfStatement, JKBranchElementBase() {
override var thenBranch by child(thenBranch)
override var condition by child(condition)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaIfStatement(this, data)
}
class JKJavaIfElseStatementImpl(condition: JKExpression, thenBranch: JKStatement, elseBranch: JKStatement) : JKJavaIfElseStatement,
JKBranchElementBase() {
override var elseBranch by child(elseBranch)
override var thenBranch by child(thenBranch)
override var condition by child(condition)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaIfElseStatement(this, data)
}
class JKJavaForLoopStatementImpl(initializer: JKStatement, condition: JKExpression, updater: JKStatement, body: JKStatement) :
JKJavaForLoopStatement, JKBranchElementBase() {
override var body by child(body)
@@ -208,4 +208,51 @@ class JKThisExpressionImpl : JKThisExpression, JKElementBase() {
class JKSuperExpressionImpl : JKSuperExpression, JKElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitSuperExpression(this, data)
}
class JKWhileStatementImpl(condition: JKExpression, body: JKStatement) : JKWhileStatement, JKBranchElementBase() {
override var condition by child(condition)
override var body by child(body)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitWhileStatement(this, data)
}
class JKDoWhileStatementImpl(body: JKStatement, condition: JKExpression) : JKDoWhileStatement, JKBranchElementBase() {
override var condition by child(condition)
override var body by child(body)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitDoWhileStatement(this, data)
}
class JKSwitchStatementImpl(expression: JKExpression, block: JKBlock) : JKSwitchStatement, JKBranchElementBase() {
override var block by child(block)
override var expression by child(expression)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitSwitchStatement(this, data)
}
class JKSwitchLabelStatementImpl(expression: JKExpression) : JKSwitchLabelStatement, JKBranchElementBase() {
override var expression by child(expression)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitSwitchLabelStatement(this, data)
}
class JKSwitchDefaultLabelStatementImpl : JKSwitchDefaultLabelStatement, JKElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitSwitchDefaultLabelStatement(this, data)
}
class JKBreakStatementImpl : JKBreakStatement, JKElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitBreakStatement(this, data)
}
class JKIfExpressionImpl(condition: JKExpression, thenBranch: JKStatement) : JKIfExpression, JKBranchElementBase() {
override var thenBranch by child(thenBranch)
override var condition by child(condition)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitIfExpression(this, data)
}
class JKIfElseExpressionImpl(condition: JKExpression, thenBranch: JKStatement, elseBranch: JKStatement) : JKIfElseExpression,
JKBranchElementBase() {
override var elseBranch by child(elseBranch)
override var thenBranch by child(thenBranch)
override var condition by child(condition)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitIfElseExpression(this, data)
}
@@ -78,15 +78,6 @@ interface JKJavaAssertStatement : JKStatement {
val description: JKExpression
}
interface JKJavaIfStatement : JKStatement {
var condition: JKExpression
var thenBranch: JKStatement
}
interface JKJavaIfElseStatement : JKJavaIfStatement {
var elseBranch: JKStatement
}
interface JKJavaForLoopStatement : JKLoopStatement {
var initializer: JKStatement
var condition: JKExpression
@@ -167,3 +167,33 @@ interface JKBlockStatement : JKStatement {
interface JKThisExpression : JKExpression
interface JKSuperExpression : JKExpression
interface JKWhileStatement : JKLoopStatement {
var condition: JKExpression
}
interface JKDoWhileStatement : JKLoopStatement {
var condition: JKExpression
}
interface JKSwitchStatement : JKStatement {
var expression: JKExpression
var block: JKBlock
}
interface JKSwitchLabelStatement : JKStatement {
var expression: JKExpression
}
interface JKSwitchDefaultLabelStatement : JKStatement
interface JKBreakStatement : JKStatement
interface JKIfExpression : JKExpression {
var condition: JKExpression
var thenBranch: JKStatement
}
interface JKIfElseExpression : JKIfExpression {
var elseBranch: JKStatement
}
@@ -40,12 +40,21 @@ interface JKVisitor<out R, in D> {
fun visitBlockStatement(blockStatement: JKBlockStatement, data: D): R = visitStatement(blockStatement, data)
fun visitThisExpression(thisExpression: JKThisExpression, data: D): R = visitExpression(thisExpression, data)
fun visitSuperExpression(superExpression: JKSuperExpression, data: D): R = visitExpression(superExpression, data)
fun visitWhileStatement(whileStatement: JKWhileStatement, data: D): R = visitLoopStatement(whileStatement, data)
fun visitDoWhileStatement(doWhileStatement: JKDoWhileStatement, data: D): R = visitLoopStatement(doWhileStatement, data)
fun visitSwitchStatement(switchStatement: JKSwitchStatement, data: D): R = visitStatement(switchStatement, data)
fun visitSwitchLabelStatement(switchLabelStatement: JKSwitchLabelStatement, data: D): R = visitStatement(switchLabelStatement, data)
fun visitSwitchDefaultLabelStatement(switchDefaultLabelStatement: JKSwitchDefaultLabelStatement, data: D): R = visitStatement(switchDefaultLabelStatement, data)
fun visitBreakStatement(breakStatement: JKBreakStatement, data: D): R = visitStatement(breakStatement, data)
fun visitIfExpression(ifExpression: JKIfExpression, data: D): R = visitExpression(ifExpression, data)
fun visitIfElseExpression(ifElseExpression: JKIfElseExpression, data: D): R = visitIfExpression(ifElseExpression, data)
fun visitJavaField(javaField: JKJavaField, data: D): R = visitField(javaField, data)
fun visitJavaMethod(javaMethod: JKJavaMethod, data: D): R = visitMethod(javaMethod, data)
fun visitJavaAssignmentExpression(javaAssignmentExpression: JKJavaAssignmentExpression, data: D): R = visitExpression(javaAssignmentExpression, data)
fun visitJavaMethodCallExpression(javaMethodCallExpression: JKJavaMethodCallExpression, data: D): R = visitMethodCallExpression(javaMethodCallExpression, data)
fun visitJavaFieldAccessExpression(javaFieldAccessExpression: JKJavaFieldAccessExpression, data: D): R = visitFieldAccessExpression(javaFieldAccessExpression, data)
fun visitJavaNewExpression(javaNewExpression: JKJavaNewExpression, data: D): R = visitExpression(javaNewExpression, data)
fun visitJavaDefaultNewExpression(javaDefaultNewExpression: JKJavaDefaultNewExpression, data: D): R = visitExpression(javaDefaultNewExpression, data)
fun visitJavaAccessModifier(javaAccessModifier: JKJavaAccessModifier, data: D): R = visitAccessModifier(javaAccessModifier, data)
fun visitJavaModifier(javaModifier: JKJavaModifier, data: D): R = visitModifier(javaModifier, data)
fun visitJavaNewEmptyArray(javaNewEmptyArray: JKJavaNewEmptyArray, data: D): R = visitExpression(javaNewEmptyArray, data)
@@ -53,8 +62,6 @@ interface JKVisitor<out R, in D> {
fun visitJavaLiteralExpression(javaLiteralExpression: JKJavaLiteralExpression, data: D): R = visitLiteralExpression(javaLiteralExpression, data)
fun visitReturnStatement(returnStatement: JKReturnStatement, data: D): R = visitStatement(returnStatement, data)
fun visitJavaAssertStatement(javaAssertStatement: JKJavaAssertStatement, data: D): R = visitStatement(javaAssertStatement, data)
fun visitJavaIfStatement(javaIfStatement: JKJavaIfStatement, data: D): R = visitStatement(javaIfStatement, data)
fun visitJavaIfElseStatement(javaIfElseStatement: JKJavaIfElseStatement, data: D): R = visitJavaIfStatement(javaIfElseStatement, data)
fun visitJavaForLoopStatement(javaForLoopStatement: JKJavaForLoopStatement, data: D): R = visitLoopStatement(javaForLoopStatement, data)
fun visitJavaInstanceOfExpression(javaInstanceOfExpression: JKJavaInstanceOfExpression, data: D): R = visitExpression(javaInstanceOfExpression, data)
fun visitKtProperty(ktProperty: JKKtProperty, data: D): R = visitField(ktProperty, data)
@@ -77,6 +77,22 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
override fun visitThisExpression(thisExpression: JKThisExpression, data: Nothing?) = visitThisExpression(thisExpression)
fun visitSuperExpression(superExpression: JKSuperExpression) = visitExpression(superExpression, null)
override fun visitSuperExpression(superExpression: JKSuperExpression, data: Nothing?) = visitSuperExpression(superExpression)
fun visitWhileStatement(whileStatement: JKWhileStatement) = visitLoopStatement(whileStatement, null)
override fun visitWhileStatement(whileStatement: JKWhileStatement, data: Nothing?) = visitWhileStatement(whileStatement)
fun visitDoWhileStatement(doWhileStatement: JKDoWhileStatement) = visitLoopStatement(doWhileStatement, null)
override fun visitDoWhileStatement(doWhileStatement: JKDoWhileStatement, data: Nothing?) = visitDoWhileStatement(doWhileStatement)
fun visitSwitchStatement(switchStatement: JKSwitchStatement) = visitStatement(switchStatement, null)
override fun visitSwitchStatement(switchStatement: JKSwitchStatement, data: Nothing?) = visitSwitchStatement(switchStatement)
fun visitSwitchLabelStatement(switchLabelStatement: JKSwitchLabelStatement) = visitStatement(switchLabelStatement, null)
override fun visitSwitchLabelStatement(switchLabelStatement: JKSwitchLabelStatement, data: Nothing?) = visitSwitchLabelStatement(switchLabelStatement)
fun visitSwitchDefaultLabelStatement(switchDefaultLabelStatement: JKSwitchDefaultLabelStatement) = visitStatement(switchDefaultLabelStatement, null)
override fun visitSwitchDefaultLabelStatement(switchDefaultLabelStatement: JKSwitchDefaultLabelStatement, data: Nothing?) = visitSwitchDefaultLabelStatement(switchDefaultLabelStatement)
fun visitBreakStatement(breakStatement: JKBreakStatement) = visitStatement(breakStatement, null)
override fun visitBreakStatement(breakStatement: JKBreakStatement, data: Nothing?) = visitBreakStatement(breakStatement)
fun visitIfExpression(ifExpression: JKIfExpression) = visitExpression(ifExpression, null)
override fun visitIfExpression(ifExpression: JKIfExpression, data: Nothing?) = visitIfExpression(ifExpression)
fun visitIfElseExpression(ifElseExpression: JKIfElseExpression) = visitIfExpression(ifElseExpression, null)
override fun visitIfElseExpression(ifElseExpression: JKIfElseExpression, data: Nothing?) = visitIfElseExpression(ifElseExpression)
fun visitJavaField(javaField: JKJavaField) = visitField(javaField, null)
override fun visitJavaField(javaField: JKJavaField, data: Nothing?) = visitJavaField(javaField)
fun visitJavaMethod(javaMethod: JKJavaMethod) = visitMethod(javaMethod, null)
@@ -89,6 +105,8 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
override fun visitJavaFieldAccessExpression(javaFieldAccessExpression: JKJavaFieldAccessExpression, data: Nothing?) = visitJavaFieldAccessExpression(javaFieldAccessExpression)
fun visitJavaNewExpression(javaNewExpression: JKJavaNewExpression) = visitExpression(javaNewExpression, null)
override fun visitJavaNewExpression(javaNewExpression: JKJavaNewExpression, data: Nothing?) = visitJavaNewExpression(javaNewExpression)
fun visitJavaDefaultNewExpression(javaDefaultNewExpression: JKJavaDefaultNewExpression) = visitExpression(javaDefaultNewExpression, null)
override fun visitJavaDefaultNewExpression(javaDefaultNewExpression: JKJavaDefaultNewExpression, data: Nothing?) = visitJavaDefaultNewExpression(javaDefaultNewExpression)
fun visitJavaAccessModifier(javaAccessModifier: JKJavaAccessModifier) = visitAccessModifier(javaAccessModifier, null)
override fun visitJavaAccessModifier(javaAccessModifier: JKJavaAccessModifier, data: Nothing?) = visitJavaAccessModifier(javaAccessModifier)
fun visitJavaModifier(javaModifier: JKJavaModifier) = visitModifier(javaModifier, null)
@@ -103,10 +121,6 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
override fun visitReturnStatement(returnStatement: JKReturnStatement, data: Nothing?) = visitReturnStatement(returnStatement)
fun visitJavaAssertStatement(javaAssertStatement: JKJavaAssertStatement) = visitStatement(javaAssertStatement, null)
override fun visitJavaAssertStatement(javaAssertStatement: JKJavaAssertStatement, data: Nothing?) = visitJavaAssertStatement(javaAssertStatement)
fun visitJavaIfStatement(javaIfStatement: JKJavaIfStatement) = visitStatement(javaIfStatement, null)
override fun visitJavaIfStatement(javaIfStatement: JKJavaIfStatement, data: Nothing?) = visitJavaIfStatement(javaIfStatement)
fun visitJavaIfElseStatement(javaIfElseStatement: JKJavaIfElseStatement) = visitJavaIfStatement(javaIfElseStatement, null)
override fun visitJavaIfElseStatement(javaIfElseStatement: JKJavaIfElseStatement, data: Nothing?) = visitJavaIfElseStatement(javaIfElseStatement)
fun visitJavaForLoopStatement(javaForLoopStatement: JKJavaForLoopStatement) = visitLoopStatement(javaForLoopStatement, null)
override fun visitJavaForLoopStatement(javaForLoopStatement: JKJavaForLoopStatement, data: Nothing?) = visitJavaForLoopStatement(javaForLoopStatement)
fun visitJavaInstanceOfExpression(javaInstanceOfExpression: JKJavaInstanceOfExpression) = visitExpression(javaInstanceOfExpression, null)