diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index e33682d8969..6e50656bedd 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -1,6 +1,8 @@ package org.jetbrains.jet.j2k; import com.intellij.psi.*; +import com.intellij.psi.search.searches.ReferencesSearch; +import com.intellij.psi.util.PsiUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.j2k.ast.*; @@ -439,10 +441,20 @@ public class Converter { public static Parameter parameterToParameter(@NotNull PsiParameter parameter) { return new Parameter( new IdentifierImpl(parameter.getName()), // TODO: remove - typeToType(parameter.getType()) + typeToType(parameter.getType()), + isReadOnly(parameter) ); } + private static boolean isReadOnly(PsiParameter parameter) { + for (PsiReference r : (ReferencesSearch.search(parameter))) { + if (r instanceof PsiExpression && PsiUtil.isAccessedForWriting((PsiExpression) r)) { + return false; + } + } + return true; + } + @NotNull public static Identifier identifierToIdentifier(@Nullable PsiIdentifier identifier) { if (identifier == null) return Identifier.EMPTY_IDENTIFIER; diff --git a/src/org/jetbrains/jet/j2k/ast/Parameter.java b/src/org/jetbrains/jet/j2k/ast/Parameter.java index a4b8897df97..a0258a173de 100644 --- a/src/org/jetbrains/jet/j2k/ast/Parameter.java +++ b/src/org/jetbrains/jet/j2k/ast/Parameter.java @@ -8,16 +8,24 @@ import org.jetbrains.annotations.NotNull; public class Parameter extends Expression { private final Identifier myIdentifier; private final Type myType; + private boolean myReadOnly; public Parameter(Identifier identifier, Type type) { myIdentifier = identifier; myType = type; + myReadOnly = true; + } + + public Parameter(IdentifierImpl identifier, Type type, boolean readOnly) { + this(identifier, type); + myReadOnly = readOnly; } @NotNull @Override public String toKotlin() { String vararg = myType.getKind() == Kind.VARARG ? "vararg" + SPACE : EMPTY; - return vararg + myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin(); + String var = myReadOnly ? EMPTY : "var" + SPACE; + return vararg + var + myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin(); } } diff --git a/testData/ast/function/file/varVararg.jav b/testData/ast/function/file/varVararg.jav new file mode 100644 index 00000000000..bba8ce2db90 --- /dev/null +++ b/testData/ast/function/file/varVararg.jav @@ -0,0 +1,7 @@ +package demo; + +class Test { + void test(Object ... args) { + args = new Integer[] {1, 2, 3}; + } +} \ No newline at end of file diff --git a/testData/ast/function/file/varVararg.kt b/testData/ast/function/file/varVararg.kt new file mode 100644 index 00000000000..ebd7393461c --- /dev/null +++ b/testData/ast/function/file/varVararg.kt @@ -0,0 +1,6 @@ +namespace demo +open class Test() { +open fun test(vararg var args : Any?) : Unit { +args = array(1, 2, 3) +} +} \ No newline at end of file diff --git a/testData/ast/function/file/writableParameter.jav b/testData/ast/function/file/writableParameter.jav new file mode 100644 index 00000000000..c2ed3cf10d4 --- /dev/null +++ b/testData/ast/function/file/writableParameter.jav @@ -0,0 +1,8 @@ +package demo; + +class Test { + int test(int i) { + i = 10; + return i + 20; + } +} \ No newline at end of file diff --git a/testData/ast/function/file/writableParameter.kt b/testData/ast/function/file/writableParameter.kt new file mode 100644 index 00000000000..8dcff305936 --- /dev/null +++ b/testData/ast/function/file/writableParameter.kt @@ -0,0 +1,7 @@ +namespace demo +open class Test() { +open fun test(var i : Int) : Int { +i = 10 +return (i + 20) +} +} \ No newline at end of file