Fix escaping const string literals in UL

Fixed #KT-38247
This commit is contained in:
Igor Yakovlev
2020-05-09 01:36:12 +03:00
parent 9f8044ff1b
commit 84a582c618
2 changed files with 24 additions and 3 deletions
@@ -18,6 +18,7 @@ import com.intellij.psi.impl.compiled.StubBuildingVisitor
import com.intellij.psi.impl.light.*
import com.intellij.psi.util.TypeConversionUtil
import com.intellij.util.BitUtil.isSet
import com.intellij.util.IncorrectOperationException
import com.intellij.util.containers.ContainerUtil
import org.jetbrains.kotlin.asJava.LightClassGenerationSupport
import org.jetbrains.kotlin.asJava.UltraLightClassModifierExtension
@@ -364,14 +365,32 @@ private fun toQualifiedName(userType: KtUserType): FqName? {
internal fun ConstantValue<*>.createPsiLiteral(parent: PsiElement): PsiExpression? {
val asString = asStringForPsiLiteral(parent)
val instance = PsiElementFactory.SERVICE.getInstance(parent.project)
return instance.createExpressionFromText(asString, parent)
val instance = PsiElementFactory.getInstance(parent.project)
return try {
instance.createExpressionFromText(asString, parent)
} catch (_: IncorrectOperationException) {
null
}
}
private fun escapeString(str: String): String = buildString {
str.forEach { char ->
val escaped = when (char) {
'\n' -> "\\n"
'\r' -> "\\r"
'\t' -> "\\t"
'\"' -> "\\\""
'\\' -> "\\\\"
else -> "$char"
}
append(escaped)
}
}
private fun ConstantValue<*>.asStringForPsiLiteral(parent: PsiElement): String =
when (this) {
is NullValue -> "null"
is StringValue -> "\"$value\""
is StringValue -> "\"${escapeString(value)}\""
is KClassValue -> {
val value = (value as KClassValue.Value.NormalClass).value
val arrayPart = "[]".repeat(value.arrayNestedness)
@@ -26,6 +26,8 @@ class Foo(a: Int, val b:Foo, var c:Boolean, private val d: List, protected val e
const val SUBSYSTEM_DEPRECATED: String = "This subsystem is deprecated"
const val CONSTANT_WITH_ESCAPES = "A\tB\nC\rD\'E\"F\\G\$H"
var counter = 0
set(value) {
if (value >= 0) field = value