From 4667947315bf3ded90128d1a4b4fd3d2770cf04c Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Thu, 22 Dec 2016 22:27:55 +0300 Subject: [PATCH] Kapt3: Nested class inside an interface should always be public and static (KT-15145) --- .../kapt3/stubs/ClassFileToSourceStubConverter.kt | 15 ++++++++++++--- ...assFileToSourceStubConverterTestGenerated.java | 6 ++++++ plugins/kapt3/testData/converter/kt15145.kt | 4 ++++ plugins/kapt3/testData/converter/kt15145.txt | 11 +++++++++++ 4 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 plugins/kapt3/testData/converter/kt15145.kt create mode 100644 plugins/kapt3/testData/converter/kt15145.txt diff --git a/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt b/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt index 799f358119a..6f0d2fd6dad 100644 --- a/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt +++ b/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt @@ -135,9 +135,18 @@ class ClassFileToSourceStubConverter( val isNested = (descriptor as? ClassDescriptor)?.isNested ?: false val isInner = isNested && (descriptor as? ClassDescriptor)?.isInner ?: false - val modifiers = convertModifiers( - if (!isInner && isNested) (clazz.access or Opcodes.ACC_STATIC) else clazz.access, - ElementKind.CLASS, packageFqName, clazz.visibleAnnotations, clazz.invisibleAnnotations) + val flags = when { + (descriptor.containingDeclaration as? ClassDescriptor)?.kind == ClassKind.INTERFACE -> { + // Classes inside interfaces should always be public and static. + // See com.sun.tools.javac.comp.Enter.visitClassDef for more information. + (clazz.access or Opcodes.ACC_PUBLIC or Opcodes.ACC_STATIC) and + Opcodes.ACC_PRIVATE.inv() and Opcodes.ACC_PROTECTED.inv() // Remove private and protected modifiers + } + !isInner && isNested -> clazz.access or Opcodes.ACC_STATIC + else -> clazz.access + } + + val modifiers = convertModifiers(flags, ElementKind.CLASS, packageFqName, clazz.visibleAnnotations, clazz.invisibleAnnotations) val isEnum = clazz.isEnum() val isAnnotation = clazz.isAnnotation() diff --git a/plugins/kapt3/test/org/jetbrains/kotlin/kapt3/test/ClassFileToSourceStubConverterTestGenerated.java b/plugins/kapt3/test/org/jetbrains/kotlin/kapt3/test/ClassFileToSourceStubConverterTestGenerated.java index 443dc1717ef..e97a725abe8 100644 --- a/plugins/kapt3/test/org/jetbrains/kotlin/kapt3/test/ClassFileToSourceStubConverterTestGenerated.java +++ b/plugins/kapt3/test/org/jetbrains/kotlin/kapt3/test/ClassFileToSourceStubConverterTestGenerated.java @@ -144,6 +144,12 @@ public class ClassFileToSourceStubConverterTestGenerated extends AbstractClassFi doTest(fileName); } + @TestMetadata("kt15145.kt") + public void testKt15145() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("plugins/kapt3/testData/converter/kt15145.kt"); + doTest(fileName); + } + @TestMetadata("mapEntry.kt") public void testMapEntry() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("plugins/kapt3/testData/converter/mapEntry.kt"); diff --git a/plugins/kapt3/testData/converter/kt15145.kt b/plugins/kapt3/testData/converter/kt15145.kt new file mode 100644 index 00000000000..656636c750e --- /dev/null +++ b/plugins/kapt3/testData/converter/kt15145.kt @@ -0,0 +1,4 @@ +interface MyInterface { + fun someFun() + private class MyDefaultInferface() +} \ No newline at end of file diff --git a/plugins/kapt3/testData/converter/kt15145.txt b/plugins/kapt3/testData/converter/kt15145.txt new file mode 100644 index 00000000000..51a0c3f6d8e --- /dev/null +++ b/plugins/kapt3/testData/converter/kt15145.txt @@ -0,0 +1,11 @@ +public abstract interface MyInterface { + + public abstract void someFun(); + + public static final class MyDefaultInferface { + + public MyDefaultInferface() { + super(); + } + } +}