Fix escaping const string literals in UL
Fixed #KT-38247
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user