From e33df530cd983824164db4df8558fe59a8e76c72 Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Tue, 17 Oct 2017 04:14:44 +0300 Subject: [PATCH] New J2K: First conversion --- .../jetbrains/kotlin/j2k/ConversionsRunner.kt | 31 +++++++++++++++++ .../kotlin/j2k/JavaToJKTreeBuilder.kt | 6 +++- .../kotlin/j2k/NewJavaToKotlinConverter.kt | 26 ++++++++------- .../kotlin/j2k/conversions/BaseConversion.kt | 27 +++++++++++++++ .../JavaFieldToKotlinPropertyConversion.kt | 33 +++++++++++++++++++ .../conversions/TransformerBasedConversion.kt | 30 +++++++++++++++++ .../kotlin/j2k/tree/DebugTreePrinter.kt | 4 +++ .../org/jetbrains/kotlin/j2k/tree/impl/j.kt | 3 +- .../org/jetbrains/kotlin/j2k/tree/impl/jk.kt | 9 ++++- .../org/jetbrains/kotlin/j2k/tree/impl/k.kt | 11 +++++++ j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt | 2 +- .../org/jetbrains/kotlin/j2k/tree/jk.kt | 9 ++--- j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt | 10 +++++- .../org/jetbrains/kotlin/j2k/tree/markers.kt | 21 ++++++++++++ .../kotlin/j2k/tree/visitors/JKTransformer.kt | 1 + .../j2k/tree/visitors/JKTransformerVoid.kt | 2 ++ .../kotlin/j2k/tree/visitors/JKVisitor.kt | 1 + .../kotlin/j2k/tree/visitors/JKVisitorVoid.kt | 2 ++ 18 files changed, 208 insertions(+), 20 deletions(-) create mode 100644 j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt create mode 100644 j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/BaseConversion.kt create mode 100644 j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaFieldToKotlinPropertyConversion.kt create mode 100644 j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/TransformerBasedConversion.kt create mode 100644 j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt new file mode 100644 index 00000000000..7c85b27f77d --- /dev/null +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt @@ -0,0 +1,31 @@ +/* + * 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 + +import org.jetbrains.kotlin.j2k.conversions.JavaFieldToKotlinPropertyConversion +import org.jetbrains.kotlin.j2k.tree.JKElement + +object ConversionsRunner { + + fun doApply(trees: List) { + + trees.forEach { + JavaFieldToKotlinPropertyConversion().runConversion(it) + } + } + +} \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt index 610fc1b7663..d3302faeae5 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt @@ -87,7 +87,11 @@ class JavaToJKTreeBuilder { val type = JKJavaTypeIdentifierImpl(field.type.canonicalText) val name = JKNameIdentifierImpl(field.name!!) - currentClass!!.declarations += JKJavaFieldImpl(type, name, initializer) + val modifierList = with(ModifierMapper) { + field.modifierList.toJK() + } + + currentClass!!.declarations += JKJavaFieldImpl(modifierList, type, name, initializer) super.visitField(field) } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewJavaToKotlinConverter.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewJavaToKotlinConverter.kt index 8b4119044da..957f4660ebf 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewJavaToKotlinConverter.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewJavaToKotlinConverter.kt @@ -20,29 +20,33 @@ import com.intellij.openapi.progress.EmptyProgressIndicator import com.intellij.openapi.progress.ProgressIndicator import com.intellij.openapi.project.Project import com.intellij.psi.PsiJavaFile -import org.jetbrains.kotlin.j2k.tree.* -import org.jetbrains.kotlin.utils.Printer +import org.jetbrains.kotlin.j2k.tree.JKElement +import org.jetbrains.kotlin.j2k.tree.prettyDebugPrintTree class NewJavaToKotlinConverter( private val project: Project, private val settings: ConverterSettings ) { + private fun List.prettyPrintTrees() = buildString { + for (tree in this@prettyPrintTrees) { + appendln() + appendln(tree.prettyDebugPrintTree()) + appendln() + } + } + fun filesToKotlin(files: List, progressIndicator: ProgressIndicator = EmptyProgressIndicator()): String { val treeBuilder = JavaToJKTreeBuilder() - val fileTrees = files.map(treeBuilder::buildTree) + val fileTrees = files.mapNotNull(treeBuilder::buildTree) - val result = buildString { + println(fileTrees.prettyPrintTrees()) - for (tree in fileTrees.filterNotNull()) { - appendln() - appendln(tree.prettyDebugPrintTree()) - appendln() - } - } + ConversionsRunner.doApply(fileTrees) + + val result = fileTrees.prettyPrintTrees() println(result) - return result } } \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/BaseConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/BaseConversion.kt new file mode 100644 index 00000000000..f29ba2496b8 --- /dev/null +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/BaseConversion.kt @@ -0,0 +1,27 @@ +/* + * 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.conversions + +import org.jetbrains.kotlin.j2k.tree.JKElement + +abstract class BaseConversion { + /** + * @return true if something changed + */ + abstract fun runConversion(treeRoot: JKElement): Boolean + +} \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaFieldToKotlinPropertyConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaFieldToKotlinPropertyConversion.kt new file mode 100644 index 00000000000..f98b1c08008 --- /dev/null +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaFieldToKotlinPropertyConversion.kt @@ -0,0 +1,33 @@ +/* + * 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.conversions + +import org.jetbrains.kotlin.j2k.tree.JKDeclaration +import org.jetbrains.kotlin.j2k.tree.JKElement +import org.jetbrains.kotlin.j2k.tree.JKJavaField +import org.jetbrains.kotlin.j2k.tree.impl.JKKtPropertyImpl + +class JavaFieldToKotlinPropertyConversion : TransformerBasedConversion() { + + override fun visitElement(element: JKElement): JKElement = element.also { it.transformChildren(this, null) } + + override fun visitJavaField(javaField: JKJavaField): JKDeclaration { + somethingChanged = true + + return JKKtPropertyImpl(javaField.modifierList, javaField.type, javaField.name, javaField.initializer) + } +} \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/TransformerBasedConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/TransformerBasedConversion.kt new file mode 100644 index 00000000000..3b5d8f43506 --- /dev/null +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/TransformerBasedConversion.kt @@ -0,0 +1,30 @@ +/* + * 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.conversions + +import org.jetbrains.kotlin.j2k.tree.JKElement +import org.jetbrains.kotlin.j2k.tree.visitors.JKTransformerVoid + +abstract class TransformerBasedConversion: BaseConversion(), JKTransformerVoid { + protected var somethingChanged = false + + override fun runConversion(treeRoot: JKElement): Boolean { + somethingChanged = false + treeRoot.accept(this, null) + return somethingChanged + } +} \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/DebugTreePrinter.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/DebugTreePrinter.kt index b9629bacd86..fe229ea10df 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/DebugTreePrinter.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/DebugTreePrinter.kt @@ -30,6 +30,10 @@ private class DebugTreePrinter : JKVisitorVoid { } printer.println("]") } + + override fun visitJavaAccessModifier(javaAccessModifier: JKJavaAccessModifier) { + printer.println(javaAccessModifier.classNameWithoutJK(), "(", javaAccessModifier.type, ")") + } } private fun Any.classNameWithoutJK(): String = this.javaClass.simpleName.removePrefix("JK") diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt index 8e5d43952b9..926366308ca 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt @@ -20,7 +20,8 @@ import org.jetbrains.kotlin.j2k.tree.* import org.jetbrains.kotlin.j2k.tree.visitors.JKTransformer import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitor -class JKJavaFieldImpl(override var type: JKTypeIdentifier, +class JKJavaFieldImpl(override var modifierList: JKModifierList, + override var type: JKTypeIdentifier, override var name: JKNameIdentifier, override var initializer: JKExpression?) : JKJavaField, JKElementBase() { diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt index 8fa9a4ef58e..892b3a52898 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt @@ -32,13 +32,20 @@ abstract class JKElementBase : JKElement { class JKClassImpl(override var modifierList: JKModifierList, override var name: JKNameIdentifier) : JKClass, JKElementBase() { + override var declarations: List = mutableListOf() + override fun accept(visitor: JKVisitor, data: D): R = visitor.visitClass(this, data) override fun acceptChildren(visitor: JKVisitor, data: D) { (listOf(modifierList, name) + declarations).forEach { it.accept(visitor, data) } } - override val declarations = mutableListOf() + override fun transformChildren(transformer: JKTransformer, data: D) { + modifierList = modifierList.transform(transformer, data) + name = name.transform(transformer, data) + declarations = declarations.map { it.transform(transformer, data) } + } + } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt index 6e93e36da06..195a913d886 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt @@ -16,3 +16,14 @@ package org.jetbrains.kotlin.j2k.tree.impl +import org.jetbrains.kotlin.j2k.tree.* + +class JKKtPropertyImpl(override var modifierList: JKModifierList, + override var type: JKTypeIdentifier, + override var name: JKNameIdentifier, + override var initializer: JKExpression? = null, + override var getter: JKBlock? = null, + override var setter: JKBlock? = null) : JKElementBase(), JKKtProperty { + + +} diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt index c58deb04b39..8f6a97ba18d 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt @@ -16,7 +16,7 @@ package org.jetbrains.kotlin.j2k.tree -interface JKJavaField : JKDeclaration { +interface JKJavaField : JKDeclaration, JKModifierListOwner { var type: JKTypeIdentifier var name: JKNameIdentifier var initializer: JKExpression? diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt index 3d691d5a28b..946270f1d4b 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt @@ -28,10 +28,9 @@ interface JKElement { fun transformChildren(transformer: JKTransformer, data: D) } -interface JKClass : JKDeclaration { - var modifierList: JKModifierList +interface JKClass : JKDeclaration, JKModifierListOwner { var name: JKNameIdentifier - val declarations: MutableList + var declarations: List } interface JKStatement : JKElement @@ -42,7 +41,9 @@ interface JKLoop : JKStatement interface JKDeclaration : JKElement -interface JKBlock : JKElement +interface JKBlock : JKElement { + var statements: List +} interface JKCall : JKExpression diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt index 3bae5e7764e..90e8f781bcf 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt @@ -24,4 +24,12 @@ interface JKKtPrimaryConstructor : JKKtConstructor interface JKKtAssignmentStatement : JKStatement -interface JKKtCall : JKCall \ No newline at end of file +interface JKKtCall : JKCall + +interface JKKtProperty : JKDeclaration, JKModifierListOwner { + var type: JKTypeIdentifier + var name: JKNameIdentifier + var initializer: JKExpression? + var getter: JKBlock? + var setter: JKBlock? +} \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt new file mode 100644 index 00000000000..d9121f4a359 --- /dev/null +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt @@ -0,0 +1,21 @@ +/* + * 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 + +interface JKModifierListOwner { + var modifierList: JKModifierList +} \ 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 1f3b3408e9f..b817141c8d7 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKTransformer.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKTransformer.kt @@ -31,4 +31,5 @@ interface JKTransformer : JKVisitor { override fun visitKtPrimaryConstructor(ktPrimaryConstructor: JKKtPrimaryConstructor, data: D): JKDeclaration = visitKtConstructor(ktPrimaryConstructor, data) override fun visitKtAssignmentStatement(ktAssignmentStatement: JKKtAssignmentStatement, data: D): JKStatement = visitStatement(ktAssignmentStatement, data) override fun visitKtCall(ktCall: JKKtCall, data: D): JKCall = visitCall(ktCall, data) + override fun visitKtProperty(ktProperty: JKKtProperty, data: D): JKDeclaration = visitDeclaration(ktProperty, 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 32549edff1e..aa675eea00a 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKTransformerVoid.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKTransformerVoid.kt @@ -59,4 +59,6 @@ interface JKTransformerVoid : JKTransformer { override fun visitKtAssignmentStatement(ktAssignmentStatement: JKKtAssignmentStatement, data: Nothing?): JKStatement = visitKtAssignmentStatement(ktAssignmentStatement) fun visitKtCall(ktCall: JKKtCall): JKCall = visitCall(ktCall) override fun visitKtCall(ktCall: JKKtCall, data: Nothing?): JKCall = visitKtCall(ktCall) + fun visitKtProperty(ktProperty: JKKtProperty): JKDeclaration = visitDeclaration(ktProperty) + override fun visitKtProperty(ktProperty: JKKtProperty, data: Nothing?): JKDeclaration = visitKtProperty(ktProperty) } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt index ee158d3eeb8..adb12691596 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt @@ -31,4 +31,5 @@ interface JKVisitor { fun visitKtPrimaryConstructor(ktPrimaryConstructor: JKKtPrimaryConstructor, data: D): R = visitKtConstructor(ktPrimaryConstructor, data) fun visitKtAssignmentStatement(ktAssignmentStatement: JKKtAssignmentStatement, data: D): R = visitStatement(ktAssignmentStatement, data) fun visitKtCall(ktCall: JKKtCall, data: D): R = visitCall(ktCall, data) + fun visitKtProperty(ktProperty: JKKtProperty, data: D): R = visitDeclaration(ktProperty, data) } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt index 165a88f7940..4181224375e 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt @@ -59,4 +59,6 @@ interface JKVisitorVoid : JKVisitor { override fun visitKtAssignmentStatement(ktAssignmentStatement: JKKtAssignmentStatement, data: Nothing?) = visitKtAssignmentStatement(ktAssignmentStatement) fun visitKtCall(ktCall: JKKtCall) = visitCall(ktCall, null) override fun visitKtCall(ktCall: JKKtCall, data: Nothing?) = visitKtCall(ktCall) + fun visitKtProperty(ktProperty: JKKtProperty) = visitDeclaration(ktProperty, null) + override fun visitKtProperty(ktProperty: JKKtProperty, data: Nothing?) = visitKtProperty(ktProperty) }