Converter from Java: do not produce class object for just private methods + fixed bug with unnecessary static member qualification

This commit is contained in:
Valentin Kipyatkov
2014-06-11 16:17:05 +04:00
parent b00316f93a
commit ab714f168c
15 changed files with 228 additions and 5 deletions
+19 -3
View File
@@ -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<PrimaryConstructor>()).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<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 classObjectMembers = ArrayList<MemberWithComments>()
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 {
@@ -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<PsiClass>()) != target.getContainingClass()
&& !PsiTreeUtil.isAncestor(target.getContainingClass(), expression, true)
&& !isStaticallyImported(target, expression)) {
var member: PsiMember = target
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 */
@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);
@@ -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() {
}
}