New J2K: Make generics in transformers accept least common interface

This commit is contained in:
Simon Ogorodnik
2017-10-14 02:06:48 +03:00
committed by Ilya Kirillov
parent c1f50d3594
commit 8ff78611ba
4 changed files with 57 additions and 63 deletions
+18 -5
View File
@@ -60,10 +60,19 @@ fun String.safeVarName() = when (this) {
else -> this
}
fun genVisitors(interfaceData: List<InterfaceData>, visitorName: String, transformerName: String, visitorExtends: String? = null, transformerExtends: String? = null) {
fun genVisitors(commonData: List<InterfaceData>, uncommonData: List<InterfaceData>, visitorName: String, transformerName: String, visitorExtends: String? = null, transformerExtends: String? = null) {
val interfaceData = commonData + uncommonData
val pkg = "package org.jetbrains.kotlin.j2k.tree.visitors"
fun String.firstCommonInterfaceName(): String {
val data = interfaceData.find { it.name == this }!!
if (commonData.contains(data))
return this
return data.extends!!.firstCommonInterfaceName()
}
File(JK_OUT_ROOT, "$visitorName.kt").writeText(buildString {
appendln(pkg)
appendln()
@@ -119,8 +128,10 @@ fun genVisitors(interfaceData: List<InterfaceData>, visitorName: String, transfo
val nameWithoutPrefix = name.removePrefix("JK")
val argName = nameWithoutPrefix.decapitalize().safeVarName()
val generifyCall = if (name != "JKElement") "= transform${ext!!.removePrefix("JK")}($argName, data)" else ""
val leastCommonName = name.firstCommonInterfaceName()
"""
| fun <E: $name> transform$nameWithoutPrefix($argName: $name, data: D): E $generifyCall
| fun <E: $leastCommonName> transform$nameWithoutPrefix($argName: $name, data: D): E $generifyCall
""".trimMargin()
}
appendln()
@@ -141,9 +152,11 @@ fun genVisitors(interfaceData: List<InterfaceData>, visitorName: String, transfo
val argName = nameWithoutPrefix.decapitalize().safeVarName()
val arg = "$argName: $name"
val generifyCall = if (name != "JKElement") "= transform${ext!!.removePrefix("JK")}($argName, null)" else ""
val leastCommonName = name.firstCommonInterfaceName()
"""
| fun <E: $name> transform$nameWithoutPrefix($arg): E $generifyCall
| override fun <E: $name> transform$nameWithoutPrefix($arg, data: Nothing?): E = transform$nameWithoutPrefix($argName)
| fun <E: $leastCommonName> transform$nameWithoutPrefix($arg): E $generifyCall
| override fun <E: $leastCommonName> transform$nameWithoutPrefix($arg, data: Nothing?): E = transform$nameWithoutPrefix($argName)
""".trimMargin()
}
appendln()
@@ -151,4 +164,4 @@ fun genVisitors(interfaceData: List<InterfaceData>, visitorName: String, transfo
})
}
genVisitors(JK_COMMON_FILE.interfaceNames() + JK_JAVA_FILE.interfaceNames() + JK_KT_FILE.interfaceNames(), "JKVisitor", "JKTransformer")
genVisitors(JK_COMMON_FILE.interfaceNames(), JK_JAVA_FILE.interfaceNames() + JK_KT_FILE.interfaceNames(), "JKVisitor", "JKTransformer")
@@ -1,19 +0,0 @@
/*
* 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
@@ -18,17 +18,17 @@ interface JKTransformer<in D> {
fun <E: JKModifierList> transformModifierList(modifierList: JKModifierList, data: D): E = transformElement(modifierList, data)
fun <E: JKModifier> transformModifier(modifier: JKModifier, data: D): E = transformElement(modifier, data)
fun <E: JKAccessModifier> transformAccessModifier(accessModifier: JKAccessModifier, data: D): E = transformModifier(accessModifier, data)
fun <E: JKJavaField> transformJavaField(javaField: JKJavaField, data: D): E = transformDeclaration(javaField, data)
fun <E: JKJavaMethod> transformJavaMethod(javaMethod: JKJavaMethod, data: D): E = transformDeclaration(javaMethod, data)
fun <E: JKJavaForLoop> transformJavaForLoop(javaForLoop: JKJavaForLoop, data: D): E = transformLoop(javaForLoop, data)
fun <E: JKJavaAssignmentExpression> transformJavaAssignmentExpression(javaAssignmentExpression: JKJavaAssignmentExpression, data: D): E = transformExpression(javaAssignmentExpression, data)
fun <E: JKJavaCall> transformJavaCall(javaCall: JKJavaCall, data: D): E = transformCall(javaCall, data)
fun <E: JKJavaTypeIdentifier> transformJavaTypeIdentifier(javaTypeIdentifier: JKJavaTypeIdentifier, data: D): E = transformTypeIdentifier(javaTypeIdentifier, data)
fun <E: JKJavaStringLiteralExpression> transformJavaStringLiteralExpression(javaStringLiteralExpression: JKJavaStringLiteralExpression, data: D): E = transformLiteralExpression(javaStringLiteralExpression, data)
fun <E: JKJavaAccessModifier> transformJavaAccessModifier(javaAccessModifier: JKJavaAccessModifier, data: D): E = transformAccessModifier(javaAccessModifier, data)
fun <E: JKKtFun> transformKtFun(ktFun: JKKtFun, data: D): E = transformDeclaration(ktFun, data)
fun <E: JKKtConstructor> transformKtConstructor(ktConstructor: JKKtConstructor, data: D): E = transformDeclaration(ktConstructor, data)
fun <E: JKKtPrimaryConstructor> transformKtPrimaryConstructor(ktPrimaryConstructor: JKKtPrimaryConstructor, data: D): E = transformKtConstructor(ktPrimaryConstructor, data)
fun <E: JKKtAssignmentStatement> transformKtAssignmentStatement(ktAssignmentStatement: JKKtAssignmentStatement, data: D): E = transformStatement(ktAssignmentStatement, data)
fun <E: JKKtCall> transformKtCall(ktCall: JKKtCall, data: D): E = transformCall(ktCall, data)
fun <E: JKDeclaration> transformJavaField(javaField: JKJavaField, data: D): E = transformDeclaration(javaField, data)
fun <E: JKDeclaration> transformJavaMethod(javaMethod: JKJavaMethod, data: D): E = transformDeclaration(javaMethod, data)
fun <E: JKLoop> transformJavaForLoop(javaForLoop: JKJavaForLoop, data: D): E = transformLoop(javaForLoop, data)
fun <E: JKExpression> transformJavaAssignmentExpression(javaAssignmentExpression: JKJavaAssignmentExpression, data: D): E = transformExpression(javaAssignmentExpression, data)
fun <E: JKCall> transformJavaCall(javaCall: JKJavaCall, data: D): E = transformCall(javaCall, data)
fun <E: JKTypeIdentifier> transformJavaTypeIdentifier(javaTypeIdentifier: JKJavaTypeIdentifier, data: D): E = transformTypeIdentifier(javaTypeIdentifier, data)
fun <E: JKLiteralExpression> transformJavaStringLiteralExpression(javaStringLiteralExpression: JKJavaStringLiteralExpression, data: D): E = transformLiteralExpression(javaStringLiteralExpression, data)
fun <E: JKAccessModifier> transformJavaAccessModifier(javaAccessModifier: JKJavaAccessModifier, data: D): E = transformAccessModifier(javaAccessModifier, data)
fun <E: JKDeclaration> transformKtFun(ktFun: JKKtFun, data: D): E = transformDeclaration(ktFun, data)
fun <E: JKDeclaration> transformKtConstructor(ktConstructor: JKKtConstructor, data: D): E = transformDeclaration(ktConstructor, data)
fun <E: JKDeclaration> transformKtPrimaryConstructor(ktPrimaryConstructor: JKKtPrimaryConstructor, data: D): E = transformKtConstructor(ktPrimaryConstructor, data)
fun <E: JKStatement> transformKtAssignmentStatement(ktAssignmentStatement: JKKtAssignmentStatement, data: D): E = transformStatement(ktAssignmentStatement, data)
fun <E: JKCall> transformKtCall(ktCall: JKKtCall, data: D): E = transformCall(ktCall, data)
}
@@ -33,30 +33,30 @@ interface JKTransformerVoid : JKTransformer<Nothing?> {
override fun <E: JKModifier> transformModifier(modifier: JKModifier, data: Nothing?): E = transformModifier(modifier)
fun <E: JKAccessModifier> transformAccessModifier(accessModifier: JKAccessModifier): E = transformModifier(accessModifier, null)
override fun <E: JKAccessModifier> transformAccessModifier(accessModifier: JKAccessModifier, data: Nothing?): E = transformAccessModifier(accessModifier)
fun <E: JKJavaField> transformJavaField(javaField: JKJavaField): E = transformDeclaration(javaField, null)
override fun <E: JKJavaField> transformJavaField(javaField: JKJavaField, data: Nothing?): E = transformJavaField(javaField)
fun <E: JKJavaMethod> transformJavaMethod(javaMethod: JKJavaMethod): E = transformDeclaration(javaMethod, null)
override fun <E: JKJavaMethod> transformJavaMethod(javaMethod: JKJavaMethod, data: Nothing?): E = transformJavaMethod(javaMethod)
fun <E: JKJavaForLoop> transformJavaForLoop(javaForLoop: JKJavaForLoop): E = transformLoop(javaForLoop, null)
override fun <E: JKJavaForLoop> transformJavaForLoop(javaForLoop: JKJavaForLoop, data: Nothing?): E = transformJavaForLoop(javaForLoop)
fun <E: JKJavaAssignmentExpression> transformJavaAssignmentExpression(javaAssignmentExpression: JKJavaAssignmentExpression): E = transformExpression(javaAssignmentExpression, null)
override fun <E: JKJavaAssignmentExpression> transformJavaAssignmentExpression(javaAssignmentExpression: JKJavaAssignmentExpression, data: Nothing?): E = transformJavaAssignmentExpression(javaAssignmentExpression)
fun <E: JKJavaCall> transformJavaCall(javaCall: JKJavaCall): E = transformCall(javaCall, null)
override fun <E: JKJavaCall> transformJavaCall(javaCall: JKJavaCall, data: Nothing?): E = transformJavaCall(javaCall)
fun <E: JKJavaTypeIdentifier> transformJavaTypeIdentifier(javaTypeIdentifier: JKJavaTypeIdentifier): E = transformTypeIdentifier(javaTypeIdentifier, null)
override fun <E: JKJavaTypeIdentifier> transformJavaTypeIdentifier(javaTypeIdentifier: JKJavaTypeIdentifier, data: Nothing?): E = transformJavaTypeIdentifier(javaTypeIdentifier)
fun <E: JKJavaStringLiteralExpression> transformJavaStringLiteralExpression(javaStringLiteralExpression: JKJavaStringLiteralExpression): E = transformLiteralExpression(javaStringLiteralExpression, null)
override fun <E: JKJavaStringLiteralExpression> transformJavaStringLiteralExpression(javaStringLiteralExpression: JKJavaStringLiteralExpression, data: Nothing?): E = transformJavaStringLiteralExpression(javaStringLiteralExpression)
fun <E: JKJavaAccessModifier> transformJavaAccessModifier(javaAccessModifier: JKJavaAccessModifier): E = transformAccessModifier(javaAccessModifier, null)
override fun <E: JKJavaAccessModifier> transformJavaAccessModifier(javaAccessModifier: JKJavaAccessModifier, data: Nothing?): E = transformJavaAccessModifier(javaAccessModifier)
fun <E: JKKtFun> transformKtFun(ktFun: JKKtFun): E = transformDeclaration(ktFun, null)
override fun <E: JKKtFun> transformKtFun(ktFun: JKKtFun, data: Nothing?): E = transformKtFun(ktFun)
fun <E: JKKtConstructor> transformKtConstructor(ktConstructor: JKKtConstructor): E = transformDeclaration(ktConstructor, null)
override fun <E: JKKtConstructor> transformKtConstructor(ktConstructor: JKKtConstructor, data: Nothing?): E = transformKtConstructor(ktConstructor)
fun <E: JKKtPrimaryConstructor> transformKtPrimaryConstructor(ktPrimaryConstructor: JKKtPrimaryConstructor): E = transformKtConstructor(ktPrimaryConstructor, null)
override fun <E: JKKtPrimaryConstructor> transformKtPrimaryConstructor(ktPrimaryConstructor: JKKtPrimaryConstructor, data: Nothing?): E = transformKtPrimaryConstructor(ktPrimaryConstructor)
fun <E: JKKtAssignmentStatement> transformKtAssignmentStatement(ktAssignmentStatement: JKKtAssignmentStatement): E = transformStatement(ktAssignmentStatement, null)
override fun <E: JKKtAssignmentStatement> transformKtAssignmentStatement(ktAssignmentStatement: JKKtAssignmentStatement, data: Nothing?): E = transformKtAssignmentStatement(ktAssignmentStatement)
fun <E: JKKtCall> transformKtCall(ktCall: JKKtCall): E = transformCall(ktCall, null)
override fun <E: JKKtCall> transformKtCall(ktCall: JKKtCall, data: Nothing?): E = transformKtCall(ktCall)
fun <E: JKDeclaration> transformJavaField(javaField: JKJavaField): E = transformDeclaration(javaField, null)
override fun <E: JKDeclaration> transformJavaField(javaField: JKJavaField, data: Nothing?): E = transformJavaField(javaField)
fun <E: JKDeclaration> transformJavaMethod(javaMethod: JKJavaMethod): E = transformDeclaration(javaMethod, null)
override fun <E: JKDeclaration> transformJavaMethod(javaMethod: JKJavaMethod, data: Nothing?): E = transformJavaMethod(javaMethod)
fun <E: JKLoop> transformJavaForLoop(javaForLoop: JKJavaForLoop): E = transformLoop(javaForLoop, null)
override fun <E: JKLoop> transformJavaForLoop(javaForLoop: JKJavaForLoop, data: Nothing?): E = transformJavaForLoop(javaForLoop)
fun <E: JKExpression> transformJavaAssignmentExpression(javaAssignmentExpression: JKJavaAssignmentExpression): E = transformExpression(javaAssignmentExpression, null)
override fun <E: JKExpression> transformJavaAssignmentExpression(javaAssignmentExpression: JKJavaAssignmentExpression, data: Nothing?): E = transformJavaAssignmentExpression(javaAssignmentExpression)
fun <E: JKCall> transformJavaCall(javaCall: JKJavaCall): E = transformCall(javaCall, null)
override fun <E: JKCall> transformJavaCall(javaCall: JKJavaCall, data: Nothing?): E = transformJavaCall(javaCall)
fun <E: JKTypeIdentifier> transformJavaTypeIdentifier(javaTypeIdentifier: JKJavaTypeIdentifier): E = transformTypeIdentifier(javaTypeIdentifier, null)
override fun <E: JKTypeIdentifier> transformJavaTypeIdentifier(javaTypeIdentifier: JKJavaTypeIdentifier, data: Nothing?): E = transformJavaTypeIdentifier(javaTypeIdentifier)
fun <E: JKLiteralExpression> transformJavaStringLiteralExpression(javaStringLiteralExpression: JKJavaStringLiteralExpression): E = transformLiteralExpression(javaStringLiteralExpression, null)
override fun <E: JKLiteralExpression> transformJavaStringLiteralExpression(javaStringLiteralExpression: JKJavaStringLiteralExpression, data: Nothing?): E = transformJavaStringLiteralExpression(javaStringLiteralExpression)
fun <E: JKAccessModifier> transformJavaAccessModifier(javaAccessModifier: JKJavaAccessModifier): E = transformAccessModifier(javaAccessModifier, null)
override fun <E: JKAccessModifier> transformJavaAccessModifier(javaAccessModifier: JKJavaAccessModifier, data: Nothing?): E = transformJavaAccessModifier(javaAccessModifier)
fun <E: JKDeclaration> transformKtFun(ktFun: JKKtFun): E = transformDeclaration(ktFun, null)
override fun <E: JKDeclaration> transformKtFun(ktFun: JKKtFun, data: Nothing?): E = transformKtFun(ktFun)
fun <E: JKDeclaration> transformKtConstructor(ktConstructor: JKKtConstructor): E = transformDeclaration(ktConstructor, null)
override fun <E: JKDeclaration> transformKtConstructor(ktConstructor: JKKtConstructor, data: Nothing?): E = transformKtConstructor(ktConstructor)
fun <E: JKDeclaration> transformKtPrimaryConstructor(ktPrimaryConstructor: JKKtPrimaryConstructor): E = transformKtConstructor(ktPrimaryConstructor, null)
override fun <E: JKDeclaration> transformKtPrimaryConstructor(ktPrimaryConstructor: JKKtPrimaryConstructor, data: Nothing?): E = transformKtPrimaryConstructor(ktPrimaryConstructor)
fun <E: JKStatement> transformKtAssignmentStatement(ktAssignmentStatement: JKKtAssignmentStatement): E = transformStatement(ktAssignmentStatement, null)
override fun <E: JKStatement> transformKtAssignmentStatement(ktAssignmentStatement: JKKtAssignmentStatement, data: Nothing?): E = transformKtAssignmentStatement(ktAssignmentStatement)
fun <E: JKCall> transformKtCall(ktCall: JKKtCall): E = transformCall(ktCall, null)
override fun <E: JKCall> transformKtCall(ktCall: JKKtCall, data: Nothing?): E = transformKtCall(ktCall)
}