Converter from Java: do not produce class object for just private methods + fixed bug with unnecessary static member qualification
This commit is contained in:
@@ -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)
|
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<PrimaryConstructor>()).firstOrNull()
|
val primaryConstructor = constructors.map { it.member }.filterIsInstance(javaClass<PrimaryConstructor>()).firstOrNull()
|
||||||
val secondaryConstructors = constructors.filter { it.member is SecondaryConstructor }
|
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<PsiClass>()).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<MemberWithComments>()
|
val normalMembers = ArrayList<MemberWithComments>()
|
||||||
val classObjectMembers = ArrayList<MemberWithComments>()
|
val classObjectMembers = ArrayList<MemberWithComments>()
|
||||||
for((psiMember, member) in membersMap) {
|
for ((psiMember, member) in membersMap) {
|
||||||
if (member.member is Constructor) continue
|
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)
|
classObjectMembers.add(member)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|||||||
@@ -328,7 +328,7 @@ class ExpressionVisitor(private val converter: Converter,
|
|||||||
if (target is PsiMember
|
if (target is PsiMember
|
||||||
&& target.hasModifierProperty(PsiModifier.STATIC)
|
&& target.hasModifierProperty(PsiModifier.STATIC)
|
||||||
&& target.getContainingClass() != null
|
&& target.getContainingClass() != null
|
||||||
&& PsiTreeUtil.getParentOfType(expression, javaClass<PsiClass>()) != target.getContainingClass()
|
&& !PsiTreeUtil.isAncestor(target.getContainingClass(), expression, true)
|
||||||
&& !isStaticallyImported(target, expression)) {
|
&& !isStaticallyImported(target, expression)) {
|
||||||
var member: PsiMember = target
|
var member: PsiMember = target
|
||||||
var code = Identifier(referencedName).toKotlin()
|
var code = Identifier(referencedName).toKotlin()
|
||||||
|
|||||||
@@ -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 */
|
/** This class is generated by {@link org.jetbrains.jet.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */
|
||||||
@SuppressWarnings("all")
|
@SuppressWarnings("all")
|
||||||
@TestMetadata("j2k/tests/testData/ast")
|
@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 class JavaToKotlinConverterTestGenerated extends AbstractJavaToKotlinConverterTest {
|
||||||
public void testAllFilesPresentInAst() throws Exception {
|
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);
|
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");
|
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")
|
@TestMetadata("kt-1016.java")
|
||||||
public void testKt_1016() throws Exception {
|
public void testKt_1016() throws Exception {
|
||||||
doTest("j2k/tests/testData/ast/issues/kt-1016.java");
|
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")
|
@TestMetadata("j2k/tests/testData/ast/superExpression")
|
||||||
public static class SuperExpression extends AbstractJavaToKotlinConverterTest {
|
public static class SuperExpression extends AbstractJavaToKotlinConverterTest {
|
||||||
public void testAllFilesPresentInSuperExpression() throws Exception {
|
public void testAllFilesPresentInSuperExpression() throws Exception {
|
||||||
@@ -2763,6 +2801,7 @@ public class JavaToKotlinConverterTestGenerated extends AbstractJavaToKotlinConv
|
|||||||
suite.addTestSuite(ReturnStatement.class);
|
suite.addTestSuite(ReturnStatement.class);
|
||||||
suite.addTestSuite(Settings.class);
|
suite.addTestSuite(Settings.class);
|
||||||
suite.addTestSuite(StarProjectionType.class);
|
suite.addTestSuite(StarProjectionType.class);
|
||||||
|
suite.addTestSuite(StaticMembers.class);
|
||||||
suite.addTestSuite(SuperExpression.class);
|
suite.addTestSuite(SuperExpression.class);
|
||||||
suite.addTestSuite(Switch.class);
|
suite.addTestSuite(Switch.class);
|
||||||
suite.addTestSuite(SynchronizedStatement.class);
|
suite.addTestSuite(SynchronizedStatement.class);
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
//file
|
||||||
|
class Outer {
|
||||||
|
public static Object o = new Object();
|
||||||
|
|
||||||
|
public static class Nested {
|
||||||
|
public void foo() {
|
||||||
|
o = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
class Outer() {
|
||||||
|
|
||||||
|
public class Nested() {
|
||||||
|
public fun foo() {
|
||||||
|
o = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class object {
|
||||||
|
public var o: Any? = Object()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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(){}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
class A() {
|
||||||
|
|
||||||
|
public fun foo() {
|
||||||
|
privateStatic1()
|
||||||
|
privateStatic2()
|
||||||
|
}
|
||||||
|
|
||||||
|
class object {
|
||||||
|
private val s: String = "abc"
|
||||||
|
|
||||||
|
private fun privateStatic1() {
|
||||||
|
}
|
||||||
|
private fun privateStatic2() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
//file
|
||||||
|
class A {
|
||||||
|
public void foo() {
|
||||||
|
privateStatic1();
|
||||||
|
privateStatic2();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void privateStatic1(){}
|
||||||
|
private static void privateStatic2(){}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
class A() {
|
||||||
|
public fun foo() {
|
||||||
|
privateStatic1()
|
||||||
|
privateStatic2()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun privateStatic1() {
|
||||||
|
}
|
||||||
|
private fun privateStatic2() {
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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(){}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
class A() {
|
||||||
|
public fun foo() {
|
||||||
|
privateStatic1()
|
||||||
|
privateStatic2()
|
||||||
|
}
|
||||||
|
|
||||||
|
class object {
|
||||||
|
|
||||||
|
public fun publicStatic() {
|
||||||
|
privateStatic1()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun privateStatic1() {
|
||||||
|
}
|
||||||
|
private fun privateStatic2() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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(){}
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
class A() {
|
||||||
|
public class Nested() {
|
||||||
|
fun foo() {
|
||||||
|
privateStatic1()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun bar() {
|
||||||
|
privateStatic2()
|
||||||
|
}
|
||||||
|
|
||||||
|
class object {
|
||||||
|
|
||||||
|
private fun privateStatic1() {
|
||||||
|
}
|
||||||
|
private fun privateStatic2() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
//file
|
||||||
|
class A {
|
||||||
|
public class Inner {
|
||||||
|
void foo() {
|
||||||
|
privateStatic1();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void bar() {
|
||||||
|
privateStatic2();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void privateStatic1(){}
|
||||||
|
private static void privateStatic2(){}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
class A() {
|
||||||
|
public inner class Inner() {
|
||||||
|
fun foo() {
|
||||||
|
privateStatic1()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun bar() {
|
||||||
|
privateStatic2()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun privateStatic1() {
|
||||||
|
}
|
||||||
|
private fun privateStatic2() {
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user