From ab714f168c4cff3341fddcd21f8944079983fd3c Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 11 Jun 2014 16:17:05 +0400 Subject: [PATCH] Converter from Java: do not produce class object for just private methods + fixed bug with unnecessary static member qualification --- j2k/src/org/jetbrains/jet/j2k/Converter.kt | 22 ++++++++-- .../jet/j2k/visitors/ExpressionVisitor.kt | 2 +- .../JavaToKotlinConverterTestGenerated.java | 41 ++++++++++++++++++- .../ast/issues/doNotQualifyStatic.java | 10 +++++ .../testData/ast/issues/doNotQualifyStatic.kt | 12 ++++++ .../staticMembers/PrivateStaticMembers.java | 12 ++++++ .../ast/staticMembers/PrivateStaticMembers.kt | 16 ++++++++ .../staticMembers/PrivateStaticMethods1.java | 10 +++++ .../staticMembers/PrivateStaticMethods1.kt | 11 +++++ .../staticMembers/PrivateStaticMethods2.java | 14 +++++++ .../staticMembers/PrivateStaticMethods2.kt | 18 ++++++++ .../staticMembers/PrivateStaticMethods3.java | 15 +++++++ .../staticMembers/PrivateStaticMethods3.kt | 19 +++++++++ .../staticMembers/PrivateStaticMethods4.java | 15 +++++++ .../staticMembers/PrivateStaticMethods4.kt | 16 ++++++++ 15 files changed, 228 insertions(+), 5 deletions(-) create mode 100644 j2k/tests/testData/ast/issues/doNotQualifyStatic.java create mode 100644 j2k/tests/testData/ast/issues/doNotQualifyStatic.kt create mode 100644 j2k/tests/testData/ast/staticMembers/PrivateStaticMembers.java create mode 100644 j2k/tests/testData/ast/staticMembers/PrivateStaticMembers.kt create mode 100644 j2k/tests/testData/ast/staticMembers/PrivateStaticMethods1.java create mode 100644 j2k/tests/testData/ast/staticMembers/PrivateStaticMethods1.kt create mode 100644 j2k/tests/testData/ast/staticMembers/PrivateStaticMethods2.java create mode 100644 j2k/tests/testData/ast/staticMembers/PrivateStaticMethods2.kt create mode 100644 j2k/tests/testData/ast/staticMembers/PrivateStaticMethods3.java create mode 100644 j2k/tests/testData/ast/staticMembers/PrivateStaticMethods3.kt create mode 100644 j2k/tests/testData/ast/staticMembers/PrivateStaticMethods4.java create mode 100644 j2k/tests/testData/ast/staticMembers/PrivateStaticMethods4.kt diff --git a/j2k/src/org/jetbrains/jet/j2k/Converter.kt b/j2k/src/org/jetbrains/jet/j2k/Converter.kt index d935e618f20..2f0534fbde6 100644 --- a/j2k/src/org/jetbrains/jet/j2k/Converter.kt +++ b/j2k/src/org/jetbrains/jet/j2k/Converter.kt @@ -95,7 +95,7 @@ public class Converter private(val project: Project, val settings: ConverterSett } } - for(member in membersToRemove) { + for (member in membersToRemove) { convertedElements.remove(member) } @@ -105,11 +105,27 @@ public class Converter private(val project: Project, val settings: ConverterSett val primaryConstructor = constructors.map { it.member }.filterIsInstance(javaClass()).firstOrNull() val secondaryConstructors = constructors.filter { it.member is SecondaryConstructor } + // do not convert private static methods into class object if possible + val useClassObject = if (psiClass.isEnum()) { + false + } + else { + val members = membersMap.keySet().filter { it !is PsiMethod || !it.isConstructor() } + val classObjectMembers = members.filter { it !is PsiClass && it.hasModifierProperty(PsiModifier.STATIC) } + val nestedClasses = members.filterIsInstance(javaClass()).filter { it.hasModifierProperty(PsiModifier.STATIC) } + if (classObjectMembers.all { it is PsiMethod && it.hasModifierProperty(PsiModifier.PRIVATE) }) { + nestedClasses.any { nestedClass -> classObjectMembers.any { findMethodCalls(it as PsiMethod, nestedClass).isNotEmpty() } } + } + else { + true + } + } + val normalMembers = ArrayList() val classObjectMembers = ArrayList() - for((psiMember, member) in membersMap) { + for ((psiMember, member) in membersMap) { if (member.member is Constructor) continue - if (!psiClass.isEnum() && psiMember !is PsiClass && psiMember.hasModifierProperty(PsiModifier.STATIC)) { + if (useClassObject && psiMember !is PsiClass && psiMember.hasModifierProperty(PsiModifier.STATIC)) { classObjectMembers.add(member) } else { diff --git a/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt b/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt index 35e234b3e6a..49af8936c60 100644 --- a/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt +++ b/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt @@ -328,7 +328,7 @@ class ExpressionVisitor(private val converter: Converter, if (target is PsiMember && target.hasModifierProperty(PsiModifier.STATIC) && target.getContainingClass() != null - && PsiTreeUtil.getParentOfType(expression, javaClass()) != target.getContainingClass() + && !PsiTreeUtil.isAncestor(target.getContainingClass(), expression, true) && !isStaticallyImported(target, expression)) { var member: PsiMember = target var code = Identifier(referencedName).toKotlin() diff --git a/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java b/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java index 58f40257970..fbd629f6dcb 100644 --- a/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java +++ b/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java @@ -31,7 +31,7 @@ import org.jetbrains.jet.j2k.test.AbstractJavaToKotlinConverterTest; /** This class is generated by {@link org.jetbrains.jet.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ @SuppressWarnings("all") @TestMetadata("j2k/tests/testData/ast") -@InnerTestClasses({JavaToKotlinConverterTestGenerated.Annotations.class, JavaToKotlinConverterTestGenerated.AnonymousBlock.class, JavaToKotlinConverterTestGenerated.ArrayAccessExpression.class, JavaToKotlinConverterTestGenerated.ArrayInitializerExpression.class, JavaToKotlinConverterTestGenerated.ArrayType.class, JavaToKotlinConverterTestGenerated.AssertStatement.class, JavaToKotlinConverterTestGenerated.AssignmentExpression.class, JavaToKotlinConverterTestGenerated.BinaryExpression.class, JavaToKotlinConverterTestGenerated.BoxedType.class, JavaToKotlinConverterTestGenerated.BreakStatement.class, JavaToKotlinConverterTestGenerated.CallChainExpression.class, JavaToKotlinConverterTestGenerated.Class.class, JavaToKotlinConverterTestGenerated.ClassExpression.class, JavaToKotlinConverterTestGenerated.ConditionalExpression.class, JavaToKotlinConverterTestGenerated.Constructors.class, JavaToKotlinConverterTestGenerated.ContinueStatement.class, JavaToKotlinConverterTestGenerated.DeclarationStatement.class, JavaToKotlinConverterTestGenerated.DoWhileStatement.class, JavaToKotlinConverterTestGenerated.Enum.class, JavaToKotlinConverterTestGenerated.Equals.class, JavaToKotlinConverterTestGenerated.Field.class, JavaToKotlinConverterTestGenerated.For.class, JavaToKotlinConverterTestGenerated.ForeachStatement.class, JavaToKotlinConverterTestGenerated.Formatting.class, JavaToKotlinConverterTestGenerated.Function.class, JavaToKotlinConverterTestGenerated.Identifier.class, JavaToKotlinConverterTestGenerated.IfStatement.class, JavaToKotlinConverterTestGenerated.ImportStatement.class, JavaToKotlinConverterTestGenerated.InProjectionType.class, JavaToKotlinConverterTestGenerated.Inheritance.class, JavaToKotlinConverterTestGenerated.IsOperator.class, JavaToKotlinConverterTestGenerated.Issues.class, JavaToKotlinConverterTestGenerated.KotlinApiAccess.class, JavaToKotlinConverterTestGenerated.KotlinExclusion.class, JavaToKotlinConverterTestGenerated.LabelStatement.class, JavaToKotlinConverterTestGenerated.List.class, JavaToKotlinConverterTestGenerated.LiteralExpression.class, JavaToKotlinConverterTestGenerated.LocalVariable.class, JavaToKotlinConverterTestGenerated.MethodCallExpression.class, JavaToKotlinConverterTestGenerated.Misc.class, JavaToKotlinConverterTestGenerated.NewClassExpression.class, JavaToKotlinConverterTestGenerated.Nullability.class, JavaToKotlinConverterTestGenerated.ObjectLiteral.class, JavaToKotlinConverterTestGenerated.OutProjectionType.class, JavaToKotlinConverterTestGenerated.PackageStatement.class, JavaToKotlinConverterTestGenerated.ParenthesizedExpression.class, JavaToKotlinConverterTestGenerated.PolyadicExpression.class, JavaToKotlinConverterTestGenerated.PostfixOperator.class, JavaToKotlinConverterTestGenerated.PrefixOperator.class, JavaToKotlinConverterTestGenerated.RawGenerics.class, JavaToKotlinConverterTestGenerated.ReturnStatement.class, JavaToKotlinConverterTestGenerated.Settings.class, JavaToKotlinConverterTestGenerated.StarProjectionType.class, JavaToKotlinConverterTestGenerated.SuperExpression.class, JavaToKotlinConverterTestGenerated.Switch.class, JavaToKotlinConverterTestGenerated.SynchronizedStatement.class, JavaToKotlinConverterTestGenerated.ThisExpression.class, JavaToKotlinConverterTestGenerated.ThrowStatement.class, JavaToKotlinConverterTestGenerated.Trait.class, JavaToKotlinConverterTestGenerated.TryStatement.class, JavaToKotlinConverterTestGenerated.TryWithResource.class, JavaToKotlinConverterTestGenerated.TypeCastExpression.class, JavaToKotlinConverterTestGenerated.TypeParameters.class, JavaToKotlinConverterTestGenerated.VarArg.class, JavaToKotlinConverterTestGenerated.WhileStatement.class}) +@InnerTestClasses({JavaToKotlinConverterTestGenerated.Annotations.class, JavaToKotlinConverterTestGenerated.AnonymousBlock.class, JavaToKotlinConverterTestGenerated.ArrayAccessExpression.class, JavaToKotlinConverterTestGenerated.ArrayInitializerExpression.class, JavaToKotlinConverterTestGenerated.ArrayType.class, JavaToKotlinConverterTestGenerated.AssertStatement.class, JavaToKotlinConverterTestGenerated.AssignmentExpression.class, JavaToKotlinConverterTestGenerated.BinaryExpression.class, JavaToKotlinConverterTestGenerated.BoxedType.class, JavaToKotlinConverterTestGenerated.BreakStatement.class, JavaToKotlinConverterTestGenerated.CallChainExpression.class, JavaToKotlinConverterTestGenerated.Class.class, JavaToKotlinConverterTestGenerated.ClassExpression.class, JavaToKotlinConverterTestGenerated.ConditionalExpression.class, JavaToKotlinConverterTestGenerated.Constructors.class, JavaToKotlinConverterTestGenerated.ContinueStatement.class, JavaToKotlinConverterTestGenerated.DeclarationStatement.class, JavaToKotlinConverterTestGenerated.DoWhileStatement.class, JavaToKotlinConverterTestGenerated.Enum.class, JavaToKotlinConverterTestGenerated.Equals.class, JavaToKotlinConverterTestGenerated.Field.class, JavaToKotlinConverterTestGenerated.For.class, JavaToKotlinConverterTestGenerated.ForeachStatement.class, JavaToKotlinConverterTestGenerated.Formatting.class, JavaToKotlinConverterTestGenerated.Function.class, JavaToKotlinConverterTestGenerated.Identifier.class, JavaToKotlinConverterTestGenerated.IfStatement.class, JavaToKotlinConverterTestGenerated.ImportStatement.class, JavaToKotlinConverterTestGenerated.InProjectionType.class, JavaToKotlinConverterTestGenerated.Inheritance.class, JavaToKotlinConverterTestGenerated.IsOperator.class, JavaToKotlinConverterTestGenerated.Issues.class, JavaToKotlinConverterTestGenerated.KotlinApiAccess.class, JavaToKotlinConverterTestGenerated.KotlinExclusion.class, JavaToKotlinConverterTestGenerated.LabelStatement.class, JavaToKotlinConverterTestGenerated.List.class, JavaToKotlinConverterTestGenerated.LiteralExpression.class, JavaToKotlinConverterTestGenerated.LocalVariable.class, JavaToKotlinConverterTestGenerated.MethodCallExpression.class, JavaToKotlinConverterTestGenerated.Misc.class, JavaToKotlinConverterTestGenerated.NewClassExpression.class, JavaToKotlinConverterTestGenerated.Nullability.class, JavaToKotlinConverterTestGenerated.ObjectLiteral.class, JavaToKotlinConverterTestGenerated.OutProjectionType.class, JavaToKotlinConverterTestGenerated.PackageStatement.class, JavaToKotlinConverterTestGenerated.ParenthesizedExpression.class, JavaToKotlinConverterTestGenerated.PolyadicExpression.class, JavaToKotlinConverterTestGenerated.PostfixOperator.class, JavaToKotlinConverterTestGenerated.PrefixOperator.class, JavaToKotlinConverterTestGenerated.RawGenerics.class, JavaToKotlinConverterTestGenerated.ReturnStatement.class, JavaToKotlinConverterTestGenerated.Settings.class, JavaToKotlinConverterTestGenerated.StarProjectionType.class, JavaToKotlinConverterTestGenerated.StaticMembers.class, JavaToKotlinConverterTestGenerated.SuperExpression.class, JavaToKotlinConverterTestGenerated.Switch.class, JavaToKotlinConverterTestGenerated.SynchronizedStatement.class, JavaToKotlinConverterTestGenerated.ThisExpression.class, JavaToKotlinConverterTestGenerated.ThrowStatement.class, JavaToKotlinConverterTestGenerated.Trait.class, JavaToKotlinConverterTestGenerated.TryStatement.class, JavaToKotlinConverterTestGenerated.TryWithResource.class, JavaToKotlinConverterTestGenerated.TypeCastExpression.class, JavaToKotlinConverterTestGenerated.TypeParameters.class, JavaToKotlinConverterTestGenerated.VarArg.class, JavaToKotlinConverterTestGenerated.WhileStatement.class}) public class JavaToKotlinConverterTestGenerated extends AbstractJavaToKotlinConverterTest { public void testAllFilesPresentInAst() throws Exception { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("j2k/tests/testData/ast"), Pattern.compile("^(.+)\\.java$"), true); @@ -1476,6 +1476,11 @@ public class JavaToKotlinConverterTestGenerated extends AbstractJavaToKotlinConv doTest("j2k/tests/testData/ast/issues/comments.java"); } + @TestMetadata("doNotQualifyStatic.java") + public void testDoNotQualifyStatic() throws Exception { + doTest("j2k/tests/testData/ast/issues/doNotQualifyStatic.java"); + } + @TestMetadata("kt-1016.java") public void testKt_1016() throws Exception { doTest("j2k/tests/testData/ast/issues/kt-1016.java"); @@ -2296,6 +2301,39 @@ public class JavaToKotlinConverterTestGenerated extends AbstractJavaToKotlinConv } + @TestMetadata("j2k/tests/testData/ast/staticMembers") + public static class StaticMembers extends AbstractJavaToKotlinConverterTest { + public void testAllFilesPresentInStaticMembers() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("j2k/tests/testData/ast/staticMembers"), Pattern.compile("^(.+)\\.java$"), true); + } + + @TestMetadata("PrivateStaticMembers.java") + public void testPrivateStaticMembers() throws Exception { + doTest("j2k/tests/testData/ast/staticMembers/PrivateStaticMembers.java"); + } + + @TestMetadata("PrivateStaticMethods1.java") + public void testPrivateStaticMethods1() throws Exception { + doTest("j2k/tests/testData/ast/staticMembers/PrivateStaticMethods1.java"); + } + + @TestMetadata("PrivateStaticMethods2.java") + public void testPrivateStaticMethods2() throws Exception { + doTest("j2k/tests/testData/ast/staticMembers/PrivateStaticMethods2.java"); + } + + @TestMetadata("PrivateStaticMethods3.java") + public void testPrivateStaticMethods3() throws Exception { + doTest("j2k/tests/testData/ast/staticMembers/PrivateStaticMethods3.java"); + } + + @TestMetadata("PrivateStaticMethods4.java") + public void testPrivateStaticMethods4() throws Exception { + doTest("j2k/tests/testData/ast/staticMembers/PrivateStaticMethods4.java"); + } + + } + @TestMetadata("j2k/tests/testData/ast/superExpression") public static class SuperExpression extends AbstractJavaToKotlinConverterTest { public void testAllFilesPresentInSuperExpression() throws Exception { @@ -2763,6 +2801,7 @@ public class JavaToKotlinConverterTestGenerated extends AbstractJavaToKotlinConv suite.addTestSuite(ReturnStatement.class); suite.addTestSuite(Settings.class); suite.addTestSuite(StarProjectionType.class); + suite.addTestSuite(StaticMembers.class); suite.addTestSuite(SuperExpression.class); suite.addTestSuite(Switch.class); suite.addTestSuite(SynchronizedStatement.class); diff --git a/j2k/tests/testData/ast/issues/doNotQualifyStatic.java b/j2k/tests/testData/ast/issues/doNotQualifyStatic.java new file mode 100644 index 00000000000..21c3eddb23c --- /dev/null +++ b/j2k/tests/testData/ast/issues/doNotQualifyStatic.java @@ -0,0 +1,10 @@ +//file +class Outer { + public static Object o = new Object(); + + public static class Nested { + public void foo() { + o = null; + } + } +} diff --git a/j2k/tests/testData/ast/issues/doNotQualifyStatic.kt b/j2k/tests/testData/ast/issues/doNotQualifyStatic.kt new file mode 100644 index 00000000000..d9e1d59ea45 --- /dev/null +++ b/j2k/tests/testData/ast/issues/doNotQualifyStatic.kt @@ -0,0 +1,12 @@ +class Outer() { + + public class Nested() { + public fun foo() { + o = null + } + } + + class object { + public var o: Any? = Object() + } +} \ No newline at end of file diff --git a/j2k/tests/testData/ast/staticMembers/PrivateStaticMembers.java b/j2k/tests/testData/ast/staticMembers/PrivateStaticMembers.java new file mode 100644 index 00000000000..498381b2684 --- /dev/null +++ b/j2k/tests/testData/ast/staticMembers/PrivateStaticMembers.java @@ -0,0 +1,12 @@ +//file +class A { + private static final String s = "abc"; + + public void foo() { + privateStatic1(); + privateStatic2(); + } + + private static void privateStatic1(){} + private static void privateStatic2(){} +} \ No newline at end of file diff --git a/j2k/tests/testData/ast/staticMembers/PrivateStaticMembers.kt b/j2k/tests/testData/ast/staticMembers/PrivateStaticMembers.kt new file mode 100644 index 00000000000..d02168a612e --- /dev/null +++ b/j2k/tests/testData/ast/staticMembers/PrivateStaticMembers.kt @@ -0,0 +1,16 @@ +class A() { + + public fun foo() { + privateStatic1() + privateStatic2() + } + + class object { + private val s: String = "abc" + + private fun privateStatic1() { + } + private fun privateStatic2() { + } + } +} \ No newline at end of file diff --git a/j2k/tests/testData/ast/staticMembers/PrivateStaticMethods1.java b/j2k/tests/testData/ast/staticMembers/PrivateStaticMethods1.java new file mode 100644 index 00000000000..9768e323943 --- /dev/null +++ b/j2k/tests/testData/ast/staticMembers/PrivateStaticMethods1.java @@ -0,0 +1,10 @@ +//file +class A { + public void foo() { + privateStatic1(); + privateStatic2(); + } + + private static void privateStatic1(){} + private static void privateStatic2(){} +} \ No newline at end of file diff --git a/j2k/tests/testData/ast/staticMembers/PrivateStaticMethods1.kt b/j2k/tests/testData/ast/staticMembers/PrivateStaticMethods1.kt new file mode 100644 index 00000000000..229e28304da --- /dev/null +++ b/j2k/tests/testData/ast/staticMembers/PrivateStaticMethods1.kt @@ -0,0 +1,11 @@ +class A() { + public fun foo() { + privateStatic1() + privateStatic2() + } + + private fun privateStatic1() { + } + private fun privateStatic2() { + } +} \ No newline at end of file diff --git a/j2k/tests/testData/ast/staticMembers/PrivateStaticMethods2.java b/j2k/tests/testData/ast/staticMembers/PrivateStaticMethods2.java new file mode 100644 index 00000000000..5b0423188fd --- /dev/null +++ b/j2k/tests/testData/ast/staticMembers/PrivateStaticMethods2.java @@ -0,0 +1,14 @@ +//file +class A { + public void foo() { + privateStatic1(); + privateStatic2(); + } + + public static void publicStatic(){ + privateStatic1(); + } + + private static void privateStatic1(){} + private static void privateStatic2(){} +} \ No newline at end of file diff --git a/j2k/tests/testData/ast/staticMembers/PrivateStaticMethods2.kt b/j2k/tests/testData/ast/staticMembers/PrivateStaticMethods2.kt new file mode 100644 index 00000000000..3b82bb877b5 --- /dev/null +++ b/j2k/tests/testData/ast/staticMembers/PrivateStaticMethods2.kt @@ -0,0 +1,18 @@ +class A() { + public fun foo() { + privateStatic1() + privateStatic2() + } + + class object { + + public fun publicStatic() { + privateStatic1() + } + + private fun privateStatic1() { + } + private fun privateStatic2() { + } + } +} \ No newline at end of file diff --git a/j2k/tests/testData/ast/staticMembers/PrivateStaticMethods3.java b/j2k/tests/testData/ast/staticMembers/PrivateStaticMethods3.java new file mode 100644 index 00000000000..126fea3b83b --- /dev/null +++ b/j2k/tests/testData/ast/staticMembers/PrivateStaticMethods3.java @@ -0,0 +1,15 @@ +//file +class A { + public static class Nested { + void foo() { + privateStatic1(); + } + } + + void bar() { + privateStatic2(); + } + + private static void privateStatic1(){} + private static void privateStatic2(){} +} \ No newline at end of file diff --git a/j2k/tests/testData/ast/staticMembers/PrivateStaticMethods3.kt b/j2k/tests/testData/ast/staticMembers/PrivateStaticMethods3.kt new file mode 100644 index 00000000000..6790b6973dd --- /dev/null +++ b/j2k/tests/testData/ast/staticMembers/PrivateStaticMethods3.kt @@ -0,0 +1,19 @@ +class A() { + public class Nested() { + fun foo() { + privateStatic1() + } + } + + fun bar() { + privateStatic2() + } + + class object { + + private fun privateStatic1() { + } + private fun privateStatic2() { + } + } +} \ No newline at end of file diff --git a/j2k/tests/testData/ast/staticMembers/PrivateStaticMethods4.java b/j2k/tests/testData/ast/staticMembers/PrivateStaticMethods4.java new file mode 100644 index 00000000000..b0696b6fa61 --- /dev/null +++ b/j2k/tests/testData/ast/staticMembers/PrivateStaticMethods4.java @@ -0,0 +1,15 @@ +//file +class A { + public class Inner { + void foo() { + privateStatic1(); + } + } + + void bar() { + privateStatic2(); + } + + private static void privateStatic1(){} + private static void privateStatic2(){} +} \ No newline at end of file diff --git a/j2k/tests/testData/ast/staticMembers/PrivateStaticMethods4.kt b/j2k/tests/testData/ast/staticMembers/PrivateStaticMethods4.kt new file mode 100644 index 00000000000..31929271185 --- /dev/null +++ b/j2k/tests/testData/ast/staticMembers/PrivateStaticMethods4.kt @@ -0,0 +1,16 @@ +class A() { + public inner class Inner() { + fun foo() { + privateStatic1() + } + } + + fun bar() { + privateStatic2() + } + + private fun privateStatic1() { + } + private fun privateStatic2() { + } +} \ No newline at end of file