New J2K: Make generics in transformers accept least common interface
This commit is contained in:
committed by
Ilya Kirillov
parent
c1f50d3594
commit
8ff78611ba
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user