diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/evaluate/ConstantExpressionEvaluator.kt b/compiler/frontend/src/org/jetbrains/jet/lang/evaluate/ConstantExpressionEvaluator.kt index 7fecf7c275d..0ff8066bc61 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/evaluate/ConstantExpressionEvaluator.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/evaluate/ConstantExpressionEvaluator.kt @@ -517,7 +517,8 @@ private fun createStringConstant(value: CompileTimeConstant<*>?): StringValue? { is IntValue, is ByteValue, is ShortValue, is LongValue, is CharValue, is DoubleValue, is FloatValue, - is BooleanValue -> StringValue(value.getValue().toString()) + is BooleanValue, + is NullValue -> StringValue(value.getValue().toString()) else -> null } } diff --git a/compiler/testData/evaluate/constant/strings.kt b/compiler/testData/evaluate/constant/strings.kt index 6a72ac406fc..4e375d18ed4 100644 --- a/compiler/testData/evaluate/constant/strings.kt +++ b/compiler/testData/evaluate/constant/strings.kt @@ -4,29 +4,29 @@ enum class MyEnum { A } -// val prop1: "2" +// val prop1: \"2\" val prop1 = "${1 + 1}" // val prop2: null val prop2 = "myEnum=${MyEnum.A}" -// val prop3: "1" +// val prop3: \"1\" val prop3 = "${1}" -// val prop4: null +// val prop4: \"null\" val prop4 = "${null}" -// val prop5: "1.0" +// val prop5: \"1.0\" val prop5 = "${1.toFloat()}" -// val prop6: "1.0" +// val prop6: \"1.0\" val prop6 = "${1.0}" // val prop7: null val prop7 = "${javaClass()}" -// val prop8: "a1.0" +// val prop8: \"a1.0\" val prop8 = "a${1.toDouble()}" -// val prop9: "ab" +// val prop9: \"ab\" val prop9 = "a" + "b" diff --git a/compiler/tests/org/jetbrains/jet/evaluate/AbstractEvaluateExpressionTest.kt b/compiler/tests/org/jetbrains/jet/evaluate/AbstractEvaluateExpressionTest.kt index 4ad52daaa61..8456535da32 100644 --- a/compiler/tests/org/jetbrains/jet/evaluate/AbstractEvaluateExpressionTest.kt +++ b/compiler/tests/org/jetbrains/jet/evaluate/AbstractEvaluateExpressionTest.kt @@ -31,6 +31,7 @@ import com.intellij.openapi.util.text.StringUtil import org.jetbrains.jet.JetTestUtils import org.jetbrains.jet.util.slicedmap.WritableSlice import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant +import org.jetbrains.jet.lang.resolve.constants.StringValue abstract class AbstractEvaluateExpressionTest: AbstractAnnotationDescriptorResolveTest() { @@ -39,7 +40,12 @@ abstract class AbstractEvaluateExpressionTest: AbstractAnnotationDescriptorResol doTest(path) { property, context -> val compileTimeConstant = context.get(BindingContext.COMPILE_TIME_VALUE, property.getInitializer()) - compileTimeConstant.toString() + if (compileTimeConstant is StringValue) { + "\\\"${compileTimeConstant.getValue()}\\\"" + } + else { + compileTimeConstant.toString() + } } } @@ -59,22 +65,23 @@ abstract class AbstractEvaluateExpressionTest: AbstractAnnotationDescriptorResol val propertiesForTest = getObjectsToTest(fileText) - val expectedActual = hashMapOf() + val expectedActual = arrayListOf>() for (propertyName in propertiesForTest) { - val expectedProperyPrefix = "// val ${propertyName}: " - val expected = InTextDirectivesUtils.findStringWithPrefixes(fileText, expectedProperyPrefix) - assertNotNull(expected, "Failed to find expected directive: $expectedProperyPrefix") + val expectedPropertyPrefix = "// val ${propertyName}: " + val expected = InTextDirectivesUtils.findStringWithPrefixes(fileText, expectedPropertyPrefix) + assertNotNull(expected, "Failed to find expected directive: $expectedPropertyPrefix") val property = AbstractAnnotationDescriptorResolveTest.getPropertyDescriptor(packageView, propertyName) val jetProperty = BindingContextUtils.descriptorToDeclaration(context!!, property) as JetProperty val testedObject = getValueToTest(jetProperty, context!!) - expectedActual[expectedProperyPrefix + expected!!] = expectedProperyPrefix + StringUtil.unquoteString(testedObject) + expectedActual.add(expectedPropertyPrefix + expected!! to expectedPropertyPrefix + testedObject) } var actualFileText = fileText for ((expected, actual) in expectedActual) { + assert(actualFileText.contains(expected), "File text should contains $expected") actualFileText = actualFileText.replace(expected, actual) }