From 8ff78611baebf1cdb20f42a7e3965135c3fc3e01 Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Sat, 14 Oct 2017 02:06:48 +0300 Subject: [PATCH] New J2K: Make generics in transformers accept least common interface --- j2k/GenerateJKTreeVisitorAndTransformer.kts | 23 ++++++-- .../tree/visitors/JKJavaKtTransformerVoid.kt | 19 ------- .../kotlin/j2k/tree/visitors/JKTransformer.kt | 26 +++++----- .../j2k/tree/visitors/JKTransformerVoid.kt | 52 +++++++++---------- 4 files changed, 57 insertions(+), 63 deletions(-) delete mode 100644 j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKJavaKtTransformerVoid.kt diff --git a/j2k/GenerateJKTreeVisitorAndTransformer.kts b/j2k/GenerateJKTreeVisitorAndTransformer.kts index bb96071446c..8349d0b9c12 100644 --- a/j2k/GenerateJKTreeVisitorAndTransformer.kts +++ b/j2k/GenerateJKTreeVisitorAndTransformer.kts @@ -60,10 +60,19 @@ fun String.safeVarName() = when (this) { else -> this } -fun genVisitors(interfaceData: List, visitorName: String, transformerName: String, visitorExtends: String? = null, transformerExtends: String? = null) { +fun genVisitors(commonData: List, uncommonData: List, 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, 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 transform$nameWithoutPrefix($argName: $name, data: D): E $generifyCall + | fun transform$nameWithoutPrefix($argName: $name, data: D): E $generifyCall """.trimMargin() } appendln() @@ -141,9 +152,11 @@ fun genVisitors(interfaceData: List, 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 transform$nameWithoutPrefix($arg): E $generifyCall - | override fun transform$nameWithoutPrefix($arg, data: Nothing?): E = transform$nameWithoutPrefix($argName) + | fun transform$nameWithoutPrefix($arg): E $generifyCall + | override fun transform$nameWithoutPrefix($arg, data: Nothing?): E = transform$nameWithoutPrefix($argName) """.trimMargin() } appendln() @@ -151,4 +164,4 @@ fun genVisitors(interfaceData: List, 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") diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKJavaKtTransformerVoid.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKJavaKtTransformerVoid.kt deleted file mode 100644 index a5a759d881a..00000000000 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKJavaKtTransformerVoid.kt +++ /dev/null @@ -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, JKJavaTransformerVoid, JKKtTransformerVoid \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKTransformer.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKTransformer.kt index 17134df9786..aeba7975348 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKTransformer.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKTransformer.kt @@ -18,17 +18,17 @@ interface JKTransformer { fun transformModifierList(modifierList: JKModifierList, data: D): E = transformElement(modifierList, data) fun transformModifier(modifier: JKModifier, data: D): E = transformElement(modifier, data) fun transformAccessModifier(accessModifier: JKAccessModifier, data: D): E = transformModifier(accessModifier, data) - fun transformJavaField(javaField: JKJavaField, data: D): E = transformDeclaration(javaField, data) - fun transformJavaMethod(javaMethod: JKJavaMethod, data: D): E = transformDeclaration(javaMethod, data) - fun transformJavaForLoop(javaForLoop: JKJavaForLoop, data: D): E = transformLoop(javaForLoop, data) - fun transformJavaAssignmentExpression(javaAssignmentExpression: JKJavaAssignmentExpression, data: D): E = transformExpression(javaAssignmentExpression, data) - fun transformJavaCall(javaCall: JKJavaCall, data: D): E = transformCall(javaCall, data) - fun transformJavaTypeIdentifier(javaTypeIdentifier: JKJavaTypeIdentifier, data: D): E = transformTypeIdentifier(javaTypeIdentifier, data) - fun transformJavaStringLiteralExpression(javaStringLiteralExpression: JKJavaStringLiteralExpression, data: D): E = transformLiteralExpression(javaStringLiteralExpression, data) - fun transformJavaAccessModifier(javaAccessModifier: JKJavaAccessModifier, data: D): E = transformAccessModifier(javaAccessModifier, data) - fun transformKtFun(ktFun: JKKtFun, data: D): E = transformDeclaration(ktFun, data) - fun transformKtConstructor(ktConstructor: JKKtConstructor, data: D): E = transformDeclaration(ktConstructor, data) - fun transformKtPrimaryConstructor(ktPrimaryConstructor: JKKtPrimaryConstructor, data: D): E = transformKtConstructor(ktPrimaryConstructor, data) - fun transformKtAssignmentStatement(ktAssignmentStatement: JKKtAssignmentStatement, data: D): E = transformStatement(ktAssignmentStatement, data) - fun transformKtCall(ktCall: JKKtCall, data: D): E = transformCall(ktCall, data) + fun transformJavaField(javaField: JKJavaField, data: D): E = transformDeclaration(javaField, data) + fun transformJavaMethod(javaMethod: JKJavaMethod, data: D): E = transformDeclaration(javaMethod, data) + fun transformJavaForLoop(javaForLoop: JKJavaForLoop, data: D): E = transformLoop(javaForLoop, data) + fun transformJavaAssignmentExpression(javaAssignmentExpression: JKJavaAssignmentExpression, data: D): E = transformExpression(javaAssignmentExpression, data) + fun transformJavaCall(javaCall: JKJavaCall, data: D): E = transformCall(javaCall, data) + fun transformJavaTypeIdentifier(javaTypeIdentifier: JKJavaTypeIdentifier, data: D): E = transformTypeIdentifier(javaTypeIdentifier, data) + fun transformJavaStringLiteralExpression(javaStringLiteralExpression: JKJavaStringLiteralExpression, data: D): E = transformLiteralExpression(javaStringLiteralExpression, data) + fun transformJavaAccessModifier(javaAccessModifier: JKJavaAccessModifier, data: D): E = transformAccessModifier(javaAccessModifier, data) + fun transformKtFun(ktFun: JKKtFun, data: D): E = transformDeclaration(ktFun, data) + fun transformKtConstructor(ktConstructor: JKKtConstructor, data: D): E = transformDeclaration(ktConstructor, data) + fun transformKtPrimaryConstructor(ktPrimaryConstructor: JKKtPrimaryConstructor, data: D): E = transformKtConstructor(ktPrimaryConstructor, data) + fun transformKtAssignmentStatement(ktAssignmentStatement: JKKtAssignmentStatement, data: D): E = transformStatement(ktAssignmentStatement, data) + fun transformKtCall(ktCall: JKKtCall, data: D): E = transformCall(ktCall, data) } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKTransformerVoid.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKTransformerVoid.kt index a8545be88dd..3d3edc0c2c2 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKTransformerVoid.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKTransformerVoid.kt @@ -33,30 +33,30 @@ interface JKTransformerVoid : JKTransformer { override fun transformModifier(modifier: JKModifier, data: Nothing?): E = transformModifier(modifier) fun transformAccessModifier(accessModifier: JKAccessModifier): E = transformModifier(accessModifier, null) override fun transformAccessModifier(accessModifier: JKAccessModifier, data: Nothing?): E = transformAccessModifier(accessModifier) - fun transformJavaField(javaField: JKJavaField): E = transformDeclaration(javaField, null) - override fun transformJavaField(javaField: JKJavaField, data: Nothing?): E = transformJavaField(javaField) - fun transformJavaMethod(javaMethod: JKJavaMethod): E = transformDeclaration(javaMethod, null) - override fun transformJavaMethod(javaMethod: JKJavaMethod, data: Nothing?): E = transformJavaMethod(javaMethod) - fun transformJavaForLoop(javaForLoop: JKJavaForLoop): E = transformLoop(javaForLoop, null) - override fun transformJavaForLoop(javaForLoop: JKJavaForLoop, data: Nothing?): E = transformJavaForLoop(javaForLoop) - fun transformJavaAssignmentExpression(javaAssignmentExpression: JKJavaAssignmentExpression): E = transformExpression(javaAssignmentExpression, null) - override fun transformJavaAssignmentExpression(javaAssignmentExpression: JKJavaAssignmentExpression, data: Nothing?): E = transformJavaAssignmentExpression(javaAssignmentExpression) - fun transformJavaCall(javaCall: JKJavaCall): E = transformCall(javaCall, null) - override fun transformJavaCall(javaCall: JKJavaCall, data: Nothing?): E = transformJavaCall(javaCall) - fun transformJavaTypeIdentifier(javaTypeIdentifier: JKJavaTypeIdentifier): E = transformTypeIdentifier(javaTypeIdentifier, null) - override fun transformJavaTypeIdentifier(javaTypeIdentifier: JKJavaTypeIdentifier, data: Nothing?): E = transformJavaTypeIdentifier(javaTypeIdentifier) - fun transformJavaStringLiteralExpression(javaStringLiteralExpression: JKJavaStringLiteralExpression): E = transformLiteralExpression(javaStringLiteralExpression, null) - override fun transformJavaStringLiteralExpression(javaStringLiteralExpression: JKJavaStringLiteralExpression, data: Nothing?): E = transformJavaStringLiteralExpression(javaStringLiteralExpression) - fun transformJavaAccessModifier(javaAccessModifier: JKJavaAccessModifier): E = transformAccessModifier(javaAccessModifier, null) - override fun transformJavaAccessModifier(javaAccessModifier: JKJavaAccessModifier, data: Nothing?): E = transformJavaAccessModifier(javaAccessModifier) - fun transformKtFun(ktFun: JKKtFun): E = transformDeclaration(ktFun, null) - override fun transformKtFun(ktFun: JKKtFun, data: Nothing?): E = transformKtFun(ktFun) - fun transformKtConstructor(ktConstructor: JKKtConstructor): E = transformDeclaration(ktConstructor, null) - override fun transformKtConstructor(ktConstructor: JKKtConstructor, data: Nothing?): E = transformKtConstructor(ktConstructor) - fun transformKtPrimaryConstructor(ktPrimaryConstructor: JKKtPrimaryConstructor): E = transformKtConstructor(ktPrimaryConstructor, null) - override fun transformKtPrimaryConstructor(ktPrimaryConstructor: JKKtPrimaryConstructor, data: Nothing?): E = transformKtPrimaryConstructor(ktPrimaryConstructor) - fun transformKtAssignmentStatement(ktAssignmentStatement: JKKtAssignmentStatement): E = transformStatement(ktAssignmentStatement, null) - override fun transformKtAssignmentStatement(ktAssignmentStatement: JKKtAssignmentStatement, data: Nothing?): E = transformKtAssignmentStatement(ktAssignmentStatement) - fun transformKtCall(ktCall: JKKtCall): E = transformCall(ktCall, null) - override fun transformKtCall(ktCall: JKKtCall, data: Nothing?): E = transformKtCall(ktCall) + fun transformJavaField(javaField: JKJavaField): E = transformDeclaration(javaField, null) + override fun transformJavaField(javaField: JKJavaField, data: Nothing?): E = transformJavaField(javaField) + fun transformJavaMethod(javaMethod: JKJavaMethod): E = transformDeclaration(javaMethod, null) + override fun transformJavaMethod(javaMethod: JKJavaMethod, data: Nothing?): E = transformJavaMethod(javaMethod) + fun transformJavaForLoop(javaForLoop: JKJavaForLoop): E = transformLoop(javaForLoop, null) + override fun transformJavaForLoop(javaForLoop: JKJavaForLoop, data: Nothing?): E = transformJavaForLoop(javaForLoop) + fun transformJavaAssignmentExpression(javaAssignmentExpression: JKJavaAssignmentExpression): E = transformExpression(javaAssignmentExpression, null) + override fun transformJavaAssignmentExpression(javaAssignmentExpression: JKJavaAssignmentExpression, data: Nothing?): E = transformJavaAssignmentExpression(javaAssignmentExpression) + fun transformJavaCall(javaCall: JKJavaCall): E = transformCall(javaCall, null) + override fun transformJavaCall(javaCall: JKJavaCall, data: Nothing?): E = transformJavaCall(javaCall) + fun transformJavaTypeIdentifier(javaTypeIdentifier: JKJavaTypeIdentifier): E = transformTypeIdentifier(javaTypeIdentifier, null) + override fun transformJavaTypeIdentifier(javaTypeIdentifier: JKJavaTypeIdentifier, data: Nothing?): E = transformJavaTypeIdentifier(javaTypeIdentifier) + fun transformJavaStringLiteralExpression(javaStringLiteralExpression: JKJavaStringLiteralExpression): E = transformLiteralExpression(javaStringLiteralExpression, null) + override fun transformJavaStringLiteralExpression(javaStringLiteralExpression: JKJavaStringLiteralExpression, data: Nothing?): E = transformJavaStringLiteralExpression(javaStringLiteralExpression) + fun transformJavaAccessModifier(javaAccessModifier: JKJavaAccessModifier): E = transformAccessModifier(javaAccessModifier, null) + override fun transformJavaAccessModifier(javaAccessModifier: JKJavaAccessModifier, data: Nothing?): E = transformJavaAccessModifier(javaAccessModifier) + fun transformKtFun(ktFun: JKKtFun): E = transformDeclaration(ktFun, null) + override fun transformKtFun(ktFun: JKKtFun, data: Nothing?): E = transformKtFun(ktFun) + fun transformKtConstructor(ktConstructor: JKKtConstructor): E = transformDeclaration(ktConstructor, null) + override fun transformKtConstructor(ktConstructor: JKKtConstructor, data: Nothing?): E = transformKtConstructor(ktConstructor) + fun transformKtPrimaryConstructor(ktPrimaryConstructor: JKKtPrimaryConstructor): E = transformKtConstructor(ktPrimaryConstructor, null) + override fun transformKtPrimaryConstructor(ktPrimaryConstructor: JKKtPrimaryConstructor, data: Nothing?): E = transformKtPrimaryConstructor(ktPrimaryConstructor) + fun transformKtAssignmentStatement(ktAssignmentStatement: JKKtAssignmentStatement): E = transformStatement(ktAssignmentStatement, null) + override fun transformKtAssignmentStatement(ktAssignmentStatement: JKKtAssignmentStatement, data: Nothing?): E = transformKtAssignmentStatement(ktAssignmentStatement) + fun transformKtCall(ktCall: JKKtCall): E = transformCall(ktCall, null) + override fun transformKtCall(ktCall: JKKtCall, data: Nothing?): E = transformKtCall(ktCall) }