From 999fe6d7468866f28c08910a4687ccf2c854dc1e Mon Sep 17 00:00:00 2001 From: Bart van Helvert Date: Sun, 23 Jan 2022 19:28:13 +0100 Subject: [PATCH] [java-decompiler] Don't ignore nested classes in sealed class permits list GitOrigin-RevId: e2eecb48b7d7f0941556ee5208041fe29819cba7 --- .../java/decompiler/main/ClassWriter.java | 15 ++++++--------- .../java/decompiler/SingleClassesTest.java | 3 ++- .../classes/sealed/ClassNonSealed.class | Bin 290 -> 335 bytes .../RootWithInterfaceInnerAndOuter$Inner.class | Bin 0 -> 444 bytes .../sealed/RootWithInterfaceInnerAndOuter.class | Bin 0 -> 321 bytes .../testData/classes/typeAnnotations/L.class | Bin 0 -> 289 bytes .../typeAnnotations/LocalTypeAnnotations.class | Bin 0 -> 2097 bytes .../engine/testData/results/ClassNonSealed.dec | 2 +- .../results/RootWithInterfaceInnerAndOuter.dec | 7 +++++++ .../testData/src/sealed/ClassImplements.java | 2 +- .../testData/src/sealed/ClassNonSealed.java | 2 +- .../sealed/ClassNonSealedExtendsImplements.java | 4 ++++ .../src/sealed/ClassNonSealedImplements.java | 4 ---- .../testData/src/sealed/RootWithClassInner.java | 4 ++-- .../testData/src/sealed/RootWithClassOuter.java | 2 +- .../sealed/RootWithInterfaceInnerAndOuter.java | 6 ++++++ .../src/sealed/RootWithInterfaceOuter.java | 2 +- 17 files changed, 32 insertions(+), 21 deletions(-) create mode 100644 plugins/java-decompiler/engine/testData/classes/sealed/RootWithInterfaceInnerAndOuter$Inner.class create mode 100644 plugins/java-decompiler/engine/testData/classes/sealed/RootWithInterfaceInnerAndOuter.class create mode 100644 plugins/java-decompiler/engine/testData/classes/typeAnnotations/L.class create mode 100644 plugins/java-decompiler/engine/testData/classes/typeAnnotations/LocalTypeAnnotations.class create mode 100644 plugins/java-decompiler/engine/testData/results/RootWithInterfaceInnerAndOuter.dec create mode 100644 plugins/java-decompiler/engine/testData/src/sealed/ClassNonSealedExtendsImplements.java delete mode 100644 plugins/java-decompiler/engine/testData/src/sealed/ClassNonSealedImplements.java create mode 100644 plugins/java-decompiler/engine/testData/src/sealed/RootWithInterfaceInnerAndOuter.java diff --git a/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/main/ClassWriter.java b/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/main/ClassWriter.java index 6352fa9afdc4..93f68212017a 100644 --- a/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/main/ClassWriter.java +++ b/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/main/ClassWriter.java @@ -534,16 +534,13 @@ public class ClassWriter { if (!allSubClassesAreNested) { // only generate permits lists for non-nested classes buffer.append("permits "); for (int i = 0; i < permittedSubclassQualifiedNames.size(); i++) { - String qualifiedName = permittedSubclassQualifiedNames.get(i); - boolean isNested = qualifiedNested.contains(qualifiedName); - if (!isNested) { - if (i > 0) { - buffer.append(", "); - } - DecompilerContext.getImportCollector().getShortName(qualifiedName); - String simpleName = qualifiedName.substring(qualifiedName.lastIndexOf('/') + 1); - buffer.append(simpleName); + String qualifiedName = permittedSubclassQualifiedNames.get(i).replace("$", "."); + if (i > 0) { + buffer.append(", "); } + DecompilerContext.getImportCollector().getShortName(qualifiedName); + String simpleName = qualifiedName.substring(qualifiedName.lastIndexOf('/') + 1); + buffer.append(simpleName); } buffer.append(' '); } diff --git a/plugins/java-decompiler/engine/test/org/jetbrains/java/decompiler/SingleClassesTest.java b/plugins/java-decompiler/engine/test/org/jetbrains/java/decompiler/SingleClassesTest.java index 6958296479d6..2a5f76463141 100644 --- a/plugins/java-decompiler/engine/test/org/jetbrains/java/decompiler/SingleClassesTest.java +++ b/plugins/java-decompiler/engine/test/org/jetbrains/java/decompiler/SingleClassesTest.java @@ -1,4 +1,4 @@ -// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.java.decompiler; import org.jetbrains.java.decompiler.main.DecompilerContext; @@ -176,6 +176,7 @@ public class SingleClassesTest { "sealed/RootWithInterfaceOuter", "sealed/ClassImplements", "sealed/ClassNonSealedExtendsImplements"); } @Test public void testRootWithModule() { doTest("sealed/foo/RootWithModule", "sealed/bar/BarClassExtends");} + @Test public void testRootWithInterfaceInnerAndOuter() { doTest("sealed/RootWithInterfaceInnerAndOuter", "sealed/ClassNonSealed");} @Test public void testArrayTypeAnnotations() { doTest("typeAnnotations/ArrayTypeAnnotations", "typeAnnotations/A", "typeAnnotations/B", "typeAnnotations/C", "typeAnnotations/D"); } diff --git a/plugins/java-decompiler/engine/testData/classes/sealed/ClassNonSealed.class b/plugins/java-decompiler/engine/testData/classes/sealed/ClassNonSealed.class index fcb5e012e85fe3e8ff2c6d4ce23e360c88d2239b..3a20fe5ebaba09e67ac7be1c6eacce43fa840262 100644 GIT binary patch delta 144 zcmZ3)be@Up)W2Q(7#J9A8H6Ts1#7c2a4|Bd7N;iWq^9Tx<>!}#XO?7m=9Q!tr6ne( zdgkS&7CGjn_?H3&CdO9!F*0xh^)do6D+3#l<_5C#fize|YdZtuMxX!_0}qe{Ni#4o ZGw=dQ9*6=4J_ddukC8zDNHQ@90ss*o83Ob85o!uxPc@OL;;ZI1@agf_<$r613v&4b_yf_ diff --git a/plugins/java-decompiler/engine/testData/classes/sealed/RootWithInterfaceInnerAndOuter$Inner.class b/plugins/java-decompiler/engine/testData/classes/sealed/RootWithInterfaceInnerAndOuter$Inner.class new file mode 100644 index 0000000000000000000000000000000000000000..b91161c7a133ddb014f586b8a71580619ed04ec4 GIT binary patch literal 444 zcma)2%SyvQ6g@YOrj60osteaD_`n9&K0pd$A+(@U*OO$lQ{oIH6aUMV;KC2^qr{u& zTFSt=bI#m3GxvObe|!SC#7+nYZU8TWj}Bq56t5yKgno`^=~8Bv(78}r*(-v3cr*{t zC7e`J6f%$RjIoc(E+*Q_@=0WJqO~lqbv~&I#eYsmn~>sK$8j{~1P29E9#vR`%9ZoJQ16 zH7-O|Nq*dKDb5gZj)WeEO1wBr#x-Vf%K`uR9rVV6gNU&?20W}YM(y6m2Kvlg3>Y13 SV%XLmwz!7e6R`a@c7FhiA#D8s literal 0 HcmV?d00001 diff --git a/plugins/java-decompiler/engine/testData/classes/sealed/RootWithInterfaceInnerAndOuter.class b/plugins/java-decompiler/engine/testData/classes/sealed/RootWithInterfaceInnerAndOuter.class new file mode 100644 index 0000000000000000000000000000000000000000..48ee6c8eeb206cf26cac1e10e4c8392ca831f848 GIT binary patch literal 321 zcma)2%WA_w3>@WQJ5HJeLJm16Jr(LN=%Ew}Ipjfn$a!t6jf1m>-E}{%hkigmszhFT z4iQL<2F)Pp_wV}$zzZfJI)q2ds^TI!)U`X7?zGm9&4ohUF;emLi7mJv-(m= zrSxaA%g&rTLY&r($@#skn6SL<@!ZM@!!294;Y-HGh8Pf@?%H7G_aV&oY%Zm9T%=8w zSISxzn-O9DZ}Zl2+ghjoF2cwQJ%7RqKyuAF9#FEVXykdPHb_Nzk27#=^vPAuy#JqHU z|D>$cgRkZGs#S6`nA*F)a0xrf~XxP_UN(a-h1wISO5I?{4W6a@vDIp(mFDEXvhlm@0&+v z$u^zc(t2ZGHUoj|yyaNI1A+9!$jA}i9i-C_=gfIjlb_3T!$K)QS$7xAuuX13e* zQ-R{dWG&?D1eRUe={U{6a-GtmwH&{eb@U5d33V*DwAk6%k)CXANV6q99R-2HiEP=j zWrXK&Ss)WgKQM3!S5)Bd2@Fm|uENka1J81H%adCM`Y@z4t_cjp8gvv9#qtmGxUN#y znzrjp9XF_Y;Y^GK-4alBBCyj$G>;Hl$ZK8#a+bsJ~@;mRiSPCfKulf$`eg zke3B=P4}=t=9WOJ;R#%gD%4eIstWoXd@W97O_{c*x~*agtCB1*g_iF&_DS%V@4u-@ z5E${p@>iWe?nvVDeAD^vC=*B=Q#k>>j<5WH z$zBYbx@xvVZ#w4BY>8;DbZ|3V4~y}p1eoDQ#|f-MS#^#q-%?HdfAa^r`nbpdy3vO{ z(S@F9r6;=76I~{1Y`PtHE^x@kC&(t7E;2 zuj6Nd;qz4)Z`3IiF~(1d`lY}#0a@NZ;;O`_;8VMG4Dl=!Pw=k9fPqQg^N|8>;Wk&m zofBhG4~c-;f?m7*H&XWt@2ow?1z;}o0)5*raA~_RaE!rYT%FT~v_J9wA26b~k-~>_ z+A}g2=;IC#aSh7vw6dn3G_f3}xSFO$38T16y&0l+iF}NE{C|#5!uU3*IZFE}O0@7Q zQA;DwY#ehMpVDTA-g1=Oqg{&3Q$%Ozseo~OMz#zufy=}+T1I(CvM(r`BXSL?mkdGE zF{Yy|c literal 0 HcmV?d00001 diff --git a/plugins/java-decompiler/engine/testData/results/ClassNonSealed.dec b/plugins/java-decompiler/engine/testData/results/ClassNonSealed.dec index a03c12c5d9a2..6a0718be1de0 100644 --- a/plugins/java-decompiler/engine/testData/results/ClassNonSealed.dec +++ b/plugins/java-decompiler/engine/testData/results/ClassNonSealed.dec @@ -1,5 +1,5 @@ package sealed; -non-sealed class ClassNonSealed extends RootWithClassOuter { +non-sealed class ClassNonSealed extends RootWithClassOuter implements RootWithInterfaceInnerAndOuter { } diff --git a/plugins/java-decompiler/engine/testData/results/RootWithInterfaceInnerAndOuter.dec b/plugins/java-decompiler/engine/testData/results/RootWithInterfaceInnerAndOuter.dec new file mode 100644 index 000000000000..b35126b75573 --- /dev/null +++ b/plugins/java-decompiler/engine/testData/results/RootWithInterfaceInnerAndOuter.dec @@ -0,0 +1,7 @@ +package sealed; + +sealed interface RootWithInterfaceInnerAndOuter permits RootWithInterfaceInnerAndOuter.Inner, ClassNonSealed { + public static final class Inner implements RootWithInterfaceInnerAndOuter { + } +} + diff --git a/plugins/java-decompiler/engine/testData/src/sealed/ClassImplements.java b/plugins/java-decompiler/engine/testData/src/sealed/ClassImplements.java index 453f8415fa03..c61eeb31fb3b 100644 --- a/plugins/java-decompiler/engine/testData/src/sealed/ClassImplements.java +++ b/plugins/java-decompiler/engine/testData/src/sealed/ClassImplements.java @@ -1,4 +1,4 @@ package sealed; -final class FinalImplements implements RootWithInterfaceOuter { +final class ClassImplements implements RootWithInterfaceOuter { } diff --git a/plugins/java-decompiler/engine/testData/src/sealed/ClassNonSealed.java b/plugins/java-decompiler/engine/testData/src/sealed/ClassNonSealed.java index 9474dc34d45b..7cce7db9e540 100644 --- a/plugins/java-decompiler/engine/testData/src/sealed/ClassNonSealed.java +++ b/plugins/java-decompiler/engine/testData/src/sealed/ClassNonSealed.java @@ -1,4 +1,4 @@ package sealed; -non-sealed class ClassNonSealed extends RootWithClassOuter { +non-sealed class ClassNonSealed extends RootWithClassOuter implements RootWithInterfaceInnerAndOuter{ } \ No newline at end of file diff --git a/plugins/java-decompiler/engine/testData/src/sealed/ClassNonSealedExtendsImplements.java b/plugins/java-decompiler/engine/testData/src/sealed/ClassNonSealedExtendsImplements.java new file mode 100644 index 000000000000..f943b3343af1 --- /dev/null +++ b/plugins/java-decompiler/engine/testData/src/sealed/ClassNonSealedExtendsImplements.java @@ -0,0 +1,4 @@ +package sealed; + +non-sealed class ClassNonSealedExtendsImplements extends RootWithClassOuter implements RootWithInterfaceOuter { +} \ No newline at end of file diff --git a/plugins/java-decompiler/engine/testData/src/sealed/ClassNonSealedImplements.java b/plugins/java-decompiler/engine/testData/src/sealed/ClassNonSealedImplements.java deleted file mode 100644 index 05683a1216b8..000000000000 --- a/plugins/java-decompiler/engine/testData/src/sealed/ClassNonSealedImplements.java +++ /dev/null @@ -1,4 +0,0 @@ -package sealed; - -non-sealed class ClassNonSealedImplements extends RootWithClassOuter implements RootWithInterfaceOuter { -} \ No newline at end of file diff --git a/plugins/java-decompiler/engine/testData/src/sealed/RootWithClassInner.java b/plugins/java-decompiler/engine/testData/src/sealed/RootWithClassInner.java index 123872914972..cd6136f3b5f0 100644 --- a/plugins/java-decompiler/engine/testData/src/sealed/RootWithClassInner.java +++ b/plugins/java-decompiler/engine/testData/src/sealed/RootWithClassInner.java @@ -1,6 +1,6 @@ package sealed; -sealed interface RootWithClassInner { - final class Inner implements RootWithClassInner { +sealed class RootWithClassInner { + static final class Inner extends RootWithClassInner { } } \ No newline at end of file diff --git a/plugins/java-decompiler/engine/testData/src/sealed/RootWithClassOuter.java b/plugins/java-decompiler/engine/testData/src/sealed/RootWithClassOuter.java index f905293a770a..87c9a5705f98 100644 --- a/plugins/java-decompiler/engine/testData/src/sealed/RootWithClassOuter.java +++ b/plugins/java-decompiler/engine/testData/src/sealed/RootWithClassOuter.java @@ -1,4 +1,4 @@ package sealed; -abstract sealed class RootWithClassOuter permits ClassExtends, ClassNonSealed, ClassNonSealedImplements { +abstract sealed class RootWithClassOuter permits ClassExtends, ClassNonSealed, ClassNonSealedExtendsImplements { } \ No newline at end of file diff --git a/plugins/java-decompiler/engine/testData/src/sealed/RootWithInterfaceInnerAndOuter.java b/plugins/java-decompiler/engine/testData/src/sealed/RootWithInterfaceInnerAndOuter.java new file mode 100644 index 000000000000..cd5e0b75aafd --- /dev/null +++ b/plugins/java-decompiler/engine/testData/src/sealed/RootWithInterfaceInnerAndOuter.java @@ -0,0 +1,6 @@ +package sealed; + +sealed interface RootWithInterfaceInnerAndOuter permits RootWithInterfaceInnerAndOuter.Inner, ClassNonSealed { + final class Inner implements RootWithInterfaceInnerAndOuter { + } +} \ No newline at end of file diff --git a/plugins/java-decompiler/engine/testData/src/sealed/RootWithInterfaceOuter.java b/plugins/java-decompiler/engine/testData/src/sealed/RootWithInterfaceOuter.java index e29d379886f0..28ad047d7514 100644 --- a/plugins/java-decompiler/engine/testData/src/sealed/RootWithInterfaceOuter.java +++ b/plugins/java-decompiler/engine/testData/src/sealed/RootWithInterfaceOuter.java @@ -1,4 +1,4 @@ package sealed; -sealed interface RootWithInterfaceOuter permits FinalImplements, InterfaceNonSealed, ClassNonSealedImplements { +sealed interface RootWithInterfaceOuter permits ClassImplements, InterfaceNonSealed, ClassNonSealedExtendsImplements { } \ No newline at end of file