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 fcb5e012e85f..3a20fe5ebaba 100644 Binary files a/plugins/java-decompiler/engine/testData/classes/sealed/ClassNonSealed.class and b/plugins/java-decompiler/engine/testData/classes/sealed/ClassNonSealed.class differ 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 000000000000..b91161c7a133 Binary files /dev/null and b/plugins/java-decompiler/engine/testData/classes/sealed/RootWithInterfaceInnerAndOuter$Inner.class differ 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 000000000000..48ee6c8eeb20 Binary files /dev/null and b/plugins/java-decompiler/engine/testData/classes/sealed/RootWithInterfaceInnerAndOuter.class differ diff --git a/plugins/java-decompiler/engine/testData/classes/typeAnnotations/L.class b/plugins/java-decompiler/engine/testData/classes/typeAnnotations/L.class new file mode 100644 index 000000000000..c31d77ae81d5 Binary files /dev/null and b/plugins/java-decompiler/engine/testData/classes/typeAnnotations/L.class differ diff --git a/plugins/java-decompiler/engine/testData/classes/typeAnnotations/LocalTypeAnnotations.class b/plugins/java-decompiler/engine/testData/classes/typeAnnotations/LocalTypeAnnotations.class new file mode 100644 index 000000000000..1898a67497c6 Binary files /dev/null and b/plugins/java-decompiler/engine/testData/classes/typeAnnotations/LocalTypeAnnotations.class differ 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