IDEA-226374 Constant String field evaluation shows PsiType prefix

GitOrigin-RevId: e4cfa8fbf4a20f2a2b8cfe63a30b0294274ca660
This commit is contained in:
Ivo Šmíd
2019-11-08 10:34:40 +00:00
committed by intellij-monorepo-bot
parent 91da2f3f5e
commit 8084168cd5
3 changed files with 144 additions and 3 deletions
@@ -21,6 +21,7 @@ import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.ClassUtil;
import com.intellij.psi.util.ConstantEvaluationOverflowException;
import com.intellij.psi.util.ConstantExpressionUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.containers.Interner;
import com.intellij.util.containers.StringInterner;
import gnu.trove.THashSet;
@@ -141,8 +142,8 @@ class ConstantExpressionVisitor extends JavaElementVisitor implements PsiConstan
Object value = null;
if (tokenType == JavaTokenType.PLUS) {
if (lOperandValue instanceof String || rOperandValue instanceof String) {
String l = lOperandValue.toString();
String r = rOperandValue.toString();
String l = computeValueToString(lOperandValue);
String r = computeValueToString(rOperandValue);
value = l + r;
}
else {
@@ -394,6 +395,21 @@ class ConstantExpressionVisitor extends JavaElementVisitor implements PsiConstan
return value;
}
private static String computeValueToString(Object value) {
if (value instanceof PsiType) {
if (value instanceof PsiArrayType) {
return "class " + ClassUtil.getClassObjectPresentation((PsiType)value);
}
PsiClass psiClass = PsiUtil.resolveClassInType((PsiType)value);
String prefix = psiClass == null ? "" : psiClass.isInterface() ? "interface " : "class ";
return prefix + ((PsiType)value).getCanonicalText();
}
else {
return value.toString();
}
}
@Nullable
private static Boolean handleEqualityComparison(Object lOperandValue, Object rOperandValue, IElementType tokenType) {
if (lOperandValue instanceof String && rOperandValue instanceof String ||
@@ -12,8 +12,23 @@ public class ClassWithConstants {
public static final float FLOAT_CONST = 1.234f;
public static final double DOUBLE_CONST = 3.456;
public static final java.lang.String STRING_CONST = "a\r\n\"bcd";
public static final java.lang.String STRING_EXPRESSION_CONST1 = "a" + "b";
public static final java.lang.String STRING_EXPRESSION_CONST2 = "a" + 123;
public static final java.lang.String STRING_EXPRESSION_CONST3 = 123 + "b";
public static final java.lang.String STRING_EXPRESSION_CONST4 = INT_CONST1 + "aaa";
public static final java.lang.String STRING_EXPRESSION_CLASS = Integer.class + "xxx";
public static final java.lang.String STRING_EXPRESSION_CLASS_ARRAY = Integer[].class + "xxx";
public static final java.lang.String STRING_EXPRESSION_INTERFACE = Runnable.class + "xxx";
public static final java.lang.String STRING_EXPRESSION_PRIMITIVE = int.class + "xxx";
public static final java.lang.String STRING_EXPRESSION_PRIMITIVE_ARRAY = int[].class + "xxx";
public static final java.lang.String STRING_EXPRESSION_METHOD = val() + "xxx";
public static final double d1 = Double.POSITIVE_INFINITY;
public static final double d2 = Double.NEGATIVE_INFINITY;
public static final double d3 = Double.NaN;
public static int val() {
return 1;
}
}
@@ -236,4 +236,114 @@ public class ConstantValuesTest extends LightJavaCodeInsightFixtureTestCase {
assertNotNull(field);
assertEquals("", JavaConstantExpressionEvaluator.computeConstantExpression(field.getInitializer(), false));
}
}
public void testStringConstExpression1() {
PsiField field = myClass.findFieldByName("STRING_EXPRESSION_CONST1", false);
assertNotNull(field);
PsiBinaryExpression initializer = (PsiBinaryExpression)field.getInitializer();
assertNotNull(initializer);
assertTrue(initializer.getType().equalsToText("java.lang.String"));
assertEquals("\"a\" + \"b\"", initializer.getText());
assertEquals("ab", field.computeConstantValue());
}
public void testStringConstExpression2() {
PsiField field = myClass.findFieldByName("STRING_EXPRESSION_CONST2", false);
assertNotNull(field);
PsiBinaryExpression initializer = (PsiBinaryExpression)field.getInitializer();
assertNotNull(initializer);
assertTrue(initializer.getType().equalsToText("java.lang.String"));
assertEquals("\"a\" + 123", initializer.getText());
assertEquals("a123", field.computeConstantValue());
}
public void testStringConstExpression3() {
PsiField field = myClass.findFieldByName("STRING_EXPRESSION_CONST3", false);
assertNotNull(field);
PsiBinaryExpression initializer = (PsiBinaryExpression)field.getInitializer();
assertNotNull(initializer);
assertTrue(initializer.getType().equalsToText("java.lang.String"));
assertEquals("123 + \"b\"", initializer.getText());
assertEquals("123b", field.computeConstantValue());
}
public void testStringConstExpression4() {
PsiField field = myClass.findFieldByName("STRING_EXPRESSION_CONST4", false);
assertNotNull(field);
PsiBinaryExpression initializer = (PsiBinaryExpression)field.getInitializer();
assertNotNull(initializer);
assertTrue(initializer.getType().equalsToText("java.lang.String"));
assertEquals("INT_CONST1 + \"aaa\"", initializer.getText());
assertEquals("1aaa", field.computeConstantValue());
}
public void testStringExpressionClass() {
PsiField field = myClass.findFieldByName("STRING_EXPRESSION_CLASS", false);
assertNotNull(field);
PsiBinaryExpression initializer = (PsiBinaryExpression)field.getInitializer();
assertNotNull(initializer);
assertTrue(initializer.getType().equalsToText("java.lang.String"));
assertEquals("Integer.class + \"xxx\"", initializer.getText());
assertEquals("class java.lang.Integerxxx", field.computeConstantValue());
}
public void testStringExpressionClassArray() {
PsiField field = myClass.findFieldByName("STRING_EXPRESSION_CLASS_ARRAY", false);
assertNotNull(field);
PsiBinaryExpression initializer = (PsiBinaryExpression)field.getInitializer();
assertNotNull(initializer);
assertTrue(initializer.getType().equalsToText("java.lang.String"));
assertEquals("Integer[].class + \"xxx\"", initializer.getText());
assertEquals("class [Ljava.lang.Integer;xxx", field.computeConstantValue());
}
public void testStringExpressionInterface() {
PsiField field = myClass.findFieldByName("STRING_EXPRESSION_INTERFACE", false);
assertNotNull(field);
PsiBinaryExpression initializer = (PsiBinaryExpression)field.getInitializer();
assertNotNull(initializer);
assertTrue(initializer.getType().equalsToText("java.lang.String"));
assertEquals("Runnable.class + \"xxx\"", initializer.getText());
assertEquals("interface java.lang.Runnablexxx", field.computeConstantValue());
}
public void testStringExpressionPrimitive() {
PsiField field = myClass.findFieldByName("STRING_EXPRESSION_PRIMITIVE", false);
assertNotNull(field);
PsiBinaryExpression initializer = (PsiBinaryExpression)field.getInitializer();
assertNotNull(initializer);
assertTrue(initializer.getType().equalsToText("java.lang.String"));
assertEquals("int.class + \"xxx\"", initializer.getText());
assertEquals("intxxx", field.computeConstantValue());
}
public void testStringExpressionPrimitiveArray() {
PsiField field = myClass.findFieldByName("STRING_EXPRESSION_PRIMITIVE_ARRAY", false);
assertNotNull(field);
PsiBinaryExpression initializer = (PsiBinaryExpression)field.getInitializer();
assertNotNull(initializer);
assertTrue(initializer.getType().equalsToText("java.lang.String"));
assertEquals("int[].class + \"xxx\"", initializer.getText());
assertEquals("class [Ixxx", field.computeConstantValue());
}
public void testStringExpressionMethod() {
PsiField field = myClass.findFieldByName("STRING_EXPRESSION_METHOD", false);
assertNotNull(field);
PsiBinaryExpression initializer = (PsiBinaryExpression)field.getInitializer();
assertNotNull(initializer);
assertTrue(initializer.getType().equalsToText("java.lang.String"));
assertEquals("val() + \"xxx\"", initializer.getText());
assertNull(field.computeConstantValue());
}
}