From cd1acfa266b2245994b6f8fa399f308bd4dab7a2 Mon Sep 17 00:00:00 2001 From: Dmitry Cherniachenko Date: Fri, 14 Apr 2017 00:00:42 +0200 Subject: [PATCH] IDEA-171459 fix type cast for int literals used as byte / short in decompiled code --- .../modules/decompiler/ExprProcessor.java | 2 +- .../java/decompiler/SingleClassesTest.java | 1 + testData/classes/pkg/TestPrimitives.class | Bin 0 -> 2632 bytes testData/results/MoreAnnotations.dec | 8 +- testData/results/TestPrimitives.dec | 221 ++++++++++++++++++ testData/src/pkg/TestPrimitives.java | 66 ++++++ 6 files changed, 293 insertions(+), 5 deletions(-) create mode 100644 testData/classes/pkg/TestPrimitives.class create mode 100644 testData/results/TestPrimitives.dec create mode 100644 testData/src/pkg/TestPrimitives.java diff --git a/src/org/jetbrains/java/decompiler/modules/decompiler/ExprProcessor.java b/src/org/jetbrains/java/decompiler/modules/decompiler/ExprProcessor.java index cffc5ac..1b834a0 100644 --- a/src/org/jetbrains/java/decompiler/modules/decompiler/ExprProcessor.java +++ b/src/org/jetbrains/java/decompiler/modules/decompiler/ExprProcessor.java @@ -876,7 +876,7 @@ public class ExprProcessor implements CodeConstants { castAlways || (!leftType.isSuperset(rightType) && (rightType.equals(VarType.VARTYPE_OBJECT) || leftType.type != CodeConstants.TYPE_OBJECT)) || (castNull && rightType.type == CodeConstants.TYPE_NULL && !UNDEFINED_TYPE_STRING.equals(getTypeName(leftType))) || - (isIntConstant(exprent) && rightType.isStrictSuperset(leftType)); + (isIntConstant(exprent) && VarType.VARTYPE_INT.isStrictSuperset(leftType)); boolean quote = cast && exprent.getPrecedence() >= FunctionExprent.getPrecedence(FunctionExprent.FUNCTION_CAST); diff --git a/test/org/jetbrains/java/decompiler/SingleClassesTest.java b/test/org/jetbrains/java/decompiler/SingleClassesTest.java index 1c2779c..ba2429f 100644 --- a/test/org/jetbrains/java/decompiler/SingleClassesTest.java +++ b/test/org/jetbrains/java/decompiler/SingleClassesTest.java @@ -101,6 +101,7 @@ public class SingleClassesTest { @Test public void testAnonymousParams() { doTest("pkg/TestAnonymousParams"); } @Test public void testAccessReplace() { doTest("pkg/TestAccessReplace"); } @Test public void testStringLiterals() { doTest("pkg/TestStringLiterals"); } + @Test public void testPrimitives() { doTest("pkg/TestPrimitives"); } private void doTest(String testFile, String... companionFiles) { ConsoleDecompiler decompiler = fixture.getDecompiler(); diff --git a/testData/classes/pkg/TestPrimitives.class b/testData/classes/pkg/TestPrimitives.class new file mode 100644 index 0000000000000000000000000000000000000000..77d091354d71f969eb2dc6aa4bea17012bd698fb GIT binary patch literal 2632 zcmaKt`%@cL6vw|eS+Zf-LPEkrsY0cZG^I_gRa?Q*0;Ynopo=Kf*Cs4sX_CdTK`B1) z{eHil@i%{TI-@_tj5GQN_+R)p_`Bn|cQ?yIyUk2??>Xn5&pqefbMF5A-yeSgID;P* z#IdO0D4ybvr}<-vKbG6b&VM^xx*|>dwDB_^JrkMu_j>Z$KbNj^=~@1Gt{u7AVqIgBY zt9VVu>kN@`vufJs8N%sfiwx3~wPG-I<;|*bxn3z4wFSLUCQWzVD(dA$y=HRRRZ8}n zxyg{sZ(J>97mQ7NzGhZT+uSlX#~7j;HM448ESDKnF`TrlvY}ULmGm-Sj1}m=%+T&w zw{2QSN>2*YB!eQ<+L~3fxn2``T8?Qg_Doe+W`xBg%S;QFx2h%XG%HLL0h?_Bb7e~x zZaHCFC0mZ6Lo7CJ)kU^adRiD)$T;0%POa%R&YTjaBAKR$Su$)dFWN&&N9HP#49S#7 zlw>yxQc&;_Qi#w=q=*&Gs@IA}&gA=?*uRY@*Yz!3MGAMTIDwNY?!jr5s_Q-#XK_x& zI37}Q0T)$F<6#w#U`EESiZ}2kLuaZmI+R*z{TX5$mM!bmQg*JeZWL`5c|0cLEfsI$ z9Tk@`C*xf%yr*IwkIQ(U3m>R>0-B5ux$u#Uk5znvPi1_j;&Xh#5K7TGhEgjszT`8$ z;=-zouetDzjBok-JFYCs_?`8yJ4B68Ep&hwJe?3$rh zsKVlV33+EAZ|UW_F-OPROI7ALij>_M$wS=7qV|NoTf=o)A-ip%Ke++Hc&F1^Uo97{rR=JsfW7BM|9L)$l`E#Z|Oyw z?_57Mm~Xac8N(5};&UILC+DAv-D>4Zp-`*_A3oSNYgVSlwlmBvFc1f2FFQa z816-DpQY=>|zk zQOu(_gwyDPiI^{obuSCL5hxeF1#^@|h~9lXro)nmX@CcGa7jf>OQ07?f$VkMTqFT# zH%}3i@tfvm@H;$sPXN4+;QfK{dj*_suv^3X0^kD#KO6wR9}fsP-Hf+}-*^(vwhR({ zC;^p$eq zqe7+*5C1|t@9*<7g5mUe$m 5 +7 <-> 6 +8 <-> 7 +9 <-> 8 +10 <-> 9 +11 <-> 10 +12 <-> 11 +13 <-> 12 +15 <-> 13 +16 <-> 14 +19 <-> 17 +20 <-> 18 +23 <-> 21 +24 <-> 22 +27 <-> 25 +28 <-> 26 +31 <-> 29 +32 <-> 30 +35 <-> 33 +36 <-> 34 +39 <-> 37 +40 <-> 38 +43 <-> 41 +44 <-> 42 +47 <-> 45 +48 <-> 46 +52 <-> 49 +56 <-> 53 +60 <-> 57 +64 <-> 61 diff --git a/testData/src/pkg/TestPrimitives.java b/testData/src/pkg/TestPrimitives.java new file mode 100644 index 0000000..f82f585 --- /dev/null +++ b/testData/src/pkg/TestPrimitives.java @@ -0,0 +1,66 @@ +package pkg; + +public class TestPrimitives { + + public void printAll() { + printBoolean(true); + printByte((byte) 123); + printShort((short) 257); + printInt(123); + printLong(123L); + printFloat(1.23F); + printDouble(1.23); + printChar('Z'); + + System.out.println(String.format("%b, %d, %d, %d", getBoolean(), getByte(), getShort(), getInt())); + } + + public void printBoolean(boolean b) { + System.out.println(String.format("%b", b)); + } + + public void printByte(byte b) { + System.out.println(String.format("%d", b)); + } + + public void printShort(short s) { + System.out.println(String.format("%d", s)); + } + + public void printInt(int i) { + System.out.println(String.format("%d", i)); + } + + public void printLong(long l) { + System.out.println(String.format("%d", l)); + } + + public void printFloat(float f) { + System.out.println(String.format("%f", f)); + } + + public void printDouble(double d) { + System.out.println(String.format("%f", d)); + } + + public void printChar(char c) { + System.out.println(String.format("%c", c)); + } + + + public boolean getBoolean() { + return false; + } + + public byte getByte() { + return (byte) 128; + } + + public short getShort() { + return (short) 32768; + } + + public int getInt() { + return 42; + } +}