New J2K: Add transformers

This commit is contained in:
Simon Ogorodnik
2017-10-13 23:58:39 +03:00
committed by Ilya Kirillov
parent 4f7c46741e
commit 68c03a6236
22 changed files with 275 additions and 31 deletions
@@ -35,6 +35,8 @@ import java.io.File
val JK_ROOT = File("./j2k/newSrc/org/jetbrains/kotlin/j2k/tree")
val JK_OUT_ROOT = File(JK_ROOT, "visitors")
val JK_KT_FILE = File(JK_ROOT, "k.kt")
val JK_JAVA_FILE = File(JK_ROOT, "j.kt")
val JK_COMMON_FILE = File(JK_ROOT, "jk.kt")
@@ -58,15 +60,17 @@ fun String.safeVarName() = when (this) {
else -> this
}
fun genVisitors(interfaceData: List<InterfaceData>, visitorName: String, extends: String = "") {
fun genVisitors(interfaceData: List<InterfaceData>, visitorName: String, transformerName: String, visitorExtends: String? = null, transformerExtends: String? = null) {
val outFile = File(JK_ROOT, "$visitorName.kt")
val pkg = "package org.jetbrains.kotlin.j2k.tree.visitors"
outFile.writeText(buildString {
appendln("package org.jetbrains.kotlin.j2k.tree")
File(JK_OUT_ROOT, "$visitorName.kt").writeText(buildString {
appendln(pkg)
appendln()
val extends = if (extends.isNotBlank()) ": $extends<R, D>" else ""
appendln("interface $visitorName<R, D> $extends {")
appendln("import org.jetbrains.kotlin.j2k.tree.*")
appendln()
val extends = visitorExtends?.let { " : $it<R, D>" } ?: ""
appendln("interface $visitorName<R, D>$extends {")
interfaceData.joinTo(this, separator = "\n") { (name, ext) ->
val nameWithoutPrefix = name.removePrefix("JK")
val argName = nameWithoutPrefix.decapitalize().safeVarName()
@@ -79,12 +83,13 @@ fun genVisitors(interfaceData: List<InterfaceData>, visitorName: String, extends
appendln("}")
})
val outVoidFile = File(JK_ROOT, "${visitorName}Void.kt")
outVoidFile.writeText(buildString {
appendln("package org.jetbrains.kotlin.j2k.tree")
File(JK_OUT_ROOT, "${visitorName}Void.kt").writeText(buildString {
appendln(pkg)
appendln()
val extends = if (extends.isNotBlank()) ", ${extends}Void" else ""
appendln("import org.jetbrains.kotlin.j2k.tree.*")
appendln()
val extends = visitorExtends?.let { ", ${it}Void" } ?: ""
appendln("interface ${visitorName}Void : $visitorName<Unit, Nothing?>$extends {")
interfaceData.joinTo(this, separator = "\n") { (name, ext) ->
@@ -100,17 +105,54 @@ fun genVisitors(interfaceData: List<InterfaceData>, visitorName: String, extends
appendln()
appendln("}")
})
File(JK_OUT_ROOT, "$transformerName.kt").writeText(buildString {
appendln(pkg)
appendln()
appendln("import org.jetbrains.kotlin.j2k.tree.*")
appendln()
val extends = transformerExtends?.let { " : $it<D>" } ?: ""
appendln("interface $transformerName<D>$extends {")
interfaceData.joinTo(this, separator = "\n") { (name, ext) ->
val nameWithoutPrefix = name.removePrefix("JK")
val argName = nameWithoutPrefix.decapitalize().safeVarName()
val generifyCall = if (name != "JKElement") "= transform${ext!!.removePrefix("JK")}($argName, data)" else ""
"""
| fun transform$nameWithoutPrefix($argName: $name, data: D): JKElement $generifyCall
""".trimMargin()
}
appendln()
appendln("}")
})
File(JK_OUT_ROOT, "${transformerName}Void.kt").writeText(buildString {
appendln(pkg)
appendln()
appendln("import org.jetbrains.kotlin.j2k.tree.*")
appendln()
val extends = transformerExtends?.let { ", ${it}Void" } ?: ""
appendln("interface ${transformerName}Void : $transformerName<Nothing?>$extends {")
interfaceData.joinTo(this, separator = "\n") { (name, ext) ->
val nameWithoutPrefix = name.removePrefix("JK")
val argName = nameWithoutPrefix.decapitalize().safeVarName()
val arg = "$argName: $name"
val generifyCall = if (name != "JKElement") "= transform${ext!!.removePrefix("JK")}($argName, null)" else ": JKElement"
"""
| fun transform$nameWithoutPrefix($arg) $generifyCall
| override fun transform$nameWithoutPrefix($arg, data: Nothing?) = transform$nameWithoutPrefix($argName)
""".trimMargin()
}
appendln()
appendln("}")
})
}
// JKVisitor<R,D> + Void
genVisitors(JK_COMMON_FILE.interfaceNames(), "JKVisitor")
genVisitors(JK_JAVA_FILE.interfaceNames(), "JKJavaVisitor", "JKVisitor")
genVisitors(JK_KT_FILE.interfaceNames(), "JKKtVisitor", "JKVisitor")
/* JKKtVisitor<R,D> : JKVisitor<R,D> + Void
JKJavaVisitor<R,D> : JKVisitor<R,D> + Void
*/
//val visitNames =
genVisitors(JK_COMMON_FILE.interfaceNames(), "JKVisitor", "JKTransformer")
genVisitors(JK_JAVA_FILE.interfaceNames(), "JKJavaVisitor", "JKJavaTransformer", "JKVisitor", "JKTransformer")
genVisitors(JK_KT_FILE.interfaceNames(), "JKKtVisitor", "JKKtTransformer", "JKVisitor", "JKTransformer")
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.j2k.tree
import org.jetbrains.kotlin.j2k.tree.visitors.JKJavaKtVisitorVoid
import org.jetbrains.kotlin.utils.Printer
private class DebugTreePrinter : JKJavaKtVisitorVoid {
@@ -1,3 +0,0 @@
package org.jetbrains.kotlin.j2k.tree
interface JKJavaKtVisitorVoid : JKJavaKtVisitor<Unit, Nothing?>, JKJavaVisitorVoid, JKKtVisitorVoid
@@ -17,6 +17,8 @@
package org.jetbrains.kotlin.j2k.tree.impl
import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.visitors.JKJavaVisitor
import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitor
class JKJavaFieldImpl(override var type: JKTypeIdentifier,
override var name: JKNameIdentifier,
@@ -17,11 +17,17 @@
package org.jetbrains.kotlin.j2k.tree.impl
import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.visitors.JKTransformer
import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitor
abstract class JKElementBase : JKElement {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitElement(this, data)
override fun <D> acceptChildren(visitor: JKVisitor<Unit, D>, data: D) {}
override fun <D> transform(transformer: JKTransformer<D>, data: D): JKElement = transformer.transformElement(this, data)
override fun <D> transformChildren(transformer: JKTransformer<D>, data: D) {}
}
@@ -16,11 +16,18 @@
package org.jetbrains.kotlin.j2k.tree
import org.jetbrains.kotlin.j2k.tree.visitors.JKTransformer
import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitor
interface JKElement {
fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R
fun <D> acceptChildren(visitor: JKVisitor<Unit, D>, data: D)
fun <D> transform(transformer: JKTransformer<D>, data: D): JKElement
fun <D> transformChildren(transformer: JKTransformer<D>, data: D)
}
interface JKClass : JKDeclaration {
@@ -0,0 +1,19 @@
/*
* Copyright 2010-2017 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.j2k.tree.visitors
interface JKJavaKtTransformer<D> : JKJavaTransformer<D>, JKKtTransformer<D>
@@ -0,0 +1,19 @@
/*
* Copyright 2010-2017 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.j2k.tree.visitors
interface JKJavaKtTransformerVoid : JKJavaKtTransformer<Nothing?>, JKJavaTransformerVoid, JKKtTransformerVoid
@@ -1,3 +1,3 @@
package org.jetbrains.kotlin.j2k.tree
package org.jetbrains.kotlin.j2k.tree.visitors
interface JKJavaKtVisitor<R, D> : JKJavaVisitor<R, D>, JKKtVisitor<R, D>
@@ -0,0 +1,19 @@
/*
* Copyright 2010-2017 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.j2k.tree.visitors
interface JKJavaKtVisitorVoid : JKJavaKtVisitor<Unit, Nothing?>, JKJavaVisitorVoid, JKKtVisitorVoid
@@ -0,0 +1,14 @@
package org.jetbrains.kotlin.j2k.tree.visitors
import org.jetbrains.kotlin.j2k.tree.*
interface JKJavaTransformer<D> : JKTransformer<D> {
fun transformJavaField(javaField: JKJavaField, data: D): JKElement = transformDeclaration(javaField, data)
fun transformJavaMethod(javaMethod: JKJavaMethod, data: D): JKElement = transformDeclaration(javaMethod, data)
fun transformJavaForLoop(javaForLoop: JKJavaForLoop, data: D): JKElement = transformLoop(javaForLoop, data)
fun transformJavaAssignmentExpression(javaAssignmentExpression: JKJavaAssignmentExpression, data: D): JKElement = transformExpression(javaAssignmentExpression, data)
fun transformJavaCall(javaCall: JKJavaCall, data: D): JKElement = transformCall(javaCall, data)
fun transformJavaTypeIdentifier(javaTypeIdentifier: JKJavaTypeIdentifier, data: D): JKElement = transformTypeIdentifier(javaTypeIdentifier, data)
fun transformJavaStringLiteralExpression(javaStringLiteralExpression: JKJavaStringLiteralExpression, data: D): JKElement = transformLiteralExpression(javaStringLiteralExpression, data)
fun transformJavaAccessModifier(javaAccessModifier: JKJavaAccessModifier, data: D): JKElement = transformAccessModifier(javaAccessModifier, data)
}
@@ -0,0 +1,22 @@
package org.jetbrains.kotlin.j2k.tree.visitors
import org.jetbrains.kotlin.j2k.tree.*
interface JKJavaTransformerVoid : JKJavaTransformer<Nothing?>, JKTransformerVoid {
fun transformJavaField(javaField: JKJavaField) = transformDeclaration(javaField, null)
override fun transformJavaField(javaField: JKJavaField, data: Nothing?) = transformJavaField(javaField)
fun transformJavaMethod(javaMethod: JKJavaMethod) = transformDeclaration(javaMethod, null)
override fun transformJavaMethod(javaMethod: JKJavaMethod, data: Nothing?) = transformJavaMethod(javaMethod)
fun transformJavaForLoop(javaForLoop: JKJavaForLoop) = transformLoop(javaForLoop, null)
override fun transformJavaForLoop(javaForLoop: JKJavaForLoop, data: Nothing?) = transformJavaForLoop(javaForLoop)
fun transformJavaAssignmentExpression(javaAssignmentExpression: JKJavaAssignmentExpression) = transformExpression(javaAssignmentExpression, null)
override fun transformJavaAssignmentExpression(javaAssignmentExpression: JKJavaAssignmentExpression, data: Nothing?) = transformJavaAssignmentExpression(javaAssignmentExpression)
fun transformJavaCall(javaCall: JKJavaCall) = transformCall(javaCall, null)
override fun transformJavaCall(javaCall: JKJavaCall, data: Nothing?) = transformJavaCall(javaCall)
fun transformJavaTypeIdentifier(javaTypeIdentifier: JKJavaTypeIdentifier) = transformTypeIdentifier(javaTypeIdentifier, null)
override fun transformJavaTypeIdentifier(javaTypeIdentifier: JKJavaTypeIdentifier, data: Nothing?) = transformJavaTypeIdentifier(javaTypeIdentifier)
fun transformJavaStringLiteralExpression(javaStringLiteralExpression: JKJavaStringLiteralExpression) = transformLiteralExpression(javaStringLiteralExpression, null)
override fun transformJavaStringLiteralExpression(javaStringLiteralExpression: JKJavaStringLiteralExpression, data: Nothing?) = transformJavaStringLiteralExpression(javaStringLiteralExpression)
fun transformJavaAccessModifier(javaAccessModifier: JKJavaAccessModifier) = transformAccessModifier(javaAccessModifier, null)
override fun transformJavaAccessModifier(javaAccessModifier: JKJavaAccessModifier, data: Nothing?) = transformJavaAccessModifier(javaAccessModifier)
}
@@ -1,4 +1,6 @@
package org.jetbrains.kotlin.j2k.tree
package org.jetbrains.kotlin.j2k.tree.visitors
import org.jetbrains.kotlin.j2k.tree.*
interface JKJavaVisitor<R, D> : JKVisitor<R, D> {
fun visitJavaField(javaField: JKJavaField, data: D): R = visitDeclaration(javaField, data)
@@ -1,4 +1,6 @@
package org.jetbrains.kotlin.j2k.tree
package org.jetbrains.kotlin.j2k.tree.visitors
import org.jetbrains.kotlin.j2k.tree.*
interface JKJavaVisitorVoid : JKJavaVisitor<Unit, Nothing?>, JKVisitorVoid {
fun visitJavaField(javaField: JKJavaField) = visitDeclaration(javaField, null)
@@ -0,0 +1,11 @@
package org.jetbrains.kotlin.j2k.tree.visitors
import org.jetbrains.kotlin.j2k.tree.*
interface JKKtTransformer<D> : JKTransformer<D> {
fun transformKtFun(ktFun: JKKtFun, data: D): JKElement = transformDeclaration(ktFun, data)
fun transformKtConstructor(ktConstructor: JKKtConstructor, data: D): JKElement = transformDeclaration(ktConstructor, data)
fun transformKtPrimaryConstructor(ktPrimaryConstructor: JKKtPrimaryConstructor, data: D): JKElement = transformKtConstructor(ktPrimaryConstructor, data)
fun transformKtAssignmentStatement(ktAssignmentStatement: JKKtAssignmentStatement, data: D): JKElement = transformStatement(ktAssignmentStatement, data)
fun transformKtCall(ktCall: JKKtCall, data: D): JKElement = transformCall(ktCall, data)
}
@@ -0,0 +1,16 @@
package org.jetbrains.kotlin.j2k.tree.visitors
import org.jetbrains.kotlin.j2k.tree.*
interface JKKtTransformerVoid : JKKtTransformer<Nothing?>, JKTransformerVoid {
fun transformKtFun(ktFun: JKKtFun) = transformDeclaration(ktFun, null)
override fun transformKtFun(ktFun: JKKtFun, data: Nothing?) = transformKtFun(ktFun)
fun transformKtConstructor(ktConstructor: JKKtConstructor) = transformDeclaration(ktConstructor, null)
override fun transformKtConstructor(ktConstructor: JKKtConstructor, data: Nothing?) = transformKtConstructor(ktConstructor)
fun transformKtPrimaryConstructor(ktPrimaryConstructor: JKKtPrimaryConstructor) = transformKtConstructor(ktPrimaryConstructor, null)
override fun transformKtPrimaryConstructor(ktPrimaryConstructor: JKKtPrimaryConstructor, data: Nothing?) = transformKtPrimaryConstructor(ktPrimaryConstructor)
fun transformKtAssignmentStatement(ktAssignmentStatement: JKKtAssignmentStatement) = transformStatement(ktAssignmentStatement, null)
override fun transformKtAssignmentStatement(ktAssignmentStatement: JKKtAssignmentStatement, data: Nothing?) = transformKtAssignmentStatement(ktAssignmentStatement)
fun transformKtCall(ktCall: JKKtCall) = transformCall(ktCall, null)
override fun transformKtCall(ktCall: JKKtCall, data: Nothing?) = transformKtCall(ktCall)
}
@@ -1,4 +1,6 @@
package org.jetbrains.kotlin.j2k.tree
package org.jetbrains.kotlin.j2k.tree.visitors
import org.jetbrains.kotlin.j2k.tree.*
interface JKKtVisitor<R, D> : JKVisitor<R, D> {
fun visitKtFun(ktFun: JKKtFun, data: D): R = visitDeclaration(ktFun, data)
@@ -1,4 +1,6 @@
package org.jetbrains.kotlin.j2k.tree
package org.jetbrains.kotlin.j2k.tree.visitors
import org.jetbrains.kotlin.j2k.tree.*
interface JKKtVisitorVoid : JKKtVisitor<Unit, Nothing?>, JKVisitorVoid {
fun visitKtFun(ktFun: JKKtFun) = visitDeclaration(ktFun, null)
@@ -0,0 +1,21 @@
package org.jetbrains.kotlin.j2k.tree.visitors
import org.jetbrains.kotlin.j2k.tree.*
interface JKTransformer<D> {
fun transformElement(element: JKElement, data: D): JKElement
fun transformClass(klass: JKClass, data: D): JKElement = transformDeclaration(klass, data)
fun transformStatement(statement: JKStatement, data: D): JKElement = transformElement(statement, data)
fun transformExpression(expression: JKExpression, data: D): JKElement = transformStatement(expression, data)
fun transformLoop(loop: JKLoop, data: D): JKElement = transformStatement(loop, data)
fun transformDeclaration(declaration: JKDeclaration, data: D): JKElement = transformElement(declaration, data)
fun transformBlock(block: JKBlock, data: D): JKElement = transformElement(block, data)
fun transformCall(call: JKCall, data: D): JKElement = transformExpression(call, data)
fun transformIdentifier(identifier: JKIdentifier, data: D): JKElement = transformElement(identifier, data)
fun transformTypeIdentifier(typeIdentifier: JKTypeIdentifier, data: D): JKElement = transformIdentifier(typeIdentifier, data)
fun transformNameIdentifier(nameIdentifier: JKNameIdentifier, data: D): JKElement = transformIdentifier(nameIdentifier, data)
fun transformLiteralExpression(literalExpression: JKLiteralExpression, data: D): JKElement = transformExpression(literalExpression, data)
fun transformModifierList(modifierList: JKModifierList, data: D): JKElement = transformElement(modifierList, data)
fun transformModifier(modifier: JKModifier, data: D): JKElement = transformElement(modifier, data)
fun transformAccessModifier(accessModifier: JKAccessModifier, data: D): JKElement = transformModifier(accessModifier, data)
}
@@ -0,0 +1,36 @@
package org.jetbrains.kotlin.j2k.tree.visitors
import org.jetbrains.kotlin.j2k.tree.*
interface JKTransformerVoid : JKTransformer<Nothing?> {
fun transformElement(element: JKElement) : JKElement
override fun transformElement(element: JKElement, data: Nothing?) = transformElement(element)
fun transformClass(klass: JKClass) = transformDeclaration(klass, null)
override fun transformClass(klass: JKClass, data: Nothing?) = transformClass(klass)
fun transformStatement(statement: JKStatement) = transformElement(statement, null)
override fun transformStatement(statement: JKStatement, data: Nothing?) = transformStatement(statement)
fun transformExpression(expression: JKExpression) = transformStatement(expression, null)
override fun transformExpression(expression: JKExpression, data: Nothing?) = transformExpression(expression)
fun transformLoop(loop: JKLoop) = transformStatement(loop, null)
override fun transformLoop(loop: JKLoop, data: Nothing?) = transformLoop(loop)
fun transformDeclaration(declaration: JKDeclaration) = transformElement(declaration, null)
override fun transformDeclaration(declaration: JKDeclaration, data: Nothing?) = transformDeclaration(declaration)
fun transformBlock(block: JKBlock) = transformElement(block, null)
override fun transformBlock(block: JKBlock, data: Nothing?) = transformBlock(block)
fun transformCall(call: JKCall) = transformExpression(call, null)
override fun transformCall(call: JKCall, data: Nothing?) = transformCall(call)
fun transformIdentifier(identifier: JKIdentifier) = transformElement(identifier, null)
override fun transformIdentifier(identifier: JKIdentifier, data: Nothing?) = transformIdentifier(identifier)
fun transformTypeIdentifier(typeIdentifier: JKTypeIdentifier) = transformIdentifier(typeIdentifier, null)
override fun transformTypeIdentifier(typeIdentifier: JKTypeIdentifier, data: Nothing?) = transformTypeIdentifier(typeIdentifier)
fun transformNameIdentifier(nameIdentifier: JKNameIdentifier) = transformIdentifier(nameIdentifier, null)
override fun transformNameIdentifier(nameIdentifier: JKNameIdentifier, data: Nothing?) = transformNameIdentifier(nameIdentifier)
fun transformLiteralExpression(literalExpression: JKLiteralExpression) = transformExpression(literalExpression, null)
override fun transformLiteralExpression(literalExpression: JKLiteralExpression, data: Nothing?) = transformLiteralExpression(literalExpression)
fun transformModifierList(modifierList: JKModifierList) = transformElement(modifierList, null)
override fun transformModifierList(modifierList: JKModifierList, data: Nothing?) = transformModifierList(modifierList)
fun transformModifier(modifier: JKModifier) = transformElement(modifier, null)
override fun transformModifier(modifier: JKModifier, data: Nothing?) = transformModifier(modifier)
fun transformAccessModifier(accessModifier: JKAccessModifier) = transformModifier(accessModifier, null)
override fun transformAccessModifier(accessModifier: JKAccessModifier, data: Nothing?) = transformAccessModifier(accessModifier)
}
@@ -1,6 +1,8 @@
package org.jetbrains.kotlin.j2k.tree
package org.jetbrains.kotlin.j2k.tree.visitors
interface JKVisitor<R, D> {
import org.jetbrains.kotlin.j2k.tree.*
interface JKVisitor<R, D> {
fun visitElement(element: JKElement, data: D): R
fun visitClass(klass: JKClass, data: D): R = visitDeclaration(klass, data)
fun visitStatement(statement: JKStatement, data: D): R = visitElement(statement, data)
@@ -1,4 +1,6 @@
package org.jetbrains.kotlin.j2k.tree
package org.jetbrains.kotlin.j2k.tree.visitors
import org.jetbrains.kotlin.j2k.tree.*
interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
fun visitElement(element: JKElement)