diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index a67abfd0508..9b69450431f 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -39,10 +39,19 @@ public class Converter { return result; } - private static Class classToClass(PsiClass psiClass) { - final List methods = methodsToFunctionList(psiClass.getMethods(), true); + public static AnonymousClass anonymousClassToAnonymousClass(PsiAnonymousClass anonymousClass) { // TODO: replace by Block, + // use class.getChild() method + return new AnonymousClass( + classesToClassList(anonymousClass.getAllInnerClasses()), + methodsToFunctionList(anonymousClass.getMethods(), true), + fieldsToFieldList(anonymousClass.getAllFields()) + ); + } + + public static Class classToClass(PsiClass psiClass) { final Set modifiers = modifiersListToModifiersSet(psiClass.getModifierList()); final List innerClasses = classesToClassList(psiClass.getAllInnerClasses()); + final List methods = methodsToFunctionList(psiClass.getMethods(), true); final List fields = fieldsToFieldList(psiClass.getAllFields()); final List typeParameters = elementsToElementList(psiClass.getTypeParameters()); final List implementsTypes = typesToNotNullableTypeList(psiClass.getImplementsListTypes()); diff --git a/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java b/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java new file mode 100644 index 00000000000..4c4d084be07 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java @@ -0,0 +1,29 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; + +/** + * @author ignatov + */ +public class AnonymousClass extends Class { + public AnonymousClass(List innerClasses, List methods, List fields) { + super(new IdentifierImpl("anonClass"), + new HashSet(), + new LinkedList(), + new LinkedList(), + new LinkedList(), + innerClasses, + methods, + fields); + } + + @NotNull + @Override + public String toKotlin() { + return bodyToKotlin(); + } +} \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java index 302c6c467ad..5d2fe19f18f 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -99,10 +99,11 @@ public class Class extends Member { } String bodyToKotlin() { - return classObjectToKotlin() + N + + return "{" + N + classObjectToKotlin() + N + AstUtil.joinNodes(getNonStatic(myFields), N) + N + AstUtil.joinNodes(getNonStatic(methodsExceptConstructors()), N) + N + - AstUtil.joinNodes(getNonStatic(myInnerClasses), N) + N; + AstUtil.joinNodes(getNonStatic(myInnerClasses), N) + N + + "}"; } private List getStatic(List members) { @@ -141,8 +142,6 @@ public class Class extends Member { return modifiersToKotlin() + TYPE + SPACE + myName.toKotlin() + typeParametersToKotlin() + implementTypesToKotlin() + typeParameterWhereToKotlin() + - SPACE + "{" + N + - bodyToKotlin() + - "}"; + SPACE + bodyToKotlin(); } } diff --git a/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java b/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java index e55cd7cdb55..9e946a02118 100644 --- a/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java @@ -1,6 +1,7 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * @author ignatov @@ -8,15 +9,23 @@ import org.jetbrains.annotations.NotNull; public class NewClassExpression extends Expression { private final Element myName; private final Element myArguments; + private AnonymousClass myAnonymousClass = null; public NewClassExpression(Element name, Element arguments) { myName = name; myArguments = arguments; } + public NewClassExpression(Element name, Element arguments, @Nullable AnonymousClass anonymousClass) { + this(name, arguments); + myAnonymousClass = anonymousClass; + } + @NotNull @Override public String toKotlin() { - return myName.toKotlin() + "(" + myArguments.toKotlin() + ")"; + return myAnonymousClass != null ? + myName.toKotlin() + "(" + myArguments.toKotlin() + ")" + SPACE + myAnonymousClass.toKotlin() : + myName.toKotlin() + "(" + myArguments.toKotlin() + ")"; } } \ 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 18b7deb3e9c..9683a6544e7 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -4,6 +4,7 @@ import com.intellij.psi.*; import com.intellij.psi.impl.source.tree.java.PsiLiteralExpressionImpl; import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.j2k.Converter; import org.jetbrains.jet.j2k.ast.*; import java.util.List; @@ -192,7 +193,10 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { } else { myResult = new NewClassExpression( elementToElement(expression.getClassOrAnonymousClassReference()), - elementToElement(expression.getArgumentList()) + elementToElement(expression.getArgumentList()), + expression.getAnonymousClass() != null? + anonymousClassToAnonymousClass(expression.getAnonymousClass()) : + null ); } } diff --git a/testData/ast/newClassExpression/expression/newClassWithAnonymousScope.jav b/testData/ast/newClassExpression/expression/newClassWithAnonymousScope.jav new file mode 100644 index 00000000000..fd947e43a0c --- /dev/null +++ b/testData/ast/newClassExpression/expression/newClassWithAnonymousScope.jav @@ -0,0 +1,6 @@ +new Runnable() { + @Override + public void run() { + System.out.println("Run"); + } +}; \ No newline at end of file diff --git a/testData/ast/newClassExpression/expression/newClassWithAnonymousScope.kt b/testData/ast/newClassExpression/expression/newClassWithAnonymousScope.kt new file mode 100644 index 00000000000..a6f4ca93dba --- /dev/null +++ b/testData/ast/newClassExpression/expression/newClassWithAnonymousScope.kt @@ -0,0 +1,5 @@ +java.lang.Runnable() { +override public fun run() : Unit { +System.`out`?.println("Run") +} +} \ No newline at end of file