diff --git a/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java b/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java index dd631e04846..552c78dd9aa 100644 --- a/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java +++ b/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java @@ -7,6 +7,7 @@ import org.jetbrains.annotations.NotNull; */ public class IdentifierImpl extends Expression implements Identifier { private final String myName; + private boolean myHasDollar; private boolean myNullable = true; public IdentifierImpl(String name) { @@ -18,6 +19,12 @@ public class IdentifierImpl extends Expression implements Identifier { myNullable = nullable; } + public IdentifierImpl(String name, boolean hasDollar, boolean nullable) { + myName = name; + myHasDollar = hasDollar; + myNullable = nullable; + } + @Override public String getName() { return myName; @@ -37,11 +44,17 @@ public class IdentifierImpl extends Expression implements Identifier { return myNullable; } + private String ifNeedQuote(String name) { + if (ONLY_KOTLIN_KEYWORDS.contains(name) || name.contains("$")) + return quote(name); + return name; + } + @NotNull @Override public String toKotlin() { - if (ONLY_KOTLIN_KEYWORDS.contains(myName)) - return quote(myName); - return myName; + if (myHasDollar) + return DOLLAR + ifNeedQuote(myName); + return ifNeedQuote(myName); } } \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/ast/Node.java b/src/org/jetbrains/jet/j2k/ast/Node.java index 17f454d112a..5e5a275f718 100644 --- a/src/org/jetbrains/jet/j2k/ast/Node.java +++ b/src/org/jetbrains/jet/j2k/ast/Node.java @@ -37,8 +37,9 @@ public abstract class Node implements INode { static final String COLON = ":"; static final String IN = "in"; static final String AT = "@"; + static final String DOLLAR = "$"; static final String BACKTICK = "`"; static final String QUEST = "?"; static final String COMMA_WITH_SPACE = "," + SPACE; static final String STAR = "*"; -} +} \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 7dc769befb5..965e0430a51 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -234,7 +234,7 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { boolean isNullable = typeToType(expression.getType()).isNullable(); final IdentifierImpl identifier = hasDollar ? - new IdentifierImpl("$" + expression.getReferenceName(), isNullable) : + new IdentifierImpl(expression.getReferenceName(), hasDollar, isNullable) : new IdentifierImpl(expression.getReferenceName(), isNullable); myResult = new CallChainExpression( expressionToExpression(expression.getQualifierExpression()), diff --git a/testData/ast/identifier/expression/withDollar.jav b/testData/ast/identifier/expression/withDollar.jav new file mode 100644 index 00000000000..49ceb94e5b8 --- /dev/null +++ b/testData/ast/identifier/expression/withDollar.jav @@ -0,0 +1 @@ +$$$$$ \ No newline at end of file diff --git a/testData/ast/identifier/expression/withDollar.kt b/testData/ast/identifier/expression/withDollar.kt new file mode 100644 index 00000000000..47ac2104db8 --- /dev/null +++ b/testData/ast/identifier/expression/withDollar.kt @@ -0,0 +1 @@ +`$$$$$` \ No newline at end of file diff --git a/testData/ast/identifier/file/finalFieldReference.jav b/testData/ast/identifier/file/finalFieldReference.jav new file mode 100644 index 00000000000..f5d31f19d64 --- /dev/null +++ b/testData/ast/identifier/file/finalFieldReference.jav @@ -0,0 +1,13 @@ +class $$$$$ {} + +class $ {} + +class $$ extends $ { + final $$$$$ $$$; + + public $$($$$$$ $$$$) { + $$$ = $$$$; + } + + public $$$$$ $$$$$$() {return $$$;} +} \ No newline at end of file diff --git a/testData/ast/identifier/file/finalFieldReference.kt b/testData/ast/identifier/file/finalFieldReference.kt new file mode 100644 index 00000000000..18748be0d9d --- /dev/null +++ b/testData/ast/identifier/file/finalFieldReference.kt @@ -0,0 +1,13 @@ +open class `$$$$$`() { +} +open class `$`() { +} +open class `$$`(`$$$$` : `$$$$$`?) : `$` { +val `$$$` : `$$$$$`? +{ +$`$$$` = `$$$$` +} +open public fun `$$$$$$`() : `$$$$$`? { +return `$$$` +} +} \ No newline at end of file diff --git a/testData/ast/identifier/statement/keywords.jav b/testData/ast/identifier/statement/keywords.jav new file mode 100644 index 00000000000..659f1e02d04 --- /dev/null +++ b/testData/ast/identifier/statement/keywords.jav @@ -0,0 +1,5 @@ +int +namespace, in, val, var, when, object, +out, in, is, as, ref, override, +open, attribute, lazy, set, get, +fun, where, by, trait, type, This; \ No newline at end of file diff --git a/testData/ast/identifier/statement/keywords.kt b/testData/ast/identifier/statement/keywords.kt new file mode 100644 index 00000000000..a91868c5570 --- /dev/null +++ b/testData/ast/identifier/statement/keywords.kt @@ -0,0 +1,23 @@ +var `namespace` : Int +var `in` : Int +var `val` : Int +var `var` : Int +var `when` : Int +var `object` : Int +var `out` : Int +var `in` : Int +var `is` : Int +var `as` : Int +var `ref` : Int +var `override` : Int +var `open` : Int +var `attribute` : Int +var `lazy` : Int +var `set` : Int +var `get` : Int +var `fun` : Int +var `where` : Int +var `by` : Int +var `trait` : Int +var `type` : Int +var `This` : Int \ No newline at end of file