From b727c1885224c0425b90c1fe3d6203da496e3d7f Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 3 Nov 2011 14:04:33 +0400 Subject: [PATCH] access modifiers support --- src/org/jetbrains/jet/j2k/Converter.java | 13 ++++++--- .../jetbrains/jet/j2k/ast/Constructor.java | 5 ++-- src/org/jetbrains/jet/j2k/ast/Function.java | 27 ++++++++++++++++--- src/org/jetbrains/jet/j2k/ast/Modifier.java | 1 + .../jet/j2k/visitors/ElementVisitor.java | 4 +-- test/org/jetbrains/jet/j2k/ast/EnumTest.java | 4 +-- .../jetbrains/jet/j2k/ast/FunctionTest.java | 16 +++++++++++ test/org/jetbrains/jet/j2k/ast/TraitTest.java | 10 +++---- 8 files changed, 62 insertions(+), 18 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index e6dea079b6a..3fc4c362783 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -67,7 +67,7 @@ public class Converter { } private static Field fieldToField(PsiField field) { - HashSet modifiers = getModifiersSet(field.getModifierList()); + HashSet modifiers = modifiersListToModifiersSet(field.getModifierList()); if (field instanceof PsiEnumConstant) // TODO: remove instanceof return new EnumConstant( new IdentifierImpl(field.getName()), // TODO @@ -95,6 +95,7 @@ public class Converter { @NotNull private static Function methodToFunction(PsiMethod method, boolean notEmpty) { final IdentifierImpl identifier = new IdentifierImpl(method.getName()); + final HashSet modifiers = modifiersListToModifiersSet(method.getModifierList()); final Type type = typeToType(method.getReturnType()); final Block body = blockToBlock(method.getBody(), notEmpty); final Element params = elementToElement(method.getParameterList()); @@ -103,6 +104,7 @@ public class Converter { if (method.isConstructor()) return new Constructor( identifier, + modifiers, type, typeParameters, params, @@ -110,6 +112,7 @@ public class Converter { ); return new Function( identifier, + modifiers, type, typeParameters, params, @@ -259,10 +262,14 @@ public class Converter { return new IdentifierImpl(identifier.getText()); } - public static HashSet getModifiersSet(PsiModifierList modifierList) { + public static HashSet modifiersListToModifiersSet(PsiModifierList modifierList) { HashSet modifiersSet = new HashSet(); if (modifierList != null) { - if (modifierList.hasModifierProperty("final")) modifiersSet.add(Modifier.FINAL); + if (modifierList.hasModifierProperty(PsiModifier.FINAL)) modifiersSet.add(Modifier.FINAL); + if (modifierList.hasModifierProperty(PsiModifier.PUBLIC)) modifiersSet.add(Modifier.PUBLIC); + if (modifierList.hasModifierProperty(PsiModifier.PROTECTED)) modifiersSet.add(Modifier.PROTECTED); + if (modifierList.hasModifierProperty(PsiModifier.PACKAGE_LOCAL)) modifiersSet.add(Modifier.INTERNAL); + if (modifierList.hasModifierProperty(PsiModifier.PRIVATE)) modifiersSet.add(Modifier.PRIVATE); } return modifiersSet; } diff --git a/src/org/jetbrains/jet/j2k/ast/Constructor.java b/src/org/jetbrains/jet/j2k/ast/Constructor.java index a28e306ee1b..8e4c257ad5a 100644 --- a/src/org/jetbrains/jet/j2k/ast/Constructor.java +++ b/src/org/jetbrains/jet/j2k/ast/Constructor.java @@ -3,13 +3,14 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; import java.util.List; +import java.util.Set; /** * @author ignatov */ public class Constructor extends Function { - public Constructor(Identifier identifier, Type type, List typeParameters, Element params, Block block) { - super(identifier, type, typeParameters, params, block); + public Constructor(Identifier identifier, Set modifiers, Type type, List typeParameters, Element params, Block block) { + super(identifier, modifiers, type, typeParameters, params, block); } public String primary() { diff --git a/src/org/jetbrains/jet/j2k/ast/Function.java b/src/org/jetbrains/jet/j2k/ast/Function.java index 9f9cf72de4f..ee8a9424d04 100644 --- a/src/org/jetbrains/jet/j2k/ast/Function.java +++ b/src/org/jetbrains/jet/j2k/ast/Function.java @@ -5,19 +5,22 @@ import org.jetbrains.jet.j2k.util.AstUtil; import java.util.LinkedList; import java.util.List; +import java.util.Set; /** * @author ignatov */ public class Function extends Node { private final Identifier myName; + private Set myModifiers; private final Type myType; private final List myTypeParameters; final Element myParams; private final Block myBlock; - public Function(Identifier name, Type type, List typeParameters, Element params, Block block) { + public Function(Identifier name, Set modifiers, Type type, List typeParameters, Element params, Block block) { myName = name; + myModifiers = modifiers; myType = type; myTypeParameters = typeParameters; myParams = params; @@ -35,7 +38,14 @@ public class Function extends Node { return false; } - String typeParameterWhereToKotlin() { + private String accessModifier() { + for (String m : myModifiers) + if (m.equals(Modifier.PUBLIC) || m.equals(Modifier.PROTECTED) || m.equals(Modifier.PRIVATE)) + return m; + return EMPTY; // package local converted to internal, but we use internal by default + } + + private String typeParameterWhereToKotlin() { if (hasWhere()) { List wheres = new LinkedList(); for (Element t : myTypeParameters) @@ -46,10 +56,21 @@ public class Function extends Node { return EMPTY; } + private String modifiersToKotlin() { + List modifierList = new LinkedList(); + + modifierList.add(accessModifier()); + + if (modifierList.size() > 0) + return AstUtil.join(modifierList, SPACE) + SPACE; + + return EMPTY; + } + @NotNull @Override public String toKotlin() { - return "fun" + SPACE + myName.toKotlin() + typeParametersToKotlin() + "(" + myParams.toKotlin() + ")" + SPACE + COLON + + return modifiersToKotlin() + "fun" + SPACE + myName.toKotlin() + typeParametersToKotlin() + "(" + myParams.toKotlin() + ")" + SPACE + COLON + SPACE + myType.toKotlin() + SPACE + typeParameterWhereToKotlin() + myBlock.toKotlin(); diff --git a/src/org/jetbrains/jet/j2k/ast/Modifier.java b/src/org/jetbrains/jet/j2k/ast/Modifier.java index e71b5707139..4abf460af59 100644 --- a/src/org/jetbrains/jet/j2k/ast/Modifier.java +++ b/src/org/jetbrains/jet/j2k/ast/Modifier.java @@ -11,4 +11,5 @@ public abstract class Modifier { public static String STATIC = "static"; public static String ABSTRACT = "abstract"; public static String FINAL = "final"; + public static String OPEN = "open"; } diff --git a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java index 5b8f4588caa..1a25cc76b5d 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java @@ -5,8 +5,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.j2k.Converter; import org.jetbrains.jet.j2k.ast.*; -import java.util.HashSet; - import static org.jetbrains.jet.j2k.Converter.*; /** @@ -27,7 +25,7 @@ public class ElementVisitor extends JavaElementVisitor implements Visitor { myResult = new LocalVariable( new IdentifierImpl(variable.getName()), // TODO - getModifiersSet(variable.getModifierList()), + modifiersListToModifiersSet(variable.getModifierList()), typeToType(variable.getType()), expressionToExpression(variable.getInitializer()) ); diff --git a/test/org/jetbrains/jet/j2k/ast/EnumTest.java b/test/org/jetbrains/jet/j2k/ast/EnumTest.java index a701ac1081f..ee36bd1df0d 100644 --- a/test/org/jetbrains/jet/j2k/ast/EnumTest.java +++ b/test/org/jetbrains/jet/j2k/ast/EnumTest.java @@ -56,7 +56,7 @@ public class EnumTest extends JetTestCaseBase { "\n" + " private int code;\n" + "\n" + - " private Color(int c) {\n" + + " private Color(int c) {\n" + // TODO: private constructor, WTF? " code = c;\n" + " }\n" + "\n" + @@ -70,7 +70,7 @@ public class EnumTest extends JetTestCaseBase { "YELLOW(24)\n" + "BLUE(25)\n" + "var code : Int\n" + - "fun getCode() : Int {\n" + + "public fun getCode() : Int {\n" + "return code\n" + "}\n" + "}" diff --git a/test/org/jetbrains/jet/j2k/ast/FunctionTest.java b/test/org/jetbrains/jet/j2k/ast/FunctionTest.java index c1f1d9e4372..3534b1d0655 100644 --- a/test/org/jetbrains/jet/j2k/ast/FunctionTest.java +++ b/test/org/jetbrains/jet/j2k/ast/FunctionTest.java @@ -62,4 +62,20 @@ public class FunctionTest extends JetTestCaseBase { "fun putUVW(u : U?, v : V?, w : W?) : Unit { }" ); } + + public void testInternal() throws Exception { + Assert.assertEquals(methodToSingleLineKotlin("void test() {}"), "fun test() : Unit { }"); + } + + public void testPrivate() throws Exception { + Assert.assertEquals(methodToSingleLineKotlin("private void test() {}"), "private fun test() : Unit { }"); + } + + public void testProtected() throws Exception { + Assert.assertEquals(methodToSingleLineKotlin("protected void test() {}"), "protected fun test() : Unit { }"); + } + + public void testPublic() throws Exception { + Assert.assertEquals(methodToSingleLineKotlin("public void test() {}"), "public fun test() : Unit { }"); + } } \ No newline at end of file diff --git a/test/org/jetbrains/jet/j2k/ast/TraitTest.java b/test/org/jetbrains/jet/j2k/ast/TraitTest.java index 88191af26fe..4e228eb53eb 100644 --- a/test/org/jetbrains/jet/j2k/ast/TraitTest.java +++ b/test/org/jetbrains/jet/j2k/ast/TraitTest.java @@ -22,8 +22,8 @@ public class TraitTest extends JetTestCaseBase { "}" ), "trait INode {\n" + - "fun getTag() : Tag? \n" + - "fun toKotlin() : String? \n" + + "public fun getTag() : Tag? \n" + + "public fun toKotlin() : String? \n" + "}"); } @@ -36,9 +36,9 @@ public class TraitTest extends JetTestCaseBase { "}" ), "trait INode {\n" + - "var IN : String? = \"in\"\n" + - "var AT : String? = \"@\"\n" + - "var COMMA_WITH_SPACE : String? = (COMMA + SPACE)\n" + + "val IN : String? = \"in\"\n" + + "val AT : String? = \"@\"\n" + + "val COMMA_WITH_SPACE : String? = (COMMA + SPACE)\n" + "}" ); }