diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 9944ae30da0..9ba3e1b13a1 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -126,6 +126,8 @@ public class Converter { final Set modifiers = modifiersListToModifiersSet(method.getModifierList()); if (method.getHierarchicalMethodSignature().getSuperSignatures().size() > 0) modifiers.add(Modifier.OVERRIDE); + if (method.getParent() instanceof PsiClass && ((PsiClass) method.getParent()).isInterface()) + modifiers.remove(Modifier.ABSTRACT); if (method.isConstructor()) return new Constructor( @@ -288,6 +290,7 @@ public class Converter { public static Set modifiersListToModifiersSet(PsiModifierList modifierList) { HashSet modifiersSet = new HashSet(); if (modifierList != null) { + if (modifierList.hasModifierProperty(PsiModifier.ABSTRACT)) modifiersSet.add(Modifier.ABSTRACT); if (modifierList.hasModifierProperty(PsiModifier.FINAL)) modifiersSet.add(Modifier.FINAL); if (modifierList.hasModifierProperty(PsiModifier.STATIC)) modifiersSet.add(Modifier.STATIC); if (modifierList.hasModifierProperty(PsiModifier.PUBLIC)) modifiersSet.add(Modifier.PUBLIC); diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java index 87c05308f31..302c6c467ad 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -76,6 +76,9 @@ public class Class extends Member { String modifiersToKotlin() { List modifierList = new LinkedList(); + if (needAbstractModifier()) + modifierList.add(Modifier.ABSTRACT); + modifierList.add(accessModifier()); if (needOpenModifier()) @@ -91,6 +94,10 @@ public class Class extends Member { return !myModifiers.contains(Modifier.FINAL); } + boolean needAbstractModifier() { + return isAbstract(); + } + String bodyToKotlin() { return classObjectToKotlin() + N + AstUtil.joinNodes(getNonStatic(myFields), N) + N + diff --git a/src/org/jetbrains/jet/j2k/ast/Field.java b/src/org/jetbrains/jet/j2k/ast/Field.java index 8efc6b4fb8a..60839930067 100644 --- a/src/org/jetbrains/jet/j2k/ast/Field.java +++ b/src/org/jetbrains/jet/j2k/ast/Field.java @@ -25,6 +25,9 @@ public class Field extends Member { String modifiersToKotlin() { List modifierList = new LinkedList(); + if (isAbstract()) + modifierList.add(Modifier.ABSTRACT); + modifierList.add(accessModifier()); modifierList.add(myModifiers.contains(Modifier.FINAL) ? "val" : "var"); diff --git a/src/org/jetbrains/jet/j2k/ast/Function.java b/src/org/jetbrains/jet/j2k/ast/Function.java index cd9d435cf71..bfdfca1c769 100644 --- a/src/org/jetbrains/jet/j2k/ast/Function.java +++ b/src/org/jetbrains/jet/j2k/ast/Function.java @@ -51,6 +51,9 @@ public class Function extends Member { String modifiersToKotlin() { List modifierList = new LinkedList(); + if (isAbstract()) + modifierList.add(Modifier.ABSTRACT); + if (myModifiers.contains(Modifier.OVERRIDE)) modifierList.add(Modifier.OVERRIDE); diff --git a/src/org/jetbrains/jet/j2k/ast/IMember.java b/src/org/jetbrains/jet/j2k/ast/IMember.java index 98f4fb46a20..9c3b406f3be 100644 --- a/src/org/jetbrains/jet/j2k/ast/IMember.java +++ b/src/org/jetbrains/jet/j2k/ast/IMember.java @@ -5,4 +5,6 @@ package org.jetbrains.jet.j2k.ast; */ public interface IMember extends INode { public boolean isStatic(); + + boolean isAbstract(); } diff --git a/src/org/jetbrains/jet/j2k/ast/Member.java b/src/org/jetbrains/jet/j2k/ast/Member.java index a93b8104777..e0fff02e4c3 100644 --- a/src/org/jetbrains/jet/j2k/ast/Member.java +++ b/src/org/jetbrains/jet/j2k/ast/Member.java @@ -15,6 +15,11 @@ public abstract class Member extends Node implements IMember { return EMPTY; // package local converted to internal, but we use internal by default } + @Override + public boolean isAbstract() { + return myModifiers.contains(Modifier.ABSTRACT); + } + @Override public boolean isStatic() { return myModifiers.contains(Modifier.STATIC); diff --git a/src/org/jetbrains/jet/j2k/ast/Trait.java b/src/org/jetbrains/jet/j2k/ast/Trait.java index dcf23b4eca7..d450bef933d 100644 --- a/src/org/jetbrains/jet/j2k/ast/Trait.java +++ b/src/org/jetbrains/jet/j2k/ast/Trait.java @@ -17,4 +17,8 @@ public class Trait extends Class { boolean needOpenModifier() { return false; } + + boolean needAbstractModifier() { + return false; + } } diff --git a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java index cfbc8e24a8a..67b8a051b86 100644 --- a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java +++ b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java @@ -33,7 +33,10 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { String javaPath = getTestDataPath() + File.separator + getTestFilePath(); String kotlinPath = javaPath.replace(".jav", ".kt"); - final String expected = readFileToString(new File(kotlinPath)); + final File kotlinFile = new File(kotlinPath); + if (!kotlinFile.exists()) + writeStringToFile(kotlinFile, ""); + final String expected = readFileToString(kotlinFile); final File javaFile = new File(javaPath); final String javaCode = readFileToString(javaFile); diff --git a/testData/ast/class/class/abstractClass.jav b/testData/ast/class/class/abstractClass.jav new file mode 100644 index 00000000000..0ff487db135 --- /dev/null +++ b/testData/ast/class/class/abstractClass.jav @@ -0,0 +1,7 @@ +abstract class A { + abstract void callme(); + + void callmetoo() { + print("This is a concrete method."); + } +} \ No newline at end of file diff --git a/testData/ast/class/class/abstractClass.kt b/testData/ast/class/class/abstractClass.kt new file mode 100644 index 00000000000..38c5d667a48 --- /dev/null +++ b/testData/ast/class/class/abstractClass.kt @@ -0,0 +1,6 @@ +abstract open class A { +abstract fun callme() : Unit +fun callmetoo() : Unit { +print("This is a concrete method.") +} +} \ No newline at end of file diff --git a/testData/ast/class/class/abstractClassShape.jav b/testData/ast/class/class/abstractClassShape.jav new file mode 100644 index 00000000000..9cf102a0c6b --- /dev/null +++ b/testData/ast/class/class/abstractClassShape.jav @@ -0,0 +1,12 @@ +abstract class Shape { + public String color; + public Shape() { + } + public void setColor(String c) { + color = c; + } + public String getColor() { + return color; + } + abstract public double area(); +} \ No newline at end of file diff --git a/testData/ast/class/class/abstractClassShape.kt b/testData/ast/class/class/abstractClassShape.kt new file mode 100644 index 00000000000..9237e4ca894 --- /dev/null +++ b/testData/ast/class/class/abstractClassShape.kt @@ -0,0 +1,10 @@ +abstract open class Shape { +public var color : String? +public fun setColor(c : String?) : Unit { +color = c +} +public fun getColor() : String? { +return color +} +abstract public fun area() : Double +} \ No newline at end of file diff --git a/testData/ast/function/method/abstractMethod.jav b/testData/ast/function/method/abstractMethod.jav new file mode 100644 index 00000000000..03a2e8270c8 --- /dev/null +++ b/testData/ast/function/method/abstractMethod.jav @@ -0,0 +1 @@ +abstract int getNoofGears(); \ No newline at end of file diff --git a/testData/ast/function/method/abstractMethod.kt b/testData/ast/function/method/abstractMethod.kt new file mode 100644 index 00000000000..8163dfad9bb --- /dev/null +++ b/testData/ast/function/method/abstractMethod.kt @@ -0,0 +1 @@ +abstract fun getNoofGears() : Int \ No newline at end of file