Minor code improvements in ConvertToStringTemplateIntention

This commit is contained in:
Valentin Kipyatkov
2015-06-10 19:09:44 +03:00
parent c8f9b466b6
commit ab97d76fed
@@ -38,9 +38,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.analyze
public class ConvertToStringTemplateIntention : JetSelfTargetingOffsetIndependentIntention<JetBinaryExpression>(javaClass(), "Convert concatenation to template") { public class ConvertToStringTemplateIntention : JetSelfTargetingOffsetIndependentIntention<JetBinaryExpression>(javaClass(), "Convert concatenation to template") {
override fun isApplicableTo(element: JetBinaryExpression): Boolean { override fun isApplicableTo(element: JetBinaryExpression): Boolean {
if (element.getOperationToken() != JetTokens.PLUS) return false if (element.getOperationToken() != JetTokens.PLUS) return false
if (!KotlinBuiltIns.isString(element.analyze().getType(element))) return false
val elementType = BindingContextUtils.getRecordedTypeInfo(element, element.analyze())?.type
if (!KotlinBuiltIns.isString(elementType)) return false
val left = element.getLeft() ?: return false val left = element.getLeft() ?: return false
val right = element.getRight() ?: return false val right = element.getRight() ?: return false
@@ -68,20 +66,21 @@ public class ConvertToStringTemplateIntention : JetSelfTargetingOffsetIndependen
} }
else { else {
val leftText = buildText(left, needsBraces) val leftText = buildText(left, needsBraces)
return "\"" + leftText + right + "\"" return "\"$leftText$right\""
} }
} }
private fun buildText(expr: JetExpression?, needsBraces: Boolean): String { private fun buildText(expr: JetExpression?, forceBraces: Boolean): String {
val expression = JetPsiUtil.deparenthesize(expr) if (expr == null) return ""
val expressionText = expression?.getText() ?: "" val expression = JetPsiUtil.safeDeparenthesize(expr)
val expressionText = expression.getText()
return when (expression) { return when (expression) {
is JetConstantExpression -> { is JetConstantExpression -> {
val context = expression.analyze() val bindingContext = expression.analyze()
val constant = ConstantExpressionEvaluator.evaluate(expression, DelegatingBindingTrace(context, "Trace for evaluating constant"), null) val constant = ConstantExpressionEvaluator.getConstant(expression, bindingContext)
if (constant is IntegerValueTypeConstant) { if (constant is IntegerValueTypeConstant) {
val elementType = BindingContextUtils.getRecordedTypeInfo(expression, context)?.type!! val type = bindingContext.getType(expression)!!
constant.getValue(elementType).toString() constant.getValue(type).toString()
} }
else { else {
constant?.getValue().toString() constant?.getValue().toString()
@@ -96,8 +95,8 @@ public class ConvertToStringTemplateIntention : JetSelfTargetingOffsetIndependen
else { else {
StringUtil.unquoteString(expressionText) StringUtil.unquoteString(expressionText)
} }
if (needsBraces && base.endsWith('$')) { if (forceBraces && base.endsWith('$')) {
base.substring(0, base.length() - 1) + "\\$" base.dropLast(1) + "\\$"
} }
else { else {
base base
@@ -105,7 +104,7 @@ public class ConvertToStringTemplateIntention : JetSelfTargetingOffsetIndependen
} }
is JetSimpleNameExpression -> is JetSimpleNameExpression ->
if (needsBraces) "\${" + expressionText + "}" else "\$" + expressionText "$" + (if (forceBraces) "{$expressionText}" else expressionText)
null -> "" null -> ""