New J2K: Simple code builder

This commit is contained in:
Simon Ogorodnik
2017-11-20 23:12:03 +03:00
committed by Ilya Kirillov
parent dc73d415ad
commit a4630af109
6 changed files with 73 additions and 6 deletions
@@ -0,0 +1,62 @@
/*
* 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.tree.JKClass
import org.jetbrains.kotlin.j2k.tree.JKElement
import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitor
import org.jetbrains.kotlin.utils.Printer
class NewCodeBuilder {
val builder = StringBuilder()
val printer = Printer(builder)
private fun classKindString(kind: JKClass.ClassKind): String = when (kind) {
JKClass.ClassKind.ABSTRACT -> "abstract class"
JKClass.ClassKind.ANNOTATION -> "annotation class"
JKClass.ClassKind.CLASS -> "class"
JKClass.ClassKind.ENUM -> "enum class"
JKClass.ClassKind.INTERFACE -> "interface"
}
inner class Visitor : JKVisitor<Unit, Unit> {
override fun visitElement(element: JKElement, data: Unit) {
builder.append("/* !!! Hit visitElement !!! */")
}
override fun visitClass(klass: JKClass, data: Unit) {
printer.print(classKindString(klass.classKind))
builder.append(" ")
printer.print(klass.name.name)
if (klass.declarations.isNotEmpty()) {
printer.println("{")
printer.pushIndent()
klass.declarations.forEach { it.accept(this, data) }
printer.popIndent()
printer.println("}")
}
}
}
fun printCodeOut(root: JKElement): String {
Visitor().also { root.accept(it, Unit) }
return builder.toString()
}
}
@@ -36,7 +36,7 @@ class NewJavaToKotlinConverter(
}
}
fun filesToKotlin(files: List<PsiJavaFile>, progressIndicator: ProgressIndicator = EmptyProgressIndicator()): String {
fun filesToKotlin(files: List<PsiJavaFile>, progressIndicator: ProgressIndicator = EmptyProgressIndicator()): List<String> {
val treeBuilder = JavaToJKTreeBuilder()
val fileTrees = files.mapNotNull(treeBuilder::buildTree)
@@ -44,9 +44,10 @@ class NewJavaToKotlinConverter(
ConversionsRunner.doApply(fileTrees)
val result = fileTrees.prettyPrintTrees()
val resultTree = fileTrees.prettyPrintTrees()
println(result)
return result
println(resultTree)
return fileTrees.map { NewCodeBuilder().run { printCodeOut(it) } }
}
}
+3
View File
@@ -0,0 +1,3 @@
class Some {
/* !!! Hit visitElement !!! */
}
+1
View File
@@ -0,0 +1 @@
class Some
@@ -22,6 +22,6 @@ abstract class AbstractNewJavaToKotlinConverterNewSingleFileTest : AbstractJavaT
override fun fileToKotlin(text: String, settings: ConverterSettings, project: Project): String {
val file = createJavaFile(text)
return NewJavaToKotlinConverter(project, settings).filesToKotlin(listOf(file))
return NewJavaToKotlinConverter(project, settings).filesToKotlin(listOf(file)).single()
}
}
@@ -22,6 +22,6 @@ abstract class AbstractNewJavaToKotlinConverterSingleFileTest : AbstractJavaToKo
override fun fileToKotlin(text: String, settings: ConverterSettings, project: Project): String {
val file = createJavaFile(text)
return NewJavaToKotlinConverter(project, settings).filesToKotlin(listOf(file))
return NewJavaToKotlinConverter(project, settings).filesToKotlin(listOf(file)).single()
}
}