Add "-verbose" to kotlinp tool, change type parameter name rendering

Only render the actual name of the type parameter in the verbose mode

 #KT-23198
This commit is contained in:
Alexander Udalov
2018-05-15 19:30:00 +02:00
parent 23d107c11d
commit e5a5d834ab
4 changed files with 54 additions and 34 deletions
@@ -10,17 +10,17 @@ import kotlinx.metadata.jvm.KotlinClassMetadata
import kotlinx.metadata.jvm.KotlinModuleMetadata
import java.io.File
object Kotlinp {
class Kotlinp(val settings: KotlinpSettings) {
internal fun renderClassFile(classFile: KotlinClassMetadata?): String =
when (classFile) {
is KotlinClassMetadata.Class -> ClassPrinter().print(classFile)
is KotlinClassMetadata.FileFacade -> FileFacadePrinter().print(classFile)
is KotlinClassMetadata.Class -> ClassPrinter(settings).print(classFile)
is KotlinClassMetadata.FileFacade -> FileFacadePrinter(settings).print(classFile)
is KotlinClassMetadata.SyntheticClass -> {
if (classFile.isLambda) LambdaPrinter().print(classFile)
if (classFile.isLambda) LambdaPrinter(settings).print(classFile)
else buildString { appendln("synthetic class") }
}
is KotlinClassMetadata.MultiFileClassFacade -> MultiFileClassFacadePrinter().print(classFile)
is KotlinClassMetadata.MultiFileClassPart -> MultiFileClassPartPrinter().print(classFile)
is KotlinClassMetadata.MultiFileClassPart -> MultiFileClassPartPrinter(settings).print(classFile)
is KotlinClassMetadata.Unknown -> buildString { appendln("unknown file (k=${classFile.header.kind})") }
null -> buildString { appendln("unsupported file") }
}
@@ -41,3 +41,7 @@ object Kotlinp {
internal fun readModuleFile(file: File): KotlinModuleMetadata? =
KotlinModuleMetadata.read(file.readBytes())
}
data class KotlinpSettings(
val isVerbose: Boolean
)
@@ -11,14 +11,17 @@ import java.io.IOException
object Main {
private fun run(args: Array<String>) {
val paths = arrayListOf<String>()
var verbose = false
var i = 0
while (true) {
val arg = args.getOrNull(i++) ?: break
if ("-help" == arg || "-h" == arg) {
if (arg == "-help" || arg == "-h") {
printUsageAndExit()
} else if ("-version" == arg) {
} else if (arg == "-verbose") {
verbose = true
} else if (arg == "-version") {
printVersionAndExit()
} else if (arg.startsWith("-")) {
throw KotlinpException("unsupported argument: $arg")
@@ -27,14 +30,16 @@ object Main {
}
}
val kotlinp = Kotlinp(KotlinpSettings(verbose))
for (path in paths) {
val file = File(path)
if (!file.exists()) throw KotlinpException("file does not exist: $path")
val text = try {
when (file.extension) {
"class" -> Kotlinp.renderClassFile(Kotlinp.readClassFile(file))
"kotlin_module" -> Kotlinp.renderModuleFile(Kotlinp.readModuleFile(file))
"class" -> kotlinp.renderClassFile(kotlinp.readClassFile(file))
"kotlin_module" -> kotlinp.renderModuleFile(kotlinp.readModuleFile(file))
else -> throw KotlinpException("only .class and .kotlin_module files are supported")
}
} catch (e: IOException) {
@@ -65,6 +70,7 @@ object Main {
Usage: kotlinp <options> <classes>
where possible options include:
-verbose Display information in more detail, minimizing ambiguities but worsening readability
-version Display Kotlin version
-help (-h) Print a synopsis of options
"""
@@ -12,7 +12,7 @@ private object SpecialCharacters {
const val TYPE_ALIAS_MARKER = '^'
}
private fun visitFunction(sb: StringBuilder, flags: Flags, name: String): KmFunctionVisitor =
private fun visitFunction(settings: KotlinpSettings, sb: StringBuilder, flags: Flags, name: String): KmFunctionVisitor =
object : KmFunctionVisitor() {
val typeParams = mutableListOf<String>()
val params = mutableListOf<String>()
@@ -27,7 +27,7 @@ private fun visitFunction(sb: StringBuilder, flags: Flags, name: String): KmFunc
override fun visitTypeParameter(
flags: Flags, name: String, id: Int, variance: KmVariance
): KmTypeParameterVisitor? =
printTypeParameter(flags, name, id, variance) { typeParams.add(it) }
printTypeParameter(settings, flags, name, id, variance) { typeParams.add(it) }
override fun visitValueParameter(flags: Flags, name: String): KmValueParameterVisitor? =
printValueParameter(flags, name) { params.add(it) }
@@ -74,7 +74,9 @@ private fun visitFunction(sb: StringBuilder, flags: Flags, name: String): KmFunc
}
}
private fun visitProperty(sb: StringBuilder, flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags): KmPropertyVisitor =
private fun visitProperty(
settings: KotlinpSettings, sb: StringBuilder, flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags
): KmPropertyVisitor =
object : KmPropertyVisitor() {
val typeParams = mutableListOf<String>()
var receiverParameterType: String? = null
@@ -91,7 +93,7 @@ private fun visitProperty(sb: StringBuilder, flags: Flags, name: String, getterF
printType(flags) { receiverParameterType = it }
override fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? =
printTypeParameter(flags, name, id, variance) { typeParams.add(it) }
printTypeParameter(settings, flags, name, id, variance) { typeParams.add(it) }
override fun visitSetterParameter(flags: Flags, name: String): KmValueParameterVisitor? =
printValueParameter(flags, name) { setterParameter = it }
@@ -211,7 +213,7 @@ private fun visitConstructor(sb: StringBuilder, flags: Flags): KmConstructorVisi
}
}
private fun visitTypeAlias(sb: StringBuilder, flags: Flags, name: String): KmTypeAliasVisitor =
private fun visitTypeAlias(settings: KotlinpSettings, sb: StringBuilder, flags: Flags, name: String): KmTypeAliasVisitor =
object : KmTypeAliasVisitor() {
val annotations = mutableListOf<KmAnnotation>()
val typeParams = mutableListOf<String>()
@@ -220,7 +222,7 @@ private fun visitTypeAlias(sb: StringBuilder, flags: Flags, name: String): KmTyp
var versionRequirement: String? = null
override fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? =
printTypeParameter(flags, name, id, variance) { typeParams.add(it) }
printTypeParameter(settings, flags, name, id, variance) { typeParams.add(it) }
override fun visitUnderlyingType(flags: Flags): KmTypeVisitor? =
printType(flags) { underlyingType = it }
@@ -353,7 +355,7 @@ private fun printType(flags: Flags, output: (String) -> Unit): KmTypeVisitor =
}
private fun printTypeParameter(
flags: Flags, name: String, id: Int, variance: KmVariance, output: (String) -> Unit
settings: KotlinpSettings, flags: Flags, name: String, id: Int, variance: KmVariance, output: (String) -> Unit
): KmTypeParameterVisitor =
object : KmTypeParameterVisitor() {
val bounds = mutableListOf<String>()
@@ -380,7 +382,10 @@ private fun printTypeParameter(
if (variance != KmVariance.INVARIANT) {
append(variance.name.toLowerCase()).append(" ")
}
append("T#$id /* $name */")
append("T#$id")
if (settings.isVerbose) {
append(" /* $name */")
}
if (bounds.isNotEmpty()) {
bounds.joinTo(this, separator = " & ", prefix = " : ")
}
@@ -506,7 +511,7 @@ interface AbstractPrinter<in T : KotlinClassMetadata> {
fun print(klass: T): String
}
class ClassPrinter : KmClassVisitor(), AbstractPrinter<KotlinClassMetadata.Class> {
class ClassPrinter(private val settings: KotlinpSettings) : KmClassVisitor(), AbstractPrinter<KotlinClassMetadata.Class> {
private val sb = StringBuilder()
private val result = StringBuilder()
@@ -540,7 +545,7 @@ class ClassPrinter : KmClassVisitor(), AbstractPrinter<KotlinClassMetadata.Class
}
override fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? =
printTypeParameter(flags, name, id, variance) { typeParams.add(it) }
printTypeParameter(settings, flags, name, id, variance) { typeParams.add(it) }
override fun visitSupertype(flags: Flags): KmTypeVisitor? =
printType(flags) { supertypes.add(it) }
@@ -549,13 +554,13 @@ class ClassPrinter : KmClassVisitor(), AbstractPrinter<KotlinClassMetadata.Class
visitConstructor(sb, flags)
override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? =
visitFunction(sb, flags, name)
visitFunction(settings, sb, flags, name)
override fun visitProperty(flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags): KmPropertyVisitor? =
visitProperty(sb, flags, name, getterFlags, setterFlags)
visitProperty(settings, sb, flags, name, getterFlags, setterFlags)
override fun visitTypeAlias(flags: Flags, name: String): KmTypeAliasVisitor? =
visitTypeAlias(sb, flags, name)
visitTypeAlias(settings, sb, flags, name)
override fun visitCompanionObject(name: String) {
sb.appendln()
@@ -586,7 +591,7 @@ class ClassPrinter : KmClassVisitor(), AbstractPrinter<KotlinClassMetadata.Class
}
}
abstract class PackagePrinter : KmPackageVisitor() {
abstract class PackagePrinter(private val settings: KotlinpSettings) : KmPackageVisitor() {
internal val sb = StringBuilder().apply {
appendln("package {")
}
@@ -596,29 +601,29 @@ abstract class PackagePrinter : KmPackageVisitor() {
}
override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? =
visitFunction(sb, flags, name)
visitFunction(settings, sb, flags, name)
override fun visitProperty(flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags): KmPropertyVisitor? =
visitProperty(sb, flags, name, getterFlags, setterFlags)
visitProperty(settings, sb, flags, name, getterFlags, setterFlags)
override fun visitTypeAlias(flags: Flags, name: String): KmTypeAliasVisitor? =
visitTypeAlias(sb, flags, name)
visitTypeAlias(settings, sb, flags, name)
}
class FileFacadePrinter : PackagePrinter(), AbstractPrinter<KotlinClassMetadata.FileFacade> {
class FileFacadePrinter(settings: KotlinpSettings) : PackagePrinter(settings), AbstractPrinter<KotlinClassMetadata.FileFacade> {
override fun print(klass: KotlinClassMetadata.FileFacade): String {
klass.accept(this)
return sb.toString()
}
}
class LambdaPrinter : KmLambdaVisitor(), AbstractPrinter<KotlinClassMetadata.SyntheticClass> {
class LambdaPrinter(private val settings: KotlinpSettings) : KmLambdaVisitor(), AbstractPrinter<KotlinClassMetadata.SyntheticClass> {
private val sb = StringBuilder().apply {
appendln("lambda {")
}
override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? =
visitFunction(sb, flags, name)
visitFunction(settings, sb, flags, name)
override fun visitEnd() {
sb.appendln("}")
@@ -630,7 +635,9 @@ class LambdaPrinter : KmLambdaVisitor(), AbstractPrinter<KotlinClassMetadata.Syn
}
}
class MultiFileClassPartPrinter : PackagePrinter(), AbstractPrinter<KotlinClassMetadata.MultiFileClassPart> {
class MultiFileClassPartPrinter(
settings: KotlinpSettings
) : PackagePrinter(settings), AbstractPrinter<KotlinClassMetadata.MultiFileClassPart> {
override fun print(klass: KotlinClassMetadata.MultiFileClassPart): String {
sb.appendln(" // facade: ${klass.facadeClassName}")
klass.accept(this)
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.codegen.GenerationUtils
import org.jetbrains.kotlin.kotlinp.Kotlinp
import org.jetbrains.kotlin.kotlinp.KotlinpSettings
import org.jetbrains.kotlin.test.ConfigurationKind
import org.jetbrains.kotlin.test.KotlinTestUtils
import org.jetbrains.kotlin.test.TestJdkKind
@@ -24,24 +25,26 @@ fun compileAndPrintAllFiles(file: File, disposable: Disposable, tmpdir: File, co
val read = StringBuilder()
val readWriteRead = StringBuilder()
val kotlinp = Kotlinp(KotlinpSettings(isVerbose = true))
compile(file, disposable, tmpdir) { outputFile ->
when (outputFile.extension) {
"kotlin_module" -> {
val moduleFile = Kotlinp.readModuleFile(outputFile)!!
val moduleFile = kotlinp.readModuleFile(outputFile)!!
val moduleFile2 = transformModuleFile(moduleFile)
for ((sb, moduleFileToRender) in listOf(read to moduleFile, readWriteRead to moduleFile2)) {
sb.appendFileName(outputFile.relativeTo(tmpdir))
sb.append(Kotlinp.renderModuleFile(moduleFileToRender))
sb.append(kotlinp.renderModuleFile(moduleFileToRender))
}
}
"class" -> {
val classFile = Kotlinp.readClassFile(outputFile)!!
val classFile = kotlinp.readClassFile(outputFile)!!
val classFile2 = transformClassFile(classFile)
for ((sb, classFileToRender) in listOf(read to classFile, readWriteRead to classFile2)) {
sb.appendFileName(outputFile.relativeTo(tmpdir))
sb.append(Kotlinp.renderClassFile(classFileToRender))
sb.append(kotlinp.renderClassFile(classFileToRender))
}
}
else -> fail("Unknown file: $outputFile")