From c5c3e92b4e737f2b1946c578bfab7743fb60e22c Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 17 Nov 2011 16:06:49 +0400 Subject: [PATCH] fixed issue with full name constructor invocation --- .../jetbrains/jet/j2k/ast/NewClassExpression.java | 11 ++++++++--- .../jetbrains/jet/j2k/visitors/ElementVisitor.java | 14 +++++++++++++- .../jet/j2k/visitors/ExpressionVisitor.java | 3 ++- testData/ast/constructors/file/customerBuilder.kt | 4 ++-- .../expression/classWithoutBody2.jav | 1 - .../expression/classWithoutBody2.kt | 1 - .../expression/newClassWithAnonymousScope.kt | 2 +- .../newClassExpression/file/fullQualifiedName.jav | 9 +++++++++ .../newClassExpression/file/fullQualifiedName.kt | 8 ++++++++ .../newClassExpression/file/newClassByFullName.kt | 2 +- .../ast/newClassExpression/file/newInnerClass.jav | 11 +++++++++++ .../ast/newClassExpression/file/newInnerClass.kt | 10 ++++++++++ .../file/newListAndNewMember.jav | 13 +++++++++++++ .../newClassExpression/file/newListAndNewMember.kt | 12 ++++++++++++ .../file/newStaticInnerClass.jav | 11 +++++++++++ .../newClassExpression/file/newStaticInnerClass.kt | 13 +++++++++++++ 16 files changed, 114 insertions(+), 11 deletions(-) delete mode 100644 testData/ast/newClassExpression/expression/classWithoutBody2.jav delete mode 100644 testData/ast/newClassExpression/expression/classWithoutBody2.kt create mode 100644 testData/ast/newClassExpression/file/fullQualifiedName.jav create mode 100644 testData/ast/newClassExpression/file/fullQualifiedName.kt create mode 100644 testData/ast/newClassExpression/file/newInnerClass.jav create mode 100644 testData/ast/newClassExpression/file/newInnerClass.kt create mode 100644 testData/ast/newClassExpression/file/newListAndNewMember.jav create mode 100644 testData/ast/newClassExpression/file/newListAndNewMember.kt create mode 100644 testData/ast/newClassExpression/file/newStaticInnerClass.jav create mode 100644 testData/ast/newClassExpression/file/newStaticInnerClass.kt diff --git a/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java b/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java index 8d4bd4549b6..bddb19bfe16 100644 --- a/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java @@ -9,23 +9,28 @@ import org.jetbrains.annotations.Nullable; public class NewClassExpression extends Expression { private final Element myName; private final Element myArguments; + private Expression myQualifier; private AnonymousClass myAnonymousClass = null; public NewClassExpression(Element name, Element arguments) { myName = name; + myQualifier = EMPTY_EXPRESSION; myArguments = arguments; } - public NewClassExpression(Element name, Element arguments, @Nullable AnonymousClass anonymousClass) { + public NewClassExpression(Expression qualifier, Element name, Element arguments, @Nullable AnonymousClass anonymousClass) { this(name, arguments); + myQualifier = qualifier; myAnonymousClass = anonymousClass; } @NotNull @Override public String toKotlin() { + final String callOperator = myQualifier.isNullable() ? QUESTDOT : DOT; + final String qualifier = myQualifier.isEmpty() ? EMPTY : myQualifier.toKotlin() + callOperator; return myAnonymousClass != null ? - myName.toKotlin() + "(" + myArguments.toKotlin() + ")" + myAnonymousClass.toKotlin() : - myName.toKotlin() + "(" + myArguments.toKotlin() + ")"; + qualifier + myName.toKotlin() + "(" + myArguments.toKotlin() + ")" + myAnonymousClass.toKotlin() : + qualifier + myName.toKotlin() + "(" + myArguments.toKotlin() + ")"; } } \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java index 47c3ad409b7..7277b96deec 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java @@ -42,7 +42,19 @@ public class ElementVisitor extends JavaElementVisitor { @Override public void visitReferenceElement(PsiJavaCodeReferenceElement reference) { super.visitReferenceElement(reference); - myResult = new IdentifierImpl(reference.getQualifiedName()); // TODO + + if (!reference.isQualified()) + myResult = new IdentifierImpl(reference.getReferenceName()); + else { + String result = reference.getReferenceName(); + PsiElement qualifier = reference.getQualifier(); + while (qualifier != null){ + final PsiJavaCodeReferenceElement p = (PsiJavaCodeReferenceElement) qualifier; + result = p.getReferenceName() + "." + result; // TODO: maybe need to replace by safe call? + qualifier = p.getQualifier(); + } + myResult = new IdentifierImpl(result); + } } @Override diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index ce4aaa63c50..ed3739adc52 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -196,6 +196,7 @@ public class ExpressionVisitor extends StatementVisitor { } else { // new Class(): common case final PsiAnonymousClass anonymousClass = expression.getAnonymousClass(); myResult = new NewClassExpression( + expressionToExpression(expression.getQualifier()), elementToElement(expression.getClassOrAnonymousClassReference()), elementToElement(expression.getArgumentList()), anonymousClass != null ? anonymousClassToAnonymousClass(anonymousClass) : null @@ -369,4 +370,4 @@ public class ExpressionVisitor extends StatementVisitor { getOperatorString(expression.getOperationTokenType()) ); } -} +} \ No newline at end of file diff --git a/testData/ast/constructors/file/customerBuilder.kt b/testData/ast/constructors/file/customerBuilder.kt index 4940f8f8b50..cf263799a68 100644 --- a/testData/ast/constructors/file/customerBuilder.kt +++ b/testData/ast/constructors/file/customerBuilder.kt @@ -31,13 +31,13 @@ _lastName = lastName return this } open public fun Build() : Customer? { -return org.test.customer.Customer(_firstName, _lastName) +return Customer(_firstName, _lastName) } } public open class User() { class object { open public fun main() : Unit { -var customer : Customer? = org.test.customer.CustomerBuilder().WithFirstName("Homer")?.WithLastName("Simpson")?.Build() +var customer : Customer? = CustomerBuilder().WithFirstName("Homer")?.WithLastName("Simpson")?.Build() System.out?.println(customer?.getFirstName()) System.out?.println(customer?.getLastName()) } diff --git a/testData/ast/newClassExpression/expression/classWithoutBody2.jav b/testData/ast/newClassExpression/expression/classWithoutBody2.jav deleted file mode 100644 index 6c79694938f..00000000000 --- a/testData/ast/newClassExpression/expression/classWithoutBody2.jav +++ /dev/null @@ -1 +0,0 @@ -new myApp.Foo(); \ No newline at end of file diff --git a/testData/ast/newClassExpression/expression/classWithoutBody2.kt b/testData/ast/newClassExpression/expression/classWithoutBody2.kt deleted file mode 100644 index 4c5fba47bd0..00000000000 --- a/testData/ast/newClassExpression/expression/classWithoutBody2.kt +++ /dev/null @@ -1 +0,0 @@ -myApp.Foo() \ No newline at end of file diff --git a/testData/ast/newClassExpression/expression/newClassWithAnonymousScope.kt b/testData/ast/newClassExpression/expression/newClassWithAnonymousScope.kt index 10ca89407e6..0dd76680c66 100644 --- a/testData/ast/newClassExpression/expression/newClassWithAnonymousScope.kt +++ b/testData/ast/newClassExpression/expression/newClassWithAnonymousScope.kt @@ -1,4 +1,4 @@ -java.lang.Runnable() { +Runnable() { override public fun run() : Unit { System.out?.println("Run") } diff --git a/testData/ast/newClassExpression/file/fullQualifiedName.jav b/testData/ast/newClassExpression/file/fullQualifiedName.jav new file mode 100644 index 00000000000..de1ff2bd28c --- /dev/null +++ b/testData/ast/newClassExpression/file/fullQualifiedName.jav @@ -0,0 +1,9 @@ +package test; + +import java.util.List; + +class User { + void main() { + List list = new java.util.LinkedList(); + } +} \ No newline at end of file diff --git a/testData/ast/newClassExpression/file/fullQualifiedName.kt b/testData/ast/newClassExpression/file/fullQualifiedName.kt new file mode 100644 index 00000000000..4efc2e46426 --- /dev/null +++ b/testData/ast/newClassExpression/file/fullQualifiedName.kt @@ -0,0 +1,8 @@ +namespace test { +import java.util.List +open class User() { +open fun main() : Unit { +var list : List? = java.util.LinkedList() +} +} +} \ No newline at end of file diff --git a/testData/ast/newClassExpression/file/newClassByFullName.kt b/testData/ast/newClassExpression/file/newClassByFullName.kt index 560846c9186..26ff7b2cf9e 100644 --- a/testData/ast/newClassExpression/file/newClassByFullName.kt +++ b/testData/ast/newClassExpression/file/newClassByFullName.kt @@ -3,7 +3,7 @@ open class Library() { } open class User() { open fun main() : Unit { -var lib : Library? = org.test.Library() +var lib : Library? = Library() } } } \ No newline at end of file diff --git a/testData/ast/newClassExpression/file/newInnerClass.jav b/testData/ast/newClassExpression/file/newInnerClass.jav new file mode 100644 index 00000000000..a7343d1b5a4 --- /dev/null +++ b/testData/ast/newClassExpression/file/newInnerClass.jav @@ -0,0 +1,11 @@ +class OuterClass { + class InnerClass { + } +} + +class User { + void main() { + OuterClass outerObject = new OuterClass(); + OuterClass.InnerClass innerObject = outerObject.new InnerClass(); + } +} \ No newline at end of file diff --git a/testData/ast/newClassExpression/file/newInnerClass.kt b/testData/ast/newClassExpression/file/newInnerClass.kt new file mode 100644 index 00000000000..2c49f35b125 --- /dev/null +++ b/testData/ast/newClassExpression/file/newInnerClass.kt @@ -0,0 +1,10 @@ +open class OuterClass() { +open class InnerClass() { +} +} +open class User() { +open fun main() : Unit { +var outerObject : OuterClass? = OuterClass() +var innerObject : InnerClass? = outerObject?.InnerClass() +} +} \ No newline at end of file diff --git a/testData/ast/newClassExpression/file/newListAndNewMember.jav b/testData/ast/newClassExpression/file/newListAndNewMember.jav new file mode 100644 index 00000000000..8ed2bad7297 --- /dev/null +++ b/testData/ast/newClassExpression/file/newListAndNewMember.jav @@ -0,0 +1,13 @@ +package org.test; + +import java.util.List; +import java.util.LinkedList; + +class Member {} + +class User { + void main() { + List members = new LinkedList(); + members.add(new Member()); + } +} \ No newline at end of file diff --git a/testData/ast/newClassExpression/file/newListAndNewMember.kt b/testData/ast/newClassExpression/file/newListAndNewMember.kt new file mode 100644 index 00000000000..11d4070cb8e --- /dev/null +++ b/testData/ast/newClassExpression/file/newListAndNewMember.kt @@ -0,0 +1,12 @@ +namespace org.test { +import java.util.List +import java.util.LinkedList +open class Member() { +} +open class User() { +open fun main() : Unit { +var members : List? = LinkedList() +members?.add(Member()) +} +} +} \ No newline at end of file diff --git a/testData/ast/newClassExpression/file/newStaticInnerClass.jav b/testData/ast/newClassExpression/file/newStaticInnerClass.jav new file mode 100644 index 00000000000..0465c7498aa --- /dev/null +++ b/testData/ast/newClassExpression/file/newStaticInnerClass.jav @@ -0,0 +1,11 @@ +package demo; + +class Foo { + static class Bar {} +} + +class User { + void main() { + Foo.Bar boo = new Foo.Bar(); + } +} \ No newline at end of file diff --git a/testData/ast/newClassExpression/file/newStaticInnerClass.kt b/testData/ast/newClassExpression/file/newStaticInnerClass.kt new file mode 100644 index 00000000000..e7f898003c3 --- /dev/null +++ b/testData/ast/newClassExpression/file/newStaticInnerClass.kt @@ -0,0 +1,13 @@ +namespace demo { +open class Foo() { +class object { +open class Bar() { +} +} +} +open class User() { +open fun main() : Unit { +var boo : Bar? = Foo.Bar() +} +} +} \ No newline at end of file