From aa976315d9f7f91602fd1fb2d93f86edf3cf42b1 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 17 Nov 2011 16:35:01 +0400 Subject: [PATCH] support generic params in constructor invocation --- .../jet/j2k/ast/ReferenceElement.java | 26 +++++++++++++++++++ .../jet/j2k/visitors/ElementVisitor.java | 23 +++++++++++----- .../jet/j2k/visitors/TypeVisitor.java | 1 + .../file/genericClassInvocation.jav | 8 ++++++ .../file/genericClassInvocation.kt | 7 +++++ .../file/newListAndNewMember.kt | 2 +- 6 files changed, 59 insertions(+), 8 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/ReferenceElement.java create mode 100644 testData/ast/newClassExpression/file/genericClassInvocation.jav create mode 100644 testData/ast/newClassExpression/file/genericClassInvocation.kt diff --git a/src/org/jetbrains/jet/j2k/ast/ReferenceElement.java b/src/org/jetbrains/jet/j2k/ast/ReferenceElement.java new file mode 100644 index 00000000000..21210a994ea --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/ReferenceElement.java @@ -0,0 +1,26 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.j2k.util.AstUtil; + +import java.util.List; + +/** + * @author ignatov + */ +public class ReferenceElement extends Element { + private Identifier myReference; + private List myTypes; + + public ReferenceElement(@NotNull Identifier reference, @NotNull List types) { + myReference = reference; + myTypes = types; + } + + @NotNull + @Override + public String toKotlin() { + String typesIfNeeded = myTypes.size() > 0 ? "<" + AstUtil.joinNodes(myTypes, COMMA_WITH_SPACE) + ">" : EMPTY; + return myReference.toKotlin() + typesIfNeeded; + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java index 7277b96deec..aa9aec69c22 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java @@ -5,6 +5,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.j2k.Converter; import org.jetbrains.jet.j2k.ast.*; +import java.util.List; + import static org.jetbrains.jet.j2k.Converter.*; /** @@ -43,17 +45,24 @@ public class ElementVisitor extends JavaElementVisitor { public void visitReferenceElement(PsiJavaCodeReferenceElement reference) { super.visitReferenceElement(reference); - if (!reference.isQualified()) - myResult = new IdentifierImpl(reference.getReferenceName()); - else { - String result = reference.getReferenceName(); + final List types = typesToTypeList(reference.getTypeParameters()); + if (!reference.isQualified()) { + myResult = new ReferenceElement( + new IdentifierImpl(reference.getReferenceName()), + types + ); + } else { + String result = new IdentifierImpl(reference.getReferenceName()).toKotlin(); PsiElement qualifier = reference.getQualifier(); - while (qualifier != null){ + while (qualifier != null) { final PsiJavaCodeReferenceElement p = (PsiJavaCodeReferenceElement) qualifier; - result = p.getReferenceName() + "." + result; // TODO: maybe need to replace by safe call? + result = new IdentifierImpl(p.getReferenceName()).toKotlin() + "." + result; // TODO: maybe need to replace by safe call? qualifier = p.getQualifier(); } - myResult = new IdentifierImpl(result); + myResult = new ReferenceElement( + new IdentifierImpl(result), + types + ); } } diff --git a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java index b930d833534..7f99693f1e1 100644 --- a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java @@ -1,6 +1,7 @@ package org.jetbrains.jet.j2k.visitors; import com.intellij.psi.*; +import com.intellij.psi.impl.source.PsiClassReferenceType; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.j2k.ast.*; import org.jetbrains.jet.j2k.util.AstUtil; diff --git a/testData/ast/newClassExpression/file/genericClassInvocation.jav b/testData/ast/newClassExpression/file/genericClassInvocation.jav new file mode 100644 index 00000000000..a74e92a8bc5 --- /dev/null +++ b/testData/ast/newClassExpression/file/genericClassInvocation.jav @@ -0,0 +1,8 @@ +import java.util.List; +import java.util.LinkedList; + +class User { + void main() { + List list = new LinkedList(); + } +} \ No newline at end of file diff --git a/testData/ast/newClassExpression/file/genericClassInvocation.kt b/testData/ast/newClassExpression/file/genericClassInvocation.kt new file mode 100644 index 00000000000..b0fd39e1c57 --- /dev/null +++ b/testData/ast/newClassExpression/file/genericClassInvocation.kt @@ -0,0 +1,7 @@ +import java.util.List +import java.util.LinkedList +open class User() { +open fun main() : Unit { +var list : List? = LinkedList() +} +} \ No newline at end of file diff --git a/testData/ast/newClassExpression/file/newListAndNewMember.kt b/testData/ast/newClassExpression/file/newListAndNewMember.kt index 11d4070cb8e..0c6c5e4a59d 100644 --- a/testData/ast/newClassExpression/file/newListAndNewMember.kt +++ b/testData/ast/newClassExpression/file/newListAndNewMember.kt @@ -5,7 +5,7 @@ open class Member() { } open class User() { open fun main() : Unit { -var members : List? = LinkedList() +var members : List? = LinkedList() members?.add(Member()) } }