DescriptorRendererImpl made internal + minor improvements

This commit is contained in:
Valentin Kipyatkov
2015-06-05 16:45:12 +03:00
parent 2601e0ccd4
commit 55b898167b
3 changed files with 56 additions and 66 deletions
@@ -16,12 +16,12 @@
package org.jetbrains.kotlin.diagnostics.rendering
import org.jetbrains.kotlin.renderer.Renderer
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.renderer.DescriptorRendererImpl
import org.jetbrains.kotlin.renderer.DescriptorRenderer
import org.jetbrains.kotlin.renderer.Renderer
public fun <P> renderParameter(parameter: P, renderer: Renderer<P>?): Any = renderer?.render(parameter) ?: parameter
public fun ClassDescriptor.renderKindWithName(): String = "${DescriptorRendererImpl.getClassKindPrefix(this)} '${getName()}'"
public fun ClassDescriptor.renderKindWithName(): String = DescriptorRenderer.getClassKindPrefix(this) + " '" + getName() + "'"
public fun ClassDescriptor.renderKind(): String = DescriptorRendererImpl.getClassKindPrefix(this)
public fun ClassDescriptor.renderKind(): String = DescriptorRenderer.getClassKindPrefix(this)
@@ -16,10 +16,7 @@
package org.jetbrains.kotlin.renderer
import org.jetbrains.kotlin.descriptors.ClassifierDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.FqNameBase
@@ -198,6 +195,20 @@ public interface DescriptorRenderer : Renderer<DeclarationDescriptor> {
renderDefaultValues = false
startFromName = true
}
public fun getClassKindPrefix(klass: ClassDescriptor): String {
if (klass.isCompanionObject()) {
return "companion object"
}
return when (klass.getKind()) {
ClassKind.CLASS -> "class"
ClassKind.INTERFACE -> "interface"
ClassKind.ENUM_CLASS -> "enum class"
ClassKind.OBJECT -> "object"
ClassKind.ANNOTATION_CLASS -> "annotation class"
ClassKind.ENUM_ENTRY -> "enum entry"
}
}
}
}
@@ -38,8 +38,8 @@ import java.util.*
import org.jetbrains.kotlin.resolve.DescriptorUtils.isCompanionObject
import org.jetbrains.kotlin.types.TypeUtils.CANT_INFER_FUNCTION_PARAM_TYPE
public/*TODO*/ class DescriptorRendererImpl internal constructor(
public val options: DescriptorRendererOptionsImpl
internal class DescriptorRendererImpl(
val options: DescriptorRendererOptionsImpl
) : DescriptorRenderer, DescriptorRendererOptions by options/* this gives access to options without qualifier */ {
init {
@@ -815,7 +815,7 @@ public/*TODO*/ class DescriptorRendererImpl internal constructor(
}
private fun renderClassKindPrefix(klass: ClassDescriptor, builder: StringBuilder) {
builder.append(renderKeyword(getClassKindPrefix(klass)))
builder.append(renderKeyword(DescriptorRenderer.getClassKindPrefix(klass)))
}
@@ -928,61 +928,40 @@ public/*TODO*/ class DescriptorRendererImpl internal constructor(
}
}
companion object {
private fun renderSpaceIfNeeded(builder: StringBuilder) {
val length = builder.length()
if (length == 0 || builder.charAt(length - 1) != ' ') {
builder.append(' ')
}
}
private fun nameShouldBeEscaped(identifier: Name): Boolean {
if (identifier.isSpecial()) return false
val name = identifier.asString()
if (KeywordStringsGenerated.KEYWORDS.contains(name)) return true
for (i in 0..name.length() - 1) {
val c = name.charAt(i)
if (!Character.isLetterOrDigit(c) && c != '_') return true
}
return false
}
private fun replacePrefixes(lowerRendered: String, lowerPrefix: String, upperRendered: String, upperPrefix: String, foldedPrefix: String): String? {
if (lowerRendered.startsWith(lowerPrefix) && upperRendered.startsWith(upperPrefix)) {
val lowerWithoutPrefix = lowerRendered.substring(lowerPrefix.length())
if (differsOnlyInNullability(lowerWithoutPrefix, upperRendered.substring(upperPrefix.length()))) {
return foldedPrefix + lowerWithoutPrefix + "!"
}
}
return null
}
private fun differsOnlyInNullability(lower: String, upper: String): Boolean {
return lower == upper.replace("?", "") || upper.endsWith("?") && ((lower + "?") == upper) || (("(" + lower + ")?") == upper)
}
private fun overridesSomething(callable: CallableMemberDescriptor): Boolean {
return !callable.getOverriddenDescriptors().isEmpty()
}
public fun getClassKindPrefix(klass: ClassDescriptor): String {
if (klass.isCompanionObject()) {
return "companion object"
}
when (klass.getKind()) {
ClassKind.CLASS -> return "class"
ClassKind.INTERFACE -> return "interface"
ClassKind.ENUM_CLASS -> return "enum class"
ClassKind.OBJECT -> return "object"
ClassKind.ANNOTATION_CLASS -> return "annotation class"
ClassKind.ENUM_ENTRY -> return "enum entry"
else -> throw IllegalStateException("unknown class kind: " + klass.getKind())
}
private fun renderSpaceIfNeeded(builder: StringBuilder) {
val length = builder.length()
if (length == 0 || builder.charAt(length - 1) != ' ') {
builder.append(' ')
}
}
private fun nameShouldBeEscaped(identifier: Name): Boolean {
if (identifier.isSpecial()) return false
val name = identifier.asString()
if (KeywordStringsGenerated.KEYWORDS.contains(name)) return true
for (i in 0..name.length() - 1) {
val c = name.charAt(i)
if (!Character.isLetterOrDigit(c) && c != '_') return true
}
return false
}
private fun replacePrefixes(lowerRendered: String, lowerPrefix: String, upperRendered: String, upperPrefix: String, foldedPrefix: String): String? {
if (lowerRendered.startsWith(lowerPrefix) && upperRendered.startsWith(upperPrefix)) {
val lowerWithoutPrefix = lowerRendered.substring(lowerPrefix.length())
if (differsOnlyInNullability(lowerWithoutPrefix, upperRendered.substring(upperPrefix.length()))) {
return foldedPrefix + lowerWithoutPrefix + "!"
}
}
return null
}
private fun differsOnlyInNullability(lower: String, upper: String)
= lower == upper.replace("?", "") || upper.endsWith("?") && ("$lower?") == upper || "($lower)?" == upper
private fun overridesSomething(callable: CallableMemberDescriptor) = !callable.getOverriddenDescriptors().isEmpty()
}