From 8cf4c809511530577a6c074917b4fd10e90c4aa7 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 27 Oct 2011 17:27:15 +0400 Subject: [PATCH 001/206] initial commit for j2k --- j2k.iml | 13 ++ j2k.ipr | 169 ++++++++++++++ src/org/jetbrains/jet/j2k/Converter.java | 176 +++++++++++++++ .../jet/j2k/ast/AssignmentExpression.java | 30 +++ .../jet/j2k/ast/BinaryExpression.java | 24 ++ src/org/jetbrains/jet/j2k/ast/Block.java | 37 ++++ src/org/jetbrains/jet/j2k/ast/Class.java | 34 +++ src/org/jetbrains/jet/j2k/ast/ClassType.java | 20 ++ .../jet/j2k/ast/DeclarationStatement.java | 33 +++ .../j2k/ast/DummyMethodCallExpression.java | 24 ++ src/org/jetbrains/jet/j2k/ast/Element.java | 7 + .../jetbrains/jet/j2k/ast/EmptyElement.java | 14 ++ .../jet/j2k/ast/EmptyExpression.java | 14 ++ .../jetbrains/jet/j2k/ast/EmptyStatement.java | 14 ++ src/org/jetbrains/jet/j2k/ast/EmptyType.java | 14 ++ src/org/jetbrains/jet/j2k/ast/Enum.java | 13 ++ src/org/jetbrains/jet/j2k/ast/Expression.java | 7 + .../jetbrains/jet/j2k/ast/ExpressionList.java | 29 +++ src/org/jetbrains/jet/j2k/ast/Field.java | 30 +++ src/org/jetbrains/jet/j2k/ast/File.java | 30 +++ src/org/jetbrains/jet/j2k/ast/Function.java | 25 +++ src/org/jetbrains/jet/j2k/ast/INode.java | 18 ++ src/org/jetbrains/jet/j2k/ast/Identifier.java | 10 + .../jetbrains/jet/j2k/ast/IdentifierImpl.java | 36 +++ src/org/jetbrains/jet/j2k/ast/Import.java | 20 ++ .../jet/j2k/ast/LiteralExpression.java | 20 ++ .../jetbrains/jet/j2k/ast/LocalVariable.java | 28 +++ .../jet/j2k/ast/MethodCallExpression.java | 22 ++ src/org/jetbrains/jet/j2k/ast/Node.java | 42 ++++ .../jetbrains/jet/j2k/ast/PrimitiveType.java | 20 ++ .../jet/j2k/ast/ReturnStatement.java | 20 ++ src/org/jetbrains/jet/j2k/ast/Statement.java | 7 + src/org/jetbrains/jet/j2k/ast/Trait.java | 13 ++ src/org/jetbrains/jet/j2k/ast/Type.java | 14 ++ src/org/jetbrains/jet/j2k/ast/Visitor.java | 11 + src/org/jetbrains/jet/j2k/util/AstUtil.java | 44 ++++ .../jet/j2k/visitors/ElementVisitor.java | 41 ++++ .../jet/j2k/visitors/ExpressionVisitor.java | 209 ++++++++++++++++++ .../jet/j2k/visitors/StatementVisitor.java | 141 ++++++++++++ .../jet/j2k/visitors/TypeVisitor.java | 67 ++++++ test/org/jetbrains/jet/j2k/FileTest.java | 60 +++++ .../jetbrains/jet/j2k/JetTestCaseBase.java | 200 +++++++++++++++++ .../jet/j2k/ast/AssignmentExpressionTest.java | 61 +++++ .../jet/j2k/ast/BinaryExpressionTest.java | 81 +++++++ test/org/jetbrains/jet/j2k/ast/ClassTest.java | 65 ++++++ .../jet/j2k/ast/DeclarationStatementTest.java | 33 +++ test/org/jetbrains/jet/j2k/ast/EnumTest.java | 28 +++ .../jetbrains/jet/j2k/ast/FunctionTest.java | 44 ++++ .../jet/j2k/ast/IdentifierImplTest.java | 11 + .../jet/j2k/ast/LocalVariableTest.java | 16 ++ .../jet/j2k/ast/MethodCallExpressionTest.java | 27 +++ .../jet/j2k/ast/ReturnStatementTest.java | 37 ++++ test/org/jetbrains/jet/j2k/ast/TraitTest.java | 45 ++++ 53 files changed, 2248 insertions(+) create mode 100644 j2k.iml create mode 100644 j2k.ipr create mode 100644 src/org/jetbrains/jet/j2k/Converter.java create mode 100644 src/org/jetbrains/jet/j2k/ast/AssignmentExpression.java create mode 100644 src/org/jetbrains/jet/j2k/ast/BinaryExpression.java create mode 100644 src/org/jetbrains/jet/j2k/ast/Block.java create mode 100644 src/org/jetbrains/jet/j2k/ast/Class.java create mode 100644 src/org/jetbrains/jet/j2k/ast/ClassType.java create mode 100644 src/org/jetbrains/jet/j2k/ast/DeclarationStatement.java create mode 100644 src/org/jetbrains/jet/j2k/ast/DummyMethodCallExpression.java create mode 100644 src/org/jetbrains/jet/j2k/ast/Element.java create mode 100644 src/org/jetbrains/jet/j2k/ast/EmptyElement.java create mode 100644 src/org/jetbrains/jet/j2k/ast/EmptyExpression.java create mode 100644 src/org/jetbrains/jet/j2k/ast/EmptyStatement.java create mode 100644 src/org/jetbrains/jet/j2k/ast/EmptyType.java create mode 100644 src/org/jetbrains/jet/j2k/ast/Enum.java create mode 100644 src/org/jetbrains/jet/j2k/ast/Expression.java create mode 100644 src/org/jetbrains/jet/j2k/ast/ExpressionList.java create mode 100644 src/org/jetbrains/jet/j2k/ast/Field.java create mode 100644 src/org/jetbrains/jet/j2k/ast/File.java create mode 100644 src/org/jetbrains/jet/j2k/ast/Function.java create mode 100644 src/org/jetbrains/jet/j2k/ast/INode.java create mode 100644 src/org/jetbrains/jet/j2k/ast/Identifier.java create mode 100644 src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java create mode 100644 src/org/jetbrains/jet/j2k/ast/Import.java create mode 100644 src/org/jetbrains/jet/j2k/ast/LiteralExpression.java create mode 100644 src/org/jetbrains/jet/j2k/ast/LocalVariable.java create mode 100644 src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java create mode 100644 src/org/jetbrains/jet/j2k/ast/Node.java create mode 100644 src/org/jetbrains/jet/j2k/ast/PrimitiveType.java create mode 100644 src/org/jetbrains/jet/j2k/ast/ReturnStatement.java create mode 100644 src/org/jetbrains/jet/j2k/ast/Statement.java create mode 100644 src/org/jetbrains/jet/j2k/ast/Trait.java create mode 100644 src/org/jetbrains/jet/j2k/ast/Type.java create mode 100644 src/org/jetbrains/jet/j2k/ast/Visitor.java create mode 100644 src/org/jetbrains/jet/j2k/util/AstUtil.java create mode 100644 src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java create mode 100644 src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java create mode 100644 src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java create mode 100644 src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java create mode 100644 test/org/jetbrains/jet/j2k/FileTest.java create mode 100644 test/org/jetbrains/jet/j2k/JetTestCaseBase.java create mode 100644 test/org/jetbrains/jet/j2k/ast/AssignmentExpressionTest.java create mode 100644 test/org/jetbrains/jet/j2k/ast/BinaryExpressionTest.java create mode 100644 test/org/jetbrains/jet/j2k/ast/ClassTest.java create mode 100644 test/org/jetbrains/jet/j2k/ast/DeclarationStatementTest.java create mode 100644 test/org/jetbrains/jet/j2k/ast/EnumTest.java create mode 100644 test/org/jetbrains/jet/j2k/ast/FunctionTest.java create mode 100644 test/org/jetbrains/jet/j2k/ast/IdentifierImplTest.java create mode 100644 test/org/jetbrains/jet/j2k/ast/LocalVariableTest.java create mode 100644 test/org/jetbrains/jet/j2k/ast/MethodCallExpressionTest.java create mode 100644 test/org/jetbrains/jet/j2k/ast/ReturnStatementTest.java create mode 100644 test/org/jetbrains/jet/j2k/ast/TraitTest.java diff --git a/j2k.iml b/j2k.iml new file mode 100644 index 00000000000..06922e896d4 --- /dev/null +++ b/j2k.iml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/j2k.ipr b/j2k.ipr new file mode 100644 index 00000000000..784215e36c3 --- /dev/null +++ b/j2k.ipr @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + http://www.w3.org/1999/xhtml + + + + + + + + + diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java new file mode 100644 index 00000000000..f4089902c55 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -0,0 +1,176 @@ +package org.jetbrains.jet.j2k; + +import com.intellij.psi.*; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.j2k.ast.*; +import org.jetbrains.jet.j2k.ast.Class; +import org.jetbrains.jet.j2k.ast.Enum; +import org.jetbrains.jet.j2k.visitors.ElementVisitor; +import org.jetbrains.jet.j2k.visitors.ExpressionVisitor; +import org.jetbrains.jet.j2k.visitors.StatementVisitor; +import org.jetbrains.jet.j2k.visitors.TypeVisitor; + +import java.util.LinkedList; +import java.util.List; + +/** + * @author ignatov + */ +public class Converter { + @NotNull + public static File fileToFile(PsiJavaFile javaFile) { + final PsiImportList importList = javaFile.getImportList(); + List imports = importList == null ? + new LinkedList() : + importsToImportList(importList.getAllImportStatements()); + return new File(javaFile.getPackageName(), imports, classesToClassList(javaFile.getClasses())); // TODO: use identifier + } + + @NotNull + private static List classesToClassList(PsiClass[] classes) { + List result = new LinkedList(); + for (PsiClass t : classes) { + result.add(classToClass(t)); + } + return result; + } + + public static Class classToClass(PsiClass psiClass) { + final List methods = methodsToFunctionList(psiClass.getMethods(), true); + + final List innerClasses = classesToClassList(psiClass.getAllInnerClasses()); + + final List fields = fieldsToFieldList(psiClass.getAllFields()); + + final IdentifierImpl name = new IdentifierImpl(psiClass.getName()); + if (psiClass.isInterface()) + return new Trait(name, innerClasses, methods, fields); + if (psiClass.isEnum()) + return new Enum(name, innerClasses, methods, fields); + return new Class(name, innerClasses, methods, fields); + } + + private static List fieldsToFieldList(PsiField[] fields) { + List result = new LinkedList(); + for (PsiField f : fields) { + result.add(fieldToField(f)); + } + return result; + } + + private static Field fieldToField(PsiField field) { + return new Field( + new IdentifierImpl(field.getName()), // TODO + typeToType(field.getType()), + expressionToExpression(field.getInitializer()) // TODO: add modifiers + ); + } + + @NotNull + private static List methodsToFunctionList(PsiMethod[] methods, boolean notEmpty) { + List result = new LinkedList(); + for (PsiMethod t : methods) { + result.add(methodToFunction(t, notEmpty)); + } + return result; + } + + @NotNull + private static Function methodToFunction(PsiMethod t, boolean notEmpty) { + return new Function(new IdentifierImpl(t.getName()), typeToType(t.getReturnType()), bodyToBlock(t.getBody(), notEmpty)); + } + + @NotNull + private static Block bodyToBlock(PsiCodeBlock body, boolean notEmpty) { + if (body == null) + return new Block(new LinkedList(), false); + return new Block(statementsToStatementList(body.getStatements()), notEmpty); + } + + @NotNull + public static List statementsToStatementList(PsiStatement[] statements) { + List result = new LinkedList(); + for (PsiStatement t : statements) { + result.add(statementToStatement(t)); + } + return result; + } + + @NotNull + public static Statement statementToStatement(PsiStatement t) { + final StatementVisitor statementVisitor = new StatementVisitor(); + t.accept(statementVisitor); + System.out.println(t.getClass()); + return statementVisitor.getStatement(); + } + + @NotNull + public static List expressionsToExpressionList(PsiExpression[] expressions) { + List result = new LinkedList(); + for (PsiExpression e : expressions) { + result.add(expressionToExpression(e)); + } + return result; + } + + @NotNull + public static Expression expressionToExpression(PsiExpression e) { + if (e == null) + return new EmptyExpression(); + final ExpressionVisitor expressionVisitor = new ExpressionVisitor(); + e.accept(expressionVisitor); + System.out.println(e.getClass()); + return expressionVisitor.getResult(); + } + + @NotNull + public static Element elementToElement(PsiElement e) { + final ElementVisitor elementVisitor = new ElementVisitor(); + e.accept(elementVisitor); + System.out.println(e.getClass()); + return elementVisitor.getResult(); + } + + @NotNull + public static List elementsToElementList(PsiElement[] elements) { + List result = new LinkedList(); + for (PsiElement e : elements) { + result.add(elementToElement(e)); + } + return result; + } + + @NotNull + public static Type typeToType(PsiType type) { + if (type == null) + return new EmptyType(); // TODO + TypeVisitor typeVisitor = new TypeVisitor(); + type.accept(typeVisitor); + return typeVisitor.getResult(); + } + + @NotNull + public static List typesToTypeList(PsiType[] types) { + List result = new LinkedList(); + for (PsiType t : types) { + result.add(typeToType(t)); + } + return result; + } + + @NotNull + private static List importsToImportList(PsiImportStatementBase[] imports) { + List result = new LinkedList(); + for (PsiImportStatementBase t : imports) { + result.add(importToImport(t)); + } + return result; + } + + @NotNull + private static Import importToImport(PsiImportStatementBase t) { + if (t.getImportReference() != null) + return new Import(t.getImportReference().getQualifiedName()); // TODO: use identifier + return new Import(""); + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/AssignmentExpression.java b/src/org/jetbrains/jet/j2k/ast/AssignmentExpression.java new file mode 100644 index 00000000000..4353ac8753e --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/AssignmentExpression.java @@ -0,0 +1,30 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class AssignmentExpression extends Expression { + private Expression myLeft; + private Expression myRight; + private String myOp; + + public AssignmentExpression(Expression left, Expression right) { + myLeft = left; + myRight = right; + myOp = EQUAL; + } + + public AssignmentExpression(Expression left, Expression right, String op) { + myLeft = left; + myRight = right; + myOp = op; + } + + @NotNull + @Override + public String toKotlin() { + return myLeft.toKotlin() + SPACE + myOp + SPACE + myRight.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/BinaryExpression.java b/src/org/jetbrains/jet/j2k/ast/BinaryExpression.java new file mode 100644 index 00000000000..bba976bf2a4 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/BinaryExpression.java @@ -0,0 +1,24 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class BinaryExpression extends Expression { + private Expression myLeft; + private Expression myRight; + private String myOp; + + public BinaryExpression(Expression left, Expression right, String op) { + myLeft = left; + myRight = right; + myOp = op; + } + + @NotNull + @Override + public String toKotlin() { + return "(" + myLeft.toKotlin() + SPACE + myOp + SPACE + myRight.toKotlin() + ")"; + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/Block.java b/src/org/jetbrains/jet/j2k/ast/Block.java new file mode 100644 index 00000000000..5f164676a9c --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/Block.java @@ -0,0 +1,37 @@ +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 Block extends Statement { + private List myStatements; + private boolean myNotEmpty; + + public Block(List statements) { + myStatements = statements; + } + + public Block(List statements, boolean notEmpty) { + myStatements = statements; + myNotEmpty = notEmpty; + } + + private boolean isEmpty() { + return !myNotEmpty && myStatements.size() == 0; + } + + @NotNull + @Override + public String toKotlin() { + if (!isEmpty()) + return "{" + N + + AstUtil.joinNodes(myStatements, N) + N + + "}"; + return EMPTY; + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java new file mode 100644 index 00000000000..658c11693ab --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -0,0 +1,34 @@ +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 Class extends Node { + protected String TYPE = "class"; + protected Identifier myName; + protected List myInnerClasses; + protected List myMethods; + protected List myFields; + + public Class(Identifier name, List innerClasses, List methods, List fields) { + myName = name; + myInnerClasses = innerClasses; + myMethods = methods; + myFields = fields; + } + + @NotNull + @Override + public String toKotlin() { + return TYPE + SPACE + myName.toKotlin() + SPACE + "{" + N + + AstUtil.joinNodes(myInnerClasses, N) + N + + AstUtil.joinNodes(myMethods, N) + N + + AstUtil.joinNodes(myFields, N) + N + + "}"; + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/ClassType.java b/src/org/jetbrains/jet/j2k/ast/ClassType.java new file mode 100644 index 00000000000..73b6e43c7a2 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/ClassType.java @@ -0,0 +1,20 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class ClassType extends Type { + private Identifier myType; + + public ClassType(Identifier type) { + myType = type; + } + + @NotNull + @Override + public String toKotlin() { + return myType.toKotlin() + QUESTION; + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/DeclarationStatement.java b/src/org/jetbrains/jet/j2k/ast/DeclarationStatement.java new file mode 100644 index 00000000000..c3135869842 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/DeclarationStatement.java @@ -0,0 +1,33 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.j2k.util.AstUtil; + +import java.util.LinkedList; +import java.util.List; + +/** + * @author ignatov + */ +public class DeclarationStatement extends Statement { + private List myElements; + + public DeclarationStatement(List elements) { + myElements = elements; + } + + private List toStringList(List elements) { + List result = new LinkedList(); + for (String n : AstUtil.nodesToKotlin(elements)) + result.add( + "var" + SPACE + n + ); + return result; + } + + @NotNull + @Override + public String toKotlin() { + return AstUtil.join(toStringList(myElements), N); + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/DummyMethodCallExpression.java b/src/org/jetbrains/jet/j2k/ast/DummyMethodCallExpression.java new file mode 100644 index 00000000000..6961b67e03c --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/DummyMethodCallExpression.java @@ -0,0 +1,24 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class DummyMethodCallExpression extends Expression { + private Expression myWho; + private String myMethodName; + private Expression myWhat; + + public DummyMethodCallExpression(Expression who, String methodName, Expression what) { + myWho = who; + myMethodName = methodName; + myWhat = what; + } + + @NotNull + @Override + public String toKotlin() { + return myWho.toKotlin() + DOT + myMethodName + "(" + myWhat.toKotlin() + ")"; + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/Element.java b/src/org/jetbrains/jet/j2k/ast/Element.java new file mode 100644 index 00000000000..013d70f05b4 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/Element.java @@ -0,0 +1,7 @@ +package org.jetbrains.jet.j2k.ast; + +/** + * @author ignatov + */ +public abstract class Element extends Node { +} diff --git a/src/org/jetbrains/jet/j2k/ast/EmptyElement.java b/src/org/jetbrains/jet/j2k/ast/EmptyElement.java new file mode 100644 index 00000000000..2b68afe22f9 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/EmptyElement.java @@ -0,0 +1,14 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class EmptyElement extends Element { + @NotNull + @Override + public String toKotlin() { + return EMPTY; + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/EmptyExpression.java b/src/org/jetbrains/jet/j2k/ast/EmptyExpression.java new file mode 100644 index 00000000000..c2ed1f7cb27 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/EmptyExpression.java @@ -0,0 +1,14 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class EmptyExpression extends Expression { + @NotNull + @Override + public String toKotlin() { + return EMPTY; + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/EmptyStatement.java b/src/org/jetbrains/jet/j2k/ast/EmptyStatement.java new file mode 100644 index 00000000000..970a9d02539 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/EmptyStatement.java @@ -0,0 +1,14 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class EmptyStatement extends Statement { + @NotNull + @Override + public String toKotlin() { + return EMPTY; + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/EmptyType.java b/src/org/jetbrains/jet/j2k/ast/EmptyType.java new file mode 100644 index 00000000000..8bd6add7ec1 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/EmptyType.java @@ -0,0 +1,14 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class EmptyType extends Type { + @NotNull + @Override + public String toKotlin() { + return "UNRESOLVED_TYPE"; + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/Enum.java b/src/org/jetbrains/jet/j2k/ast/Enum.java new file mode 100644 index 00000000000..c390e79b8f2 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/Enum.java @@ -0,0 +1,13 @@ +package org.jetbrains.jet.j2k.ast; + +import java.util.List; + +/** + * @author ignatov + */ +public class Enum extends Class { + public Enum(Identifier name, List innerClasses, List methods, List fields) { + super(name, innerClasses, methods, fields); + TYPE = "enum"; + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/Expression.java b/src/org/jetbrains/jet/j2k/ast/Expression.java new file mode 100644 index 00000000000..e83a07becd0 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/Expression.java @@ -0,0 +1,7 @@ +package org.jetbrains.jet.j2k.ast; + +/** + * @author ignatov + */ +public abstract class Expression extends Statement { +} diff --git a/src/org/jetbrains/jet/j2k/ast/ExpressionList.java b/src/org/jetbrains/jet/j2k/ast/ExpressionList.java new file mode 100644 index 00000000000..774d73b1573 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/ExpressionList.java @@ -0,0 +1,29 @@ +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 ExpressionList extends Expression { + private List myExpressions; + private List myTypes; // TODO: add types to toKotlin + + public ExpressionList(List expressions, List types) { + myExpressions = expressions; + myTypes = types; + } + + public ExpressionList(List expressions) { + myExpressions = expressions; + } + + @NotNull + @Override + public String toKotlin() { + return AstUtil.joinNodes(myExpressions, COMMA_WITH_SPACE); + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/Field.java b/src/org/jetbrains/jet/j2k/ast/Field.java new file mode 100644 index 00000000000..8d6090a2cd2 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/Field.java @@ -0,0 +1,30 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class Field extends Node { + private Identifier myIdentifier; + private Type myType; + private Expression myInitializer; + + public Field(Identifier identifier, Type type, Expression initializer) { + myIdentifier = identifier; + myType = type; + myInitializer = initializer; + } + + @NotNull + @Override + public String toKotlin() { + String modifier = "var" + SPACE; + + if (myInitializer.toKotlin().isEmpty()) // TODO: remove + return modifier + myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin(); + + return modifier + myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin() + SPACE + + EQUAL + SPACE + myInitializer.toKotlin(); + } +} \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/ast/File.java b/src/org/jetbrains/jet/j2k/ast/File.java new file mode 100644 index 00000000000..ba9c4952556 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/File.java @@ -0,0 +1,30 @@ +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 File extends Node { + private String myPackageName; + private List myImports; + private List myClasses; + + public File(String packageName, List imports, List classes) { + myPackageName = packageName; + myImports = imports; + myClasses = classes; + } + + @NotNull + @Override + public String toKotlin() { + return "namespace" + SPACE + myPackageName + SPACE + "{" + N + + AstUtil.joinNodes(myImports, N) + N2 + + AstUtil.joinNodes(myClasses, N) + N + + "}"; + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/Function.java b/src/org/jetbrains/jet/j2k/ast/Function.java new file mode 100644 index 00000000000..3a5903a8165 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/Function.java @@ -0,0 +1,25 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class Function extends Node { + private Identifier myName; + private Type myType; + private Block myBlock; + + public Function(Identifier name, Type type, Block block) { + myName = name; + myType = type; + myBlock = block; + } + + @NotNull + @Override + public String toKotlin() { + return "fun" + SPACE + myName.toKotlin() + "(" + ")" + SPACE + COLON + SPACE + myType.toKotlin() + SPACE + + myBlock.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/INode.java b/src/org/jetbrains/jet/j2k/ast/INode.java new file mode 100644 index 00000000000..57edb34a38c --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/INode.java @@ -0,0 +1,18 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public interface INode { + @NotNull + public String toKotlin(); + + @NotNull + public Kind getKind(); + + public enum Kind { + UNDEFINED, TYPE, + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/Identifier.java b/src/org/jetbrains/jet/j2k/ast/Identifier.java new file mode 100644 index 00000000000..777a842dc44 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/Identifier.java @@ -0,0 +1,10 @@ +package org.jetbrains.jet.j2k.ast; + +/** + * @author ignatov + */ +public interface Identifier extends INode { + public String getName(); + + public boolean isEmpty(); +} diff --git a/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java b/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java new file mode 100644 index 00000000000..a17b486ed9b --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java @@ -0,0 +1,36 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class IdentifierImpl extends Expression implements Identifier { + private final String myName; + + public IdentifierImpl(String name) { + myName = name; + } + + @Override + public String getName() { + return myName; + } + + @Override + public boolean isEmpty() { + return myName.length() == 0; + } + + private String quote(String str) { + return BACKTICK + str + BACKTICK; + } + + @NotNull + @Override + public String toKotlin() { + if (ONLY_KOTLIN_KEYWORDS.contains(myName)) + return quote(myName); + return myName; + } +} \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/ast/Import.java b/src/org/jetbrains/jet/j2k/ast/Import.java new file mode 100644 index 00000000000..973f2387f80 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/Import.java @@ -0,0 +1,20 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class Import extends Node { + private String myName; + + public Import(String name) { + myName = name; + } + + @NotNull + @Override + public String toKotlin() { + return "import" + SPACE + myName; + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/LiteralExpression.java b/src/org/jetbrains/jet/j2k/ast/LiteralExpression.java new file mode 100644 index 00000000000..2c46150f753 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/LiteralExpression.java @@ -0,0 +1,20 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class LiteralExpression extends Expression { + private Identifier myIdentifier; + + public LiteralExpression(Identifier identifier) { + myIdentifier = identifier; + } + + @NotNull + @Override + public String toKotlin() { + return myIdentifier.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/LocalVariable.java b/src/org/jetbrains/jet/j2k/ast/LocalVariable.java new file mode 100644 index 00000000000..572199b3cab --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/LocalVariable.java @@ -0,0 +1,28 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class LocalVariable extends Expression { + private Identifier myIdentifier; + private Type myType; + private Expression myInitializer; + + public LocalVariable(Identifier identifier, Type type, Expression initializer) { + myIdentifier = identifier; + myType = type; + myInitializer = initializer; + } + + @NotNull + @Override + public String toKotlin() { + if (myInitializer.toKotlin().isEmpty()) // TODO: remove + return myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin(); + + return myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin() + SPACE + + EQUAL + SPACE + myInitializer.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java b/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java new file mode 100644 index 00000000000..3153d6fb760 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java @@ -0,0 +1,22 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class MethodCallExpression extends Expression { + private Expression myMethodCall; + private Element myParamList; + + public MethodCallExpression(Expression methodCall, Element paramList) { + myMethodCall = methodCall; + myParamList = paramList; + } + + @NotNull + @Override + public String toKotlin() { + return myMethodCall.toKotlin() + "(" + myParamList.toKotlin() + ")"; + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/Node.java b/src/org/jetbrains/jet/j2k/ast/Node.java new file mode 100644 index 00000000000..0c063354d7f --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/Node.java @@ -0,0 +1,42 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +/** + * @author ignatov + */ +public abstract class Node implements INode { + @NotNull + @Override + public Kind getKind() { + return Kind.UNDEFINED; + } + + final static Set ONLY_KOTLIN_KEYWORDS = new HashSet(Arrays.asList( + "namespace", "in", "val", "var", "when", "object", + "out", "in", "is", "as", "ref", "override", + "open", "attribute", "lazy", "set", "get", + "fun", "where", "by", "trait", "type", "This" + )); + + public final static Set PRIMITIVE_TYPES = new HashSet(Arrays.asList( + "double", "float", "long", "int", "short", "byte", "boolean", "char" + )); + + static final String N = System.getProperty("line.separator"); + static final String N2 = N + N; + static final String SPACE = " "; + static final String EQUAL = "="; + static final String EMPTY = ""; + static final String DOT = "."; + static final String COLON = ":"; + static final String IN = "in"; + static final String AT = "@"; + static final String BACKTICK = "`"; + static final String QUESTION = "?"; + static final String COMMA_WITH_SPACE = "," + SPACE; +} diff --git a/src/org/jetbrains/jet/j2k/ast/PrimitiveType.java b/src/org/jetbrains/jet/j2k/ast/PrimitiveType.java new file mode 100644 index 00000000000..46af927081e --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/PrimitiveType.java @@ -0,0 +1,20 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class PrimitiveType extends Type { + private Identifier myType; + + public PrimitiveType(Identifier type) { + myType = type; + } + + @NotNull + @Override + public String toKotlin() { + return myType.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/ReturnStatement.java b/src/org/jetbrains/jet/j2k/ast/ReturnStatement.java new file mode 100644 index 00000000000..034c538e0f5 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/ReturnStatement.java @@ -0,0 +1,20 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class ReturnStatement extends Statement { + private Expression myExpression; + + public ReturnStatement(Expression expression) { + myExpression = expression; + } + + @NotNull + @Override + public String toKotlin() { + return "return" + SPACE + myExpression.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/Statement.java b/src/org/jetbrains/jet/j2k/ast/Statement.java new file mode 100644 index 00000000000..1f6c667eb1b --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/Statement.java @@ -0,0 +1,7 @@ +package org.jetbrains.jet.j2k.ast; + +/** + * @author ignatov + */ +public abstract class Statement extends Element { +} diff --git a/src/org/jetbrains/jet/j2k/ast/Trait.java b/src/org/jetbrains/jet/j2k/ast/Trait.java new file mode 100644 index 00000000000..90356dccda5 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/Trait.java @@ -0,0 +1,13 @@ +package org.jetbrains.jet.j2k.ast; + +import java.util.List; + +/** + * @author ignatov + */ +public class Trait extends Class { + public Trait(Identifier name, List innerClasses, List methods, List fields) { + super(name, innerClasses, methods, fields); + TYPE = "trait"; + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/Type.java b/src/org/jetbrains/jet/j2k/ast/Type.java new file mode 100644 index 00000000000..7f040f92002 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/Type.java @@ -0,0 +1,14 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public abstract class Type extends Element { + @NotNull + @Override + public Kind getKind() { + return Kind.TYPE; + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/Visitor.java b/src/org/jetbrains/jet/j2k/ast/Visitor.java new file mode 100644 index 00000000000..fa1a2126af7 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/Visitor.java @@ -0,0 +1,11 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public interface Visitor { + @NotNull + Element getResult(); +} diff --git a/src/org/jetbrains/jet/j2k/util/AstUtil.java b/src/org/jetbrains/jet/j2k/util/AstUtil.java new file mode 100644 index 00000000000..7b2c391fe3c --- /dev/null +++ b/src/org/jetbrains/jet/j2k/util/AstUtil.java @@ -0,0 +1,44 @@ +package org.jetbrains.jet.j2k.util; + +import org.jetbrains.jet.j2k.ast.INode; + +import java.util.LinkedList; +import java.util.List; + +/** + * @author ignatov + */ +public class AstUtil { + private static String join(final String array[], final String delimiter) { + StringBuilder buffer = new StringBuilder(); + boolean haveDelimiter = (delimiter != null); + + for (int i = 0; i < array.length; i++) { + buffer.append(array[i]); + + if (haveDelimiter && (i + 1) < array.length) + buffer.append(delimiter); + } + + return buffer.toString(); + } + + public static String joinNodes(final List nodes, final String delimiter) { + return join(nodesToKotlin(nodes), delimiter); + } + + public static String join(final List array, final String delimiter) { + return join(array.toArray(new String[array.size()]), delimiter); + } + + public static List nodesToKotlin(List nodes) { + List result = new LinkedList(); + for (INode n : nodes) + result.add(n.toKotlin()); + return result; + } + + public static String upperFirstCharacter(String string) { + return string.substring(0, 1).toUpperCase() + string.substring(1); + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java new file mode 100644 index 00000000000..044bd709f36 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java @@ -0,0 +1,41 @@ +package org.jetbrains.jet.j2k.visitors; + +import com.intellij.psi.JavaElementVisitor; +import com.intellij.psi.PsiExpressionList; +import com.intellij.psi.PsiLocalVariable; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.j2k.ast.*; + +import static org.jetbrains.jet.j2k.Converter.*; + +/** + * @author ignatov + */ +public class ElementVisitor extends JavaElementVisitor implements Visitor { + private Element myResult = new EmptyElement(); + + @Override + public void visitLocalVariable(PsiLocalVariable variable) { + super.visitLocalVariable(variable); + myResult = new LocalVariable( + new IdentifierImpl(variable.getName()), // TODO + typeToType(variable.getType()), + expressionToExpression(variable.getInitializer()) + ); + } + + @Override + public void visitExpressionList(PsiExpressionList list) { + super.visitExpressionList(list); + myResult = new ExpressionList( + expressionsToExpressionList(list.getExpressions()), + typesToTypeList(list.getExpressionTypes()) + ); + + } + + @NotNull + public Element getResult() { + return myResult; + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java new file mode 100644 index 00000000000..14afb1ba126 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -0,0 +1,209 @@ +package org.jetbrains.jet.j2k.visitors; + +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.ast.*; + +import static org.jetbrains.jet.j2k.Converter.elementToElement; +import static org.jetbrains.jet.j2k.Converter.expressionToExpression; + +/** + * @author ignatov + */ +public class ExpressionVisitor extends StatementVisitor implements Visitor { + private Expression myResult = new EmptyExpression(); + + @NotNull + public Expression getResult() { + return myResult; + } + + @Override + public void visitArrayAccessExpression(PsiArrayAccessExpression expression) { + super.visitArrayAccessExpression(expression); + } + + @Override + public void visitArrayInitializerExpression(PsiArrayInitializerExpression expression) { + super.visitArrayInitializerExpression(expression); + } + + @Override + public void visitAssignmentExpression(PsiAssignmentExpression expression) { + super.visitAssignmentExpression(expression); + + // TODO: simplify + + final IElementType tokenType = expression.getOperationSign().getTokenType(); + + if (tokenType == JavaTokenType.GTGTGTEQ) { // because it's transform to the method call + myResult = new AssignmentExpression( + expressionToExpression(expression.getLExpression()), + new DummyMethodCallExpression( + expressionToExpression(expression.getLExpression()), + "cyclicShiftRight", + expressionToExpression(expression.getRExpression()) + ), + "=" + ); + } else { + + String secondOp = ""; + if (tokenType == JavaTokenType.GTGTEQ) secondOp = "shr"; + if (tokenType == JavaTokenType.LTLTEQ) secondOp = "shl"; + if (tokenType == JavaTokenType.XOREQ) secondOp = "xor"; + if (tokenType == JavaTokenType.ANDEQ) secondOp = "and"; + if (tokenType == JavaTokenType.OREQ) secondOp = "or"; + + if (!secondOp.equals("")) // if not Kotlin operators + myResult = new AssignmentExpression( + expressionToExpression(expression.getLExpression()), + new BinaryExpression( + expressionToExpression(expression.getLExpression()), + expressionToExpression(expression.getRExpression()), + secondOp + ), + "=" + ); + else + myResult = new AssignmentExpression( + expressionToExpression(expression.getLExpression()), + expressionToExpression(expression.getRExpression()), + expression.getOperationSign().getText() // TODO + ); + } + } + + private String getOperatorString(PsiJavaToken op) { + if (op.getTokenType() == JavaTokenType.GTGT) return "shr"; + if (op.getTokenType() == JavaTokenType.LTLT) return "shl"; + if (op.getTokenType() == JavaTokenType.XOR) return "xor"; + if (op.getTokenType() == JavaTokenType.AND) return "and"; + if (op.getTokenType() == JavaTokenType.OR) return "or"; + if (op.getTokenType() == JavaTokenType.OR) return "or"; + + return op.getText(); + } + + @Override + public void visitBinaryExpression(PsiBinaryExpression expression) { + super.visitBinaryExpression(expression); + + if (expression.getOperationSign().getTokenType() == JavaTokenType.GTGTGT) + myResult = new DummyMethodCallExpression( + expressionToExpression(expression.getLOperand()), + "cyclicShiftRight", + expressionToExpression(expression.getROperand())); + else + myResult = + new BinaryExpression( + expressionToExpression(expression.getLOperand()), + expressionToExpression(expression.getROperand()), + getOperatorString(expression.getOperationSign()) + ); + } + + @Override + public void visitClassObjectAccessExpression(PsiClassObjectAccessExpression expression) { + super.visitClassObjectAccessExpression(expression); + } + + @Override + public void visitConditionalExpression(PsiConditionalExpression expression) { + super.visitConditionalExpression(expression); + } + + @Override + public void visitExpressionListStatement(PsiExpressionListStatement statement) { + super.visitExpressionListStatement(statement); + } + + @Override + public void visitExpressionStatement(PsiExpressionStatement statement) { + super.visitExpressionStatement(statement); + } + + @Override + public void visitExpressionList(PsiExpressionList list) { + super.visitExpressionList(list); + } + + @Override + public void visitInstanceOfExpression(PsiInstanceOfExpression expression) { + super.visitInstanceOfExpression(expression); + } + + @Override + public void visitLiteralExpression(PsiLiteralExpression expression) { + super.visitLiteralExpression(expression); + myResult = new LiteralExpression( + new IdentifierImpl( + ((PsiLiteralExpressionImpl) expression).getCanonicalText() // TODO + ) + ); + } + + @Override + public void visitMethodCallExpression(PsiMethodCallExpression expression) { + super.visitMethodCallExpression(expression); + // TODO: not resolved + myResult = + new MethodCallExpression( + expressionToExpression(expression.getMethodExpression()), + elementToElement(expression.getArgumentList()) + ); + } + + @Override + public void visitCallExpression(PsiCallExpression callExpression) { + super.visitCallExpression(callExpression); + } + + @Override + public void visitNewExpression(PsiNewExpression expression) { + super.visitNewExpression(expression); + } + + @Override + public void visitParenthesizedExpression(PsiParenthesizedExpression expression) { + super.visitParenthesizedExpression(expression); + } + + @Override + public void visitPostfixExpression(PsiPostfixExpression expression) { + super.visitPostfixExpression(expression); + } + + @Override + public void visitPrefixExpression(PsiPrefixExpression expression) { + super.visitPrefixExpression(expression); + } + + @Override + public void visitReferenceExpression(PsiReferenceExpression expression) { + super.visitReferenceExpression(expression); + myResult = new IdentifierImpl(expression.getQualifiedName()); // TODO + } + + @Override + public void visitSuperExpression(PsiSuperExpression expression) { + super.visitSuperExpression(expression); + } + + @Override + public void visitThisExpression(PsiThisExpression expression) { + super.visitThisExpression(expression); + } + + @Override + public void visitTypeCastExpression(PsiTypeCastExpression expression) { + super.visitTypeCastExpression(expression); + } + + @Override + public void visitPolyadicExpression(PsiPolyadicExpression expression) { + super.visitPolyadicExpression(expression); + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java new file mode 100644 index 00000000000..96c3a3206c1 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -0,0 +1,141 @@ +package org.jetbrains.jet.j2k.visitors; + +import com.intellij.psi.*; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.j2k.Converter; +import org.jetbrains.jet.j2k.ast.*; + +/** + * @author ignatov + */ +public class StatementVisitor extends ElementVisitor implements Visitor { + private Statement myResult = new EmptyStatement(); + + @NotNull + public Statement getStatement() { + return myResult; + } + + @Override + public void visitAssertStatement(PsiAssertStatement statement) { + super.visitAssertStatement(statement); + } + + @Override + public void visitBlockStatement(PsiBlockStatement statement) { + super.visitBlockStatement(statement); + } + + @Override + public void visitBreakStatement(PsiBreakStatement statement) { + super.visitBreakStatement(statement); + } + + @Override + public void visitContinueStatement(PsiContinueStatement statement) { + super.visitContinueStatement(statement); + } + + @Override + public void visitDeclarationStatement(PsiDeclarationStatement statement) { + super.visitDeclarationStatement(statement); + myResult = new DeclarationStatement( + Converter.elementsToElementList(statement.getDeclaredElements()) + ); + } + + @Override + public void visitDoWhileStatement(PsiDoWhileStatement statement) { + super.visitDoWhileStatement(statement); + } + + @Override + public void visitEmptyStatement(PsiEmptyStatement statement) { + super.visitEmptyStatement(statement); + } + + @Override + public void visitExpressionStatement(PsiExpressionStatement statement) { + super.visitExpressionStatement(statement); + myResult = Converter.expressionToExpression(statement.getExpression()); + } + + @Override + public void visitExpressionListStatement(PsiExpressionListStatement statement) { + super.visitExpressionListStatement(statement); + } + + @Override + public void visitForStatement(PsiForStatement statement) { + super.visitForStatement(statement); + } + + @Override + public void visitForeachStatement(PsiForeachStatement statement) { + super.visitForeachStatement(statement); + } + + @Override + public void visitImportStatement(PsiImportStatement statement) { + super.visitImportStatement(statement); + } + + @Override + public void visitIfStatement(PsiIfStatement statement) { + super.visitIfStatement(statement); + } + + @Override + public void visitImportStaticStatement(PsiImportStaticStatement statement) { + super.visitImportStaticStatement(statement); + } + + @Override + public void visitLabeledStatement(PsiLabeledStatement statement) { + super.visitLabeledStatement(statement); + } + + @Override + public void visitPackageStatement(PsiPackageStatement statement) { + super.visitPackageStatement(statement); + } + + @Override + public void visitSwitchLabelStatement(PsiSwitchLabelStatement statement) { + super.visitSwitchLabelStatement(statement); + } + + @Override + public void visitSwitchStatement(PsiSwitchStatement statement) { + super.visitSwitchStatement(statement); + } + + @Override + public void visitSynchronizedStatement(PsiSynchronizedStatement statement) { + super.visitSynchronizedStatement(statement); + } + + @Override + public void visitThrowStatement(PsiThrowStatement statement) { + super.visitThrowStatement(statement); + } + + @Override + public void visitTryStatement(PsiTryStatement statement) { + super.visitTryStatement(statement); + } + + @Override + public void visitWhileStatement(PsiWhileStatement statement) { + super.visitWhileStatement(statement); + } + + @Override + public void visitReturnStatement(PsiReturnStatement statement) { + super.visitReturnStatement(statement); + + myResult = new ReturnStatement( + Converter.expressionToExpression(statement.getReturnValue()) + ); + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java new file mode 100644 index 00000000000..fbac51b6861 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java @@ -0,0 +1,67 @@ +package org.jetbrains.jet.j2k.visitors; + +import com.intellij.psi.*; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.j2k.ast.*; +import org.jetbrains.jet.j2k.util.AstUtil; + +/** + * @author ignatov + */ +public class TypeVisitor extends PsiTypeVisitor implements Visitor { + private Type myResult = new EmptyType(); + + @NotNull + public Type getResult() { + return myResult; + } + + @Override + public Type visitType(PsiType type) { + return super.visitType(type); + } + + @Override + public Type visitPrimitiveType(PsiPrimitiveType primitiveType) { + final String name = primitiveType.getCanonicalText(); + final IdentifierImpl identifier = new IdentifierImpl(name); + + if (name.equals("void")) + myResult = new PrimitiveType(new IdentifierImpl("Unit")); + else if (Node.PRIMITIVE_TYPES.contains(name)) + myResult = new PrimitiveType(new IdentifierImpl(AstUtil.upperFirstCharacter(name))); + else myResult = new PrimitiveType(identifier); + return super.visitPrimitiveType(primitiveType); + } + + @Override + public Type visitArrayType(PsiArrayType arrayType) { + return super.visitArrayType(arrayType); + } + + @Override + public Type visitClassType(PsiClassType classType) { + myResult = new ClassType(new IdentifierImpl(classType.getClassName())); + return super.visitClassType(classType); + } + + @Override + public Type visitCapturedWildcardType(PsiCapturedWildcardType capturedWildcardType) { + return super.visitCapturedWildcardType(capturedWildcardType); + } + + @Override + public Type visitWildcardType(PsiWildcardType wildcardType) { + return super.visitWildcardType(wildcardType); + } + + @Override + public Type visitEllipsisType(PsiEllipsisType ellipsisType) { + return super.visitEllipsisType(ellipsisType); + } + + @Override + public Type visitDisjunctionType(PsiDisjunctionType disjunctionType) { + return super.visitDisjunctionType(disjunctionType); + } +} diff --git a/test/org/jetbrains/jet/j2k/FileTest.java b/test/org/jetbrains/jet/j2k/FileTest.java new file mode 100644 index 00000000000..8d5a8f6a92c --- /dev/null +++ b/test/org/jetbrains/jet/j2k/FileTest.java @@ -0,0 +1,60 @@ +package org.jetbrains.jet.j2k; + +import junit.framework.Assert; + +/** + * @author ignatov + */ +public class FileTest extends JetTestCaseBase { + public void testPackageWithImports() throws Exception { + Assert.assertEquals( + fileToKotlin( + "package test;" + + "import ast;" + + "import ast2;"), + "namespace test {" + "\n" + + "import ast" + "\n" + + "import ast2" + "\n" + + "}" + ); + } + + public void testPackageWithMixedImports() throws Exception { + Assert.assertEquals( + fileToKotlin( + "package test;" + + "import static ast;" + + "import ast2;"), + "namespace test {" + "\n" + + "import ast" + "\n" + + "import ast2" + "\n" + + "}" + ); + } + + public void testPackageWithStaticImports() throws Exception { + Assert.assertEquals( + fileToKotlin( + "package test;" + + "import static ast;" + + "import static ast2;"), + "namespace test {" + "\n" + + "import ast" + "\n" + + "import ast2" + "\n" + + "}" + ); + } + + public void testPackageWithClass() throws Exception { + Assert.assertEquals( + toSingleLine(fileToKotlin("package test; class C {}")), + "namespace test { class C { } }" + ); + } + + public void testPackageWithClasses() throws Exception { + Assert.assertEquals( + toSingleLine(fileToKotlin("class A {} class B {}")), + "namespace { class A { } class B { } }"); + } +} diff --git a/test/org/jetbrains/jet/j2k/JetTestCaseBase.java b/test/org/jetbrains/jet/j2k/JetTestCaseBase.java new file mode 100644 index 00000000000..b210ee6fc36 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/JetTestCaseBase.java @@ -0,0 +1,200 @@ +package org.jetbrains.jet.j2k; + +import com.intellij.codeInsight.daemon.LightDaemonAnalyzerTestCase; +import com.intellij.openapi.application.PathManager; +import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.openapi.projectRoots.impl.JavaSdkImpl; +import com.intellij.psi.PsiJavaFile; +import junit.framework.Test; +import junit.framework.TestSuite; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.FileFilter; +import java.io.FilenameFilter; +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * @author abreslav + */ +public abstract class JetTestCaseBase extends LightDaemonAnalyzerTestCase { + private boolean checkInfos = false; + private String dataPath; + protected final String name; + + protected JetTestCaseBase() { + this("", ""); + } + + public JetTestCaseBase(String dataPath, String name) { + this.dataPath = dataPath; + this.name = name; + } + + public final JetTestCaseBase setCheckInfos(boolean checkInfos) { + this.checkInfos = checkInfos; + return this; + } + + public static Sdk jdkFromIdeaHome() { + return new JavaSdkImpl().createJdk("JDK", "compiler/testData/mockJDK-1.7/jre", true); + } + + @Override + protected String getTestDataPath() { + return getTestDataPathBase(); + } + + public static String getTestDataPathBase() { + return getHomeDirectory() + "/compiler/testData"; + } + + public static String getHomeDirectory() { + return new File(PathManager.getResourceRoot(JetTestCaseBase.class, "/org/jetbrains/jet/JetTestCaseBase.class")).getParentFile().getParentFile().getParent(); + } + + @Override + protected Sdk getProjectJDK() { + return jdkFromIdeaHome(); + } + +// @Override +// public String getName() { +// return "test" + name; +// } + +// @Override +// protected void runTest() throws Throwable { +// doTest(getTestFilePath(), true, checkInfos); +// } + + @NotNull + protected String getTestFilePath() { + return dataPath + File.separator + name + ".jet"; + } + + protected String getDataPath() { + return dataPath; + } + + protected void configureFromText(String text) throws IOException { + configureFromFileText("test.java", text); + } + + @NotNull + protected String classToKotlin(String text) throws IOException { + configureFromText(text); + + PsiJavaFile javaFile = (PsiJavaFile) myFile; + + String result = prettify(Converter.fileToFile(javaFile).toKotlin()).replaceAll("namespace \\{", ""); + result = result.substring(0, result.lastIndexOf("}")); + return prettify(result); + + } + + @NotNull + protected String classToSingleLineKotlin(String text) throws IOException { + return toSingleLine(classToKotlin(text)); + } + + protected String fileToKotlin(String text) throws IOException { + configureFromText(text); + return prettify(Converter.fileToFile((PsiJavaFile) myFile).toKotlin()); + } + + protected String methodToKotlin(String text) throws IOException { + String result = classToKotlin("class C {" + text + "}") + .replaceAll("class C \\{", ""); + result = result.substring(0, result.lastIndexOf("}")); + return prettify(result); + } + + protected String methodToSingleLineKotlin(String text) throws IOException { + return toSingleLine(methodToKotlin(text)); + } + + protected String statementToKotlin(String text) throws Exception { + String result = methodToKotlin("void main() {" + text + "}"); + int pos = result.lastIndexOf("}"); + result = result.substring(0, pos).replaceFirst("fun main\\(\\) : Unit \\{", ""); + return prettify(result); + } + + protected String statementToSingleLineKotlin(String code) throws Exception { + return toSingleLine(statementToKotlin(code)); + } + + protected String expressionToKotlin(String code) throws Exception { + String result = statementToKotlin("Object o =" + code + "}"); + result = result.replaceFirst("var o : Object\\? =", ""); + return prettify(result); + } + + protected String expressionToSingleLineKotlin(String code) throws Exception { + return toSingleLine(expressionToKotlin(code)); + } + + public interface NamedTestFactory { + @NotNull + Test createTest(@NotNull String dataPath, @NotNull String name); + } + + @NotNull + public static TestSuite suiteForDirectory(String baseDataDir, @NotNull final String dataPath, boolean recursive, @NotNull NamedTestFactory factory) { + TestSuite suite = new TestSuite(dataPath); + final String extension = ".jet"; + FilenameFilter extensionFilter = new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + return name.endsWith(extension); + } + }; + File dir = new File(baseDataDir + dataPath); + FileFilter dirFilter = new FileFilter() { + @Override + public boolean accept(File pathname) { + return pathname.isDirectory(); + } + }; + if (recursive) { + File[] files = dir.listFiles(dirFilter); + assert files != null : dir; + List subdirs = Arrays.asList(files); + Collections.sort(subdirs); + for (File subdir : subdirs) { + suite.addTest(suiteForDirectory(baseDataDir, dataPath + "/" + subdir.getName(), recursive, factory)); + } + } + List files = Arrays.asList(dir.listFiles(extensionFilter)); + Collections.sort(files); + for (File file : files) { + String fileName = file.getName(); + assert fileName != null; + suite.addTest(factory.createTest(dataPath, fileName.substring(0, fileName.length() - extension.length()))); + } + return suite; + } + + @NotNull + protected static String prettify(String code) { + if (code == null) + return ""; + return code + .trim() + .replaceAll("\r\n", "\n") + .replaceAll("\n+", "\n") + .replaceAll("\n ", "\n") + .replaceAll(" +", " ") + .trim() + ; + } + + @NotNull + protected static String toSingleLine(String string) { + return prettify(string.replaceAll("\n", " ")); + } +} \ No newline at end of file diff --git a/test/org/jetbrains/jet/j2k/ast/AssignmentExpressionTest.java b/test/org/jetbrains/jet/j2k/ast/AssignmentExpressionTest.java new file mode 100644 index 00000000000..40e6470465a --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/AssignmentExpressionTest.java @@ -0,0 +1,61 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class AssignmentExpressionTest extends JetTestCaseBase { + public void testSimpleAssignment() throws Exception { + Assert.assertEquals(statementToSingleLineKotlin("i = 1;"), "i = 1"); + } + + public void testShiftRight() throws Exception { + Assert.assertEquals(expressionToKotlin("x >>= 2"), "x = (x shr 2)"); + } + + public void testShiftLeft() throws Exception { + Assert.assertEquals(expressionToKotlin("x <<= 2"), "x = (x shl 2)"); + } + + public void testUnsignedRightShift() throws Exception { + Assert.assertEquals(expressionToKotlin("x >>>= 2"), "x = x.cyclicShiftRight(2)"); + } + + public void testXor() throws Exception { + Assert.assertEquals(expressionToKotlin("x ^= 2"), "x = (x xor 2)"); + } + + public void testAnd() throws Exception { + Assert.assertEquals(expressionToKotlin("x &= 2"), "x = (x and 2)"); + } + + public void testOr() throws Exception { + Assert.assertEquals(expressionToKotlin("x |= 2"), "x = (x or 2)"); + } + + public void testMultiplyAssign() throws Exception { + Assert.assertEquals(expressionToKotlin("x *= 2"), "x *= 2"); + } + + public void testDivideAssign() throws Exception { + Assert.assertEquals(expressionToKotlin("x /= 2"), "x /= 2"); + } + + public void testPlusAssign() throws Exception { + Assert.assertEquals(expressionToKotlin("x += 2"), "x += 2"); + } + + public void testMinusAssign() throws Exception { + Assert.assertEquals(expressionToKotlin("x -= 2"), "x -= 2"); + } + + public void testReminder() throws Exception { + Assert.assertEquals(expressionToKotlin("x %= 2"), "x %= 2"); + } + + public void testAssignment() throws Exception { + Assert.assertEquals(expressionToKotlin("x = 2"), "x = 2"); + } +} \ No newline at end of file diff --git a/test/org/jetbrains/jet/j2k/ast/BinaryExpressionTest.java b/test/org/jetbrains/jet/j2k/ast/BinaryExpressionTest.java new file mode 100644 index 00000000000..d87c90c892a --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/BinaryExpressionTest.java @@ -0,0 +1,81 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class BinaryExpressionTest extends JetTestCaseBase { + public void testMultiply() throws Exception { + Assert.assertEquals(expressionToKotlin("1 * 2"), "(1 * 2)"); + } + + public void testDivide() throws Exception { + Assert.assertEquals(expressionToKotlin("1 / 2"), "(1 / 2)"); + } + + public void testRemainder() throws Exception { + Assert.assertEquals(expressionToKotlin("1 % 2"), "(1 % 2)"); + } + + public void testPlus() throws Exception { + Assert.assertEquals(expressionToKotlin("1 + 2"), "(1 + 2)"); + } + + public void testMinus() throws Exception { + Assert.assertEquals(expressionToKotlin("1 - 2"), "(1 - 2)"); + } + + public void testLessThan() throws Exception { + Assert.assertEquals(expressionToKotlin("1 < 2"), "(1 < 2)"); + } + + public void testGreaterThan() throws Exception { + Assert.assertEquals(expressionToKotlin("1 > 2"), "(1 > 2)"); + } + + public void testLessThanEqual() throws Exception { + Assert.assertEquals(expressionToKotlin("1 <= 2"), "(1 <= 2)"); + } + + public void testGreaterThanEqual() throws Exception { + Assert.assertEquals(expressionToKotlin("1 >= 2"), "(1 >= 2)"); + } + + public void testConditionalAnd() throws Exception { + Assert.assertEquals(expressionToKotlin("true && false"), "(true && false)"); + } + + public void testConditionalOr() throws Exception { + Assert.assertEquals(expressionToKotlin("true || false"), "(true || false)"); + } + + public void testShiftRight() throws Exception { + Assert.assertEquals(expressionToKotlin("x >> 2"), "(x shr 2)"); + } + + public void testShiftLeft() throws Exception { + Assert.assertEquals(expressionToKotlin("x << 2"), "(x shl 2)"); + } + + public void testUnsignedRightShift() throws Exception { + Assert.assertEquals(expressionToKotlin("x >>> 2"), "x.cyclicShiftRight(2)"); + } + + public void testXor() throws Exception { + Assert.assertEquals(expressionToKotlin("x ^ 2"), "(x xor 2)"); + } + + public void testAnd() throws Exception { + Assert.assertEquals(expressionToKotlin("x & 2"), "(x and 2)"); + } + + public void testOr() throws Exception { + Assert.assertEquals(expressionToKotlin("x | 2"), "(x or 2)"); + } + +// public void testNot() throws Exception { // TODO: move to prefix +// Assert.assertEquals(expressionToKotlin("~x"), "inv(x)"); +// } +} diff --git a/test/org/jetbrains/jet/j2k/ast/ClassTest.java b/test/org/jetbrains/jet/j2k/ast/ClassTest.java new file mode 100644 index 00000000000..67397afe71d --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/ClassTest.java @@ -0,0 +1,65 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class ClassTest extends JetTestCaseBase { + public void testEmptyClass() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin("final class A {}"), + "class A { }" + ); + } + + public void testInnerEmptyClass() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin("final class A { inner final class B {} }"), + "class A { class B { } }" + ); + } + + public void testClassWithFields() throws Exception { + Assert.assertEquals(classToKotlin( + "final class T {" + + "String a = \"abc\";" + + "int b = 10;" + + "}"), + "class T {\n" + + "var a : String? = \"abc\"\n" + + "var b : Int = 10\n" + + "}"); + } + + public void testClassWithMultiplyFields() throws Exception { + Assert.assertEquals(classToKotlin( + "final class T {" + + "String a, b, c = \"abc\";" + + "}"), + "class T {\n" + + "var a : String?\n" + + "var b : String?\n" + + "var c : String? = \"abc\"\n" + + "}"); + } + + public void testClassWithEmptyMethods() throws Exception { + Assert.assertEquals(classToKotlin( + "final class T {" + + "void main() {}" + + "int i() {}" + + "String s() {}" + + "}" + ), + "class T {\n" + + "fun main() : Unit {\n" + + "}\n" + + "fun i() : Int {\n" + + "}\n" + + "fun s() : String? {\n" + + "}\n" + + "}"); + } +} diff --git a/test/org/jetbrains/jet/j2k/ast/DeclarationStatementTest.java b/test/org/jetbrains/jet/j2k/ast/DeclarationStatementTest.java new file mode 100644 index 00000000000..f544399cf27 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/DeclarationStatementTest.java @@ -0,0 +1,33 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class DeclarationStatementTest extends JetTestCaseBase { + public void testSingleStringDeclaration() throws Exception { + Assert.assertEquals( + statementToSingleLineKotlin("String s;"), + "var s : String?" + ); + } + + public void testSingleIntDeclaration() throws Exception { + Assert.assertEquals( + statementToSingleLineKotlin("int s;"), + "var s : Int" + ); + } + + public void testMultiplyIntDeclaration() throws Exception { + Assert.assertEquals( + statementToKotlin("int k, l, m;"), + "var k : Int\n" + + "var l : Int\n" + + "var m : Int" + ); + } + +} diff --git a/test/org/jetbrains/jet/j2k/ast/EnumTest.java b/test/org/jetbrains/jet/j2k/ast/EnumTest.java new file mode 100644 index 00000000000..da270403b3c --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/EnumTest.java @@ -0,0 +1,28 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class EnumTest extends JetTestCaseBase { + public void testEmptyEnum() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin("enum A {}"), + "enum A { }" + ); + } + +// public void testTypeSafeEnum() throws Exception { +// Assert.assertEquals( +// classToKotlin("enum Coin { PENNY, NICKEL, DIME, QUARTER; }"), +// "enum Coin {\n" + +// "PENNY\n" + +// "NICKEL\n" + +// "DIME\n" + +// "QUARTER\n" + +// "}" +// ); +// } +} diff --git a/test/org/jetbrains/jet/j2k/ast/FunctionTest.java b/test/org/jetbrains/jet/j2k/ast/FunctionTest.java new file mode 100644 index 00000000000..dd2297deb96 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/FunctionTest.java @@ -0,0 +1,44 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class FunctionTest extends JetTestCaseBase { + public void testEmptyVoidMethod() throws Exception { + Assert.assertEquals( + methodToSingleLineKotlin("void main() {}"), + "fun main() : Unit { }" + ); + } + + public void testMethodClassType() throws Exception { + Assert.assertEquals( + methodToSingleLineKotlin("String main() {}"), + "fun main() : String? { }" + ); + } + + public void testMethodPrimitiveType() throws Exception { + Assert.assertEquals( + methodToSingleLineKotlin("int main() {}"), + "fun main() : Int { }" + ); + } + + public void testMethodPrimitiveType2() throws Exception { + Assert.assertEquals( + methodToSingleLineKotlin("boolean main() {}"), + "fun main() : Boolean { }" + ); + } + + public void testMethodWithReturnStatement() throws Exception { + Assert.assertEquals( + methodToSingleLineKotlin("boolean isTrue() { return true; }"), + "fun isTrue() : Boolean { return true }" + ); + } +} \ No newline at end of file diff --git a/test/org/jetbrains/jet/j2k/ast/IdentifierImplTest.java b/test/org/jetbrains/jet/j2k/ast/IdentifierImplTest.java new file mode 100644 index 00000000000..9b5dd9aff52 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/IdentifierImplTest.java @@ -0,0 +1,11 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.TestCase; + +/** + * @author ignatov + */ +public class IdentifierImplTest extends TestCase { + public void testEmpty() throws Exception { // TODO: remove + } +} diff --git a/test/org/jetbrains/jet/j2k/ast/LocalVariableTest.java b/test/org/jetbrains/jet/j2k/ast/LocalVariableTest.java new file mode 100644 index 00000000000..fc056e3790e --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/LocalVariableTest.java @@ -0,0 +1,16 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class LocalVariableTest extends JetTestCaseBase { + public void testObject() throws Exception { + Assert.assertEquals( + statementToSingleLineKotlin("int i;"), + "var i : Int" + ); + } +} diff --git a/test/org/jetbrains/jet/j2k/ast/MethodCallExpressionTest.java b/test/org/jetbrains/jet/j2k/ast/MethodCallExpressionTest.java new file mode 100644 index 00000000000..76d11053c28 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/MethodCallExpressionTest.java @@ -0,0 +1,27 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class MethodCallExpressionTest extends JetTestCaseBase { + public void testSimpleCall() throws Exception { + Assert.assertEquals( + statementToSingleLineKotlin("method(param1, param2);"), "method(param1, param2)" + ); + } + + public void testEmptyCall() throws Exception { + Assert.assertEquals( + statementToSingleLineKotlin("methodCall();"), "methodCall()" + ); + } + + public void testCallWithKeywords() throws Exception { + Assert.assertEquals( + statementToSingleLineKotlin("when(open, trait);"), "`when`(`open`, `trait`)" + ); + } +} diff --git a/test/org/jetbrains/jet/j2k/ast/ReturnStatementTest.java b/test/org/jetbrains/jet/j2k/ast/ReturnStatementTest.java new file mode 100644 index 00000000000..92fce59b4e4 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/ReturnStatementTest.java @@ -0,0 +1,37 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class ReturnStatementTest extends JetTestCaseBase { + public void testReturnLiteral() throws Exception { + Assert.assertEquals( + statementToSingleLineKotlin("return true;"), + "return true" + ); + } + + public void testReturnString() throws Exception { + Assert.assertEquals( + statementToSingleLineKotlin("return \"str\";"), + "return \"str\"" + ); + } + + public void testReturnNumber() throws Exception { + Assert.assertEquals( + statementToSingleLineKotlin("return 1;"), + "return 1" + ); + } + + public void testReturnChar() throws Exception { + Assert.assertEquals( + statementToSingleLineKotlin("return 'c';"), + "return 'c'" + ); + } +} diff --git a/test/org/jetbrains/jet/j2k/ast/TraitTest.java b/test/org/jetbrains/jet/j2k/ast/TraitTest.java new file mode 100644 index 00000000000..f638681b49c --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/TraitTest.java @@ -0,0 +1,45 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class TraitTest extends JetTestCaseBase { + public void testEmptyInterface() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin("interface A {}"), + "trait A { }" + ); + } + + public void testInterfaceWithMethodDeclaration() throws Exception { + Assert.assertEquals(classToKotlin( + "interface INode {" + + "Tag getTag();" + + "String toKotlin();" + + "}" + ), + "trait INode {\n" + + "fun getTag() : Tag? \n" + + "fun toKotlin() : String? \n" + + "}"); + } + + public void testInterfaceWithFields() throws Exception { + Assert.assertEquals(classToKotlin( + "interface INode {" + + "String IN = \"in\";" + + "String AT = \"@\";" + + "String COMMA_WITH_SPACE = COMMA + SPACE;" + + "}" + ), + "trait INode {\n" + + "var IN : String? = \"in\"\n" + + "var AT : String? = \"@\"\n" + + "var COMMA_WITH_SPACE : String? = (COMMA + SPACE)\n" + + "}" + ); + } +} \ No newline at end of file From 29a353bcc093f3d086558ebc84e4012393bc8411 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 27 Oct 2011 17:33:59 +0400 Subject: [PATCH 002/206] git root fixed --- j2k.ipr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/j2k.ipr b/j2k.ipr index 784215e36c3..5eb415d5cc6 100644 --- a/j2k.ipr +++ b/j2k.ipr @@ -163,7 +163,7 @@ - + From 5770450b785a60724cfaf886f0c9c9d1a45e1665 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 27 Oct 2011 19:11:06 +0400 Subject: [PATCH 003/206] Parameter added, constructor for enum supported --- src/org/jetbrains/jet/j2k/Converter.java | 43 +++++++- src/org/jetbrains/jet/j2k/ast/Class.java | 14 ++- .../jetbrains/jet/j2k/ast/Constructor.java | 22 ++++ src/org/jetbrains/jet/j2k/ast/Enum.java | 31 +++++- .../jetbrains/jet/j2k/ast/EnumConstant.java | 20 ++++ src/org/jetbrains/jet/j2k/ast/Field.java | 8 +- src/org/jetbrains/jet/j2k/ast/Function.java | 6 +- src/org/jetbrains/jet/j2k/ast/INode.java | 2 +- src/org/jetbrains/jet/j2k/ast/Parameter.java | 22 ++++ .../jetbrains/jet/j2k/ast/ParameterList.java | 23 ++++ .../jet/j2k/visitors/ElementVisitor.java | 9 ++ test/org/jetbrains/jet/j2k/ast/EnumTest.java | 102 ++++++++++++++++-- 12 files changed, 281 insertions(+), 21 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/Constructor.java create mode 100644 src/org/jetbrains/jet/j2k/ast/EnumConstant.java create mode 100644 src/org/jetbrains/jet/j2k/ast/Parameter.java create mode 100644 src/org/jetbrains/jet/j2k/ast/ParameterList.java diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index f4089902c55..defa3ad6c35 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -59,6 +59,12 @@ public class Converter { } private static Field fieldToField(PsiField field) { + if (field instanceof PsiEnumConstant) // TODO: remove instanceof + return new EnumConstant( + new IdentifierImpl(field.getName()), // TODO + typeToType(field.getType()), + elementToElement(((PsiEnumConstant) field).getArgumentList()) + ); return new Field( new IdentifierImpl(field.getName()), // TODO typeToType(field.getType()), @@ -76,8 +82,25 @@ public class Converter { } @NotNull - private static Function methodToFunction(PsiMethod t, boolean notEmpty) { - return new Function(new IdentifierImpl(t.getName()), typeToType(t.getReturnType()), bodyToBlock(t.getBody(), notEmpty)); + private static Function methodToFunction(PsiMethod method, boolean notEmpty) { + final IdentifierImpl identifier = new IdentifierImpl(method.getName()); + final Type type = typeToType(method.getReturnType()); + final Block body = bodyToBlock(method.getBody(), notEmpty); + final Element params = elementToElement(method.getParameterList()); + + if (method.isConstructor()) + return new Constructor( + identifier, + type, + params, + body + ); + return new Function( + identifier, + type, + params, + body + ); } @NotNull @@ -173,4 +196,20 @@ public class Converter { return new Import(t.getImportReference().getQualifiedName()); // TODO: use identifier return new Import(""); } + + @NotNull + public static List parametersToParameterList(PsiParameter[] parameters) { + List result = new LinkedList(); + for (PsiParameter t : parameters) { + result.add(parameterToParameter(t)); + } + return result; + } + + private static Parameter parameterToParameter(PsiParameter parameter) { + return new Parameter( + new IdentifierImpl(parameter.getName()), // TODO: remove + typeToType(parameter.getType()) + ); + } } diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java index 658c11693ab..29395972876 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -3,6 +3,7 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.j2k.util.AstUtil; +import java.util.LinkedList; import java.util.List; /** @@ -22,13 +23,22 @@ public class Class extends Node { myFields = fields; } + @NotNull + protected List methodsExceptConstructors() { + final LinkedList result = new LinkedList(); + for (Function m : myMethods) + if (m.getKind() != Kind.CONSTRUCTOR) + result.add(m); + return result; + } + @NotNull @Override public String toKotlin() { return TYPE + SPACE + myName.toKotlin() + SPACE + "{" + N + - AstUtil.joinNodes(myInnerClasses, N) + N + - AstUtil.joinNodes(myMethods, N) + N + AstUtil.joinNodes(myFields, N) + N + + AstUtil.joinNodes(methodsExceptConstructors(), N) + N + + AstUtil.joinNodes(myInnerClasses, N) + N + "}"; } } diff --git a/src/org/jetbrains/jet/j2k/ast/Constructor.java b/src/org/jetbrains/jet/j2k/ast/Constructor.java new file mode 100644 index 00000000000..6f758dfe1e6 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/Constructor.java @@ -0,0 +1,22 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class Constructor extends Function { + public Constructor(Identifier identifier, Type type, Element params, Block block) { + super(identifier, type, params, block); + } + + public String primary() { + return "(" + myParams.toKotlin() + ")"; + } + + @NotNull + @Override + public Kind getKind() { + return Kind.CONSTRUCTOR; + } +} \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/ast/Enum.java b/src/org/jetbrains/jet/j2k/ast/Enum.java index c390e79b8f2..3b9ec1e2573 100644 --- a/src/org/jetbrains/jet/j2k/ast/Enum.java +++ b/src/org/jetbrains/jet/j2k/ast/Enum.java @@ -1,5 +1,9 @@ package org.jetbrains.jet.j2k.ast; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.j2k.util.AstUtil; + import java.util.List; /** @@ -8,6 +12,31 @@ import java.util.List; public class Enum extends Class { public Enum(Identifier name, List innerClasses, List methods, List fields) { super(name, innerClasses, methods, fields); - TYPE = "enum"; + } + + @Nullable + private Constructor getPrimaryConstructor() { + for (Function m : myMethods) + if (m.getKind() == Kind.CONSTRUCTOR) + return (Constructor) m; + return null; + } + + private String primaryConstructorToKotlin() { + Constructor maybeConstructor = getPrimaryConstructor(); + if (maybeConstructor != null) + return maybeConstructor.primary(); + return EMPTY; + } + + + @NotNull + @Override + public String toKotlin() { + return "enum" + SPACE + myName.toKotlin() + primaryConstructorToKotlin() + SPACE + "{" + N + + AstUtil.joinNodes(myFields, N) + N + + AstUtil.joinNodes(methodsExceptConstructors(), N) + N + + AstUtil.joinNodes(myInnerClasses, N) + N + + "}"; } } diff --git a/src/org/jetbrains/jet/j2k/ast/EnumConstant.java b/src/org/jetbrains/jet/j2k/ast/EnumConstant.java new file mode 100644 index 00000000000..59dea9f914e --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/EnumConstant.java @@ -0,0 +1,20 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class EnumConstant extends Field { + public EnumConstant(Identifier identifier, Type type, Element params) { + super(identifier, type, params); + } + + @NotNull + @Override + public String toKotlin() { + if (myInitializer.toKotlin().isEmpty()) + return myIdentifier.toKotlin(); + return myIdentifier.toKotlin() + "(" + myInitializer.toKotlin() + ")"; + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/Field.java b/src/org/jetbrains/jet/j2k/ast/Field.java index 8d6090a2cd2..f500e621093 100644 --- a/src/org/jetbrains/jet/j2k/ast/Field.java +++ b/src/org/jetbrains/jet/j2k/ast/Field.java @@ -6,11 +6,11 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public class Field extends Node { - private Identifier myIdentifier; - private Type myType; - private Expression myInitializer; + protected Identifier myIdentifier; + protected Type myType; + protected Element myInitializer; - public Field(Identifier identifier, Type type, Expression initializer) { + public Field(Identifier identifier, Type type, Element initializer) { myIdentifier = identifier; myType = type; myInitializer = initializer; diff --git a/src/org/jetbrains/jet/j2k/ast/Function.java b/src/org/jetbrains/jet/j2k/ast/Function.java index 3a5903a8165..262d063bdff 100644 --- a/src/org/jetbrains/jet/j2k/ast/Function.java +++ b/src/org/jetbrains/jet/j2k/ast/Function.java @@ -8,18 +8,20 @@ import org.jetbrains.annotations.NotNull; public class Function extends Node { private Identifier myName; private Type myType; + protected Element myParams; private Block myBlock; - public Function(Identifier name, Type type, Block block) { + public Function(Identifier name, Type type, Element params, Block block) { myName = name; myType = type; + myParams = params; myBlock = block; } @NotNull @Override public String toKotlin() { - return "fun" + SPACE + myName.toKotlin() + "(" + ")" + SPACE + COLON + SPACE + myType.toKotlin() + SPACE + + return "fun" + SPACE + myName.toKotlin() + "(" + myParams.toKotlin() + ")" + SPACE + COLON + SPACE + myType.toKotlin() + SPACE + myBlock.toKotlin(); } } diff --git a/src/org/jetbrains/jet/j2k/ast/INode.java b/src/org/jetbrains/jet/j2k/ast/INode.java index 57edb34a38c..f8f359ee55a 100644 --- a/src/org/jetbrains/jet/j2k/ast/INode.java +++ b/src/org/jetbrains/jet/j2k/ast/INode.java @@ -13,6 +13,6 @@ public interface INode { public Kind getKind(); public enum Kind { - UNDEFINED, TYPE, + UNDEFINED, TYPE, CONSTRUCTOR, } } diff --git a/src/org/jetbrains/jet/j2k/ast/Parameter.java b/src/org/jetbrains/jet/j2k/ast/Parameter.java new file mode 100644 index 00000000000..40fd542b34d --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/Parameter.java @@ -0,0 +1,22 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class Parameter extends Expression { + private IdentifierImpl myIdentifier; + private Type myType; + + public Parameter(IdentifierImpl identifier, Type type) { + myIdentifier = identifier; + myType = type; + } + + @NotNull + @Override + public String toKotlin() { + return myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/ParameterList.java b/src/org/jetbrains/jet/j2k/ast/ParameterList.java new file mode 100644 index 00000000000..06470e1d7a9 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/ParameterList.java @@ -0,0 +1,23 @@ +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 ParameterList extends Expression { + private List myParameters; + + public ParameterList(List parameters) { + myParameters = parameters; + } + + @NotNull + @Override + public String toKotlin() { + return AstUtil.joinNodes(myParameters, COMMA_WITH_SPACE); + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java index 044bd709f36..d045c6741f2 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java @@ -3,7 +3,9 @@ package org.jetbrains.jet.j2k.visitors; import com.intellij.psi.JavaElementVisitor; import com.intellij.psi.PsiExpressionList; import com.intellij.psi.PsiLocalVariable; +import com.intellij.psi.PsiParameterList; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.j2k.Converter; import org.jetbrains.jet.j2k.ast.*; import static org.jetbrains.jet.j2k.Converter.*; @@ -31,7 +33,14 @@ public class ElementVisitor extends JavaElementVisitor implements Visitor { expressionsToExpressionList(list.getExpressions()), typesToTypeList(list.getExpressionTypes()) ); + } + @Override + public void visitParameterList(PsiParameterList list) { + super.visitParameterList(list); + myResult = new ParameterList( + Converter.parametersToParameterList(list.getParameters()) + ); } @NotNull diff --git a/test/org/jetbrains/jet/j2k/ast/EnumTest.java b/test/org/jetbrains/jet/j2k/ast/EnumTest.java index da270403b3c..bf17217ee23 100644 --- a/test/org/jetbrains/jet/j2k/ast/EnumTest.java +++ b/test/org/jetbrains/jet/j2k/ast/EnumTest.java @@ -14,15 +14,99 @@ public class EnumTest extends JetTestCaseBase { ); } -// public void testTypeSafeEnum() throws Exception { + public void testTypeSafeEnum() throws Exception { + Assert.assertEquals( + classToKotlin("enum Coin { PENNY, NICKEL, DIME, QUARTER; }"), + "enum Coin {\n" + + "PENNY\n" + + "NICKEL\n" + + "DIME\n" + + "QUARTER\n" + + "}" + ); + } + + // + public void testOverrideToString() throws Exception { + Assert.assertEquals( + classToKotlin( + + "enum Color {" + + " WHITE, BLACK, RED, YELLOW, BLUE;" + + "@Override String toString() {" + + " return \"COLOR\";" + + "}" + + "}"), + "enum Color {\n" + + "WHITE\n" + + "BLACK\n" + + "RED\n" + + "YELLOW\n" + + "BLUE\n" + + "fun toString() : String? {\n" + + "return \"COLOR\"\n" + + "}\n" + + "}" + ); + } + + public void testFields() throws Exception { + Assert.assertEquals( + classToKotlin( + "enum Color {\n" + + " WHITE(21), BLACK(22), RED(23), YELLOW(24), BLUE(25);\n" + + "\n" + + " private int code;\n" + + "\n" + + " private Color(int c) {\n" + + " code = c;\n" + + " }\n" + + "\n" + + " public int getCode() {\n" + + " return code;\n" + + " }"), + "enum Color(c : Int) {\n" + + "WHITE(21)\n" + + "BLACK(22)\n" + + "RED(23)\n" + + "YELLOW(24)\n" + + "BLUE(25)\n" + + "var code : Int\n" + + "fun getCode() : Int {\n" + + "return code\n" + + "}\n" + + "}" + ); + } + +// public void testTwoConstructors() throws Exception { // Assert.assertEquals( -// classToKotlin("enum Coin { PENNY, NICKEL, DIME, QUARTER; }"), -// "enum Coin {\n" + -// "PENNY\n" + -// "NICKEL\n" + -// "DIME\n" + -// "QUARTER\n" + -// "}" +// classToKotlin( +// "enum MultEnum {\n" + +// " GREMLIN(\"UTILITY\"),\n" + +// " MORT(30);\n" + +// " \n" + +// " MultEnum(String s) {\n" + +// " }\n" + +// " \n" + +// " MultEnum(int dmg) {\n" + +// " }"), +// "" // TODO: will fail // ); // } -} +// +// public void testInterfaceImplementation() throws Exception { +// Assert.assertEquals( +// classToKotlin( +// "enum Color implements Runnable {\n" + +// " WHITE, BLACK, RED, YELLOW, BLUE;\n" + +// "\n" + +// " public void run() {\n" + +// " System.out.println(\"name()=\" + name() +\n" + +// " \", toString()=\" + toString());\n" + +// " }\n" + +// "}"), +// "" +// ); +// } + } From ba856a974bb6f0b3f78b1835765fbb5f74bf2a91 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 31 Oct 2011 12:17:54 +0400 Subject: [PATCH 004/206] IfStatement added --- src/org/jetbrains/jet/j2k/Converter.java | 2 + src/org/jetbrains/jet/j2k/ast/Block.java | 2 +- .../jetbrains/jet/j2k/ast/EmptyStatement.java | 14 ----- .../jetbrains/jet/j2k/ast/IfStatement.java | 28 +++++++++ src/org/jetbrains/jet/j2k/ast/Statement.java | 14 +++++ .../jet/j2k/visitors/StatementVisitor.java | 11 +++- test/org/jetbrains/jet/j2k/ast/EnumTest.java | 4 +- .../jet/j2k/ast/IfStatementTest.java | 57 +++++++++++++++++++ 8 files changed, 113 insertions(+), 19 deletions(-) delete mode 100644 src/org/jetbrains/jet/j2k/ast/EmptyStatement.java create mode 100644 src/org/jetbrains/jet/j2k/ast/IfStatement.java create mode 100644 test/org/jetbrains/jet/j2k/ast/IfStatementTest.java diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index defa3ad6c35..40d6fbe23a9 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -121,6 +121,8 @@ public class Converter { @NotNull public static Statement statementToStatement(PsiStatement t) { + if (t == null) + return Statement.EMPTY_STATEMENT; final StatementVisitor statementVisitor = new StatementVisitor(); t.accept(statementVisitor); System.out.println(t.getClass()); diff --git a/src/org/jetbrains/jet/j2k/ast/Block.java b/src/org/jetbrains/jet/j2k/ast/Block.java index 5f164676a9c..8a50bd3b94e 100644 --- a/src/org/jetbrains/jet/j2k/ast/Block.java +++ b/src/org/jetbrains/jet/j2k/ast/Block.java @@ -10,7 +10,7 @@ import java.util.List; */ public class Block extends Statement { private List myStatements; - private boolean myNotEmpty; + private boolean myNotEmpty = false; public Block(List statements) { myStatements = statements; diff --git a/src/org/jetbrains/jet/j2k/ast/EmptyStatement.java b/src/org/jetbrains/jet/j2k/ast/EmptyStatement.java deleted file mode 100644 index 970a9d02539..00000000000 --- a/src/org/jetbrains/jet/j2k/ast/EmptyStatement.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import org.jetbrains.annotations.NotNull; - -/** - * @author ignatov - */ -public class EmptyStatement extends Statement { - @NotNull - @Override - public String toKotlin() { - return EMPTY; - } -} diff --git a/src/org/jetbrains/jet/j2k/ast/IfStatement.java b/src/org/jetbrains/jet/j2k/ast/IfStatement.java new file mode 100644 index 00000000000..5fcf3db38d4 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/IfStatement.java @@ -0,0 +1,28 @@ +package org.jetbrains.jet.j2k.ast; + +/** + * @author ignatov + */ +public class IfStatement extends Statement { + private final Expression myCondition; + private final Statement myThenStatement; + private final Statement myElseStatement; + + public IfStatement(Expression condition, Statement thenStatement, Statement elseStatement) { + myCondition = condition; + myThenStatement = thenStatement; + myElseStatement = elseStatement; + } + + @Override + public String toKotlin() { + String result = "if" + SPACE + "(" + myCondition.toKotlin() + ")" + N + myThenStatement.toKotlin() + N; + + if (myElseStatement != Statement.EMPTY_STATEMENT) + return result + + "else" + N + + myElseStatement.toKotlin(); + + return result; + } +} \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/ast/Statement.java b/src/org/jetbrains/jet/j2k/ast/Statement.java index 1f6c667eb1b..c173147f8ae 100644 --- a/src/org/jetbrains/jet/j2k/ast/Statement.java +++ b/src/org/jetbrains/jet/j2k/ast/Statement.java @@ -1,7 +1,21 @@ package org.jetbrains.jet.j2k.ast; +import org.jetbrains.annotations.NotNull; + /** * @author ignatov */ public abstract class Statement extends Element { + public static Statement EMPTY_STATEMENT = new EmptyStatement(); + + /** + * @author ignatov + */ + private static class EmptyStatement extends Statement { + @NotNull + @Override + public String toKotlin() { + return EMPTY; + } + } } diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index 96c3a3206c1..7ab7a9e70ff 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -9,7 +9,7 @@ import org.jetbrains.jet.j2k.ast.*; * @author ignatov */ public class StatementVisitor extends ElementVisitor implements Visitor { - private Statement myResult = new EmptyStatement(); + private Statement myResult = Statement.EMPTY_STATEMENT; @NotNull public Statement getStatement() { @@ -24,6 +24,10 @@ public class StatementVisitor extends ElementVisitor implements Visitor { @Override public void visitBlockStatement(PsiBlockStatement statement) { super.visitBlockStatement(statement); + myResult = new Block( + Converter.statementsToStatementList(statement.getCodeBlock().getStatements()), + true + ); } @Override @@ -83,6 +87,11 @@ public class StatementVisitor extends ElementVisitor implements Visitor { @Override public void visitIfStatement(PsiIfStatement statement) { super.visitIfStatement(statement); + myResult = new IfStatement( + Converter.expressionToExpression(statement.getCondition()), + Converter.statementToStatement(statement.getThenBranch()), + Converter.statementToStatement(statement.getElseBranch()) + ); } @Override diff --git a/test/org/jetbrains/jet/j2k/ast/EnumTest.java b/test/org/jetbrains/jet/j2k/ast/EnumTest.java index bf17217ee23..ed53280a28f 100644 --- a/test/org/jetbrains/jet/j2k/ast/EnumTest.java +++ b/test/org/jetbrains/jet/j2k/ast/EnumTest.java @@ -26,11 +26,9 @@ public class EnumTest extends JetTestCaseBase { ); } - // public void testOverrideToString() throws Exception { Assert.assertEquals( classToKotlin( - "enum Color {" + " WHITE, BLACK, RED, YELLOW, BLUE;" + "@Override String toString() {" + @@ -109,4 +107,4 @@ public class EnumTest extends JetTestCaseBase { // "" // ); // } - } +} diff --git a/test/org/jetbrains/jet/j2k/ast/IfStatementTest.java b/test/org/jetbrains/jet/j2k/ast/IfStatementTest.java new file mode 100644 index 00000000000..7f08d3d871a --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/IfStatementTest.java @@ -0,0 +1,57 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class IfStatementTest extends JetTestCaseBase { + public void testIfStatementWithOneLineBlocks() throws Exception { + Assert.assertEquals( + statementToKotlin("if (true) return 1; else return 0;"), + "if (true)\n" + + "return 1\n" + + "else\n" + + "return 0" + ); + } + + public void testIfStatementWithMultilineBlocks() throws Exception { + Assert.assertEquals( + statementToKotlin("if (1 > 0) {int n = 1; return n;} else {return 0;}"), + "if ((1 > 0))\n" + + "{\n" + + "var n : Int = 1\n" + + "return n\n" + + "}\n" + + "else\n" + + "{\n" + + "return 0\n" + + "}" + ); + } + + public void testIfStatementWithoutElse() throws Exception { + Assert.assertEquals( + statementToKotlin("if (1 > 0) {int n = 1; return n;}"), + "if ((1 > 0))\n" + + "{\n" + + "var n : Int = 1\n" + + "return n\n" + + "}" + ); + } + + public void testIfStatementWithEmptyBlocks() throws Exception { + Assert.assertEquals( + statementToKotlin("if (1 > 0) {} else {}"), + "if ((1 > 0))\n" + + "{\n" + + "}\n" + + "else\n" + + "{\n" + + "}" + ); + } +} From aacf51bd47024421f856a4bd01ba45322456b7fa Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 31 Oct 2011 12:26:21 +0400 Subject: [PATCH 005/206] WhileStatement added --- .../jetbrains/jet/j2k/ast/WhileStatement.java | 23 +++++++++++ .../jet/j2k/visitors/StatementVisitor.java | 17 +++++--- .../jet/j2k/ast/WhileStatementTest.java | 41 +++++++++++++++++++ 3 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/WhileStatement.java create mode 100644 test/org/jetbrains/jet/j2k/ast/WhileStatementTest.java diff --git a/src/org/jetbrains/jet/j2k/ast/WhileStatement.java b/src/org/jetbrains/jet/j2k/ast/WhileStatement.java new file mode 100644 index 00000000000..8502370c5a1 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/WhileStatement.java @@ -0,0 +1,23 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class WhileStatement extends Statement { + final Expression myCondition; + final Statement myStatement; + + public WhileStatement(Expression condition, Statement statement) { + myCondition = condition; + myStatement = statement; + } + + @NotNull + @Override + public String toKotlin() { + return "while" + SPACE + "(" + myCondition.toKotlin() + ")" + N + + myStatement.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index 7ab7a9e70ff..4329d53bfe7 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -5,6 +5,9 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.j2k.Converter; import org.jetbrains.jet.j2k.ast.*; +import static org.jetbrains.jet.j2k.Converter.expressionToExpression; +import static org.jetbrains.jet.j2k.Converter.statementToStatement; + /** * @author ignatov */ @@ -61,7 +64,7 @@ public class StatementVisitor extends ElementVisitor implements Visitor { @Override public void visitExpressionStatement(PsiExpressionStatement statement) { super.visitExpressionStatement(statement); - myResult = Converter.expressionToExpression(statement.getExpression()); + myResult = expressionToExpression(statement.getExpression()); } @Override @@ -88,9 +91,9 @@ public class StatementVisitor extends ElementVisitor implements Visitor { public void visitIfStatement(PsiIfStatement statement) { super.visitIfStatement(statement); myResult = new IfStatement( - Converter.expressionToExpression(statement.getCondition()), - Converter.statementToStatement(statement.getThenBranch()), - Converter.statementToStatement(statement.getElseBranch()) + expressionToExpression(statement.getCondition()), + statementToStatement(statement.getThenBranch()), + statementToStatement(statement.getElseBranch()) ); } @@ -137,6 +140,10 @@ public class StatementVisitor extends ElementVisitor implements Visitor { @Override public void visitWhileStatement(PsiWhileStatement statement) { super.visitWhileStatement(statement); + myResult = new WhileStatement( + expressionToExpression(statement.getCondition()), + statementToStatement(statement.getBody()) + ); } @Override @@ -144,7 +151,7 @@ public class StatementVisitor extends ElementVisitor implements Visitor { super.visitReturnStatement(statement); myResult = new ReturnStatement( - Converter.expressionToExpression(statement.getReturnValue()) + expressionToExpression(statement.getReturnValue()) ); } } diff --git a/test/org/jetbrains/jet/j2k/ast/WhileStatementTest.java b/test/org/jetbrains/jet/j2k/ast/WhileStatementTest.java new file mode 100644 index 00000000000..838efc36cb3 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/WhileStatementTest.java @@ -0,0 +1,41 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class WhileStatementTest extends JetTestCaseBase { + public void testWhileWithEmptyBlock() throws Exception { + Assert.assertEquals( + statementToKotlin("while (true) {}"), + "while (true)\n{\n}" + ); + } + + public void testWhileWithBlock() throws Exception { + Assert.assertEquals( + statementToKotlin("while (a > b) {int i = 1; i = i + 1;}"), + "while ((a > b))\n" + + "{\n" + + "var i : Int = 1\n" + + "i = (i + 1)\n" + + "}" + ); + } + + public void testWhileWithReturn() throws Exception { + Assert.assertEquals( + statementToKotlin("while (true) return 1;"), + "while (true)\nreturn 1" + ); + } + + public void testWhileWithExpression() throws Exception { + Assert.assertEquals( + statementToKotlin("while (true) i = i + 1;"), + "while (true)\ni = (i + 1)" + ); + } +} From 32eb1e782005b5e96d0461a5101f7cc71f0ff564 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 31 Oct 2011 12:30:50 +0400 Subject: [PATCH 006/206] DoWhileStatement added --- .../jet/j2k/ast/DoWhileStatement.java | 20 +++++++++ .../jet/j2k/visitors/StatementVisitor.java | 4 ++ .../jet/j2k/ast/DoWhileStatementTest.java | 45 +++++++++++++++++++ 3 files changed, 69 insertions(+) create mode 100644 src/org/jetbrains/jet/j2k/ast/DoWhileStatement.java create mode 100644 test/org/jetbrains/jet/j2k/ast/DoWhileStatementTest.java diff --git a/src/org/jetbrains/jet/j2k/ast/DoWhileStatement.java b/src/org/jetbrains/jet/j2k/ast/DoWhileStatement.java new file mode 100644 index 00000000000..02d4f64d58d --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/DoWhileStatement.java @@ -0,0 +1,20 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class DoWhileStatement extends WhileStatement { + public DoWhileStatement(Expression condition, Statement statement) { + super(condition, statement); + } + + @NotNull + @Override + public String toKotlin() { + return "do" + N + + myStatement.toKotlin() + N + + "while" + SPACE + "(" + myCondition.toKotlin() + ")"; + } +} \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index 4329d53bfe7..1fc918f746b 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -54,6 +54,10 @@ public class StatementVisitor extends ElementVisitor implements Visitor { @Override public void visitDoWhileStatement(PsiDoWhileStatement statement) { super.visitDoWhileStatement(statement); + myResult = new DoWhileStatement( + expressionToExpression(statement.getCondition()), + statementToStatement(statement.getBody()) + ); } @Override diff --git a/test/org/jetbrains/jet/j2k/ast/DoWhileStatementTest.java b/test/org/jetbrains/jet/j2k/ast/DoWhileStatementTest.java new file mode 100644 index 00000000000..a3ab333cda0 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/DoWhileStatementTest.java @@ -0,0 +1,45 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.jet.j2k.JetTestCaseBase; +import org.junit.Assert; + +/** + * @author ignatov + */ +public class DoWhileStatementTest extends JetTestCaseBase { + public void testWhileWithEmptyBlock() throws Exception { + Assert.assertEquals( + statementToKotlin("do {} while (true)"), + "do\n" + + "{\n" + + "}\n" + + "while (true)" + ); + } + + public void testWhileWithBlock() throws Exception { + Assert.assertEquals( + statementToKotlin("do {int i = 1; i = i + 1;} while (a > b)"), + "do\n" + + "{\n" + + "var i : Int = 1\n" + + "i = (i + 1)\n" + + "}\n" + + "while ((a > b))" + ); + } + + public void testWhileWithReturn() throws Exception { + Assert.assertEquals( + statementToKotlin("do return 1; while (true)"), + "do\nreturn 1\nwhile (true)" + ); + } + + public void testWhileWithExpression() throws Exception { + Assert.assertEquals( + statementToKotlin("do i = i + 1; while (true)"), + "do\ni = (i + 1)\nwhile (true)" + ); + } +} From 25a23abf835252f6d22e7803355a10ab57f1f8a8 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 31 Oct 2011 12:49:24 +0400 Subject: [PATCH 007/206] postfix operator added --- .../jet/j2k/ast/PostfixOperator.java | 22 +++++++++++++++++++ .../jet/j2k/visitors/ExpressionVisitor.java | 9 ++++++++ .../jet/j2k/ast/PostfixOperatorTest.java | 17 ++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 src/org/jetbrains/jet/j2k/ast/PostfixOperator.java create mode 100644 test/org/jetbrains/jet/j2k/ast/PostfixOperatorTest.java diff --git a/src/org/jetbrains/jet/j2k/ast/PostfixOperator.java b/src/org/jetbrains/jet/j2k/ast/PostfixOperator.java new file mode 100644 index 00000000000..036e2618aa3 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/PostfixOperator.java @@ -0,0 +1,22 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class PostfixOperator extends Expression { + private final String myOp; + private final Expression myExpression; + + public PostfixOperator(String op, Expression expression) { + myOp = op; + myExpression = expression; + } + + @NotNull + @Override + public String toKotlin() { + return "(" + myExpression.toKotlin() + myOp + ")"; + } +} \ 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 14afb1ba126..ff965a000a2 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -174,6 +174,15 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { @Override public void visitPostfixExpression(PsiPostfixExpression expression) { super.visitPostfixExpression(expression); + + String op = ""; + if (expression.getOperationSign().getTokenType() == JavaTokenType.PLUSPLUS) op = "++"; + if (expression.getOperationSign().getTokenType() == JavaTokenType.MINUSMINUS) op = "--"; + + myResult = new PostfixOperator( + op, + expressionToExpression(expression.getOperand()) + ); } @Override diff --git a/test/org/jetbrains/jet/j2k/ast/PostfixOperatorTest.java b/test/org/jetbrains/jet/j2k/ast/PostfixOperatorTest.java new file mode 100644 index 00000000000..ac81dc2f0a6 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/PostfixOperatorTest.java @@ -0,0 +1,17 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class PostfixOperatorTest extends JetTestCaseBase { + public void testIncrement() throws Exception { + Assert.assertEquals(statementToKotlin("i++;"), "(i++)"); + } + + public void testDecrement() throws Exception { + Assert.assertEquals(statementToKotlin("i--;"), "(i--)"); + } +} From 4b2c8bc7af34e68db0b0e88ed7f84fdc2a3638e1 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 31 Oct 2011 13:25:57 +0400 Subject: [PATCH 008/206] for supported --- .../jet/j2k/ast/ExpressionListStatement.java | 23 ++++ .../jet/j2k/visitors/ExpressionVisitor.java | 10 +- .../jet/j2k/visitors/StatementVisitor.java | 17 +++ test/org/jetbrains/jet/j2k/ast/ForTest.java | 115 ++++++++++++++++++ 4 files changed, 158 insertions(+), 7 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/ExpressionListStatement.java create mode 100644 test/org/jetbrains/jet/j2k/ast/ForTest.java diff --git a/src/org/jetbrains/jet/j2k/ast/ExpressionListStatement.java b/src/org/jetbrains/jet/j2k/ast/ExpressionListStatement.java new file mode 100644 index 00000000000..b7cfb59e5bf --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/ExpressionListStatement.java @@ -0,0 +1,23 @@ +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 ExpressionListStatement extends Expression { + private List myExpressions; + + public ExpressionListStatement(List expressions) { + myExpressions = expressions; + } + + @NotNull + @Override + public String toKotlin() { + return AstUtil.joinNodes(myExpressions, N); + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index ff965a000a2..c363f7d7e6b 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -6,8 +6,7 @@ import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.j2k.ast.*; -import static org.jetbrains.jet.j2k.Converter.elementToElement; -import static org.jetbrains.jet.j2k.Converter.expressionToExpression; +import static org.jetbrains.jet.j2k.Converter.*; /** * @author ignatov @@ -115,11 +114,6 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { super.visitConditionalExpression(expression); } - @Override - public void visitExpressionListStatement(PsiExpressionListStatement statement) { - super.visitExpressionListStatement(statement); - } - @Override public void visitExpressionStatement(PsiExpressionStatement statement) { super.visitExpressionStatement(statement); @@ -128,6 +122,8 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { @Override public void visitExpressionList(PsiExpressionList list) { super.visitExpressionList(list); + myResult = + new ExpressionList(expressionsToExpressionList(list.getExpressions())); } @Override diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index 1fc918f746b..bf52b08a2c0 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -5,7 +5,12 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.j2k.Converter; import org.jetbrains.jet.j2k.ast.*; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + import static org.jetbrains.jet.j2k.Converter.expressionToExpression; +import static org.jetbrains.jet.j2k.Converter.expressionsToExpressionList; import static org.jetbrains.jet.j2k.Converter.statementToStatement; /** @@ -74,11 +79,23 @@ public class StatementVisitor extends ElementVisitor implements Visitor { @Override public void visitExpressionListStatement(PsiExpressionListStatement statement) { super.visitExpressionListStatement(statement); + myResult = + new ExpressionListStatement(expressionsToExpressionList(statement.getExpressionList().getExpressions())); + } @Override public void visitForStatement(PsiForStatement statement) { super.visitForStatement(statement); + + List forStatements = new LinkedList(); + forStatements.add(statementToStatement(statement.getInitialization())); + forStatements.add(new WhileStatement( + expressionToExpression(statement.getCondition()), + new Block( + Arrays.asList(statementToStatement(statement.getBody()), + new Block(Arrays.asList(statementToStatement(statement.getUpdate()))))))); + myResult = new Block(forStatements); } @Override diff --git a/test/org/jetbrains/jet/j2k/ast/ForTest.java b/test/org/jetbrains/jet/j2k/ast/ForTest.java new file mode 100644 index 00000000000..0ff18e98229 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/ForTest.java @@ -0,0 +1,115 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class ForTest extends JetTestCaseBase { + public void testCommonCaseForTest() throws Exception { + Assert.assertEquals( + statementToKotlin("for (init(); condition(); update()) body();"), + "{\n" + + "init()\n" + + "while (condition())\n" + + "{\n" + + "body()\n" + + "{\n" + + "update()\n" + + "}\n" + + "}\n" + + "}" + ); + } + + public void testForWithEmptyBlock() throws Exception { + Assert.assertEquals( + statementToKotlin("for (int i = 0; i < 0; j++, i++) {}"), + "{\n" + + "var i : Int = 0\n" + + "while ((i < 0))\n" + + "{\n" + + "{\n" + + "}\n" + + "{\n" + + "(j++)\n" + + "(i++)\n" + + "}\n" + + "}\n" + + "}" + ); + } + + public void testForWithBlock() throws Exception { + Assert.assertEquals( + statementToKotlin("for (int i = 0; i < 0; i++) {int i = 1; i++;}"), + "{\n" + + "var i : Int = 0\n" + + "while ((i < 0))\n" + + "{\n" + + "{\n" + + "var i : Int = 1\n" + + "(i++)\n" + + "}\n" + + "{\n" + + "(i++)\n" + + "}\n" + + "}\n" + + "}" + ); + } + + public void testForWithBlockAndDoubleUpdate() throws Exception { + Assert.assertEquals( + statementToKotlin("for (int i = 0; i < 0; j++, i++) {int i = 1; i++;}"), + "{\n" + + "var i : Int = 0\n" + + "while ((i < 0))\n" + + "{\n" + + "{\n" + + "var i : Int = 1\n" + + "(i++)\n" + + "}\n" + + "{\n" + + "(j++)\n" + + "(i++)\n" + + "}\n" + + "}\n" + + "}" + ); + } + + public void testForWithReturn() throws Exception { + Assert.assertEquals( + statementToKotlin("for (int i = 0; i < 0; j++, i++) return i;"), + "{\n" + + "var i : Int = 0\n" + + "while ((i < 0))\n" + + "{\n" + + "return i\n" + + "{\n" + + "(j++)\n" + + "(i++)\n" + + "}\n" + + "}\n" + + "}" + ); + } + + public void testForWithExpression() throws Exception { + Assert.assertEquals( + statementToKotlin("for (int i = 0; i < 0; i++) t++;"), + "{\n" + + "var i : Int = 0\n" + + "while ((i < 0))\n" + + "{\n" + + "(t++)\n" + + "{\n" + + "(i++)\n" + + "}\n" + + "}\n" + + "}" + ); + } +} From 37ec787d53f3fc89ad5a4493112a827e68e80b1a Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 31 Oct 2011 13:49:18 +0400 Subject: [PATCH 009/206] ForeachStatement added --- src/org/jetbrains/jet/j2k/Converter.java | 2 +- .../jet/j2k/ast/ForeachStatement.java | 25 +++++++++++ .../jet/j2k/visitors/ExpressionVisitor.java | 2 +- .../jet/j2k/visitors/StatementVisitor.java | 9 ++-- .../jet/j2k/{ast => visitors}/Visitor.java | 3 +- .../jet/j2k/ast/ForeachStatementTest.java | 41 +++++++++++++++++++ 6 files changed, 76 insertions(+), 6 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/ForeachStatement.java rename src/org/jetbrains/jet/j2k/{ast => visitors}/Visitor.java (62%) create mode 100644 test/org/jetbrains/jet/j2k/ast/ForeachStatementTest.java diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 40d6fbe23a9..cdf9a167dc5 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -208,7 +208,7 @@ public class Converter { return result; } - private static Parameter parameterToParameter(PsiParameter parameter) { + public static Parameter parameterToParameter(PsiParameter parameter) { return new Parameter( new IdentifierImpl(parameter.getName()), // TODO: remove typeToType(parameter.getType()) diff --git a/src/org/jetbrains/jet/j2k/ast/ForeachStatement.java b/src/org/jetbrains/jet/j2k/ast/ForeachStatement.java new file mode 100644 index 00000000000..08f2a457b11 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/ForeachStatement.java @@ -0,0 +1,25 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class ForeachStatement extends Statement { + private final Parameter myVariable; + private final Expression myExpression; + private final Statement myStatement; + + public ForeachStatement(Parameter variable, Expression expression, Statement statement) { + myVariable = variable; + myExpression = expression; + myStatement = statement; + } + + @NotNull + @Override + public String toKotlin() { + return "for" + SPACE + "(" + myVariable.toKotlin() + SPACE + IN + SPACE + myExpression.toKotlin() + ")" + N + + myStatement.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 c363f7d7e6b..ea87fdd0de3 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -123,7 +123,7 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { public void visitExpressionList(PsiExpressionList list) { super.visitExpressionList(list); myResult = - new ExpressionList(expressionsToExpressionList(list.getExpressions())); + new ExpressionList(expressionsToExpressionList(list.getExpressions())); } @Override diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index bf52b08a2c0..0919a3696b9 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -9,9 +9,7 @@ import java.util.Arrays; import java.util.LinkedList; import java.util.List; -import static org.jetbrains.jet.j2k.Converter.expressionToExpression; -import static org.jetbrains.jet.j2k.Converter.expressionsToExpressionList; -import static org.jetbrains.jet.j2k.Converter.statementToStatement; +import static org.jetbrains.jet.j2k.Converter.*; /** * @author ignatov @@ -101,6 +99,11 @@ public class StatementVisitor extends ElementVisitor implements Visitor { @Override public void visitForeachStatement(PsiForeachStatement statement) { super.visitForeachStatement(statement); + myResult = new ForeachStatement( + parameterToParameter(statement.getIterationParameter()), + expressionToExpression(statement.getIteratedValue()), + statementToStatement(statement.getBody()) + ); } @Override diff --git a/src/org/jetbrains/jet/j2k/ast/Visitor.java b/src/org/jetbrains/jet/j2k/visitors/Visitor.java similarity index 62% rename from src/org/jetbrains/jet/j2k/ast/Visitor.java rename to src/org/jetbrains/jet/j2k/visitors/Visitor.java index fa1a2126af7..5888c1a4ca8 100644 --- a/src/org/jetbrains/jet/j2k/ast/Visitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/Visitor.java @@ -1,6 +1,7 @@ -package org.jetbrains.jet.j2k.ast; +package org.jetbrains.jet.j2k.visitors; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.j2k.ast.Element; /** * @author ignatov diff --git a/test/org/jetbrains/jet/j2k/ast/ForeachStatementTest.java b/test/org/jetbrains/jet/j2k/ast/ForeachStatementTest.java new file mode 100644 index 00000000000..d283c806c11 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/ForeachStatementTest.java @@ -0,0 +1,41 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class ForeachStatementTest extends JetTestCaseBase { + public void testEnhancedForWithEmptyBlock() throws Exception { + Assert.assertEquals( + statementToKotlin("for (Node n : list) {}"), + "for (n : Node? in list)\n{\n" + "}" + ); + } + + public void testEnhancedForWithBlock() throws Exception { + Assert.assertEquals( + statementToKotlin("for (Node n : list) {int i = 1; i++;}"), + "for (n : Node? in list)\n" + + "{\n" + + "var i : Int = 1\n" + + "(i++)\n" + + "}" + ); + } + + public void testEnhancedForWithReturn() throws Exception { + Assert.assertEquals( + statementToKotlin("for (Node n : list) return n;"), + "for (n : Node? in list)\nreturn n" + ); + } + + public void testEnhancedForWithExpression() throws Exception { + Assert.assertEquals( + statementToKotlin("for (Node n : list) i++;"), + "for (n : Node? in list)\n(i++)" + ); + } +} From 207b13c64d2d76823bf7194912665f753fdb8ae6 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 31 Oct 2011 14:14:25 +0400 Subject: [PATCH 010/206] TryStatement added --- src/org/jetbrains/jet/j2k/Converter.java | 11 +- src/org/jetbrains/jet/j2k/ast/Block.java | 9 +- .../jetbrains/jet/j2k/ast/CatchStatement.java | 22 ++++ .../jetbrains/jet/j2k/ast/TryStatement.java | 30 +++++ .../jet/j2k/visitors/StatementVisitor.java | 14 +++ .../jet/j2k/ast/TryStatementTest.java | 111 ++++++++++++++++++ 6 files changed, 190 insertions(+), 7 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/CatchStatement.java create mode 100644 src/org/jetbrains/jet/j2k/ast/TryStatement.java create mode 100644 test/org/jetbrains/jet/j2k/ast/TryStatementTest.java diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index cdf9a167dc5..684a29a8d27 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -85,7 +85,7 @@ public class Converter { private static Function methodToFunction(PsiMethod method, boolean notEmpty) { final IdentifierImpl identifier = new IdentifierImpl(method.getName()); final Type type = typeToType(method.getReturnType()); - final Block body = bodyToBlock(method.getBody(), notEmpty); + final Block body = blockToBlock(method.getBody(), notEmpty); final Element params = elementToElement(method.getParameterList()); if (method.isConstructor()) @@ -104,10 +104,10 @@ public class Converter { } @NotNull - private static Block bodyToBlock(PsiCodeBlock body, boolean notEmpty) { - if (body == null) - return new Block(new LinkedList(), false); - return new Block(statementsToStatementList(body.getStatements()), notEmpty); + public static Block blockToBlock(PsiCodeBlock block, boolean notEmpty) { + if (block == null) + return Block.EMPTY_BLOCK; + return new Block(statementsToStatementList(block.getStatements()), notEmpty); } @NotNull @@ -208,6 +208,7 @@ public class Converter { return result; } + @NotNull public static Parameter parameterToParameter(PsiParameter parameter) { return new Parameter( new IdentifierImpl(parameter.getName()), // TODO: remove diff --git a/src/org/jetbrains/jet/j2k/ast/Block.java b/src/org/jetbrains/jet/j2k/ast/Block.java index 8a50bd3b94e..9166a3586d3 100644 --- a/src/org/jetbrains/jet/j2k/ast/Block.java +++ b/src/org/jetbrains/jet/j2k/ast/Block.java @@ -3,15 +3,20 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.j2k.util.AstUtil; +import java.util.LinkedList; import java.util.List; /** * @author ignatov */ public class Block extends Statement { - private List myStatements; + public final static Block EMPTY_BLOCK = new Block(); + private List myStatements = new LinkedList(); private boolean myNotEmpty = false; + private Block() { + } + public Block(List statements) { myStatements = statements; } @@ -21,7 +26,7 @@ public class Block extends Statement { myNotEmpty = notEmpty; } - private boolean isEmpty() { + public boolean isEmpty() { return !myNotEmpty && myStatements.size() == 0; } diff --git a/src/org/jetbrains/jet/j2k/ast/CatchStatement.java b/src/org/jetbrains/jet/j2k/ast/CatchStatement.java new file mode 100644 index 00000000000..7db33c91163 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/CatchStatement.java @@ -0,0 +1,22 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class CatchStatement extends Statement { + private final Parameter myVariable; + private final Block myBlock; + + public CatchStatement(Parameter variable, Block block) { + myVariable = variable; + myBlock = block; + } + + @NotNull + @Override + public String toKotlin() { + return "catch" + SPACE + "(" + myVariable.toKotlin() + ")" + SPACE + myBlock.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/TryStatement.java b/src/org/jetbrains/jet/j2k/ast/TryStatement.java new file mode 100644 index 00000000000..d9ae141327e --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/TryStatement.java @@ -0,0 +1,30 @@ +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 TryStatement extends Statement { + private final Block myBlock; + private final List myCatches; + private final Block myFinallyBlock; + + public TryStatement(Block block, List catches, Block finallyBlock) { + myBlock = block; + myCatches = catches; + myFinallyBlock = finallyBlock; + } + + @NotNull + @Override + public String toKotlin() { + return "try" + N + + myBlock.toKotlin() + N + + AstUtil.joinNodes(myCatches, N) + N + + (myFinallyBlock.isEmpty() ? EMPTY : "finally" + N + myFinallyBlock.toKotlin()); + } +} \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index 0919a3696b9..818bdfafe0c 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -159,6 +159,20 @@ public class StatementVisitor extends ElementVisitor implements Visitor { @Override public void visitTryStatement(PsiTryStatement statement) { super.visitTryStatement(statement); + + List catches = new LinkedList(); + for (int i = 0; i < statement.getCatchBlocks().length; i++) { + catches.add(new CatchStatement( + parameterToParameter(statement.getCatchBlockParameters()[i]), + blockToBlock(statement.getCatchBlocks()[i], true) + )); + } + + myResult = new TryStatement( + blockToBlock(statement.getTryBlock(), true), + catches, + blockToBlock(statement.getFinallyBlock(), true) + ); } @Override diff --git a/test/org/jetbrains/jet/j2k/ast/TryStatementTest.java b/test/org/jetbrains/jet/j2k/ast/TryStatementTest.java new file mode 100644 index 00000000000..e0cea4cdb49 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/TryStatementTest.java @@ -0,0 +1,111 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class TryStatementTest extends JetTestCaseBase { + public void testEmptyTryWithTwoCatchesWithoutFinally() throws Exception { + Assert.assertEquals( + statementToKotlin( + "try {" + + "} catch (Exception e) {" + + " println(1);" + + "} catch (IOException e) {" + + " println(0);" + + "}"), + "try\n" + + "{\n" + + "}\n" + + "catch (e : Exception?) {\n" + + "println(1)\n" + + "}\n" + + "catch (e : IOException?) {\n" + + "println(0)\n" + + "}" + ); + } + + public void testEmptyTryWithTwoCatchesWithEmptyFinally() throws Exception { + Assert.assertEquals( + statementToKotlin( + "try {" + + "} catch (Exception e) {" + + " println(1);" + + "} catch (IOException e) {" + + " println(0);" + + "} finally {}"), + "try\n" + + "{\n" + + "}\n" + + "catch (e : Exception?) {\n" + + "println(1)\n" + + "}\n" + + "catch (e : IOException?) {\n" + + "println(0)\n" + + "}\n" + + "finally\n" + + "{\n" + + "}" + ); + } + + public void testEmptyTryWithTwoCatchesWithFinally() throws Exception { + Assert.assertEquals( + statementToKotlin( + "try {" + + "} catch (Exception e) {" + + " println(1);" + + "} catch (IOException e) {" + + " println(0);" + + "} finally {" + + " println(3);" + + "}"), + "try\n" + + "{\n" + + "}\n" + + "catch (e : Exception?) {\n" + + "println(1)\n" + + "}\n" + + "catch (e : IOException?) {\n" + + "println(0)\n" + + "}\n" + + "finally\n" + + "{\n" + + "println(3)\n" + + "}" + ); + } + + public void testCommonCaseForTryStatement() throws Exception { + Assert.assertEquals( + statementToKotlin( + "try {" + + " callMethod(params);" + + "} catch (Exception e) {" + + " println(1);" + + "} catch (IOException e) {" + + " println(0);" + + "} finally {" + + " println(3);" + + "}"), + "try\n" + + "{\n" + + "callMethod(params)\n" + + "}\n" + + "catch (e : Exception?) {\n" + + "println(1)\n" + + "}\n" + + "catch (e : IOException?) {\n" + + "println(0)\n" + + "}\n" + + "finally\n" + + "{\n" + + "println(3)\n" + + "}" + ); + } + +} From ec5912fe2962183815e1b803468c37bd9e6d370a Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 31 Oct 2011 14:23:48 +0400 Subject: [PATCH 011/206] ParenthesizedExpression added --- .../jet/j2k/ast/ParenthesizedExpression.java | 20 +++++++++++++++++++ .../jet/j2k/visitors/ExpressionVisitor.java | 3 +++ .../j2k/ast/ParenthesizedExpressionTest.java | 17 ++++++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 src/org/jetbrains/jet/j2k/ast/ParenthesizedExpression.java create mode 100644 test/org/jetbrains/jet/j2k/ast/ParenthesizedExpressionTest.java diff --git a/src/org/jetbrains/jet/j2k/ast/ParenthesizedExpression.java b/src/org/jetbrains/jet/j2k/ast/ParenthesizedExpression.java new file mode 100644 index 00000000000..8a5ac18447c --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/ParenthesizedExpression.java @@ -0,0 +1,20 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class ParenthesizedExpression extends Expression { + private final Expression myExpression; + + public ParenthesizedExpression(Expression expression) { + myExpression = expression; + } + + @NotNull + @Override + public String toKotlin() { + return "(" + myExpression.toKotlin() + ")"; + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index ea87fdd0de3..aeae98e4587 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -165,6 +165,9 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { @Override public void visitParenthesizedExpression(PsiParenthesizedExpression expression) { super.visitParenthesizedExpression(expression); + myResult = new ParenthesizedExpression( + expressionToExpression(expression.getExpression()) + ); } @Override diff --git a/test/org/jetbrains/jet/j2k/ast/ParenthesizedExpressionTest.java b/test/org/jetbrains/jet/j2k/ast/ParenthesizedExpressionTest.java new file mode 100644 index 00000000000..22b90d535a6 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/ParenthesizedExpressionTest.java @@ -0,0 +1,17 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class ParenthesizedExpressionTest extends JetTestCaseBase { + public void testParenthesized() throws Exception { + Assert.assertEquals(expressionToSingleLineKotlin("(1 + 2)"), "((1 + 2))"); + } + + public void testParenthesized2() throws Exception { + Assert.assertEquals(expressionToSingleLineKotlin("(o.toString() + \"abc\")"), "((o.toString() + \"abc\"))"); + } +} \ No newline at end of file From b94fb64222dbcd24c35e94aee4c37b910e41f333 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 31 Oct 2011 14:26:45 +0400 Subject: [PATCH 012/206] conditional expression added --- .../jetbrains/jet/j2k/ast/IfStatement.java | 5 ++++- .../jet/j2k/visitors/ExpressionVisitor.java | 7 +++++++ .../j2k/ast/ConditionalExpressionTest.java | 19 +++++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 test/org/jetbrains/jet/j2k/ast/ConditionalExpressionTest.java diff --git a/src/org/jetbrains/jet/j2k/ast/IfStatement.java b/src/org/jetbrains/jet/j2k/ast/IfStatement.java index 5fcf3db38d4..3e45436d036 100644 --- a/src/org/jetbrains/jet/j2k/ast/IfStatement.java +++ b/src/org/jetbrains/jet/j2k/ast/IfStatement.java @@ -1,9 +1,11 @@ package org.jetbrains.jet.j2k.ast; +import org.jetbrains.annotations.NotNull; + /** * @author ignatov */ -public class IfStatement extends Statement { +public class IfStatement extends Expression { private final Expression myCondition; private final Statement myThenStatement; private final Statement myElseStatement; @@ -14,6 +16,7 @@ public class IfStatement extends Statement { myElseStatement = elseStatement; } + @NotNull @Override public String toKotlin() { String result = "if" + SPACE + "(" + myCondition.toKotlin() + ")" + N + myThenStatement.toKotlin() + N; diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index aeae98e4587..41c3d03a3e3 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -112,6 +112,13 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { @Override public void visitConditionalExpression(PsiConditionalExpression expression) { super.visitConditionalExpression(expression); + myResult = new ParenthesizedExpression( + new IfStatement( + expressionToExpression(expression.getCondition()), + expressionToExpression(expression.getThenExpression()), + expressionToExpression(expression.getElseExpression()) + ) + ); } @Override diff --git a/test/org/jetbrains/jet/j2k/ast/ConditionalExpressionTest.java b/test/org/jetbrains/jet/j2k/ast/ConditionalExpressionTest.java new file mode 100644 index 00000000000..9bbf599949b --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/ConditionalExpressionTest.java @@ -0,0 +1,19 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class ConditionalExpressionTest extends JetTestCaseBase { + public void testSimpleConditionalExpression() throws Exception { + Assert.assertEquals( + expressionToKotlin("a.isEmpty() ? 0 : 1"), + "(if (a.isEmpty())\n" + + "0\n" + + "else\n" + + "1)" + ); + } +} \ No newline at end of file From 74c98c0f41fe87a4059d19061d8c039f49923858 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 31 Oct 2011 15:24:45 +0400 Subject: [PATCH 013/206] ContinueStatement and BreakStatement added --- src/org/jetbrains/jet/j2k/Converter.java | 18 ++++++++--- .../jetbrains/jet/j2k/ast/BreakStatement.java | 31 +++++++++++++++++++ .../jet/j2k/ast/ContinueStatement.java | 31 +++++++++++++++++++ src/org/jetbrains/jet/j2k/ast/INode.java | 2 +- src/org/jetbrains/jet/j2k/ast/Identifier.java | 1 + .../jet/j2k/visitors/StatementVisitor.java | 12 +++++++ .../jet/j2k/ast/BreakStatementTest.java | 23 ++++++++++++++ .../jet/j2k/ast/ContinueStatementTest.java | 23 ++++++++++++++ 8 files changed, 135 insertions(+), 6 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/BreakStatement.java create mode 100644 src/org/jetbrains/jet/j2k/ast/ContinueStatement.java create mode 100644 test/org/jetbrains/jet/j2k/ast/BreakStatementTest.java create mode 100644 test/org/jetbrains/jet/j2k/ast/ContinueStatementTest.java diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 684a29a8d27..898bd78a75b 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -2,6 +2,7 @@ package org.jetbrains.jet.j2k; import com.intellij.psi.*; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.j2k.ast.*; import org.jetbrains.jet.j2k.ast.Class; import org.jetbrains.jet.j2k.ast.Enum; @@ -120,12 +121,12 @@ public class Converter { } @NotNull - public static Statement statementToStatement(PsiStatement t) { - if (t == null) + public static Statement statementToStatement(@Nullable PsiStatement s) { + if (s == null) return Statement.EMPTY_STATEMENT; final StatementVisitor statementVisitor = new StatementVisitor(); - t.accept(statementVisitor); - System.out.println(t.getClass()); + s.accept(statementVisitor); + System.out.println(s.getClass()); return statementVisitor.getStatement(); } @@ -139,7 +140,7 @@ public class Converter { } @NotNull - public static Expression expressionToExpression(PsiExpression e) { + public static Expression expressionToExpression(@Nullable PsiExpression e) { if (e == null) return new EmptyExpression(); final ExpressionVisitor expressionVisitor = new ExpressionVisitor(); @@ -215,4 +216,11 @@ public class Converter { typeToType(parameter.getType()) ); } + + @NotNull + public static Identifier identifierToIdentifier(@Nullable PsiIdentifier identifier) { + if (identifier == null) + return Identifier.EMPTY_IDENTIFIER; + return new IdentifierImpl(identifier.getText()); + } } diff --git a/src/org/jetbrains/jet/j2k/ast/BreakStatement.java b/src/org/jetbrains/jet/j2k/ast/BreakStatement.java new file mode 100644 index 00000000000..e48b8ad5b5d --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/BreakStatement.java @@ -0,0 +1,31 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class BreakStatement extends Statement { + private Identifier myLabel = Identifier.EMPTY_IDENTIFIER; + + public BreakStatement(Identifier label) { + myLabel = label; + } + + public BreakStatement() { + } + + @NotNull + @Override + public Kind getKind() { + return Kind.BREAK; + } + + @NotNull + @Override + public String toKotlin() { + if (myLabel.isEmpty()) + return "break"; + return "break" + AT + myLabel.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/ContinueStatement.java b/src/org/jetbrains/jet/j2k/ast/ContinueStatement.java new file mode 100644 index 00000000000..bfed924d439 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/ContinueStatement.java @@ -0,0 +1,31 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class ContinueStatement extends Statement { + private Identifier myLabel = Identifier.EMPTY_IDENTIFIER; + + public ContinueStatement(Identifier label) { + myLabel = label; + } + + public ContinueStatement() { + } + + @NotNull + @Override + public Kind getKind() { + return Kind.CONTINUE; + } + + @NotNull + @Override + public String toKotlin() { + if (myLabel.isEmpty()) + return "continue"; + return "continue" + AT + myLabel.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/INode.java b/src/org/jetbrains/jet/j2k/ast/INode.java index f8f359ee55a..3a861da7f37 100644 --- a/src/org/jetbrains/jet/j2k/ast/INode.java +++ b/src/org/jetbrains/jet/j2k/ast/INode.java @@ -13,6 +13,6 @@ public interface INode { public Kind getKind(); public enum Kind { - UNDEFINED, TYPE, CONSTRUCTOR, + UNDEFINED, TYPE, CONSTRUCTOR, BREAK, CONTINUE, } } diff --git a/src/org/jetbrains/jet/j2k/ast/Identifier.java b/src/org/jetbrains/jet/j2k/ast/Identifier.java index 777a842dc44..bc9f0677ba0 100644 --- a/src/org/jetbrains/jet/j2k/ast/Identifier.java +++ b/src/org/jetbrains/jet/j2k/ast/Identifier.java @@ -4,6 +4,7 @@ package org.jetbrains.jet.j2k.ast; * @author ignatov */ public interface Identifier extends INode { + public static Identifier EMPTY_IDENTIFIER = new IdentifierImpl(""); public String getName(); public boolean isEmpty(); diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index 818bdfafe0c..d5acdebd1f3 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -39,11 +39,23 @@ public class StatementVisitor extends ElementVisitor implements Visitor { @Override public void visitBreakStatement(PsiBreakStatement statement) { super.visitBreakStatement(statement); + if (statement.getLabelIdentifier() == null) + myResult = new BreakStatement(); + else + myResult = new BreakStatement( + identifierToIdentifier(statement.getLabelIdentifier()) + ); } @Override public void visitContinueStatement(PsiContinueStatement statement) { super.visitContinueStatement(statement); + if (statement.getLabelIdentifier() == null) + myResult = new ContinueStatement(); + else + myResult = new ContinueStatement( + identifierToIdentifier(statement.getLabelIdentifier()) + ); } @Override diff --git a/test/org/jetbrains/jet/j2k/ast/BreakStatementTest.java b/test/org/jetbrains/jet/j2k/ast/BreakStatementTest.java new file mode 100644 index 00000000000..e8e7c8907a7 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/BreakStatementTest.java @@ -0,0 +1,23 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class BreakStatementTest extends JetTestCaseBase { + public void testBreakWithoutLabel() throws Exception { + Assert.assertEquals( + statementToSingleLineKotlin("break;"), + "break" + ); + } + + public void testBreakWithLabel() throws Exception { + Assert.assertEquals( + statementToSingleLineKotlin("break label;"), + "break@label" + ); + } +} diff --git a/test/org/jetbrains/jet/j2k/ast/ContinueStatementTest.java b/test/org/jetbrains/jet/j2k/ast/ContinueStatementTest.java new file mode 100644 index 00000000000..c7e62f4e123 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/ContinueStatementTest.java @@ -0,0 +1,23 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class ContinueStatementTest extends JetTestCaseBase { + public void testContinueWithoutLabel() throws Exception { + Assert.assertEquals( + statementToSingleLineKotlin("continue;"), + "continue" + ); + } + + public void testContinueWithLabel() throws Exception { + Assert.assertEquals( + statementToSingleLineKotlin("continue label;"), + "continue@label" + ); + } +} From 60eef335bf2b9906d5884642b22b71d3e4cfbc92 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 31 Oct 2011 15:40:32 +0400 Subject: [PATCH 014/206] LabelStatement added --- .../jetbrains/jet/j2k/ast/LabelStatement.java | 22 +++++++ .../jet/j2k/visitors/StatementVisitor.java | 4 ++ .../jet/j2k/ast/LabelStatementTest.java | 58 +++++++++++++++++++ 3 files changed, 84 insertions(+) create mode 100644 src/org/jetbrains/jet/j2k/ast/LabelStatement.java create mode 100644 test/org/jetbrains/jet/j2k/ast/LabelStatementTest.java diff --git a/src/org/jetbrains/jet/j2k/ast/LabelStatement.java b/src/org/jetbrains/jet/j2k/ast/LabelStatement.java new file mode 100644 index 00000000000..9908938b4d1 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/LabelStatement.java @@ -0,0 +1,22 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class LabelStatement extends Statement { + private final Identifier myName; + private final Statement myStatement; + + public LabelStatement(Identifier name, Statement statement) { + myName = name; + myStatement = statement; + } + + @NotNull + @Override + public String toKotlin() { + return AT + myName.toKotlin() + SPACE + myStatement.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index d5acdebd1f3..169d34e8810 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -141,6 +141,10 @@ public class StatementVisitor extends ElementVisitor implements Visitor { @Override public void visitLabeledStatement(PsiLabeledStatement statement) { super.visitLabeledStatement(statement); + myResult = new LabelStatement( + identifierToIdentifier(statement.getLabelIdentifier()), + statementToStatement(statement.getStatement()) + ); } @Override diff --git a/test/org/jetbrains/jet/j2k/ast/LabelStatementTest.java b/test/org/jetbrains/jet/j2k/ast/LabelStatementTest.java new file mode 100644 index 00000000000..a6c0cc99468 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/LabelStatementTest.java @@ -0,0 +1,58 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class LabelStatementTest extends JetTestCaseBase { + public void testComplicatedExampleFromJavaTutorial() throws Exception { + Assert.assertEquals( + statementToKotlin( + " test:" + + " for (int i = 0; i <= max; i++) {" + + " int n = substring.length();" + + " int j = i;" + + " int k = 0;" + + " while (n-- != 0) {" + + " if (searchMe.charAt(j++) != substring.charAt(k++)) {" + + " continue test;" + + " }" + + " } " + + " foundIt = true;" + + " break test;" + + " }" + + " System.out.println(foundIt ? \"Found it\" : \"Didn't find it\");" + + " }" + + "}"), + "@test {\n" + + "var i : Int = 0\n" + + "while ((i <= max))\n" + + "{\n" + + "{\n" + + "var n : Int = substring.length()\n" + + "var j : Int = i\n" + + "var k : Int = 0\n" + + "while (((n--) != 0))\n" + + "{\n" + + "if ((searchMe.charAt((j++)) != substring.charAt((k++))))\n" + + "{\n" + + "continue@test\n" + + "}\n" + + "}\n" + + "foundIt = true\n" + + "break@test\n" + + "}\n" + + "{\n" + + "(i++)\n" + + "}\n" + + "}\n" + + "}\n" + + "System.out.println((if (foundIt)\n" + + "\"Found it\"\n" + + "else\n" + + "\"Didn't find it\"))" + ); + } +} From 6dd7edd7685d16eeb61ce71741d82700cfa92efe Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 31 Oct 2011 16:00:11 +0400 Subject: [PATCH 015/206] SynchronizedStatement added --- src/org/jetbrains/jet/j2k/Converter.java | 7 +++++- .../jet/j2k/ast/SynchronizedStatement.java | 22 +++++++++++++++++++ .../jet/j2k/visitors/StatementVisitor.java | 4 ++++ .../j2k/ast/SynchronizedStatementTest.java | 16 ++++++++++++++ 4 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/SynchronizedStatement.java create mode 100644 test/org/jetbrains/jet/j2k/ast/SynchronizedStatementTest.java diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 898bd78a75b..61814d8d93e 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -105,12 +105,17 @@ public class Converter { } @NotNull - public static Block blockToBlock(PsiCodeBlock block, boolean notEmpty) { + public static Block blockToBlock(@Nullable PsiCodeBlock block, boolean notEmpty) { if (block == null) return Block.EMPTY_BLOCK; return new Block(statementsToStatementList(block.getStatements()), notEmpty); } + @NotNull + public static Block blockToBlock(@Nullable PsiCodeBlock block) { + return blockToBlock(block, true); + } + @NotNull public static List statementsToStatementList(PsiStatement[] statements) { List result = new LinkedList(); diff --git a/src/org/jetbrains/jet/j2k/ast/SynchronizedStatement.java b/src/org/jetbrains/jet/j2k/ast/SynchronizedStatement.java new file mode 100644 index 00000000000..63d3150b957 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/SynchronizedStatement.java @@ -0,0 +1,22 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class SynchronizedStatement extends Statement { + private final Expression myExpression; + private final Block myBlock; + + public SynchronizedStatement(Expression expression, Block block) { + myExpression = expression; + myBlock = block; + } + + @NotNull + @Override + public String toKotlin() { + return "synchronized" + SPACE + "(" + myExpression.toKotlin() + ")" + SPACE + myBlock.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index 169d34e8810..2a5a6454d67 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -165,6 +165,10 @@ public class StatementVisitor extends ElementVisitor implements Visitor { @Override public void visitSynchronizedStatement(PsiSynchronizedStatement statement) { super.visitSynchronizedStatement(statement); + myResult = new SynchronizedStatement( + expressionToExpression(statement.getLockExpression()), + blockToBlock(statement.getBody()) + ); } @Override diff --git a/test/org/jetbrains/jet/j2k/ast/SynchronizedStatementTest.java b/test/org/jetbrains/jet/j2k/ast/SynchronizedStatementTest.java new file mode 100644 index 00000000000..2d353b8af23 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/SynchronizedStatementTest.java @@ -0,0 +1,16 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class SynchronizedStatementTest extends JetTestCaseBase { + public void testSingleLineExample() throws Exception { + Assert.assertEquals( + statementToSingleLineKotlin("synchronized (s) { doSomething(s); }"), + "synchronized (s) { doSomething(s) }" + ); + } +} From 849190130765f1380ef93756f3e33e782930e51c Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 31 Oct 2011 16:44:21 +0400 Subject: [PATCH 016/206] AssertStatement added --- src/org/jetbrains/jet/j2k/Converter.java | 2 +- .../jet/j2k/ast/AssertStatement.java | 23 ++++++++++++++ .../jet/j2k/ast/EmptyExpression.java | 14 --------- src/org/jetbrains/jet/j2k/ast/Expression.java | 14 +++++++++ .../jet/j2k/visitors/ExpressionVisitor.java | 2 +- .../jet/j2k/visitors/StatementVisitor.java | 5 ++++ .../jet/j2k/ast/AssertStatementTest.java | 30 +++++++++++++++++++ 7 files changed, 74 insertions(+), 16 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/AssertStatement.java delete mode 100644 src/org/jetbrains/jet/j2k/ast/EmptyExpression.java create mode 100644 test/org/jetbrains/jet/j2k/ast/AssertStatementTest.java diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 61814d8d93e..5b1050c5084 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -147,7 +147,7 @@ public class Converter { @NotNull public static Expression expressionToExpression(@Nullable PsiExpression e) { if (e == null) - return new EmptyExpression(); + return Expression.EMPTY_EXPRESSION; final ExpressionVisitor expressionVisitor = new ExpressionVisitor(); e.accept(expressionVisitor); System.out.println(e.getClass()); diff --git a/src/org/jetbrains/jet/j2k/ast/AssertStatement.java b/src/org/jetbrains/jet/j2k/ast/AssertStatement.java new file mode 100644 index 00000000000..829f7953948 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/AssertStatement.java @@ -0,0 +1,23 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class AssertStatement extends Statement { + private final Expression myCondition; + private final Expression myDetail; + + public AssertStatement(Expression condition, Expression detail) { + myCondition = condition; + myDetail = detail; + } + + @NotNull + @Override + public String toKotlin() { + String detail = myDetail != Expression.EMPTY_EXPRESSION ? "(" + myDetail.toKotlin() + ")" : EMPTY; + return "assert" + detail + SPACE + "{" + myCondition.toKotlin() + "}"; + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/EmptyExpression.java b/src/org/jetbrains/jet/j2k/ast/EmptyExpression.java deleted file mode 100644 index c2ed1f7cb27..00000000000 --- a/src/org/jetbrains/jet/j2k/ast/EmptyExpression.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import org.jetbrains.annotations.NotNull; - -/** - * @author ignatov - */ -public class EmptyExpression extends Expression { - @NotNull - @Override - public String toKotlin() { - return EMPTY; - } -} diff --git a/src/org/jetbrains/jet/j2k/ast/Expression.java b/src/org/jetbrains/jet/j2k/ast/Expression.java index e83a07becd0..a18e4322dfd 100644 --- a/src/org/jetbrains/jet/j2k/ast/Expression.java +++ b/src/org/jetbrains/jet/j2k/ast/Expression.java @@ -1,7 +1,21 @@ package org.jetbrains.jet.j2k.ast; +import org.jetbrains.annotations.NotNull; + /** * @author ignatov */ public abstract class Expression extends Statement { + public static final Expression EMPTY_EXPRESSION = new EmptyExpression(); + + /** + * @author ignatov + */ + private static class EmptyExpression extends Expression { + @NotNull + @Override + public String toKotlin() { + return EMPTY; + } + } } diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 41c3d03a3e3..eca574af9e8 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -12,7 +12,7 @@ import static org.jetbrains.jet.j2k.Converter.*; * @author ignatov */ public class ExpressionVisitor extends StatementVisitor implements Visitor { - private Expression myResult = new EmptyExpression(); + private Expression myResult = Expression.EMPTY_EXPRESSION; @NotNull public Expression getResult() { diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index 2a5a6454d67..56ca0ee5f93 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -25,6 +25,11 @@ public class StatementVisitor extends ElementVisitor implements Visitor { @Override public void visitAssertStatement(PsiAssertStatement statement) { super.visitAssertStatement(statement); + + myResult = new AssertStatement( + expressionToExpression(statement.getAssertCondition()), + expressionToExpression(statement.getAssertDescription()) + ); } @Override diff --git a/test/org/jetbrains/jet/j2k/ast/AssertStatementTest.java b/test/org/jetbrains/jet/j2k/ast/AssertStatementTest.java new file mode 100644 index 00000000000..9e397c9cba2 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/AssertStatementTest.java @@ -0,0 +1,30 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class AssertStatementTest extends JetTestCaseBase { + public void testOnlyCondition() throws Exception { + Assert.assertEquals( + statementToKotlin("assert boolMethod();"), + "assert {boolMethod()}" + ); + } + + public void testOnlyConditionWithBraces() throws Exception { + Assert.assertEquals( + statementToKotlin("assert(boolMethod());"), + "assert {(boolMethod())}" + ); + } + + public void testWithStringDetail() throws Exception { + Assert.assertEquals( + statementToKotlin("assert true : \"string details\";"), + "assert(\"string details\") {true}" + ); + } +} From 18c2b34257c3353caf350cb595c45732da6906c3 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 31 Oct 2011 16:56:17 +0400 Subject: [PATCH 017/206] ThrowStatement added --- .../jetbrains/jet/j2k/ast/ThrowStatement.java | 20 +++++++++++++++++++ .../jet/j2k/visitors/StatementVisitor.java | 5 +++-- .../jet/j2k/ast/ThrowStatementTest.java | 14 +++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/ThrowStatement.java create mode 100644 test/org/jetbrains/jet/j2k/ast/ThrowStatementTest.java diff --git a/src/org/jetbrains/jet/j2k/ast/ThrowStatement.java b/src/org/jetbrains/jet/j2k/ast/ThrowStatement.java new file mode 100644 index 00000000000..298650d1f3c --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/ThrowStatement.java @@ -0,0 +1,20 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class ThrowStatement extends Expression { + private final Expression myExpression; + + public ThrowStatement(Expression expression) { + myExpression = expression; + } + + @NotNull + @Override + public String toKotlin() { + return "throw" + SPACE + myExpression.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index 56ca0ee5f93..9e35b47c617 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -25,7 +25,6 @@ public class StatementVisitor extends ElementVisitor implements Visitor { @Override public void visitAssertStatement(PsiAssertStatement statement) { super.visitAssertStatement(statement); - myResult = new AssertStatement( expressionToExpression(statement.getAssertCondition()), expressionToExpression(statement.getAssertDescription()) @@ -96,7 +95,6 @@ public class StatementVisitor extends ElementVisitor implements Visitor { super.visitExpressionListStatement(statement); myResult = new ExpressionListStatement(expressionsToExpressionList(statement.getExpressionList().getExpressions())); - } @Override @@ -179,6 +177,9 @@ public class StatementVisitor extends ElementVisitor implements Visitor { @Override public void visitThrowStatement(PsiThrowStatement statement) { super.visitThrowStatement(statement); + myResult = new ThrowStatement( + expressionToExpression(statement.getException()) + ); } @Override diff --git a/test/org/jetbrains/jet/j2k/ast/ThrowStatementTest.java b/test/org/jetbrains/jet/j2k/ast/ThrowStatementTest.java new file mode 100644 index 00000000000..570c7b360ee --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/ThrowStatementTest.java @@ -0,0 +1,14 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class ThrowStatementTest extends JetTestCaseBase { + public void testSimpleThrowStatement() throws Exception { + Assert.assertEquals( + statementToSingleLineKotlin("throw exception;"), "throw exception"); + } +} From 16ed93a0a365b22ddabb61f2fdfbf9c8a254a998 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 31 Oct 2011 17:01:56 +0400 Subject: [PATCH 018/206] cleanup --- src/org/jetbrains/jet/j2k/ast/Identifier.java | 1 + src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java | 1 + src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java | 5 +++-- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/ast/Identifier.java b/src/org/jetbrains/jet/j2k/ast/Identifier.java index bc9f0677ba0..5f7be779b05 100644 --- a/src/org/jetbrains/jet/j2k/ast/Identifier.java +++ b/src/org/jetbrains/jet/j2k/ast/Identifier.java @@ -5,6 +5,7 @@ package org.jetbrains.jet.j2k.ast; */ public interface Identifier extends INode { public static Identifier EMPTY_IDENTIFIER = new IdentifierImpl(""); + public String getName(); public boolean isEmpty(); diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index eca574af9e8..2abf0341f48 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -15,6 +15,7 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { private Expression myResult = Expression.EMPTY_EXPRESSION; @NotNull + @Override public Expression getResult() { return myResult; } diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index 9e35b47c617..b1b857ab91f 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -18,7 +18,8 @@ public class StatementVisitor extends ElementVisitor implements Visitor { private Statement myResult = Statement.EMPTY_STATEMENT; @NotNull - public Statement getStatement() { + @Override + public Statement getResult() { return myResult; } @@ -82,6 +83,7 @@ public class StatementVisitor extends ElementVisitor implements Visitor { @Override public void visitEmptyStatement(PsiEmptyStatement statement) { super.visitEmptyStatement(statement); + myResult = Statement.EMPTY_STATEMENT; } @Override @@ -213,7 +215,6 @@ public class StatementVisitor extends ElementVisitor implements Visitor { @Override public void visitReturnStatement(PsiReturnStatement statement) { super.visitReturnStatement(statement); - myResult = new ReturnStatement( expressionToExpression(statement.getReturnValue()) ); From f863722ccb3d4672ec5b005e954f69dc36f5542e Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 31 Oct 2011 18:10:52 +0400 Subject: [PATCH 019/206] TypeCastExpression added --- src/org/jetbrains/jet/j2k/Converter.java | 4 +- .../jet/j2k/ast/TypeCastExpression.java | 22 +++++++ .../jet/j2k/visitors/ElementVisitor.java | 11 ++-- .../jet/j2k/visitors/ExpressionVisitor.java | 8 +++ .../jet/j2k/ast/TypeCastExpressionTest.java | 59 +++++++++++++++++++ 5 files changed, 97 insertions(+), 7 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/TypeCastExpression.java create mode 100644 test/org/jetbrains/jet/j2k/ast/TypeCastExpressionTest.java diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 5b1050c5084..c94a5804f28 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -132,7 +132,7 @@ public class Converter { final StatementVisitor statementVisitor = new StatementVisitor(); s.accept(statementVisitor); System.out.println(s.getClass()); - return statementVisitor.getStatement(); + return statementVisitor.getResult(); } @NotNull @@ -172,7 +172,7 @@ public class Converter { } @NotNull - public static Type typeToType(PsiType type) { + public static Type typeToType(@Nullable PsiType type) { if (type == null) return new EmptyType(); // TODO TypeVisitor typeVisitor = new TypeVisitor(); diff --git a/src/org/jetbrains/jet/j2k/ast/TypeCastExpression.java b/src/org/jetbrains/jet/j2k/ast/TypeCastExpression.java new file mode 100644 index 00000000000..ddd82b0dad4 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/TypeCastExpression.java @@ -0,0 +1,22 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class TypeCastExpression extends Expression { + private final Type myType; + private final Expression myExpression; + + public TypeCastExpression(Type type, Expression expression) { + myType = type; + myExpression = expression; + } + + @NotNull + @Override + public String toKotlin() { + return "(" + myExpression.toKotlin() + SPACE + "as" + SPACE + myType.toKotlin() + ")"; + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java index d045c6741f2..25feabfa00b 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java @@ -16,6 +16,12 @@ import static org.jetbrains.jet.j2k.Converter.*; public class ElementVisitor extends JavaElementVisitor implements Visitor { private Element myResult = new EmptyElement(); + @NotNull + @Override + public Element getResult() { + return myResult; + } + @Override public void visitLocalVariable(PsiLocalVariable variable) { super.visitLocalVariable(variable); @@ -42,9 +48,4 @@ public class ElementVisitor extends JavaElementVisitor implements Visitor { Converter.parametersToParameterList(list.getParameters()) ); } - - @NotNull - public Element getResult() { - return myResult; - } } diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 2abf0341f48..241dded360a 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -216,6 +216,14 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { @Override public void visitTypeCastExpression(PsiTypeCastExpression expression) { super.visitTypeCastExpression(expression); + + final PsiTypeElement castType = expression.getCastType(); + if (castType != null) { + myResult = new TypeCastExpression( + typeToType(castType.getType()), + expressionToExpression(expression.getOperand()) + ); + } } @Override diff --git a/test/org/jetbrains/jet/j2k/ast/TypeCastExpressionTest.java b/test/org/jetbrains/jet/j2k/ast/TypeCastExpressionTest.java new file mode 100644 index 00000000000..0d89429f02e --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/TypeCastExpressionTest.java @@ -0,0 +1,59 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class TypeCastExpressionTest extends JetTestCaseBase { + public void testStringCast() throws Exception { + Assert.assertEquals( + expressionToKotlin("(String)t"), + "(t as String?)" + ); + } + + public void testIntCast() throws Exception { + Assert.assertEquals( + expressionToKotlin("(int)t"), + "(t as Int)" + ); + } + + public void testFooCast() throws Exception { + Assert.assertEquals( + expressionToKotlin("(Foo)t"), + "(t as Foo?)" + ); + } + +// TODO: add support for generics and uncomment +// public void testSimpleGenericCast() throws Exception { +// Assert.assertEquals( +// expressionToKotlin("(List)list"), +// "(list as List)" +// ); +// } +// +// public void testExtendsWildcardCast() throws Exception { +// Assert.assertEquals( +// expressionToKotlin("(List)list"), +// "(list as List)" +// ); +// } +// +// public void testSuperWildcardCast() throws Exception { +// Assert.assertEquals( +// expressionToKotlin("(List)list"), +// "(list as List)" +// ); +// } +// +// public void testWildcardCast() throws Exception { +// Assert.assertEquals( +// expressionToKotlin("(List)list"), +// "(list as List<*>)" +// ); +// } +} \ No newline at end of file From e805b22325113d783f8ec485596a8e64534030d6 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 31 Oct 2011 18:15:26 +0400 Subject: [PATCH 020/206] ArrayAccessExpression added --- .../jet/j2k/ast/ArrayAccessExpression.java | 22 +++++++++++++++++++ .../jet/j2k/visitors/ExpressionVisitor.java | 4 ++++ .../j2k/ast/ArrayAccessExpressionTest.java | 21 ++++++++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 src/org/jetbrains/jet/j2k/ast/ArrayAccessExpression.java create mode 100644 test/org/jetbrains/jet/j2k/ast/ArrayAccessExpressionTest.java diff --git a/src/org/jetbrains/jet/j2k/ast/ArrayAccessExpression.java b/src/org/jetbrains/jet/j2k/ast/ArrayAccessExpression.java new file mode 100644 index 00000000000..4a511b713b9 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/ArrayAccessExpression.java @@ -0,0 +1,22 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class ArrayAccessExpression extends Expression { + private final Expression myExpression; + private final Expression myIndex; + + public ArrayAccessExpression(Expression expression, Expression index) { + myExpression = expression; + myIndex = index; + } + + @NotNull + @Override + public String toKotlin() { + return myExpression.toKotlin() + "[" + myIndex.toKotlin() + "]"; + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 241dded360a..5053ba41808 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -23,6 +23,10 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { @Override public void visitArrayAccessExpression(PsiArrayAccessExpression expression) { super.visitArrayAccessExpression(expression); + myResult = new ArrayAccessExpression( + expressionToExpression(expression.getArrayExpression()), + expressionToExpression(expression.getIndexExpression()) + ); } @Override diff --git a/test/org/jetbrains/jet/j2k/ast/ArrayAccessExpressionTest.java b/test/org/jetbrains/jet/j2k/ast/ArrayAccessExpressionTest.java new file mode 100644 index 00000000000..f6e47a68dd9 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/ArrayAccessExpressionTest.java @@ -0,0 +1,21 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class ArrayAccessExpressionTest extends JetTestCaseBase { + public void testIntIndex() throws Exception { + Assert.assertEquals(expressionToSingleLineKotlin("myArray[10]"), "myArray[10]"); + } + + public void testVariableIndex() throws Exception { + Assert.assertEquals(expressionToSingleLineKotlin("myArray[i]"), "myArray[i]"); + } + + public void testExpressionIndex() throws Exception { + Assert.assertEquals(expressionToSingleLineKotlin("myArray[myLibrary.calculateIndex(100)]"), "myArray[myLibrary.calculateIndex(100)]"); + } +} From 5d0b9b2517d101f45e0bc5ab80361cb383f79146 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 31 Oct 2011 18:54:53 +0400 Subject: [PATCH 021/206] ArrayInitializerExpression added --- .../j2k/ast/ArrayInitializerExpression.java | 23 ++++++++++++++ .../jet/j2k/visitors/ExpressionVisitor.java | 3 ++ .../ast/ArrayInitializerExpressionTest.java | 30 +++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java create mode 100644 test/org/jetbrains/jet/j2k/ast/ArrayInitializerExpressionTest.java diff --git a/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java b/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java new file mode 100644 index 00000000000..876dc90670f --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java @@ -0,0 +1,23 @@ +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 ArrayInitializerExpression extends Expression { + private final List myInitializers; + + public ArrayInitializerExpression(List initializers) { + myInitializers = initializers; + } + + @NotNull + @Override + public String toKotlin() { + return "array" + "(" + AstUtil.joinNodes(myInitializers, COMMA_WITH_SPACE) + ")"; + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 5053ba41808..cf768e2667f 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -32,6 +32,9 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { @Override public void visitArrayInitializerExpression(PsiArrayInitializerExpression expression) { super.visitArrayInitializerExpression(expression); + myResult = new ArrayInitializerExpression( + expressionsToExpressionList(expression.getInitializers()) + ); } @Override diff --git a/test/org/jetbrains/jet/j2k/ast/ArrayInitializerExpressionTest.java b/test/org/jetbrains/jet/j2k/ast/ArrayInitializerExpressionTest.java new file mode 100644 index 00000000000..63b8e20f0f8 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/ArrayInitializerExpressionTest.java @@ -0,0 +1,30 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class ArrayInitializerExpressionTest extends JetTestCaseBase { + public void testOneDim() throws Exception { + Assert.assertEquals( + expressionToSingleLineKotlin("{1, 2, 3};"), + "array(1, 2, 3)" + ); + } + + public void testOneDimWithVariables() throws Exception { + Assert.assertEquals( + expressionToSingleLineKotlin("{a, b, c};"), + "array(a, b, c)" + ); + } + + public void testTwoDim() throws Exception { + Assert.assertEquals( + expressionToSingleLineKotlin("{ {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };"), + "array(array(1, 2, 3), array(4, 5, 6), array(7, 8, 9))" + ); + } +} From c0bb256868a7a66026ca1794f1840a75c865203a Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 31 Oct 2011 19:50:47 +0400 Subject: [PATCH 022/206] new int[] {1, 2, 3} now converted to array(1, 2, 3) --- .../jet/j2k/visitors/ExpressionVisitor.java | 14 +++++--------- .../j2k/ast/ArrayInitializerExpressionTest.java | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index cf768e2667f..53ed864d091 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -129,16 +129,10 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { ); } - @Override - public void visitExpressionStatement(PsiExpressionStatement statement) { - super.visitExpressionStatement(statement); - } - @Override public void visitExpressionList(PsiExpressionList list) { super.visitExpressionList(list); - myResult = - new ExpressionList(expressionsToExpressionList(list.getExpressions())); + myResult = new ExpressionList(expressionsToExpressionList(list.getExpressions())); } @Override @@ -159,8 +153,7 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { @Override public void visitMethodCallExpression(PsiMethodCallExpression expression) { super.visitMethodCallExpression(expression); - // TODO: not resolved - myResult = + myResult = // TODO: not resolved new MethodCallExpression( expressionToExpression(expression.getMethodExpression()), elementToElement(expression.getArgumentList()) @@ -175,6 +168,9 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { @Override public void visitNewExpression(PsiNewExpression expression) { super.visitNewExpression(expression); + + if (expression.getArrayInitializer() != null) // new Foo[] {} + myResult = expressionToExpression(expression.getArrayInitializer()); } @Override diff --git a/test/org/jetbrains/jet/j2k/ast/ArrayInitializerExpressionTest.java b/test/org/jetbrains/jet/j2k/ast/ArrayInitializerExpressionTest.java index 63b8e20f0f8..fb24555f588 100644 --- a/test/org/jetbrains/jet/j2k/ast/ArrayInitializerExpressionTest.java +++ b/test/org/jetbrains/jet/j2k/ast/ArrayInitializerExpressionTest.java @@ -21,10 +21,25 @@ public class ArrayInitializerExpressionTest extends JetTestCaseBase { ); } + public void testNewInt() throws Exception { + Assert.assertEquals( + expressionToSingleLineKotlin("new int[] {1, 2, 3};"), + "array(1, 2, 3)" + ); + } + public void testTwoDim() throws Exception { Assert.assertEquals( expressionToSingleLineKotlin("{ {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };"), "array(array(1, 2, 3), array(4, 5, 6), array(7, 8, 9))" ); } + +// TODO +// public void testTwoDimNewInt() throws Exception { +// Assert.assertEquals( +// statementToSingleLineKotlin("int[][] myArray = new int[5][];"), +// "array(1, 2, 3)" +// ); +// } } From 48bd6cf0177d36b1b3c2933ad73aab5163c90cd2 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 31 Oct 2011 20:31:03 +0400 Subject: [PATCH 023/206] first implementation for new classes creation --- .../jet/j2k/ast/NewClassExpression.java | 22 ++++++++++++++++ .../jet/j2k/visitors/ElementVisitor.java | 11 +++++--- .../jet/j2k/visitors/ExpressionVisitor.java | 9 ++++++- .../jet/j2k/ast/NewClassExpressionTest.java | 25 +++++++++++++++++++ 4 files changed, 62 insertions(+), 5 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/NewClassExpression.java create mode 100644 test/org/jetbrains/jet/j2k/ast/NewClassExpressionTest.java diff --git a/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java b/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java new file mode 100644 index 00000000000..e55cd7cdb55 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java @@ -0,0 +1,22 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class NewClassExpression extends Expression { + private final Element myName; + private final Element myArguments; + + public NewClassExpression(Element name, Element arguments) { + myName = name; + myArguments = arguments; + } + + @NotNull + @Override + public String toKotlin() { + return 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 25feabfa00b..634696bc6a6 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java @@ -1,9 +1,6 @@ package org.jetbrains.jet.j2k.visitors; -import com.intellij.psi.JavaElementVisitor; -import com.intellij.psi.PsiExpressionList; -import com.intellij.psi.PsiLocalVariable; -import com.intellij.psi.PsiParameterList; +import com.intellij.psi.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.j2k.Converter; import org.jetbrains.jet.j2k.ast.*; @@ -41,6 +38,12 @@ public class ElementVisitor extends JavaElementVisitor implements Visitor { ); } + @Override + public void visitReferenceElement(PsiJavaCodeReferenceElement reference) { + super.visitReferenceElement(reference); + myResult = new IdentifierImpl(reference.getQualifiedName()); // TODO + } + @Override public void visitParameterList(PsiParameterList list) { super.visitParameterList(list); diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 53ed864d091..5262efacdc8 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -169,8 +169,15 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { public void visitNewExpression(PsiNewExpression expression) { super.visitNewExpression(expression); - if (expression.getArrayInitializer() != null) // new Foo[] {} + if (expression.getArrayInitializer() != null) // new Foo[] {} myResult = expressionToExpression(expression.getArrayInitializer()); + else { + myResult = new NewClassExpression( + elementToElement(expression.getClassOrAnonymousClassReference()), + elementToElement(expression.getArgumentList()) + ); + } + } @Override diff --git a/test/org/jetbrains/jet/j2k/ast/NewClassExpressionTest.java b/test/org/jetbrains/jet/j2k/ast/NewClassExpressionTest.java new file mode 100644 index 00000000000..78df5a362ef --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/NewClassExpressionTest.java @@ -0,0 +1,25 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class NewClassExpressionTest extends JetTestCaseBase { + public void testClassWithoutBody() throws Exception { + Assert.assertEquals(expressionToSingleLineKotlin("new Foo();"), "Foo()"); + } + + public void testClassWithoutBody2() throws Exception { + Assert.assertEquals(expressionToSingleLineKotlin("new myApp.Foo();"), "myApp.Foo()"); + } + + public void testClassWithParam() throws Exception { + Assert.assertEquals(expressionToSingleLineKotlin("new Foo(param);"), "Foo(param)"); + } + + public void testClassWithParams() throws Exception { + Assert.assertEquals(expressionToSingleLineKotlin("new Foo(param1, param2);"), "Foo(param1, param2)"); + } +} From ef3abfd10d58ec8664e008a36f5f587c1787aac9 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 31 Oct 2011 20:39:07 +0400 Subject: [PATCH 024/206] cleanup --- src/org/jetbrains/jet/j2k/Converter.java | 2 +- .../jet/j2k/ast/AssignmentExpression.java | 12 +++------- .../jet/j2k/ast/BinaryExpression.java | 6 ++--- src/org/jetbrains/jet/j2k/ast/Class.java | 12 +++++----- src/org/jetbrains/jet/j2k/ast/ClassType.java | 2 +- .../jet/j2k/ast/DeclarationStatement.java | 2 +- .../j2k/ast/DummyMethodCallExpression.java | 6 ++--- .../jetbrains/jet/j2k/ast/ExpressionList.java | 2 +- .../jet/j2k/ast/ExpressionListStatement.java | 2 +- src/org/jetbrains/jet/j2k/ast/Field.java | 6 ++--- src/org/jetbrains/jet/j2k/ast/File.java | 6 ++--- src/org/jetbrains/jet/j2k/ast/Function.java | 8 +++---- src/org/jetbrains/jet/j2k/ast/Import.java | 2 +- .../jet/j2k/ast/LiteralExpression.java | 2 +- .../jetbrains/jet/j2k/ast/LocalVariable.java | 6 ++--- .../jet/j2k/ast/MethodCallExpression.java | 4 ++-- src/org/jetbrains/jet/j2k/ast/Parameter.java | 4 ++-- .../jetbrains/jet/j2k/ast/ParameterList.java | 2 +- .../jetbrains/jet/j2k/ast/PrimitiveType.java | 2 +- .../jet/j2k/ast/ReturnStatement.java | 2 +- src/org/jetbrains/jet/j2k/ast/Statement.java | 2 +- .../jetbrains/jet/j2k/JetTestCaseBase.java | 24 +++++++++---------- 22 files changed, 55 insertions(+), 61 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index c94a5804f28..7f639708fc3 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -36,7 +36,7 @@ public class Converter { return result; } - public static Class classToClass(PsiClass psiClass) { + private static Class classToClass(PsiClass psiClass) { final List methods = methodsToFunctionList(psiClass.getMethods(), true); final List innerClasses = classesToClassList(psiClass.getAllInnerClasses()); diff --git a/src/org/jetbrains/jet/j2k/ast/AssignmentExpression.java b/src/org/jetbrains/jet/j2k/ast/AssignmentExpression.java index 4353ac8753e..7d0b10938a1 100644 --- a/src/org/jetbrains/jet/j2k/ast/AssignmentExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/AssignmentExpression.java @@ -6,15 +6,9 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public class AssignmentExpression extends Expression { - private Expression myLeft; - private Expression myRight; - private String myOp; - - public AssignmentExpression(Expression left, Expression right) { - myLeft = left; - myRight = right; - myOp = EQUAL; - } + private final Expression myLeft; + private final Expression myRight; + private final String myOp; public AssignmentExpression(Expression left, Expression right, String op) { myLeft = left; diff --git a/src/org/jetbrains/jet/j2k/ast/BinaryExpression.java b/src/org/jetbrains/jet/j2k/ast/BinaryExpression.java index bba976bf2a4..5be8a82d2be 100644 --- a/src/org/jetbrains/jet/j2k/ast/BinaryExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/BinaryExpression.java @@ -6,9 +6,9 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public class BinaryExpression extends Expression { - private Expression myLeft; - private Expression myRight; - private String myOp; + private final Expression myLeft; + private final Expression myRight; + private final String myOp; public BinaryExpression(Expression left, Expression right, String op) { myLeft = left; diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java index 29395972876..f67972163bc 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -10,11 +10,11 @@ import java.util.List; * @author ignatov */ public class Class extends Node { - protected String TYPE = "class"; - protected Identifier myName; - protected List myInnerClasses; - protected List myMethods; - protected List myFields; + String TYPE = "class"; + final Identifier myName; + final List myInnerClasses; + final List myMethods; + final List myFields; public Class(Identifier name, List innerClasses, List methods, List fields) { myName = name; @@ -24,7 +24,7 @@ public class Class extends Node { } @NotNull - protected List methodsExceptConstructors() { + List methodsExceptConstructors() { final LinkedList result = new LinkedList(); for (Function m : myMethods) if (m.getKind() != Kind.CONSTRUCTOR) diff --git a/src/org/jetbrains/jet/j2k/ast/ClassType.java b/src/org/jetbrains/jet/j2k/ast/ClassType.java index 73b6e43c7a2..7020e7c2c44 100644 --- a/src/org/jetbrains/jet/j2k/ast/ClassType.java +++ b/src/org/jetbrains/jet/j2k/ast/ClassType.java @@ -6,7 +6,7 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public class ClassType extends Type { - private Identifier myType; + private final Identifier myType; public ClassType(Identifier type) { myType = type; diff --git a/src/org/jetbrains/jet/j2k/ast/DeclarationStatement.java b/src/org/jetbrains/jet/j2k/ast/DeclarationStatement.java index c3135869842..75fdbb04621 100644 --- a/src/org/jetbrains/jet/j2k/ast/DeclarationStatement.java +++ b/src/org/jetbrains/jet/j2k/ast/DeclarationStatement.java @@ -10,7 +10,7 @@ import java.util.List; * @author ignatov */ public class DeclarationStatement extends Statement { - private List myElements; + private final List myElements; public DeclarationStatement(List elements) { myElements = elements; diff --git a/src/org/jetbrains/jet/j2k/ast/DummyMethodCallExpression.java b/src/org/jetbrains/jet/j2k/ast/DummyMethodCallExpression.java index 6961b67e03c..fabb9d3d92f 100644 --- a/src/org/jetbrains/jet/j2k/ast/DummyMethodCallExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/DummyMethodCallExpression.java @@ -6,9 +6,9 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public class DummyMethodCallExpression extends Expression { - private Expression myWho; - private String myMethodName; - private Expression myWhat; + private final Expression myWho; + private final String myMethodName; + private final Expression myWhat; public DummyMethodCallExpression(Expression who, String methodName, Expression what) { myWho = who; diff --git a/src/org/jetbrains/jet/j2k/ast/ExpressionList.java b/src/org/jetbrains/jet/j2k/ast/ExpressionList.java index 774d73b1573..e8f1d48d6e1 100644 --- a/src/org/jetbrains/jet/j2k/ast/ExpressionList.java +++ b/src/org/jetbrains/jet/j2k/ast/ExpressionList.java @@ -9,7 +9,7 @@ import java.util.List; * @author ignatov */ public class ExpressionList extends Expression { - private List myExpressions; + private final List myExpressions; private List myTypes; // TODO: add types to toKotlin public ExpressionList(List expressions, List types) { diff --git a/src/org/jetbrains/jet/j2k/ast/ExpressionListStatement.java b/src/org/jetbrains/jet/j2k/ast/ExpressionListStatement.java index b7cfb59e5bf..1c67340e655 100644 --- a/src/org/jetbrains/jet/j2k/ast/ExpressionListStatement.java +++ b/src/org/jetbrains/jet/j2k/ast/ExpressionListStatement.java @@ -9,7 +9,7 @@ import java.util.List; * @author ignatov */ public class ExpressionListStatement extends Expression { - private List myExpressions; + private final List myExpressions; public ExpressionListStatement(List expressions) { myExpressions = expressions; diff --git a/src/org/jetbrains/jet/j2k/ast/Field.java b/src/org/jetbrains/jet/j2k/ast/Field.java index f500e621093..c15a01e4cee 100644 --- a/src/org/jetbrains/jet/j2k/ast/Field.java +++ b/src/org/jetbrains/jet/j2k/ast/Field.java @@ -6,9 +6,9 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public class Field extends Node { - protected Identifier myIdentifier; - protected Type myType; - protected Element myInitializer; + final Identifier myIdentifier; + private final Type myType; + final Element myInitializer; public Field(Identifier identifier, Type type, Element initializer) { myIdentifier = identifier; diff --git a/src/org/jetbrains/jet/j2k/ast/File.java b/src/org/jetbrains/jet/j2k/ast/File.java index ba9c4952556..c3d924a569d 100644 --- a/src/org/jetbrains/jet/j2k/ast/File.java +++ b/src/org/jetbrains/jet/j2k/ast/File.java @@ -9,9 +9,9 @@ import java.util.List; * @author ignatov */ public class File extends Node { - private String myPackageName; - private List myImports; - private List myClasses; + private final String myPackageName; + private final List myImports; + private final List myClasses; public File(String packageName, List imports, List classes) { myPackageName = packageName; diff --git a/src/org/jetbrains/jet/j2k/ast/Function.java b/src/org/jetbrains/jet/j2k/ast/Function.java index 262d063bdff..4573c71bb24 100644 --- a/src/org/jetbrains/jet/j2k/ast/Function.java +++ b/src/org/jetbrains/jet/j2k/ast/Function.java @@ -6,10 +6,10 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public class Function extends Node { - private Identifier myName; - private Type myType; - protected Element myParams; - private Block myBlock; + private final Identifier myName; + private final Type myType; + final Element myParams; + private final Block myBlock; public Function(Identifier name, Type type, Element params, Block block) { myName = name; diff --git a/src/org/jetbrains/jet/j2k/ast/Import.java b/src/org/jetbrains/jet/j2k/ast/Import.java index 973f2387f80..6cf6cca560a 100644 --- a/src/org/jetbrains/jet/j2k/ast/Import.java +++ b/src/org/jetbrains/jet/j2k/ast/Import.java @@ -6,7 +6,7 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public class Import extends Node { - private String myName; + private final String myName; public Import(String name) { myName = name; diff --git a/src/org/jetbrains/jet/j2k/ast/LiteralExpression.java b/src/org/jetbrains/jet/j2k/ast/LiteralExpression.java index 2c46150f753..4737458e389 100644 --- a/src/org/jetbrains/jet/j2k/ast/LiteralExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/LiteralExpression.java @@ -6,7 +6,7 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public class LiteralExpression extends Expression { - private Identifier myIdentifier; + private final Identifier myIdentifier; public LiteralExpression(Identifier identifier) { myIdentifier = identifier; diff --git a/src/org/jetbrains/jet/j2k/ast/LocalVariable.java b/src/org/jetbrains/jet/j2k/ast/LocalVariable.java index 572199b3cab..8c66ab2ec01 100644 --- a/src/org/jetbrains/jet/j2k/ast/LocalVariable.java +++ b/src/org/jetbrains/jet/j2k/ast/LocalVariable.java @@ -6,9 +6,9 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public class LocalVariable extends Expression { - private Identifier myIdentifier; - private Type myType; - private Expression myInitializer; + private final Identifier myIdentifier; + private final Type myType; + private final Expression myInitializer; public LocalVariable(Identifier identifier, Type type, Expression initializer) { myIdentifier = identifier; diff --git a/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java b/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java index 3153d6fb760..9178f9ef278 100644 --- a/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java @@ -6,8 +6,8 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public class MethodCallExpression extends Expression { - private Expression myMethodCall; - private Element myParamList; + private final Expression myMethodCall; + private final Element myParamList; public MethodCallExpression(Expression methodCall, Element paramList) { myMethodCall = methodCall; diff --git a/src/org/jetbrains/jet/j2k/ast/Parameter.java b/src/org/jetbrains/jet/j2k/ast/Parameter.java index 40fd542b34d..625b78e7351 100644 --- a/src/org/jetbrains/jet/j2k/ast/Parameter.java +++ b/src/org/jetbrains/jet/j2k/ast/Parameter.java @@ -6,8 +6,8 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public class Parameter extends Expression { - private IdentifierImpl myIdentifier; - private Type myType; + private final IdentifierImpl myIdentifier; + private final Type myType; public Parameter(IdentifierImpl identifier, Type type) { myIdentifier = identifier; diff --git a/src/org/jetbrains/jet/j2k/ast/ParameterList.java b/src/org/jetbrains/jet/j2k/ast/ParameterList.java index 06470e1d7a9..9528a74e103 100644 --- a/src/org/jetbrains/jet/j2k/ast/ParameterList.java +++ b/src/org/jetbrains/jet/j2k/ast/ParameterList.java @@ -9,7 +9,7 @@ import java.util.List; * @author ignatov */ public class ParameterList extends Expression { - private List myParameters; + private final List myParameters; public ParameterList(List parameters) { myParameters = parameters; diff --git a/src/org/jetbrains/jet/j2k/ast/PrimitiveType.java b/src/org/jetbrains/jet/j2k/ast/PrimitiveType.java index 46af927081e..cb862c0b11c 100644 --- a/src/org/jetbrains/jet/j2k/ast/PrimitiveType.java +++ b/src/org/jetbrains/jet/j2k/ast/PrimitiveType.java @@ -6,7 +6,7 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public class PrimitiveType extends Type { - private Identifier myType; + private final Identifier myType; public PrimitiveType(Identifier type) { myType = type; diff --git a/src/org/jetbrains/jet/j2k/ast/ReturnStatement.java b/src/org/jetbrains/jet/j2k/ast/ReturnStatement.java index 034c538e0f5..b4040c3d824 100644 --- a/src/org/jetbrains/jet/j2k/ast/ReturnStatement.java +++ b/src/org/jetbrains/jet/j2k/ast/ReturnStatement.java @@ -6,7 +6,7 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public class ReturnStatement extends Statement { - private Expression myExpression; + private final Expression myExpression; public ReturnStatement(Expression expression) { myExpression = expression; diff --git a/src/org/jetbrains/jet/j2k/ast/Statement.java b/src/org/jetbrains/jet/j2k/ast/Statement.java index c173147f8ae..1be7eaf810b 100644 --- a/src/org/jetbrains/jet/j2k/ast/Statement.java +++ b/src/org/jetbrains/jet/j2k/ast/Statement.java @@ -6,7 +6,7 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public abstract class Statement extends Element { - public static Statement EMPTY_STATEMENT = new EmptyStatement(); + public static final Statement EMPTY_STATEMENT = new EmptyStatement(); /** * @author ignatov diff --git a/test/org/jetbrains/jet/j2k/JetTestCaseBase.java b/test/org/jetbrains/jet/j2k/JetTestCaseBase.java index b210ee6fc36..e47ef7c7cf8 100644 --- a/test/org/jetbrains/jet/j2k/JetTestCaseBase.java +++ b/test/org/jetbrains/jet/j2k/JetTestCaseBase.java @@ -22,14 +22,14 @@ import java.util.List; */ public abstract class JetTestCaseBase extends LightDaemonAnalyzerTestCase { private boolean checkInfos = false; - private String dataPath; - protected final String name; + private final String dataPath; + private final String name; protected JetTestCaseBase() { this("", ""); } - public JetTestCaseBase(String dataPath, String name) { + private JetTestCaseBase(String dataPath, String name) { this.dataPath = dataPath; this.name = name; } @@ -39,7 +39,7 @@ public abstract class JetTestCaseBase extends LightDaemonAnalyzerTestCase { return this; } - public static Sdk jdkFromIdeaHome() { + private static Sdk jdkFromIdeaHome() { return new JavaSdkImpl().createJdk("JDK", "compiler/testData/mockJDK-1.7/jre", true); } @@ -48,11 +48,11 @@ public abstract class JetTestCaseBase extends LightDaemonAnalyzerTestCase { return getTestDataPathBase(); } - public static String getTestDataPathBase() { + private static String getTestDataPathBase() { return getHomeDirectory() + "/compiler/testData"; } - public static String getHomeDirectory() { + private static String getHomeDirectory() { return new File(PathManager.getResourceRoot(JetTestCaseBase.class, "/org/jetbrains/jet/JetTestCaseBase.class")).getParentFile().getParentFile().getParent(); } @@ -80,7 +80,7 @@ public abstract class JetTestCaseBase extends LightDaemonAnalyzerTestCase { return dataPath; } - protected void configureFromText(String text) throws IOException { + void configureFromText(String text) throws IOException { configureFromFileText("test.java", text); } @@ -101,12 +101,12 @@ public abstract class JetTestCaseBase extends LightDaemonAnalyzerTestCase { return toSingleLine(classToKotlin(text)); } - protected String fileToKotlin(String text) throws IOException { + String fileToKotlin(String text) throws IOException { configureFromText(text); return prettify(Converter.fileToFile((PsiJavaFile) myFile).toKotlin()); } - protected String methodToKotlin(String text) throws IOException { + String methodToKotlin(String text) throws IOException { String result = classToKotlin("class C {" + text + "}") .replaceAll("class C \\{", ""); result = result.substring(0, result.lastIndexOf("}")); @@ -144,7 +144,7 @@ public abstract class JetTestCaseBase extends LightDaemonAnalyzerTestCase { } @NotNull - public static TestSuite suiteForDirectory(String baseDataDir, @NotNull final String dataPath, boolean recursive, @NotNull NamedTestFactory factory) { + private static TestSuite suiteForDirectory(String baseDataDir, @NotNull final String dataPath, boolean recursive, @NotNull NamedTestFactory factory) { TestSuite suite = new TestSuite(dataPath); final String extension = ".jet"; FilenameFilter extensionFilter = new FilenameFilter() { @@ -180,7 +180,7 @@ public abstract class JetTestCaseBase extends LightDaemonAnalyzerTestCase { } @NotNull - protected static String prettify(String code) { + private static String prettify(String code) { if (code == null) return ""; return code @@ -194,7 +194,7 @@ public abstract class JetTestCaseBase extends LightDaemonAnalyzerTestCase { } @NotNull - protected static String toSingleLine(String string) { + static String toSingleLine(String string) { return prettify(string.replaceAll("\n", " ")); } } \ No newline at end of file From 01c0d11cccaf869eade838c99c8c80865d1b96c6 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 31 Oct 2011 21:01:31 +0400 Subject: [PATCH 025/206] ArrayType added --- src/org/jetbrains/jet/j2k/ast/ArrayType.java | 22 +++++++++++ .../jet/j2k/visitors/TypeVisitor.java | 2 + .../jetbrains/jet/j2k/ast/ArrayTypeTest.java | 37 +++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 src/org/jetbrains/jet/j2k/ast/ArrayType.java create mode 100644 test/org/jetbrains/jet/j2k/ast/ArrayTypeTest.java diff --git a/src/org/jetbrains/jet/j2k/ast/ArrayType.java b/src/org/jetbrains/jet/j2k/ast/ArrayType.java new file mode 100644 index 00000000000..d3574c4c0f3 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/ArrayType.java @@ -0,0 +1,22 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class ArrayType extends Type { + private final Type myType; + + public ArrayType(Type type) { + myType = type; + } + + @NotNull + @Override + public String toKotlin() { + if (PRIMITIVE_TYPES.contains(myType.toKotlin().toLowerCase())) + return myType.toKotlin() + "Array" + QUESTION; // TODO + return "Array" + "<" + myType.toKotlin() + ">" + QUESTION; + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java index fbac51b6861..c222a774124 100644 --- a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java @@ -2,6 +2,7 @@ package org.jetbrains.jet.j2k.visitors; import com.intellij.psi.*; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.j2k.Converter; import org.jetbrains.jet.j2k.ast.*; import org.jetbrains.jet.j2k.util.AstUtil; @@ -36,6 +37,7 @@ public class TypeVisitor extends PsiTypeVisitor implements Visitor { @Override public Type visitArrayType(PsiArrayType arrayType) { + myResult = new ArrayType(Converter.typeToType(arrayType.getComponentType())); return super.visitArrayType(arrayType); } diff --git a/test/org/jetbrains/jet/j2k/ast/ArrayTypeTest.java b/test/org/jetbrains/jet/j2k/ast/ArrayTypeTest.java new file mode 100644 index 00000000000..1666233febe --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/ArrayTypeTest.java @@ -0,0 +1,37 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class ArrayTypeTest extends JetTestCaseBase { + public void testNewStringArray() throws Exception { + Assert.assertEquals( + statementToKotlin("String[] a = new String[]{\"abc\"}"), + "var a : Array? = array(\"abc\")" + ); + } + + public void testNewIntArray() throws Exception { + Assert.assertEquals( + statementToKotlin("int[] a = new int[]{1, 2, 3}"), + "var a : IntArray? = array(1, 2, 3)" + ); + } + + public void testDoubleArray() throws Exception { + Assert.assertEquals( + statementToKotlin("double[] a = new double[]{1, 2, 3}"), + "var a : DoubleArray? = array(1, 2, 3)" + ); + } + + public void testLongArray() throws Exception { + Assert.assertEquals( + statementToKotlin("long[] a = new long[]{1, 2, 3}"), + "var a : LongArray? = array(1, 2, 3)" + ); + } +} From 15eafa6f9c0595078dc9bc3206fefe3c575d7dad Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 1 Nov 2011 13:41:05 +0400 Subject: [PATCH 026/206] in, out, star projection supported as method params type parameters also supported --- src/org/jetbrains/jet/j2k/Converter.java | 15 ++++++++++++ src/org/jetbrains/jet/j2k/ast/ArrayType.java | 5 ++-- src/org/jetbrains/jet/j2k/ast/ClassType.java | 10 ++++++-- .../jet/j2k/ast/InProjectionType.java | 20 ++++++++++++++++ src/org/jetbrains/jet/j2k/ast/Node.java | 2 ++ .../jet/j2k/ast/OutProjectionType.java | 20 ++++++++++++++++ .../jet/j2k/ast/StarProjectionType.java | 14 +++++++++++ src/org/jetbrains/jet/j2k/ast/Type.java | 14 +++++++++++ .../jet/j2k/visitors/TypeVisitor.java | 18 +++++++++++--- .../jetbrains/jet/j2k/ast/ArrayTypeTest.java | 7 ++++++ .../jet/j2k/ast/InProjectionTypeTest.java | 16 +++++++++++++ .../jet/j2k/ast/OutProjectionTypeTest.java | 16 +++++++++++++ .../jet/j2k/ast/StarProjectionTypeTest.java | 16 +++++++++++++ .../jet/j2k/ast/TypeParametersTest.java | 24 +++++++++++++++++++ 14 files changed, 190 insertions(+), 7 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/InProjectionType.java create mode 100644 src/org/jetbrains/jet/j2k/ast/OutProjectionType.java create mode 100644 src/org/jetbrains/jet/j2k/ast/StarProjectionType.java create mode 100644 test/org/jetbrains/jet/j2k/ast/InProjectionTypeTest.java create mode 100644 test/org/jetbrains/jet/j2k/ast/OutProjectionTypeTest.java create mode 100644 test/org/jetbrains/jet/j2k/ast/StarProjectionTypeTest.java create mode 100644 test/org/jetbrains/jet/j2k/ast/TypeParametersTest.java diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 7f639708fc3..25a780351de 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -189,6 +189,21 @@ public class Converter { return result; } + @NotNull + public static List typesToNotNullableTypeList(PsiType[] types) { + List result = new LinkedList(typesToTypeList(types)); + for (Type p : result) + p.setNullable(false); + return result; + } + + @NotNull + public static Type typeToNotNullableType(@Nullable PsiType type) { + Type result = typeToType(type); + result.setNullable(false); + return result; + } + @NotNull private static List importsToImportList(PsiImportStatementBase[] imports) { List result = new LinkedList(); diff --git a/src/org/jetbrains/jet/j2k/ast/ArrayType.java b/src/org/jetbrains/jet/j2k/ast/ArrayType.java index d3574c4c0f3..293d9037d6e 100644 --- a/src/org/jetbrains/jet/j2k/ast/ArrayType.java +++ b/src/org/jetbrains/jet/j2k/ast/ArrayType.java @@ -15,8 +15,9 @@ public class ArrayType extends Type { @NotNull @Override public String toKotlin() { + String nullable = isNullableStr(); if (PRIMITIVE_TYPES.contains(myType.toKotlin().toLowerCase())) - return myType.toKotlin() + "Array" + QUESTION; // TODO - return "Array" + "<" + myType.toKotlin() + ">" + QUESTION; + return myType.toKotlin() + "Array" + nullable; // TODO + return "Array" + "<" + myType.toKotlin() + ">" + nullable; } } diff --git a/src/org/jetbrains/jet/j2k/ast/ClassType.java b/src/org/jetbrains/jet/j2k/ast/ClassType.java index 7020e7c2c44..bb0cdebe4b2 100644 --- a/src/org/jetbrains/jet/j2k/ast/ClassType.java +++ b/src/org/jetbrains/jet/j2k/ast/ClassType.java @@ -1,20 +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 ClassType extends Type { private final Identifier myType; + private List myParameters; - public ClassType(Identifier type) { + public ClassType(Identifier type, List parameters) { myType = type; + myParameters = parameters; } @NotNull @Override public String toKotlin() { - return myType.toKotlin() + QUESTION; + String params = myParameters.size() == 0 ? EMPTY : "<" + AstUtil.joinNodes(myParameters, COMMA_WITH_SPACE) + ">"; + return myType.toKotlin() + params + isNullableStr(); } } diff --git a/src/org/jetbrains/jet/j2k/ast/InProjectionType.java b/src/org/jetbrains/jet/j2k/ast/InProjectionType.java new file mode 100644 index 00000000000..17d2b63cc04 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/InProjectionType.java @@ -0,0 +1,20 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class InProjectionType extends Type { + private final Type myBound; + + public InProjectionType(Type bound) { + myBound = bound; + } + + @NotNull + @Override + public String toKotlin() { + return "in" + SPACE + myBound.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/Node.java b/src/org/jetbrains/jet/j2k/ast/Node.java index 0c063354d7f..af64555154d 100644 --- a/src/org/jetbrains/jet/j2k/ast/Node.java +++ b/src/org/jetbrains/jet/j2k/ast/Node.java @@ -10,6 +10,8 @@ import java.util.Set; * @author ignatov */ public abstract class Node implements INode { + public static final String STAR = "*"; + @NotNull @Override public Kind getKind() { diff --git a/src/org/jetbrains/jet/j2k/ast/OutProjectionType.java b/src/org/jetbrains/jet/j2k/ast/OutProjectionType.java new file mode 100644 index 00000000000..dbe75210fb7 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/OutProjectionType.java @@ -0,0 +1,20 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class OutProjectionType extends Type { + private final Type myBound; + + public OutProjectionType(Type bound) { + myBound = bound; + } + + @NotNull + @Override + public String toKotlin() { + return "out" + SPACE + myBound.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/StarProjectionType.java b/src/org/jetbrains/jet/j2k/ast/StarProjectionType.java new file mode 100644 index 00000000000..c409b98da49 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/StarProjectionType.java @@ -0,0 +1,14 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class StarProjectionType extends Type { + @NotNull + @Override + public String toKotlin() { + return STAR; + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/Type.java b/src/org/jetbrains/jet/j2k/ast/Type.java index 7f040f92002..0665cc606da 100644 --- a/src/org/jetbrains/jet/j2k/ast/Type.java +++ b/src/org/jetbrains/jet/j2k/ast/Type.java @@ -6,9 +6,23 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public abstract class Type extends Element { + protected boolean myNullable = true; + @NotNull @Override public Kind getKind() { return Kind.TYPE; } + + public void setNullable(boolean nullable) { + myNullable = nullable; + } + + public boolean isNullable() { + return myNullable; + } + + protected String isNullableStr() { + return isNullable() ? QUESTION : EMPTY; + } } diff --git a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java index c222a774124..ba0508424a4 100644 --- a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java @@ -2,10 +2,12 @@ package org.jetbrains.jet.j2k.visitors; import com.intellij.psi.*; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.j2k.Converter; import org.jetbrains.jet.j2k.ast.*; import org.jetbrains.jet.j2k.util.AstUtil; +import static org.jetbrains.jet.j2k.Converter.typeToType; +import static org.jetbrains.jet.j2k.Converter.typesToTypeList; + /** * @author ignatov */ @@ -19,6 +21,7 @@ public class TypeVisitor extends PsiTypeVisitor implements Visitor { @Override public Type visitType(PsiType type) { + System.out.println(type.getClass()); // TODO: remove return super.visitType(type); } @@ -37,13 +40,16 @@ public class TypeVisitor extends PsiTypeVisitor implements Visitor { @Override public Type visitArrayType(PsiArrayType arrayType) { - myResult = new ArrayType(Converter.typeToType(arrayType.getComponentType())); + myResult = new ArrayType(typeToType(arrayType.getComponentType())); return super.visitArrayType(arrayType); } @Override public Type visitClassType(PsiClassType classType) { - myResult = new ClassType(new IdentifierImpl(classType.getClassName())); + myResult = new ClassType( + new IdentifierImpl(classType.getClassName()), + typesToTypeList(classType.getParameters()) + ); return super.visitClassType(classType); } @@ -54,6 +60,12 @@ public class TypeVisitor extends PsiTypeVisitor implements Visitor { @Override public Type visitWildcardType(PsiWildcardType wildcardType) { + if (wildcardType.isExtends()) + myResult = new OutProjectionType(typeToType(wildcardType.getExtendsBound())); + else if (wildcardType.isSuper()) + myResult = new InProjectionType(typeToType(wildcardType.getSuperBound())); + else + myResult = new StarProjectionType(); return super.visitWildcardType(wildcardType); } diff --git a/test/org/jetbrains/jet/j2k/ast/ArrayTypeTest.java b/test/org/jetbrains/jet/j2k/ast/ArrayTypeTest.java index 1666233febe..eed80e25e26 100644 --- a/test/org/jetbrains/jet/j2k/ast/ArrayTypeTest.java +++ b/test/org/jetbrains/jet/j2k/ast/ArrayTypeTest.java @@ -34,4 +34,11 @@ public class ArrayTypeTest extends JetTestCaseBase { "var a : LongArray? = array(1, 2, 3)" ); } + + public void testMethodArrayArgs() throws Exception { + Assert.assertEquals( + methodToSingleLineKotlin("void fromArrayToCollection(Foo[] a) {}"), + "fun fromArrayToCollection(a : Array?) : Unit { }" + ); + } } diff --git a/test/org/jetbrains/jet/j2k/ast/InProjectionTypeTest.java b/test/org/jetbrains/jet/j2k/ast/InProjectionTypeTest.java new file mode 100644 index 00000000000..e5bf07095f6 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/InProjectionTypeTest.java @@ -0,0 +1,16 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class InProjectionTypeTest extends JetTestCaseBase { + public void testMethodParams() throws Exception { + Assert.assertEquals( + methodToSingleLineKotlin("void popAll(Collection dst) {}"), + "fun popAll(dst : Collection?) : Unit { }" + ); + } +} diff --git a/test/org/jetbrains/jet/j2k/ast/OutProjectionTypeTest.java b/test/org/jetbrains/jet/j2k/ast/OutProjectionTypeTest.java new file mode 100644 index 00000000000..2475d11c506 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/OutProjectionTypeTest.java @@ -0,0 +1,16 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class OutProjectionTypeTest extends JetTestCaseBase { + public void testMethodParams() throws Exception { + Assert.assertEquals( + methodToSingleLineKotlin("void pushAll(Collection src) {}"), + "fun pushAll(src : Collection?) : Unit { }" + ); + } +} diff --git a/test/org/jetbrains/jet/j2k/ast/StarProjectionTypeTest.java b/test/org/jetbrains/jet/j2k/ast/StarProjectionTypeTest.java new file mode 100644 index 00000000000..bd4ac8cae14 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/StarProjectionTypeTest.java @@ -0,0 +1,16 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class StarProjectionTypeTest extends JetTestCaseBase { + public void testMethodParams() throws Exception { + Assert.assertEquals( + methodToSingleLineKotlin("void wtf(Collection w) {}"), + "fun wtf(w : Collection<*>?) : Unit { }" + ); + } +} diff --git a/test/org/jetbrains/jet/j2k/ast/TypeParametersTest.java b/test/org/jetbrains/jet/j2k/ast/TypeParametersTest.java new file mode 100644 index 00000000000..085cd875f07 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/TypeParametersTest.java @@ -0,0 +1,24 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class TypeParametersTest extends JetTestCaseBase { + public void testGenericParam() throws Exception { + Assert.assertEquals( + statementToKotlin("List l;"), + "var l : List?" + ); + } + + public void testManyGenericParams() throws Exception { + Assert.assertEquals( + statementToKotlin("List l;"), + "var l : List?" + ); + } + +} From fa2483ccfb260fda4646b867698c6d46c8ababe7 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 1 Nov 2011 14:52:25 +0400 Subject: [PATCH 027/206] first type parameters implementation for classes added --- src/org/jetbrains/jet/j2k/Converter.java | 9 ++++----- src/org/jetbrains/jet/j2k/ast/Class.java | 10 ++++++++-- src/org/jetbrains/jet/j2k/ast/Enum.java | 6 +++--- src/org/jetbrains/jet/j2k/ast/Trait.java | 4 ++-- .../jetbrains/jet/j2k/ast/TypeParameter.java | 20 +++++++++++++++++++ .../jet/j2k/visitors/ElementVisitor.java | 10 +++++++++- test/org/jetbrains/jet/j2k/ast/ClassTest.java | 7 +++++++ 7 files changed, 53 insertions(+), 13 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/TypeParameter.java diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 25a780351de..d6b909a1903 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -38,17 +38,16 @@ public class Converter { private static Class classToClass(PsiClass psiClass) { final List methods = methodsToFunctionList(psiClass.getMethods(), true); - final List innerClasses = classesToClassList(psiClass.getAllInnerClasses()); - final List fields = fieldsToFieldList(psiClass.getAllFields()); + final List typeParameters = elementsToElementList(psiClass.getTypeParameters()); final IdentifierImpl name = new IdentifierImpl(psiClass.getName()); if (psiClass.isInterface()) - return new Trait(name, innerClasses, methods, fields); + return new Trait(name, typeParameters, innerClasses, methods, fields); if (psiClass.isEnum()) - return new Enum(name, innerClasses, methods, fields); - return new Class(name, innerClasses, methods, fields); + return new Enum(name, typeParameters, innerClasses, methods, fields); + return new Class(name, typeParameters, innerClasses, methods, fields); } private static List fieldsToFieldList(PsiField[] fields) { diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java index f67972163bc..0bd640e0868 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -12,12 +12,14 @@ import java.util.List; public class Class extends Node { String TYPE = "class"; final Identifier myName; + final List myTypeParameters; final List myInnerClasses; final List myMethods; final List myFields; - public Class(Identifier name, List innerClasses, List methods, List fields) { + public Class(Identifier name, List typeParameters, List innerClasses, List methods, List fields) { myName = name; + myTypeParameters = typeParameters; myInnerClasses = innerClasses; myMethods = methods; myFields = fields; @@ -32,10 +34,14 @@ public class Class extends Node { return result; } + String typeParametersToKotlin() { + return myTypeParameters.size() > 0 ? "<" + AstUtil.joinNodes(myTypeParameters, COMMA_WITH_SPACE) + ">" : EMPTY; + } + @NotNull @Override public String toKotlin() { - return TYPE + SPACE + myName.toKotlin() + SPACE + "{" + N + + return TYPE + SPACE + myName.toKotlin() + typeParametersToKotlin() + SPACE + "{" + N + AstUtil.joinNodes(myFields, N) + N + AstUtil.joinNodes(methodsExceptConstructors(), N) + N + AstUtil.joinNodes(myInnerClasses, N) + N + diff --git a/src/org/jetbrains/jet/j2k/ast/Enum.java b/src/org/jetbrains/jet/j2k/ast/Enum.java index 3b9ec1e2573..c2fe7466d54 100644 --- a/src/org/jetbrains/jet/j2k/ast/Enum.java +++ b/src/org/jetbrains/jet/j2k/ast/Enum.java @@ -10,8 +10,8 @@ import java.util.List; * @author ignatov */ public class Enum extends Class { - public Enum(Identifier name, List innerClasses, List methods, List fields) { - super(name, innerClasses, methods, fields); + public Enum(Identifier name, List typeParameters, List innerClasses, List methods, List fields) { + super(name, typeParameters, innerClasses, methods, fields); } @Nullable @@ -33,7 +33,7 @@ public class Enum extends Class { @NotNull @Override public String toKotlin() { - return "enum" + SPACE + myName.toKotlin() + primaryConstructorToKotlin() + SPACE + "{" + N + + return "enum" + SPACE + myName.toKotlin() + typeParametersToKotlin() + primaryConstructorToKotlin() + SPACE + "{" + N + AstUtil.joinNodes(myFields, N) + N + AstUtil.joinNodes(methodsExceptConstructors(), N) + N + AstUtil.joinNodes(myInnerClasses, N) + N + diff --git a/src/org/jetbrains/jet/j2k/ast/Trait.java b/src/org/jetbrains/jet/j2k/ast/Trait.java index 90356dccda5..4ae02ccf569 100644 --- a/src/org/jetbrains/jet/j2k/ast/Trait.java +++ b/src/org/jetbrains/jet/j2k/ast/Trait.java @@ -6,8 +6,8 @@ import java.util.List; * @author ignatov */ public class Trait extends Class { - public Trait(Identifier name, List innerClasses, List methods, List fields) { - super(name, innerClasses, methods, fields); + public Trait(Identifier name, List typeParameters, List innerClasses, List methods, List fields) { + super(name, typeParameters, innerClasses, methods, fields); TYPE = "trait"; } } diff --git a/src/org/jetbrains/jet/j2k/ast/TypeParameter.java b/src/org/jetbrains/jet/j2k/ast/TypeParameter.java new file mode 100644 index 00000000000..561e2fa0d78 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/TypeParameter.java @@ -0,0 +1,20 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class TypeParameter extends Element { + private Identifier myName; + + public TypeParameter(Identifier name) { + myName = name; + } + + @NotNull + @Override + public String toKotlin() { + return myName.toKotlin() + QUESTION; + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java index 634696bc6a6..a90fcc8ea1e 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java @@ -44,6 +44,14 @@ public class ElementVisitor extends JavaElementVisitor implements Visitor { myResult = new IdentifierImpl(reference.getQualifiedName()); // TODO } + @Override + public void visitTypeParameter(PsiTypeParameter classParameter) { + super.visitTypeParameter(classParameter); + myResult = new TypeParameter( + new IdentifierImpl(classParameter.getName()) + ); + } + @Override public void visitParameterList(PsiParameterList list) { super.visitParameterList(list); @@ -51,4 +59,4 @@ public class ElementVisitor extends JavaElementVisitor implements Visitor { Converter.parametersToParameterList(list.getParameters()) ); } -} +} \ No newline at end of file diff --git a/test/org/jetbrains/jet/j2k/ast/ClassTest.java b/test/org/jetbrains/jet/j2k/ast/ClassTest.java index 67397afe71d..d2a918ed333 100644 --- a/test/org/jetbrains/jet/j2k/ast/ClassTest.java +++ b/test/org/jetbrains/jet/j2k/ast/ClassTest.java @@ -62,4 +62,11 @@ public class ClassTest extends JetTestCaseBase { "}\n" + "}"); } + + public void testGenericClass() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin("final class Entry {}"), + "class Entry { }" + ); + } } From 8f97c76c07d3046f5571081f88b0477c6fa9d864 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 1 Nov 2011 15:41:29 +0400 Subject: [PATCH 028/206] type params fixed --- src/org/jetbrains/jet/j2k/ast/TypeParameter.java | 4 ++-- test/org/jetbrains/jet/j2k/ast/ClassTest.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/ast/TypeParameter.java b/src/org/jetbrains/jet/j2k/ast/TypeParameter.java index 561e2fa0d78..e38515be010 100644 --- a/src/org/jetbrains/jet/j2k/ast/TypeParameter.java +++ b/src/org/jetbrains/jet/j2k/ast/TypeParameter.java @@ -15,6 +15,6 @@ public class TypeParameter extends Element { @NotNull @Override public String toKotlin() { - return myName.toKotlin() + QUESTION; + return myName.toKotlin(); } -} +} \ No newline at end of file diff --git a/test/org/jetbrains/jet/j2k/ast/ClassTest.java b/test/org/jetbrains/jet/j2k/ast/ClassTest.java index d2a918ed333..17d78863d7e 100644 --- a/test/org/jetbrains/jet/j2k/ast/ClassTest.java +++ b/test/org/jetbrains/jet/j2k/ast/ClassTest.java @@ -66,7 +66,7 @@ public class ClassTest extends JetTestCaseBase { public void testGenericClass() throws Exception { Assert.assertEquals( classToSingleLineKotlin("final class Entry {}"), - "class Entry { }" + "class Entry { }" ); } } From 69b910089033c4b705ef8a9a1838fc73fcf9e53b Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 1 Nov 2011 15:54:18 +0400 Subject: [PATCH 029/206] generic parameters for functions added --- src/org/jetbrains/jet/j2k/Converter.java | 3 +++ .../jetbrains/jet/j2k/ast/Constructor.java | 6 ++++-- src/org/jetbrains/jet/j2k/ast/Function.java | 15 ++++++++++--- .../jetbrains/jet/j2k/ast/FunctionTest.java | 21 +++++++++++++++++++ 4 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index d6b909a1903..8c991f8a8b0 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -87,17 +87,20 @@ public class Converter { final Type type = typeToType(method.getReturnType()); final Block body = blockToBlock(method.getBody(), notEmpty); final Element params = elementToElement(method.getParameterList()); + final List typeParameters = elementsToElementList(method.getTypeParameters()); if (method.isConstructor()) return new Constructor( identifier, type, + typeParameters, params, body ); return new Function( identifier, type, + typeParameters, params, body ); diff --git a/src/org/jetbrains/jet/j2k/ast/Constructor.java b/src/org/jetbrains/jet/j2k/ast/Constructor.java index 6f758dfe1e6..a28e306ee1b 100644 --- a/src/org/jetbrains/jet/j2k/ast/Constructor.java +++ b/src/org/jetbrains/jet/j2k/ast/Constructor.java @@ -2,12 +2,14 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; +import java.util.List; + /** * @author ignatov */ public class Constructor extends Function { - public Constructor(Identifier identifier, Type type, Element params, Block block) { - super(identifier, type, params, block); + public Constructor(Identifier identifier, Type type, List typeParameters, Element params, Block block) { + super(identifier, type, typeParameters, params, block); } public String primary() { diff --git a/src/org/jetbrains/jet/j2k/ast/Function.java b/src/org/jetbrains/jet/j2k/ast/Function.java index 4573c71bb24..d9aaac3e45c 100644 --- a/src/org/jetbrains/jet/j2k/ast/Function.java +++ b/src/org/jetbrains/jet/j2k/ast/Function.java @@ -1,6 +1,9 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.j2k.util.AstUtil; + +import java.util.List; /** * @author ignatov @@ -8,20 +11,26 @@ import org.jetbrains.annotations.NotNull; public class Function extends Node { private final Identifier myName; private final Type myType; + private List myTypeParameters; final Element myParams; private final Block myBlock; - public Function(Identifier name, Type type, Element params, Block block) { + public Function(Identifier name, Type type, List typeParameters, Element params, Block block) { myName = name; myType = type; + myTypeParameters = typeParameters; myParams = params; myBlock = block; } + private String typeParametersToKotlin() { + return myTypeParameters.size() > 0 ? "<" + AstUtil.joinNodes(myTypeParameters, COMMA_WITH_SPACE) + ">" : EMPTY; + } + @NotNull @Override public String toKotlin() { - return "fun" + SPACE + myName.toKotlin() + "(" + myParams.toKotlin() + ")" + SPACE + COLON + SPACE + myType.toKotlin() + SPACE + - myBlock.toKotlin(); + return "fun" + SPACE + myName.toKotlin() + typeParametersToKotlin() + "(" + myParams.toKotlin() + ")" + SPACE + COLON + + SPACE + myType.toKotlin() + SPACE + myBlock.toKotlin(); } } diff --git a/test/org/jetbrains/jet/j2k/ast/FunctionTest.java b/test/org/jetbrains/jet/j2k/ast/FunctionTest.java index dd2297deb96..c1f1d9e4372 100644 --- a/test/org/jetbrains/jet/j2k/ast/FunctionTest.java +++ b/test/org/jetbrains/jet/j2k/ast/FunctionTest.java @@ -41,4 +41,25 @@ public class FunctionTest extends JetTestCaseBase { "fun isTrue() : Boolean { return true }" ); } + + public void testClassGenericParam() throws Exception { + Assert.assertEquals( + methodToSingleLineKotlin("T getT() {}"), + "fun getT() : T? { }" + ); + } + + public void testOwnGenericParam() throws Exception { + Assert.assertEquals( + methodToSingleLineKotlin(" void putU(U u) {}"), + "fun putU(u : U?) : Unit { }" + ); + } + + public void testOwnSeveralGenericParams() throws Exception { + Assert.assertEquals( + methodToSingleLineKotlin(" void putUVW(U u, V v, W w) {}"), + "fun putUVW(u : U?, v : V?, w : W?) : Unit { }" + ); + } } \ No newline at end of file From b7ea5b73d15a1501bdbeeb02b313278f53bb4a72 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 1 Nov 2011 17:38:58 +0400 Subject: [PATCH 030/206] simple inheritance added for classes, traits and enums --- src/org/jetbrains/jet/j2k/Converter.java | 12 ++++++++--- src/org/jetbrains/jet/j2k/ast/Class.java | 18 ++++++++++++++-- src/org/jetbrains/jet/j2k/ast/Enum.java | 6 +++--- src/org/jetbrains/jet/j2k/ast/Trait.java | 4 ++-- test/org/jetbrains/jet/j2k/ast/ClassTest.java | 21 +++++++++++++++++++ test/org/jetbrains/jet/j2k/ast/EnumTest.java | 14 +++++++++++++ test/org/jetbrains/jet/j2k/ast/TraitTest.java | 16 +++++++++++++- 7 files changed, 80 insertions(+), 11 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 8c991f8a8b0..4d2e986fa80 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -41,13 +41,19 @@ public class Converter { final List innerClasses = classesToClassList(psiClass.getAllInnerClasses()); final List fields = fieldsToFieldList(psiClass.getAllFields()); final List typeParameters = elementsToElementList(psiClass.getTypeParameters()); + final List implementsTypes = typesToNotNullableTypeList(psiClass.getImplementsListTypes()); + final List extendsListTypes = new LinkedList(); + for (PsiClassType e : psiClass.getExtendsListTypes()) + if (!e.getCanonicalText().equals("java.lang.Enum")) + extendsListTypes.add(e); + final List extendsTypes = typesToNotNullableTypeList(extendsListTypes.toArray(new PsiType[extendsListTypes.size()])); final IdentifierImpl name = new IdentifierImpl(psiClass.getName()); if (psiClass.isInterface()) - return new Trait(name, typeParameters, innerClasses, methods, fields); + return new Trait(name, typeParameters, extendsTypes, implementsTypes, innerClasses, methods, fields); if (psiClass.isEnum()) - return new Enum(name, typeParameters, innerClasses, methods, fields); - return new Class(name, typeParameters, innerClasses, methods, fields); + return new Enum(name, typeParameters, extendsTypes, implementsTypes, innerClasses, methods, fields); + return new Class(name, typeParameters, extendsTypes, implementsTypes, innerClasses, methods, fields); } private static List fieldsToFieldList(PsiField[] fields) { diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java index 0bd640e0868..90255375311 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -13,13 +13,17 @@ public class Class extends Node { String TYPE = "class"; final Identifier myName; final List myTypeParameters; + final List myExtendsTypes; + final List myImplementsTypes; final List myInnerClasses; final List myMethods; final List myFields; - public Class(Identifier name, List typeParameters, List innerClasses, List methods, List fields) { + public Class(Identifier name, List typeParameters, List extendsTypes, List implementsTypes, List innerClasses, List methods, List fields) { myName = name; myTypeParameters = typeParameters; + myExtendsTypes = extendsTypes; + myImplementsTypes = implementsTypes; myInnerClasses = innerClasses; myMethods = methods; myFields = fields; @@ -38,10 +42,20 @@ public class Class extends Node { return myTypeParameters.size() > 0 ? "<" + AstUtil.joinNodes(myTypeParameters, COMMA_WITH_SPACE) + ">" : EMPTY; } + String implementTypesToKotlin() { + List allTypes = new LinkedList() { + { + addAll(myExtendsTypes); + addAll(myImplementsTypes); + } + }; + return allTypes.size() == 0 ? EMPTY : SPACE + COLON + SPACE + AstUtil.joinNodes(allTypes, COMMA_WITH_SPACE); + } + @NotNull @Override public String toKotlin() { - return TYPE + SPACE + myName.toKotlin() + typeParametersToKotlin() + SPACE + "{" + N + + return TYPE + SPACE + myName.toKotlin() + typeParametersToKotlin() + implementTypesToKotlin() + SPACE + "{" + N + AstUtil.joinNodes(myFields, N) + N + AstUtil.joinNodes(methodsExceptConstructors(), N) + N + AstUtil.joinNodes(myInnerClasses, N) + N + diff --git a/src/org/jetbrains/jet/j2k/ast/Enum.java b/src/org/jetbrains/jet/j2k/ast/Enum.java index c2fe7466d54..dd6db4da722 100644 --- a/src/org/jetbrains/jet/j2k/ast/Enum.java +++ b/src/org/jetbrains/jet/j2k/ast/Enum.java @@ -10,8 +10,8 @@ import java.util.List; * @author ignatov */ public class Enum extends Class { - public Enum(Identifier name, List typeParameters, List innerClasses, List methods, List fields) { - super(name, typeParameters, innerClasses, methods, fields); + public Enum(Identifier name, List typeParameters, List extendsTypes, List implementsTypes, List innerClasses, List methods, List fields) { + super(name, typeParameters, extendsTypes, implementsTypes, innerClasses, methods, fields); } @Nullable @@ -33,7 +33,7 @@ public class Enum extends Class { @NotNull @Override public String toKotlin() { - return "enum" + SPACE + myName.toKotlin() + typeParametersToKotlin() + primaryConstructorToKotlin() + SPACE + "{" + N + + return "enum" + SPACE + myName.toKotlin() + typeParametersToKotlin() + primaryConstructorToKotlin() + implementTypesToKotlin() + SPACE + "{" + N + AstUtil.joinNodes(myFields, N) + N + AstUtil.joinNodes(methodsExceptConstructors(), N) + N + AstUtil.joinNodes(myInnerClasses, N) + N + diff --git a/src/org/jetbrains/jet/j2k/ast/Trait.java b/src/org/jetbrains/jet/j2k/ast/Trait.java index 4ae02ccf569..484f5dcbc93 100644 --- a/src/org/jetbrains/jet/j2k/ast/Trait.java +++ b/src/org/jetbrains/jet/j2k/ast/Trait.java @@ -6,8 +6,8 @@ import java.util.List; * @author ignatov */ public class Trait extends Class { - public Trait(Identifier name, List typeParameters, List innerClasses, List methods, List fields) { - super(name, typeParameters, innerClasses, methods, fields); + public Trait(Identifier name, List typeParameters, List extendsTypes, List implementsTypes, List innerClasses, List methods, List fields) { + super(name, typeParameters, extendsTypes, implementsTypes, innerClasses, methods, fields); TYPE = "trait"; } } diff --git a/test/org/jetbrains/jet/j2k/ast/ClassTest.java b/test/org/jetbrains/jet/j2k/ast/ClassTest.java index 17d78863d7e..61f49eae934 100644 --- a/test/org/jetbrains/jet/j2k/ast/ClassTest.java +++ b/test/org/jetbrains/jet/j2k/ast/ClassTest.java @@ -69,4 +69,25 @@ public class ClassTest extends JetTestCaseBase { "class Entry { }" ); } + + public void testSimpleInheritance() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin("final class A extends Base {}"), + "class A : Base { }" + ); + } + + public void testExtendsOneClassAndImplementsOneInterface() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin("final class A extends Base implements I {}"), + "class A : Base, I { }" + ); + } + + public void testExtendsOneClassAndImplementsSeveralInterfaces() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin("final class A extends Base implements I0, I1, I2 {}"), + "class A : Base, I0, I1, I2 { }" + ); + } } diff --git a/test/org/jetbrains/jet/j2k/ast/EnumTest.java b/test/org/jetbrains/jet/j2k/ast/EnumTest.java index ed53280a28f..a701ac1081f 100644 --- a/test/org/jetbrains/jet/j2k/ast/EnumTest.java +++ b/test/org/jetbrains/jet/j2k/ast/EnumTest.java @@ -77,6 +77,20 @@ public class EnumTest extends JetTestCaseBase { ); } + public void testEnumImplementsOneInterface() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin("enum A implements I {}"), + "enum A : I { }" + ); + } + + public void testEnumImplementsSeveralInterfaces() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin("enum A implements I0, I1, I2 {}"), + "enum A : I0, I1, I2 { }" + ); + } + // public void testTwoConstructors() throws Exception { // Assert.assertEquals( // classToKotlin( diff --git a/test/org/jetbrains/jet/j2k/ast/TraitTest.java b/test/org/jetbrains/jet/j2k/ast/TraitTest.java index f638681b49c..88191af26fe 100644 --- a/test/org/jetbrains/jet/j2k/ast/TraitTest.java +++ b/test/org/jetbrains/jet/j2k/ast/TraitTest.java @@ -42,4 +42,18 @@ public class TraitTest extends JetTestCaseBase { "}" ); } -} \ No newline at end of file + + public void testExtendsOneInterface() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin("interface A extends I {}"), + "trait A : I { }" + ); + } + + public void testExtendsOneClassAndImplementsSeveralInterfaces() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin("interface A extends I0, I1, I2 {}"), + "trait A : I0, I1, I2 { }" + ); + } +} From 341aed521eebf9c05dbae0f7ee152a73ecf977a7 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 2 Nov 2011 12:35:05 +0400 Subject: [PATCH 031/206] varagrs supported --- src/org/jetbrains/jet/j2k/Converter.java | 2 +- src/org/jetbrains/jet/j2k/ast/EmptyType.java | 14 --------- src/org/jetbrains/jet/j2k/ast/INode.java | 2 +- src/org/jetbrains/jet/j2k/ast/Parameter.java | 3 +- src/org/jetbrains/jet/j2k/ast/Type.java | 12 +++++++ src/org/jetbrains/jet/j2k/ast/VarArg.java | 31 +++++++++++++++++++ .../jet/j2k/visitors/TypeVisitor.java | 6 ++-- .../org/jetbrains/jet/j2k/ast/VarArgTest.java | 23 ++++++++++++++ 8 files changed, 74 insertions(+), 19 deletions(-) delete mode 100644 src/org/jetbrains/jet/j2k/ast/EmptyType.java create mode 100644 src/org/jetbrains/jet/j2k/ast/VarArg.java create mode 100644 test/org/jetbrains/jet/j2k/ast/VarArgTest.java diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 4d2e986fa80..7ec847bc90d 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -182,7 +182,7 @@ public class Converter { @NotNull public static Type typeToType(@Nullable PsiType type) { if (type == null) - return new EmptyType(); // TODO + return Type.EMPTY_TYPE; // TODO TypeVisitor typeVisitor = new TypeVisitor(); type.accept(typeVisitor); return typeVisitor.getResult(); diff --git a/src/org/jetbrains/jet/j2k/ast/EmptyType.java b/src/org/jetbrains/jet/j2k/ast/EmptyType.java deleted file mode 100644 index 8bd6add7ec1..00000000000 --- a/src/org/jetbrains/jet/j2k/ast/EmptyType.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import org.jetbrains.annotations.NotNull; - -/** - * @author ignatov - */ -public class EmptyType extends Type { - @NotNull - @Override - public String toKotlin() { - return "UNRESOLVED_TYPE"; - } -} diff --git a/src/org/jetbrains/jet/j2k/ast/INode.java b/src/org/jetbrains/jet/j2k/ast/INode.java index 3a861da7f37..e0f8323f77f 100644 --- a/src/org/jetbrains/jet/j2k/ast/INode.java +++ b/src/org/jetbrains/jet/j2k/ast/INode.java @@ -13,6 +13,6 @@ public interface INode { public Kind getKind(); public enum Kind { - UNDEFINED, TYPE, CONSTRUCTOR, BREAK, CONTINUE, + UNDEFINED, TYPE, CONSTRUCTOR, BREAK, CONTINUE, VARARG, } } diff --git a/src/org/jetbrains/jet/j2k/ast/Parameter.java b/src/org/jetbrains/jet/j2k/ast/Parameter.java index 625b78e7351..7dfa86eaed1 100644 --- a/src/org/jetbrains/jet/j2k/ast/Parameter.java +++ b/src/org/jetbrains/jet/j2k/ast/Parameter.java @@ -17,6 +17,7 @@ public class Parameter extends Expression { @NotNull @Override public String toKotlin() { - return myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin(); + String vararg = myType.getKind() == Kind.VARARG ? "vararg" + SPACE : EMPTY; + return vararg + myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin(); } } diff --git a/src/org/jetbrains/jet/j2k/ast/Type.java b/src/org/jetbrains/jet/j2k/ast/Type.java index 0665cc606da..b8d93d52fe7 100644 --- a/src/org/jetbrains/jet/j2k/ast/Type.java +++ b/src/org/jetbrains/jet/j2k/ast/Type.java @@ -6,6 +6,7 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public abstract class Type extends Element { + public static Type EMPTY_TYPE = new EmptyType(); protected boolean myNullable = true; @NotNull @@ -25,4 +26,15 @@ public abstract class Type extends Element { protected String isNullableStr() { return isNullable() ? QUESTION : EMPTY; } + + /** + * @author ignatov + */ + private static class EmptyType extends Type { + @NotNull + @Override + public String toKotlin() { + return "UNRESOLVED_TYPE"; + } + } } diff --git a/src/org/jetbrains/jet/j2k/ast/VarArg.java b/src/org/jetbrains/jet/j2k/ast/VarArg.java new file mode 100644 index 00000000000..2685b24556e --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/VarArg.java @@ -0,0 +1,31 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class VarArg extends Type { + private Type myType; + + public VarArg(Type type) { + myType = type; + } + + @NotNull + public Type getType() { + return myType; + } + + @NotNull + @Override + public Kind getKind() { + return Kind.VARARG; + } + + @NotNull + @Override + public String toKotlin() { + return myType.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java index ba0508424a4..9a96d88671b 100644 --- a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java @@ -12,7 +12,7 @@ import static org.jetbrains.jet.j2k.Converter.typesToTypeList; * @author ignatov */ public class TypeVisitor extends PsiTypeVisitor implements Visitor { - private Type myResult = new EmptyType(); + private Type myResult = Type.EMPTY_TYPE; @NotNull public Type getResult() { @@ -40,7 +40,8 @@ public class TypeVisitor extends PsiTypeVisitor implements Visitor { @Override public Type visitArrayType(PsiArrayType arrayType) { - myResult = new ArrayType(typeToType(arrayType.getComponentType())); + if (myResult == Type.EMPTY_TYPE) + myResult = new ArrayType(typeToType(arrayType.getComponentType())); return super.visitArrayType(arrayType); } @@ -71,6 +72,7 @@ public class TypeVisitor extends PsiTypeVisitor implements Visitor { @Override public Type visitEllipsisType(PsiEllipsisType ellipsisType) { + myResult = new VarArg(typeToType(ellipsisType.getComponentType())); return super.visitEllipsisType(ellipsisType); } diff --git a/test/org/jetbrains/jet/j2k/ast/VarArgTest.java b/test/org/jetbrains/jet/j2k/ast/VarArgTest.java new file mode 100644 index 00000000000..a54c4a78abf --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/VarArgTest.java @@ -0,0 +1,23 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class VarArgTest extends JetTestCaseBase { + public void testEllipsisTypeSingleParams() throws Exception { + Assert.assertEquals( + methodToSingleLineKotlin("void pushAll(Object... objs) {}"), + "fun pushAll(vararg objs : Object?) : Unit { }" + ); + } + + public void testEllipsisTypeSeveralParams() throws Exception { + Assert.assertEquals( + methodToSingleLineKotlin("String format(String pattern, Object... arguments);"), + "fun format(pattern : String?, vararg arguments : Object?) : String?" + ); + } +} From 5d120e800f04d9f4925722e5450f8c961a1ceb95 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 2 Nov 2011 13:46:39 +0400 Subject: [PATCH 032/206] where statement for type parameters supported in functions declaration --- src/org/jetbrains/jet/j2k/ast/Function.java | 23 ++++++++++++++++++- .../jetbrains/jet/j2k/ast/TypeParameter.java | 20 +++++++++++++++- .../jet/j2k/visitors/ElementVisitor.java | 3 ++- .../jet/j2k/visitors/TypeVisitor.java | 2 ++ .../jet/j2k/ast/TypeParametersTest.java | 15 ++++++++++++ 5 files changed, 60 insertions(+), 3 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/ast/Function.java b/src/org/jetbrains/jet/j2k/ast/Function.java index d9aaac3e45c..93912cdf6f5 100644 --- a/src/org/jetbrains/jet/j2k/ast/Function.java +++ b/src/org/jetbrains/jet/j2k/ast/Function.java @@ -3,6 +3,7 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.j2k.util.AstUtil; +import java.util.LinkedList; import java.util.List; /** @@ -27,10 +28,30 @@ public class Function extends Node { return myTypeParameters.size() > 0 ? "<" + AstUtil.joinNodes(myTypeParameters, COMMA_WITH_SPACE) + ">" : EMPTY; } + private boolean hasWhere() { + for (Element t : myTypeParameters) + if (t instanceof TypeParameter && ((TypeParameter)t).hasWhere()) + return true; + return false; + } + + String typeParameterWhereToKotlin() { + if (hasWhere()) { + List wheres = new LinkedList(); + for (Element t : myTypeParameters) + if (t instanceof TypeParameter) + wheres.add(((TypeParameter)t).getWhereToKotlin()); + return SPACE + "where" + SPACE + AstUtil.join(wheres, COMMA_WITH_SPACE) + SPACE; + } + return EMPTY; + } + @NotNull @Override public String toKotlin() { return "fun" + SPACE + myName.toKotlin() + typeParametersToKotlin() + "(" + myParams.toKotlin() + ")" + SPACE + COLON + - SPACE + myType.toKotlin() + SPACE + myBlock.toKotlin(); + SPACE + myType.toKotlin() + SPACE + + typeParameterWhereToKotlin() + + myBlock.toKotlin(); } } diff --git a/src/org/jetbrains/jet/j2k/ast/TypeParameter.java b/src/org/jetbrains/jet/j2k/ast/TypeParameter.java index e38515be010..6e67cba5b25 100644 --- a/src/org/jetbrains/jet/j2k/ast/TypeParameter.java +++ b/src/org/jetbrains/jet/j2k/ast/TypeParameter.java @@ -1,20 +1,38 @@ 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 TypeParameter extends Element { private Identifier myName; + private List myExtendsTypes; - public TypeParameter(Identifier name) { + public TypeParameter(Identifier name, List extendsTypes) { myName = name; + myExtendsTypes = extendsTypes; + } + + public boolean hasWhere() { + return myExtendsTypes.size() > 1; + } + + @NotNull + public String getWhereToKotlin() { + if (hasWhere()) + return myName.toKotlin() + SPACE + COLON + SPACE + myExtendsTypes.get(1).toKotlin(); + return EMPTY; } @NotNull @Override public String toKotlin() { + if (myExtendsTypes.size() > 0) + return myName.toKotlin() + SPACE + COLON + SPACE + myExtendsTypes.get(0).toKotlin(); return myName.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 a90fcc8ea1e..51816c245a3 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java @@ -48,7 +48,8 @@ public class ElementVisitor extends JavaElementVisitor implements Visitor { public void visitTypeParameter(PsiTypeParameter classParameter) { super.visitTypeParameter(classParameter); myResult = new TypeParameter( - new IdentifierImpl(classParameter.getName()) + new IdentifierImpl(classParameter.getName()), // TODO + typesToTypeList(classParameter.getExtendsListTypes()) ); } diff --git a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java index 9a96d88671b..b1e3c62d81b 100644 --- a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java @@ -22,6 +22,8 @@ public class TypeVisitor extends PsiTypeVisitor implements Visitor { @Override public Type visitType(PsiType type) { System.out.println(type.getClass()); // TODO: remove + if (type instanceof PsiIntersectionType) + System.out.println("&"); return super.visitType(type); } diff --git a/test/org/jetbrains/jet/j2k/ast/TypeParametersTest.java b/test/org/jetbrains/jet/j2k/ast/TypeParametersTest.java index 085cd875f07..56576185a51 100644 --- a/test/org/jetbrains/jet/j2k/ast/TypeParametersTest.java +++ b/test/org/jetbrains/jet/j2k/ast/TypeParametersTest.java @@ -21,4 +21,19 @@ public class TypeParametersTest extends JetTestCaseBase { ); } + public void testWhere() throws Exception { + Assert.assertEquals( + methodToSingleLineKotlin( + "> T max(Collection coll) {}"), + "fun max(coll : Collection?) : T? where T : Comparable? { }" + ); + } + + public void testMethodDoubleParametrizationWithTwoBounds() throws Exception { + Assert.assertEquals( + methodToSingleLineKotlin( + ", K extends Node & Collection> T max(Collection coll) {}"), + "fun max(coll : Collection?) : T? where T : Comparable?, K : Collection? { }" + ); + } } From 2e6a65c0cda462dbee48c6387e6d5311f07c1b1b Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 2 Nov 2011 14:06:48 +0400 Subject: [PATCH 033/206] where statement for type parameters supported in class and trait declaration --- src/org/jetbrains/jet/j2k/ast/Class.java | 23 +++++++- .../jet/j2k/ast/TypeParametersTest.java | 52 +++++++++++++++++++ 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java index 90255375311..e36156529a3 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -29,6 +29,24 @@ public class Class extends Node { myFields = fields; } + private boolean hasWhere() { + for (Element t : myTypeParameters) + if (t instanceof TypeParameter && ((TypeParameter)t).hasWhere()) + return true; + return false; + } + + String typeParameterWhereToKotlin() { + if (hasWhere()) { + List wheres = new LinkedList(); + for (Element t : myTypeParameters) + if (t instanceof TypeParameter) + wheres.add(((TypeParameter)t).getWhereToKotlin()); + return SPACE + "where" + SPACE + AstUtil.join(wheres, COMMA_WITH_SPACE) + SPACE; + } + return EMPTY; + } + @NotNull List methodsExceptConstructors() { final LinkedList result = new LinkedList(); @@ -55,7 +73,10 @@ public class Class extends Node { @NotNull @Override public String toKotlin() { - return TYPE + SPACE + myName.toKotlin() + typeParametersToKotlin() + implementTypesToKotlin() + SPACE + "{" + N + + return TYPE + SPACE + myName.toKotlin() + typeParametersToKotlin() + + implementTypesToKotlin() + + typeParameterWhereToKotlin() + + SPACE + "{" + N + AstUtil.joinNodes(myFields, N) + N + AstUtil.joinNodes(methodsExceptConstructors(), N) + N + AstUtil.joinNodes(myInnerClasses, N) + N + diff --git a/test/org/jetbrains/jet/j2k/ast/TypeParametersTest.java b/test/org/jetbrains/jet/j2k/ast/TypeParametersTest.java index 56576185a51..1473dd6213e 100644 --- a/test/org/jetbrains/jet/j2k/ast/TypeParametersTest.java +++ b/test/org/jetbrains/jet/j2k/ast/TypeParametersTest.java @@ -36,4 +36,56 @@ public class TypeParametersTest extends JetTestCaseBase { "fun max(coll : Collection?) : T? where T : Comparable?, K : Collection? { }" ); } + + public void testClassDoubleParametrizationWithTwoBoundsWithExtending() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin("final class CC , K extends Node & Collection> extends A {}"), + "class CC : A where T : Comparable?, K : Collection? { }" + ); + } + + public void testTraitDoubleParametrizationWithTwoBoundsWithExtending() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin( + "interface I , K extends Node & Collection> extends II {}"), + "trait I : II where T : Comparable?, K : Collection? { }" + ); + } + + public void testGenericClass() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin("final class Comparable {}"), + "class Comparable { }" + ); + } + + public void testComplexExampleWithClassExtending() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin( + "interface CommandHandler {}"), + "trait CommandHandler { }" + ); + } + + public void testClassParametrizationWithTwoBounds() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin("final class C> {}"), + "class C where T : Comparable? { }" + ); + } + + public void testClassParametrizationWithTwoBoundsWithExtending() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin("final class C> extends A {}"), + "class C : A where T : Comparable? { }" + ); + } + + public void testComplexExampleWithClassMultiplyExtending() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin( + "interface CommandHandler {}"), + "trait CommandHandler { }" + ); + } } From a54d55e5df4234ec2850412ff293554f9c08751c Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 2 Nov 2011 14:18:49 +0400 Subject: [PATCH 034/206] cleanup --- src/org/jetbrains/jet/j2k/Converter.java | 2 +- src/org/jetbrains/jet/j2k/ast/Class.java | 12 ++++++------ src/org/jetbrains/jet/j2k/ast/ClassType.java | 2 +- src/org/jetbrains/jet/j2k/ast/ExpressionList.java | 3 +-- src/org/jetbrains/jet/j2k/ast/Function.java | 8 ++++---- src/org/jetbrains/jet/j2k/ast/Node.java | 5 ++--- src/org/jetbrains/jet/j2k/ast/Type.java | 10 +++++----- src/org/jetbrains/jet/j2k/ast/TypeParameter.java | 5 ++--- src/org/jetbrains/jet/j2k/ast/VarArg.java | 7 +------ 9 files changed, 23 insertions(+), 31 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 7ec847bc90d..f96063b2495 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -198,7 +198,7 @@ public class Converter { } @NotNull - public static List typesToNotNullableTypeList(PsiType[] types) { + private static List typesToNotNullableTypeList(PsiType[] types) { List result = new LinkedList(typesToTypeList(types)); for (Type p : result) p.setNullable(false); diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java index e36156529a3..24f7fc63bd5 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -12,9 +12,9 @@ import java.util.List; public class Class extends Node { String TYPE = "class"; final Identifier myName; - final List myTypeParameters; - final List myExtendsTypes; - final List myImplementsTypes; + private final List myTypeParameters; + private final List myExtendsTypes; + private final List myImplementsTypes; final List myInnerClasses; final List myMethods; final List myFields; @@ -31,17 +31,17 @@ public class Class extends Node { private boolean hasWhere() { for (Element t : myTypeParameters) - if (t instanceof TypeParameter && ((TypeParameter)t).hasWhere()) + if (t instanceof TypeParameter && ((TypeParameter) t).hasWhere()) return true; return false; } String typeParameterWhereToKotlin() { if (hasWhere()) { - List wheres = new LinkedList(); + List wheres = new LinkedList(); for (Element t : myTypeParameters) if (t instanceof TypeParameter) - wheres.add(((TypeParameter)t).getWhereToKotlin()); + wheres.add(((TypeParameter) t).getWhereToKotlin()); return SPACE + "where" + SPACE + AstUtil.join(wheres, COMMA_WITH_SPACE) + SPACE; } return EMPTY; diff --git a/src/org/jetbrains/jet/j2k/ast/ClassType.java b/src/org/jetbrains/jet/j2k/ast/ClassType.java index bb0cdebe4b2..5ab9205c7f1 100644 --- a/src/org/jetbrains/jet/j2k/ast/ClassType.java +++ b/src/org/jetbrains/jet/j2k/ast/ClassType.java @@ -10,7 +10,7 @@ import java.util.List; */ public class ClassType extends Type { private final Identifier myType; - private List myParameters; + private final List myParameters; public ClassType(Identifier type, List parameters) { myType = type; diff --git a/src/org/jetbrains/jet/j2k/ast/ExpressionList.java b/src/org/jetbrains/jet/j2k/ast/ExpressionList.java index e8f1d48d6e1..dd9aaca0ce4 100644 --- a/src/org/jetbrains/jet/j2k/ast/ExpressionList.java +++ b/src/org/jetbrains/jet/j2k/ast/ExpressionList.java @@ -10,11 +10,10 @@ import java.util.List; */ public class ExpressionList extends Expression { private final List myExpressions; - private List myTypes; // TODO: add types to toKotlin public ExpressionList(List expressions, List types) { myExpressions = expressions; - myTypes = types; + List types1 = types; } public ExpressionList(List expressions) { diff --git a/src/org/jetbrains/jet/j2k/ast/Function.java b/src/org/jetbrains/jet/j2k/ast/Function.java index 93912cdf6f5..9f9cf72de4f 100644 --- a/src/org/jetbrains/jet/j2k/ast/Function.java +++ b/src/org/jetbrains/jet/j2k/ast/Function.java @@ -12,7 +12,7 @@ import java.util.List; public class Function extends Node { private final Identifier myName; private final Type myType; - private List myTypeParameters; + private final List myTypeParameters; final Element myParams; private final Block myBlock; @@ -30,17 +30,17 @@ public class Function extends Node { private boolean hasWhere() { for (Element t : myTypeParameters) - if (t instanceof TypeParameter && ((TypeParameter)t).hasWhere()) + if (t instanceof TypeParameter && ((TypeParameter) t).hasWhere()) return true; return false; } String typeParameterWhereToKotlin() { if (hasWhere()) { - List wheres = new LinkedList(); + List wheres = new LinkedList(); for (Element t : myTypeParameters) if (t instanceof TypeParameter) - wheres.add(((TypeParameter)t).getWhereToKotlin()); + wheres.add(((TypeParameter) t).getWhereToKotlin()); return SPACE + "where" + SPACE + AstUtil.join(wheres, COMMA_WITH_SPACE) + SPACE; } return EMPTY; diff --git a/src/org/jetbrains/jet/j2k/ast/Node.java b/src/org/jetbrains/jet/j2k/ast/Node.java index af64555154d..954a77ba3b8 100644 --- a/src/org/jetbrains/jet/j2k/ast/Node.java +++ b/src/org/jetbrains/jet/j2k/ast/Node.java @@ -10,8 +10,6 @@ import java.util.Set; * @author ignatov */ public abstract class Node implements INode { - public static final String STAR = "*"; - @NotNull @Override public Kind getKind() { @@ -39,6 +37,7 @@ public abstract class Node implements INode { static final String IN = "in"; static final String AT = "@"; static final String BACKTICK = "`"; - static final String QUESTION = "?"; + static final String QUEST = "?"; static final String COMMA_WITH_SPACE = "," + SPACE; + static final String STAR = "*"; } diff --git a/src/org/jetbrains/jet/j2k/ast/Type.java b/src/org/jetbrains/jet/j2k/ast/Type.java index b8d93d52fe7..fa6160c5bb3 100644 --- a/src/org/jetbrains/jet/j2k/ast/Type.java +++ b/src/org/jetbrains/jet/j2k/ast/Type.java @@ -6,8 +6,8 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public abstract class Type extends Element { - public static Type EMPTY_TYPE = new EmptyType(); - protected boolean myNullable = true; + public static final Type EMPTY_TYPE = new EmptyType(); + private boolean myNullable = true; @NotNull @Override @@ -19,12 +19,12 @@ public abstract class Type extends Element { myNullable = nullable; } - public boolean isNullable() { + boolean isNullable() { return myNullable; } - protected String isNullableStr() { - return isNullable() ? QUESTION : EMPTY; + String isNullableStr() { + return isNullable() ? QUEST : EMPTY; } /** diff --git a/src/org/jetbrains/jet/j2k/ast/TypeParameter.java b/src/org/jetbrains/jet/j2k/ast/TypeParameter.java index 6e67cba5b25..9e9b07c2ad2 100644 --- a/src/org/jetbrains/jet/j2k/ast/TypeParameter.java +++ b/src/org/jetbrains/jet/j2k/ast/TypeParameter.java @@ -1,7 +1,6 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.j2k.util.AstUtil; import java.util.List; @@ -9,8 +8,8 @@ import java.util.List; * @author ignatov */ public class TypeParameter extends Element { - private Identifier myName; - private List myExtendsTypes; + private final Identifier myName; + private final List myExtendsTypes; public TypeParameter(Identifier name, List extendsTypes) { myName = name; diff --git a/src/org/jetbrains/jet/j2k/ast/VarArg.java b/src/org/jetbrains/jet/j2k/ast/VarArg.java index 2685b24556e..8ddbc697a2d 100644 --- a/src/org/jetbrains/jet/j2k/ast/VarArg.java +++ b/src/org/jetbrains/jet/j2k/ast/VarArg.java @@ -6,17 +6,12 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public class VarArg extends Type { - private Type myType; + private final Type myType; public VarArg(Type type) { myType = type; } - @NotNull - public Type getType() { - return myType; - } - @NotNull @Override public Kind getKind() { From a0339c8c340c52c194f5df414301e198fad9162a Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 2 Nov 2011 15:33:45 +0400 Subject: [PATCH 035/206] array creation supported more correctly --- src/org/jetbrains/jet/j2k/Converter.java | 2 ++ src/org/jetbrains/jet/j2k/ast/Element.java | 14 +++++++++++++ .../jetbrains/jet/j2k/ast/EmptyElement.java | 14 ------------- .../jet/j2k/visitors/ElementVisitor.java | 2 +- .../jet/j2k/visitors/ExpressionVisitor.java | 13 ++++++++++-- .../jetbrains/jet/j2k/ast/ArrayTypeTest.java | 21 +++++++++++++++++++ 6 files changed, 49 insertions(+), 17 deletions(-) delete mode 100644 src/org/jetbrains/jet/j2k/ast/EmptyElement.java diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index f96063b2495..55fe455bdfa 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -164,6 +164,8 @@ public class Converter { @NotNull public static Element elementToElement(PsiElement e) { + if (e == null) + return Element.EMPTY_ELEMENT; final ElementVisitor elementVisitor = new ElementVisitor(); e.accept(elementVisitor); System.out.println(e.getClass()); diff --git a/src/org/jetbrains/jet/j2k/ast/Element.java b/src/org/jetbrains/jet/j2k/ast/Element.java index 013d70f05b4..5675438b63b 100644 --- a/src/org/jetbrains/jet/j2k/ast/Element.java +++ b/src/org/jetbrains/jet/j2k/ast/Element.java @@ -1,7 +1,21 @@ package org.jetbrains.jet.j2k.ast; +import org.jetbrains.annotations.NotNull; + /** * @author ignatov */ public abstract class Element extends Node { + public static Element EMPTY_ELEMENT = new EmptyElement(); + + /** + * @author ignatov + */ + private static class EmptyElement extends Element { + @NotNull + @Override + public String toKotlin() { + return EMPTY; + } + } } diff --git a/src/org/jetbrains/jet/j2k/ast/EmptyElement.java b/src/org/jetbrains/jet/j2k/ast/EmptyElement.java deleted file mode 100644 index 2b68afe22f9..00000000000 --- a/src/org/jetbrains/jet/j2k/ast/EmptyElement.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import org.jetbrains.annotations.NotNull; - -/** - * @author ignatov - */ -public class EmptyElement extends Element { - @NotNull - @Override - public String toKotlin() { - return EMPTY; - } -} diff --git a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java index 51816c245a3..16918a38527 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java @@ -11,7 +11,7 @@ import static org.jetbrains.jet.j2k.Converter.*; * @author ignatov */ public class ElementVisitor extends JavaElementVisitor implements Visitor { - private Element myResult = new EmptyElement(); + private Element myResult = Element.EMPTY_ELEMENT; @NotNull @Override diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 5262efacdc8..13fc4e8a84c 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -6,6 +6,8 @@ import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.j2k.ast.*; +import java.util.List; + import static org.jetbrains.jet.j2k.Converter.*; /** @@ -171,13 +173,20 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { if (expression.getArrayInitializer() != null) // new Foo[] {} myResult = expressionToExpression(expression.getArrayInitializer()); - else { + else if (expression.getArrayDimensions().length > 0) { // new Foo[5] + final List callExpression = expressionsToExpressionList(expression.getArrayDimensions()); + callExpression.add(new IdentifierImpl("{null}")); // TODO: remove + + myResult = new NewClassExpression( + typeToType(expression.getType()), // TODO: remove + new ExpressionList(callExpression) + ); + } else { myResult = new NewClassExpression( elementToElement(expression.getClassOrAnonymousClassReference()), elementToElement(expression.getArgumentList()) ); } - } @Override diff --git a/test/org/jetbrains/jet/j2k/ast/ArrayTypeTest.java b/test/org/jetbrains/jet/j2k/ast/ArrayTypeTest.java index eed80e25e26..04b50fe1dc9 100644 --- a/test/org/jetbrains/jet/j2k/ast/ArrayTypeTest.java +++ b/test/org/jetbrains/jet/j2k/ast/ArrayTypeTest.java @@ -41,4 +41,25 @@ public class ArrayTypeTest extends JetTestCaseBase { "fun fromArrayToCollection(a : Array?) : Unit { }" ); } + + public void testArrayInitializationStatement() throws Exception { + Assert.assertEquals( + statementToSingleLineKotlin("int [][] d2 = new int[][]{};"), + "var d2 : Array? = array()" // more precisely: "var d2 : Array? = array()" + ); + } + + public void testArrayInitializationStatementWithDimension() throws Exception { + Assert.assertEquals( + statementToSingleLineKotlin("int [][] d2 = new int[5][];"), + "var d2 : Array? = Array?(5, {null})" // another variant: "var d2 : Array? = array(5, {null, null, null, null, null})" + ); + } + +// public void testArrayInitializationStatementWithThreeDimension() throws Exception { +// Assert.assertEquals( +// statementToSingleLineKotlin("int[][][] d3= new int[5][5][5];"), +// "var d3 : Array?>? = Array?>?()" +// ); +// } } From f73923e4d3200fe80861aab502b66e4f8a52fcf6 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 2 Nov 2011 17:45:51 +0400 Subject: [PATCH 036/206] statement with final modifier converted to val --- .../jet/j2k/ast/DeclarationStatement.java | 14 ++++++++---- .../jetbrains/jet/j2k/ast/LocalVariable.java | 10 ++++++++- src/org/jetbrains/jet/j2k/ast/Modifier.java | 14 ++++++++++++ .../jet/j2k/visitors/ElementVisitor.java | 13 +++++++++++ .../jet/j2k/visitors/StatementVisitor.java | 5 ++--- .../jet/j2k/ast/DeclarationStatementTest.java | 22 +++++++++++++++++++ 6 files changed, 70 insertions(+), 8 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/Modifier.java diff --git a/src/org/jetbrains/jet/j2k/ast/DeclarationStatement.java b/src/org/jetbrains/jet/j2k/ast/DeclarationStatement.java index 75fdbb04621..d38956881da 100644 --- a/src/org/jetbrains/jet/j2k/ast/DeclarationStatement.java +++ b/src/org/jetbrains/jet/j2k/ast/DeclarationStatement.java @@ -18,10 +18,16 @@ public class DeclarationStatement extends Statement { private List toStringList(List elements) { List result = new LinkedList(); - for (String n : AstUtil.nodesToKotlin(elements)) - result.add( - "var" + SPACE + n - ); + for (Element e : elements) { + if (e instanceof LocalVariable) { + LocalVariable v = (LocalVariable) e; + + final String varKeyword = v.hasModifier(Modifier.FINAL) ? "val" : "var"; + result.add( + varKeyword + SPACE + e.toKotlin() + ); + } + } return result; } diff --git a/src/org/jetbrains/jet/j2k/ast/LocalVariable.java b/src/org/jetbrains/jet/j2k/ast/LocalVariable.java index 8c66ab2ec01..84b0516b92d 100644 --- a/src/org/jetbrains/jet/j2k/ast/LocalVariable.java +++ b/src/org/jetbrains/jet/j2k/ast/LocalVariable.java @@ -2,20 +2,28 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; +import java.util.HashSet; + /** * @author ignatov */ public class LocalVariable extends Expression { private final Identifier myIdentifier; + private HashSet myModifiersSet; private final Type myType; private final Expression myInitializer; - public LocalVariable(Identifier identifier, Type type, Expression initializer) { + public LocalVariable(Identifier identifier, HashSet modifiersSet, Type type, Expression initializer) { myIdentifier = identifier; + myModifiersSet = modifiersSet; myType = type; myInitializer = initializer; } + public boolean hasModifier(String modifier) { + return myModifiersSet.contains(modifier); + } + @NotNull @Override public String toKotlin() { diff --git a/src/org/jetbrains/jet/j2k/ast/Modifier.java b/src/org/jetbrains/jet/j2k/ast/Modifier.java new file mode 100644 index 00000000000..e71b5707139 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/Modifier.java @@ -0,0 +1,14 @@ +package org.jetbrains.jet.j2k.ast; + +/** + * @author ignatov + */ +public abstract class Modifier { + public static String PUBLIC = "public"; + public static String PROTECTED = "protected"; + public static String PRIVATE = "private"; + public static String INTERNAL = "internal"; + public static String STATIC = "static"; + public static String ABSTRACT = "abstract"; + public static String FINAL = "final"; +} diff --git a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java index 16918a38527..2f42cbb278f 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java @@ -4,6 +4,9 @@ import com.intellij.psi.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.j2k.Converter; import org.jetbrains.jet.j2k.ast.*; +import org.jetbrains.jet.j2k.ast.Modifier; + +import java.util.HashSet; import static org.jetbrains.jet.j2k.Converter.*; @@ -22,8 +25,18 @@ public class ElementVisitor extends JavaElementVisitor implements Visitor { @Override public void visitLocalVariable(PsiLocalVariable variable) { super.visitLocalVariable(variable); + final PsiModifierList modifierList = variable.getModifierList(); + + HashSet modifiersSet = new HashSet(); + + if (modifierList != null) { + if (modifierList.hasModifierProperty("final")) + modifiersSet.add(Modifier.FINAL); + } + myResult = new LocalVariable( new IdentifierImpl(variable.getName()), // TODO + modifiersSet, typeToType(variable.getType()), expressionToExpression(variable.getInitializer()) ); diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index b1b857ab91f..71dad3c7bc2 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -2,7 +2,6 @@ package org.jetbrains.jet.j2k.visitors; import com.intellij.psi.*; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.j2k.Converter; import org.jetbrains.jet.j2k.ast.*; import java.util.Arrays; @@ -36,7 +35,7 @@ public class StatementVisitor extends ElementVisitor implements Visitor { public void visitBlockStatement(PsiBlockStatement statement) { super.visitBlockStatement(statement); myResult = new Block( - Converter.statementsToStatementList(statement.getCodeBlock().getStatements()), + statementsToStatementList(statement.getCodeBlock().getStatements()), true ); } @@ -67,7 +66,7 @@ public class StatementVisitor extends ElementVisitor implements Visitor { public void visitDeclarationStatement(PsiDeclarationStatement statement) { super.visitDeclarationStatement(statement); myResult = new DeclarationStatement( - Converter.elementsToElementList(statement.getDeclaredElements()) + elementsToElementList(statement.getDeclaredElements()) ); } diff --git a/test/org/jetbrains/jet/j2k/ast/DeclarationStatementTest.java b/test/org/jetbrains/jet/j2k/ast/DeclarationStatementTest.java index f544399cf27..7ab8993a242 100644 --- a/test/org/jetbrains/jet/j2k/ast/DeclarationStatementTest.java +++ b/test/org/jetbrains/jet/j2k/ast/DeclarationStatementTest.java @@ -30,4 +30,26 @@ public class DeclarationStatementTest extends JetTestCaseBase { ); } + public void testSingleFinalStringDeclaration() throws Exception { + Assert.assertEquals( + statementToSingleLineKotlin("final String s;"), + "val s : String?" + ); + } + + public void testSingleFinalIntDeclaration() throws Exception { + Assert.assertEquals( + statementToSingleLineKotlin("final int s;"), + "val s : Int" + ); + } + + public void testMultiplyFinalIntDeclaration() throws Exception { + Assert.assertEquals( + statementToKotlin("final int k, l, m;"), + "val k : Int\n" + + "val l : Int\n" + + "val m : Int" + ); + } } From bbd282e57b22098f6a371f4ed835e1a2af679f49 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 2 Nov 2011 18:27:02 +0400 Subject: [PATCH 037/206] fields with final modifier converted to val --- src/org/jetbrains/jet/j2k/Converter.java | 13 ++++++++ .../jetbrains/jet/j2k/ast/EnumConstant.java | 6 ++-- src/org/jetbrains/jet/j2k/ast/Field.java | 8 +++-- .../jet/j2k/visitors/ElementVisitor.java | 11 +------ test/org/jetbrains/jet/j2k/ast/FieldTest.java | 30 +++++++++++++++++++ 5 files changed, 54 insertions(+), 14 deletions(-) create mode 100644 test/org/jetbrains/jet/j2k/ast/FieldTest.java diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 55fe455bdfa..e6dea079b6a 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -6,11 +6,13 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.j2k.ast.*; import org.jetbrains.jet.j2k.ast.Class; import org.jetbrains.jet.j2k.ast.Enum; +import org.jetbrains.jet.j2k.ast.Modifier; import org.jetbrains.jet.j2k.visitors.ElementVisitor; import org.jetbrains.jet.j2k.visitors.ExpressionVisitor; import org.jetbrains.jet.j2k.visitors.StatementVisitor; import org.jetbrains.jet.j2k.visitors.TypeVisitor; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; @@ -65,14 +67,17 @@ public class Converter { } private static Field fieldToField(PsiField field) { + HashSet modifiers = getModifiersSet(field.getModifierList()); if (field instanceof PsiEnumConstant) // TODO: remove instanceof return new EnumConstant( new IdentifierImpl(field.getName()), // TODO + modifiers, typeToType(field.getType()), elementToElement(((PsiEnumConstant) field).getArgumentList()) ); return new Field( new IdentifierImpl(field.getName()), // TODO + modifiers, typeToType(field.getType()), expressionToExpression(field.getInitializer()) // TODO: add modifiers ); @@ -253,4 +258,12 @@ public class Converter { return Identifier.EMPTY_IDENTIFIER; return new IdentifierImpl(identifier.getText()); } + + public static HashSet getModifiersSet(PsiModifierList modifierList) { + HashSet modifiersSet = new HashSet(); + if (modifierList != null) { + if (modifierList.hasModifierProperty("final")) modifiersSet.add(Modifier.FINAL); + } + return modifiersSet; + } } diff --git a/src/org/jetbrains/jet/j2k/ast/EnumConstant.java b/src/org/jetbrains/jet/j2k/ast/EnumConstant.java index 59dea9f914e..489bfc390cf 100644 --- a/src/org/jetbrains/jet/j2k/ast/EnumConstant.java +++ b/src/org/jetbrains/jet/j2k/ast/EnumConstant.java @@ -2,12 +2,14 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; +import java.util.HashSet; + /** * @author ignatov */ public class EnumConstant extends Field { - public EnumConstant(Identifier identifier, Type type, Element params) { - super(identifier, type, params); + public EnumConstant(Identifier identifier, HashSet modifiers, Type type, Element params) { + super(identifier, modifiers, type, params); } @NotNull diff --git a/src/org/jetbrains/jet/j2k/ast/Field.java b/src/org/jetbrains/jet/j2k/ast/Field.java index c15a01e4cee..dca82068988 100644 --- a/src/org/jetbrains/jet/j2k/ast/Field.java +++ b/src/org/jetbrains/jet/j2k/ast/Field.java @@ -2,16 +2,20 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; +import java.util.HashSet; + /** * @author ignatov */ public class Field extends Node { final Identifier myIdentifier; + private HashSet myModifiers; private final Type myType; final Element myInitializer; - public Field(Identifier identifier, Type type, Element initializer) { + public Field(Identifier identifier, HashSet modifiers, Type type, Element initializer) { myIdentifier = identifier; + myModifiers = modifiers; myType = type; myInitializer = initializer; } @@ -19,7 +23,7 @@ public class Field extends Node { @NotNull @Override public String toKotlin() { - String modifier = "var" + SPACE; + String modifier = (myModifiers.contains(Modifier.FINAL) ? "val" : "var") + SPACE; if (myInitializer.toKotlin().isEmpty()) // TODO: remove return modifier + myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin(); diff --git a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java index 2f42cbb278f..5b8f4588caa 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java @@ -4,7 +4,6 @@ import com.intellij.psi.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.j2k.Converter; import org.jetbrains.jet.j2k.ast.*; -import org.jetbrains.jet.j2k.ast.Modifier; import java.util.HashSet; @@ -25,18 +24,10 @@ public class ElementVisitor extends JavaElementVisitor implements Visitor { @Override public void visitLocalVariable(PsiLocalVariable variable) { super.visitLocalVariable(variable); - final PsiModifierList modifierList = variable.getModifierList(); - - HashSet modifiersSet = new HashSet(); - - if (modifierList != null) { - if (modifierList.hasModifierProperty("final")) - modifiersSet.add(Modifier.FINAL); - } myResult = new LocalVariable( new IdentifierImpl(variable.getName()), // TODO - modifiersSet, + getModifiersSet(variable.getModifierList()), typeToType(variable.getType()), expressionToExpression(variable.getInitializer()) ); diff --git a/test/org/jetbrains/jet/j2k/ast/FieldTest.java b/test/org/jetbrains/jet/j2k/ast/FieldTest.java new file mode 100644 index 00000000000..8fb7fc3952a --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/FieldTest.java @@ -0,0 +1,30 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class FieldTest extends JetTestCaseBase { + public void testVarWithoutInit() throws Exception { + Assert.assertEquals( + methodToSingleLineKotlin("Foo f;"), + "var f : Foo?" + ); + } + + public void testVarWithInit() throws Exception { + Assert.assertEquals( + methodToSingleLineKotlin("Foo f = new Foo(1, 2);"), + "var f : Foo? = Foo(1, 2)" + ); + } + + public void testValWithInit() throws Exception { + Assert.assertEquals( + methodToSingleLineKotlin("final Foo f = new Foo(1, 2);"), + "val f : Foo? = Foo(1, 2)" + ); + } +} From b727c1885224c0425b90c1fe3d6203da496e3d7f Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 3 Nov 2011 14:04:33 +0400 Subject: [PATCH 038/206] access modifiers support --- src/org/jetbrains/jet/j2k/Converter.java | 13 ++++++--- .../jetbrains/jet/j2k/ast/Constructor.java | 5 ++-- src/org/jetbrains/jet/j2k/ast/Function.java | 27 ++++++++++++++++--- src/org/jetbrains/jet/j2k/ast/Modifier.java | 1 + .../jet/j2k/visitors/ElementVisitor.java | 4 +-- test/org/jetbrains/jet/j2k/ast/EnumTest.java | 4 +-- .../jetbrains/jet/j2k/ast/FunctionTest.java | 16 +++++++++++ test/org/jetbrains/jet/j2k/ast/TraitTest.java | 10 +++---- 8 files changed, 62 insertions(+), 18 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index e6dea079b6a..3fc4c362783 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -67,7 +67,7 @@ public class Converter { } private static Field fieldToField(PsiField field) { - HashSet modifiers = getModifiersSet(field.getModifierList()); + HashSet modifiers = modifiersListToModifiersSet(field.getModifierList()); if (field instanceof PsiEnumConstant) // TODO: remove instanceof return new EnumConstant( new IdentifierImpl(field.getName()), // TODO @@ -95,6 +95,7 @@ public class Converter { @NotNull private static Function methodToFunction(PsiMethod method, boolean notEmpty) { final IdentifierImpl identifier = new IdentifierImpl(method.getName()); + final HashSet modifiers = modifiersListToModifiersSet(method.getModifierList()); final Type type = typeToType(method.getReturnType()); final Block body = blockToBlock(method.getBody(), notEmpty); final Element params = elementToElement(method.getParameterList()); @@ -103,6 +104,7 @@ public class Converter { if (method.isConstructor()) return new Constructor( identifier, + modifiers, type, typeParameters, params, @@ -110,6 +112,7 @@ public class Converter { ); return new Function( identifier, + modifiers, type, typeParameters, params, @@ -259,10 +262,14 @@ public class Converter { return new IdentifierImpl(identifier.getText()); } - public static HashSet getModifiersSet(PsiModifierList modifierList) { + public static HashSet modifiersListToModifiersSet(PsiModifierList modifierList) { HashSet modifiersSet = new HashSet(); if (modifierList != null) { - if (modifierList.hasModifierProperty("final")) modifiersSet.add(Modifier.FINAL); + if (modifierList.hasModifierProperty(PsiModifier.FINAL)) modifiersSet.add(Modifier.FINAL); + if (modifierList.hasModifierProperty(PsiModifier.PUBLIC)) modifiersSet.add(Modifier.PUBLIC); + if (modifierList.hasModifierProperty(PsiModifier.PROTECTED)) modifiersSet.add(Modifier.PROTECTED); + if (modifierList.hasModifierProperty(PsiModifier.PACKAGE_LOCAL)) modifiersSet.add(Modifier.INTERNAL); + if (modifierList.hasModifierProperty(PsiModifier.PRIVATE)) modifiersSet.add(Modifier.PRIVATE); } return modifiersSet; } diff --git a/src/org/jetbrains/jet/j2k/ast/Constructor.java b/src/org/jetbrains/jet/j2k/ast/Constructor.java index a28e306ee1b..8e4c257ad5a 100644 --- a/src/org/jetbrains/jet/j2k/ast/Constructor.java +++ b/src/org/jetbrains/jet/j2k/ast/Constructor.java @@ -3,13 +3,14 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; import java.util.List; +import java.util.Set; /** * @author ignatov */ public class Constructor extends Function { - public Constructor(Identifier identifier, Type type, List typeParameters, Element params, Block block) { - super(identifier, type, typeParameters, params, block); + public Constructor(Identifier identifier, Set modifiers, Type type, List typeParameters, Element params, Block block) { + super(identifier, modifiers, type, typeParameters, params, block); } public String primary() { diff --git a/src/org/jetbrains/jet/j2k/ast/Function.java b/src/org/jetbrains/jet/j2k/ast/Function.java index 9f9cf72de4f..ee8a9424d04 100644 --- a/src/org/jetbrains/jet/j2k/ast/Function.java +++ b/src/org/jetbrains/jet/j2k/ast/Function.java @@ -5,19 +5,22 @@ import org.jetbrains.jet.j2k.util.AstUtil; import java.util.LinkedList; import java.util.List; +import java.util.Set; /** * @author ignatov */ public class Function extends Node { private final Identifier myName; + private Set myModifiers; private final Type myType; private final List myTypeParameters; final Element myParams; private final Block myBlock; - public Function(Identifier name, Type type, List typeParameters, Element params, Block block) { + public Function(Identifier name, Set modifiers, Type type, List typeParameters, Element params, Block block) { myName = name; + myModifiers = modifiers; myType = type; myTypeParameters = typeParameters; myParams = params; @@ -35,7 +38,14 @@ public class Function extends Node { return false; } - String typeParameterWhereToKotlin() { + private String accessModifier() { + for (String m : myModifiers) + if (m.equals(Modifier.PUBLIC) || m.equals(Modifier.PROTECTED) || m.equals(Modifier.PRIVATE)) + return m; + return EMPTY; // package local converted to internal, but we use internal by default + } + + private String typeParameterWhereToKotlin() { if (hasWhere()) { List wheres = new LinkedList(); for (Element t : myTypeParameters) @@ -46,10 +56,21 @@ public class Function extends Node { return EMPTY; } + private String modifiersToKotlin() { + List modifierList = new LinkedList(); + + modifierList.add(accessModifier()); + + if (modifierList.size() > 0) + return AstUtil.join(modifierList, SPACE) + SPACE; + + return EMPTY; + } + @NotNull @Override public String toKotlin() { - return "fun" + SPACE + myName.toKotlin() + typeParametersToKotlin() + "(" + myParams.toKotlin() + ")" + SPACE + COLON + + return modifiersToKotlin() + "fun" + SPACE + myName.toKotlin() + typeParametersToKotlin() + "(" + myParams.toKotlin() + ")" + SPACE + COLON + SPACE + myType.toKotlin() + SPACE + typeParameterWhereToKotlin() + myBlock.toKotlin(); diff --git a/src/org/jetbrains/jet/j2k/ast/Modifier.java b/src/org/jetbrains/jet/j2k/ast/Modifier.java index e71b5707139..4abf460af59 100644 --- a/src/org/jetbrains/jet/j2k/ast/Modifier.java +++ b/src/org/jetbrains/jet/j2k/ast/Modifier.java @@ -11,4 +11,5 @@ public abstract class Modifier { public static String STATIC = "static"; public static String ABSTRACT = "abstract"; public static String FINAL = "final"; + public static String OPEN = "open"; } diff --git a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java index 5b8f4588caa..1a25cc76b5d 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java @@ -5,8 +5,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.j2k.Converter; import org.jetbrains.jet.j2k.ast.*; -import java.util.HashSet; - import static org.jetbrains.jet.j2k.Converter.*; /** @@ -27,7 +25,7 @@ public class ElementVisitor extends JavaElementVisitor implements Visitor { myResult = new LocalVariable( new IdentifierImpl(variable.getName()), // TODO - getModifiersSet(variable.getModifierList()), + modifiersListToModifiersSet(variable.getModifierList()), typeToType(variable.getType()), expressionToExpression(variable.getInitializer()) ); diff --git a/test/org/jetbrains/jet/j2k/ast/EnumTest.java b/test/org/jetbrains/jet/j2k/ast/EnumTest.java index a701ac1081f..ee36bd1df0d 100644 --- a/test/org/jetbrains/jet/j2k/ast/EnumTest.java +++ b/test/org/jetbrains/jet/j2k/ast/EnumTest.java @@ -56,7 +56,7 @@ public class EnumTest extends JetTestCaseBase { "\n" + " private int code;\n" + "\n" + - " private Color(int c) {\n" + + " private Color(int c) {\n" + // TODO: private constructor, WTF? " code = c;\n" + " }\n" + "\n" + @@ -70,7 +70,7 @@ public class EnumTest extends JetTestCaseBase { "YELLOW(24)\n" + "BLUE(25)\n" + "var code : Int\n" + - "fun getCode() : Int {\n" + + "public fun getCode() : Int {\n" + "return code\n" + "}\n" + "}" diff --git a/test/org/jetbrains/jet/j2k/ast/FunctionTest.java b/test/org/jetbrains/jet/j2k/ast/FunctionTest.java index c1f1d9e4372..3534b1d0655 100644 --- a/test/org/jetbrains/jet/j2k/ast/FunctionTest.java +++ b/test/org/jetbrains/jet/j2k/ast/FunctionTest.java @@ -62,4 +62,20 @@ public class FunctionTest extends JetTestCaseBase { "fun putUVW(u : U?, v : V?, w : W?) : Unit { }" ); } + + public void testInternal() throws Exception { + Assert.assertEquals(methodToSingleLineKotlin("void test() {}"), "fun test() : Unit { }"); + } + + public void testPrivate() throws Exception { + Assert.assertEquals(methodToSingleLineKotlin("private void test() {}"), "private fun test() : Unit { }"); + } + + public void testProtected() throws Exception { + Assert.assertEquals(methodToSingleLineKotlin("protected void test() {}"), "protected fun test() : Unit { }"); + } + + public void testPublic() throws Exception { + Assert.assertEquals(methodToSingleLineKotlin("public void test() {}"), "public fun test() : Unit { }"); + } } \ No newline at end of file diff --git a/test/org/jetbrains/jet/j2k/ast/TraitTest.java b/test/org/jetbrains/jet/j2k/ast/TraitTest.java index 88191af26fe..4e228eb53eb 100644 --- a/test/org/jetbrains/jet/j2k/ast/TraitTest.java +++ b/test/org/jetbrains/jet/j2k/ast/TraitTest.java @@ -22,8 +22,8 @@ public class TraitTest extends JetTestCaseBase { "}" ), "trait INode {\n" + - "fun getTag() : Tag? \n" + - "fun toKotlin() : String? \n" + + "public fun getTag() : Tag? \n" + + "public fun toKotlin() : String? \n" + "}"); } @@ -36,9 +36,9 @@ public class TraitTest extends JetTestCaseBase { "}" ), "trait INode {\n" + - "var IN : String? = \"in\"\n" + - "var AT : String? = \"@\"\n" + - "var COMMA_WITH_SPACE : String? = (COMMA + SPACE)\n" + + "val IN : String? = \"in\"\n" + + "val AT : String? = \"@\"\n" + + "val COMMA_WITH_SPACE : String? = (COMMA + SPACE)\n" + "}" ); } From 359d498f3714ca08d953b6bb248810240e17e5a1 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 3 Nov 2011 14:08:40 +0400 Subject: [PATCH 039/206] cleanup --- src/org/jetbrains/jet/j2k/Converter.java | 7 ++++--- src/org/jetbrains/jet/j2k/ast/EnumConstant.java | 4 ++-- src/org/jetbrains/jet/j2k/ast/Field.java | 6 +++--- src/org/jetbrains/jet/j2k/ast/LocalVariable.java | 6 +++--- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 3fc4c362783..a38dda7620e 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -15,6 +15,7 @@ import org.jetbrains.jet.j2k.visitors.TypeVisitor; import java.util.HashSet; import java.util.LinkedList; import java.util.List; +import java.util.Set; /** * @author ignatov @@ -67,7 +68,7 @@ public class Converter { } private static Field fieldToField(PsiField field) { - HashSet modifiers = modifiersListToModifiersSet(field.getModifierList()); + Set modifiers = modifiersListToModifiersSet(field.getModifierList()); if (field instanceof PsiEnumConstant) // TODO: remove instanceof return new EnumConstant( new IdentifierImpl(field.getName()), // TODO @@ -95,7 +96,7 @@ public class Converter { @NotNull private static Function methodToFunction(PsiMethod method, boolean notEmpty) { final IdentifierImpl identifier = new IdentifierImpl(method.getName()); - final HashSet modifiers = modifiersListToModifiersSet(method.getModifierList()); + final Set modifiers = modifiersListToModifiersSet(method.getModifierList()); final Type type = typeToType(method.getReturnType()); final Block body = blockToBlock(method.getBody(), notEmpty); final Element params = elementToElement(method.getParameterList()); @@ -262,7 +263,7 @@ public class Converter { return new IdentifierImpl(identifier.getText()); } - public static HashSet modifiersListToModifiersSet(PsiModifierList modifierList) { + public static Set modifiersListToModifiersSet(PsiModifierList modifierList) { HashSet modifiersSet = new HashSet(); if (modifierList != null) { if (modifierList.hasModifierProperty(PsiModifier.FINAL)) modifiersSet.add(Modifier.FINAL); diff --git a/src/org/jetbrains/jet/j2k/ast/EnumConstant.java b/src/org/jetbrains/jet/j2k/ast/EnumConstant.java index 489bfc390cf..a55a1d09abe 100644 --- a/src/org/jetbrains/jet/j2k/ast/EnumConstant.java +++ b/src/org/jetbrains/jet/j2k/ast/EnumConstant.java @@ -2,13 +2,13 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; -import java.util.HashSet; +import java.util.Set; /** * @author ignatov */ public class EnumConstant extends Field { - public EnumConstant(Identifier identifier, HashSet modifiers, Type type, Element params) { + public EnumConstant(Identifier identifier, Set modifiers, Type type, Element params) { super(identifier, modifiers, type, params); } diff --git a/src/org/jetbrains/jet/j2k/ast/Field.java b/src/org/jetbrains/jet/j2k/ast/Field.java index dca82068988..2b733e401e2 100644 --- a/src/org/jetbrains/jet/j2k/ast/Field.java +++ b/src/org/jetbrains/jet/j2k/ast/Field.java @@ -2,18 +2,18 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; -import java.util.HashSet; +import java.util.Set; /** * @author ignatov */ public class Field extends Node { final Identifier myIdentifier; - private HashSet myModifiers; + private Set myModifiers; private final Type myType; final Element myInitializer; - public Field(Identifier identifier, HashSet modifiers, Type type, Element initializer) { + public Field(Identifier identifier, Set modifiers, Type type, Element initializer) { myIdentifier = identifier; myModifiers = modifiers; myType = type; diff --git a/src/org/jetbrains/jet/j2k/ast/LocalVariable.java b/src/org/jetbrains/jet/j2k/ast/LocalVariable.java index 84b0516b92d..69d3b23e17e 100644 --- a/src/org/jetbrains/jet/j2k/ast/LocalVariable.java +++ b/src/org/jetbrains/jet/j2k/ast/LocalVariable.java @@ -2,18 +2,18 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; -import java.util.HashSet; +import java.util.Set; /** * @author ignatov */ public class LocalVariable extends Expression { private final Identifier myIdentifier; - private HashSet myModifiersSet; + private Set myModifiersSet; private final Type myType; private final Expression myInitializer; - public LocalVariable(Identifier identifier, HashSet modifiersSet, Type type, Expression initializer) { + public LocalVariable(Identifier identifier, Set modifiersSet, Type type, Expression initializer) { myIdentifier = identifier; myModifiersSet = modifiersSet; myType = type; From 8e8b6a2d44eba249fe1377fbc9c5a11890cd7a99 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 3 Nov 2011 14:20:20 +0400 Subject: [PATCH 040/206] access modifiers support for classes, traits and enums --- src/org/jetbrains/jet/j2k/Converter.java | 7 ++-- src/org/jetbrains/jet/j2k/ast/Class.java | 34 +++++++++++++++++-- src/org/jetbrains/jet/j2k/ast/Enum.java | 8 ++--- src/org/jetbrains/jet/j2k/ast/INode.java | 2 +- src/org/jetbrains/jet/j2k/ast/Trait.java | 13 +++++-- test/org/jetbrains/jet/j2k/FileTest.java | 11 ++++-- .../jetbrains/jet/j2k/JetTestCaseBase.java | 3 +- test/org/jetbrains/jet/j2k/ast/ClassTest.java | 24 +++++++++++++ test/org/jetbrains/jet/j2k/ast/EnumTest.java | 16 +++++++++ test/org/jetbrains/jet/j2k/ast/TraitTest.java | 18 +++++++++- 10 files changed, 119 insertions(+), 17 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index a38dda7620e..ba7b24d3bd6 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -41,6 +41,7 @@ public class Converter { private static Class classToClass(PsiClass psiClass) { final List methods = methodsToFunctionList(psiClass.getMethods(), true); + final Set modifiers = modifiersListToModifiersSet(psiClass.getModifierList()); final List innerClasses = classesToClassList(psiClass.getAllInnerClasses()); final List fields = fieldsToFieldList(psiClass.getAllFields()); final List typeParameters = elementsToElementList(psiClass.getTypeParameters()); @@ -53,10 +54,10 @@ public class Converter { final IdentifierImpl name = new IdentifierImpl(psiClass.getName()); if (psiClass.isInterface()) - return new Trait(name, typeParameters, extendsTypes, implementsTypes, innerClasses, methods, fields); + return new Trait(name, modifiers, typeParameters, extendsTypes, implementsTypes, innerClasses, methods, fields); if (psiClass.isEnum()) - return new Enum(name, typeParameters, extendsTypes, implementsTypes, innerClasses, methods, fields); - return new Class(name, typeParameters, extendsTypes, implementsTypes, innerClasses, methods, fields); + return new Enum(name, modifiers, typeParameters, extendsTypes, implementsTypes, innerClasses, methods, fields); + return new Class(name, modifiers, typeParameters, extendsTypes, implementsTypes, innerClasses, methods, fields); } private static List fieldsToFieldList(PsiField[] fields) { diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java index 24f7fc63bd5..4a9ca601c05 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -5,6 +5,7 @@ import org.jetbrains.jet.j2k.util.AstUtil; import java.util.LinkedList; import java.util.List; +import java.util.Set; /** * @author ignatov @@ -12,6 +13,7 @@ import java.util.List; public class Class extends Node { String TYPE = "class"; final Identifier myName; + private Set myModifiers; private final List myTypeParameters; private final List myExtendsTypes; private final List myImplementsTypes; @@ -19,8 +21,10 @@ public class Class extends Node { final List myMethods; final List myFields; - public Class(Identifier name, List typeParameters, List extendsTypes, List implementsTypes, List innerClasses, List methods, List fields) { + public Class(Identifier name, Set modifiers, List typeParameters, List extendsTypes, + List implementsTypes, List innerClasses, List methods, List fields) { myName = name; + myModifiers = modifiers; myTypeParameters = typeParameters; myExtendsTypes = extendsTypes; myImplementsTypes = implementsTypes; @@ -70,10 +74,36 @@ public class Class extends Node { return allTypes.size() == 0 ? EMPTY : SPACE + COLON + SPACE + AstUtil.joinNodes(allTypes, COMMA_WITH_SPACE); } + private String accessModifier() { + for (String m : myModifiers) + if (m.equals(Modifier.PUBLIC) || m.equals(Modifier.PROTECTED) || m.equals(Modifier.PRIVATE)) + return m; + return EMPTY; // package local converted to internal, but we use internal by default + } + + String modifiersToKotlin() { + List modifierList = new LinkedList(); + + modifierList.add(accessModifier()); + + if (needOpenModifier()) + modifierList.add(Modifier.OPEN); + + if (modifierList.size() > 0) + return AstUtil.join(modifierList, SPACE) + SPACE; + + return EMPTY; + } + + boolean needOpenModifier() { + return getKind() != Kind.TRAIT && !myModifiers.contains(Modifier.FINAL); + } + + @NotNull @Override public String toKotlin() { - return TYPE + SPACE + myName.toKotlin() + typeParametersToKotlin() + + return modifiersToKotlin() + TYPE + SPACE + myName.toKotlin() + typeParametersToKotlin() + implementTypesToKotlin() + typeParameterWhereToKotlin() + SPACE + "{" + N + diff --git a/src/org/jetbrains/jet/j2k/ast/Enum.java b/src/org/jetbrains/jet/j2k/ast/Enum.java index dd6db4da722..6a0fd5a3524 100644 --- a/src/org/jetbrains/jet/j2k/ast/Enum.java +++ b/src/org/jetbrains/jet/j2k/ast/Enum.java @@ -5,13 +5,14 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.j2k.util.AstUtil; import java.util.List; +import java.util.Set; /** * @author ignatov */ public class Enum extends Class { - public Enum(Identifier name, List typeParameters, List extendsTypes, List implementsTypes, List innerClasses, List methods, List fields) { - super(name, typeParameters, extendsTypes, implementsTypes, innerClasses, methods, fields); + public Enum(Identifier name, Set modifiers, List typeParameters, List extendsTypes, List implementsTypes, List innerClasses, List methods, List fields) { + super(name, modifiers, typeParameters, extendsTypes, implementsTypes, innerClasses, methods, fields); } @Nullable @@ -29,11 +30,10 @@ public class Enum extends Class { return EMPTY; } - @NotNull @Override public String toKotlin() { - return "enum" + SPACE + myName.toKotlin() + typeParametersToKotlin() + primaryConstructorToKotlin() + implementTypesToKotlin() + SPACE + "{" + N + + return modifiersToKotlin() + "enum" + SPACE + myName.toKotlin() + typeParametersToKotlin() + primaryConstructorToKotlin() + implementTypesToKotlin() + SPACE + "{" + N + AstUtil.joinNodes(myFields, N) + N + AstUtil.joinNodes(methodsExceptConstructors(), N) + N + AstUtil.joinNodes(myInnerClasses, N) + N + diff --git a/src/org/jetbrains/jet/j2k/ast/INode.java b/src/org/jetbrains/jet/j2k/ast/INode.java index e0f8323f77f..4cc77364390 100644 --- a/src/org/jetbrains/jet/j2k/ast/INode.java +++ b/src/org/jetbrains/jet/j2k/ast/INode.java @@ -13,6 +13,6 @@ public interface INode { public Kind getKind(); public enum Kind { - UNDEFINED, TYPE, CONSTRUCTOR, BREAK, CONTINUE, VARARG, + UNDEFINED, TYPE, CONSTRUCTOR, BREAK, CONTINUE, VARARG, TRAIT, } } diff --git a/src/org/jetbrains/jet/j2k/ast/Trait.java b/src/org/jetbrains/jet/j2k/ast/Trait.java index 484f5dcbc93..4a357bbdd3e 100644 --- a/src/org/jetbrains/jet/j2k/ast/Trait.java +++ b/src/org/jetbrains/jet/j2k/ast/Trait.java @@ -1,13 +1,22 @@ package org.jetbrains.jet.j2k.ast; +import org.jetbrains.annotations.NotNull; + import java.util.List; +import java.util.Set; /** * @author ignatov */ public class Trait extends Class { - public Trait(Identifier name, List typeParameters, List extendsTypes, List implementsTypes, List innerClasses, List methods, List fields) { - super(name, typeParameters, extendsTypes, implementsTypes, innerClasses, methods, fields); + public Trait(Identifier name, Set modifiers, List typeParameters, List extendsTypes, List implementsTypes, List innerClasses, List methods, List fields) { + super(name, modifiers, typeParameters, extendsTypes, implementsTypes, innerClasses, methods, fields); TYPE = "trait"; } + + @NotNull + @Override + public Kind getKind() { + return Kind.TRAIT; + } } diff --git a/test/org/jetbrains/jet/j2k/FileTest.java b/test/org/jetbrains/jet/j2k/FileTest.java index 8d5a8f6a92c..fe4d2d074f6 100644 --- a/test/org/jetbrains/jet/j2k/FileTest.java +++ b/test/org/jetbrains/jet/j2k/FileTest.java @@ -47,14 +47,21 @@ public class FileTest extends JetTestCaseBase { public void testPackageWithClass() throws Exception { Assert.assertEquals( - toSingleLine(fileToKotlin("package test; class C {}")), + toSingleLine(fileToKotlin("package test; final class C {}")), "namespace test { class C { } }" ); } + public void testPackageWithOpenClass() throws Exception { + Assert.assertEquals( + toSingleLine(fileToKotlin("package test; class C {}")), + "namespace test { open class C { } }" + ); + } + public void testPackageWithClasses() throws Exception { Assert.assertEquals( - toSingleLine(fileToKotlin("class A {} class B {}")), + toSingleLine(fileToKotlin("final class A {} final class B {}")), "namespace { class A { } class B { } }"); } } diff --git a/test/org/jetbrains/jet/j2k/JetTestCaseBase.java b/test/org/jetbrains/jet/j2k/JetTestCaseBase.java index e47ef7c7cf8..813c9de4000 100644 --- a/test/org/jetbrains/jet/j2k/JetTestCaseBase.java +++ b/test/org/jetbrains/jet/j2k/JetTestCaseBase.java @@ -93,7 +93,6 @@ public abstract class JetTestCaseBase extends LightDaemonAnalyzerTestCase { String result = prettify(Converter.fileToFile(javaFile).toKotlin()).replaceAll("namespace \\{", ""); result = result.substring(0, result.lastIndexOf("}")); return prettify(result); - } @NotNull @@ -107,7 +106,7 @@ public abstract class JetTestCaseBase extends LightDaemonAnalyzerTestCase { } String methodToKotlin(String text) throws IOException { - String result = classToKotlin("class C {" + text + "}") + String result = classToKotlin("final class C {" + text + "}") .replaceAll("class C \\{", ""); result = result.substring(0, result.lastIndexOf("}")); return prettify(result); diff --git a/test/org/jetbrains/jet/j2k/ast/ClassTest.java b/test/org/jetbrains/jet/j2k/ast/ClassTest.java index 61f49eae934..96b5efcfbb8 100644 --- a/test/org/jetbrains/jet/j2k/ast/ClassTest.java +++ b/test/org/jetbrains/jet/j2k/ast/ClassTest.java @@ -90,4 +90,28 @@ public class ClassTest extends JetTestCaseBase { "class A : Base, I0, I1, I2 { }" ); } + + public void testClass() throws Exception { + Assert.assertEquals(classToSingleLineKotlin("class Test {}"), "open class Test { }"); + } + + public void testFinalClass() throws Exception { + Assert.assertEquals(classToSingleLineKotlin("final class Test {}"), "class Test { }"); + } + + public void testPublicClass() throws Exception { + Assert.assertEquals(classToSingleLineKotlin("public class Test {}"), "public open class Test { }"); + } + + public void testProtectedClass() throws Exception { + Assert.assertEquals(classToSingleLineKotlin("protected class Test {}"), "protected open class Test { }"); + } + + public void testPivateClass() throws Exception { + Assert.assertEquals(classToSingleLineKotlin("private class Test {}"), "private open class Test { }"); + } + + public void testInternalClass() throws Exception { + Assert.assertEquals(classToSingleLineKotlin("class Test {}"), "open class Test { }"); + } } diff --git a/test/org/jetbrains/jet/j2k/ast/EnumTest.java b/test/org/jetbrains/jet/j2k/ast/EnumTest.java index ee36bd1df0d..67ebb370101 100644 --- a/test/org/jetbrains/jet/j2k/ast/EnumTest.java +++ b/test/org/jetbrains/jet/j2k/ast/EnumTest.java @@ -91,6 +91,22 @@ public class EnumTest extends JetTestCaseBase { ); } + public void testPublicEnum() throws Exception { + Assert.assertEquals(classToSingleLineKotlin("public enum Test {}"), "public enum Test { }"); + } + + public void testProtectedEnum() throws Exception { + Assert.assertEquals(classToSingleLineKotlin("protected enum Test {}"), "protected enum Test { }"); + } + + public void testPrivateEnum() throws Exception { + Assert.assertEquals(classToSingleLineKotlin("private enum Test {}"), "private enum Test { }"); + } + + public void testInternalEnum() throws Exception { + Assert.assertEquals(classToSingleLineKotlin("enum Test {}"), "enum Test { }"); + } + // public void testTwoConstructors() throws Exception { // Assert.assertEquals( // classToKotlin( diff --git a/test/org/jetbrains/jet/j2k/ast/TraitTest.java b/test/org/jetbrains/jet/j2k/ast/TraitTest.java index 4e228eb53eb..4bdeb7b6b37 100644 --- a/test/org/jetbrains/jet/j2k/ast/TraitTest.java +++ b/test/org/jetbrains/jet/j2k/ast/TraitTest.java @@ -56,4 +56,20 @@ public class TraitTest extends JetTestCaseBase { "trait A : I0, I1, I2 { }" ); } -} + + public void testPublicInterface() throws Exception { + Assert.assertEquals(classToSingleLineKotlin("public interface Test {}"), "public trait Test { }"); + } + + public void testProtectedInterface() throws Exception { + Assert.assertEquals(classToSingleLineKotlin("protected interface Test {}"), "protected trait Test { }"); + } + + public void testPrivateInterface() throws Exception { + Assert.assertEquals(classToSingleLineKotlin("private interface Test {}"), "private trait Test { }"); + } + + public void testInternalInterface() throws Exception { + Assert.assertEquals(classToSingleLineKotlin("interface Test {}"), "trait Test { }"); + } +} \ No newline at end of file From 61a17c732bc3a5227ae32c7ac7c397ee8b45cfcb Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 3 Nov 2011 15:14:35 +0400 Subject: [PATCH 041/206] access modifiers support for fields --- src/org/jetbrains/jet/j2k/ast/Field.java | 25 ++++++++++++++++++- test/org/jetbrains/jet/j2k/ast/EnumTest.java | 2 +- test/org/jetbrains/jet/j2k/ast/FieldTest.java | 16 ++++++++++++ test/org/jetbrains/jet/j2k/ast/TraitTest.java | 6 ++--- 4 files changed, 44 insertions(+), 5 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/ast/Field.java b/src/org/jetbrains/jet/j2k/ast/Field.java index 2b733e401e2..360466124e0 100644 --- a/src/org/jetbrains/jet/j2k/ast/Field.java +++ b/src/org/jetbrains/jet/j2k/ast/Field.java @@ -1,7 +1,10 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.j2k.util.AstUtil; +import java.util.LinkedList; +import java.util.List; import java.util.Set; /** @@ -20,10 +23,30 @@ public class Field extends Node { myInitializer = initializer; } + private String accessModifier() { + for (String m : myModifiers) + if (m.equals(Modifier.PUBLIC) || m.equals(Modifier.PROTECTED) || m.equals(Modifier.PRIVATE)) + return m; + return EMPTY; // package local converted to internal, but we use internal by default + } + + String modifiersToKotlin() { + List modifierList = new LinkedList(); + + modifierList.add(accessModifier()); + + modifierList.add(myModifiers.contains(Modifier.FINAL) ? "val" : "var"); + + if (modifierList.size() > 0) + return AstUtil.join(modifierList, SPACE) + SPACE; + + return EMPTY; + } + @NotNull @Override public String toKotlin() { - String modifier = (myModifiers.contains(Modifier.FINAL) ? "val" : "var") + SPACE; + String modifier = modifiersToKotlin(); if (myInitializer.toKotlin().isEmpty()) // TODO: remove return modifier + myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin(); diff --git a/test/org/jetbrains/jet/j2k/ast/EnumTest.java b/test/org/jetbrains/jet/j2k/ast/EnumTest.java index 67ebb370101..8ff5f66a841 100644 --- a/test/org/jetbrains/jet/j2k/ast/EnumTest.java +++ b/test/org/jetbrains/jet/j2k/ast/EnumTest.java @@ -69,7 +69,7 @@ public class EnumTest extends JetTestCaseBase { "RED(23)\n" + "YELLOW(24)\n" + "BLUE(25)\n" + - "var code : Int\n" + + "private var code : Int\n" + "public fun getCode() : Int {\n" + "return code\n" + "}\n" + diff --git a/test/org/jetbrains/jet/j2k/ast/FieldTest.java b/test/org/jetbrains/jet/j2k/ast/FieldTest.java index 8fb7fc3952a..4be8af966fc 100644 --- a/test/org/jetbrains/jet/j2k/ast/FieldTest.java +++ b/test/org/jetbrains/jet/j2k/ast/FieldTest.java @@ -27,4 +27,20 @@ public class FieldTest extends JetTestCaseBase { "val f : Foo? = Foo(1, 2)" ); } + + public void testPrivateField() throws Exception { + Assert.assertEquals(methodToSingleLineKotlin("private Foo f;"), "private var f : Foo?"); + } + + public void testProtectedField() throws Exception { + Assert.assertEquals(methodToSingleLineKotlin("protected Foo f;"), "protected var f : Foo?"); + } + + public void testPublicField() throws Exception { + Assert.assertEquals(methodToSingleLineKotlin("public Foo f;"), "public var f : Foo?"); + } + + public void testInternalField() throws Exception { + Assert.assertEquals(methodToSingleLineKotlin("Foo f;"), "var f : Foo?"); + } } diff --git a/test/org/jetbrains/jet/j2k/ast/TraitTest.java b/test/org/jetbrains/jet/j2k/ast/TraitTest.java index 4bdeb7b6b37..a835f20806d 100644 --- a/test/org/jetbrains/jet/j2k/ast/TraitTest.java +++ b/test/org/jetbrains/jet/j2k/ast/TraitTest.java @@ -36,9 +36,9 @@ public class TraitTest extends JetTestCaseBase { "}" ), "trait INode {\n" + - "val IN : String? = \"in\"\n" + - "val AT : String? = \"@\"\n" + - "val COMMA_WITH_SPACE : String? = (COMMA + SPACE)\n" + + "public val IN : String? = \"in\"\n" + + "public val AT : String? = \"@\"\n" + + "public val COMMA_WITH_SPACE : String? = (COMMA + SPACE)\n" + "}" ); } From e3575eb73ca843eab3dcc46744d4896c537b9a13 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 3 Nov 2011 15:57:18 +0400 Subject: [PATCH 042/206] static modifier supported for class members --- src/org/jetbrains/jet/j2k/Converter.java | 1 + src/org/jetbrains/jet/j2k/ast/Class.java | 52 ++++++++++++++----- src/org/jetbrains/jet/j2k/ast/Field.java | 15 +++--- src/org/jetbrains/jet/j2k/ast/Function.java | 10 +--- src/org/jetbrains/jet/j2k/ast/IMember.java | 8 +++ src/org/jetbrains/jet/j2k/ast/Member.java | 22 ++++++++ src/org/jetbrains/jet/j2k/ast/Trait.java | 11 ++++ test/org/jetbrains/jet/j2k/ast/ClassTest.java | 28 ++++++++++ test/org/jetbrains/jet/j2k/ast/TraitTest.java | 16 ++++++ 9 files changed, 132 insertions(+), 31 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/IMember.java create mode 100644 src/org/jetbrains/jet/j2k/ast/Member.java diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index ba7b24d3bd6..aebf33da9ba 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -268,6 +268,7 @@ public class Converter { HashSet modifiersSet = new HashSet(); if (modifierList != null) { if (modifierList.hasModifierProperty(PsiModifier.FINAL)) modifiersSet.add(Modifier.FINAL); + if (modifierList.hasModifierProperty(PsiModifier.STATIC)) modifiersSet.add(Modifier.STATIC); if (modifierList.hasModifierProperty(PsiModifier.PUBLIC)) modifiersSet.add(Modifier.PUBLIC); if (modifierList.hasModifierProperty(PsiModifier.PROTECTED)) modifiersSet.add(Modifier.PROTECTED); if (modifierList.hasModifierProperty(PsiModifier.PACKAGE_LOCAL)) modifiersSet.add(Modifier.INTERNAL); diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java index 4a9ca601c05..87c05308f31 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -10,10 +10,9 @@ import java.util.Set; /** * @author ignatov */ -public class Class extends Node { +public class Class extends Member { String TYPE = "class"; final Identifier myName; - private Set myModifiers; private final List myTypeParameters; private final List myExtendsTypes; private final List myImplementsTypes; @@ -74,13 +73,6 @@ public class Class extends Node { return allTypes.size() == 0 ? EMPTY : SPACE + COLON + SPACE + AstUtil.joinNodes(allTypes, COMMA_WITH_SPACE); } - private String accessModifier() { - for (String m : myModifiers) - if (m.equals(Modifier.PUBLIC) || m.equals(Modifier.PROTECTED) || m.equals(Modifier.PRIVATE)) - return m; - return EMPTY; // package local converted to internal, but we use internal by default - } - String modifiersToKotlin() { List modifierList = new LinkedList(); @@ -96,9 +88,45 @@ public class Class extends Node { } boolean needOpenModifier() { - return getKind() != Kind.TRAIT && !myModifiers.contains(Modifier.FINAL); + return !myModifiers.contains(Modifier.FINAL); } + String bodyToKotlin() { + return classObjectToKotlin() + N + + AstUtil.joinNodes(getNonStatic(myFields), N) + N + + AstUtil.joinNodes(getNonStatic(methodsExceptConstructors()), N) + N + + AstUtil.joinNodes(getNonStatic(myInnerClasses), N) + N; + } + + private List getStatic(List members) { + List result = new LinkedList(); + for (Member m : members) + if (m.isStatic()) + result.add(m); + return result; + } + + private List getNonStatic(List members) { + List result = new LinkedList(); + for (Member m : members) + if (!m.isStatic()) + result.add(m); + return result; + } + + private String classObjectToKotlin() { + final List staticFields = getStatic(myFields); + final List staticMethods = getStatic(methodsExceptConstructors()); + final List staticInnerClasses = getStatic(myInnerClasses); + if (staticFields.size() + staticMethods.size() + staticInnerClasses.size() > 0) { + return "class" + SPACE + "object" + SPACE + "{" + N + + AstUtil.joinNodes(staticFields, N) + N + + AstUtil.joinNodes(staticMethods, N) + N + + AstUtil.joinNodes(staticInnerClasses, N) + N + + "}"; + } + return EMPTY; + } @NotNull @Override @@ -107,9 +135,7 @@ public class Class extends Node { implementTypesToKotlin() + typeParameterWhereToKotlin() + SPACE + "{" + N + - AstUtil.joinNodes(myFields, N) + N + - AstUtil.joinNodes(methodsExceptConstructors(), N) + N + - AstUtil.joinNodes(myInnerClasses, N) + N + + bodyToKotlin() + "}"; } } diff --git a/src/org/jetbrains/jet/j2k/ast/Field.java b/src/org/jetbrains/jet/j2k/ast/Field.java index 360466124e0..8efc6b4fb8a 100644 --- a/src/org/jetbrains/jet/j2k/ast/Field.java +++ b/src/org/jetbrains/jet/j2k/ast/Field.java @@ -10,9 +10,8 @@ import java.util.Set; /** * @author ignatov */ -public class Field extends Node { +public class Field extends Member { final Identifier myIdentifier; - private Set myModifiers; private final Type myType; final Element myInitializer; @@ -23,13 +22,6 @@ public class Field extends Node { myInitializer = initializer; } - private String accessModifier() { - for (String m : myModifiers) - if (m.equals(Modifier.PUBLIC) || m.equals(Modifier.PROTECTED) || m.equals(Modifier.PRIVATE)) - return m; - return EMPTY; // package local converted to internal, but we use internal by default - } - String modifiersToKotlin() { List modifierList = new LinkedList(); @@ -43,6 +35,11 @@ public class Field extends Node { return EMPTY; } + @Override + public boolean isStatic() { + return myModifiers.contains(Modifier.STATIC); + } + @NotNull @Override public String toKotlin() { diff --git a/src/org/jetbrains/jet/j2k/ast/Function.java b/src/org/jetbrains/jet/j2k/ast/Function.java index ee8a9424d04..113b2acd129 100644 --- a/src/org/jetbrains/jet/j2k/ast/Function.java +++ b/src/org/jetbrains/jet/j2k/ast/Function.java @@ -10,9 +10,8 @@ import java.util.Set; /** * @author ignatov */ -public class Function extends Node { +public class Function extends Member { private final Identifier myName; - private Set myModifiers; private final Type myType; private final List myTypeParameters; final Element myParams; @@ -38,13 +37,6 @@ public class Function extends Node { return false; } - private String accessModifier() { - for (String m : myModifiers) - if (m.equals(Modifier.PUBLIC) || m.equals(Modifier.PROTECTED) || m.equals(Modifier.PRIVATE)) - return m; - return EMPTY; // package local converted to internal, but we use internal by default - } - private String typeParameterWhereToKotlin() { if (hasWhere()) { List wheres = new LinkedList(); diff --git a/src/org/jetbrains/jet/j2k/ast/IMember.java b/src/org/jetbrains/jet/j2k/ast/IMember.java new file mode 100644 index 00000000000..98f4fb46a20 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/IMember.java @@ -0,0 +1,8 @@ +package org.jetbrains.jet.j2k.ast; + +/** + * @author ignatov + */ +public interface IMember extends INode { + public boolean isStatic(); +} diff --git a/src/org/jetbrains/jet/j2k/ast/Member.java b/src/org/jetbrains/jet/j2k/ast/Member.java new file mode 100644 index 00000000000..5ef2619092c --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/Member.java @@ -0,0 +1,22 @@ +package org.jetbrains.jet.j2k.ast; + +import java.util.Set; + +/** + * @author ignatov + */ +public abstract class Member extends Node implements IMember { + protected Set myModifiers; + + protected String accessModifier() { + for (String m : myModifiers) + if (m.equals(Modifier.PUBLIC) || m.equals(Modifier.PROTECTED) || m.equals(Modifier.PRIVATE)) + return m; + return EMPTY; // package local converted to internal, but we use internal by default + } + + @Override + public boolean isStatic() { + return myModifiers.contains(Modifier.STATIC); + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/Trait.java b/src/org/jetbrains/jet/j2k/ast/Trait.java index 4a357bbdd3e..7a373d74828 100644 --- a/src/org/jetbrains/jet/j2k/ast/Trait.java +++ b/src/org/jetbrains/jet/j2k/ast/Trait.java @@ -1,6 +1,7 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.j2k.util.AstUtil; import java.util.List; import java.util.Set; @@ -14,6 +15,16 @@ public class Trait extends Class { TYPE = "trait"; } + boolean needOpenModifier() { + return false; + } + + String bodyToKotlin() { + return AstUtil.joinNodes(myFields, N) + N + + AstUtil.joinNodes(methodsExceptConstructors(), N) + N + + AstUtil.joinNodes(myInnerClasses, N) + N; + } + @NotNull @Override public Kind getKind() { diff --git a/test/org/jetbrains/jet/j2k/ast/ClassTest.java b/test/org/jetbrains/jet/j2k/ast/ClassTest.java index 96b5efcfbb8..7218f8d95ab 100644 --- a/test/org/jetbrains/jet/j2k/ast/ClassTest.java +++ b/test/org/jetbrains/jet/j2k/ast/ClassTest.java @@ -114,4 +114,32 @@ public class ClassTest extends JetTestCaseBase { public void testInternalClass() throws Exception { Assert.assertEquals(classToSingleLineKotlin("class Test {}"), "open class Test { }"); } + + public void testOneStaticMethod() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin("final class S { static boolean staticF() { return true; } }"), + "class S { class object { fun staticF() : Boolean { return true } } }" + ); + } + + public void testTwoStaticMethod() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin("final class S { static boolean sB() { return true; } static int sI() { return 1; } }"), + "class S { class object { fun sB() : Boolean { return true } fun sI() : Int { return 1 } } }" + ); + } + + public void testOneStaticMethodOneNonStatic() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin("final class S { boolean sB() { return true; } static int sI() { return 1; } }"), + "class S { class object { fun sI() : Int { return 1 } } fun sB() : Boolean { return true } }" + ); + } + + public void testOneStaticFieldOneNonStatic() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin("final class S { boolean sB() { return true; } static int myI = 10; }"), + "class S { class object { var myI : Int = 10 } fun sB() : Boolean { return true } }" + ); + } } diff --git a/test/org/jetbrains/jet/j2k/ast/TraitTest.java b/test/org/jetbrains/jet/j2k/ast/TraitTest.java index a835f20806d..da081b9102b 100644 --- a/test/org/jetbrains/jet/j2k/ast/TraitTest.java +++ b/test/org/jetbrains/jet/j2k/ast/TraitTest.java @@ -72,4 +72,20 @@ public class TraitTest extends JetTestCaseBase { public void testInternalInterface() throws Exception { Assert.assertEquals(classToSingleLineKotlin("interface Test {}"), "trait Test { }"); } + + public void testInterfaceWithStaticFields() throws Exception { + Assert.assertEquals(classToKotlin( + "public interface INode {" + + " public static final String IN = \"in\";" + + " public static final String AT = \"@\";" + + " public static final String COMMA_WITH_SPACE = COMMA + SPACE;" + + "}" + ), + "public trait INode {\n" + + "public val IN : String? = \"in\"\n" + + "public val AT : String? = \"@\"\n" + + "public val COMMA_WITH_SPACE : String? = (COMMA + SPACE)\n" + + "}" + ); + } } \ No newline at end of file From 2debe4fe155930c329afe7b183b7079d77280c4c Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 3 Nov 2011 16:16:15 +0400 Subject: [PATCH 043/206] static modifier supported for interface members --- src/org/jetbrains/jet/j2k/ast/Trait.java | 6 ------ test/org/jetbrains/jet/j2k/ast/ClassTest.java | 9 ++++++++- test/org/jetbrains/jet/j2k/ast/TraitTest.java | 4 ++++ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/ast/Trait.java b/src/org/jetbrains/jet/j2k/ast/Trait.java index 7a373d74828..c9a580383ff 100644 --- a/src/org/jetbrains/jet/j2k/ast/Trait.java +++ b/src/org/jetbrains/jet/j2k/ast/Trait.java @@ -19,12 +19,6 @@ public class Trait extends Class { return false; } - String bodyToKotlin() { - return AstUtil.joinNodes(myFields, N) + N + - AstUtil.joinNodes(methodsExceptConstructors(), N) + N + - AstUtil.joinNodes(myInnerClasses, N) + N; - } - @NotNull @Override public Kind getKind() { diff --git a/test/org/jetbrains/jet/j2k/ast/ClassTest.java b/test/org/jetbrains/jet/j2k/ast/ClassTest.java index 7218f8d95ab..907183b84eb 100644 --- a/test/org/jetbrains/jet/j2k/ast/ClassTest.java +++ b/test/org/jetbrains/jet/j2k/ast/ClassTest.java @@ -142,4 +142,11 @@ public class ClassTest extends JetTestCaseBase { "class S { class object { var myI : Int = 10 } fun sB() : Boolean { return true } }" ); } -} + + public void testInnerStaticClass() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin("final class S { static class Inner {} }"), + "class S { class object { open class Inner { } } }" + ); + } +} \ No newline at end of file diff --git a/test/org/jetbrains/jet/j2k/ast/TraitTest.java b/test/org/jetbrains/jet/j2k/ast/TraitTest.java index da081b9102b..03966099193 100644 --- a/test/org/jetbrains/jet/j2k/ast/TraitTest.java +++ b/test/org/jetbrains/jet/j2k/ast/TraitTest.java @@ -36,9 +36,11 @@ public class TraitTest extends JetTestCaseBase { "}" ), "trait INode {\n" + + "class object {\n" + "public val IN : String? = \"in\"\n" + "public val AT : String? = \"@\"\n" + "public val COMMA_WITH_SPACE : String? = (COMMA + SPACE)\n" + + "}\n" + "}" ); } @@ -82,9 +84,11 @@ public class TraitTest extends JetTestCaseBase { "}" ), "public trait INode {\n" + + "class object {\n" + "public val IN : String? = \"in\"\n" + "public val AT : String? = \"@\"\n" + "public val COMMA_WITH_SPACE : String? = (COMMA + SPACE)\n" + + "}\n" + "}" ); } From 6a1dac4614da74c34c65de184419088ca54ea49d Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 3 Nov 2011 16:26:31 +0400 Subject: [PATCH 044/206] println removed --- src/org/jetbrains/jet/j2k/Converter.java | 3 --- src/org/jetbrains/jet/j2k/ast/Trait.java | 1 - src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java | 1 - 3 files changed, 5 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index aebf33da9ba..3b74f44da0e 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -149,7 +149,6 @@ public class Converter { return Statement.EMPTY_STATEMENT; final StatementVisitor statementVisitor = new StatementVisitor(); s.accept(statementVisitor); - System.out.println(s.getClass()); return statementVisitor.getResult(); } @@ -168,7 +167,6 @@ public class Converter { return Expression.EMPTY_EXPRESSION; final ExpressionVisitor expressionVisitor = new ExpressionVisitor(); e.accept(expressionVisitor); - System.out.println(e.getClass()); return expressionVisitor.getResult(); } @@ -178,7 +176,6 @@ public class Converter { return Element.EMPTY_ELEMENT; final ElementVisitor elementVisitor = new ElementVisitor(); e.accept(elementVisitor); - System.out.println(e.getClass()); return elementVisitor.getResult(); } diff --git a/src/org/jetbrains/jet/j2k/ast/Trait.java b/src/org/jetbrains/jet/j2k/ast/Trait.java index c9a580383ff..c235aa990ac 100644 --- a/src/org/jetbrains/jet/j2k/ast/Trait.java +++ b/src/org/jetbrains/jet/j2k/ast/Trait.java @@ -1,7 +1,6 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.j2k.util.AstUtil; import java.util.List; import java.util.Set; diff --git a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java index b1e3c62d81b..74c90f6bc5c 100644 --- a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java @@ -21,7 +21,6 @@ public class TypeVisitor extends PsiTypeVisitor implements Visitor { @Override public Type visitType(PsiType type) { - System.out.println(type.getClass()); // TODO: remove if (type instanceof PsiIntersectionType) System.out.println("&"); return super.visitType(type); From ac3d2d6c77233af681caa452f92b003d375938b8 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 3 Nov 2011 16:31:03 +0400 Subject: [PATCH 045/206] cleanup --- src/org/jetbrains/jet/j2k/ast/Member.java | 4 ++-- src/org/jetbrains/jet/j2k/util/AstUtil.java | 2 +- src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java | 6 ------ 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/ast/Member.java b/src/org/jetbrains/jet/j2k/ast/Member.java index 5ef2619092c..a93b8104777 100644 --- a/src/org/jetbrains/jet/j2k/ast/Member.java +++ b/src/org/jetbrains/jet/j2k/ast/Member.java @@ -6,9 +6,9 @@ import java.util.Set; * @author ignatov */ public abstract class Member extends Node implements IMember { - protected Set myModifiers; + Set myModifiers; - protected String accessModifier() { + String accessModifier() { for (String m : myModifiers) if (m.equals(Modifier.PUBLIC) || m.equals(Modifier.PROTECTED) || m.equals(Modifier.PRIVATE)) return m; diff --git a/src/org/jetbrains/jet/j2k/util/AstUtil.java b/src/org/jetbrains/jet/j2k/util/AstUtil.java index 7b2c391fe3c..a4ad4b7f869 100644 --- a/src/org/jetbrains/jet/j2k/util/AstUtil.java +++ b/src/org/jetbrains/jet/j2k/util/AstUtil.java @@ -31,7 +31,7 @@ public class AstUtil { return join(array.toArray(new String[array.size()]), delimiter); } - public static List nodesToKotlin(List nodes) { + private static List nodesToKotlin(List nodes) { List result = new LinkedList(); for (INode n : nodes) result.add(n.toKotlin()); diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index 71dad3c7bc2..07bee58c2c5 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -79,12 +79,6 @@ public class StatementVisitor extends ElementVisitor implements Visitor { ); } - @Override - public void visitEmptyStatement(PsiEmptyStatement statement) { - super.visitEmptyStatement(statement); - myResult = Statement.EMPTY_STATEMENT; - } - @Override public void visitExpressionStatement(PsiExpressionStatement statement) { super.visitExpressionStatement(statement); From d489a350ce9129484eeef61cbe1ee15d33ebdbfd Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 3 Nov 2011 16:36:06 +0400 Subject: [PATCH 046/206] prefix operators supported --- .../jetbrains/jet/j2k/ast/PrefixOperator.java | 22 +++++++++++++++++++ .../jet/j2k/visitors/ExpressionVisitor.java | 11 ++++++---- .../jet/j2k/ast/PrefixOperatorTest.java | 17 ++++++++++++++ 3 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/PrefixOperator.java create mode 100644 test/org/jetbrains/jet/j2k/ast/PrefixOperatorTest.java diff --git a/src/org/jetbrains/jet/j2k/ast/PrefixOperator.java b/src/org/jetbrains/jet/j2k/ast/PrefixOperator.java new file mode 100644 index 00000000000..c94da13002f --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/PrefixOperator.java @@ -0,0 +1,22 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class PrefixOperator extends Expression { + private final String myOp; + private final Expression myExpression; + + public PrefixOperator(String op, Expression expression) { + myOp = op; + myExpression = expression; + } + + @NotNull + @Override + public String toKotlin() { + return "(" + myOp + myExpression.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 13fc4e8a84c..cdd7b86256c 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -205,15 +205,18 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { if (expression.getOperationSign().getTokenType() == JavaTokenType.PLUSPLUS) op = "++"; if (expression.getOperationSign().getTokenType() == JavaTokenType.MINUSMINUS) op = "--"; - myResult = new PostfixOperator( - op, - expressionToExpression(expression.getOperand()) - ); + myResult = new PostfixOperator(op, expressionToExpression(expression.getOperand())); } @Override public void visitPrefixExpression(PsiPrefixExpression expression) { super.visitPrefixExpression(expression); + + String op = ""; + if (expression.getOperationSign().getTokenType() == JavaTokenType.PLUSPLUS) op = "++"; + if (expression.getOperationSign().getTokenType() == JavaTokenType.MINUSMINUS) op = "--"; + + myResult = new PrefixOperator(op, expressionToExpression(expression.getOperand())); } @Override diff --git a/test/org/jetbrains/jet/j2k/ast/PrefixOperatorTest.java b/test/org/jetbrains/jet/j2k/ast/PrefixOperatorTest.java new file mode 100644 index 00000000000..27f312f2fe4 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/PrefixOperatorTest.java @@ -0,0 +1,17 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class PrefixOperatorTest extends JetTestCaseBase { + public void testIncrement() throws Exception { + Assert.assertEquals(statementToKotlin("++i;"), "(++i)"); + } + + public void testDecrement() throws Exception { + Assert.assertEquals(statementToKotlin("--i;"), "(--i)"); + } +} From c714e60b52f3949987300b43e071960b05cc4f46 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 3 Nov 2011 17:17:57 +0400 Subject: [PATCH 047/206] cleanup --- src/org/jetbrains/jet/j2k/ast/Trait.java | 6 ------ .../jetbrains/jet/j2k/visitors/TypeVisitor.java | 15 +++++++-------- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/ast/Trait.java b/src/org/jetbrains/jet/j2k/ast/Trait.java index c235aa990ac..dcf23b4eca7 100644 --- a/src/org/jetbrains/jet/j2k/ast/Trait.java +++ b/src/org/jetbrains/jet/j2k/ast/Trait.java @@ -17,10 +17,4 @@ public class Trait extends Class { boolean needOpenModifier() { return false; } - - @NotNull - @Override - public Kind getKind() { - return Kind.TRAIT; - } } diff --git a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java index 74c90f6bc5c..b64a7d3cc2f 100644 --- a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java @@ -21,8 +21,6 @@ public class TypeVisitor extends PsiTypeVisitor implements Visitor { @Override public Type visitType(PsiType type) { - if (type instanceof PsiIntersectionType) - System.out.println("&"); return super.visitType(type); } @@ -35,7 +33,8 @@ public class TypeVisitor extends PsiTypeVisitor implements Visitor { myResult = new PrimitiveType(new IdentifierImpl("Unit")); else if (Node.PRIMITIVE_TYPES.contains(name)) myResult = new PrimitiveType(new IdentifierImpl(AstUtil.upperFirstCharacter(name))); - else myResult = new PrimitiveType(identifier); + else + myResult = new PrimitiveType(identifier); return super.visitPrimitiveType(primitiveType); } @@ -55,11 +54,6 @@ public class TypeVisitor extends PsiTypeVisitor implements Visitor { return super.visitClassType(classType); } - @Override - public Type visitCapturedWildcardType(PsiCapturedWildcardType capturedWildcardType) { - return super.visitCapturedWildcardType(capturedWildcardType); - } - @Override public Type visitWildcardType(PsiWildcardType wildcardType) { if (wildcardType.isExtends()) @@ -77,6 +71,11 @@ public class TypeVisitor extends PsiTypeVisitor implements Visitor { return super.visitEllipsisType(ellipsisType); } + @Override + public Type visitCapturedWildcardType(PsiCapturedWildcardType capturedWildcardType) { + return super.visitCapturedWildcardType(capturedWildcardType); + } + @Override public Type visitDisjunctionType(PsiDisjunctionType disjunctionType) { return super.visitDisjunctionType(disjunctionType); From 60b43e16f377f9ecd79737216f45101a71ae27f2 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 3 Nov 2011 17:24:01 +0400 Subject: [PATCH 048/206] cleanup --- .../jet/j2k/visitors/ExpressionVisitor.java | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index cdd7b86256c..c34294693ab 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -197,26 +197,27 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { ); } + @NotNull + private String getPlusOrMinus(@NotNull PsiJavaToken token) { + if (token.getTokenType() == JavaTokenType.PLUSPLUS) return "++"; + if (token.getTokenType() == JavaTokenType.MINUSMINUS) return "--"; + return ""; + } + @Override public void visitPostfixExpression(PsiPostfixExpression expression) { super.visitPostfixExpression(expression); - - String op = ""; - if (expression.getOperationSign().getTokenType() == JavaTokenType.PLUSPLUS) op = "++"; - if (expression.getOperationSign().getTokenType() == JavaTokenType.MINUSMINUS) op = "--"; - - myResult = new PostfixOperator(op, expressionToExpression(expression.getOperand())); + myResult = new PostfixOperator( + getPlusOrMinus(expression.getOperationSign()), + expressionToExpression(expression.getOperand())); } @Override public void visitPrefixExpression(PsiPrefixExpression expression) { super.visitPrefixExpression(expression); - - String op = ""; - if (expression.getOperationSign().getTokenType() == JavaTokenType.PLUSPLUS) op = "++"; - if (expression.getOperationSign().getTokenType() == JavaTokenType.MINUSMINUS) op = "--"; - - myResult = new PrefixOperator(op, expressionToExpression(expression.getOperand())); + myResult = new PrefixOperator( + getPlusOrMinus(expression.getOperationSign()), + expressionToExpression(expression.getOperand())); } @Override From 5440a5fab3d6f8e015fa65111ebbca5c30e24fa1 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 3 Nov 2011 17:37:12 +0400 Subject: [PATCH 049/206] instanceof supported, `is` operator added --- src/org/jetbrains/jet/j2k/ast/IsOperator.java | 22 ++++++++++++++++++ .../jetbrains/jet/j2k/ast/TypeElement.java | 20 ++++++++++++++++ .../jet/j2k/visitors/ElementVisitor.java | 6 +++++ .../jet/j2k/visitors/ExpressionVisitor.java | 3 +++ .../jetbrains/jet/j2k/ast/IsOperatorTest.java | 23 +++++++++++++++++++ 5 files changed, 74 insertions(+) create mode 100644 src/org/jetbrains/jet/j2k/ast/IsOperator.java create mode 100644 src/org/jetbrains/jet/j2k/ast/TypeElement.java create mode 100644 test/org/jetbrains/jet/j2k/ast/IsOperatorTest.java diff --git a/src/org/jetbrains/jet/j2k/ast/IsOperator.java b/src/org/jetbrains/jet/j2k/ast/IsOperator.java new file mode 100644 index 00000000000..530cca26c1c --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/IsOperator.java @@ -0,0 +1,22 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class IsOperator extends Expression { + private Expression myExpression; + private Element myTypeElement; + + public IsOperator(Expression expression, Element typeElement) { + myExpression = expression; + myTypeElement = typeElement; + } + + @NotNull + @Override + public String toKotlin() { + return "(" + myExpression.toKotlin() + SPACE + "is" + SPACE + myTypeElement.toKotlin() + ")"; + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/TypeElement.java b/src/org/jetbrains/jet/j2k/ast/TypeElement.java new file mode 100644 index 00000000000..6e3cf2617ca --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/TypeElement.java @@ -0,0 +1,20 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class TypeElement extends Element { + private Type myType; + + public TypeElement(Type type) { + myType = type; + } + + @NotNull + @Override + public String toKotlin() { + return myType.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java index 1a25cc76b5d..0357cb802d1 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java @@ -46,6 +46,12 @@ public class ElementVisitor extends JavaElementVisitor implements Visitor { myResult = new IdentifierImpl(reference.getQualifiedName()); // TODO } + @Override + public void visitTypeElement(PsiTypeElement type) { + super.visitTypeElement(type); + myResult = new TypeElement(typeToType(type.getType())); + } + @Override public void visitTypeParameter(PsiTypeParameter classParameter) { super.visitTypeParameter(classParameter); diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index c34294693ab..bd12a250e72 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -140,6 +140,9 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { @Override public void visitInstanceOfExpression(PsiInstanceOfExpression expression) { super.visitInstanceOfExpression(expression); + myResult = new IsOperator( + expressionToExpression(expression.getOperand()), + elementToElement(expression.getCheckType())); } @Override diff --git a/test/org/jetbrains/jet/j2k/ast/IsOperatorTest.java b/test/org/jetbrains/jet/j2k/ast/IsOperatorTest.java new file mode 100644 index 00000000000..76e7ce2b0fc --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/IsOperatorTest.java @@ -0,0 +1,23 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class IsOperatorTest extends JetTestCaseBase { + public void testSimpleReference() throws Exception { + Assert.assertEquals( + expressionToKotlin("a instanceof String"), + "(a is String?)" + ); + } + + public void testComplicatedExpression() throws Exception { + Assert.assertEquals( + expressionToKotlin("c.getType().getName() instanceof String"), + "(c.getType().getName() is String?)" + ); + } +} From 7db775084c42d9e2ff212e05996ae628c47acd0e Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 3 Nov 2011 18:08:27 +0400 Subject: [PATCH 050/206] override for methods supported --- src/org/jetbrains/jet/j2k/Converter.java | 5 ++++- src/org/jetbrains/jet/j2k/ast/Function.java | 3 +++ src/org/jetbrains/jet/j2k/ast/Modifier.java | 17 +++++++++-------- test/org/jetbrains/jet/j2k/JetTestCaseBase.java | 8 ++++++-- .../org/jetbrains/jet/j2k/ast/FunctionTest.java | 6 ++++++ 5 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 3b74f44da0e..fd4ee431d24 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -97,12 +97,15 @@ public class Converter { @NotNull private static Function methodToFunction(PsiMethod method, boolean notEmpty) { final IdentifierImpl identifier = new IdentifierImpl(method.getName()); - final Set modifiers = modifiersListToModifiersSet(method.getModifierList()); final Type type = typeToType(method.getReturnType()); final Block body = blockToBlock(method.getBody(), notEmpty); final Element params = elementToElement(method.getParameterList()); final List typeParameters = elementsToElementList(method.getTypeParameters()); + final Set modifiers = modifiersListToModifiersSet(method.getModifierList()); + if (method.getHierarchicalMethodSignature().getSuperSignatures().size() > 0) + modifiers.add(Modifier.OVERRIDE); + if (method.isConstructor()) return new Constructor( identifier, diff --git a/src/org/jetbrains/jet/j2k/ast/Function.java b/src/org/jetbrains/jet/j2k/ast/Function.java index 113b2acd129..e8e8ed0433b 100644 --- a/src/org/jetbrains/jet/j2k/ast/Function.java +++ b/src/org/jetbrains/jet/j2k/ast/Function.java @@ -51,6 +51,9 @@ public class Function extends Member { private String modifiersToKotlin() { List modifierList = new LinkedList(); + if (myModifiers.contains(Modifier.OVERRIDE)) + modifierList.add(Modifier.OVERRIDE); + modifierList.add(accessModifier()); if (modifierList.size() > 0) diff --git a/src/org/jetbrains/jet/j2k/ast/Modifier.java b/src/org/jetbrains/jet/j2k/ast/Modifier.java index 4abf460af59..31a85df152a 100644 --- a/src/org/jetbrains/jet/j2k/ast/Modifier.java +++ b/src/org/jetbrains/jet/j2k/ast/Modifier.java @@ -4,12 +4,13 @@ package org.jetbrains.jet.j2k.ast; * @author ignatov */ public abstract class Modifier { - public static String PUBLIC = "public"; - public static String PROTECTED = "protected"; - public static String PRIVATE = "private"; - public static String INTERNAL = "internal"; - public static String STATIC = "static"; - public static String ABSTRACT = "abstract"; - public static String FINAL = "final"; - public static String OPEN = "open"; + public static final String PUBLIC = "public"; + public static final String PROTECTED = "protected"; + public static final String PRIVATE = "private"; + public static final String INTERNAL = "internal"; + public static final String STATIC = "static"; + public static final String ABSTRACT = "abstract"; + public static final String FINAL = "final"; + public static final String OPEN = "open"; + public static final String OVERRIDE = "override"; } diff --git a/test/org/jetbrains/jet/j2k/JetTestCaseBase.java b/test/org/jetbrains/jet/j2k/JetTestCaseBase.java index 813c9de4000..e6a9f34870d 100644 --- a/test/org/jetbrains/jet/j2k/JetTestCaseBase.java +++ b/test/org/jetbrains/jet/j2k/JetTestCaseBase.java @@ -100,12 +100,16 @@ public abstract class JetTestCaseBase extends LightDaemonAnalyzerTestCase { return toSingleLine(classToKotlin(text)); } - String fileToKotlin(String text) throws IOException { + protected String fileToKotlin(String text) throws IOException { configureFromText(text); return prettify(Converter.fileToFile((PsiJavaFile) myFile).toKotlin()); } - String methodToKotlin(String text) throws IOException { + protected String fileToSingleLineKotlin(String text) throws IOException { + return toSingleLine(fileToKotlin(text)); + } + + protected String methodToKotlin(String text) throws IOException { String result = classToKotlin("final class C {" + text + "}") .replaceAll("class C \\{", ""); result = result.substring(0, result.lastIndexOf("}")); diff --git a/test/org/jetbrains/jet/j2k/ast/FunctionTest.java b/test/org/jetbrains/jet/j2k/ast/FunctionTest.java index 3534b1d0655..145d874009d 100644 --- a/test/org/jetbrains/jet/j2k/ast/FunctionTest.java +++ b/test/org/jetbrains/jet/j2k/ast/FunctionTest.java @@ -78,4 +78,10 @@ public class FunctionTest extends JetTestCaseBase { public void testPublic() throws Exception { Assert.assertEquals(methodToSingleLineKotlin("public void test() {}"), "public fun test() : Unit { }"); } + + public void testOverride() throws Exception { + Assert.assertEquals(fileToSingleLineKotlin("class A {void a() {}} final class B extends A {void a() {}}"), + "namespace { open class A { fun a() : Unit { } } class B : A { override fun a() : Unit { } } }"); + } + } \ No newline at end of file From 541a76caef8477ba7db1cb7a5ef8fadc8ed30b75 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Fri, 4 Nov 2011 14:30:18 +0400 Subject: [PATCH 051/206] jdk injected to tests --- jre/lib/annotations.jar | Bin 0 -> 11632 bytes jre/lib/rt.jar | Bin 0 -> 587804 bytes src/org/jetbrains/jet/j2k/Converter.java | 25 ++++++++++++++++-- .../jetbrains/jet/j2k/JetTestCaseBase.java | 2 +- test/org/jetbrains/jet/j2k/ast/EnumTest.java | 9 ++++++- 5 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 jre/lib/annotations.jar create mode 100644 jre/lib/rt.jar diff --git a/jre/lib/annotations.jar b/jre/lib/annotations.jar new file mode 100644 index 0000000000000000000000000000000000000000..5de67805f7b7e97845afa6cd56fd0bef811698cb GIT binary patch literal 11632 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 literal 0 HcmV?d00001 diff --git a/jre/lib/rt.jar b/jre/lib/rt.jar new file mode 100644 index 0000000000000000000000000000000000000000..c6afca0fff4f65c2e80f548f3bb9b6235b3dd5e6 GIT binary patch literal 587804 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

(ZRo)xNlO$EnT}ROd;m^Axr2XKLLq)VklO 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%0DaQBQytj9Q;`HrnT;S zJ?G@4@86*$RYtzGmpPC6xFD^hWSSsvTuMwz3GsI+Cw8h{(+)CJy|2cvRWsgx1~trV z|BXnDlP#aw&Tft9>HN#e2kBijY*Kp}byx*D^3GFT{->S$VMG1FHU7MyX9!oz6sTpC zGQmM$vgbw&lj_CeuekYhq}Rerna+TM)F)wdY63!|(6|%yeJ!Hr{F7;FQB29l;B+3$ z_c_<$YBfBOX*!u^*2qtvTE+mOv!=b3N}Kz)AI{v&Uv6wnLV!OxH5imWMCtso)g^w|<%y{bB9tyc%Z zAw^ZLJJE%sR92Tr3MFEINDVyK)L=c*2%uyofRzXW!A->xVtFFA#4yV%u`pwr`B$lD zGW$P8*xLx~FS=4~16dtTG-h5A;{VC0ZETdGJkNEEDV zDVi`rk96`G+eYFTIG@l08EtG~^Sgo|&;=w8NAK%#iAG0lKDlg9Mjv2sbH^yDeHune z>t5IdQWO_oT?C{LS-EbGuMDZQ�sKdTt@$x_j8aAdhSmd{{#U^bOhu8X1;QmtW-s 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ℜ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 t;>5(), implementsTypes, innerClasses, methods, fieldsToFieldListForEnums(psiClass.getAllFields())); return new Class(name, modifiers, typeParameters, extendsTypes, implementsTypes, innerClasses, methods, fields); } + // TODO: hack for enums + private static List fieldsToFieldListForEnums(PsiField[] fields) { + List result = new LinkedList(); + for (PsiField f : fields) { + if ((f.getName().equals("ordinal") + && f.getType().getCanonicalText().equals("int") + && f.hasModifierProperty(PsiModifier.PRIVATE) + && f.hasModifierProperty(PsiModifier.FINAL) + ) || + (f.getName().equals("name") + && f.getType().getCanonicalText().equals("java.lang.String") + && f.hasModifierProperty(PsiModifier.PRIVATE) + && f.hasModifierProperty(PsiModifier.FINAL) + )) + continue; + + result.add(fieldToField(f)); + } + return result; + } + private static List fieldsToFieldList(PsiField[] fields) { List result = new LinkedList(); for (PsiField f : fields) { @@ -276,4 +297,4 @@ public class Converter { } return modifiersSet; } -} +} \ No newline at end of file diff --git a/test/org/jetbrains/jet/j2k/JetTestCaseBase.java b/test/org/jetbrains/jet/j2k/JetTestCaseBase.java index e6a9f34870d..55fbcc93e91 100644 --- a/test/org/jetbrains/jet/j2k/JetTestCaseBase.java +++ b/test/org/jetbrains/jet/j2k/JetTestCaseBase.java @@ -40,7 +40,7 @@ public abstract class JetTestCaseBase extends LightDaemonAnalyzerTestCase { } private static Sdk jdkFromIdeaHome() { - return new JavaSdkImpl().createJdk("JDK", "compiler/testData/mockJDK-1.7/jre", true); + return new JavaSdkImpl().createJdk("JDK", "jre", true); } @Override diff --git a/test/org/jetbrains/jet/j2k/ast/EnumTest.java b/test/org/jetbrains/jet/j2k/ast/EnumTest.java index 8ff5f66a841..33c561aa10f 100644 --- a/test/org/jetbrains/jet/j2k/ast/EnumTest.java +++ b/test/org/jetbrains/jet/j2k/ast/EnumTest.java @@ -41,7 +41,7 @@ public class EnumTest extends JetTestCaseBase { "RED\n" + "YELLOW\n" + "BLUE\n" + - "fun toString() : String? {\n" + + "override fun toString() : String? {\n" + "return \"COLOR\"\n" + "}\n" + "}" @@ -84,6 +84,13 @@ public class EnumTest extends JetTestCaseBase { ); } + public void testEnumWithNameField() throws Exception { + Assert.assertEquals( + classToKotlin("enum E { I; private String name; }"), + "enum E {\nI\nprivate var name : String?\n}" + ); + } + public void testEnumImplementsSeveralInterfaces() throws Exception { Assert.assertEquals( classToSingleLineKotlin("enum A implements I0, I1, I2 {}"), From 72aa85cb95aa8679cdaf2b02489d04b4675f283f Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Fri, 4 Nov 2011 14:58:20 +0400 Subject: [PATCH 052/206] boxed types supported --- .../jet/j2k/visitors/TypeVisitor.java | 26 +++++++--- .../jetbrains/jet/j2k/ast/BoxedTypeTest.java | 48 +++++++++++++++++++ 2 files changed, 68 insertions(+), 6 deletions(-) create mode 100644 test/org/jetbrains/jet/j2k/ast/BoxedTypeTest.java diff --git a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java index b64a7d3cc2f..7264882b581 100644 --- a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java @@ -34,7 +34,7 @@ public class TypeVisitor extends PsiTypeVisitor implements Visitor { else if (Node.PRIMITIVE_TYPES.contains(name)) myResult = new PrimitiveType(new IdentifierImpl(AstUtil.upperFirstCharacter(name))); else - myResult = new PrimitiveType(identifier); + myResult = new PrimitiveType(identifier); return super.visitPrimitiveType(primitiveType); } @@ -48,12 +48,26 @@ public class TypeVisitor extends PsiTypeVisitor implements Visitor { @Override public Type visitClassType(PsiClassType classType) { myResult = new ClassType( - new IdentifierImpl(classType.getClassName()), + new IdentifierImpl(getClassTypeName(classType)), typesToTypeList(classType.getParameters()) ); return super.visitClassType(classType); } + @NotNull + private String getClassTypeName(@NotNull PsiClassType classType) { + String canonicalTypeStr = classType.getCanonicalText(); + if (canonicalTypeStr.equals("java.lang.Byte")) return "Byte"; + if (canonicalTypeStr.equals("java.lang.Character")) return "Char"; + if (canonicalTypeStr.equals("java.lang.Double")) return "Double"; + if (canonicalTypeStr.equals("java.lang.Float")) return "Float"; + if (canonicalTypeStr.equals("java.lang.Integer")) return "Int"; + if (canonicalTypeStr.equals("java.lang.Long")) return "Long"; + if (canonicalTypeStr.equals("java.lang.Short")) return "Short"; + if (canonicalTypeStr.equals("java.lang.Boolean")) return "Boolean"; + return classType.getClassName(); + } + @Override public Type visitWildcardType(PsiWildcardType wildcardType) { if (wildcardType.isExtends()) @@ -71,10 +85,10 @@ public class TypeVisitor extends PsiTypeVisitor implements Visitor { return super.visitEllipsisType(ellipsisType); } - @Override - public Type visitCapturedWildcardType(PsiCapturedWildcardType capturedWildcardType) { - return super.visitCapturedWildcardType(capturedWildcardType); - } + @Override + public Type visitCapturedWildcardType(PsiCapturedWildcardType capturedWildcardType) { + return super.visitCapturedWildcardType(capturedWildcardType); + } @Override public Type visitDisjunctionType(PsiDisjunctionType disjunctionType) { diff --git a/test/org/jetbrains/jet/j2k/ast/BoxedTypeTest.java b/test/org/jetbrains/jet/j2k/ast/BoxedTypeTest.java new file mode 100644 index 00000000000..3afaa44806e --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/BoxedTypeTest.java @@ -0,0 +1,48 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class BoxedTypeTest extends JetTestCaseBase { + public void testBoolean() throws Exception { + Assert.assertEquals(statementToKotlin("Boolean i = 10;"), "var i : Boolean? = 10"); + } + + public void testByte() throws Exception { + Assert.assertEquals(statementToKotlin("Byte i = 10;"), "var i : Byte? = 10"); + } + + public void testCharacter() throws Exception { + Assert.assertEquals(statementToKotlin("Character i = 10;"), "var i : Char? = 10"); + } + + public void testDouble() throws Exception { + Assert.assertEquals(statementToKotlin("Double i = 10;"), "var i : Double? = 10"); + } + + public void testFloat() throws Exception { + Assert.assertEquals(statementToKotlin("Float i = 10;"), "var i : Float? = 10"); + } + + public void testInteger() throws Exception { + Assert.assertEquals(statementToKotlin("Integer i = 10;"), "var i : Int? = 10"); + } + + public void testLong() throws Exception { + Assert.assertEquals(statementToKotlin("Long i = 10;"), "var i : Long? = 10"); + } + + public void testShort() throws Exception { + Assert.assertEquals(statementToKotlin("Short i = 10;"), "var i : Short? = 10"); + } + +// public void testNewInteger() throws Exception { +// Assert.assertEquals( +// statementToKotlin("Integer i = new Integer(10);"), +// "var i : Int? = Integer(10).toInt()" +// ); +// } +} From 74230b70e505404ec2efa49a726bff18f63196ab Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Fri, 4 Nov 2011 15:03:08 +0400 Subject: [PATCH 053/206] java.lang.Object converted to Any? --- src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java | 1 + test/org/jetbrains/jet/j2k/JetTestCaseBase.java | 2 +- test/org/jetbrains/jet/j2k/ast/BoxedTypeTest.java | 4 ++++ test/org/jetbrains/jet/j2k/ast/TypeParametersTest.java | 4 ++-- test/org/jetbrains/jet/j2k/ast/VarArgTest.java | 4 ++-- 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java index 7264882b581..b7878e33629 100644 --- a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java @@ -57,6 +57,7 @@ public class TypeVisitor extends PsiTypeVisitor implements Visitor { @NotNull private String getClassTypeName(@NotNull PsiClassType classType) { String canonicalTypeStr = classType.getCanonicalText(); + if (canonicalTypeStr.equals("java.lang.Object")) return "Any"; if (canonicalTypeStr.equals("java.lang.Byte")) return "Byte"; if (canonicalTypeStr.equals("java.lang.Character")) return "Char"; if (canonicalTypeStr.equals("java.lang.Double")) return "Double"; diff --git a/test/org/jetbrains/jet/j2k/JetTestCaseBase.java b/test/org/jetbrains/jet/j2k/JetTestCaseBase.java index 55fbcc93e91..71aa8696bc1 100644 --- a/test/org/jetbrains/jet/j2k/JetTestCaseBase.java +++ b/test/org/jetbrains/jet/j2k/JetTestCaseBase.java @@ -133,7 +133,7 @@ public abstract class JetTestCaseBase extends LightDaemonAnalyzerTestCase { protected String expressionToKotlin(String code) throws Exception { String result = statementToKotlin("Object o =" + code + "}"); - result = result.replaceFirst("var o : Object\\? =", ""); + result = result.replaceFirst("var o : Any\\? =", ""); return prettify(result); } diff --git a/test/org/jetbrains/jet/j2k/ast/BoxedTypeTest.java b/test/org/jetbrains/jet/j2k/ast/BoxedTypeTest.java index 3afaa44806e..f9c58660380 100644 --- a/test/org/jetbrains/jet/j2k/ast/BoxedTypeTest.java +++ b/test/org/jetbrains/jet/j2k/ast/BoxedTypeTest.java @@ -7,6 +7,10 @@ import org.jetbrains.jet.j2k.JetTestCaseBase; * @author ignatov */ public class BoxedTypeTest extends JetTestCaseBase { + public void testObject() throws Exception { + Assert.assertEquals(statementToKotlin("Object i = 10;"), "var i : Any? = 10"); + } + public void testBoolean() throws Exception { Assert.assertEquals(statementToKotlin("Boolean i = 10;"), "var i : Boolean? = 10"); } diff --git a/test/org/jetbrains/jet/j2k/ast/TypeParametersTest.java b/test/org/jetbrains/jet/j2k/ast/TypeParametersTest.java index 1473dd6213e..62ff6346b73 100644 --- a/test/org/jetbrains/jet/j2k/ast/TypeParametersTest.java +++ b/test/org/jetbrains/jet/j2k/ast/TypeParametersTest.java @@ -25,7 +25,7 @@ public class TypeParametersTest extends JetTestCaseBase { Assert.assertEquals( methodToSingleLineKotlin( "> T max(Collection coll) {}"), - "fun max(coll : Collection?) : T? where T : Comparable? { }" + "fun max(coll : Collection?) : T? where T : Comparable? { }" ); } @@ -33,7 +33,7 @@ public class TypeParametersTest extends JetTestCaseBase { Assert.assertEquals( methodToSingleLineKotlin( ", K extends Node & Collection> T max(Collection coll) {}"), - "fun max(coll : Collection?) : T? where T : Comparable?, K : Collection? { }" + "fun max(coll : Collection?) : T? where T : Comparable?, K : Collection? { }" ); } diff --git a/test/org/jetbrains/jet/j2k/ast/VarArgTest.java b/test/org/jetbrains/jet/j2k/ast/VarArgTest.java index a54c4a78abf..fc3d43f1053 100644 --- a/test/org/jetbrains/jet/j2k/ast/VarArgTest.java +++ b/test/org/jetbrains/jet/j2k/ast/VarArgTest.java @@ -10,14 +10,14 @@ public class VarArgTest extends JetTestCaseBase { public void testEllipsisTypeSingleParams() throws Exception { Assert.assertEquals( methodToSingleLineKotlin("void pushAll(Object... objs) {}"), - "fun pushAll(vararg objs : Object?) : Unit { }" + "fun pushAll(vararg objs : Any?) : Unit { }" ); } public void testEllipsisTypeSeveralParams() throws Exception { Assert.assertEquals( methodToSingleLineKotlin("String format(String pattern, Object... arguments);"), - "fun format(pattern : String?, vararg arguments : Object?) : String?" + "fun format(pattern : String?, vararg arguments : Any?) : String?" ); } } From 8b3a02cc4f71a42944342eb53985f1a074f09fa0 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Fri, 4 Nov 2011 15:15:55 +0400 Subject: [PATCH 054/206] some test added to TypeCastExpressionTest --- .../jet/j2k/ast/TypeCastExpressionTest.java | 62 ++++++++++--------- 1 file changed, 34 insertions(+), 28 deletions(-) diff --git a/test/org/jetbrains/jet/j2k/ast/TypeCastExpressionTest.java b/test/org/jetbrains/jet/j2k/ast/TypeCastExpressionTest.java index 0d89429f02e..71e41ec4dfc 100644 --- a/test/org/jetbrains/jet/j2k/ast/TypeCastExpressionTest.java +++ b/test/org/jetbrains/jet/j2k/ast/TypeCastExpressionTest.java @@ -28,32 +28,38 @@ public class TypeCastExpressionTest extends JetTestCaseBase { ); } -// TODO: add support for generics and uncomment -// public void testSimpleGenericCast() throws Exception { -// Assert.assertEquals( -// expressionToKotlin("(List)list"), -// "(list as List)" -// ); -// } -// -// public void testExtendsWildcardCast() throws Exception { -// Assert.assertEquals( -// expressionToKotlin("(List)list"), -// "(list as List)" -// ); -// } -// -// public void testSuperWildcardCast() throws Exception { -// Assert.assertEquals( -// expressionToKotlin("(List)list"), -// "(list as List)" -// ); -// } -// -// public void testWildcardCast() throws Exception { -// Assert.assertEquals( -// expressionToKotlin("(List)list"), -// "(list as List<*>)" -// ); -// } + public void testPrimitiveType() throws Exception { + Assert.assertEquals( + expressionToKotlin("(int)100.00;"), + "(100.00 as Int)" + ); + } + + public void testSimpleGenericCast() throws Exception { + Assert.assertEquals( + expressionToKotlin("(List)list"), + "(list as List?)" + ); + } + + public void testExtendsWildcardCast() throws Exception { + Assert.assertEquals( + expressionToKotlin("(List)list"), + "(list as List?)" + ); + } + + public void testSuperWildcardCast() throws Exception { + Assert.assertEquals( + expressionToKotlin("(List)list"), + "(list as List?)" + ); + } + + public void testWildcardCast() throws Exception { + Assert.assertEquals( + expressionToKotlin("(List)list"), + "(list as List<*>?)" + ); + } } \ No newline at end of file From d5460b28702e101f0b7223e00a729640c74e6e66 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Fri, 4 Nov 2011 16:49:12 +0400 Subject: [PATCH 055/206] PolyadicExpression supported --- .../jet/j2k/ast/PolyadicExpression.java | 26 ++++++++ .../jet/j2k/visitors/ExpressionVisitor.java | 61 ++++++++++++------- test/org/jetbrains/jet/j2k/ast/EnumTest.java | 58 +++++++++++------- .../jet/j2k/ast/PolyadicExpressionTest.java | 29 +++++++++ 4 files changed, 130 insertions(+), 44 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/PolyadicExpression.java create mode 100644 test/org/jetbrains/jet/j2k/ast/PolyadicExpressionTest.java diff --git a/src/org/jetbrains/jet/j2k/ast/PolyadicExpression.java b/src/org/jetbrains/jet/j2k/ast/PolyadicExpression.java new file mode 100644 index 00000000000..a1a8398af7c --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/PolyadicExpression.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 PolyadicExpression extends Expression { + private List myExpressions; + private String myToken; + + public PolyadicExpression(List expressions, String token) { + super(); + myExpressions = expressions; + myToken = token; + } + + @NotNull + @Override + public String toKotlin() { + return "(" + AstUtil.joinNodes(myExpressions, SPACE + myToken + SPACE) + ")"; + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index bd12a250e72..4483b754779 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -85,15 +85,31 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { } } - private String getOperatorString(PsiJavaToken op) { - if (op.getTokenType() == JavaTokenType.GTGT) return "shr"; - if (op.getTokenType() == JavaTokenType.LTLT) return "shl"; - if (op.getTokenType() == JavaTokenType.XOR) return "xor"; - if (op.getTokenType() == JavaTokenType.AND) return "and"; - if (op.getTokenType() == JavaTokenType.OR) return "or"; - if (op.getTokenType() == JavaTokenType.OR) return "or"; + @NotNull + private String getOperatorString(@NotNull IElementType tokenType) { + if (tokenType == JavaTokenType.PLUS) return "+"; + if (tokenType == JavaTokenType.MINUS) return "-"; + if (tokenType == JavaTokenType.ASTERISK) return "*"; + if (tokenType == JavaTokenType.DIV) return "/"; + if (tokenType == JavaTokenType.PERC) return "%"; + if (tokenType == JavaTokenType.GTGT) return "shr"; + if (tokenType == JavaTokenType.LTLT) return "shl"; + if (tokenType == JavaTokenType.XOR) return "xor"; + if (tokenType == JavaTokenType.AND) return "and"; + if (tokenType == JavaTokenType.OR) return "or"; + if (tokenType == JavaTokenType.OR) return "or"; + if (tokenType == JavaTokenType.GT) return ">"; + if (tokenType == JavaTokenType.LT) return "<"; + if (tokenType == JavaTokenType.GE) return ">="; + if (tokenType == JavaTokenType.LE) return "<="; + if (tokenType == JavaTokenType.NE) return "!="; + if (tokenType == JavaTokenType.ANDAND) return "&&"; + if (tokenType == JavaTokenType.OROR) return "||"; + if (tokenType == JavaTokenType.PLUSPLUS) return "++"; + if (tokenType == JavaTokenType.MINUSMINUS) return "--"; - return op.getText(); + System.out.println("UNSUPPORTED TOKEN TYPE: " + tokenType.toString()); + return ""; } @Override @@ -110,7 +126,7 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { new BinaryExpression( expressionToExpression(expression.getLOperand()), expressionToExpression(expression.getROperand()), - getOperatorString(expression.getOperationSign()) + getOperatorString(expression.getOperationSign().getTokenType()) ); } @@ -200,27 +216,22 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { ); } - @NotNull - private String getPlusOrMinus(@NotNull PsiJavaToken token) { - if (token.getTokenType() == JavaTokenType.PLUSPLUS) return "++"; - if (token.getTokenType() == JavaTokenType.MINUSMINUS) return "--"; - return ""; - } - @Override public void visitPostfixExpression(PsiPostfixExpression expression) { super.visitPostfixExpression(expression); myResult = new PostfixOperator( - getPlusOrMinus(expression.getOperationSign()), - expressionToExpression(expression.getOperand())); + getOperatorString(expression.getOperationSign().getTokenType()), + expressionToExpression(expression.getOperand()) + ); } @Override public void visitPrefixExpression(PsiPrefixExpression expression) { super.visitPrefixExpression(expression); myResult = new PrefixOperator( - getPlusOrMinus(expression.getOperationSign()), - expressionToExpression(expression.getOperand())); + getOperatorString(expression.getOperationSign().getTokenType()), + expressionToExpression(expression.getOperand()) + ); } @Override @@ -255,5 +266,13 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { @Override public void visitPolyadicExpression(PsiPolyadicExpression expression) { super.visitPolyadicExpression(expression); + if (expression.getOperationTokenType() != JavaTokenType.GTGTGT) + myResult = new PolyadicExpression( + expressionsToExpressionList(expression.getOperands()), + getOperatorString(expression.getOperationTokenType()) + ); + else { + // TODO: support GTGTGT + } + } } -} diff --git a/test/org/jetbrains/jet/j2k/ast/EnumTest.java b/test/org/jetbrains/jet/j2k/ast/EnumTest.java index 33c561aa10f..b7de6a939ec 100644 --- a/test/org/jetbrains/jet/j2k/ast/EnumTest.java +++ b/test/org/jetbrains/jet/j2k/ast/EnumTest.java @@ -48,7 +48,7 @@ public class EnumTest extends JetTestCaseBase { ); } - public void testFields() throws Exception { + public void testFieldsWithPrimaryPrivateConstructor() throws Exception { Assert.assertEquals( classToKotlin( "enum Color {\n" + @@ -56,20 +56,23 @@ public class EnumTest extends JetTestCaseBase { "\n" + " private int code;\n" + "\n" + - " private Color(int c) {\n" + // TODO: private constructor, WTF? + " private Color(int c) {\n" + " code = c;\n" + " }\n" + "\n" + " public int getCode() {\n" + " return code;\n" + " }"), - "enum Color(c : Int) {\n" + + "enum Color {\n" + "WHITE(21)\n" + "BLACK(22)\n" + "RED(23)\n" + "YELLOW(24)\n" + "BLUE(25)\n" + "private var code : Int\n" + + "private (c : Int) {\n" + + "code = c\n" + + "}\n" + "public fun getCode() : Int {\n" + "return code\n" + "}\n" + @@ -85,11 +88,11 @@ public class EnumTest extends JetTestCaseBase { } public void testEnumWithNameField() throws Exception { - Assert.assertEquals( - classToKotlin("enum E { I; private String name; }"), - "enum E {\nI\nprivate var name : String?\n}" - ); - } + Assert.assertEquals( + classToKotlin("enum E { I; private String name; }"), + "enum E {\nI\nprivate var name : String?\n}" + ); + } public void testEnumImplementsSeveralInterfaces() throws Exception { Assert.assertEquals( @@ -129,19 +132,28 @@ public class EnumTest extends JetTestCaseBase { // "" // TODO: will fail // ); // } -// -// public void testInterfaceImplementation() throws Exception { -// Assert.assertEquals( -// classToKotlin( -// "enum Color implements Runnable {\n" + -// " WHITE, BLACK, RED, YELLOW, BLUE;\n" + -// "\n" + -// " public void run() {\n" + -// " System.out.println(\"name()=\" + name() +\n" + -// " \", toString()=\" + toString());\n" + -// " }\n" + -// "}"), -// "" -// ); -// } + + public void testRunnableImplementation() throws Exception { + Assert.assertEquals( + classToKotlin( + "enum Color implements Runnable {\n" + + " WHITE, BLACK, RED, YELLOW, BLUE;\n" + + "\n" + + " public void run() {\n" + + " System.out.println(\"name()=\" + name() +\n" + + " \", toString()=\" + toString());\n" + + " }\n" + + "}"), + "enum Color : Runnable {\n" + + "WHITE\n" + + "BLACK\n" + + "RED\n" + + "YELLOW\n" + + "BLUE\n" + + "override public fun run() : Unit {\n" + + "System.out.println((\"name()=\" + name() + \", toString()=\" + toString()))\n" + + "}\n" + + "}" + ); + } } diff --git a/test/org/jetbrains/jet/j2k/ast/PolyadicExpressionTest.java b/test/org/jetbrains/jet/j2k/ast/PolyadicExpressionTest.java new file mode 100644 index 00000000000..c707c50870d --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/PolyadicExpressionTest.java @@ -0,0 +1,29 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class PolyadicExpressionTest extends JetTestCaseBase { + public void testMultiply() throws Exception { + Assert.assertEquals(expressionToKotlin("1 * 2 * 3"), "(1 * 2 * 3)"); + } + + public void testDivide() throws Exception { + Assert.assertEquals(expressionToKotlin("1 / 2 / 3"), "(1 / 2 / 3)"); + } + + public void testRemainder() throws Exception { + Assert.assertEquals(expressionToKotlin("1 % 2 % 3"), "(1 % 2 % 3)"); + } + + public void testPlus() throws Exception { + Assert.assertEquals(expressionToKotlin("1 + 2 + 3"), "(1 + 2 + 3)"); + } + + public void testMinus() throws Exception { + Assert.assertEquals(expressionToKotlin("1 - 2 - 3"), "(1 - 2 - 3)"); + } +} From 8789d2b1795dda278d5e04505900e21ac607579d Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Fri, 4 Nov 2011 16:49:29 +0400 Subject: [PATCH 056/206] enum primary constructor fixed --- src/org/jetbrains/jet/j2k/ast/Constructor.java | 2 +- src/org/jetbrains/jet/j2k/ast/Enum.java | 3 ++- src/org/jetbrains/jet/j2k/ast/Function.java | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/ast/Constructor.java b/src/org/jetbrains/jet/j2k/ast/Constructor.java index 8e4c257ad5a..3e97cadd26f 100644 --- a/src/org/jetbrains/jet/j2k/ast/Constructor.java +++ b/src/org/jetbrains/jet/j2k/ast/Constructor.java @@ -14,7 +14,7 @@ public class Constructor extends Function { } public String primary() { - return "(" + myParams.toKotlin() + ")"; + return modifiersToKotlin() + "(" + myParams.toKotlin() + ")" + SPACE + myBlock.toKotlin(); } @NotNull diff --git a/src/org/jetbrains/jet/j2k/ast/Enum.java b/src/org/jetbrains/jet/j2k/ast/Enum.java index 6a0fd5a3524..f16a7393718 100644 --- a/src/org/jetbrains/jet/j2k/ast/Enum.java +++ b/src/org/jetbrains/jet/j2k/ast/Enum.java @@ -33,8 +33,9 @@ public class Enum extends Class { @NotNull @Override public String toKotlin() { - return modifiersToKotlin() + "enum" + SPACE + myName.toKotlin() + typeParametersToKotlin() + primaryConstructorToKotlin() + implementTypesToKotlin() + SPACE + "{" + N + + return modifiersToKotlin() + "enum" + SPACE + myName.toKotlin() + typeParametersToKotlin() + implementTypesToKotlin() + SPACE + "{" + N + AstUtil.joinNodes(myFields, N) + N + + primaryConstructorToKotlin() + N + AstUtil.joinNodes(methodsExceptConstructors(), N) + N + AstUtil.joinNodes(myInnerClasses, N) + N + "}"; diff --git a/src/org/jetbrains/jet/j2k/ast/Function.java b/src/org/jetbrains/jet/j2k/ast/Function.java index e8e8ed0433b..cd9d435cf71 100644 --- a/src/org/jetbrains/jet/j2k/ast/Function.java +++ b/src/org/jetbrains/jet/j2k/ast/Function.java @@ -15,7 +15,7 @@ public class Function extends Member { private final Type myType; private final List myTypeParameters; final Element myParams; - private final Block myBlock; + final Block myBlock; public Function(Identifier name, Set modifiers, Type type, List typeParameters, Element params, Block block) { myName = name; @@ -48,7 +48,7 @@ public class Function extends Member { return EMPTY; } - private String modifiersToKotlin() { + String modifiersToKotlin() { List modifierList = new LinkedList(); if (myModifiers.contains(Modifier.OVERRIDE)) From f8adc882999ba35b796081625d3ae1066cdaad1e Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Fri, 4 Nov 2011 17:31:24 +0400 Subject: [PATCH 057/206] move FileTest.java to j2k.ast --- j2k.ipr | 2 ++ test/org/jetbrains/jet/j2k/JetTestCaseBase.java | 2 +- test/org/jetbrains/jet/j2k/{ => ast}/FileTest.java | 3 ++- 3 files changed, 5 insertions(+), 2 deletions(-) rename test/org/jetbrains/jet/j2k/{ => ast}/FileTest.java (95%) diff --git a/j2k.ipr b/j2k.ipr index 5eb415d5cc6..c7e7afb9ac9 100644 --- a/j2k.ipr +++ b/j2k.ipr @@ -30,6 +30,7 @@ + @@ -165,5 +166,6 @@ + diff --git a/test/org/jetbrains/jet/j2k/JetTestCaseBase.java b/test/org/jetbrains/jet/j2k/JetTestCaseBase.java index 71aa8696bc1..9732820ad6d 100644 --- a/test/org/jetbrains/jet/j2k/JetTestCaseBase.java +++ b/test/org/jetbrains/jet/j2k/JetTestCaseBase.java @@ -197,7 +197,7 @@ public abstract class JetTestCaseBase extends LightDaemonAnalyzerTestCase { } @NotNull - static String toSingleLine(String string) { + public static String toSingleLine(String string) { return prettify(string.replaceAll("\n", " ")); } } \ No newline at end of file diff --git a/test/org/jetbrains/jet/j2k/FileTest.java b/test/org/jetbrains/jet/j2k/ast/FileTest.java similarity index 95% rename from test/org/jetbrains/jet/j2k/FileTest.java rename to test/org/jetbrains/jet/j2k/ast/FileTest.java index fe4d2d074f6..75d5a05a6da 100644 --- a/test/org/jetbrains/jet/j2k/FileTest.java +++ b/test/org/jetbrains/jet/j2k/ast/FileTest.java @@ -1,6 +1,7 @@ -package org.jetbrains.jet.j2k; +package org.jetbrains.jet.j2k.ast; import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; /** * @author ignatov From 433405c4e15e6ac4198512ac5e354cbb5eac968b Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Fri, 4 Nov 2011 20:16:37 +0400 Subject: [PATCH 058/206] now we read tests files from directories --- ...se.java => JavaToKotlinConverterTest.java} | 180 ++++++++---------- .../jetbrains/jet/j2k/TestCaseBuilder.java | 91 +++++++++ .../j2k/ast/ArrayAccessExpressionTest.java | 21 -- .../ast/ArrayInitializerExpressionTest.java | 45 ----- .../jetbrains/jet/j2k/ast/ArrayTypeTest.java | 65 ------- .../jet/j2k/ast/AssertStatementTest.java | 30 --- .../jet/j2k/ast/AssignmentExpressionTest.java | 61 ------ .../jet/j2k/ast/BinaryExpressionTest.java | 81 -------- .../jetbrains/jet/j2k/ast/BoxedTypeTest.java | 52 ----- .../jet/j2k/ast/BreakStatementTest.java | 23 --- test/org/jetbrains/jet/j2k/ast/ClassTest.java | 152 --------------- .../j2k/ast/ConditionalExpressionTest.java | 19 -- .../jet/j2k/ast/ContinueStatementTest.java | 23 --- .../jet/j2k/ast/DeclarationStatementTest.java | 55 ------ .../jet/j2k/ast/DoWhileStatementTest.java | 45 ----- test/org/jetbrains/jet/j2k/ast/EnumTest.java | 159 ---------------- test/org/jetbrains/jet/j2k/ast/FieldTest.java | 46 ----- test/org/jetbrains/jet/j2k/ast/FileTest.java | 68 ------- test/org/jetbrains/jet/j2k/ast/ForTest.java | 115 ----------- .../jet/j2k/ast/ForeachStatementTest.java | 41 ---- .../jetbrains/jet/j2k/ast/FunctionTest.java | 87 --------- .../jet/j2k/ast/IdentifierImplTest.java | 11 -- .../jet/j2k/ast/IfStatementTest.java | 57 ------ .../jet/j2k/ast/InProjectionTypeTest.java | 16 -- .../jetbrains/jet/j2k/ast/IsOperatorTest.java | 23 --- .../jet/j2k/ast/LabelStatementTest.java | 58 ------ .../jet/j2k/ast/LocalVariableTest.java | 16 -- .../jet/j2k/ast/MethodCallExpressionTest.java | 27 --- .../jet/j2k/ast/NewClassExpressionTest.java | 25 --- .../jet/j2k/ast/OutProjectionTypeTest.java | 16 -- .../j2k/ast/ParenthesizedExpressionTest.java | 17 -- .../jet/j2k/ast/PolyadicExpressionTest.java | 29 --- .../jet/j2k/ast/PostfixOperatorTest.java | 17 -- .../jet/j2k/ast/PrefixOperatorTest.java | 17 -- .../jet/j2k/ast/ReturnStatementTest.java | 37 ---- .../jet/j2k/ast/StarProjectionTypeTest.java | 16 -- .../j2k/ast/SynchronizedStatementTest.java | 16 -- .../jet/j2k/ast/ThrowStatementTest.java | 14 -- test/org/jetbrains/jet/j2k/ast/TraitTest.java | 95 --------- .../jet/j2k/ast/TryStatementTest.java | 111 ----------- .../jet/j2k/ast/TypeCastExpressionTest.java | 65 ------- .../jet/j2k/ast/TypeParametersTest.java | 91 --------- .../org/jetbrains/jet/j2k/ast/VarArgTest.java | 23 --- .../jet/j2k/ast/WhileStatementTest.java | 41 ---- .../expression/expressionIndex.jav | 1 + .../expression/expressionIndex.kt | 1 + .../expression/intIndex.jav | 1 + .../expression/intIndex.kt | 1 + .../expression/variableIndex.jav | 1 + .../expression/variableIndex.kt | 1 + .../expression/newInt.jav | 1 + .../expression/newInt.kt | 1 + .../expression/oneDim.jav | 1 + .../expression/oneDim.kt | 1 + .../expression/oneDimWithVariables.jav | 1 + .../expression/oneDimWithVariables.kt | 1 + .../expression/twoDim.jav | 1 + .../expression/twoDim.kt | 1 + testData/arrayType/method/methodArrayArgs.jav | 1 + testData/arrayType/method/methodArrayArgs.kt | 1 + .../arrayInitializationStatement.jav | 1 + .../statement/arrayInitializationStatement.kt | 1 + ...ayInitializationStatementWithDimension.jav | 1 + ...rayInitializationStatementWithDimension.kt | 1 + .../arrayType/statement_mult/doubleArray.jav | 1 + .../arrayType/statement_mult/doubleArray.kt | 1 + .../arrayType/statement_mult/longArray.jav | 1 + .../arrayType/statement_mult/longArray.kt | 1 + .../arrayType/statement_mult/newIntArray.jav | 1 + .../arrayType/statement_mult/newIntArray.kt | 1 + .../statement_mult/newStringArray.jav | 1 + .../statement_mult/newStringArray.kt | 1 + .../statement_mult/onlyCondition.jav | 1 + .../statement_mult/onlyCondition.kt | 1 + .../onlyConditionWithBraces.jav | 1 + .../statement_mult/onlyConditionWithBraces.kt | 1 + .../statement_mult/withStringDetail.jav | 1 + .../statement_mult/withStringDetail.kt | 1 + .../expression_mult/and.jav | 1 + .../expression_mult/and.kt | 1 + .../expression_mult/assignment.jav | 1 + .../expression_mult/assignment.kt | 1 + .../expression_mult/divideAssign.jav | 1 + .../expression_mult/divideAssign.kt | 1 + .../expression_mult/minusAssign.jav | 1 + .../expression_mult/minusAssign.kt | 1 + .../expression_mult/multiplyAssign.jav | 1 + .../expression_mult/multiplyAssign.kt | 1 + .../expression_mult/or.jav | 1 + .../expression_mult/or.kt | 1 + .../expression_mult/plusAssign.jav | 1 + .../expression_mult/plusAssign.kt | 1 + .../expression_mult/reminder.jav | 1 + .../expression_mult/reminder.kt | 1 + .../expression_mult/shiftLeft.jav | 1 + .../expression_mult/shiftLeft.kt | 1 + .../expression_mult/shiftRight.jav | 1 + .../expression_mult/shiftRight.kt | 1 + .../expression_mult/unsignedRightShift.jav | 1 + .../expression_mult/unsignedRightShift.kt | 1 + .../expression_mult/xor.jav | 1 + .../expression_mult/xor.kt | 1 + .../statement/simpleAssignment.jav | 1 + .../statement/simpleAssignment.kt | 1 + .../binaryExpression/expression_mult/and.jav | 1 + .../binaryExpression/expression_mult/and.kt | 1 + .../expression_mult/conditionalAnd.jav | 1 + .../expression_mult/conditionalAnd.kt | 1 + .../expression_mult/conditionalOr.jav | 1 + .../expression_mult/conditionalOr.kt | 1 + .../expression_mult/divide.jav | 1 + .../expression_mult/divide.kt | 1 + .../expression_mult/greaterThan.jav | 1 + .../expression_mult/greaterThan.kt | 1 + .../expression_mult/greaterThanEqual.jav | 1 + .../expression_mult/greaterThanEqual.kt | 1 + .../expression_mult/lessThan.jav | 1 + .../expression_mult/lessThan.kt | 1 + .../expression_mult/lessThanEqual.jav | 1 + .../expression_mult/lessThanEqual.kt | 1 + .../expression_mult/minus.jav | 1 + .../binaryExpression/expression_mult/minus.kt | 1 + .../expression_mult/multiply.jav | 1 + .../expression_mult/multiply.kt | 1 + .../binaryExpression/expression_mult/or.jav | 1 + .../binaryExpression/expression_mult/or.kt | 1 + .../binaryExpression/expression_mult/plus.jav | 1 + .../binaryExpression/expression_mult/plus.kt | 1 + .../expression_mult/remainder.jav | 1 + .../expression_mult/remainder.kt | 1 + .../expression_mult/shiftLeft.jav | 1 + .../expression_mult/shiftLeft.kt | 1 + .../expression_mult/shiftRight.jav | 1 + .../expression_mult/shiftRight.kt | 1 + .../expression_mult/unsignedRightShift.jav | 1 + .../expression_mult/unsignedRightShift.kt | 1 + .../binaryExpression/expression_mult/xor.jav | 1 + .../binaryExpression/expression_mult/xor.kt | 1 + testData/boxedType/statement_mult/boolean.jav | 1 + testData/boxedType/statement_mult/boolean.kt | 1 + testData/boxedType/statement_mult/byte.jav | 1 + testData/boxedType/statement_mult/byte.kt | 1 + .../boxedType/statement_mult/character.jav | 1 + .../boxedType/statement_mult/character.kt | 1 + testData/boxedType/statement_mult/double.jav | 1 + testData/boxedType/statement_mult/double.kt | 1 + testData/boxedType/statement_mult/float.jav | 1 + testData/boxedType/statement_mult/float.kt | 1 + testData/boxedType/statement_mult/integer.jav | 1 + testData/boxedType/statement_mult/integer.kt | 1 + testData/boxedType/statement_mult/long.jav | 1 + testData/boxedType/statement_mult/long.kt | 1 + testData/boxedType/statement_mult/object.jav | 1 + testData/boxedType/statement_mult/object.kt | 1 + testData/boxedType/statement_mult/short.jav | 1 + testData/boxedType/statement_mult/short.kt | 1 + .../statement/breakWithLabel.jav | 1 + .../statement/breakWithLabel.kt | 1 + .../statement/breakWithoutLabel.jav | 1 + .../statement/breakWithoutLabel.kt | 1 + testData/class_/class/class.jav | 1 + testData/class_/class/class.kt | 1 + testData/class_/class/emptyClass.jav | 1 + testData/class_/class/emptyClass.kt | 1 + ...tendsOneClassAndImplementsOneInterface.jav | 1 + ...xtendsOneClassAndImplementsOneInterface.kt | 1 + ...OneClassAndImplementsSeveralInterfaces.jav | 1 + ...sOneClassAndImplementsSeveralInterfaces.kt | 1 + testData/class_/class/finalClass.jav | 1 + testData/class_/class/finalClass.kt | 1 + testData/class_/class/genericClass.jav | 1 + testData/class_/class/genericClass.kt | 1 + testData/class_/class/innerEmptyClass.jav | 1 + testData/class_/class/innerEmptyClass.kt | 1 + testData/class_/class/innerStaticClass.jav | 1 + testData/class_/class/innerStaticClass.kt | 1 + testData/class_/class/internalClass.jav | 1 + testData/class_/class/internalClass.kt | 1 + .../class/oneStaticFieldOneNonStatic.jav | 1 + .../class/oneStaticFieldOneNonStatic.kt | 1 + testData/class_/class/oneStaticMethod.jav | 1 + testData/class_/class/oneStaticMethod.kt | 1 + .../class/oneStaticMethodOneNonStatic.jav | 1 + .../class/oneStaticMethodOneNonStatic.kt | 1 + testData/class_/class/pivateClass.jav | 1 + testData/class_/class/pivateClass.kt | 1 + testData/class_/class/protectedClass.jav | 1 + testData/class_/class/protectedClass.kt | 1 + testData/class_/class/publicClass.jav | 1 + testData/class_/class/publicClass.kt | 1 + testData/class_/class/simpleInheritance.jav | 1 + testData/class_/class/simpleInheritance.kt | 1 + testData/class_/class/twoStaticMethod.jav | 1 + testData/class_/class/twoStaticMethod.kt | 1 + .../class_mult/classWithEmptyMethods.jav | 1 + .../class_mult/classWithEmptyMethods.kt | 8 + .../class_/class_mult/classWithFields.jav | 1 + testData/class_/class_mult/classWithFields.kt | 4 + .../class_mult/classWithMultiplyFields.jav | 1 + .../class_mult/classWithMultiplyFields.kt | 5 + .../simpleConditionalExpression.jav | 1 + .../simpleConditionalExpression.kt | 4 + .../statement/continueWithLabel.jav | 1 + .../statement/continueWithLabel.kt | 1 + .../statement/continueWithoutLabel.jav | 1 + .../statement/continueWithoutLabel.kt | 1 + .../statement/singleFinalIntDeclaration.jav | 1 + .../statement/singleFinalIntDeclaration.kt | 1 + .../singleFinalStringDeclaration.jav | 1 + .../statement/singleFinalStringDeclaration.kt | 1 + .../statement/singleIntDeclaration.jav | 1 + .../statement/singleIntDeclaration.kt | 1 + .../statement/singleStringDeclaration.jav | 1 + .../statement/singleStringDeclaration.kt | 1 + .../multiplyFinalIntDeclaration.jav | 1 + .../multiplyFinalIntDeclaration.kt | 3 + .../statement_mult/multiplyIntDeclaration.jav | 1 + .../statement_mult/multiplyIntDeclaration.kt | 3 + .../statement_mult/whileWithBlock.jav | 1 + .../statement_mult/whileWithBlock.kt | 6 + .../statement_mult/whileWithEmptyBlock.jav | 1 + .../statement_mult/whileWithEmptyBlock.kt | 4 + .../statement_mult/whileWithExpression.jav | 1 + .../statement_mult/whileWithExpression.kt | 3 + .../statement_mult/whileWithReturn.jav | 1 + .../statement_mult/whileWithReturn.kt | 3 + testData/enum/class/emptyEnum.jav | 1 + testData/enum/class/emptyEnum.kt | 1 + .../enum/class/enumImplementsOneInterface.jav | 1 + .../enum/class/enumImplementsOneInterface.kt | 1 + .../class/enumImplementsSeveralInterfaces.jav | 1 + .../class/enumImplementsSeveralInterfaces.kt | 1 + testData/enum/class/internalEnum.jav | 1 + testData/enum/class/internalEnum.kt | 1 + testData/enum/class/privateEnum.jav | 1 + testData/enum/class/privateEnum.kt | 1 + testData/enum/class/protectedEnum.jav | 1 + testData/enum/class/protectedEnum.kt | 1 + testData/enum/class/publicEnum.jav | 1 + testData/enum/class/publicEnum.kt | 1 + .../enum/class_mult/enumWithNameField.jav | 1 + testData/enum/class_mult/enumWithNameField.kt | 4 + .../fieldsWithPrimaryPrivateConstructor.jav | 12 ++ .../fieldsWithPrimaryPrivateConstructor.kt | 14 ++ testData/enum/class_mult/overrideToString.jav | 1 + testData/enum/class_mult/overrideToString.kt | 10 + .../class_mult/runnableImplementation.jav | 8 + .../enum/class_mult/runnableImplementation.kt | 10 + testData/enum/class_mult/typeSafeEnum.jav | 1 + testData/enum/class_mult/typeSafeEnum.kt | 6 + testData/field/method/internalField.jav | 1 + testData/field/method/internalField.kt | 1 + testData/field/method/privateField.jav | 1 + testData/field/method/privateField.kt | 1 + testData/field/method/protectedField.jav | 1 + testData/field/method/protectedField.kt | 1 + testData/field/method/publicField.jav | 1 + testData/field/method/publicField.kt | 1 + testData/field/method/valWithInit.jav | 1 + testData/field/method/valWithInit.kt | 1 + testData/field/method/varWithInit.jav | 1 + testData/field/method/varWithInit.kt | 1 + testData/field/method/varWithoutInit.jav | 1 + testData/field/method/varWithoutInit.kt | 1 + testData/file_/file/packageWithClass.jav | 1 + testData/file_/file/packageWithClass.kt | 1 + testData/file_/file/packageWithClasses.jav | 1 + testData/file_/file/packageWithClasses.kt | 1 + testData/file_/file/packageWithOpenClass.jav | 1 + testData/file_/file/packageWithOpenClass.kt | 1 + .../file_/file_mult/packageWithImports.jav | 1 + .../file_/file_mult/packageWithImports.kt | 4 + .../file_mult/packageWithMixedImports.jav | 1 + .../file_mult/packageWithMixedImports.kt | 4 + .../file_mult/packageWithStaticImports.jav | 1 + .../file_mult/packageWithStaticImports.kt | 4 + .../for/statement_mult/commonCaseForTest.jav | 1 + .../for/statement_mult/commonCaseForTest.kt | 10 + testData/for/statement_mult/forWithBlock.jav | 1 + testData/for/statement_mult/forWithBlock.kt | 13 ++ .../forWithBlockAndDoubleUpdate.jav | 1 + .../forWithBlockAndDoubleUpdate.kt | 14 ++ .../for/statement_mult/forWithEmptyBlock.jav | 1 + .../for/statement_mult/forWithEmptyBlock.kt | 12 ++ .../for/statement_mult/forWithExpression.jav | 1 + .../for/statement_mult/forWithExpression.kt | 10 + testData/for/statement_mult/forWithReturn.jav | 1 + testData/for/statement_mult/forWithReturn.kt | 11 ++ .../statement_mult/enhancedForWithBlock.jav | 1 + .../statement_mult/enhancedForWithBlock.kt | 5 + .../enhancedForWithEmptyBlock.jav | 1 + .../enhancedForWithEmptyBlock.kt | 3 + .../enhancedForWithExpression.jav | 1 + .../enhancedForWithExpression.kt | 2 + .../statement_mult/enhancedForWithReturn.jav | 1 + .../statement_mult/enhancedForWithReturn.kt | 2 + testData/function/file/override.jav | 1 + testData/function/file/override.kt | 1 + .../function/method/classGenericParam.jav | 1 + testData/function/method/classGenericParam.kt | 1 + testData/function/method/emptyVoidMethod.jav | 1 + testData/function/method/emptyVoidMethod.kt | 1 + testData/function/method/internal.jav | 1 + testData/function/method/internal.kt | 1 + testData/function/method/methodClassType.jav | 1 + testData/function/method/methodClassType.kt | 1 + .../function/method/methodPrimitiveType.jav | 1 + .../function/method/methodPrimitiveType.kt | 1 + .../function/method/methodPrimitiveType2.jav | 1 + .../function/method/methodPrimitiveType2.kt | 1 + .../method/methodWithReturnStatement.jav | 1 + .../method/methodWithReturnStatement.kt | 1 + testData/function/method/ownGenericParam.jav | 1 + testData/function/method/ownGenericParam.kt | 1 + .../method/ownSeveralGenericParams.jav | 1 + .../method/ownSeveralGenericParams.kt | 1 + testData/function/method/private.jav | 1 + testData/function/method/private.kt | 1 + testData/function/method/protected.jav | 1 + testData/function/method/protected.kt | 1 + testData/function/method/public.jav | 1 + testData/function/method/public.kt | 1 + .../ifStatementWithEmptyBlocks.jav | 1 + .../ifStatementWithEmptyBlocks.kt | 6 + .../ifStatementWithMultilineBlocks.jav | 1 + .../ifStatementWithMultilineBlocks.kt | 9 + .../ifStatementWithOneLineBlocks.jav | 1 + .../ifStatementWithOneLineBlocks.kt | 4 + .../statement_mult/ifStatementWithoutElse.jav | 1 + .../statement_mult/ifStatementWithoutElse.kt | 5 + .../inProjectionType/method/methodParams.jav | 1 + .../inProjectionType/method/methodParams.kt | 1 + .../expression_mult/complicatedExpression.jav | 1 + .../expression_mult/complicatedExpression.kt | 1 + .../expression_mult/simpleReference.jav | 1 + .../expression_mult/simpleReference.kt | 1 + .../complicatedExampleFromJavaTutorial.jav | 1 + .../complicatedExampleFromJavaTutorial.kt | 27 +++ testData/localVariable/statement/object.jav | 1 + testData/localVariable/statement/object.kt | 1 + .../statement/callWithKeywords.jav | 1 + .../statement/callWithKeywords.kt | 1 + .../statement/emptyCall.jav | 1 + .../statement/emptyCall.kt | 1 + .../statement/simpleCall.jav | 1 + .../statement/simpleCall.kt | 1 + .../expression/classWithParam.jav | 1 + .../expression/classWithParam.kt | 1 + .../expression/classWithParams.jav | 1 + .../expression/classWithParams.kt | 1 + .../expression/classWithoutBody.jav | 1 + .../expression/classWithoutBody.kt | 1 + .../expression/classWithoutBody2.jav | 1 + .../expression/classWithoutBody2.kt | 1 + .../outProjectionType/method/methodParams.jav | 1 + .../outProjectionType/method/methodParams.kt | 1 + .../expression/parenthesized.jav | 1 + .../expression/parenthesized.kt | 1 + .../expression/parenthesized2.jav | 1 + .../expression/parenthesized2.kt | 1 + .../expression_mult/divide.jav | 1 + .../expression_mult/divide.kt | 1 + .../expression_mult/minus.jav | 1 + .../expression_mult/minus.kt | 1 + .../expression_mult/multiply.jav | 1 + .../expression_mult/multiply.kt | 1 + .../expression_mult/plus.jav | 1 + .../expression_mult/plus.kt | 1 + .../expression_mult/remainder.jav | 1 + .../expression_mult/remainder.kt | 1 + .../statement_mult/decrement.jav | 1 + .../statement_mult/decrement.kt | 1 + .../statement_mult/increment.jav | 1 + .../statement_mult/increment.kt | 1 + .../statement_mult/decrement.jav | 1 + .../statement_mult/decrement.kt | 1 + .../statement_mult/increment.jav | 1 + .../statement_mult/increment.kt | 1 + .../returnStatement/statement/returnChar.jav | 1 + .../returnStatement/statement/returnChar.kt | 1 + .../statement/returnLiteral.jav | 1 + .../statement/returnLiteral.kt | 1 + .../statement/returnNumber.jav | 1 + .../returnStatement/statement/returnNumber.kt | 1 + .../statement/returnString.jav | 1 + .../returnStatement/statement/returnString.kt | 1 + .../method/methodParams.jav | 1 + .../starProjectionType/method/methodParams.kt | 1 + .../statement/singleLineExample.jav | 1 + .../statement/singleLineExample.kt | 1 + .../statement/simpleThrowStatement.jav | 1 + .../statement/simpleThrowStatement.kt | 1 + testData/trait/class/emptyInterface.jav | 1 + testData/trait/class/emptyInterface.kt | 1 + ...OneClassAndImplementsSeveralInterfaces.jav | 1 + ...sOneClassAndImplementsSeveralInterfaces.kt | 1 + testData/trait/class/extendsOneInterface.jav | 1 + testData/trait/class/extendsOneInterface.kt | 1 + testData/trait/class/internalInterface.jav | 1 + testData/trait/class/internalInterface.kt | 1 + testData/trait/class/privateInterface.jav | 1 + testData/trait/class/privateInterface.kt | 1 + testData/trait/class/protectedInterface.jav | 1 + testData/trait/class/protectedInterface.kt | 1 + testData/trait/class/publicInterface.jav | 1 + testData/trait/class/publicInterface.kt | 1 + .../trait/class_mult/interfaceWithFields.jav | 1 + .../trait/class_mult/interfaceWithFields.kt | 7 + .../interfaceWithMethodDeclaration.jav | 1 + .../interfaceWithMethodDeclaration.kt | 4 + .../class_mult/interfaceWithStaticFields.jav | 1 + .../class_mult/interfaceWithStaticFields.kt | 7 + .../commonCaseForTryStatement.jav | 1 + .../commonCaseForTryStatement.kt | 14 ++ ...emptyTryWithTwoCatchesWithEmptyFinally.jav | 1 + .../emptyTryWithTwoCatchesWithEmptyFinally.kt | 12 ++ .../emptyTryWithTwoCatchesWithFinally.jav | 1 + .../emptyTryWithTwoCatchesWithFinally.kt | 13 ++ .../emptyTryWithTwoCatchesWithoutFinally.jav | 1 + .../emptyTryWithTwoCatchesWithoutFinally.kt | 9 + .../expression_mult/extendsWildcardCast.jav | 1 + .../expression_mult/extendsWildcardCast.kt | 1 + .../expression_mult/fooCast.jav | 1 + .../expression_mult/fooCast.kt | 1 + .../expression_mult/intCast.jav | 1 + .../expression_mult/intCast.kt | 1 + .../expression_mult/primitiveType.jav | 1 + .../expression_mult/primitiveType.kt | 1 + .../expression_mult/simpleGenericCast.jav | 1 + .../expression_mult/simpleGenericCast.kt | 1 + .../expression_mult/stringCast.jav | 1 + .../expression_mult/stringCast.kt | 1 + .../expression_mult/superWildcardCast.jav | 1 + .../expression_mult/superWildcardCast.kt | 1 + .../expression_mult/wildcardCast.jav | 1 + .../expression_mult/wildcardCast.kt | 1 + ...ametrizationWithTwoBoundsWithExtending.jav | 1 + ...rametrizationWithTwoBoundsWithExtending.kt | 1 + .../classParametrizationWithTwoBounds.jav | 1 + .../classParametrizationWithTwoBounds.kt | 1 + ...ametrizationWithTwoBoundsWithExtending.jav | 1 + ...rametrizationWithTwoBoundsWithExtending.kt | 1 + .../complexExampleWithClassExtending.jav | 1 + .../class/complexExampleWithClassExtending.kt | 1 + ...mplexExampleWithClassMultiplyExtending.jav | 1 + ...omplexExampleWithClassMultiplyExtending.kt | 1 + .../typeParameters/class/genericClass.jav | 1 + testData/typeParameters/class/genericClass.kt | 1 + ...ametrizationWithTwoBoundsWithExtending.jav | 1 + ...rametrizationWithTwoBoundsWithExtending.kt | 1 + ...thodDoubleParametrizationWithTwoBounds.jav | 1 + ...ethodDoubleParametrizationWithTwoBounds.kt | 1 + testData/typeParameters/method/where.jav | 1 + testData/typeParameters/method/where.kt | 1 + .../statement_mult/genericParam.jav | 1 + .../statement_mult/genericParam.kt | 1 + .../statement_mult/manyGenericParams.jav | 1 + .../statement_mult/manyGenericParams.kt | 1 + .../method/ellipsisTypeSeveralParams.jav | 1 + .../method/ellipsisTypeSeveralParams.kt | 1 + .../method/ellipsisTypeSingleParams.jav | 1 + .../varArg/method/ellipsisTypeSingleParams.kt | 1 + .../statement_mult/whileWithBlock.jav | 1 + .../statement_mult/whileWithBlock.kt | 5 + .../statement_mult/whileWithEmptyBlock.jav | 1 + .../statement_mult/whileWithEmptyBlock.kt | 3 + .../statement_mult/whileWithExpression.jav | 1 + .../statement_mult/whileWithExpression.kt | 2 + .../statement_mult/whileWithReturn.jav | 1 + .../statement_mult/whileWithReturn.kt | 2 + 470 files changed, 883 insertions(+), 2124 deletions(-) rename test/org/jetbrains/jet/j2k/{JetTestCaseBase.java => JavaToKotlinConverterTest.java} (53%) create mode 100644 test/org/jetbrains/jet/j2k/TestCaseBuilder.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/ArrayAccessExpressionTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/ArrayInitializerExpressionTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/ArrayTypeTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/AssertStatementTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/AssignmentExpressionTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/BinaryExpressionTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/BoxedTypeTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/BreakStatementTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/ClassTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/ConditionalExpressionTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/ContinueStatementTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/DeclarationStatementTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/DoWhileStatementTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/EnumTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/FieldTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/FileTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/ForTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/ForeachStatementTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/FunctionTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/IdentifierImplTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/IfStatementTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/InProjectionTypeTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/IsOperatorTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/LabelStatementTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/LocalVariableTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/MethodCallExpressionTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/NewClassExpressionTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/OutProjectionTypeTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/ParenthesizedExpressionTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/PolyadicExpressionTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/PostfixOperatorTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/PrefixOperatorTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/ReturnStatementTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/StarProjectionTypeTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/SynchronizedStatementTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/ThrowStatementTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/TraitTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/TryStatementTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/TypeCastExpressionTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/TypeParametersTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/VarArgTest.java delete mode 100644 test/org/jetbrains/jet/j2k/ast/WhileStatementTest.java create mode 100644 testData/arrayAccessExpression/expression/expressionIndex.jav create mode 100644 testData/arrayAccessExpression/expression/expressionIndex.kt create mode 100644 testData/arrayAccessExpression/expression/intIndex.jav create mode 100644 testData/arrayAccessExpression/expression/intIndex.kt create mode 100644 testData/arrayAccessExpression/expression/variableIndex.jav create mode 100644 testData/arrayAccessExpression/expression/variableIndex.kt create mode 100644 testData/arrayInitializerExpression/expression/newInt.jav create mode 100644 testData/arrayInitializerExpression/expression/newInt.kt create mode 100644 testData/arrayInitializerExpression/expression/oneDim.jav create mode 100644 testData/arrayInitializerExpression/expression/oneDim.kt create mode 100644 testData/arrayInitializerExpression/expression/oneDimWithVariables.jav create mode 100644 testData/arrayInitializerExpression/expression/oneDimWithVariables.kt create mode 100644 testData/arrayInitializerExpression/expression/twoDim.jav create mode 100644 testData/arrayInitializerExpression/expression/twoDim.kt create mode 100644 testData/arrayType/method/methodArrayArgs.jav create mode 100644 testData/arrayType/method/methodArrayArgs.kt create mode 100644 testData/arrayType/statement/arrayInitializationStatement.jav create mode 100644 testData/arrayType/statement/arrayInitializationStatement.kt create mode 100644 testData/arrayType/statement/arrayInitializationStatementWithDimension.jav create mode 100644 testData/arrayType/statement/arrayInitializationStatementWithDimension.kt create mode 100644 testData/arrayType/statement_mult/doubleArray.jav create mode 100644 testData/arrayType/statement_mult/doubleArray.kt create mode 100644 testData/arrayType/statement_mult/longArray.jav create mode 100644 testData/arrayType/statement_mult/longArray.kt create mode 100644 testData/arrayType/statement_mult/newIntArray.jav create mode 100644 testData/arrayType/statement_mult/newIntArray.kt create mode 100644 testData/arrayType/statement_mult/newStringArray.jav create mode 100644 testData/arrayType/statement_mult/newStringArray.kt create mode 100644 testData/assertStatement/statement_mult/onlyCondition.jav create mode 100644 testData/assertStatement/statement_mult/onlyCondition.kt create mode 100644 testData/assertStatement/statement_mult/onlyConditionWithBraces.jav create mode 100644 testData/assertStatement/statement_mult/onlyConditionWithBraces.kt create mode 100644 testData/assertStatement/statement_mult/withStringDetail.jav create mode 100644 testData/assertStatement/statement_mult/withStringDetail.kt create mode 100644 testData/assignmentExpression/expression_mult/and.jav create mode 100644 testData/assignmentExpression/expression_mult/and.kt create mode 100644 testData/assignmentExpression/expression_mult/assignment.jav create mode 100644 testData/assignmentExpression/expression_mult/assignment.kt create mode 100644 testData/assignmentExpression/expression_mult/divideAssign.jav create mode 100644 testData/assignmentExpression/expression_mult/divideAssign.kt create mode 100644 testData/assignmentExpression/expression_mult/minusAssign.jav create mode 100644 testData/assignmentExpression/expression_mult/minusAssign.kt create mode 100644 testData/assignmentExpression/expression_mult/multiplyAssign.jav create mode 100644 testData/assignmentExpression/expression_mult/multiplyAssign.kt create mode 100644 testData/assignmentExpression/expression_mult/or.jav create mode 100644 testData/assignmentExpression/expression_mult/or.kt create mode 100644 testData/assignmentExpression/expression_mult/plusAssign.jav create mode 100644 testData/assignmentExpression/expression_mult/plusAssign.kt create mode 100644 testData/assignmentExpression/expression_mult/reminder.jav create mode 100644 testData/assignmentExpression/expression_mult/reminder.kt create mode 100644 testData/assignmentExpression/expression_mult/shiftLeft.jav create mode 100644 testData/assignmentExpression/expression_mult/shiftLeft.kt create mode 100644 testData/assignmentExpression/expression_mult/shiftRight.jav create mode 100644 testData/assignmentExpression/expression_mult/shiftRight.kt create mode 100644 testData/assignmentExpression/expression_mult/unsignedRightShift.jav create mode 100644 testData/assignmentExpression/expression_mult/unsignedRightShift.kt create mode 100644 testData/assignmentExpression/expression_mult/xor.jav create mode 100644 testData/assignmentExpression/expression_mult/xor.kt create mode 100644 testData/assignmentExpression/statement/simpleAssignment.jav create mode 100644 testData/assignmentExpression/statement/simpleAssignment.kt create mode 100644 testData/binaryExpression/expression_mult/and.jav create mode 100644 testData/binaryExpression/expression_mult/and.kt create mode 100644 testData/binaryExpression/expression_mult/conditionalAnd.jav create mode 100644 testData/binaryExpression/expression_mult/conditionalAnd.kt create mode 100644 testData/binaryExpression/expression_mult/conditionalOr.jav create mode 100644 testData/binaryExpression/expression_mult/conditionalOr.kt create mode 100644 testData/binaryExpression/expression_mult/divide.jav create mode 100644 testData/binaryExpression/expression_mult/divide.kt create mode 100644 testData/binaryExpression/expression_mult/greaterThan.jav create mode 100644 testData/binaryExpression/expression_mult/greaterThan.kt create mode 100644 testData/binaryExpression/expression_mult/greaterThanEqual.jav create mode 100644 testData/binaryExpression/expression_mult/greaterThanEqual.kt create mode 100644 testData/binaryExpression/expression_mult/lessThan.jav create mode 100644 testData/binaryExpression/expression_mult/lessThan.kt create mode 100644 testData/binaryExpression/expression_mult/lessThanEqual.jav create mode 100644 testData/binaryExpression/expression_mult/lessThanEqual.kt create mode 100644 testData/binaryExpression/expression_mult/minus.jav create mode 100644 testData/binaryExpression/expression_mult/minus.kt create mode 100644 testData/binaryExpression/expression_mult/multiply.jav create mode 100644 testData/binaryExpression/expression_mult/multiply.kt create mode 100644 testData/binaryExpression/expression_mult/or.jav create mode 100644 testData/binaryExpression/expression_mult/or.kt create mode 100644 testData/binaryExpression/expression_mult/plus.jav create mode 100644 testData/binaryExpression/expression_mult/plus.kt create mode 100644 testData/binaryExpression/expression_mult/remainder.jav create mode 100644 testData/binaryExpression/expression_mult/remainder.kt create mode 100644 testData/binaryExpression/expression_mult/shiftLeft.jav create mode 100644 testData/binaryExpression/expression_mult/shiftLeft.kt create mode 100644 testData/binaryExpression/expression_mult/shiftRight.jav create mode 100644 testData/binaryExpression/expression_mult/shiftRight.kt create mode 100644 testData/binaryExpression/expression_mult/unsignedRightShift.jav create mode 100644 testData/binaryExpression/expression_mult/unsignedRightShift.kt create mode 100644 testData/binaryExpression/expression_mult/xor.jav create mode 100644 testData/binaryExpression/expression_mult/xor.kt create mode 100644 testData/boxedType/statement_mult/boolean.jav create mode 100644 testData/boxedType/statement_mult/boolean.kt create mode 100644 testData/boxedType/statement_mult/byte.jav create mode 100644 testData/boxedType/statement_mult/byte.kt create mode 100644 testData/boxedType/statement_mult/character.jav create mode 100644 testData/boxedType/statement_mult/character.kt create mode 100644 testData/boxedType/statement_mult/double.jav create mode 100644 testData/boxedType/statement_mult/double.kt create mode 100644 testData/boxedType/statement_mult/float.jav create mode 100644 testData/boxedType/statement_mult/float.kt create mode 100644 testData/boxedType/statement_mult/integer.jav create mode 100644 testData/boxedType/statement_mult/integer.kt create mode 100644 testData/boxedType/statement_mult/long.jav create mode 100644 testData/boxedType/statement_mult/long.kt create mode 100644 testData/boxedType/statement_mult/object.jav create mode 100644 testData/boxedType/statement_mult/object.kt create mode 100644 testData/boxedType/statement_mult/short.jav create mode 100644 testData/boxedType/statement_mult/short.kt create mode 100644 testData/breakStatement/statement/breakWithLabel.jav create mode 100644 testData/breakStatement/statement/breakWithLabel.kt create mode 100644 testData/breakStatement/statement/breakWithoutLabel.jav create mode 100644 testData/breakStatement/statement/breakWithoutLabel.kt create mode 100644 testData/class_/class/class.jav create mode 100644 testData/class_/class/class.kt create mode 100644 testData/class_/class/emptyClass.jav create mode 100644 testData/class_/class/emptyClass.kt create mode 100644 testData/class_/class/extendsOneClassAndImplementsOneInterface.jav create mode 100644 testData/class_/class/extendsOneClassAndImplementsOneInterface.kt create mode 100644 testData/class_/class/extendsOneClassAndImplementsSeveralInterfaces.jav create mode 100644 testData/class_/class/extendsOneClassAndImplementsSeveralInterfaces.kt create mode 100644 testData/class_/class/finalClass.jav create mode 100644 testData/class_/class/finalClass.kt create mode 100644 testData/class_/class/genericClass.jav create mode 100644 testData/class_/class/genericClass.kt create mode 100644 testData/class_/class/innerEmptyClass.jav create mode 100644 testData/class_/class/innerEmptyClass.kt create mode 100644 testData/class_/class/innerStaticClass.jav create mode 100644 testData/class_/class/innerStaticClass.kt create mode 100644 testData/class_/class/internalClass.jav create mode 100644 testData/class_/class/internalClass.kt create mode 100644 testData/class_/class/oneStaticFieldOneNonStatic.jav create mode 100644 testData/class_/class/oneStaticFieldOneNonStatic.kt create mode 100644 testData/class_/class/oneStaticMethod.jav create mode 100644 testData/class_/class/oneStaticMethod.kt create mode 100644 testData/class_/class/oneStaticMethodOneNonStatic.jav create mode 100644 testData/class_/class/oneStaticMethodOneNonStatic.kt create mode 100644 testData/class_/class/pivateClass.jav create mode 100644 testData/class_/class/pivateClass.kt create mode 100644 testData/class_/class/protectedClass.jav create mode 100644 testData/class_/class/protectedClass.kt create mode 100644 testData/class_/class/publicClass.jav create mode 100644 testData/class_/class/publicClass.kt create mode 100644 testData/class_/class/simpleInheritance.jav create mode 100644 testData/class_/class/simpleInheritance.kt create mode 100644 testData/class_/class/twoStaticMethod.jav create mode 100644 testData/class_/class/twoStaticMethod.kt create mode 100644 testData/class_/class_mult/classWithEmptyMethods.jav create mode 100644 testData/class_/class_mult/classWithEmptyMethods.kt create mode 100644 testData/class_/class_mult/classWithFields.jav create mode 100644 testData/class_/class_mult/classWithFields.kt create mode 100644 testData/class_/class_mult/classWithMultiplyFields.jav create mode 100644 testData/class_/class_mult/classWithMultiplyFields.kt create mode 100644 testData/conditionalExpression/expression_mult/simpleConditionalExpression.jav create mode 100644 testData/conditionalExpression/expression_mult/simpleConditionalExpression.kt create mode 100644 testData/continueStatement/statement/continueWithLabel.jav create mode 100644 testData/continueStatement/statement/continueWithLabel.kt create mode 100644 testData/continueStatement/statement/continueWithoutLabel.jav create mode 100644 testData/continueStatement/statement/continueWithoutLabel.kt create mode 100644 testData/declarationStatement/statement/singleFinalIntDeclaration.jav create mode 100644 testData/declarationStatement/statement/singleFinalIntDeclaration.kt create mode 100644 testData/declarationStatement/statement/singleFinalStringDeclaration.jav create mode 100644 testData/declarationStatement/statement/singleFinalStringDeclaration.kt create mode 100644 testData/declarationStatement/statement/singleIntDeclaration.jav create mode 100644 testData/declarationStatement/statement/singleIntDeclaration.kt create mode 100644 testData/declarationStatement/statement/singleStringDeclaration.jav create mode 100644 testData/declarationStatement/statement/singleStringDeclaration.kt create mode 100644 testData/declarationStatement/statement_mult/multiplyFinalIntDeclaration.jav create mode 100644 testData/declarationStatement/statement_mult/multiplyFinalIntDeclaration.kt create mode 100644 testData/declarationStatement/statement_mult/multiplyIntDeclaration.jav create mode 100644 testData/declarationStatement/statement_mult/multiplyIntDeclaration.kt create mode 100644 testData/doWhileStatement/statement_mult/whileWithBlock.jav create mode 100644 testData/doWhileStatement/statement_mult/whileWithBlock.kt create mode 100644 testData/doWhileStatement/statement_mult/whileWithEmptyBlock.jav create mode 100644 testData/doWhileStatement/statement_mult/whileWithEmptyBlock.kt create mode 100644 testData/doWhileStatement/statement_mult/whileWithExpression.jav create mode 100644 testData/doWhileStatement/statement_mult/whileWithExpression.kt create mode 100644 testData/doWhileStatement/statement_mult/whileWithReturn.jav create mode 100644 testData/doWhileStatement/statement_mult/whileWithReturn.kt create mode 100644 testData/enum/class/emptyEnum.jav create mode 100644 testData/enum/class/emptyEnum.kt create mode 100644 testData/enum/class/enumImplementsOneInterface.jav create mode 100644 testData/enum/class/enumImplementsOneInterface.kt create mode 100644 testData/enum/class/enumImplementsSeveralInterfaces.jav create mode 100644 testData/enum/class/enumImplementsSeveralInterfaces.kt create mode 100644 testData/enum/class/internalEnum.jav create mode 100644 testData/enum/class/internalEnum.kt create mode 100644 testData/enum/class/privateEnum.jav create mode 100644 testData/enum/class/privateEnum.kt create mode 100644 testData/enum/class/protectedEnum.jav create mode 100644 testData/enum/class/protectedEnum.kt create mode 100644 testData/enum/class/publicEnum.jav create mode 100644 testData/enum/class/publicEnum.kt create mode 100644 testData/enum/class_mult/enumWithNameField.jav create mode 100644 testData/enum/class_mult/enumWithNameField.kt create mode 100644 testData/enum/class_mult/fieldsWithPrimaryPrivateConstructor.jav create mode 100644 testData/enum/class_mult/fieldsWithPrimaryPrivateConstructor.kt create mode 100644 testData/enum/class_mult/overrideToString.jav create mode 100644 testData/enum/class_mult/overrideToString.kt create mode 100644 testData/enum/class_mult/runnableImplementation.jav create mode 100644 testData/enum/class_mult/runnableImplementation.kt create mode 100644 testData/enum/class_mult/typeSafeEnum.jav create mode 100644 testData/enum/class_mult/typeSafeEnum.kt create mode 100644 testData/field/method/internalField.jav create mode 100644 testData/field/method/internalField.kt create mode 100644 testData/field/method/privateField.jav create mode 100644 testData/field/method/privateField.kt create mode 100644 testData/field/method/protectedField.jav create mode 100644 testData/field/method/protectedField.kt create mode 100644 testData/field/method/publicField.jav create mode 100644 testData/field/method/publicField.kt create mode 100644 testData/field/method/valWithInit.jav create mode 100644 testData/field/method/valWithInit.kt create mode 100644 testData/field/method/varWithInit.jav create mode 100644 testData/field/method/varWithInit.kt create mode 100644 testData/field/method/varWithoutInit.jav create mode 100644 testData/field/method/varWithoutInit.kt create mode 100644 testData/file_/file/packageWithClass.jav create mode 100644 testData/file_/file/packageWithClass.kt create mode 100644 testData/file_/file/packageWithClasses.jav create mode 100644 testData/file_/file/packageWithClasses.kt create mode 100644 testData/file_/file/packageWithOpenClass.jav create mode 100644 testData/file_/file/packageWithOpenClass.kt create mode 100644 testData/file_/file_mult/packageWithImports.jav create mode 100644 testData/file_/file_mult/packageWithImports.kt create mode 100644 testData/file_/file_mult/packageWithMixedImports.jav create mode 100644 testData/file_/file_mult/packageWithMixedImports.kt create mode 100644 testData/file_/file_mult/packageWithStaticImports.jav create mode 100644 testData/file_/file_mult/packageWithStaticImports.kt create mode 100644 testData/for/statement_mult/commonCaseForTest.jav create mode 100644 testData/for/statement_mult/commonCaseForTest.kt create mode 100644 testData/for/statement_mult/forWithBlock.jav create mode 100644 testData/for/statement_mult/forWithBlock.kt create mode 100644 testData/for/statement_mult/forWithBlockAndDoubleUpdate.jav create mode 100644 testData/for/statement_mult/forWithBlockAndDoubleUpdate.kt create mode 100644 testData/for/statement_mult/forWithEmptyBlock.jav create mode 100644 testData/for/statement_mult/forWithEmptyBlock.kt create mode 100644 testData/for/statement_mult/forWithExpression.jav create mode 100644 testData/for/statement_mult/forWithExpression.kt create mode 100644 testData/for/statement_mult/forWithReturn.jav create mode 100644 testData/for/statement_mult/forWithReturn.kt create mode 100644 testData/foreachStatement/statement_mult/enhancedForWithBlock.jav create mode 100644 testData/foreachStatement/statement_mult/enhancedForWithBlock.kt create mode 100644 testData/foreachStatement/statement_mult/enhancedForWithEmptyBlock.jav create mode 100644 testData/foreachStatement/statement_mult/enhancedForWithEmptyBlock.kt create mode 100644 testData/foreachStatement/statement_mult/enhancedForWithExpression.jav create mode 100644 testData/foreachStatement/statement_mult/enhancedForWithExpression.kt create mode 100644 testData/foreachStatement/statement_mult/enhancedForWithReturn.jav create mode 100644 testData/foreachStatement/statement_mult/enhancedForWithReturn.kt create mode 100644 testData/function/file/override.jav create mode 100644 testData/function/file/override.kt create mode 100644 testData/function/method/classGenericParam.jav create mode 100644 testData/function/method/classGenericParam.kt create mode 100644 testData/function/method/emptyVoidMethod.jav create mode 100644 testData/function/method/emptyVoidMethod.kt create mode 100644 testData/function/method/internal.jav create mode 100644 testData/function/method/internal.kt create mode 100644 testData/function/method/methodClassType.jav create mode 100644 testData/function/method/methodClassType.kt create mode 100644 testData/function/method/methodPrimitiveType.jav create mode 100644 testData/function/method/methodPrimitiveType.kt create mode 100644 testData/function/method/methodPrimitiveType2.jav create mode 100644 testData/function/method/methodPrimitiveType2.kt create mode 100644 testData/function/method/methodWithReturnStatement.jav create mode 100644 testData/function/method/methodWithReturnStatement.kt create mode 100644 testData/function/method/ownGenericParam.jav create mode 100644 testData/function/method/ownGenericParam.kt create mode 100644 testData/function/method/ownSeveralGenericParams.jav create mode 100644 testData/function/method/ownSeveralGenericParams.kt create mode 100644 testData/function/method/private.jav create mode 100644 testData/function/method/private.kt create mode 100644 testData/function/method/protected.jav create mode 100644 testData/function/method/protected.kt create mode 100644 testData/function/method/public.jav create mode 100644 testData/function/method/public.kt create mode 100644 testData/ifStatement/statement_mult/ifStatementWithEmptyBlocks.jav create mode 100644 testData/ifStatement/statement_mult/ifStatementWithEmptyBlocks.kt create mode 100644 testData/ifStatement/statement_mult/ifStatementWithMultilineBlocks.jav create mode 100644 testData/ifStatement/statement_mult/ifStatementWithMultilineBlocks.kt create mode 100644 testData/ifStatement/statement_mult/ifStatementWithOneLineBlocks.jav create mode 100644 testData/ifStatement/statement_mult/ifStatementWithOneLineBlocks.kt create mode 100644 testData/ifStatement/statement_mult/ifStatementWithoutElse.jav create mode 100644 testData/ifStatement/statement_mult/ifStatementWithoutElse.kt create mode 100644 testData/inProjectionType/method/methodParams.jav create mode 100644 testData/inProjectionType/method/methodParams.kt create mode 100644 testData/isOperator/expression_mult/complicatedExpression.jav create mode 100644 testData/isOperator/expression_mult/complicatedExpression.kt create mode 100644 testData/isOperator/expression_mult/simpleReference.jav create mode 100644 testData/isOperator/expression_mult/simpleReference.kt create mode 100644 testData/labelStatement/statement_mult/complicatedExampleFromJavaTutorial.jav create mode 100644 testData/labelStatement/statement_mult/complicatedExampleFromJavaTutorial.kt create mode 100644 testData/localVariable/statement/object.jav create mode 100644 testData/localVariable/statement/object.kt create mode 100644 testData/methodCallExpression/statement/callWithKeywords.jav create mode 100644 testData/methodCallExpression/statement/callWithKeywords.kt create mode 100644 testData/methodCallExpression/statement/emptyCall.jav create mode 100644 testData/methodCallExpression/statement/emptyCall.kt create mode 100644 testData/methodCallExpression/statement/simpleCall.jav create mode 100644 testData/methodCallExpression/statement/simpleCall.kt create mode 100644 testData/newClassExpression/expression/classWithParam.jav create mode 100644 testData/newClassExpression/expression/classWithParam.kt create mode 100644 testData/newClassExpression/expression/classWithParams.jav create mode 100644 testData/newClassExpression/expression/classWithParams.kt create mode 100644 testData/newClassExpression/expression/classWithoutBody.jav create mode 100644 testData/newClassExpression/expression/classWithoutBody.kt create mode 100644 testData/newClassExpression/expression/classWithoutBody2.jav create mode 100644 testData/newClassExpression/expression/classWithoutBody2.kt create mode 100644 testData/outProjectionType/method/methodParams.jav create mode 100644 testData/outProjectionType/method/methodParams.kt create mode 100644 testData/parenthesizedExpression/expression/parenthesized.jav create mode 100644 testData/parenthesizedExpression/expression/parenthesized.kt create mode 100644 testData/parenthesizedExpression/expression/parenthesized2.jav create mode 100644 testData/parenthesizedExpression/expression/parenthesized2.kt create mode 100644 testData/polyadicExpression/expression_mult/divide.jav create mode 100644 testData/polyadicExpression/expression_mult/divide.kt create mode 100644 testData/polyadicExpression/expression_mult/minus.jav create mode 100644 testData/polyadicExpression/expression_mult/minus.kt create mode 100644 testData/polyadicExpression/expression_mult/multiply.jav create mode 100644 testData/polyadicExpression/expression_mult/multiply.kt create mode 100644 testData/polyadicExpression/expression_mult/plus.jav create mode 100644 testData/polyadicExpression/expression_mult/plus.kt create mode 100644 testData/polyadicExpression/expression_mult/remainder.jav create mode 100644 testData/polyadicExpression/expression_mult/remainder.kt create mode 100644 testData/postfixOperator/statement_mult/decrement.jav create mode 100644 testData/postfixOperator/statement_mult/decrement.kt create mode 100644 testData/postfixOperator/statement_mult/increment.jav create mode 100644 testData/postfixOperator/statement_mult/increment.kt create mode 100644 testData/prefixOperator/statement_mult/decrement.jav create mode 100644 testData/prefixOperator/statement_mult/decrement.kt create mode 100644 testData/prefixOperator/statement_mult/increment.jav create mode 100644 testData/prefixOperator/statement_mult/increment.kt create mode 100644 testData/returnStatement/statement/returnChar.jav create mode 100644 testData/returnStatement/statement/returnChar.kt create mode 100644 testData/returnStatement/statement/returnLiteral.jav create mode 100644 testData/returnStatement/statement/returnLiteral.kt create mode 100644 testData/returnStatement/statement/returnNumber.jav create mode 100644 testData/returnStatement/statement/returnNumber.kt create mode 100644 testData/returnStatement/statement/returnString.jav create mode 100644 testData/returnStatement/statement/returnString.kt create mode 100644 testData/starProjectionType/method/methodParams.jav create mode 100644 testData/starProjectionType/method/methodParams.kt create mode 100644 testData/synchronizedStatement/statement/singleLineExample.jav create mode 100644 testData/synchronizedStatement/statement/singleLineExample.kt create mode 100644 testData/throwStatement/statement/simpleThrowStatement.jav create mode 100644 testData/throwStatement/statement/simpleThrowStatement.kt create mode 100644 testData/trait/class/emptyInterface.jav create mode 100644 testData/trait/class/emptyInterface.kt create mode 100644 testData/trait/class/extendsOneClassAndImplementsSeveralInterfaces.jav create mode 100644 testData/trait/class/extendsOneClassAndImplementsSeveralInterfaces.kt create mode 100644 testData/trait/class/extendsOneInterface.jav create mode 100644 testData/trait/class/extendsOneInterface.kt create mode 100644 testData/trait/class/internalInterface.jav create mode 100644 testData/trait/class/internalInterface.kt create mode 100644 testData/trait/class/privateInterface.jav create mode 100644 testData/trait/class/privateInterface.kt create mode 100644 testData/trait/class/protectedInterface.jav create mode 100644 testData/trait/class/protectedInterface.kt create mode 100644 testData/trait/class/publicInterface.jav create mode 100644 testData/trait/class/publicInterface.kt create mode 100644 testData/trait/class_mult/interfaceWithFields.jav create mode 100644 testData/trait/class_mult/interfaceWithFields.kt create mode 100644 testData/trait/class_mult/interfaceWithMethodDeclaration.jav create mode 100644 testData/trait/class_mult/interfaceWithMethodDeclaration.kt create mode 100644 testData/trait/class_mult/interfaceWithStaticFields.jav create mode 100644 testData/trait/class_mult/interfaceWithStaticFields.kt create mode 100644 testData/tryStatement/statement_mult/commonCaseForTryStatement.jav create mode 100644 testData/tryStatement/statement_mult/commonCaseForTryStatement.kt create mode 100644 testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithEmptyFinally.jav create mode 100644 testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithEmptyFinally.kt create mode 100644 testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithFinally.jav create mode 100644 testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithFinally.kt create mode 100644 testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithoutFinally.jav create mode 100644 testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithoutFinally.kt create mode 100644 testData/typeCastExpression/expression_mult/extendsWildcardCast.jav create mode 100644 testData/typeCastExpression/expression_mult/extendsWildcardCast.kt create mode 100644 testData/typeCastExpression/expression_mult/fooCast.jav create mode 100644 testData/typeCastExpression/expression_mult/fooCast.kt create mode 100644 testData/typeCastExpression/expression_mult/intCast.jav create mode 100644 testData/typeCastExpression/expression_mult/intCast.kt create mode 100644 testData/typeCastExpression/expression_mult/primitiveType.jav create mode 100644 testData/typeCastExpression/expression_mult/primitiveType.kt create mode 100644 testData/typeCastExpression/expression_mult/simpleGenericCast.jav create mode 100644 testData/typeCastExpression/expression_mult/simpleGenericCast.kt create mode 100644 testData/typeCastExpression/expression_mult/stringCast.jav create mode 100644 testData/typeCastExpression/expression_mult/stringCast.kt create mode 100644 testData/typeCastExpression/expression_mult/superWildcardCast.jav create mode 100644 testData/typeCastExpression/expression_mult/superWildcardCast.kt create mode 100644 testData/typeCastExpression/expression_mult/wildcardCast.jav create mode 100644 testData/typeCastExpression/expression_mult/wildcardCast.kt create mode 100644 testData/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.jav create mode 100644 testData/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.kt create mode 100644 testData/typeParameters/class/classParametrizationWithTwoBounds.jav create mode 100644 testData/typeParameters/class/classParametrizationWithTwoBounds.kt create mode 100644 testData/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.jav create mode 100644 testData/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.kt create mode 100644 testData/typeParameters/class/complexExampleWithClassExtending.jav create mode 100644 testData/typeParameters/class/complexExampleWithClassExtending.kt create mode 100644 testData/typeParameters/class/complexExampleWithClassMultiplyExtending.jav create mode 100644 testData/typeParameters/class/complexExampleWithClassMultiplyExtending.kt create mode 100644 testData/typeParameters/class/genericClass.jav create mode 100644 testData/typeParameters/class/genericClass.kt create mode 100644 testData/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.jav create mode 100644 testData/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.kt create mode 100644 testData/typeParameters/method/methodDoubleParametrizationWithTwoBounds.jav create mode 100644 testData/typeParameters/method/methodDoubleParametrizationWithTwoBounds.kt create mode 100644 testData/typeParameters/method/where.jav create mode 100644 testData/typeParameters/method/where.kt create mode 100644 testData/typeParameters/statement_mult/genericParam.jav create mode 100644 testData/typeParameters/statement_mult/genericParam.kt create mode 100644 testData/typeParameters/statement_mult/manyGenericParams.jav create mode 100644 testData/typeParameters/statement_mult/manyGenericParams.kt create mode 100644 testData/varArg/method/ellipsisTypeSeveralParams.jav create mode 100644 testData/varArg/method/ellipsisTypeSeveralParams.kt create mode 100644 testData/varArg/method/ellipsisTypeSingleParams.jav create mode 100644 testData/varArg/method/ellipsisTypeSingleParams.kt create mode 100644 testData/whileStatement/statement_mult/whileWithBlock.jav create mode 100644 testData/whileStatement/statement_mult/whileWithBlock.kt create mode 100644 testData/whileStatement/statement_mult/whileWithEmptyBlock.jav create mode 100644 testData/whileStatement/statement_mult/whileWithEmptyBlock.kt create mode 100644 testData/whileStatement/statement_mult/whileWithExpression.jav create mode 100644 testData/whileStatement/statement_mult/whileWithExpression.kt create mode 100644 testData/whileStatement/statement_mult/whileWithReturn.jav create mode 100644 testData/whileStatement/statement_mult/whileWithReturn.kt diff --git a/test/org/jetbrains/jet/j2k/JetTestCaseBase.java b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java similarity index 53% rename from test/org/jetbrains/jet/j2k/JetTestCaseBase.java rename to test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java index 9732820ad6d..2fec5296537 100644 --- a/test/org/jetbrains/jet/j2k/JetTestCaseBase.java +++ b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java @@ -1,89 +1,123 @@ package org.jetbrains.jet.j2k; import com.intellij.codeInsight.daemon.LightDaemonAnalyzerTestCase; -import com.intellij.openapi.application.PathManager; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.projectRoots.impl.JavaSdkImpl; import com.intellij.psi.PsiJavaFile; +import junit.framework.Assert; import junit.framework.Test; import junit.framework.TestSuite; import org.jetbrains.annotations.NotNull; +import java.io.BufferedReader; import java.io.File; -import java.io.FileFilter; -import java.io.FilenameFilter; +import java.io.FileReader; import java.io.IOException; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; + +import static org.jetbrains.jet.j2k.TestCaseBuilder.getTestDataPathBase; /** - * @author abreslav + * @author ignatov */ -public abstract class JetTestCaseBase extends LightDaemonAnalyzerTestCase { - private boolean checkInfos = false; - private final String dataPath; - private final String name; +public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { + private String myDataPath; + private String myName; - protected JetTestCaseBase() { - this("", ""); + public JavaToKotlinConverterTest(String dataPath, String name) { + myDataPath = dataPath; + myName = name; } - private JetTestCaseBase(String dataPath, String name) { - this.dataPath = dataPath; - this.name = name; + private static String readFileAsString(String filePath) + throws java.io.IOException { + StringBuffer fileData = new StringBuffer(1000); + BufferedReader reader = new BufferedReader( + new FileReader(filePath)); + char[] buf = new char[1024]; + int numRead = 0; + while ((numRead = reader.read(buf)) != -1) { + String readData = String.valueOf(buf, 0, numRead); + fileData.append(readData); + buf = new char[1024]; + } + reader.close(); + return fileData.toString(); } - public final JetTestCaseBase setCheckInfos(boolean checkInfos) { - this.checkInfos = checkInfos; - return this; + @Override + protected void runTest() throws Throwable { + String javaPath = getTestDataPath() + File.separator + getTestFilePath(); + String kotlinPath = javaPath.replace(".jav", ".kt"); + + String expected = readFileAsString(kotlinPath); + + String actual = ""; + if (javaPath.contains("/expression_mult/")) actual = expressionToKotlin(readFileAsString(javaPath)); + else if (javaPath.contains("/expression/")) actual = expressionToKotlin(readFileAsString(javaPath)); + else if (javaPath.contains("/statement/")) actual = statementToSingleLineKotlin(readFileAsString(javaPath)); + else if (javaPath.contains("/statement_mult/")) actual = statementToKotlin(readFileAsString(javaPath)); + + else if (javaPath.contains("/method/")) actual = methodToSingleLineKotlin(readFileAsString(javaPath)); + else if (javaPath.contains("/method_mult/")) actual = methodToKotlin(readFileAsString(javaPath)); + + else if (javaPath.contains("/class/")) actual = classToSingleLineKotlin(readFileAsString(javaPath)); + else if (javaPath.contains("/class_mult/")) actual = classToKotlin(readFileAsString(javaPath)); + + else if (javaPath.contains("/file/")) actual = fileToSingleLineKotlin(readFileAsString(javaPath)); + else if (javaPath.contains("/file_mult/")) actual = fileToKotlin(readFileAsString(javaPath)); + + assert !actual.equals(""); + Assert.assertEquals(expected, actual); + } + + @NotNull + protected String getTestFilePath() { + return myDataPath + File.separator + myName + ".jav"; + } + + @Override + protected String getTestDataPath() { + return "testData"; } private static Sdk jdkFromIdeaHome() { return new JavaSdkImpl().createJdk("JDK", "jre", true); } - @Override - protected String getTestDataPath() { - return getTestDataPathBase(); - } - - private static String getTestDataPathBase() { - return getHomeDirectory() + "/compiler/testData"; - } - - private static String getHomeDirectory() { - return new File(PathManager.getResourceRoot(JetTestCaseBase.class, "/org/jetbrains/jet/JetTestCaseBase.class")).getParentFile().getParentFile().getParent(); - } - - @Override protected Sdk getProjectJDK() { return jdkFromIdeaHome(); } -// @Override -// public String getName() { -// return "test" + name; -// } - -// @Override -// protected void runTest() throws Throwable { -// doTest(getTestFilePath(), true, checkInfos); -// } - - @NotNull - protected String getTestFilePath() { - return dataPath + File.separator + name + ".jet"; + @Override + public String getName() { + return "test_" + myName; } - protected String getDataPath() { - return dataPath; + public static Test suite() { + TestSuite suite = new TestSuite(); + suite.addTest(TestCaseBuilder.suiteForDirectory(getTestDataPathBase(), "", true, new TestCaseBuilder.NamedTestFactory() { + @NotNull + @Override + public Test createTest(@NotNull String dataPath, @NotNull String name) { + return new JavaToKotlinConverterTest(dataPath, name); + } + })); + return suite; } void configureFromText(String text) throws IOException { configureFromFileText("test.java", text); } + protected String fileToKotlin(String text) throws IOException { + configureFromText(text); + return prettify(Converter.fileToFile((PsiJavaFile) myFile).toKotlin()); + } + + protected String fileToSingleLineKotlin(String text) throws IOException { + return toSingleLine(fileToKotlin(text)); + } + @NotNull protected String classToKotlin(String text) throws IOException { configureFromText(text); @@ -100,15 +134,6 @@ public abstract class JetTestCaseBase extends LightDaemonAnalyzerTestCase { return toSingleLine(classToKotlin(text)); } - protected String fileToKotlin(String text) throws IOException { - configureFromText(text); - return prettify(Converter.fileToFile((PsiJavaFile) myFile).toKotlin()); - } - - protected String fileToSingleLineKotlin(String text) throws IOException { - return toSingleLine(fileToKotlin(text)); - } - protected String methodToKotlin(String text) throws IOException { String result = classToKotlin("final class C {" + text + "}") .replaceAll("class C \\{", ""); @@ -141,47 +166,6 @@ public abstract class JetTestCaseBase extends LightDaemonAnalyzerTestCase { return toSingleLine(expressionToKotlin(code)); } - public interface NamedTestFactory { - @NotNull - Test createTest(@NotNull String dataPath, @NotNull String name); - } - - @NotNull - private static TestSuite suiteForDirectory(String baseDataDir, @NotNull final String dataPath, boolean recursive, @NotNull NamedTestFactory factory) { - TestSuite suite = new TestSuite(dataPath); - final String extension = ".jet"; - FilenameFilter extensionFilter = new FilenameFilter() { - @Override - public boolean accept(File dir, String name) { - return name.endsWith(extension); - } - }; - File dir = new File(baseDataDir + dataPath); - FileFilter dirFilter = new FileFilter() { - @Override - public boolean accept(File pathname) { - return pathname.isDirectory(); - } - }; - if (recursive) { - File[] files = dir.listFiles(dirFilter); - assert files != null : dir; - List subdirs = Arrays.asList(files); - Collections.sort(subdirs); - for (File subdir : subdirs) { - suite.addTest(suiteForDirectory(baseDataDir, dataPath + "/" + subdir.getName(), recursive, factory)); - } - } - List files = Arrays.asList(dir.listFiles(extensionFilter)); - Collections.sort(files); - for (File file : files) { - String fileName = file.getName(); - assert fileName != null; - suite.addTest(factory.createTest(dataPath, fileName.substring(0, fileName.length() - extension.length()))); - } - return suite; - } - @NotNull private static String prettify(String code) { if (code == null) diff --git a/test/org/jetbrains/jet/j2k/TestCaseBuilder.java b/test/org/jetbrains/jet/j2k/TestCaseBuilder.java new file mode 100644 index 00000000000..ac4250359d0 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/TestCaseBuilder.java @@ -0,0 +1,91 @@ +package org.jetbrains.jet.j2k; + +import com.intellij.openapi.application.PathManager; +import junit.framework.Test; +import junit.framework.TestSuite; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.FileFilter; +import java.io.FilenameFilter; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * @author ignatov + */ +public abstract class TestCaseBuilder { + private static FilenameFilter emptyFilter = new FilenameFilter() { + @Override + public boolean accept(File file, String name) { + return true; + } + }; + + public static String getTestDataPathBase() { + return "testData"; + } + + public static String getHomeDirectory() { + return new File(PathManager.getResourceRoot(TestCaseBuilder.class, "/org/jetbrains/jet/TestCaseBuilder.class")).getParentFile().getParentFile().getParent(); + } + + public interface NamedTestFactory { + @NotNull Test createTest(@NotNull String dataPath, @NotNull String name); + } + + @NotNull + public static TestSuite suiteForDirectory(String baseDataDir, @NotNull final String dataPath, boolean recursive, @NotNull NamedTestFactory factory) { + return suiteForDirectory(baseDataDir, dataPath, recursive, emptyFilter, factory); + } + + @NotNull + public static TestSuite suiteForDirectory(String baseDataDir, @NotNull final String dataPath, boolean recursive, final FilenameFilter filter, @NotNull NamedTestFactory factory) { + TestSuite suite = new TestSuite(dataPath); + final String extensionJava = ".jav"; + + final FilenameFilter extensionFilter = new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + return name.endsWith(extensionJava); + } + }; + FilenameFilter resultFilter; + if (filter != emptyFilter) { + resultFilter = new FilenameFilter() { + @Override + public boolean accept(File file, String s) { + return extensionFilter.accept(file, s) && filter.accept(file, s); + } + }; + } + else { + resultFilter = extensionFilter; + } + File dir = new File(baseDataDir + dataPath); + FileFilter dirFilter = new FileFilter() { + @Override + public boolean accept(File pathname) { + return pathname.isDirectory(); + } + }; + if (recursive) { + File[] files = dir.listFiles(dirFilter); + assert files != null : dir; + List subdirs = Arrays.asList(files); + Collections.sort(subdirs); + for (File subdir : subdirs) { + suite.addTest(suiteForDirectory(baseDataDir, dataPath + "/" + subdir.getName(), recursive, filter, factory)); + } + } + List files = Arrays.asList(dir.listFiles(resultFilter)); + Collections.sort(files); + for (File file : files) { + String fileName = file.getName(); + assert fileName != null; + suite.addTest(factory.createTest(dataPath, fileName.substring(0, fileName.length() - extensionJava.length()))); + } + return suite; + } +} diff --git a/test/org/jetbrains/jet/j2k/ast/ArrayAccessExpressionTest.java b/test/org/jetbrains/jet/j2k/ast/ArrayAccessExpressionTest.java deleted file mode 100644 index f6e47a68dd9..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/ArrayAccessExpressionTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class ArrayAccessExpressionTest extends JetTestCaseBase { - public void testIntIndex() throws Exception { - Assert.assertEquals(expressionToSingleLineKotlin("myArray[10]"), "myArray[10]"); - } - - public void testVariableIndex() throws Exception { - Assert.assertEquals(expressionToSingleLineKotlin("myArray[i]"), "myArray[i]"); - } - - public void testExpressionIndex() throws Exception { - Assert.assertEquals(expressionToSingleLineKotlin("myArray[myLibrary.calculateIndex(100)]"), "myArray[myLibrary.calculateIndex(100)]"); - } -} diff --git a/test/org/jetbrains/jet/j2k/ast/ArrayInitializerExpressionTest.java b/test/org/jetbrains/jet/j2k/ast/ArrayInitializerExpressionTest.java deleted file mode 100644 index fb24555f588..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/ArrayInitializerExpressionTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class ArrayInitializerExpressionTest extends JetTestCaseBase { - public void testOneDim() throws Exception { - Assert.assertEquals( - expressionToSingleLineKotlin("{1, 2, 3};"), - "array(1, 2, 3)" - ); - } - - public void testOneDimWithVariables() throws Exception { - Assert.assertEquals( - expressionToSingleLineKotlin("{a, b, c};"), - "array(a, b, c)" - ); - } - - public void testNewInt() throws Exception { - Assert.assertEquals( - expressionToSingleLineKotlin("new int[] {1, 2, 3};"), - "array(1, 2, 3)" - ); - } - - public void testTwoDim() throws Exception { - Assert.assertEquals( - expressionToSingleLineKotlin("{ {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };"), - "array(array(1, 2, 3), array(4, 5, 6), array(7, 8, 9))" - ); - } - -// TODO -// public void testTwoDimNewInt() throws Exception { -// Assert.assertEquals( -// statementToSingleLineKotlin("int[][] myArray = new int[5][];"), -// "array(1, 2, 3)" -// ); -// } -} diff --git a/test/org/jetbrains/jet/j2k/ast/ArrayTypeTest.java b/test/org/jetbrains/jet/j2k/ast/ArrayTypeTest.java deleted file mode 100644 index 04b50fe1dc9..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/ArrayTypeTest.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class ArrayTypeTest extends JetTestCaseBase { - public void testNewStringArray() throws Exception { - Assert.assertEquals( - statementToKotlin("String[] a = new String[]{\"abc\"}"), - "var a : Array? = array(\"abc\")" - ); - } - - public void testNewIntArray() throws Exception { - Assert.assertEquals( - statementToKotlin("int[] a = new int[]{1, 2, 3}"), - "var a : IntArray? = array(1, 2, 3)" - ); - } - - public void testDoubleArray() throws Exception { - Assert.assertEquals( - statementToKotlin("double[] a = new double[]{1, 2, 3}"), - "var a : DoubleArray? = array(1, 2, 3)" - ); - } - - public void testLongArray() throws Exception { - Assert.assertEquals( - statementToKotlin("long[] a = new long[]{1, 2, 3}"), - "var a : LongArray? = array(1, 2, 3)" - ); - } - - public void testMethodArrayArgs() throws Exception { - Assert.assertEquals( - methodToSingleLineKotlin("void fromArrayToCollection(Foo[] a) {}"), - "fun fromArrayToCollection(a : Array?) : Unit { }" - ); - } - - public void testArrayInitializationStatement() throws Exception { - Assert.assertEquals( - statementToSingleLineKotlin("int [][] d2 = new int[][]{};"), - "var d2 : Array? = array()" // more precisely: "var d2 : Array? = array()" - ); - } - - public void testArrayInitializationStatementWithDimension() throws Exception { - Assert.assertEquals( - statementToSingleLineKotlin("int [][] d2 = new int[5][];"), - "var d2 : Array? = Array?(5, {null})" // another variant: "var d2 : Array? = array(5, {null, null, null, null, null})" - ); - } - -// public void testArrayInitializationStatementWithThreeDimension() throws Exception { -// Assert.assertEquals( -// statementToSingleLineKotlin("int[][][] d3= new int[5][5][5];"), -// "var d3 : Array?>? = Array?>?()" -// ); -// } -} diff --git a/test/org/jetbrains/jet/j2k/ast/AssertStatementTest.java b/test/org/jetbrains/jet/j2k/ast/AssertStatementTest.java deleted file mode 100644 index 9e397c9cba2..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/AssertStatementTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class AssertStatementTest extends JetTestCaseBase { - public void testOnlyCondition() throws Exception { - Assert.assertEquals( - statementToKotlin("assert boolMethod();"), - "assert {boolMethod()}" - ); - } - - public void testOnlyConditionWithBraces() throws Exception { - Assert.assertEquals( - statementToKotlin("assert(boolMethod());"), - "assert {(boolMethod())}" - ); - } - - public void testWithStringDetail() throws Exception { - Assert.assertEquals( - statementToKotlin("assert true : \"string details\";"), - "assert(\"string details\") {true}" - ); - } -} diff --git a/test/org/jetbrains/jet/j2k/ast/AssignmentExpressionTest.java b/test/org/jetbrains/jet/j2k/ast/AssignmentExpressionTest.java deleted file mode 100644 index 40e6470465a..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/AssignmentExpressionTest.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class AssignmentExpressionTest extends JetTestCaseBase { - public void testSimpleAssignment() throws Exception { - Assert.assertEquals(statementToSingleLineKotlin("i = 1;"), "i = 1"); - } - - public void testShiftRight() throws Exception { - Assert.assertEquals(expressionToKotlin("x >>= 2"), "x = (x shr 2)"); - } - - public void testShiftLeft() throws Exception { - Assert.assertEquals(expressionToKotlin("x <<= 2"), "x = (x shl 2)"); - } - - public void testUnsignedRightShift() throws Exception { - Assert.assertEquals(expressionToKotlin("x >>>= 2"), "x = x.cyclicShiftRight(2)"); - } - - public void testXor() throws Exception { - Assert.assertEquals(expressionToKotlin("x ^= 2"), "x = (x xor 2)"); - } - - public void testAnd() throws Exception { - Assert.assertEquals(expressionToKotlin("x &= 2"), "x = (x and 2)"); - } - - public void testOr() throws Exception { - Assert.assertEquals(expressionToKotlin("x |= 2"), "x = (x or 2)"); - } - - public void testMultiplyAssign() throws Exception { - Assert.assertEquals(expressionToKotlin("x *= 2"), "x *= 2"); - } - - public void testDivideAssign() throws Exception { - Assert.assertEquals(expressionToKotlin("x /= 2"), "x /= 2"); - } - - public void testPlusAssign() throws Exception { - Assert.assertEquals(expressionToKotlin("x += 2"), "x += 2"); - } - - public void testMinusAssign() throws Exception { - Assert.assertEquals(expressionToKotlin("x -= 2"), "x -= 2"); - } - - public void testReminder() throws Exception { - Assert.assertEquals(expressionToKotlin("x %= 2"), "x %= 2"); - } - - public void testAssignment() throws Exception { - Assert.assertEquals(expressionToKotlin("x = 2"), "x = 2"); - } -} \ No newline at end of file diff --git a/test/org/jetbrains/jet/j2k/ast/BinaryExpressionTest.java b/test/org/jetbrains/jet/j2k/ast/BinaryExpressionTest.java deleted file mode 100644 index d87c90c892a..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/BinaryExpressionTest.java +++ /dev/null @@ -1,81 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class BinaryExpressionTest extends JetTestCaseBase { - public void testMultiply() throws Exception { - Assert.assertEquals(expressionToKotlin("1 * 2"), "(1 * 2)"); - } - - public void testDivide() throws Exception { - Assert.assertEquals(expressionToKotlin("1 / 2"), "(1 / 2)"); - } - - public void testRemainder() throws Exception { - Assert.assertEquals(expressionToKotlin("1 % 2"), "(1 % 2)"); - } - - public void testPlus() throws Exception { - Assert.assertEquals(expressionToKotlin("1 + 2"), "(1 + 2)"); - } - - public void testMinus() throws Exception { - Assert.assertEquals(expressionToKotlin("1 - 2"), "(1 - 2)"); - } - - public void testLessThan() throws Exception { - Assert.assertEquals(expressionToKotlin("1 < 2"), "(1 < 2)"); - } - - public void testGreaterThan() throws Exception { - Assert.assertEquals(expressionToKotlin("1 > 2"), "(1 > 2)"); - } - - public void testLessThanEqual() throws Exception { - Assert.assertEquals(expressionToKotlin("1 <= 2"), "(1 <= 2)"); - } - - public void testGreaterThanEqual() throws Exception { - Assert.assertEquals(expressionToKotlin("1 >= 2"), "(1 >= 2)"); - } - - public void testConditionalAnd() throws Exception { - Assert.assertEquals(expressionToKotlin("true && false"), "(true && false)"); - } - - public void testConditionalOr() throws Exception { - Assert.assertEquals(expressionToKotlin("true || false"), "(true || false)"); - } - - public void testShiftRight() throws Exception { - Assert.assertEquals(expressionToKotlin("x >> 2"), "(x shr 2)"); - } - - public void testShiftLeft() throws Exception { - Assert.assertEquals(expressionToKotlin("x << 2"), "(x shl 2)"); - } - - public void testUnsignedRightShift() throws Exception { - Assert.assertEquals(expressionToKotlin("x >>> 2"), "x.cyclicShiftRight(2)"); - } - - public void testXor() throws Exception { - Assert.assertEquals(expressionToKotlin("x ^ 2"), "(x xor 2)"); - } - - public void testAnd() throws Exception { - Assert.assertEquals(expressionToKotlin("x & 2"), "(x and 2)"); - } - - public void testOr() throws Exception { - Assert.assertEquals(expressionToKotlin("x | 2"), "(x or 2)"); - } - -// public void testNot() throws Exception { // TODO: move to prefix -// Assert.assertEquals(expressionToKotlin("~x"), "inv(x)"); -// } -} diff --git a/test/org/jetbrains/jet/j2k/ast/BoxedTypeTest.java b/test/org/jetbrains/jet/j2k/ast/BoxedTypeTest.java deleted file mode 100644 index f9c58660380..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/BoxedTypeTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class BoxedTypeTest extends JetTestCaseBase { - public void testObject() throws Exception { - Assert.assertEquals(statementToKotlin("Object i = 10;"), "var i : Any? = 10"); - } - - public void testBoolean() throws Exception { - Assert.assertEquals(statementToKotlin("Boolean i = 10;"), "var i : Boolean? = 10"); - } - - public void testByte() throws Exception { - Assert.assertEquals(statementToKotlin("Byte i = 10;"), "var i : Byte? = 10"); - } - - public void testCharacter() throws Exception { - Assert.assertEquals(statementToKotlin("Character i = 10;"), "var i : Char? = 10"); - } - - public void testDouble() throws Exception { - Assert.assertEquals(statementToKotlin("Double i = 10;"), "var i : Double? = 10"); - } - - public void testFloat() throws Exception { - Assert.assertEquals(statementToKotlin("Float i = 10;"), "var i : Float? = 10"); - } - - public void testInteger() throws Exception { - Assert.assertEquals(statementToKotlin("Integer i = 10;"), "var i : Int? = 10"); - } - - public void testLong() throws Exception { - Assert.assertEquals(statementToKotlin("Long i = 10;"), "var i : Long? = 10"); - } - - public void testShort() throws Exception { - Assert.assertEquals(statementToKotlin("Short i = 10;"), "var i : Short? = 10"); - } - -// public void testNewInteger() throws Exception { -// Assert.assertEquals( -// statementToKotlin("Integer i = new Integer(10);"), -// "var i : Int? = Integer(10).toInt()" -// ); -// } -} diff --git a/test/org/jetbrains/jet/j2k/ast/BreakStatementTest.java b/test/org/jetbrains/jet/j2k/ast/BreakStatementTest.java deleted file mode 100644 index e8e7c8907a7..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/BreakStatementTest.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class BreakStatementTest extends JetTestCaseBase { - public void testBreakWithoutLabel() throws Exception { - Assert.assertEquals( - statementToSingleLineKotlin("break;"), - "break" - ); - } - - public void testBreakWithLabel() throws Exception { - Assert.assertEquals( - statementToSingleLineKotlin("break label;"), - "break@label" - ); - } -} diff --git a/test/org/jetbrains/jet/j2k/ast/ClassTest.java b/test/org/jetbrains/jet/j2k/ast/ClassTest.java deleted file mode 100644 index 907183b84eb..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/ClassTest.java +++ /dev/null @@ -1,152 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class ClassTest extends JetTestCaseBase { - public void testEmptyClass() throws Exception { - Assert.assertEquals( - classToSingleLineKotlin("final class A {}"), - "class A { }" - ); - } - - public void testInnerEmptyClass() throws Exception { - Assert.assertEquals( - classToSingleLineKotlin("final class A { inner final class B {} }"), - "class A { class B { } }" - ); - } - - public void testClassWithFields() throws Exception { - Assert.assertEquals(classToKotlin( - "final class T {" + - "String a = \"abc\";" + - "int b = 10;" + - "}"), - "class T {\n" + - "var a : String? = \"abc\"\n" + - "var b : Int = 10\n" + - "}"); - } - - public void testClassWithMultiplyFields() throws Exception { - Assert.assertEquals(classToKotlin( - "final class T {" + - "String a, b, c = \"abc\";" + - "}"), - "class T {\n" + - "var a : String?\n" + - "var b : String?\n" + - "var c : String? = \"abc\"\n" + - "}"); - } - - public void testClassWithEmptyMethods() throws Exception { - Assert.assertEquals(classToKotlin( - "final class T {" + - "void main() {}" + - "int i() {}" + - "String s() {}" + - "}" - ), - "class T {\n" + - "fun main() : Unit {\n" + - "}\n" + - "fun i() : Int {\n" + - "}\n" + - "fun s() : String? {\n" + - "}\n" + - "}"); - } - - public void testGenericClass() throws Exception { - Assert.assertEquals( - classToSingleLineKotlin("final class Entry {}"), - "class Entry { }" - ); - } - - public void testSimpleInheritance() throws Exception { - Assert.assertEquals( - classToSingleLineKotlin("final class A extends Base {}"), - "class A : Base { }" - ); - } - - public void testExtendsOneClassAndImplementsOneInterface() throws Exception { - Assert.assertEquals( - classToSingleLineKotlin("final class A extends Base implements I {}"), - "class A : Base, I { }" - ); - } - - public void testExtendsOneClassAndImplementsSeveralInterfaces() throws Exception { - Assert.assertEquals( - classToSingleLineKotlin("final class A extends Base implements I0, I1, I2 {}"), - "class A : Base, I0, I1, I2 { }" - ); - } - - public void testClass() throws Exception { - Assert.assertEquals(classToSingleLineKotlin("class Test {}"), "open class Test { }"); - } - - public void testFinalClass() throws Exception { - Assert.assertEquals(classToSingleLineKotlin("final class Test {}"), "class Test { }"); - } - - public void testPublicClass() throws Exception { - Assert.assertEquals(classToSingleLineKotlin("public class Test {}"), "public open class Test { }"); - } - - public void testProtectedClass() throws Exception { - Assert.assertEquals(classToSingleLineKotlin("protected class Test {}"), "protected open class Test { }"); - } - - public void testPivateClass() throws Exception { - Assert.assertEquals(classToSingleLineKotlin("private class Test {}"), "private open class Test { }"); - } - - public void testInternalClass() throws Exception { - Assert.assertEquals(classToSingleLineKotlin("class Test {}"), "open class Test { }"); - } - - public void testOneStaticMethod() throws Exception { - Assert.assertEquals( - classToSingleLineKotlin("final class S { static boolean staticF() { return true; } }"), - "class S { class object { fun staticF() : Boolean { return true } } }" - ); - } - - public void testTwoStaticMethod() throws Exception { - Assert.assertEquals( - classToSingleLineKotlin("final class S { static boolean sB() { return true; } static int sI() { return 1; } }"), - "class S { class object { fun sB() : Boolean { return true } fun sI() : Int { return 1 } } }" - ); - } - - public void testOneStaticMethodOneNonStatic() throws Exception { - Assert.assertEquals( - classToSingleLineKotlin("final class S { boolean sB() { return true; } static int sI() { return 1; } }"), - "class S { class object { fun sI() : Int { return 1 } } fun sB() : Boolean { return true } }" - ); - } - - public void testOneStaticFieldOneNonStatic() throws Exception { - Assert.assertEquals( - classToSingleLineKotlin("final class S { boolean sB() { return true; } static int myI = 10; }"), - "class S { class object { var myI : Int = 10 } fun sB() : Boolean { return true } }" - ); - } - - public void testInnerStaticClass() throws Exception { - Assert.assertEquals( - classToSingleLineKotlin("final class S { static class Inner {} }"), - "class S { class object { open class Inner { } } }" - ); - } -} \ No newline at end of file diff --git a/test/org/jetbrains/jet/j2k/ast/ConditionalExpressionTest.java b/test/org/jetbrains/jet/j2k/ast/ConditionalExpressionTest.java deleted file mode 100644 index 9bbf599949b..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/ConditionalExpressionTest.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class ConditionalExpressionTest extends JetTestCaseBase { - public void testSimpleConditionalExpression() throws Exception { - Assert.assertEquals( - expressionToKotlin("a.isEmpty() ? 0 : 1"), - "(if (a.isEmpty())\n" + - "0\n" + - "else\n" + - "1)" - ); - } -} \ No newline at end of file diff --git a/test/org/jetbrains/jet/j2k/ast/ContinueStatementTest.java b/test/org/jetbrains/jet/j2k/ast/ContinueStatementTest.java deleted file mode 100644 index c7e62f4e123..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/ContinueStatementTest.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class ContinueStatementTest extends JetTestCaseBase { - public void testContinueWithoutLabel() throws Exception { - Assert.assertEquals( - statementToSingleLineKotlin("continue;"), - "continue" - ); - } - - public void testContinueWithLabel() throws Exception { - Assert.assertEquals( - statementToSingleLineKotlin("continue label;"), - "continue@label" - ); - } -} diff --git a/test/org/jetbrains/jet/j2k/ast/DeclarationStatementTest.java b/test/org/jetbrains/jet/j2k/ast/DeclarationStatementTest.java deleted file mode 100644 index 7ab8993a242..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/DeclarationStatementTest.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class DeclarationStatementTest extends JetTestCaseBase { - public void testSingleStringDeclaration() throws Exception { - Assert.assertEquals( - statementToSingleLineKotlin("String s;"), - "var s : String?" - ); - } - - public void testSingleIntDeclaration() throws Exception { - Assert.assertEquals( - statementToSingleLineKotlin("int s;"), - "var s : Int" - ); - } - - public void testMultiplyIntDeclaration() throws Exception { - Assert.assertEquals( - statementToKotlin("int k, l, m;"), - "var k : Int\n" + - "var l : Int\n" + - "var m : Int" - ); - } - - public void testSingleFinalStringDeclaration() throws Exception { - Assert.assertEquals( - statementToSingleLineKotlin("final String s;"), - "val s : String?" - ); - } - - public void testSingleFinalIntDeclaration() throws Exception { - Assert.assertEquals( - statementToSingleLineKotlin("final int s;"), - "val s : Int" - ); - } - - public void testMultiplyFinalIntDeclaration() throws Exception { - Assert.assertEquals( - statementToKotlin("final int k, l, m;"), - "val k : Int\n" + - "val l : Int\n" + - "val m : Int" - ); - } -} diff --git a/test/org/jetbrains/jet/j2k/ast/DoWhileStatementTest.java b/test/org/jetbrains/jet/j2k/ast/DoWhileStatementTest.java deleted file mode 100644 index a3ab333cda0..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/DoWhileStatementTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import org.jetbrains.jet.j2k.JetTestCaseBase; -import org.junit.Assert; - -/** - * @author ignatov - */ -public class DoWhileStatementTest extends JetTestCaseBase { - public void testWhileWithEmptyBlock() throws Exception { - Assert.assertEquals( - statementToKotlin("do {} while (true)"), - "do\n" + - "{\n" + - "}\n" + - "while (true)" - ); - } - - public void testWhileWithBlock() throws Exception { - Assert.assertEquals( - statementToKotlin("do {int i = 1; i = i + 1;} while (a > b)"), - "do\n" + - "{\n" + - "var i : Int = 1\n" + - "i = (i + 1)\n" + - "}\n" + - "while ((a > b))" - ); - } - - public void testWhileWithReturn() throws Exception { - Assert.assertEquals( - statementToKotlin("do return 1; while (true)"), - "do\nreturn 1\nwhile (true)" - ); - } - - public void testWhileWithExpression() throws Exception { - Assert.assertEquals( - statementToKotlin("do i = i + 1; while (true)"), - "do\ni = (i + 1)\nwhile (true)" - ); - } -} diff --git a/test/org/jetbrains/jet/j2k/ast/EnumTest.java b/test/org/jetbrains/jet/j2k/ast/EnumTest.java deleted file mode 100644 index b7de6a939ec..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/EnumTest.java +++ /dev/null @@ -1,159 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class EnumTest extends JetTestCaseBase { - public void testEmptyEnum() throws Exception { - Assert.assertEquals( - classToSingleLineKotlin("enum A {}"), - "enum A { }" - ); - } - - public void testTypeSafeEnum() throws Exception { - Assert.assertEquals( - classToKotlin("enum Coin { PENNY, NICKEL, DIME, QUARTER; }"), - "enum Coin {\n" + - "PENNY\n" + - "NICKEL\n" + - "DIME\n" + - "QUARTER\n" + - "}" - ); - } - - public void testOverrideToString() throws Exception { - Assert.assertEquals( - classToKotlin( - "enum Color {" + - " WHITE, BLACK, RED, YELLOW, BLUE;" + - "@Override String toString() {" + - " return \"COLOR\";" + - "}" + - "}"), - "enum Color {\n" + - "WHITE\n" + - "BLACK\n" + - "RED\n" + - "YELLOW\n" + - "BLUE\n" + - "override fun toString() : String? {\n" + - "return \"COLOR\"\n" + - "}\n" + - "}" - ); - } - - public void testFieldsWithPrimaryPrivateConstructor() throws Exception { - Assert.assertEquals( - classToKotlin( - "enum Color {\n" + - " WHITE(21), BLACK(22), RED(23), YELLOW(24), BLUE(25);\n" + - "\n" + - " private int code;\n" + - "\n" + - " private Color(int c) {\n" + - " code = c;\n" + - " }\n" + - "\n" + - " public int getCode() {\n" + - " return code;\n" + - " }"), - "enum Color {\n" + - "WHITE(21)\n" + - "BLACK(22)\n" + - "RED(23)\n" + - "YELLOW(24)\n" + - "BLUE(25)\n" + - "private var code : Int\n" + - "private (c : Int) {\n" + - "code = c\n" + - "}\n" + - "public fun getCode() : Int {\n" + - "return code\n" + - "}\n" + - "}" - ); - } - - public void testEnumImplementsOneInterface() throws Exception { - Assert.assertEquals( - classToSingleLineKotlin("enum A implements I {}"), - "enum A : I { }" - ); - } - - public void testEnumWithNameField() throws Exception { - Assert.assertEquals( - classToKotlin("enum E { I; private String name; }"), - "enum E {\nI\nprivate var name : String?\n}" - ); - } - - public void testEnumImplementsSeveralInterfaces() throws Exception { - Assert.assertEquals( - classToSingleLineKotlin("enum A implements I0, I1, I2 {}"), - "enum A : I0, I1, I2 { }" - ); - } - - public void testPublicEnum() throws Exception { - Assert.assertEquals(classToSingleLineKotlin("public enum Test {}"), "public enum Test { }"); - } - - public void testProtectedEnum() throws Exception { - Assert.assertEquals(classToSingleLineKotlin("protected enum Test {}"), "protected enum Test { }"); - } - - public void testPrivateEnum() throws Exception { - Assert.assertEquals(classToSingleLineKotlin("private enum Test {}"), "private enum Test { }"); - } - - public void testInternalEnum() throws Exception { - Assert.assertEquals(classToSingleLineKotlin("enum Test {}"), "enum Test { }"); - } - -// public void testTwoConstructors() throws Exception { -// Assert.assertEquals( -// classToKotlin( -// "enum MultEnum {\n" + -// " GREMLIN(\"UTILITY\"),\n" + -// " MORT(30);\n" + -// " \n" + -// " MultEnum(String s) {\n" + -// " }\n" + -// " \n" + -// " MultEnum(int dmg) {\n" + -// " }"), -// "" // TODO: will fail -// ); -// } - - public void testRunnableImplementation() throws Exception { - Assert.assertEquals( - classToKotlin( - "enum Color implements Runnable {\n" + - " WHITE, BLACK, RED, YELLOW, BLUE;\n" + - "\n" + - " public void run() {\n" + - " System.out.println(\"name()=\" + name() +\n" + - " \", toString()=\" + toString());\n" + - " }\n" + - "}"), - "enum Color : Runnable {\n" + - "WHITE\n" + - "BLACK\n" + - "RED\n" + - "YELLOW\n" + - "BLUE\n" + - "override public fun run() : Unit {\n" + - "System.out.println((\"name()=\" + name() + \", toString()=\" + toString()))\n" + - "}\n" + - "}" - ); - } -} diff --git a/test/org/jetbrains/jet/j2k/ast/FieldTest.java b/test/org/jetbrains/jet/j2k/ast/FieldTest.java deleted file mode 100644 index 4be8af966fc..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/FieldTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class FieldTest extends JetTestCaseBase { - public void testVarWithoutInit() throws Exception { - Assert.assertEquals( - methodToSingleLineKotlin("Foo f;"), - "var f : Foo?" - ); - } - - public void testVarWithInit() throws Exception { - Assert.assertEquals( - methodToSingleLineKotlin("Foo f = new Foo(1, 2);"), - "var f : Foo? = Foo(1, 2)" - ); - } - - public void testValWithInit() throws Exception { - Assert.assertEquals( - methodToSingleLineKotlin("final Foo f = new Foo(1, 2);"), - "val f : Foo? = Foo(1, 2)" - ); - } - - public void testPrivateField() throws Exception { - Assert.assertEquals(methodToSingleLineKotlin("private Foo f;"), "private var f : Foo?"); - } - - public void testProtectedField() throws Exception { - Assert.assertEquals(methodToSingleLineKotlin("protected Foo f;"), "protected var f : Foo?"); - } - - public void testPublicField() throws Exception { - Assert.assertEquals(methodToSingleLineKotlin("public Foo f;"), "public var f : Foo?"); - } - - public void testInternalField() throws Exception { - Assert.assertEquals(methodToSingleLineKotlin("Foo f;"), "var f : Foo?"); - } -} diff --git a/test/org/jetbrains/jet/j2k/ast/FileTest.java b/test/org/jetbrains/jet/j2k/ast/FileTest.java deleted file mode 100644 index 75d5a05a6da..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/FileTest.java +++ /dev/null @@ -1,68 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class FileTest extends JetTestCaseBase { - public void testPackageWithImports() throws Exception { - Assert.assertEquals( - fileToKotlin( - "package test;" + - "import ast;" + - "import ast2;"), - "namespace test {" + "\n" + - "import ast" + "\n" + - "import ast2" + "\n" + - "}" - ); - } - - public void testPackageWithMixedImports() throws Exception { - Assert.assertEquals( - fileToKotlin( - "package test;" + - "import static ast;" + - "import ast2;"), - "namespace test {" + "\n" + - "import ast" + "\n" + - "import ast2" + "\n" + - "}" - ); - } - - public void testPackageWithStaticImports() throws Exception { - Assert.assertEquals( - fileToKotlin( - "package test;" + - "import static ast;" + - "import static ast2;"), - "namespace test {" + "\n" + - "import ast" + "\n" + - "import ast2" + "\n" + - "}" - ); - } - - public void testPackageWithClass() throws Exception { - Assert.assertEquals( - toSingleLine(fileToKotlin("package test; final class C {}")), - "namespace test { class C { } }" - ); - } - - public void testPackageWithOpenClass() throws Exception { - Assert.assertEquals( - toSingleLine(fileToKotlin("package test; class C {}")), - "namespace test { open class C { } }" - ); - } - - public void testPackageWithClasses() throws Exception { - Assert.assertEquals( - toSingleLine(fileToKotlin("final class A {} final class B {}")), - "namespace { class A { } class B { } }"); - } -} diff --git a/test/org/jetbrains/jet/j2k/ast/ForTest.java b/test/org/jetbrains/jet/j2k/ast/ForTest.java deleted file mode 100644 index 0ff18e98229..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/ForTest.java +++ /dev/null @@ -1,115 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class ForTest extends JetTestCaseBase { - public void testCommonCaseForTest() throws Exception { - Assert.assertEquals( - statementToKotlin("for (init(); condition(); update()) body();"), - "{\n" + - "init()\n" + - "while (condition())\n" + - "{\n" + - "body()\n" + - "{\n" + - "update()\n" + - "}\n" + - "}\n" + - "}" - ); - } - - public void testForWithEmptyBlock() throws Exception { - Assert.assertEquals( - statementToKotlin("for (int i = 0; i < 0; j++, i++) {}"), - "{\n" + - "var i : Int = 0\n" + - "while ((i < 0))\n" + - "{\n" + - "{\n" + - "}\n" + - "{\n" + - "(j++)\n" + - "(i++)\n" + - "}\n" + - "}\n" + - "}" - ); - } - - public void testForWithBlock() throws Exception { - Assert.assertEquals( - statementToKotlin("for (int i = 0; i < 0; i++) {int i = 1; i++;}"), - "{\n" + - "var i : Int = 0\n" + - "while ((i < 0))\n" + - "{\n" + - "{\n" + - "var i : Int = 1\n" + - "(i++)\n" + - "}\n" + - "{\n" + - "(i++)\n" + - "}\n" + - "}\n" + - "}" - ); - } - - public void testForWithBlockAndDoubleUpdate() throws Exception { - Assert.assertEquals( - statementToKotlin("for (int i = 0; i < 0; j++, i++) {int i = 1; i++;}"), - "{\n" + - "var i : Int = 0\n" + - "while ((i < 0))\n" + - "{\n" + - "{\n" + - "var i : Int = 1\n" + - "(i++)\n" + - "}\n" + - "{\n" + - "(j++)\n" + - "(i++)\n" + - "}\n" + - "}\n" + - "}" - ); - } - - public void testForWithReturn() throws Exception { - Assert.assertEquals( - statementToKotlin("for (int i = 0; i < 0; j++, i++) return i;"), - "{\n" + - "var i : Int = 0\n" + - "while ((i < 0))\n" + - "{\n" + - "return i\n" + - "{\n" + - "(j++)\n" + - "(i++)\n" + - "}\n" + - "}\n" + - "}" - ); - } - - public void testForWithExpression() throws Exception { - Assert.assertEquals( - statementToKotlin("for (int i = 0; i < 0; i++) t++;"), - "{\n" + - "var i : Int = 0\n" + - "while ((i < 0))\n" + - "{\n" + - "(t++)\n" + - "{\n" + - "(i++)\n" + - "}\n" + - "}\n" + - "}" - ); - } -} diff --git a/test/org/jetbrains/jet/j2k/ast/ForeachStatementTest.java b/test/org/jetbrains/jet/j2k/ast/ForeachStatementTest.java deleted file mode 100644 index d283c806c11..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/ForeachStatementTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class ForeachStatementTest extends JetTestCaseBase { - public void testEnhancedForWithEmptyBlock() throws Exception { - Assert.assertEquals( - statementToKotlin("for (Node n : list) {}"), - "for (n : Node? in list)\n{\n" + "}" - ); - } - - public void testEnhancedForWithBlock() throws Exception { - Assert.assertEquals( - statementToKotlin("for (Node n : list) {int i = 1; i++;}"), - "for (n : Node? in list)\n" + - "{\n" + - "var i : Int = 1\n" + - "(i++)\n" + - "}" - ); - } - - public void testEnhancedForWithReturn() throws Exception { - Assert.assertEquals( - statementToKotlin("for (Node n : list) return n;"), - "for (n : Node? in list)\nreturn n" - ); - } - - public void testEnhancedForWithExpression() throws Exception { - Assert.assertEquals( - statementToKotlin("for (Node n : list) i++;"), - "for (n : Node? in list)\n(i++)" - ); - } -} diff --git a/test/org/jetbrains/jet/j2k/ast/FunctionTest.java b/test/org/jetbrains/jet/j2k/ast/FunctionTest.java deleted file mode 100644 index 145d874009d..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/FunctionTest.java +++ /dev/null @@ -1,87 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class FunctionTest extends JetTestCaseBase { - public void testEmptyVoidMethod() throws Exception { - Assert.assertEquals( - methodToSingleLineKotlin("void main() {}"), - "fun main() : Unit { }" - ); - } - - public void testMethodClassType() throws Exception { - Assert.assertEquals( - methodToSingleLineKotlin("String main() {}"), - "fun main() : String? { }" - ); - } - - public void testMethodPrimitiveType() throws Exception { - Assert.assertEquals( - methodToSingleLineKotlin("int main() {}"), - "fun main() : Int { }" - ); - } - - public void testMethodPrimitiveType2() throws Exception { - Assert.assertEquals( - methodToSingleLineKotlin("boolean main() {}"), - "fun main() : Boolean { }" - ); - } - - public void testMethodWithReturnStatement() throws Exception { - Assert.assertEquals( - methodToSingleLineKotlin("boolean isTrue() { return true; }"), - "fun isTrue() : Boolean { return true }" - ); - } - - public void testClassGenericParam() throws Exception { - Assert.assertEquals( - methodToSingleLineKotlin("T getT() {}"), - "fun getT() : T? { }" - ); - } - - public void testOwnGenericParam() throws Exception { - Assert.assertEquals( - methodToSingleLineKotlin(" void putU(U u) {}"), - "fun putU(u : U?) : Unit { }" - ); - } - - public void testOwnSeveralGenericParams() throws Exception { - Assert.assertEquals( - methodToSingleLineKotlin(" void putUVW(U u, V v, W w) {}"), - "fun putUVW(u : U?, v : V?, w : W?) : Unit { }" - ); - } - - public void testInternal() throws Exception { - Assert.assertEquals(methodToSingleLineKotlin("void test() {}"), "fun test() : Unit { }"); - } - - public void testPrivate() throws Exception { - Assert.assertEquals(methodToSingleLineKotlin("private void test() {}"), "private fun test() : Unit { }"); - } - - public void testProtected() throws Exception { - Assert.assertEquals(methodToSingleLineKotlin("protected void test() {}"), "protected fun test() : Unit { }"); - } - - public void testPublic() throws Exception { - Assert.assertEquals(methodToSingleLineKotlin("public void test() {}"), "public fun test() : Unit { }"); - } - - public void testOverride() throws Exception { - Assert.assertEquals(fileToSingleLineKotlin("class A {void a() {}} final class B extends A {void a() {}}"), - "namespace { open class A { fun a() : Unit { } } class B : A { override fun a() : Unit { } } }"); - } - -} \ No newline at end of file diff --git a/test/org/jetbrains/jet/j2k/ast/IdentifierImplTest.java b/test/org/jetbrains/jet/j2k/ast/IdentifierImplTest.java deleted file mode 100644 index 9b5dd9aff52..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/IdentifierImplTest.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.TestCase; - -/** - * @author ignatov - */ -public class IdentifierImplTest extends TestCase { - public void testEmpty() throws Exception { // TODO: remove - } -} diff --git a/test/org/jetbrains/jet/j2k/ast/IfStatementTest.java b/test/org/jetbrains/jet/j2k/ast/IfStatementTest.java deleted file mode 100644 index 7f08d3d871a..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/IfStatementTest.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class IfStatementTest extends JetTestCaseBase { - public void testIfStatementWithOneLineBlocks() throws Exception { - Assert.assertEquals( - statementToKotlin("if (true) return 1; else return 0;"), - "if (true)\n" + - "return 1\n" + - "else\n" + - "return 0" - ); - } - - public void testIfStatementWithMultilineBlocks() throws Exception { - Assert.assertEquals( - statementToKotlin("if (1 > 0) {int n = 1; return n;} else {return 0;}"), - "if ((1 > 0))\n" + - "{\n" + - "var n : Int = 1\n" + - "return n\n" + - "}\n" + - "else\n" + - "{\n" + - "return 0\n" + - "}" - ); - } - - public void testIfStatementWithoutElse() throws Exception { - Assert.assertEquals( - statementToKotlin("if (1 > 0) {int n = 1; return n;}"), - "if ((1 > 0))\n" + - "{\n" + - "var n : Int = 1\n" + - "return n\n" + - "}" - ); - } - - public void testIfStatementWithEmptyBlocks() throws Exception { - Assert.assertEquals( - statementToKotlin("if (1 > 0) {} else {}"), - "if ((1 > 0))\n" + - "{\n" + - "}\n" + - "else\n" + - "{\n" + - "}" - ); - } -} diff --git a/test/org/jetbrains/jet/j2k/ast/InProjectionTypeTest.java b/test/org/jetbrains/jet/j2k/ast/InProjectionTypeTest.java deleted file mode 100644 index e5bf07095f6..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/InProjectionTypeTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class InProjectionTypeTest extends JetTestCaseBase { - public void testMethodParams() throws Exception { - Assert.assertEquals( - methodToSingleLineKotlin("void popAll(Collection dst) {}"), - "fun popAll(dst : Collection?) : Unit { }" - ); - } -} diff --git a/test/org/jetbrains/jet/j2k/ast/IsOperatorTest.java b/test/org/jetbrains/jet/j2k/ast/IsOperatorTest.java deleted file mode 100644 index 76e7ce2b0fc..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/IsOperatorTest.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class IsOperatorTest extends JetTestCaseBase { - public void testSimpleReference() throws Exception { - Assert.assertEquals( - expressionToKotlin("a instanceof String"), - "(a is String?)" - ); - } - - public void testComplicatedExpression() throws Exception { - Assert.assertEquals( - expressionToKotlin("c.getType().getName() instanceof String"), - "(c.getType().getName() is String?)" - ); - } -} diff --git a/test/org/jetbrains/jet/j2k/ast/LabelStatementTest.java b/test/org/jetbrains/jet/j2k/ast/LabelStatementTest.java deleted file mode 100644 index a6c0cc99468..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/LabelStatementTest.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class LabelStatementTest extends JetTestCaseBase { - public void testComplicatedExampleFromJavaTutorial() throws Exception { - Assert.assertEquals( - statementToKotlin( - " test:" + - " for (int i = 0; i <= max; i++) {" + - " int n = substring.length();" + - " int j = i;" + - " int k = 0;" + - " while (n-- != 0) {" + - " if (searchMe.charAt(j++) != substring.charAt(k++)) {" + - " continue test;" + - " }" + - " } " + - " foundIt = true;" + - " break test;" + - " }" + - " System.out.println(foundIt ? \"Found it\" : \"Didn't find it\");" + - " }" + - "}"), - "@test {\n" + - "var i : Int = 0\n" + - "while ((i <= max))\n" + - "{\n" + - "{\n" + - "var n : Int = substring.length()\n" + - "var j : Int = i\n" + - "var k : Int = 0\n" + - "while (((n--) != 0))\n" + - "{\n" + - "if ((searchMe.charAt((j++)) != substring.charAt((k++))))\n" + - "{\n" + - "continue@test\n" + - "}\n" + - "}\n" + - "foundIt = true\n" + - "break@test\n" + - "}\n" + - "{\n" + - "(i++)\n" + - "}\n" + - "}\n" + - "}\n" + - "System.out.println((if (foundIt)\n" + - "\"Found it\"\n" + - "else\n" + - "\"Didn't find it\"))" - ); - } -} diff --git a/test/org/jetbrains/jet/j2k/ast/LocalVariableTest.java b/test/org/jetbrains/jet/j2k/ast/LocalVariableTest.java deleted file mode 100644 index fc056e3790e..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/LocalVariableTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class LocalVariableTest extends JetTestCaseBase { - public void testObject() throws Exception { - Assert.assertEquals( - statementToSingleLineKotlin("int i;"), - "var i : Int" - ); - } -} diff --git a/test/org/jetbrains/jet/j2k/ast/MethodCallExpressionTest.java b/test/org/jetbrains/jet/j2k/ast/MethodCallExpressionTest.java deleted file mode 100644 index 76d11053c28..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/MethodCallExpressionTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class MethodCallExpressionTest extends JetTestCaseBase { - public void testSimpleCall() throws Exception { - Assert.assertEquals( - statementToSingleLineKotlin("method(param1, param2);"), "method(param1, param2)" - ); - } - - public void testEmptyCall() throws Exception { - Assert.assertEquals( - statementToSingleLineKotlin("methodCall();"), "methodCall()" - ); - } - - public void testCallWithKeywords() throws Exception { - Assert.assertEquals( - statementToSingleLineKotlin("when(open, trait);"), "`when`(`open`, `trait`)" - ); - } -} diff --git a/test/org/jetbrains/jet/j2k/ast/NewClassExpressionTest.java b/test/org/jetbrains/jet/j2k/ast/NewClassExpressionTest.java deleted file mode 100644 index 78df5a362ef..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/NewClassExpressionTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class NewClassExpressionTest extends JetTestCaseBase { - public void testClassWithoutBody() throws Exception { - Assert.assertEquals(expressionToSingleLineKotlin("new Foo();"), "Foo()"); - } - - public void testClassWithoutBody2() throws Exception { - Assert.assertEquals(expressionToSingleLineKotlin("new myApp.Foo();"), "myApp.Foo()"); - } - - public void testClassWithParam() throws Exception { - Assert.assertEquals(expressionToSingleLineKotlin("new Foo(param);"), "Foo(param)"); - } - - public void testClassWithParams() throws Exception { - Assert.assertEquals(expressionToSingleLineKotlin("new Foo(param1, param2);"), "Foo(param1, param2)"); - } -} diff --git a/test/org/jetbrains/jet/j2k/ast/OutProjectionTypeTest.java b/test/org/jetbrains/jet/j2k/ast/OutProjectionTypeTest.java deleted file mode 100644 index 2475d11c506..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/OutProjectionTypeTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class OutProjectionTypeTest extends JetTestCaseBase { - public void testMethodParams() throws Exception { - Assert.assertEquals( - methodToSingleLineKotlin("void pushAll(Collection src) {}"), - "fun pushAll(src : Collection?) : Unit { }" - ); - } -} diff --git a/test/org/jetbrains/jet/j2k/ast/ParenthesizedExpressionTest.java b/test/org/jetbrains/jet/j2k/ast/ParenthesizedExpressionTest.java deleted file mode 100644 index 22b90d535a6..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/ParenthesizedExpressionTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class ParenthesizedExpressionTest extends JetTestCaseBase { - public void testParenthesized() throws Exception { - Assert.assertEquals(expressionToSingleLineKotlin("(1 + 2)"), "((1 + 2))"); - } - - public void testParenthesized2() throws Exception { - Assert.assertEquals(expressionToSingleLineKotlin("(o.toString() + \"abc\")"), "((o.toString() + \"abc\"))"); - } -} \ No newline at end of file diff --git a/test/org/jetbrains/jet/j2k/ast/PolyadicExpressionTest.java b/test/org/jetbrains/jet/j2k/ast/PolyadicExpressionTest.java deleted file mode 100644 index c707c50870d..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/PolyadicExpressionTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class PolyadicExpressionTest extends JetTestCaseBase { - public void testMultiply() throws Exception { - Assert.assertEquals(expressionToKotlin("1 * 2 * 3"), "(1 * 2 * 3)"); - } - - public void testDivide() throws Exception { - Assert.assertEquals(expressionToKotlin("1 / 2 / 3"), "(1 / 2 / 3)"); - } - - public void testRemainder() throws Exception { - Assert.assertEquals(expressionToKotlin("1 % 2 % 3"), "(1 % 2 % 3)"); - } - - public void testPlus() throws Exception { - Assert.assertEquals(expressionToKotlin("1 + 2 + 3"), "(1 + 2 + 3)"); - } - - public void testMinus() throws Exception { - Assert.assertEquals(expressionToKotlin("1 - 2 - 3"), "(1 - 2 - 3)"); - } -} diff --git a/test/org/jetbrains/jet/j2k/ast/PostfixOperatorTest.java b/test/org/jetbrains/jet/j2k/ast/PostfixOperatorTest.java deleted file mode 100644 index ac81dc2f0a6..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/PostfixOperatorTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class PostfixOperatorTest extends JetTestCaseBase { - public void testIncrement() throws Exception { - Assert.assertEquals(statementToKotlin("i++;"), "(i++)"); - } - - public void testDecrement() throws Exception { - Assert.assertEquals(statementToKotlin("i--;"), "(i--)"); - } -} diff --git a/test/org/jetbrains/jet/j2k/ast/PrefixOperatorTest.java b/test/org/jetbrains/jet/j2k/ast/PrefixOperatorTest.java deleted file mode 100644 index 27f312f2fe4..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/PrefixOperatorTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class PrefixOperatorTest extends JetTestCaseBase { - public void testIncrement() throws Exception { - Assert.assertEquals(statementToKotlin("++i;"), "(++i)"); - } - - public void testDecrement() throws Exception { - Assert.assertEquals(statementToKotlin("--i;"), "(--i)"); - } -} diff --git a/test/org/jetbrains/jet/j2k/ast/ReturnStatementTest.java b/test/org/jetbrains/jet/j2k/ast/ReturnStatementTest.java deleted file mode 100644 index 92fce59b4e4..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/ReturnStatementTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class ReturnStatementTest extends JetTestCaseBase { - public void testReturnLiteral() throws Exception { - Assert.assertEquals( - statementToSingleLineKotlin("return true;"), - "return true" - ); - } - - public void testReturnString() throws Exception { - Assert.assertEquals( - statementToSingleLineKotlin("return \"str\";"), - "return \"str\"" - ); - } - - public void testReturnNumber() throws Exception { - Assert.assertEquals( - statementToSingleLineKotlin("return 1;"), - "return 1" - ); - } - - public void testReturnChar() throws Exception { - Assert.assertEquals( - statementToSingleLineKotlin("return 'c';"), - "return 'c'" - ); - } -} diff --git a/test/org/jetbrains/jet/j2k/ast/StarProjectionTypeTest.java b/test/org/jetbrains/jet/j2k/ast/StarProjectionTypeTest.java deleted file mode 100644 index bd4ac8cae14..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/StarProjectionTypeTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class StarProjectionTypeTest extends JetTestCaseBase { - public void testMethodParams() throws Exception { - Assert.assertEquals( - methodToSingleLineKotlin("void wtf(Collection w) {}"), - "fun wtf(w : Collection<*>?) : Unit { }" - ); - } -} diff --git a/test/org/jetbrains/jet/j2k/ast/SynchronizedStatementTest.java b/test/org/jetbrains/jet/j2k/ast/SynchronizedStatementTest.java deleted file mode 100644 index 2d353b8af23..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/SynchronizedStatementTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class SynchronizedStatementTest extends JetTestCaseBase { - public void testSingleLineExample() throws Exception { - Assert.assertEquals( - statementToSingleLineKotlin("synchronized (s) { doSomething(s); }"), - "synchronized (s) { doSomething(s) }" - ); - } -} diff --git a/test/org/jetbrains/jet/j2k/ast/ThrowStatementTest.java b/test/org/jetbrains/jet/j2k/ast/ThrowStatementTest.java deleted file mode 100644 index 570c7b360ee..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/ThrowStatementTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class ThrowStatementTest extends JetTestCaseBase { - public void testSimpleThrowStatement() throws Exception { - Assert.assertEquals( - statementToSingleLineKotlin("throw exception;"), "throw exception"); - } -} diff --git a/test/org/jetbrains/jet/j2k/ast/TraitTest.java b/test/org/jetbrains/jet/j2k/ast/TraitTest.java deleted file mode 100644 index 03966099193..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/TraitTest.java +++ /dev/null @@ -1,95 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class TraitTest extends JetTestCaseBase { - public void testEmptyInterface() throws Exception { - Assert.assertEquals( - classToSingleLineKotlin("interface A {}"), - "trait A { }" - ); - } - - public void testInterfaceWithMethodDeclaration() throws Exception { - Assert.assertEquals(classToKotlin( - "interface INode {" + - "Tag getTag();" + - "String toKotlin();" + - "}" - ), - "trait INode {\n" + - "public fun getTag() : Tag? \n" + - "public fun toKotlin() : String? \n" + - "}"); - } - - public void testInterfaceWithFields() throws Exception { - Assert.assertEquals(classToKotlin( - "interface INode {" + - "String IN = \"in\";" + - "String AT = \"@\";" + - "String COMMA_WITH_SPACE = COMMA + SPACE;" + - "}" - ), - "trait INode {\n" + - "class object {\n" + - "public val IN : String? = \"in\"\n" + - "public val AT : String? = \"@\"\n" + - "public val COMMA_WITH_SPACE : String? = (COMMA + SPACE)\n" + - "}\n" + - "}" - ); - } - - public void testExtendsOneInterface() throws Exception { - Assert.assertEquals( - classToSingleLineKotlin("interface A extends I {}"), - "trait A : I { }" - ); - } - - public void testExtendsOneClassAndImplementsSeveralInterfaces() throws Exception { - Assert.assertEquals( - classToSingleLineKotlin("interface A extends I0, I1, I2 {}"), - "trait A : I0, I1, I2 { }" - ); - } - - public void testPublicInterface() throws Exception { - Assert.assertEquals(classToSingleLineKotlin("public interface Test {}"), "public trait Test { }"); - } - - public void testProtectedInterface() throws Exception { - Assert.assertEquals(classToSingleLineKotlin("protected interface Test {}"), "protected trait Test { }"); - } - - public void testPrivateInterface() throws Exception { - Assert.assertEquals(classToSingleLineKotlin("private interface Test {}"), "private trait Test { }"); - } - - public void testInternalInterface() throws Exception { - Assert.assertEquals(classToSingleLineKotlin("interface Test {}"), "trait Test { }"); - } - - public void testInterfaceWithStaticFields() throws Exception { - Assert.assertEquals(classToKotlin( - "public interface INode {" + - " public static final String IN = \"in\";" + - " public static final String AT = \"@\";" + - " public static final String COMMA_WITH_SPACE = COMMA + SPACE;" + - "}" - ), - "public trait INode {\n" + - "class object {\n" + - "public val IN : String? = \"in\"\n" + - "public val AT : String? = \"@\"\n" + - "public val COMMA_WITH_SPACE : String? = (COMMA + SPACE)\n" + - "}\n" + - "}" - ); - } -} \ No newline at end of file diff --git a/test/org/jetbrains/jet/j2k/ast/TryStatementTest.java b/test/org/jetbrains/jet/j2k/ast/TryStatementTest.java deleted file mode 100644 index e0cea4cdb49..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/TryStatementTest.java +++ /dev/null @@ -1,111 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class TryStatementTest extends JetTestCaseBase { - public void testEmptyTryWithTwoCatchesWithoutFinally() throws Exception { - Assert.assertEquals( - statementToKotlin( - "try {" + - "} catch (Exception e) {" + - " println(1);" + - "} catch (IOException e) {" + - " println(0);" + - "}"), - "try\n" + - "{\n" + - "}\n" + - "catch (e : Exception?) {\n" + - "println(1)\n" + - "}\n" + - "catch (e : IOException?) {\n" + - "println(0)\n" + - "}" - ); - } - - public void testEmptyTryWithTwoCatchesWithEmptyFinally() throws Exception { - Assert.assertEquals( - statementToKotlin( - "try {" + - "} catch (Exception e) {" + - " println(1);" + - "} catch (IOException e) {" + - " println(0);" + - "} finally {}"), - "try\n" + - "{\n" + - "}\n" + - "catch (e : Exception?) {\n" + - "println(1)\n" + - "}\n" + - "catch (e : IOException?) {\n" + - "println(0)\n" + - "}\n" + - "finally\n" + - "{\n" + - "}" - ); - } - - public void testEmptyTryWithTwoCatchesWithFinally() throws Exception { - Assert.assertEquals( - statementToKotlin( - "try {" + - "} catch (Exception e) {" + - " println(1);" + - "} catch (IOException e) {" + - " println(0);" + - "} finally {" + - " println(3);" + - "}"), - "try\n" + - "{\n" + - "}\n" + - "catch (e : Exception?) {\n" + - "println(1)\n" + - "}\n" + - "catch (e : IOException?) {\n" + - "println(0)\n" + - "}\n" + - "finally\n" + - "{\n" + - "println(3)\n" + - "}" - ); - } - - public void testCommonCaseForTryStatement() throws Exception { - Assert.assertEquals( - statementToKotlin( - "try {" + - " callMethod(params);" + - "} catch (Exception e) {" + - " println(1);" + - "} catch (IOException e) {" + - " println(0);" + - "} finally {" + - " println(3);" + - "}"), - "try\n" + - "{\n" + - "callMethod(params)\n" + - "}\n" + - "catch (e : Exception?) {\n" + - "println(1)\n" + - "}\n" + - "catch (e : IOException?) {\n" + - "println(0)\n" + - "}\n" + - "finally\n" + - "{\n" + - "println(3)\n" + - "}" - ); - } - -} diff --git a/test/org/jetbrains/jet/j2k/ast/TypeCastExpressionTest.java b/test/org/jetbrains/jet/j2k/ast/TypeCastExpressionTest.java deleted file mode 100644 index 71e41ec4dfc..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/TypeCastExpressionTest.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class TypeCastExpressionTest extends JetTestCaseBase { - public void testStringCast() throws Exception { - Assert.assertEquals( - expressionToKotlin("(String)t"), - "(t as String?)" - ); - } - - public void testIntCast() throws Exception { - Assert.assertEquals( - expressionToKotlin("(int)t"), - "(t as Int)" - ); - } - - public void testFooCast() throws Exception { - Assert.assertEquals( - expressionToKotlin("(Foo)t"), - "(t as Foo?)" - ); - } - - public void testPrimitiveType() throws Exception { - Assert.assertEquals( - expressionToKotlin("(int)100.00;"), - "(100.00 as Int)" - ); - } - - public void testSimpleGenericCast() throws Exception { - Assert.assertEquals( - expressionToKotlin("(List)list"), - "(list as List?)" - ); - } - - public void testExtendsWildcardCast() throws Exception { - Assert.assertEquals( - expressionToKotlin("(List)list"), - "(list as List?)" - ); - } - - public void testSuperWildcardCast() throws Exception { - Assert.assertEquals( - expressionToKotlin("(List)list"), - "(list as List?)" - ); - } - - public void testWildcardCast() throws Exception { - Assert.assertEquals( - expressionToKotlin("(List)list"), - "(list as List<*>?)" - ); - } -} \ No newline at end of file diff --git a/test/org/jetbrains/jet/j2k/ast/TypeParametersTest.java b/test/org/jetbrains/jet/j2k/ast/TypeParametersTest.java deleted file mode 100644 index 62ff6346b73..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/TypeParametersTest.java +++ /dev/null @@ -1,91 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class TypeParametersTest extends JetTestCaseBase { - public void testGenericParam() throws Exception { - Assert.assertEquals( - statementToKotlin("List l;"), - "var l : List?" - ); - } - - public void testManyGenericParams() throws Exception { - Assert.assertEquals( - statementToKotlin("List l;"), - "var l : List?" - ); - } - - public void testWhere() throws Exception { - Assert.assertEquals( - methodToSingleLineKotlin( - "> T max(Collection coll) {}"), - "fun max(coll : Collection?) : T? where T : Comparable? { }" - ); - } - - public void testMethodDoubleParametrizationWithTwoBounds() throws Exception { - Assert.assertEquals( - methodToSingleLineKotlin( - ", K extends Node & Collection> T max(Collection coll) {}"), - "fun max(coll : Collection?) : T? where T : Comparable?, K : Collection? { }" - ); - } - - public void testClassDoubleParametrizationWithTwoBoundsWithExtending() throws Exception { - Assert.assertEquals( - classToSingleLineKotlin("final class CC , K extends Node & Collection> extends A {}"), - "class CC : A where T : Comparable?, K : Collection? { }" - ); - } - - public void testTraitDoubleParametrizationWithTwoBoundsWithExtending() throws Exception { - Assert.assertEquals( - classToSingleLineKotlin( - "interface I , K extends Node & Collection> extends II {}"), - "trait I : II where T : Comparable?, K : Collection? { }" - ); - } - - public void testGenericClass() throws Exception { - Assert.assertEquals( - classToSingleLineKotlin("final class Comparable {}"), - "class Comparable { }" - ); - } - - public void testComplexExampleWithClassExtending() throws Exception { - Assert.assertEquals( - classToSingleLineKotlin( - "interface CommandHandler {}"), - "trait CommandHandler { }" - ); - } - - public void testClassParametrizationWithTwoBounds() throws Exception { - Assert.assertEquals( - classToSingleLineKotlin("final class C> {}"), - "class C where T : Comparable? { }" - ); - } - - public void testClassParametrizationWithTwoBoundsWithExtending() throws Exception { - Assert.assertEquals( - classToSingleLineKotlin("final class C> extends A {}"), - "class C : A where T : Comparable? { }" - ); - } - - public void testComplexExampleWithClassMultiplyExtending() throws Exception { - Assert.assertEquals( - classToSingleLineKotlin( - "interface CommandHandler {}"), - "trait CommandHandler { }" - ); - } -} diff --git a/test/org/jetbrains/jet/j2k/ast/VarArgTest.java b/test/org/jetbrains/jet/j2k/ast/VarArgTest.java deleted file mode 100644 index fc3d43f1053..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/VarArgTest.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class VarArgTest extends JetTestCaseBase { - public void testEllipsisTypeSingleParams() throws Exception { - Assert.assertEquals( - methodToSingleLineKotlin("void pushAll(Object... objs) {}"), - "fun pushAll(vararg objs : Any?) : Unit { }" - ); - } - - public void testEllipsisTypeSeveralParams() throws Exception { - Assert.assertEquals( - methodToSingleLineKotlin("String format(String pattern, Object... arguments);"), - "fun format(pattern : String?, vararg arguments : Any?) : String?" - ); - } -} diff --git a/test/org/jetbrains/jet/j2k/ast/WhileStatementTest.java b/test/org/jetbrains/jet/j2k/ast/WhileStatementTest.java deleted file mode 100644 index 838efc36cb3..00000000000 --- a/test/org/jetbrains/jet/j2k/ast/WhileStatementTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import junit.framework.Assert; -import org.jetbrains.jet.j2k.JetTestCaseBase; - -/** - * @author ignatov - */ -public class WhileStatementTest extends JetTestCaseBase { - public void testWhileWithEmptyBlock() throws Exception { - Assert.assertEquals( - statementToKotlin("while (true) {}"), - "while (true)\n{\n}" - ); - } - - public void testWhileWithBlock() throws Exception { - Assert.assertEquals( - statementToKotlin("while (a > b) {int i = 1; i = i + 1;}"), - "while ((a > b))\n" + - "{\n" + - "var i : Int = 1\n" + - "i = (i + 1)\n" + - "}" - ); - } - - public void testWhileWithReturn() throws Exception { - Assert.assertEquals( - statementToKotlin("while (true) return 1;"), - "while (true)\nreturn 1" - ); - } - - public void testWhileWithExpression() throws Exception { - Assert.assertEquals( - statementToKotlin("while (true) i = i + 1;"), - "while (true)\ni = (i + 1)" - ); - } -} diff --git a/testData/arrayAccessExpression/expression/expressionIndex.jav b/testData/arrayAccessExpression/expression/expressionIndex.jav new file mode 100644 index 00000000000..7a99230c2f6 --- /dev/null +++ b/testData/arrayAccessExpression/expression/expressionIndex.jav @@ -0,0 +1 @@ +myArray[myLibrary.calculateIndex(100)] \ No newline at end of file diff --git a/testData/arrayAccessExpression/expression/expressionIndex.kt b/testData/arrayAccessExpression/expression/expressionIndex.kt new file mode 100644 index 00000000000..7a99230c2f6 --- /dev/null +++ b/testData/arrayAccessExpression/expression/expressionIndex.kt @@ -0,0 +1 @@ +myArray[myLibrary.calculateIndex(100)] \ No newline at end of file diff --git a/testData/arrayAccessExpression/expression/intIndex.jav b/testData/arrayAccessExpression/expression/intIndex.jav new file mode 100644 index 00000000000..8a7de5e4e73 --- /dev/null +++ b/testData/arrayAccessExpression/expression/intIndex.jav @@ -0,0 +1 @@ +myArray[10] \ No newline at end of file diff --git a/testData/arrayAccessExpression/expression/intIndex.kt b/testData/arrayAccessExpression/expression/intIndex.kt new file mode 100644 index 00000000000..8a7de5e4e73 --- /dev/null +++ b/testData/arrayAccessExpression/expression/intIndex.kt @@ -0,0 +1 @@ +myArray[10] \ No newline at end of file diff --git a/testData/arrayAccessExpression/expression/variableIndex.jav b/testData/arrayAccessExpression/expression/variableIndex.jav new file mode 100644 index 00000000000..2a40dae7f3b --- /dev/null +++ b/testData/arrayAccessExpression/expression/variableIndex.jav @@ -0,0 +1 @@ +myArray[i] \ No newline at end of file diff --git a/testData/arrayAccessExpression/expression/variableIndex.kt b/testData/arrayAccessExpression/expression/variableIndex.kt new file mode 100644 index 00000000000..2a40dae7f3b --- /dev/null +++ b/testData/arrayAccessExpression/expression/variableIndex.kt @@ -0,0 +1 @@ +myArray[i] \ No newline at end of file diff --git a/testData/arrayInitializerExpression/expression/newInt.jav b/testData/arrayInitializerExpression/expression/newInt.jav new file mode 100644 index 00000000000..0d3fb727286 --- /dev/null +++ b/testData/arrayInitializerExpression/expression/newInt.jav @@ -0,0 +1 @@ +new int[] {1, 2, 3}; \ No newline at end of file diff --git a/testData/arrayInitializerExpression/expression/newInt.kt b/testData/arrayInitializerExpression/expression/newInt.kt new file mode 100644 index 00000000000..5bf3fb77d23 --- /dev/null +++ b/testData/arrayInitializerExpression/expression/newInt.kt @@ -0,0 +1 @@ +array(1, 2, 3) \ No newline at end of file diff --git a/testData/arrayInitializerExpression/expression/oneDim.jav b/testData/arrayInitializerExpression/expression/oneDim.jav new file mode 100644 index 00000000000..bfea03892f9 --- /dev/null +++ b/testData/arrayInitializerExpression/expression/oneDim.jav @@ -0,0 +1 @@ +{1, 2, 3}; \ No newline at end of file diff --git a/testData/arrayInitializerExpression/expression/oneDim.kt b/testData/arrayInitializerExpression/expression/oneDim.kt new file mode 100644 index 00000000000..5bf3fb77d23 --- /dev/null +++ b/testData/arrayInitializerExpression/expression/oneDim.kt @@ -0,0 +1 @@ +array(1, 2, 3) \ No newline at end of file diff --git a/testData/arrayInitializerExpression/expression/oneDimWithVariables.jav b/testData/arrayInitializerExpression/expression/oneDimWithVariables.jav new file mode 100644 index 00000000000..6d0d48ea35d --- /dev/null +++ b/testData/arrayInitializerExpression/expression/oneDimWithVariables.jav @@ -0,0 +1 @@ +{a, b, c}; \ No newline at end of file diff --git a/testData/arrayInitializerExpression/expression/oneDimWithVariables.kt b/testData/arrayInitializerExpression/expression/oneDimWithVariables.kt new file mode 100644 index 00000000000..61951103058 --- /dev/null +++ b/testData/arrayInitializerExpression/expression/oneDimWithVariables.kt @@ -0,0 +1 @@ +array(a, b, c) \ No newline at end of file diff --git a/testData/arrayInitializerExpression/expression/twoDim.jav b/testData/arrayInitializerExpression/expression/twoDim.jav new file mode 100644 index 00000000000..7892cebda83 --- /dev/null +++ b/testData/arrayInitializerExpression/expression/twoDim.jav @@ -0,0 +1 @@ +{ {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; \ No newline at end of file diff --git a/testData/arrayInitializerExpression/expression/twoDim.kt b/testData/arrayInitializerExpression/expression/twoDim.kt new file mode 100644 index 00000000000..9474db259a3 --- /dev/null +++ b/testData/arrayInitializerExpression/expression/twoDim.kt @@ -0,0 +1 @@ +array(array(1, 2, 3), array(4, 5, 6), array(7, 8, 9)) \ No newline at end of file diff --git a/testData/arrayType/method/methodArrayArgs.jav b/testData/arrayType/method/methodArrayArgs.jav new file mode 100644 index 00000000000..c5c5768faf4 --- /dev/null +++ b/testData/arrayType/method/methodArrayArgs.jav @@ -0,0 +1 @@ +void fromArrayToCollection(Foo[] a) {} \ No newline at end of file diff --git a/testData/arrayType/method/methodArrayArgs.kt b/testData/arrayType/method/methodArrayArgs.kt new file mode 100644 index 00000000000..6bd0c42dd8b --- /dev/null +++ b/testData/arrayType/method/methodArrayArgs.kt @@ -0,0 +1 @@ +fun fromArrayToCollection(a : Array?) : Unit { } \ No newline at end of file diff --git a/testData/arrayType/statement/arrayInitializationStatement.jav b/testData/arrayType/statement/arrayInitializationStatement.jav new file mode 100644 index 00000000000..781bcb6a731 --- /dev/null +++ b/testData/arrayType/statement/arrayInitializationStatement.jav @@ -0,0 +1 @@ +int [][] d2 = new int[][]{}; \ No newline at end of file diff --git a/testData/arrayType/statement/arrayInitializationStatement.kt b/testData/arrayType/statement/arrayInitializationStatement.kt new file mode 100644 index 00000000000..283e73ae8ae --- /dev/null +++ b/testData/arrayType/statement/arrayInitializationStatement.kt @@ -0,0 +1 @@ +var d2 : Array? = array() \ No newline at end of file diff --git a/testData/arrayType/statement/arrayInitializationStatementWithDimension.jav b/testData/arrayType/statement/arrayInitializationStatementWithDimension.jav new file mode 100644 index 00000000000..01c957d5dfe --- /dev/null +++ b/testData/arrayType/statement/arrayInitializationStatementWithDimension.jav @@ -0,0 +1 @@ +int [][] d2 = new int[5][]; \ No newline at end of file diff --git a/testData/arrayType/statement/arrayInitializationStatementWithDimension.kt b/testData/arrayType/statement/arrayInitializationStatementWithDimension.kt new file mode 100644 index 00000000000..3add329fe03 --- /dev/null +++ b/testData/arrayType/statement/arrayInitializationStatementWithDimension.kt @@ -0,0 +1 @@ +var d2 : Array? = Array?(5, {null}) \ No newline at end of file diff --git a/testData/arrayType/statement_mult/doubleArray.jav b/testData/arrayType/statement_mult/doubleArray.jav new file mode 100644 index 00000000000..ff57a8cb89d --- /dev/null +++ b/testData/arrayType/statement_mult/doubleArray.jav @@ -0,0 +1 @@ +double[] a = new double[]{1, 2, 3} \ No newline at end of file diff --git a/testData/arrayType/statement_mult/doubleArray.kt b/testData/arrayType/statement_mult/doubleArray.kt new file mode 100644 index 00000000000..152845e23f9 --- /dev/null +++ b/testData/arrayType/statement_mult/doubleArray.kt @@ -0,0 +1 @@ +var a : DoubleArray? = array(1, 2, 3) \ No newline at end of file diff --git a/testData/arrayType/statement_mult/longArray.jav b/testData/arrayType/statement_mult/longArray.jav new file mode 100644 index 00000000000..8ba3eb35a5c --- /dev/null +++ b/testData/arrayType/statement_mult/longArray.jav @@ -0,0 +1 @@ +long[] a = new long[]{1, 2, 3} \ No newline at end of file diff --git a/testData/arrayType/statement_mult/longArray.kt b/testData/arrayType/statement_mult/longArray.kt new file mode 100644 index 00000000000..f4a9760f755 --- /dev/null +++ b/testData/arrayType/statement_mult/longArray.kt @@ -0,0 +1 @@ +var a : LongArray? = array(1, 2, 3) \ No newline at end of file diff --git a/testData/arrayType/statement_mult/newIntArray.jav b/testData/arrayType/statement_mult/newIntArray.jav new file mode 100644 index 00000000000..8c66b71c91f --- /dev/null +++ b/testData/arrayType/statement_mult/newIntArray.jav @@ -0,0 +1 @@ +int[] a = new int[]{1, 2, 3} \ No newline at end of file diff --git a/testData/arrayType/statement_mult/newIntArray.kt b/testData/arrayType/statement_mult/newIntArray.kt new file mode 100644 index 00000000000..7b306f0e0fc --- /dev/null +++ b/testData/arrayType/statement_mult/newIntArray.kt @@ -0,0 +1 @@ +var a : IntArray? = array(1, 2, 3) \ No newline at end of file diff --git a/testData/arrayType/statement_mult/newStringArray.jav b/testData/arrayType/statement_mult/newStringArray.jav new file mode 100644 index 00000000000..371c13bfa2d --- /dev/null +++ b/testData/arrayType/statement_mult/newStringArray.jav @@ -0,0 +1 @@ +String[] a = new String[]{"abc"} \ No newline at end of file diff --git a/testData/arrayType/statement_mult/newStringArray.kt b/testData/arrayType/statement_mult/newStringArray.kt new file mode 100644 index 00000000000..75bd5eaa610 --- /dev/null +++ b/testData/arrayType/statement_mult/newStringArray.kt @@ -0,0 +1 @@ +var a : Array? = array("abc") \ No newline at end of file diff --git a/testData/assertStatement/statement_mult/onlyCondition.jav b/testData/assertStatement/statement_mult/onlyCondition.jav new file mode 100644 index 00000000000..7ac44744fe6 --- /dev/null +++ b/testData/assertStatement/statement_mult/onlyCondition.jav @@ -0,0 +1 @@ +assert boolMethod(); \ No newline at end of file diff --git a/testData/assertStatement/statement_mult/onlyCondition.kt b/testData/assertStatement/statement_mult/onlyCondition.kt new file mode 100644 index 00000000000..e148b562e0c --- /dev/null +++ b/testData/assertStatement/statement_mult/onlyCondition.kt @@ -0,0 +1 @@ +assert {boolMethod()} \ No newline at end of file diff --git a/testData/assertStatement/statement_mult/onlyConditionWithBraces.jav b/testData/assertStatement/statement_mult/onlyConditionWithBraces.jav new file mode 100644 index 00000000000..b1c738d82a9 --- /dev/null +++ b/testData/assertStatement/statement_mult/onlyConditionWithBraces.jav @@ -0,0 +1 @@ +assert(boolMethod()); \ No newline at end of file diff --git a/testData/assertStatement/statement_mult/onlyConditionWithBraces.kt b/testData/assertStatement/statement_mult/onlyConditionWithBraces.kt new file mode 100644 index 00000000000..dda5f1e1170 --- /dev/null +++ b/testData/assertStatement/statement_mult/onlyConditionWithBraces.kt @@ -0,0 +1 @@ +assert {(boolMethod())} \ No newline at end of file diff --git a/testData/assertStatement/statement_mult/withStringDetail.jav b/testData/assertStatement/statement_mult/withStringDetail.jav new file mode 100644 index 00000000000..aad7600e036 --- /dev/null +++ b/testData/assertStatement/statement_mult/withStringDetail.jav @@ -0,0 +1 @@ +assert true : "string details"; \ No newline at end of file diff --git a/testData/assertStatement/statement_mult/withStringDetail.kt b/testData/assertStatement/statement_mult/withStringDetail.kt new file mode 100644 index 00000000000..9fa45aa19e7 --- /dev/null +++ b/testData/assertStatement/statement_mult/withStringDetail.kt @@ -0,0 +1 @@ +assert("string details") {true} \ No newline at end of file diff --git a/testData/assignmentExpression/expression_mult/and.jav b/testData/assignmentExpression/expression_mult/and.jav new file mode 100644 index 00000000000..d345703fc8e --- /dev/null +++ b/testData/assignmentExpression/expression_mult/and.jav @@ -0,0 +1 @@ +x &= 2 \ No newline at end of file diff --git a/testData/assignmentExpression/expression_mult/and.kt b/testData/assignmentExpression/expression_mult/and.kt new file mode 100644 index 00000000000..9d3b5a87264 --- /dev/null +++ b/testData/assignmentExpression/expression_mult/and.kt @@ -0,0 +1 @@ +x = (x and 2) \ No newline at end of file diff --git a/testData/assignmentExpression/expression_mult/assignment.jav b/testData/assignmentExpression/expression_mult/assignment.jav new file mode 100644 index 00000000000..1ddfb7dc8e4 --- /dev/null +++ b/testData/assignmentExpression/expression_mult/assignment.jav @@ -0,0 +1 @@ +x = 2 \ No newline at end of file diff --git a/testData/assignmentExpression/expression_mult/assignment.kt b/testData/assignmentExpression/expression_mult/assignment.kt new file mode 100644 index 00000000000..1ddfb7dc8e4 --- /dev/null +++ b/testData/assignmentExpression/expression_mult/assignment.kt @@ -0,0 +1 @@ +x = 2 \ No newline at end of file diff --git a/testData/assignmentExpression/expression_mult/divideAssign.jav b/testData/assignmentExpression/expression_mult/divideAssign.jav new file mode 100644 index 00000000000..e63372a6277 --- /dev/null +++ b/testData/assignmentExpression/expression_mult/divideAssign.jav @@ -0,0 +1 @@ +x /= 2 \ No newline at end of file diff --git a/testData/assignmentExpression/expression_mult/divideAssign.kt b/testData/assignmentExpression/expression_mult/divideAssign.kt new file mode 100644 index 00000000000..e63372a6277 --- /dev/null +++ b/testData/assignmentExpression/expression_mult/divideAssign.kt @@ -0,0 +1 @@ +x /= 2 \ No newline at end of file diff --git a/testData/assignmentExpression/expression_mult/minusAssign.jav b/testData/assignmentExpression/expression_mult/minusAssign.jav new file mode 100644 index 00000000000..58f87ee4a6c --- /dev/null +++ b/testData/assignmentExpression/expression_mult/minusAssign.jav @@ -0,0 +1 @@ +x -= 2 \ No newline at end of file diff --git a/testData/assignmentExpression/expression_mult/minusAssign.kt b/testData/assignmentExpression/expression_mult/minusAssign.kt new file mode 100644 index 00000000000..58f87ee4a6c --- /dev/null +++ b/testData/assignmentExpression/expression_mult/minusAssign.kt @@ -0,0 +1 @@ +x -= 2 \ No newline at end of file diff --git a/testData/assignmentExpression/expression_mult/multiplyAssign.jav b/testData/assignmentExpression/expression_mult/multiplyAssign.jav new file mode 100644 index 00000000000..ddea70541b0 --- /dev/null +++ b/testData/assignmentExpression/expression_mult/multiplyAssign.jav @@ -0,0 +1 @@ +x *= 2 \ No newline at end of file diff --git a/testData/assignmentExpression/expression_mult/multiplyAssign.kt b/testData/assignmentExpression/expression_mult/multiplyAssign.kt new file mode 100644 index 00000000000..ddea70541b0 --- /dev/null +++ b/testData/assignmentExpression/expression_mult/multiplyAssign.kt @@ -0,0 +1 @@ +x *= 2 \ No newline at end of file diff --git a/testData/assignmentExpression/expression_mult/or.jav b/testData/assignmentExpression/expression_mult/or.jav new file mode 100644 index 00000000000..07b425b9cc5 --- /dev/null +++ b/testData/assignmentExpression/expression_mult/or.jav @@ -0,0 +1 @@ +x |= 2 \ No newline at end of file diff --git a/testData/assignmentExpression/expression_mult/or.kt b/testData/assignmentExpression/expression_mult/or.kt new file mode 100644 index 00000000000..9ec6c02a731 --- /dev/null +++ b/testData/assignmentExpression/expression_mult/or.kt @@ -0,0 +1 @@ +x = (x or 2) \ No newline at end of file diff --git a/testData/assignmentExpression/expression_mult/plusAssign.jav b/testData/assignmentExpression/expression_mult/plusAssign.jav new file mode 100644 index 00000000000..2448227cb69 --- /dev/null +++ b/testData/assignmentExpression/expression_mult/plusAssign.jav @@ -0,0 +1 @@ +x += 2 \ No newline at end of file diff --git a/testData/assignmentExpression/expression_mult/plusAssign.kt b/testData/assignmentExpression/expression_mult/plusAssign.kt new file mode 100644 index 00000000000..2448227cb69 --- /dev/null +++ b/testData/assignmentExpression/expression_mult/plusAssign.kt @@ -0,0 +1 @@ +x += 2 \ No newline at end of file diff --git a/testData/assignmentExpression/expression_mult/reminder.jav b/testData/assignmentExpression/expression_mult/reminder.jav new file mode 100644 index 00000000000..b6fe73d0db1 --- /dev/null +++ b/testData/assignmentExpression/expression_mult/reminder.jav @@ -0,0 +1 @@ +x %= 2 \ No newline at end of file diff --git a/testData/assignmentExpression/expression_mult/reminder.kt b/testData/assignmentExpression/expression_mult/reminder.kt new file mode 100644 index 00000000000..b6fe73d0db1 --- /dev/null +++ b/testData/assignmentExpression/expression_mult/reminder.kt @@ -0,0 +1 @@ +x %= 2 \ No newline at end of file diff --git a/testData/assignmentExpression/expression_mult/shiftLeft.jav b/testData/assignmentExpression/expression_mult/shiftLeft.jav new file mode 100644 index 00000000000..1b5eb34ba7e --- /dev/null +++ b/testData/assignmentExpression/expression_mult/shiftLeft.jav @@ -0,0 +1 @@ +x <<= 2 \ No newline at end of file diff --git a/testData/assignmentExpression/expression_mult/shiftLeft.kt b/testData/assignmentExpression/expression_mult/shiftLeft.kt new file mode 100644 index 00000000000..9952d811313 --- /dev/null +++ b/testData/assignmentExpression/expression_mult/shiftLeft.kt @@ -0,0 +1 @@ +x = (x shl 2) \ No newline at end of file diff --git a/testData/assignmentExpression/expression_mult/shiftRight.jav b/testData/assignmentExpression/expression_mult/shiftRight.jav new file mode 100644 index 00000000000..ac7c546b4cb --- /dev/null +++ b/testData/assignmentExpression/expression_mult/shiftRight.jav @@ -0,0 +1 @@ +x >>= 2 \ No newline at end of file diff --git a/testData/assignmentExpression/expression_mult/shiftRight.kt b/testData/assignmentExpression/expression_mult/shiftRight.kt new file mode 100644 index 00000000000..05fb0966ed7 --- /dev/null +++ b/testData/assignmentExpression/expression_mult/shiftRight.kt @@ -0,0 +1 @@ +x = (x shr 2) \ No newline at end of file diff --git a/testData/assignmentExpression/expression_mult/unsignedRightShift.jav b/testData/assignmentExpression/expression_mult/unsignedRightShift.jav new file mode 100644 index 00000000000..80750c37495 --- /dev/null +++ b/testData/assignmentExpression/expression_mult/unsignedRightShift.jav @@ -0,0 +1 @@ +x >>>= 2 \ No newline at end of file diff --git a/testData/assignmentExpression/expression_mult/unsignedRightShift.kt b/testData/assignmentExpression/expression_mult/unsignedRightShift.kt new file mode 100644 index 00000000000..ce853a663b7 --- /dev/null +++ b/testData/assignmentExpression/expression_mult/unsignedRightShift.kt @@ -0,0 +1 @@ +x = x.cyclicShiftRight(2) \ No newline at end of file diff --git a/testData/assignmentExpression/expression_mult/xor.jav b/testData/assignmentExpression/expression_mult/xor.jav new file mode 100644 index 00000000000..2f6e418eb5d --- /dev/null +++ b/testData/assignmentExpression/expression_mult/xor.jav @@ -0,0 +1 @@ +x ^= 2 \ No newline at end of file diff --git a/testData/assignmentExpression/expression_mult/xor.kt b/testData/assignmentExpression/expression_mult/xor.kt new file mode 100644 index 00000000000..e6cd6c7b628 --- /dev/null +++ b/testData/assignmentExpression/expression_mult/xor.kt @@ -0,0 +1 @@ +x = (x xor 2) \ No newline at end of file diff --git a/testData/assignmentExpression/statement/simpleAssignment.jav b/testData/assignmentExpression/statement/simpleAssignment.jav new file mode 100644 index 00000000000..5cb450aa538 --- /dev/null +++ b/testData/assignmentExpression/statement/simpleAssignment.jav @@ -0,0 +1 @@ +i = 1; \ No newline at end of file diff --git a/testData/assignmentExpression/statement/simpleAssignment.kt b/testData/assignmentExpression/statement/simpleAssignment.kt new file mode 100644 index 00000000000..88de072edc6 --- /dev/null +++ b/testData/assignmentExpression/statement/simpleAssignment.kt @@ -0,0 +1 @@ +i = 1 \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/and.jav b/testData/binaryExpression/expression_mult/and.jav new file mode 100644 index 00000000000..8c519f1a5d3 --- /dev/null +++ b/testData/binaryExpression/expression_mult/and.jav @@ -0,0 +1 @@ +x & 2 \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/and.kt b/testData/binaryExpression/expression_mult/and.kt new file mode 100644 index 00000000000..cf06df2166f --- /dev/null +++ b/testData/binaryExpression/expression_mult/and.kt @@ -0,0 +1 @@ +(x and 2) \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/conditionalAnd.jav b/testData/binaryExpression/expression_mult/conditionalAnd.jav new file mode 100644 index 00000000000..5aa60340840 --- /dev/null +++ b/testData/binaryExpression/expression_mult/conditionalAnd.jav @@ -0,0 +1 @@ +true && false \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/conditionalAnd.kt b/testData/binaryExpression/expression_mult/conditionalAnd.kt new file mode 100644 index 00000000000..c15d239fc59 --- /dev/null +++ b/testData/binaryExpression/expression_mult/conditionalAnd.kt @@ -0,0 +1 @@ +(true && false) \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/conditionalOr.jav b/testData/binaryExpression/expression_mult/conditionalOr.jav new file mode 100644 index 00000000000..64634c472bc --- /dev/null +++ b/testData/binaryExpression/expression_mult/conditionalOr.jav @@ -0,0 +1 @@ +true || false \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/conditionalOr.kt b/testData/binaryExpression/expression_mult/conditionalOr.kt new file mode 100644 index 00000000000..468a7054c7e --- /dev/null +++ b/testData/binaryExpression/expression_mult/conditionalOr.kt @@ -0,0 +1 @@ +(true || false) \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/divide.jav b/testData/binaryExpression/expression_mult/divide.jav new file mode 100644 index 00000000000..0e0b5d58618 --- /dev/null +++ b/testData/binaryExpression/expression_mult/divide.jav @@ -0,0 +1 @@ +1 / 2 \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/divide.kt b/testData/binaryExpression/expression_mult/divide.kt new file mode 100644 index 00000000000..65ee04050be --- /dev/null +++ b/testData/binaryExpression/expression_mult/divide.kt @@ -0,0 +1 @@ +(1 / 2) \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/greaterThan.jav b/testData/binaryExpression/expression_mult/greaterThan.jav new file mode 100644 index 00000000000..2774817e788 --- /dev/null +++ b/testData/binaryExpression/expression_mult/greaterThan.jav @@ -0,0 +1 @@ +1 > 2 \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/greaterThan.kt b/testData/binaryExpression/expression_mult/greaterThan.kt new file mode 100644 index 00000000000..daff50ff64b --- /dev/null +++ b/testData/binaryExpression/expression_mult/greaterThan.kt @@ -0,0 +1 @@ +(1 > 2) \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/greaterThanEqual.jav b/testData/binaryExpression/expression_mult/greaterThanEqual.jav new file mode 100644 index 00000000000..6993045c7a2 --- /dev/null +++ b/testData/binaryExpression/expression_mult/greaterThanEqual.jav @@ -0,0 +1 @@ +1 >= 2 \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/greaterThanEqual.kt b/testData/binaryExpression/expression_mult/greaterThanEqual.kt new file mode 100644 index 00000000000..3df78eab7e7 --- /dev/null +++ b/testData/binaryExpression/expression_mult/greaterThanEqual.kt @@ -0,0 +1 @@ +(1 >= 2) \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/lessThan.jav b/testData/binaryExpression/expression_mult/lessThan.jav new file mode 100644 index 00000000000..535e996ad9b --- /dev/null +++ b/testData/binaryExpression/expression_mult/lessThan.jav @@ -0,0 +1 @@ +1 < 2 \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/lessThan.kt b/testData/binaryExpression/expression_mult/lessThan.kt new file mode 100644 index 00000000000..c82ddfbad9f --- /dev/null +++ b/testData/binaryExpression/expression_mult/lessThan.kt @@ -0,0 +1 @@ +(1 < 2) \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/lessThanEqual.jav b/testData/binaryExpression/expression_mult/lessThanEqual.jav new file mode 100644 index 00000000000..5e9475f92bf --- /dev/null +++ b/testData/binaryExpression/expression_mult/lessThanEqual.jav @@ -0,0 +1 @@ +1 <= 2 \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/lessThanEqual.kt b/testData/binaryExpression/expression_mult/lessThanEqual.kt new file mode 100644 index 00000000000..46d80ee7ff7 --- /dev/null +++ b/testData/binaryExpression/expression_mult/lessThanEqual.kt @@ -0,0 +1 @@ +(1 <= 2) \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/minus.jav b/testData/binaryExpression/expression_mult/minus.jav new file mode 100644 index 00000000000..7ec0a893aef --- /dev/null +++ b/testData/binaryExpression/expression_mult/minus.jav @@ -0,0 +1 @@ +1 - 2 \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/minus.kt b/testData/binaryExpression/expression_mult/minus.kt new file mode 100644 index 00000000000..cf09bd8aa78 --- /dev/null +++ b/testData/binaryExpression/expression_mult/minus.kt @@ -0,0 +1 @@ +(1 - 2) \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/multiply.jav b/testData/binaryExpression/expression_mult/multiply.jav new file mode 100644 index 00000000000..a48dfec9fa5 --- /dev/null +++ b/testData/binaryExpression/expression_mult/multiply.jav @@ -0,0 +1 @@ +1 * 2 \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/multiply.kt b/testData/binaryExpression/expression_mult/multiply.kt new file mode 100644 index 00000000000..aa007e342a1 --- /dev/null +++ b/testData/binaryExpression/expression_mult/multiply.kt @@ -0,0 +1 @@ +(1 * 2) \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/or.jav b/testData/binaryExpression/expression_mult/or.jav new file mode 100644 index 00000000000..27e32efa3d5 --- /dev/null +++ b/testData/binaryExpression/expression_mult/or.jav @@ -0,0 +1 @@ +x | 2 \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/or.kt b/testData/binaryExpression/expression_mult/or.kt new file mode 100644 index 00000000000..70cd0ea4f20 --- /dev/null +++ b/testData/binaryExpression/expression_mult/or.kt @@ -0,0 +1 @@ +(x or 2) \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/plus.jav b/testData/binaryExpression/expression_mult/plus.jav new file mode 100644 index 00000000000..193df0b550b --- /dev/null +++ b/testData/binaryExpression/expression_mult/plus.jav @@ -0,0 +1 @@ +1 + 2 \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/plus.kt b/testData/binaryExpression/expression_mult/plus.kt new file mode 100644 index 00000000000..0a911375668 --- /dev/null +++ b/testData/binaryExpression/expression_mult/plus.kt @@ -0,0 +1 @@ +(1 + 2) \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/remainder.jav b/testData/binaryExpression/expression_mult/remainder.jav new file mode 100644 index 00000000000..049211394d2 --- /dev/null +++ b/testData/binaryExpression/expression_mult/remainder.jav @@ -0,0 +1 @@ +1 % 2 \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/remainder.kt b/testData/binaryExpression/expression_mult/remainder.kt new file mode 100644 index 00000000000..619e890f226 --- /dev/null +++ b/testData/binaryExpression/expression_mult/remainder.kt @@ -0,0 +1 @@ +(1 % 2) \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/shiftLeft.jav b/testData/binaryExpression/expression_mult/shiftLeft.jav new file mode 100644 index 00000000000..0fc7ee16109 --- /dev/null +++ b/testData/binaryExpression/expression_mult/shiftLeft.jav @@ -0,0 +1 @@ +x << 2 \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/shiftLeft.kt b/testData/binaryExpression/expression_mult/shiftLeft.kt new file mode 100644 index 00000000000..f9ea88f60e9 --- /dev/null +++ b/testData/binaryExpression/expression_mult/shiftLeft.kt @@ -0,0 +1 @@ +(x shl 2) \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/shiftRight.jav b/testData/binaryExpression/expression_mult/shiftRight.jav new file mode 100644 index 00000000000..452d459f0be --- /dev/null +++ b/testData/binaryExpression/expression_mult/shiftRight.jav @@ -0,0 +1 @@ +x >> 2 \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/shiftRight.kt b/testData/binaryExpression/expression_mult/shiftRight.kt new file mode 100644 index 00000000000..43f26e93b84 --- /dev/null +++ b/testData/binaryExpression/expression_mult/shiftRight.kt @@ -0,0 +1 @@ +(x shr 2) \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/unsignedRightShift.jav b/testData/binaryExpression/expression_mult/unsignedRightShift.jav new file mode 100644 index 00000000000..43c9914d750 --- /dev/null +++ b/testData/binaryExpression/expression_mult/unsignedRightShift.jav @@ -0,0 +1 @@ +x >>> 2 \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/unsignedRightShift.kt b/testData/binaryExpression/expression_mult/unsignedRightShift.kt new file mode 100644 index 00000000000..cda6648c88e --- /dev/null +++ b/testData/binaryExpression/expression_mult/unsignedRightShift.kt @@ -0,0 +1 @@ +x.cyclicShiftRight(2) \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/xor.jav b/testData/binaryExpression/expression_mult/xor.jav new file mode 100644 index 00000000000..09b544bdf1e --- /dev/null +++ b/testData/binaryExpression/expression_mult/xor.jav @@ -0,0 +1 @@ +x ^ 2 \ No newline at end of file diff --git a/testData/binaryExpression/expression_mult/xor.kt b/testData/binaryExpression/expression_mult/xor.kt new file mode 100644 index 00000000000..918f54e7c68 --- /dev/null +++ b/testData/binaryExpression/expression_mult/xor.kt @@ -0,0 +1 @@ +(x xor 2) \ No newline at end of file diff --git a/testData/boxedType/statement_mult/boolean.jav b/testData/boxedType/statement_mult/boolean.jav new file mode 100644 index 00000000000..ccd666e6ee8 --- /dev/null +++ b/testData/boxedType/statement_mult/boolean.jav @@ -0,0 +1 @@ +Boolean i = 10; \ No newline at end of file diff --git a/testData/boxedType/statement_mult/boolean.kt b/testData/boxedType/statement_mult/boolean.kt new file mode 100644 index 00000000000..a04aa401cb4 --- /dev/null +++ b/testData/boxedType/statement_mult/boolean.kt @@ -0,0 +1 @@ +var i : Boolean? = 10 \ No newline at end of file diff --git a/testData/boxedType/statement_mult/byte.jav b/testData/boxedType/statement_mult/byte.jav new file mode 100644 index 00000000000..14a750b548b --- /dev/null +++ b/testData/boxedType/statement_mult/byte.jav @@ -0,0 +1 @@ +Byte i = 10; \ No newline at end of file diff --git a/testData/boxedType/statement_mult/byte.kt b/testData/boxedType/statement_mult/byte.kt new file mode 100644 index 00000000000..c44367fae64 --- /dev/null +++ b/testData/boxedType/statement_mult/byte.kt @@ -0,0 +1 @@ +var i : Byte? = 10 \ No newline at end of file diff --git a/testData/boxedType/statement_mult/character.jav b/testData/boxedType/statement_mult/character.jav new file mode 100644 index 00000000000..611a419cc54 --- /dev/null +++ b/testData/boxedType/statement_mult/character.jav @@ -0,0 +1 @@ +Character i = 10; \ No newline at end of file diff --git a/testData/boxedType/statement_mult/character.kt b/testData/boxedType/statement_mult/character.kt new file mode 100644 index 00000000000..66c64a43830 --- /dev/null +++ b/testData/boxedType/statement_mult/character.kt @@ -0,0 +1 @@ +var i : Char? = 10 \ No newline at end of file diff --git a/testData/boxedType/statement_mult/double.jav b/testData/boxedType/statement_mult/double.jav new file mode 100644 index 00000000000..691af6d77f6 --- /dev/null +++ b/testData/boxedType/statement_mult/double.jav @@ -0,0 +1 @@ +Double i = 10; \ No newline at end of file diff --git a/testData/boxedType/statement_mult/double.kt b/testData/boxedType/statement_mult/double.kt new file mode 100644 index 00000000000..ad23a49855d --- /dev/null +++ b/testData/boxedType/statement_mult/double.kt @@ -0,0 +1 @@ +var i : Double? = 10 \ No newline at end of file diff --git a/testData/boxedType/statement_mult/float.jav b/testData/boxedType/statement_mult/float.jav new file mode 100644 index 00000000000..c283bbbe5fa --- /dev/null +++ b/testData/boxedType/statement_mult/float.jav @@ -0,0 +1 @@ +Float i = 10; \ No newline at end of file diff --git a/testData/boxedType/statement_mult/float.kt b/testData/boxedType/statement_mult/float.kt new file mode 100644 index 00000000000..72df9c19575 --- /dev/null +++ b/testData/boxedType/statement_mult/float.kt @@ -0,0 +1 @@ +var i : Float? = 10 \ No newline at end of file diff --git a/testData/boxedType/statement_mult/integer.jav b/testData/boxedType/statement_mult/integer.jav new file mode 100644 index 00000000000..ce81c24fe40 --- /dev/null +++ b/testData/boxedType/statement_mult/integer.jav @@ -0,0 +1 @@ +Integer i = 10; \ No newline at end of file diff --git a/testData/boxedType/statement_mult/integer.kt b/testData/boxedType/statement_mult/integer.kt new file mode 100644 index 00000000000..eb490098482 --- /dev/null +++ b/testData/boxedType/statement_mult/integer.kt @@ -0,0 +1 @@ +var i : Int? = 10 \ No newline at end of file diff --git a/testData/boxedType/statement_mult/long.jav b/testData/boxedType/statement_mult/long.jav new file mode 100644 index 00000000000..9ca58295d8a --- /dev/null +++ b/testData/boxedType/statement_mult/long.jav @@ -0,0 +1 @@ +Long i = 10; \ No newline at end of file diff --git a/testData/boxedType/statement_mult/long.kt b/testData/boxedType/statement_mult/long.kt new file mode 100644 index 00000000000..aa1584ac634 --- /dev/null +++ b/testData/boxedType/statement_mult/long.kt @@ -0,0 +1 @@ +var i : Long? = 10 \ No newline at end of file diff --git a/testData/boxedType/statement_mult/object.jav b/testData/boxedType/statement_mult/object.jav new file mode 100644 index 00000000000..ca135870cd6 --- /dev/null +++ b/testData/boxedType/statement_mult/object.jav @@ -0,0 +1 @@ +Object i = 10; \ No newline at end of file diff --git a/testData/boxedType/statement_mult/object.kt b/testData/boxedType/statement_mult/object.kt new file mode 100644 index 00000000000..611c618a389 --- /dev/null +++ b/testData/boxedType/statement_mult/object.kt @@ -0,0 +1 @@ +var i : Any? = 10 \ No newline at end of file diff --git a/testData/boxedType/statement_mult/short.jav b/testData/boxedType/statement_mult/short.jav new file mode 100644 index 00000000000..1364e5c8dbb --- /dev/null +++ b/testData/boxedType/statement_mult/short.jav @@ -0,0 +1 @@ +Short i = 10; \ No newline at end of file diff --git a/testData/boxedType/statement_mult/short.kt b/testData/boxedType/statement_mult/short.kt new file mode 100644 index 00000000000..8daff77deb3 --- /dev/null +++ b/testData/boxedType/statement_mult/short.kt @@ -0,0 +1 @@ +var i : Short? = 10 \ No newline at end of file diff --git a/testData/breakStatement/statement/breakWithLabel.jav b/testData/breakStatement/statement/breakWithLabel.jav new file mode 100644 index 00000000000..b2375dc68b4 --- /dev/null +++ b/testData/breakStatement/statement/breakWithLabel.jav @@ -0,0 +1 @@ +break label; \ No newline at end of file diff --git a/testData/breakStatement/statement/breakWithLabel.kt b/testData/breakStatement/statement/breakWithLabel.kt new file mode 100644 index 00000000000..02d8620a138 --- /dev/null +++ b/testData/breakStatement/statement/breakWithLabel.kt @@ -0,0 +1 @@ +break@label \ No newline at end of file diff --git a/testData/breakStatement/statement/breakWithoutLabel.jav b/testData/breakStatement/statement/breakWithoutLabel.jav new file mode 100644 index 00000000000..8cb76cf02d7 --- /dev/null +++ b/testData/breakStatement/statement/breakWithoutLabel.jav @@ -0,0 +1 @@ +break; \ No newline at end of file diff --git a/testData/breakStatement/statement/breakWithoutLabel.kt b/testData/breakStatement/statement/breakWithoutLabel.kt new file mode 100644 index 00000000000..5da70343a46 --- /dev/null +++ b/testData/breakStatement/statement/breakWithoutLabel.kt @@ -0,0 +1 @@ +break \ No newline at end of file diff --git a/testData/class_/class/class.jav b/testData/class_/class/class.jav new file mode 100644 index 00000000000..183c3f5b3be --- /dev/null +++ b/testData/class_/class/class.jav @@ -0,0 +1 @@ +class Test {} \ No newline at end of file diff --git a/testData/class_/class/class.kt b/testData/class_/class/class.kt new file mode 100644 index 00000000000..503cbe46e7f --- /dev/null +++ b/testData/class_/class/class.kt @@ -0,0 +1 @@ +open class Test { } \ No newline at end of file diff --git a/testData/class_/class/emptyClass.jav b/testData/class_/class/emptyClass.jav new file mode 100644 index 00000000000..151119ab6a7 --- /dev/null +++ b/testData/class_/class/emptyClass.jav @@ -0,0 +1 @@ +final class A {} \ No newline at end of file diff --git a/testData/class_/class/emptyClass.kt b/testData/class_/class/emptyClass.kt new file mode 100644 index 00000000000..0e9ef9e73c2 --- /dev/null +++ b/testData/class_/class/emptyClass.kt @@ -0,0 +1 @@ +class A { } \ No newline at end of file diff --git a/testData/class_/class/extendsOneClassAndImplementsOneInterface.jav b/testData/class_/class/extendsOneClassAndImplementsOneInterface.jav new file mode 100644 index 00000000000..b306e379a44 --- /dev/null +++ b/testData/class_/class/extendsOneClassAndImplementsOneInterface.jav @@ -0,0 +1 @@ +final class A extends Base implements I {} \ No newline at end of file diff --git a/testData/class_/class/extendsOneClassAndImplementsOneInterface.kt b/testData/class_/class/extendsOneClassAndImplementsOneInterface.kt new file mode 100644 index 00000000000..4bb2a7ab769 --- /dev/null +++ b/testData/class_/class/extendsOneClassAndImplementsOneInterface.kt @@ -0,0 +1 @@ +class A : Base, I { } \ No newline at end of file diff --git a/testData/class_/class/extendsOneClassAndImplementsSeveralInterfaces.jav b/testData/class_/class/extendsOneClassAndImplementsSeveralInterfaces.jav new file mode 100644 index 00000000000..dd454cafdb7 --- /dev/null +++ b/testData/class_/class/extendsOneClassAndImplementsSeveralInterfaces.jav @@ -0,0 +1 @@ +final class A extends Base implements I0, I1, I2 {} \ No newline at end of file diff --git a/testData/class_/class/extendsOneClassAndImplementsSeveralInterfaces.kt b/testData/class_/class/extendsOneClassAndImplementsSeveralInterfaces.kt new file mode 100644 index 00000000000..e86ee0f0518 --- /dev/null +++ b/testData/class_/class/extendsOneClassAndImplementsSeveralInterfaces.kt @@ -0,0 +1 @@ +class A : Base, I0, I1, I2 { } \ No newline at end of file diff --git a/testData/class_/class/finalClass.jav b/testData/class_/class/finalClass.jav new file mode 100644 index 00000000000..5071bba9931 --- /dev/null +++ b/testData/class_/class/finalClass.jav @@ -0,0 +1 @@ +final class Test {} \ No newline at end of file diff --git a/testData/class_/class/finalClass.kt b/testData/class_/class/finalClass.kt new file mode 100644 index 00000000000..5a0c97725b1 --- /dev/null +++ b/testData/class_/class/finalClass.kt @@ -0,0 +1 @@ +class Test { } \ No newline at end of file diff --git a/testData/class_/class/genericClass.jav b/testData/class_/class/genericClass.jav new file mode 100644 index 00000000000..b18123be7cb --- /dev/null +++ b/testData/class_/class/genericClass.jav @@ -0,0 +1 @@ +final class Entry {} \ No newline at end of file diff --git a/testData/class_/class/genericClass.kt b/testData/class_/class/genericClass.kt new file mode 100644 index 00000000000..e7612b27f50 --- /dev/null +++ b/testData/class_/class/genericClass.kt @@ -0,0 +1 @@ +class Entry { } \ No newline at end of file diff --git a/testData/class_/class/innerEmptyClass.jav b/testData/class_/class/innerEmptyClass.jav new file mode 100644 index 00000000000..3053641622a --- /dev/null +++ b/testData/class_/class/innerEmptyClass.jav @@ -0,0 +1 @@ +final class A { inner final class B {} } \ No newline at end of file diff --git a/testData/class_/class/innerEmptyClass.kt b/testData/class_/class/innerEmptyClass.kt new file mode 100644 index 00000000000..630943255b1 --- /dev/null +++ b/testData/class_/class/innerEmptyClass.kt @@ -0,0 +1 @@ +class A { class B { } } \ No newline at end of file diff --git a/testData/class_/class/innerStaticClass.jav b/testData/class_/class/innerStaticClass.jav new file mode 100644 index 00000000000..d0885630764 --- /dev/null +++ b/testData/class_/class/innerStaticClass.jav @@ -0,0 +1 @@ +final class S { static class Inner {} } \ No newline at end of file diff --git a/testData/class_/class/innerStaticClass.kt b/testData/class_/class/innerStaticClass.kt new file mode 100644 index 00000000000..0041dfabfdd --- /dev/null +++ b/testData/class_/class/innerStaticClass.kt @@ -0,0 +1 @@ +class S { class object { open class Inner { } } } \ No newline at end of file diff --git a/testData/class_/class/internalClass.jav b/testData/class_/class/internalClass.jav new file mode 100644 index 00000000000..183c3f5b3be --- /dev/null +++ b/testData/class_/class/internalClass.jav @@ -0,0 +1 @@ +class Test {} \ No newline at end of file diff --git a/testData/class_/class/internalClass.kt b/testData/class_/class/internalClass.kt new file mode 100644 index 00000000000..503cbe46e7f --- /dev/null +++ b/testData/class_/class/internalClass.kt @@ -0,0 +1 @@ +open class Test { } \ No newline at end of file diff --git a/testData/class_/class/oneStaticFieldOneNonStatic.jav b/testData/class_/class/oneStaticFieldOneNonStatic.jav new file mode 100644 index 00000000000..0e0b14688a4 --- /dev/null +++ b/testData/class_/class/oneStaticFieldOneNonStatic.jav @@ -0,0 +1 @@ +final class S { boolean sB() { return true; } static int myI = 10; } \ No newline at end of file diff --git a/testData/class_/class/oneStaticFieldOneNonStatic.kt b/testData/class_/class/oneStaticFieldOneNonStatic.kt new file mode 100644 index 00000000000..37e1a2c5efa --- /dev/null +++ b/testData/class_/class/oneStaticFieldOneNonStatic.kt @@ -0,0 +1 @@ +class S { class object { var myI : Int = 10 } fun sB() : Boolean { return true } } \ No newline at end of file diff --git a/testData/class_/class/oneStaticMethod.jav b/testData/class_/class/oneStaticMethod.jav new file mode 100644 index 00000000000..98884d114b7 --- /dev/null +++ b/testData/class_/class/oneStaticMethod.jav @@ -0,0 +1 @@ +final class S { static boolean staticF() { return true; } } \ No newline at end of file diff --git a/testData/class_/class/oneStaticMethod.kt b/testData/class_/class/oneStaticMethod.kt new file mode 100644 index 00000000000..0b95364abcf --- /dev/null +++ b/testData/class_/class/oneStaticMethod.kt @@ -0,0 +1 @@ +class S { class object { fun staticF() : Boolean { return true } } } \ No newline at end of file diff --git a/testData/class_/class/oneStaticMethodOneNonStatic.jav b/testData/class_/class/oneStaticMethodOneNonStatic.jav new file mode 100644 index 00000000000..4c6915861c5 --- /dev/null +++ b/testData/class_/class/oneStaticMethodOneNonStatic.jav @@ -0,0 +1 @@ +final class S { boolean sB() { return true; } static int sI() { return 1; } } \ No newline at end of file diff --git a/testData/class_/class/oneStaticMethodOneNonStatic.kt b/testData/class_/class/oneStaticMethodOneNonStatic.kt new file mode 100644 index 00000000000..ba3e67dd26e --- /dev/null +++ b/testData/class_/class/oneStaticMethodOneNonStatic.kt @@ -0,0 +1 @@ +class S { class object { fun sI() : Int { return 1 } } fun sB() : Boolean { return true } } \ No newline at end of file diff --git a/testData/class_/class/pivateClass.jav b/testData/class_/class/pivateClass.jav new file mode 100644 index 00000000000..91cc7a0e937 --- /dev/null +++ b/testData/class_/class/pivateClass.jav @@ -0,0 +1 @@ +private class Test {} \ No newline at end of file diff --git a/testData/class_/class/pivateClass.kt b/testData/class_/class/pivateClass.kt new file mode 100644 index 00000000000..8f0cfde9556 --- /dev/null +++ b/testData/class_/class/pivateClass.kt @@ -0,0 +1 @@ +private open class Test { } \ No newline at end of file diff --git a/testData/class_/class/protectedClass.jav b/testData/class_/class/protectedClass.jav new file mode 100644 index 00000000000..d27e53f5081 --- /dev/null +++ b/testData/class_/class/protectedClass.jav @@ -0,0 +1 @@ +protected class Test {} \ No newline at end of file diff --git a/testData/class_/class/protectedClass.kt b/testData/class_/class/protectedClass.kt new file mode 100644 index 00000000000..2f626ef896b --- /dev/null +++ b/testData/class_/class/protectedClass.kt @@ -0,0 +1 @@ +protected open class Test { } \ No newline at end of file diff --git a/testData/class_/class/publicClass.jav b/testData/class_/class/publicClass.jav new file mode 100644 index 00000000000..099aac22fd3 --- /dev/null +++ b/testData/class_/class/publicClass.jav @@ -0,0 +1 @@ +public class Test {} \ No newline at end of file diff --git a/testData/class_/class/publicClass.kt b/testData/class_/class/publicClass.kt new file mode 100644 index 00000000000..ec3ccb82f12 --- /dev/null +++ b/testData/class_/class/publicClass.kt @@ -0,0 +1 @@ +public open class Test { } \ No newline at end of file diff --git a/testData/class_/class/simpleInheritance.jav b/testData/class_/class/simpleInheritance.jav new file mode 100644 index 00000000000..01916ab4d7b --- /dev/null +++ b/testData/class_/class/simpleInheritance.jav @@ -0,0 +1 @@ +final class A extends Base {} \ No newline at end of file diff --git a/testData/class_/class/simpleInheritance.kt b/testData/class_/class/simpleInheritance.kt new file mode 100644 index 00000000000..2aee0acad51 --- /dev/null +++ b/testData/class_/class/simpleInheritance.kt @@ -0,0 +1 @@ +class A : Base { } \ No newline at end of file diff --git a/testData/class_/class/twoStaticMethod.jav b/testData/class_/class/twoStaticMethod.jav new file mode 100644 index 00000000000..b69b1398e17 --- /dev/null +++ b/testData/class_/class/twoStaticMethod.jav @@ -0,0 +1 @@ +final class S { static boolean sB() { return true; } static int sI() { return 1; } } \ No newline at end of file diff --git a/testData/class_/class/twoStaticMethod.kt b/testData/class_/class/twoStaticMethod.kt new file mode 100644 index 00000000000..034258422aa --- /dev/null +++ b/testData/class_/class/twoStaticMethod.kt @@ -0,0 +1 @@ +class S { class object { fun sB() : Boolean { return true } fun sI() : Int { return 1 } } } \ No newline at end of file diff --git a/testData/class_/class_mult/classWithEmptyMethods.jav b/testData/class_/class_mult/classWithEmptyMethods.jav new file mode 100644 index 00000000000..49ec763ae8f --- /dev/null +++ b/testData/class_/class_mult/classWithEmptyMethods.jav @@ -0,0 +1 @@ +final class T {void main() {}int i() {}String s() {}} \ No newline at end of file diff --git a/testData/class_/class_mult/classWithEmptyMethods.kt b/testData/class_/class_mult/classWithEmptyMethods.kt new file mode 100644 index 00000000000..093b68e9c67 --- /dev/null +++ b/testData/class_/class_mult/classWithEmptyMethods.kt @@ -0,0 +1,8 @@ +class T { +fun main() : Unit { +} +fun i() : Int { +} +fun s() : String? { +} +} \ No newline at end of file diff --git a/testData/class_/class_mult/classWithFields.jav b/testData/class_/class_mult/classWithFields.jav new file mode 100644 index 00000000000..c7059937021 --- /dev/null +++ b/testData/class_/class_mult/classWithFields.jav @@ -0,0 +1 @@ +final class T {String a = "abc";int b = 10;} \ No newline at end of file diff --git a/testData/class_/class_mult/classWithFields.kt b/testData/class_/class_mult/classWithFields.kt new file mode 100644 index 00000000000..e4b83fcd5fa --- /dev/null +++ b/testData/class_/class_mult/classWithFields.kt @@ -0,0 +1,4 @@ +class T { +var a : String? = "abc" +var b : Int = 10 +} \ No newline at end of file diff --git a/testData/class_/class_mult/classWithMultiplyFields.jav b/testData/class_/class_mult/classWithMultiplyFields.jav new file mode 100644 index 00000000000..6fd5e1a9865 --- /dev/null +++ b/testData/class_/class_mult/classWithMultiplyFields.jav @@ -0,0 +1 @@ +final class T {String a, b, c = "abc";} \ No newline at end of file diff --git a/testData/class_/class_mult/classWithMultiplyFields.kt b/testData/class_/class_mult/classWithMultiplyFields.kt new file mode 100644 index 00000000000..43274e811c8 --- /dev/null +++ b/testData/class_/class_mult/classWithMultiplyFields.kt @@ -0,0 +1,5 @@ +class T { +var a : String? +var b : String? +var c : String? = "abc" +} \ No newline at end of file diff --git a/testData/conditionalExpression/expression_mult/simpleConditionalExpression.jav b/testData/conditionalExpression/expression_mult/simpleConditionalExpression.jav new file mode 100644 index 00000000000..3e742448544 --- /dev/null +++ b/testData/conditionalExpression/expression_mult/simpleConditionalExpression.jav @@ -0,0 +1 @@ +a.isEmpty() ? 0 : 1 \ No newline at end of file diff --git a/testData/conditionalExpression/expression_mult/simpleConditionalExpression.kt b/testData/conditionalExpression/expression_mult/simpleConditionalExpression.kt new file mode 100644 index 00000000000..85131998260 --- /dev/null +++ b/testData/conditionalExpression/expression_mult/simpleConditionalExpression.kt @@ -0,0 +1,4 @@ +(if (a.isEmpty()) +0 +else +1) \ No newline at end of file diff --git a/testData/continueStatement/statement/continueWithLabel.jav b/testData/continueStatement/statement/continueWithLabel.jav new file mode 100644 index 00000000000..aa7bbb7cd89 --- /dev/null +++ b/testData/continueStatement/statement/continueWithLabel.jav @@ -0,0 +1 @@ +continue label; \ No newline at end of file diff --git a/testData/continueStatement/statement/continueWithLabel.kt b/testData/continueStatement/statement/continueWithLabel.kt new file mode 100644 index 00000000000..9dc6020680e --- /dev/null +++ b/testData/continueStatement/statement/continueWithLabel.kt @@ -0,0 +1 @@ +continue@label \ No newline at end of file diff --git a/testData/continueStatement/statement/continueWithoutLabel.jav b/testData/continueStatement/statement/continueWithoutLabel.jav new file mode 100644 index 00000000000..45127c0ad12 --- /dev/null +++ b/testData/continueStatement/statement/continueWithoutLabel.jav @@ -0,0 +1 @@ +continue; \ No newline at end of file diff --git a/testData/continueStatement/statement/continueWithoutLabel.kt b/testData/continueStatement/statement/continueWithoutLabel.kt new file mode 100644 index 00000000000..b2960313c53 --- /dev/null +++ b/testData/continueStatement/statement/continueWithoutLabel.kt @@ -0,0 +1 @@ +continue \ No newline at end of file diff --git a/testData/declarationStatement/statement/singleFinalIntDeclaration.jav b/testData/declarationStatement/statement/singleFinalIntDeclaration.jav new file mode 100644 index 00000000000..79db42cfc1c --- /dev/null +++ b/testData/declarationStatement/statement/singleFinalIntDeclaration.jav @@ -0,0 +1 @@ +final int s; \ No newline at end of file diff --git a/testData/declarationStatement/statement/singleFinalIntDeclaration.kt b/testData/declarationStatement/statement/singleFinalIntDeclaration.kt new file mode 100644 index 00000000000..0ff0482bb0f --- /dev/null +++ b/testData/declarationStatement/statement/singleFinalIntDeclaration.kt @@ -0,0 +1 @@ +val s : Int \ No newline at end of file diff --git a/testData/declarationStatement/statement/singleFinalStringDeclaration.jav b/testData/declarationStatement/statement/singleFinalStringDeclaration.jav new file mode 100644 index 00000000000..0d5e93f00ff --- /dev/null +++ b/testData/declarationStatement/statement/singleFinalStringDeclaration.jav @@ -0,0 +1 @@ +final String s; \ No newline at end of file diff --git a/testData/declarationStatement/statement/singleFinalStringDeclaration.kt b/testData/declarationStatement/statement/singleFinalStringDeclaration.kt new file mode 100644 index 00000000000..734800a644c --- /dev/null +++ b/testData/declarationStatement/statement/singleFinalStringDeclaration.kt @@ -0,0 +1 @@ +val s : String? \ No newline at end of file diff --git a/testData/declarationStatement/statement/singleIntDeclaration.jav b/testData/declarationStatement/statement/singleIntDeclaration.jav new file mode 100644 index 00000000000..ee7cd0becae --- /dev/null +++ b/testData/declarationStatement/statement/singleIntDeclaration.jav @@ -0,0 +1 @@ +int s; \ No newline at end of file diff --git a/testData/declarationStatement/statement/singleIntDeclaration.kt b/testData/declarationStatement/statement/singleIntDeclaration.kt new file mode 100644 index 00000000000..3639cd90f4a --- /dev/null +++ b/testData/declarationStatement/statement/singleIntDeclaration.kt @@ -0,0 +1 @@ +var s : Int \ No newline at end of file diff --git a/testData/declarationStatement/statement/singleStringDeclaration.jav b/testData/declarationStatement/statement/singleStringDeclaration.jav new file mode 100644 index 00000000000..8f1adbb52a5 --- /dev/null +++ b/testData/declarationStatement/statement/singleStringDeclaration.jav @@ -0,0 +1 @@ +String s; \ No newline at end of file diff --git a/testData/declarationStatement/statement/singleStringDeclaration.kt b/testData/declarationStatement/statement/singleStringDeclaration.kt new file mode 100644 index 00000000000..4bdd5d14ca2 --- /dev/null +++ b/testData/declarationStatement/statement/singleStringDeclaration.kt @@ -0,0 +1 @@ +var s : String? \ No newline at end of file diff --git a/testData/declarationStatement/statement_mult/multiplyFinalIntDeclaration.jav b/testData/declarationStatement/statement_mult/multiplyFinalIntDeclaration.jav new file mode 100644 index 00000000000..42d4cea5522 --- /dev/null +++ b/testData/declarationStatement/statement_mult/multiplyFinalIntDeclaration.jav @@ -0,0 +1 @@ +final int k, l, m; \ No newline at end of file diff --git a/testData/declarationStatement/statement_mult/multiplyFinalIntDeclaration.kt b/testData/declarationStatement/statement_mult/multiplyFinalIntDeclaration.kt new file mode 100644 index 00000000000..08a84179833 --- /dev/null +++ b/testData/declarationStatement/statement_mult/multiplyFinalIntDeclaration.kt @@ -0,0 +1,3 @@ +val k : Int +val l : Int +val m : Int \ No newline at end of file diff --git a/testData/declarationStatement/statement_mult/multiplyIntDeclaration.jav b/testData/declarationStatement/statement_mult/multiplyIntDeclaration.jav new file mode 100644 index 00000000000..219f057f8f0 --- /dev/null +++ b/testData/declarationStatement/statement_mult/multiplyIntDeclaration.jav @@ -0,0 +1 @@ +int k, l, m; \ No newline at end of file diff --git a/testData/declarationStatement/statement_mult/multiplyIntDeclaration.kt b/testData/declarationStatement/statement_mult/multiplyIntDeclaration.kt new file mode 100644 index 00000000000..357bb10b11e --- /dev/null +++ b/testData/declarationStatement/statement_mult/multiplyIntDeclaration.kt @@ -0,0 +1,3 @@ +var k : Int +var l : Int +var m : Int \ No newline at end of file diff --git a/testData/doWhileStatement/statement_mult/whileWithBlock.jav b/testData/doWhileStatement/statement_mult/whileWithBlock.jav new file mode 100644 index 00000000000..48a9639a646 --- /dev/null +++ b/testData/doWhileStatement/statement_mult/whileWithBlock.jav @@ -0,0 +1 @@ +do {int i = 1; i = i + 1;} while (a > b) \ No newline at end of file diff --git a/testData/doWhileStatement/statement_mult/whileWithBlock.kt b/testData/doWhileStatement/statement_mult/whileWithBlock.kt new file mode 100644 index 00000000000..96ee36204cc --- /dev/null +++ b/testData/doWhileStatement/statement_mult/whileWithBlock.kt @@ -0,0 +1,6 @@ +do +{ +var i : Int = 1 +i = (i + 1) +} +while ((a > b)) \ No newline at end of file diff --git a/testData/doWhileStatement/statement_mult/whileWithEmptyBlock.jav b/testData/doWhileStatement/statement_mult/whileWithEmptyBlock.jav new file mode 100644 index 00000000000..b57bb051009 --- /dev/null +++ b/testData/doWhileStatement/statement_mult/whileWithEmptyBlock.jav @@ -0,0 +1 @@ +do {} while (true) \ No newline at end of file diff --git a/testData/doWhileStatement/statement_mult/whileWithEmptyBlock.kt b/testData/doWhileStatement/statement_mult/whileWithEmptyBlock.kt new file mode 100644 index 00000000000..7018b864e5e --- /dev/null +++ b/testData/doWhileStatement/statement_mult/whileWithEmptyBlock.kt @@ -0,0 +1,4 @@ +do +{ +} +while (true) \ No newline at end of file diff --git a/testData/doWhileStatement/statement_mult/whileWithExpression.jav b/testData/doWhileStatement/statement_mult/whileWithExpression.jav new file mode 100644 index 00000000000..e724468b028 --- /dev/null +++ b/testData/doWhileStatement/statement_mult/whileWithExpression.jav @@ -0,0 +1 @@ +do i = i + 1; while (true) \ No newline at end of file diff --git a/testData/doWhileStatement/statement_mult/whileWithExpression.kt b/testData/doWhileStatement/statement_mult/whileWithExpression.kt new file mode 100644 index 00000000000..c936946d560 --- /dev/null +++ b/testData/doWhileStatement/statement_mult/whileWithExpression.kt @@ -0,0 +1,3 @@ +do +i = (i + 1) +while (true) \ No newline at end of file diff --git a/testData/doWhileStatement/statement_mult/whileWithReturn.jav b/testData/doWhileStatement/statement_mult/whileWithReturn.jav new file mode 100644 index 00000000000..6ca0c6cd1b2 --- /dev/null +++ b/testData/doWhileStatement/statement_mult/whileWithReturn.jav @@ -0,0 +1 @@ +do return 1; while (true) \ No newline at end of file diff --git a/testData/doWhileStatement/statement_mult/whileWithReturn.kt b/testData/doWhileStatement/statement_mult/whileWithReturn.kt new file mode 100644 index 00000000000..21de9dff87a --- /dev/null +++ b/testData/doWhileStatement/statement_mult/whileWithReturn.kt @@ -0,0 +1,3 @@ +do +return 1 +while (true) \ No newline at end of file diff --git a/testData/enum/class/emptyEnum.jav b/testData/enum/class/emptyEnum.jav new file mode 100644 index 00000000000..6374d13e5e5 --- /dev/null +++ b/testData/enum/class/emptyEnum.jav @@ -0,0 +1 @@ +enum A {} \ No newline at end of file diff --git a/testData/enum/class/emptyEnum.kt b/testData/enum/class/emptyEnum.kt new file mode 100644 index 00000000000..ee5f5b8e52b --- /dev/null +++ b/testData/enum/class/emptyEnum.kt @@ -0,0 +1 @@ +enum A { } \ No newline at end of file diff --git a/testData/enum/class/enumImplementsOneInterface.jav b/testData/enum/class/enumImplementsOneInterface.jav new file mode 100644 index 00000000000..c2e20825bfe --- /dev/null +++ b/testData/enum/class/enumImplementsOneInterface.jav @@ -0,0 +1 @@ +enum A implements I {} \ No newline at end of file diff --git a/testData/enum/class/enumImplementsOneInterface.kt b/testData/enum/class/enumImplementsOneInterface.kt new file mode 100644 index 00000000000..9aaec583855 --- /dev/null +++ b/testData/enum/class/enumImplementsOneInterface.kt @@ -0,0 +1 @@ +enum A : I { } \ No newline at end of file diff --git a/testData/enum/class/enumImplementsSeveralInterfaces.jav b/testData/enum/class/enumImplementsSeveralInterfaces.jav new file mode 100644 index 00000000000..0334953a275 --- /dev/null +++ b/testData/enum/class/enumImplementsSeveralInterfaces.jav @@ -0,0 +1 @@ +enum A implements I0, I1, I2 {} \ No newline at end of file diff --git a/testData/enum/class/enumImplementsSeveralInterfaces.kt b/testData/enum/class/enumImplementsSeveralInterfaces.kt new file mode 100644 index 00000000000..4db3cfa0033 --- /dev/null +++ b/testData/enum/class/enumImplementsSeveralInterfaces.kt @@ -0,0 +1 @@ +enum A : I0, I1, I2 { } \ No newline at end of file diff --git a/testData/enum/class/internalEnum.jav b/testData/enum/class/internalEnum.jav new file mode 100644 index 00000000000..5ac159fa355 --- /dev/null +++ b/testData/enum/class/internalEnum.jav @@ -0,0 +1 @@ +enum Test {} \ No newline at end of file diff --git a/testData/enum/class/internalEnum.kt b/testData/enum/class/internalEnum.kt new file mode 100644 index 00000000000..a677a0e3d81 --- /dev/null +++ b/testData/enum/class/internalEnum.kt @@ -0,0 +1 @@ +enum Test { } \ No newline at end of file diff --git a/testData/enum/class/privateEnum.jav b/testData/enum/class/privateEnum.jav new file mode 100644 index 00000000000..963b14059d8 --- /dev/null +++ b/testData/enum/class/privateEnum.jav @@ -0,0 +1 @@ +private enum Test {} \ No newline at end of file diff --git a/testData/enum/class/privateEnum.kt b/testData/enum/class/privateEnum.kt new file mode 100644 index 00000000000..91956cea0d2 --- /dev/null +++ b/testData/enum/class/privateEnum.kt @@ -0,0 +1 @@ +private enum Test { } \ No newline at end of file diff --git a/testData/enum/class/protectedEnum.jav b/testData/enum/class/protectedEnum.jav new file mode 100644 index 00000000000..1361563477c --- /dev/null +++ b/testData/enum/class/protectedEnum.jav @@ -0,0 +1 @@ +protected enum Test {} \ No newline at end of file diff --git a/testData/enum/class/protectedEnum.kt b/testData/enum/class/protectedEnum.kt new file mode 100644 index 00000000000..00aaa1306e8 --- /dev/null +++ b/testData/enum/class/protectedEnum.kt @@ -0,0 +1 @@ +protected enum Test { } \ No newline at end of file diff --git a/testData/enum/class/publicEnum.jav b/testData/enum/class/publicEnum.jav new file mode 100644 index 00000000000..23365fc3853 --- /dev/null +++ b/testData/enum/class/publicEnum.jav @@ -0,0 +1 @@ +public enum Test {} \ No newline at end of file diff --git a/testData/enum/class/publicEnum.kt b/testData/enum/class/publicEnum.kt new file mode 100644 index 00000000000..86f25500c54 --- /dev/null +++ b/testData/enum/class/publicEnum.kt @@ -0,0 +1 @@ +public enum Test { } \ No newline at end of file diff --git a/testData/enum/class_mult/enumWithNameField.jav b/testData/enum/class_mult/enumWithNameField.jav new file mode 100644 index 00000000000..30f259ecb0f --- /dev/null +++ b/testData/enum/class_mult/enumWithNameField.jav @@ -0,0 +1 @@ +enum E { I; private String name; } \ No newline at end of file diff --git a/testData/enum/class_mult/enumWithNameField.kt b/testData/enum/class_mult/enumWithNameField.kt new file mode 100644 index 00000000000..eed3f7116a9 --- /dev/null +++ b/testData/enum/class_mult/enumWithNameField.kt @@ -0,0 +1,4 @@ +enum E { +I +private var name : String? +} \ No newline at end of file diff --git a/testData/enum/class_mult/fieldsWithPrimaryPrivateConstructor.jav b/testData/enum/class_mult/fieldsWithPrimaryPrivateConstructor.jav new file mode 100644 index 00000000000..416d02b7232 --- /dev/null +++ b/testData/enum/class_mult/fieldsWithPrimaryPrivateConstructor.jav @@ -0,0 +1,12 @@ +enum Color { + WHITE(21), BLACK(22), RED(23), YELLOW(24), BLUE(25); + + private int code; + + private Color(int c) { + code = c; + } + + public int getCode() { + return code; + } \ No newline at end of file diff --git a/testData/enum/class_mult/fieldsWithPrimaryPrivateConstructor.kt b/testData/enum/class_mult/fieldsWithPrimaryPrivateConstructor.kt new file mode 100644 index 00000000000..a6c5d2501b5 --- /dev/null +++ b/testData/enum/class_mult/fieldsWithPrimaryPrivateConstructor.kt @@ -0,0 +1,14 @@ +enum Color { +WHITE(21) +BLACK(22) +RED(23) +YELLOW(24) +BLUE(25) +private var code : Int +private (c : Int) { +code = c +} +public fun getCode() : Int { +return code +} +} \ No newline at end of file diff --git a/testData/enum/class_mult/overrideToString.jav b/testData/enum/class_mult/overrideToString.jav new file mode 100644 index 00000000000..e2aae14da6c --- /dev/null +++ b/testData/enum/class_mult/overrideToString.jav @@ -0,0 +1 @@ +enum Color { WHITE, BLACK, RED, YELLOW, BLUE;@Override String toString() { return "COLOR";}} \ No newline at end of file diff --git a/testData/enum/class_mult/overrideToString.kt b/testData/enum/class_mult/overrideToString.kt new file mode 100644 index 00000000000..783dd0b2444 --- /dev/null +++ b/testData/enum/class_mult/overrideToString.kt @@ -0,0 +1,10 @@ +enum Color { +WHITE +BLACK +RED +YELLOW +BLUE +override fun toString() : String? { +return "COLOR" +} +} \ No newline at end of file diff --git a/testData/enum/class_mult/runnableImplementation.jav b/testData/enum/class_mult/runnableImplementation.jav new file mode 100644 index 00000000000..b5f21ba6318 --- /dev/null +++ b/testData/enum/class_mult/runnableImplementation.jav @@ -0,0 +1,8 @@ +enum Color implements Runnable { + WHITE, BLACK, RED, YELLOW, BLUE; + + public void run() { + System.out.println("name()=" + name() + + ", toString()=" + toString()); + } +} \ No newline at end of file diff --git a/testData/enum/class_mult/runnableImplementation.kt b/testData/enum/class_mult/runnableImplementation.kt new file mode 100644 index 00000000000..912272d9e94 --- /dev/null +++ b/testData/enum/class_mult/runnableImplementation.kt @@ -0,0 +1,10 @@ +enum Color : Runnable { +WHITE +BLACK +RED +YELLOW +BLUE +override public fun run() : Unit { +System.out.println(("name()=" + name() + ", toString()=" + toString())) +} +} \ No newline at end of file diff --git a/testData/enum/class_mult/typeSafeEnum.jav b/testData/enum/class_mult/typeSafeEnum.jav new file mode 100644 index 00000000000..1ecc70526e4 --- /dev/null +++ b/testData/enum/class_mult/typeSafeEnum.jav @@ -0,0 +1 @@ +enum Coin { PENNY, NICKEL, DIME, QUARTER; } \ No newline at end of file diff --git a/testData/enum/class_mult/typeSafeEnum.kt b/testData/enum/class_mult/typeSafeEnum.kt new file mode 100644 index 00000000000..74de5694118 --- /dev/null +++ b/testData/enum/class_mult/typeSafeEnum.kt @@ -0,0 +1,6 @@ +enum Coin { +PENNY +NICKEL +DIME +QUARTER +} \ No newline at end of file diff --git a/testData/field/method/internalField.jav b/testData/field/method/internalField.jav new file mode 100644 index 00000000000..3f94302d50a --- /dev/null +++ b/testData/field/method/internalField.jav @@ -0,0 +1 @@ +Foo f; \ No newline at end of file diff --git a/testData/field/method/internalField.kt b/testData/field/method/internalField.kt new file mode 100644 index 00000000000..698afa74245 --- /dev/null +++ b/testData/field/method/internalField.kt @@ -0,0 +1 @@ +var f : Foo? \ No newline at end of file diff --git a/testData/field/method/privateField.jav b/testData/field/method/privateField.jav new file mode 100644 index 00000000000..bb102febdcd --- /dev/null +++ b/testData/field/method/privateField.jav @@ -0,0 +1 @@ +private Foo f; \ No newline at end of file diff --git a/testData/field/method/privateField.kt b/testData/field/method/privateField.kt new file mode 100644 index 00000000000..bdc2e2b5389 --- /dev/null +++ b/testData/field/method/privateField.kt @@ -0,0 +1 @@ +private var f : Foo? \ No newline at end of file diff --git a/testData/field/method/protectedField.jav b/testData/field/method/protectedField.jav new file mode 100644 index 00000000000..5fec6e8c145 --- /dev/null +++ b/testData/field/method/protectedField.jav @@ -0,0 +1 @@ +protected Foo f; \ No newline at end of file diff --git a/testData/field/method/protectedField.kt b/testData/field/method/protectedField.kt new file mode 100644 index 00000000000..1ce1567cdc0 --- /dev/null +++ b/testData/field/method/protectedField.kt @@ -0,0 +1 @@ +protected var f : Foo? \ No newline at end of file diff --git a/testData/field/method/publicField.jav b/testData/field/method/publicField.jav new file mode 100644 index 00000000000..7f46379cf3d --- /dev/null +++ b/testData/field/method/publicField.jav @@ -0,0 +1 @@ +public Foo f; \ No newline at end of file diff --git a/testData/field/method/publicField.kt b/testData/field/method/publicField.kt new file mode 100644 index 00000000000..143ef31b5c8 --- /dev/null +++ b/testData/field/method/publicField.kt @@ -0,0 +1 @@ +public var f : Foo? \ No newline at end of file diff --git a/testData/field/method/valWithInit.jav b/testData/field/method/valWithInit.jav new file mode 100644 index 00000000000..085241a9e9d --- /dev/null +++ b/testData/field/method/valWithInit.jav @@ -0,0 +1 @@ +final Foo f = new Foo(1, 2); \ No newline at end of file diff --git a/testData/field/method/valWithInit.kt b/testData/field/method/valWithInit.kt new file mode 100644 index 00000000000..a737faf3351 --- /dev/null +++ b/testData/field/method/valWithInit.kt @@ -0,0 +1 @@ +val f : Foo? = Foo(1, 2) \ No newline at end of file diff --git a/testData/field/method/varWithInit.jav b/testData/field/method/varWithInit.jav new file mode 100644 index 00000000000..ac2b8d54bd4 --- /dev/null +++ b/testData/field/method/varWithInit.jav @@ -0,0 +1 @@ +Foo f = new Foo(1, 2); \ No newline at end of file diff --git a/testData/field/method/varWithInit.kt b/testData/field/method/varWithInit.kt new file mode 100644 index 00000000000..996f5072c1b --- /dev/null +++ b/testData/field/method/varWithInit.kt @@ -0,0 +1 @@ +var f : Foo? = Foo(1, 2) \ No newline at end of file diff --git a/testData/field/method/varWithoutInit.jav b/testData/field/method/varWithoutInit.jav new file mode 100644 index 00000000000..3f94302d50a --- /dev/null +++ b/testData/field/method/varWithoutInit.jav @@ -0,0 +1 @@ +Foo f; \ No newline at end of file diff --git a/testData/field/method/varWithoutInit.kt b/testData/field/method/varWithoutInit.kt new file mode 100644 index 00000000000..698afa74245 --- /dev/null +++ b/testData/field/method/varWithoutInit.kt @@ -0,0 +1 @@ +var f : Foo? \ No newline at end of file diff --git a/testData/file_/file/packageWithClass.jav b/testData/file_/file/packageWithClass.jav new file mode 100644 index 00000000000..3524ce7525c --- /dev/null +++ b/testData/file_/file/packageWithClass.jav @@ -0,0 +1 @@ +package test; final class C {} \ No newline at end of file diff --git a/testData/file_/file/packageWithClass.kt b/testData/file_/file/packageWithClass.kt new file mode 100644 index 00000000000..399e3faa127 --- /dev/null +++ b/testData/file_/file/packageWithClass.kt @@ -0,0 +1 @@ +namespace test { class C { } } \ No newline at end of file diff --git a/testData/file_/file/packageWithClasses.jav b/testData/file_/file/packageWithClasses.jav new file mode 100644 index 00000000000..d0964b8ccb5 --- /dev/null +++ b/testData/file_/file/packageWithClasses.jav @@ -0,0 +1 @@ +final class A {} final class B {} \ No newline at end of file diff --git a/testData/file_/file/packageWithClasses.kt b/testData/file_/file/packageWithClasses.kt new file mode 100644 index 00000000000..b5c20e59452 --- /dev/null +++ b/testData/file_/file/packageWithClasses.kt @@ -0,0 +1 @@ +namespace { class A { } class B { } } \ No newline at end of file diff --git a/testData/file_/file/packageWithOpenClass.jav b/testData/file_/file/packageWithOpenClass.jav new file mode 100644 index 00000000000..821bbec2b3d --- /dev/null +++ b/testData/file_/file/packageWithOpenClass.jav @@ -0,0 +1 @@ +package test; class C {} \ No newline at end of file diff --git a/testData/file_/file/packageWithOpenClass.kt b/testData/file_/file/packageWithOpenClass.kt new file mode 100644 index 00000000000..3b7f5a190e6 --- /dev/null +++ b/testData/file_/file/packageWithOpenClass.kt @@ -0,0 +1 @@ +namespace test { open class C { } } \ No newline at end of file diff --git a/testData/file_/file_mult/packageWithImports.jav b/testData/file_/file_mult/packageWithImports.jav new file mode 100644 index 00000000000..94a969cfe93 --- /dev/null +++ b/testData/file_/file_mult/packageWithImports.jav @@ -0,0 +1 @@ +package test;import ast;import ast2; \ No newline at end of file diff --git a/testData/file_/file_mult/packageWithImports.kt b/testData/file_/file_mult/packageWithImports.kt new file mode 100644 index 00000000000..1cb4a91ba46 --- /dev/null +++ b/testData/file_/file_mult/packageWithImports.kt @@ -0,0 +1,4 @@ +namespace test { +import ast +import ast2 +} \ No newline at end of file diff --git a/testData/file_/file_mult/packageWithMixedImports.jav b/testData/file_/file_mult/packageWithMixedImports.jav new file mode 100644 index 00000000000..6296e224258 --- /dev/null +++ b/testData/file_/file_mult/packageWithMixedImports.jav @@ -0,0 +1 @@ +package test;import static ast;import ast2; \ No newline at end of file diff --git a/testData/file_/file_mult/packageWithMixedImports.kt b/testData/file_/file_mult/packageWithMixedImports.kt new file mode 100644 index 00000000000..1cb4a91ba46 --- /dev/null +++ b/testData/file_/file_mult/packageWithMixedImports.kt @@ -0,0 +1,4 @@ +namespace test { +import ast +import ast2 +} \ No newline at end of file diff --git a/testData/file_/file_mult/packageWithStaticImports.jav b/testData/file_/file_mult/packageWithStaticImports.jav new file mode 100644 index 00000000000..0d1bea3ba5a --- /dev/null +++ b/testData/file_/file_mult/packageWithStaticImports.jav @@ -0,0 +1 @@ +package test;import static ast;import static ast2; \ No newline at end of file diff --git a/testData/file_/file_mult/packageWithStaticImports.kt b/testData/file_/file_mult/packageWithStaticImports.kt new file mode 100644 index 00000000000..1cb4a91ba46 --- /dev/null +++ b/testData/file_/file_mult/packageWithStaticImports.kt @@ -0,0 +1,4 @@ +namespace test { +import ast +import ast2 +} \ No newline at end of file diff --git a/testData/for/statement_mult/commonCaseForTest.jav b/testData/for/statement_mult/commonCaseForTest.jav new file mode 100644 index 00000000000..0ea98e4b45f --- /dev/null +++ b/testData/for/statement_mult/commonCaseForTest.jav @@ -0,0 +1 @@ +for (init(); condition(); update()) body(); \ No newline at end of file diff --git a/testData/for/statement_mult/commonCaseForTest.kt b/testData/for/statement_mult/commonCaseForTest.kt new file mode 100644 index 00000000000..0fab59caf33 --- /dev/null +++ b/testData/for/statement_mult/commonCaseForTest.kt @@ -0,0 +1,10 @@ +{ +init() +while (condition()) +{ +body() +{ +update() +} +} +} \ No newline at end of file diff --git a/testData/for/statement_mult/forWithBlock.jav b/testData/for/statement_mult/forWithBlock.jav new file mode 100644 index 00000000000..b470371f4a3 --- /dev/null +++ b/testData/for/statement_mult/forWithBlock.jav @@ -0,0 +1 @@ +for (int i = 0; i < 0; i++) {int i = 1; i++;} \ No newline at end of file diff --git a/testData/for/statement_mult/forWithBlock.kt b/testData/for/statement_mult/forWithBlock.kt new file mode 100644 index 00000000000..2ed9ae1e9a0 --- /dev/null +++ b/testData/for/statement_mult/forWithBlock.kt @@ -0,0 +1,13 @@ +{ +var i : Int = 0 +while ((i < 0)) +{ +{ +var i : Int = 1 +(i++) +} +{ +(i++) +} +} +} \ No newline at end of file diff --git a/testData/for/statement_mult/forWithBlockAndDoubleUpdate.jav b/testData/for/statement_mult/forWithBlockAndDoubleUpdate.jav new file mode 100644 index 00000000000..6c7c9e0e210 --- /dev/null +++ b/testData/for/statement_mult/forWithBlockAndDoubleUpdate.jav @@ -0,0 +1 @@ +for (int i = 0; i < 0; j++, i++) {int i = 1; i++;} \ No newline at end of file diff --git a/testData/for/statement_mult/forWithBlockAndDoubleUpdate.kt b/testData/for/statement_mult/forWithBlockAndDoubleUpdate.kt new file mode 100644 index 00000000000..5c7a0168951 --- /dev/null +++ b/testData/for/statement_mult/forWithBlockAndDoubleUpdate.kt @@ -0,0 +1,14 @@ +{ +var i : Int = 0 +while ((i < 0)) +{ +{ +var i : Int = 1 +(i++) +} +{ +(j++) +(i++) +} +} +} \ No newline at end of file diff --git a/testData/for/statement_mult/forWithEmptyBlock.jav b/testData/for/statement_mult/forWithEmptyBlock.jav new file mode 100644 index 00000000000..35fa13bac7b --- /dev/null +++ b/testData/for/statement_mult/forWithEmptyBlock.jav @@ -0,0 +1 @@ +for (int i = 0; i < 0; j++, i++) {} \ No newline at end of file diff --git a/testData/for/statement_mult/forWithEmptyBlock.kt b/testData/for/statement_mult/forWithEmptyBlock.kt new file mode 100644 index 00000000000..8ec3c763bf8 --- /dev/null +++ b/testData/for/statement_mult/forWithEmptyBlock.kt @@ -0,0 +1,12 @@ +{ +var i : Int = 0 +while ((i < 0)) +{ +{ +} +{ +(j++) +(i++) +} +} +} \ No newline at end of file diff --git a/testData/for/statement_mult/forWithExpression.jav b/testData/for/statement_mult/forWithExpression.jav new file mode 100644 index 00000000000..fc006f06703 --- /dev/null +++ b/testData/for/statement_mult/forWithExpression.jav @@ -0,0 +1 @@ +for (int i = 0; i < 0; i++) t++; \ No newline at end of file diff --git a/testData/for/statement_mult/forWithExpression.kt b/testData/for/statement_mult/forWithExpression.kt new file mode 100644 index 00000000000..2fa4c89935e --- /dev/null +++ b/testData/for/statement_mult/forWithExpression.kt @@ -0,0 +1,10 @@ +{ +var i : Int = 0 +while ((i < 0)) +{ +(t++) +{ +(i++) +} +} +} \ No newline at end of file diff --git a/testData/for/statement_mult/forWithReturn.jav b/testData/for/statement_mult/forWithReturn.jav new file mode 100644 index 00000000000..9a439dfe876 --- /dev/null +++ b/testData/for/statement_mult/forWithReturn.jav @@ -0,0 +1 @@ +for (int i = 0; i < 0; j++, i++) return i; \ No newline at end of file diff --git a/testData/for/statement_mult/forWithReturn.kt b/testData/for/statement_mult/forWithReturn.kt new file mode 100644 index 00000000000..d7c34312768 --- /dev/null +++ b/testData/for/statement_mult/forWithReturn.kt @@ -0,0 +1,11 @@ +{ +var i : Int = 0 +while ((i < 0)) +{ +return i +{ +(j++) +(i++) +} +} +} \ No newline at end of file diff --git a/testData/foreachStatement/statement_mult/enhancedForWithBlock.jav b/testData/foreachStatement/statement_mult/enhancedForWithBlock.jav new file mode 100644 index 00000000000..8657e2d8f9c --- /dev/null +++ b/testData/foreachStatement/statement_mult/enhancedForWithBlock.jav @@ -0,0 +1 @@ +for (Node n : list) {int i = 1; i++;} \ No newline at end of file diff --git a/testData/foreachStatement/statement_mult/enhancedForWithBlock.kt b/testData/foreachStatement/statement_mult/enhancedForWithBlock.kt new file mode 100644 index 00000000000..06e9f5653fd --- /dev/null +++ b/testData/foreachStatement/statement_mult/enhancedForWithBlock.kt @@ -0,0 +1,5 @@ +for (n : Node? in list) +{ +var i : Int = 1 +(i++) +} \ No newline at end of file diff --git a/testData/foreachStatement/statement_mult/enhancedForWithEmptyBlock.jav b/testData/foreachStatement/statement_mult/enhancedForWithEmptyBlock.jav new file mode 100644 index 00000000000..225aecfb59c --- /dev/null +++ b/testData/foreachStatement/statement_mult/enhancedForWithEmptyBlock.jav @@ -0,0 +1 @@ +for (Node n : list) {} \ No newline at end of file diff --git a/testData/foreachStatement/statement_mult/enhancedForWithEmptyBlock.kt b/testData/foreachStatement/statement_mult/enhancedForWithEmptyBlock.kt new file mode 100644 index 00000000000..96f7cee4323 --- /dev/null +++ b/testData/foreachStatement/statement_mult/enhancedForWithEmptyBlock.kt @@ -0,0 +1,3 @@ +for (n : Node? in list) +{ +} \ No newline at end of file diff --git a/testData/foreachStatement/statement_mult/enhancedForWithExpression.jav b/testData/foreachStatement/statement_mult/enhancedForWithExpression.jav new file mode 100644 index 00000000000..22e30e2879e --- /dev/null +++ b/testData/foreachStatement/statement_mult/enhancedForWithExpression.jav @@ -0,0 +1 @@ +for (Node n : list) i++; \ No newline at end of file diff --git a/testData/foreachStatement/statement_mult/enhancedForWithExpression.kt b/testData/foreachStatement/statement_mult/enhancedForWithExpression.kt new file mode 100644 index 00000000000..b2135910585 --- /dev/null +++ b/testData/foreachStatement/statement_mult/enhancedForWithExpression.kt @@ -0,0 +1,2 @@ +for (n : Node? in list) +(i++) \ No newline at end of file diff --git a/testData/foreachStatement/statement_mult/enhancedForWithReturn.jav b/testData/foreachStatement/statement_mult/enhancedForWithReturn.jav new file mode 100644 index 00000000000..59409790376 --- /dev/null +++ b/testData/foreachStatement/statement_mult/enhancedForWithReturn.jav @@ -0,0 +1 @@ +for (Node n : list) return n; \ No newline at end of file diff --git a/testData/foreachStatement/statement_mult/enhancedForWithReturn.kt b/testData/foreachStatement/statement_mult/enhancedForWithReturn.kt new file mode 100644 index 00000000000..cb66b9552f4 --- /dev/null +++ b/testData/foreachStatement/statement_mult/enhancedForWithReturn.kt @@ -0,0 +1,2 @@ +for (n : Node? in list) +return n \ No newline at end of file diff --git a/testData/function/file/override.jav b/testData/function/file/override.jav new file mode 100644 index 00000000000..63a319a053c --- /dev/null +++ b/testData/function/file/override.jav @@ -0,0 +1 @@ +class A {void a() {}} final class B extends A {void a() {}} \ No newline at end of file diff --git a/testData/function/file/override.kt b/testData/function/file/override.kt new file mode 100644 index 00000000000..0d941e24a2d --- /dev/null +++ b/testData/function/file/override.kt @@ -0,0 +1 @@ +namespace { open class A { fun a() : Unit { } } class B : A { override fun a() : Unit { } } } \ No newline at end of file diff --git a/testData/function/method/classGenericParam.jav b/testData/function/method/classGenericParam.jav new file mode 100644 index 00000000000..ec2f1534b58 --- /dev/null +++ b/testData/function/method/classGenericParam.jav @@ -0,0 +1 @@ +T getT() {} \ No newline at end of file diff --git a/testData/function/method/classGenericParam.kt b/testData/function/method/classGenericParam.kt new file mode 100644 index 00000000000..7f936986c02 --- /dev/null +++ b/testData/function/method/classGenericParam.kt @@ -0,0 +1 @@ +fun getT() : T? { } \ No newline at end of file diff --git a/testData/function/method/emptyVoidMethod.jav b/testData/function/method/emptyVoidMethod.jav new file mode 100644 index 00000000000..05a37e98348 --- /dev/null +++ b/testData/function/method/emptyVoidMethod.jav @@ -0,0 +1 @@ +void main() {} \ No newline at end of file diff --git a/testData/function/method/emptyVoidMethod.kt b/testData/function/method/emptyVoidMethod.kt new file mode 100644 index 00000000000..93eff2fa681 --- /dev/null +++ b/testData/function/method/emptyVoidMethod.kt @@ -0,0 +1 @@ +fun main() : Unit { } \ No newline at end of file diff --git a/testData/function/method/internal.jav b/testData/function/method/internal.jav new file mode 100644 index 00000000000..48b8cb32a8b --- /dev/null +++ b/testData/function/method/internal.jav @@ -0,0 +1 @@ +void test() {} \ No newline at end of file diff --git a/testData/function/method/internal.kt b/testData/function/method/internal.kt new file mode 100644 index 00000000000..8155b96fa2f --- /dev/null +++ b/testData/function/method/internal.kt @@ -0,0 +1 @@ +fun test() : Unit { } \ No newline at end of file diff --git a/testData/function/method/methodClassType.jav b/testData/function/method/methodClassType.jav new file mode 100644 index 00000000000..ad93979b6fc --- /dev/null +++ b/testData/function/method/methodClassType.jav @@ -0,0 +1 @@ +String main() {} \ No newline at end of file diff --git a/testData/function/method/methodClassType.kt b/testData/function/method/methodClassType.kt new file mode 100644 index 00000000000..a501cae6c7c --- /dev/null +++ b/testData/function/method/methodClassType.kt @@ -0,0 +1 @@ +fun main() : String? { } \ No newline at end of file diff --git a/testData/function/method/methodPrimitiveType.jav b/testData/function/method/methodPrimitiveType.jav new file mode 100644 index 00000000000..c272dabaeb6 --- /dev/null +++ b/testData/function/method/methodPrimitiveType.jav @@ -0,0 +1 @@ +int main() {} \ No newline at end of file diff --git a/testData/function/method/methodPrimitiveType.kt b/testData/function/method/methodPrimitiveType.kt new file mode 100644 index 00000000000..ee968dfc778 --- /dev/null +++ b/testData/function/method/methodPrimitiveType.kt @@ -0,0 +1 @@ +fun main() : Int { } \ No newline at end of file diff --git a/testData/function/method/methodPrimitiveType2.jav b/testData/function/method/methodPrimitiveType2.jav new file mode 100644 index 00000000000..0539f74aaef --- /dev/null +++ b/testData/function/method/methodPrimitiveType2.jav @@ -0,0 +1 @@ +boolean main() {} \ No newline at end of file diff --git a/testData/function/method/methodPrimitiveType2.kt b/testData/function/method/methodPrimitiveType2.kt new file mode 100644 index 00000000000..30327d5bfd0 --- /dev/null +++ b/testData/function/method/methodPrimitiveType2.kt @@ -0,0 +1 @@ +fun main() : Boolean { } \ No newline at end of file diff --git a/testData/function/method/methodWithReturnStatement.jav b/testData/function/method/methodWithReturnStatement.jav new file mode 100644 index 00000000000..1b02cbaa290 --- /dev/null +++ b/testData/function/method/methodWithReturnStatement.jav @@ -0,0 +1 @@ +boolean isTrue() { return true; } \ No newline at end of file diff --git a/testData/function/method/methodWithReturnStatement.kt b/testData/function/method/methodWithReturnStatement.kt new file mode 100644 index 00000000000..641bd3e4f6e --- /dev/null +++ b/testData/function/method/methodWithReturnStatement.kt @@ -0,0 +1 @@ +fun isTrue() : Boolean { return true } \ No newline at end of file diff --git a/testData/function/method/ownGenericParam.jav b/testData/function/method/ownGenericParam.jav new file mode 100644 index 00000000000..3b651cfda09 --- /dev/null +++ b/testData/function/method/ownGenericParam.jav @@ -0,0 +1 @@ + void putU(U u) {} \ No newline at end of file diff --git a/testData/function/method/ownGenericParam.kt b/testData/function/method/ownGenericParam.kt new file mode 100644 index 00000000000..bcc017c4dcc --- /dev/null +++ b/testData/function/method/ownGenericParam.kt @@ -0,0 +1 @@ +fun putU(u : U?) : Unit { } \ No newline at end of file diff --git a/testData/function/method/ownSeveralGenericParams.jav b/testData/function/method/ownSeveralGenericParams.jav new file mode 100644 index 00000000000..3af41393000 --- /dev/null +++ b/testData/function/method/ownSeveralGenericParams.jav @@ -0,0 +1 @@ + void putUVW(U u, V v, W w) {} \ No newline at end of file diff --git a/testData/function/method/ownSeveralGenericParams.kt b/testData/function/method/ownSeveralGenericParams.kt new file mode 100644 index 00000000000..6fd24774822 --- /dev/null +++ b/testData/function/method/ownSeveralGenericParams.kt @@ -0,0 +1 @@ +fun putUVW(u : U?, v : V?, w : W?) : Unit { } \ No newline at end of file diff --git a/testData/function/method/private.jav b/testData/function/method/private.jav new file mode 100644 index 00000000000..823fbd1e89e --- /dev/null +++ b/testData/function/method/private.jav @@ -0,0 +1 @@ +private void test() {} \ No newline at end of file diff --git a/testData/function/method/private.kt b/testData/function/method/private.kt new file mode 100644 index 00000000000..f71b1d7c6c8 --- /dev/null +++ b/testData/function/method/private.kt @@ -0,0 +1 @@ +private fun test() : Unit { } \ No newline at end of file diff --git a/testData/function/method/protected.jav b/testData/function/method/protected.jav new file mode 100644 index 00000000000..ab7575a6ed6 --- /dev/null +++ b/testData/function/method/protected.jav @@ -0,0 +1 @@ +protected void test() {} \ No newline at end of file diff --git a/testData/function/method/protected.kt b/testData/function/method/protected.kt new file mode 100644 index 00000000000..e03000581bc --- /dev/null +++ b/testData/function/method/protected.kt @@ -0,0 +1 @@ +protected fun test() : Unit { } \ No newline at end of file diff --git a/testData/function/method/public.jav b/testData/function/method/public.jav new file mode 100644 index 00000000000..db620e22298 --- /dev/null +++ b/testData/function/method/public.jav @@ -0,0 +1 @@ +public void test() {} \ No newline at end of file diff --git a/testData/function/method/public.kt b/testData/function/method/public.kt new file mode 100644 index 00000000000..6e8c3855f6c --- /dev/null +++ b/testData/function/method/public.kt @@ -0,0 +1 @@ +public fun test() : Unit { } \ No newline at end of file diff --git a/testData/ifStatement/statement_mult/ifStatementWithEmptyBlocks.jav b/testData/ifStatement/statement_mult/ifStatementWithEmptyBlocks.jav new file mode 100644 index 00000000000..3690c79ad62 --- /dev/null +++ b/testData/ifStatement/statement_mult/ifStatementWithEmptyBlocks.jav @@ -0,0 +1 @@ +if (1 > 0) {} else {} \ No newline at end of file diff --git a/testData/ifStatement/statement_mult/ifStatementWithEmptyBlocks.kt b/testData/ifStatement/statement_mult/ifStatementWithEmptyBlocks.kt new file mode 100644 index 00000000000..6cff12d424b --- /dev/null +++ b/testData/ifStatement/statement_mult/ifStatementWithEmptyBlocks.kt @@ -0,0 +1,6 @@ +if ((1 > 0)) +{ +} +else +{ +} \ No newline at end of file diff --git a/testData/ifStatement/statement_mult/ifStatementWithMultilineBlocks.jav b/testData/ifStatement/statement_mult/ifStatementWithMultilineBlocks.jav new file mode 100644 index 00000000000..5546ee07bcf --- /dev/null +++ b/testData/ifStatement/statement_mult/ifStatementWithMultilineBlocks.jav @@ -0,0 +1 @@ +if (1 > 0) {int n = 1; return n;} else {return 0;} \ No newline at end of file diff --git a/testData/ifStatement/statement_mult/ifStatementWithMultilineBlocks.kt b/testData/ifStatement/statement_mult/ifStatementWithMultilineBlocks.kt new file mode 100644 index 00000000000..03496fee3ad --- /dev/null +++ b/testData/ifStatement/statement_mult/ifStatementWithMultilineBlocks.kt @@ -0,0 +1,9 @@ +if ((1 > 0)) +{ +var n : Int = 1 +return n +} +else +{ +return 0 +} \ No newline at end of file diff --git a/testData/ifStatement/statement_mult/ifStatementWithOneLineBlocks.jav b/testData/ifStatement/statement_mult/ifStatementWithOneLineBlocks.jav new file mode 100644 index 00000000000..c772469d2d2 --- /dev/null +++ b/testData/ifStatement/statement_mult/ifStatementWithOneLineBlocks.jav @@ -0,0 +1 @@ +if (true) return 1; else return 0; \ No newline at end of file diff --git a/testData/ifStatement/statement_mult/ifStatementWithOneLineBlocks.kt b/testData/ifStatement/statement_mult/ifStatementWithOneLineBlocks.kt new file mode 100644 index 00000000000..923c0d36318 --- /dev/null +++ b/testData/ifStatement/statement_mult/ifStatementWithOneLineBlocks.kt @@ -0,0 +1,4 @@ +if (true) +return 1 +else +return 0 \ No newline at end of file diff --git a/testData/ifStatement/statement_mult/ifStatementWithoutElse.jav b/testData/ifStatement/statement_mult/ifStatementWithoutElse.jav new file mode 100644 index 00000000000..d4814fbe107 --- /dev/null +++ b/testData/ifStatement/statement_mult/ifStatementWithoutElse.jav @@ -0,0 +1 @@ +if (1 > 0) {int n = 1; return n;} \ No newline at end of file diff --git a/testData/ifStatement/statement_mult/ifStatementWithoutElse.kt b/testData/ifStatement/statement_mult/ifStatementWithoutElse.kt new file mode 100644 index 00000000000..a8e52d980ec --- /dev/null +++ b/testData/ifStatement/statement_mult/ifStatementWithoutElse.kt @@ -0,0 +1,5 @@ +if ((1 > 0)) +{ +var n : Int = 1 +return n +} \ No newline at end of file diff --git a/testData/inProjectionType/method/methodParams.jav b/testData/inProjectionType/method/methodParams.jav new file mode 100644 index 00000000000..63b9ff6d6b7 --- /dev/null +++ b/testData/inProjectionType/method/methodParams.jav @@ -0,0 +1 @@ +void popAll(Collection dst) {} \ No newline at end of file diff --git a/testData/inProjectionType/method/methodParams.kt b/testData/inProjectionType/method/methodParams.kt new file mode 100644 index 00000000000..8073329f038 --- /dev/null +++ b/testData/inProjectionType/method/methodParams.kt @@ -0,0 +1 @@ +fun popAll(dst : Collection?) : Unit { } \ No newline at end of file diff --git a/testData/isOperator/expression_mult/complicatedExpression.jav b/testData/isOperator/expression_mult/complicatedExpression.jav new file mode 100644 index 00000000000..8840a8af77b --- /dev/null +++ b/testData/isOperator/expression_mult/complicatedExpression.jav @@ -0,0 +1 @@ +c.getType().getName() instanceof String \ No newline at end of file diff --git a/testData/isOperator/expression_mult/complicatedExpression.kt b/testData/isOperator/expression_mult/complicatedExpression.kt new file mode 100644 index 00000000000..3105c369fbe --- /dev/null +++ b/testData/isOperator/expression_mult/complicatedExpression.kt @@ -0,0 +1 @@ +(c.getType().getName() is String?) \ No newline at end of file diff --git a/testData/isOperator/expression_mult/simpleReference.jav b/testData/isOperator/expression_mult/simpleReference.jav new file mode 100644 index 00000000000..2cd30e5adf2 --- /dev/null +++ b/testData/isOperator/expression_mult/simpleReference.jav @@ -0,0 +1 @@ +a instanceof String \ No newline at end of file diff --git a/testData/isOperator/expression_mult/simpleReference.kt b/testData/isOperator/expression_mult/simpleReference.kt new file mode 100644 index 00000000000..544cd7f6728 --- /dev/null +++ b/testData/isOperator/expression_mult/simpleReference.kt @@ -0,0 +1 @@ +(a is String?) \ No newline at end of file diff --git a/testData/labelStatement/statement_mult/complicatedExampleFromJavaTutorial.jav b/testData/labelStatement/statement_mult/complicatedExampleFromJavaTutorial.jav new file mode 100644 index 00000000000..5c8ac99dd07 --- /dev/null +++ b/testData/labelStatement/statement_mult/complicatedExampleFromJavaTutorial.jav @@ -0,0 +1 @@ + test: for (int i = 0; i <= max; i++) { int n = substring.length(); int j = i; int k = 0; while (n-- != 0) { if (searchMe.charAt(j++) != substring.charAt(k++)) { continue test; } } foundIt = true; break test; } System.out.println(foundIt ? "Found it" : "Didn't find it"); }} \ No newline at end of file diff --git a/testData/labelStatement/statement_mult/complicatedExampleFromJavaTutorial.kt b/testData/labelStatement/statement_mult/complicatedExampleFromJavaTutorial.kt new file mode 100644 index 00000000000..9451018950a --- /dev/null +++ b/testData/labelStatement/statement_mult/complicatedExampleFromJavaTutorial.kt @@ -0,0 +1,27 @@ +@test { +var i : Int = 0 +while ((i <= max)) +{ +{ +var n : Int = substring.length() +var j : Int = i +var k : Int = 0 +while (((n--) != 0)) +{ +if ((searchMe.charAt((j++)) != substring.charAt((k++)))) +{ +continue@test +} +} +foundIt = true +break@test +} +{ +(i++) +} +} +} +System.out.println((if (foundIt) +"Found it" +else +"Didn't find it")) \ No newline at end of file diff --git a/testData/localVariable/statement/object.jav b/testData/localVariable/statement/object.jav new file mode 100644 index 00000000000..c9cd10a31fd --- /dev/null +++ b/testData/localVariable/statement/object.jav @@ -0,0 +1 @@ +int i; \ No newline at end of file diff --git a/testData/localVariable/statement/object.kt b/testData/localVariable/statement/object.kt new file mode 100644 index 00000000000..03ab5111a88 --- /dev/null +++ b/testData/localVariable/statement/object.kt @@ -0,0 +1 @@ +var i : Int \ No newline at end of file diff --git a/testData/methodCallExpression/statement/callWithKeywords.jav b/testData/methodCallExpression/statement/callWithKeywords.jav new file mode 100644 index 00000000000..db350dda8fc --- /dev/null +++ b/testData/methodCallExpression/statement/callWithKeywords.jav @@ -0,0 +1 @@ +when(open, trait); \ No newline at end of file diff --git a/testData/methodCallExpression/statement/callWithKeywords.kt b/testData/methodCallExpression/statement/callWithKeywords.kt new file mode 100644 index 00000000000..92c6a067e95 --- /dev/null +++ b/testData/methodCallExpression/statement/callWithKeywords.kt @@ -0,0 +1 @@ +`when`(`open`, `trait`) \ No newline at end of file diff --git a/testData/methodCallExpression/statement/emptyCall.jav b/testData/methodCallExpression/statement/emptyCall.jav new file mode 100644 index 00000000000..9c6af147cda --- /dev/null +++ b/testData/methodCallExpression/statement/emptyCall.jav @@ -0,0 +1 @@ +methodCall(); \ No newline at end of file diff --git a/testData/methodCallExpression/statement/emptyCall.kt b/testData/methodCallExpression/statement/emptyCall.kt new file mode 100644 index 00000000000..60d495be000 --- /dev/null +++ b/testData/methodCallExpression/statement/emptyCall.kt @@ -0,0 +1 @@ +methodCall() \ No newline at end of file diff --git a/testData/methodCallExpression/statement/simpleCall.jav b/testData/methodCallExpression/statement/simpleCall.jav new file mode 100644 index 00000000000..0e52b457e69 --- /dev/null +++ b/testData/methodCallExpression/statement/simpleCall.jav @@ -0,0 +1 @@ +method(param1, param2); \ No newline at end of file diff --git a/testData/methodCallExpression/statement/simpleCall.kt b/testData/methodCallExpression/statement/simpleCall.kt new file mode 100644 index 00000000000..43ea8339772 --- /dev/null +++ b/testData/methodCallExpression/statement/simpleCall.kt @@ -0,0 +1 @@ +method(param1, param2) \ No newline at end of file diff --git a/testData/newClassExpression/expression/classWithParam.jav b/testData/newClassExpression/expression/classWithParam.jav new file mode 100644 index 00000000000..44849d3495c --- /dev/null +++ b/testData/newClassExpression/expression/classWithParam.jav @@ -0,0 +1 @@ +new Foo(param); \ No newline at end of file diff --git a/testData/newClassExpression/expression/classWithParam.kt b/testData/newClassExpression/expression/classWithParam.kt new file mode 100644 index 00000000000..9d29e159e31 --- /dev/null +++ b/testData/newClassExpression/expression/classWithParam.kt @@ -0,0 +1 @@ +Foo(param) \ No newline at end of file diff --git a/testData/newClassExpression/expression/classWithParams.jav b/testData/newClassExpression/expression/classWithParams.jav new file mode 100644 index 00000000000..2461539a170 --- /dev/null +++ b/testData/newClassExpression/expression/classWithParams.jav @@ -0,0 +1 @@ +new Foo(param1, param2); \ No newline at end of file diff --git a/testData/newClassExpression/expression/classWithParams.kt b/testData/newClassExpression/expression/classWithParams.kt new file mode 100644 index 00000000000..e10fb436db2 --- /dev/null +++ b/testData/newClassExpression/expression/classWithParams.kt @@ -0,0 +1 @@ +Foo(param1, param2) \ No newline at end of file diff --git a/testData/newClassExpression/expression/classWithoutBody.jav b/testData/newClassExpression/expression/classWithoutBody.jav new file mode 100644 index 00000000000..acad3c2ee3f --- /dev/null +++ b/testData/newClassExpression/expression/classWithoutBody.jav @@ -0,0 +1 @@ +new Foo(); \ No newline at end of file diff --git a/testData/newClassExpression/expression/classWithoutBody.kt b/testData/newClassExpression/expression/classWithoutBody.kt new file mode 100644 index 00000000000..17f280dc444 --- /dev/null +++ b/testData/newClassExpression/expression/classWithoutBody.kt @@ -0,0 +1 @@ +Foo() \ No newline at end of file diff --git a/testData/newClassExpression/expression/classWithoutBody2.jav b/testData/newClassExpression/expression/classWithoutBody2.jav new file mode 100644 index 00000000000..6c79694938f --- /dev/null +++ b/testData/newClassExpression/expression/classWithoutBody2.jav @@ -0,0 +1 @@ +new myApp.Foo(); \ No newline at end of file diff --git a/testData/newClassExpression/expression/classWithoutBody2.kt b/testData/newClassExpression/expression/classWithoutBody2.kt new file mode 100644 index 00000000000..4c5fba47bd0 --- /dev/null +++ b/testData/newClassExpression/expression/classWithoutBody2.kt @@ -0,0 +1 @@ +myApp.Foo() \ No newline at end of file diff --git a/testData/outProjectionType/method/methodParams.jav b/testData/outProjectionType/method/methodParams.jav new file mode 100644 index 00000000000..ac87941ea87 --- /dev/null +++ b/testData/outProjectionType/method/methodParams.jav @@ -0,0 +1 @@ +void pushAll(Collection src) {} \ No newline at end of file diff --git a/testData/outProjectionType/method/methodParams.kt b/testData/outProjectionType/method/methodParams.kt new file mode 100644 index 00000000000..6117f1d6945 --- /dev/null +++ b/testData/outProjectionType/method/methodParams.kt @@ -0,0 +1 @@ +fun pushAll(src : Collection?) : Unit { } \ No newline at end of file diff --git a/testData/parenthesizedExpression/expression/parenthesized.jav b/testData/parenthesizedExpression/expression/parenthesized.jav new file mode 100644 index 00000000000..0a911375668 --- /dev/null +++ b/testData/parenthesizedExpression/expression/parenthesized.jav @@ -0,0 +1 @@ +(1 + 2) \ No newline at end of file diff --git a/testData/parenthesizedExpression/expression/parenthesized.kt b/testData/parenthesizedExpression/expression/parenthesized.kt new file mode 100644 index 00000000000..eb8f4ff5a21 --- /dev/null +++ b/testData/parenthesizedExpression/expression/parenthesized.kt @@ -0,0 +1 @@ +((1 + 2)) \ No newline at end of file diff --git a/testData/parenthesizedExpression/expression/parenthesized2.jav b/testData/parenthesizedExpression/expression/parenthesized2.jav new file mode 100644 index 00000000000..390ddb6f123 --- /dev/null +++ b/testData/parenthesizedExpression/expression/parenthesized2.jav @@ -0,0 +1 @@ +(o.toString() + "abc") \ No newline at end of file diff --git a/testData/parenthesizedExpression/expression/parenthesized2.kt b/testData/parenthesizedExpression/expression/parenthesized2.kt new file mode 100644 index 00000000000..53aa2923a2c --- /dev/null +++ b/testData/parenthesizedExpression/expression/parenthesized2.kt @@ -0,0 +1 @@ +((o.toString() + "abc")) \ No newline at end of file diff --git a/testData/polyadicExpression/expression_mult/divide.jav b/testData/polyadicExpression/expression_mult/divide.jav new file mode 100644 index 00000000000..6005ff02b5d --- /dev/null +++ b/testData/polyadicExpression/expression_mult/divide.jav @@ -0,0 +1 @@ +1 / 2 / 3 \ No newline at end of file diff --git a/testData/polyadicExpression/expression_mult/divide.kt b/testData/polyadicExpression/expression_mult/divide.kt new file mode 100644 index 00000000000..8da2777c101 --- /dev/null +++ b/testData/polyadicExpression/expression_mult/divide.kt @@ -0,0 +1 @@ +(1 / 2 / 3) \ No newline at end of file diff --git a/testData/polyadicExpression/expression_mult/minus.jav b/testData/polyadicExpression/expression_mult/minus.jav new file mode 100644 index 00000000000..35002f64d1e --- /dev/null +++ b/testData/polyadicExpression/expression_mult/minus.jav @@ -0,0 +1 @@ +1 - 2 - 3 \ No newline at end of file diff --git a/testData/polyadicExpression/expression_mult/minus.kt b/testData/polyadicExpression/expression_mult/minus.kt new file mode 100644 index 00000000000..220aab2cfa6 --- /dev/null +++ b/testData/polyadicExpression/expression_mult/minus.kt @@ -0,0 +1 @@ +(1 - 2 - 3) \ No newline at end of file diff --git a/testData/polyadicExpression/expression_mult/multiply.jav b/testData/polyadicExpression/expression_mult/multiply.jav new file mode 100644 index 00000000000..89ddea79483 --- /dev/null +++ b/testData/polyadicExpression/expression_mult/multiply.jav @@ -0,0 +1 @@ +1 * 2 * 3 \ No newline at end of file diff --git a/testData/polyadicExpression/expression_mult/multiply.kt b/testData/polyadicExpression/expression_mult/multiply.kt new file mode 100644 index 00000000000..588078fc87e --- /dev/null +++ b/testData/polyadicExpression/expression_mult/multiply.kt @@ -0,0 +1 @@ +(1 * 2 * 3) \ No newline at end of file diff --git a/testData/polyadicExpression/expression_mult/plus.jav b/testData/polyadicExpression/expression_mult/plus.jav new file mode 100644 index 00000000000..8a2a3c5ef6f --- /dev/null +++ b/testData/polyadicExpression/expression_mult/plus.jav @@ -0,0 +1 @@ +1 + 2 + 3 \ No newline at end of file diff --git a/testData/polyadicExpression/expression_mult/plus.kt b/testData/polyadicExpression/expression_mult/plus.kt new file mode 100644 index 00000000000..5dcba15ae9a --- /dev/null +++ b/testData/polyadicExpression/expression_mult/plus.kt @@ -0,0 +1 @@ +(1 + 2 + 3) \ No newline at end of file diff --git a/testData/polyadicExpression/expression_mult/remainder.jav b/testData/polyadicExpression/expression_mult/remainder.jav new file mode 100644 index 00000000000..2e120c0cd68 --- /dev/null +++ b/testData/polyadicExpression/expression_mult/remainder.jav @@ -0,0 +1 @@ +1 % 2 % 3 \ No newline at end of file diff --git a/testData/polyadicExpression/expression_mult/remainder.kt b/testData/polyadicExpression/expression_mult/remainder.kt new file mode 100644 index 00000000000..65b18900b56 --- /dev/null +++ b/testData/polyadicExpression/expression_mult/remainder.kt @@ -0,0 +1 @@ +(1 % 2 % 3) \ No newline at end of file diff --git a/testData/postfixOperator/statement_mult/decrement.jav b/testData/postfixOperator/statement_mult/decrement.jav new file mode 100644 index 00000000000..47b6f21c63d --- /dev/null +++ b/testData/postfixOperator/statement_mult/decrement.jav @@ -0,0 +1 @@ +i--; \ No newline at end of file diff --git a/testData/postfixOperator/statement_mult/decrement.kt b/testData/postfixOperator/statement_mult/decrement.kt new file mode 100644 index 00000000000..1387099f5a4 --- /dev/null +++ b/testData/postfixOperator/statement_mult/decrement.kt @@ -0,0 +1 @@ +(i--) \ No newline at end of file diff --git a/testData/postfixOperator/statement_mult/increment.jav b/testData/postfixOperator/statement_mult/increment.jav new file mode 100644 index 00000000000..689efdaa358 --- /dev/null +++ b/testData/postfixOperator/statement_mult/increment.jav @@ -0,0 +1 @@ +i++; \ No newline at end of file diff --git a/testData/postfixOperator/statement_mult/increment.kt b/testData/postfixOperator/statement_mult/increment.kt new file mode 100644 index 00000000000..568dc98d422 --- /dev/null +++ b/testData/postfixOperator/statement_mult/increment.kt @@ -0,0 +1 @@ +(i++) \ No newline at end of file diff --git a/testData/prefixOperator/statement_mult/decrement.jav b/testData/prefixOperator/statement_mult/decrement.jav new file mode 100644 index 00000000000..10724ba55da --- /dev/null +++ b/testData/prefixOperator/statement_mult/decrement.jav @@ -0,0 +1 @@ +--i; \ No newline at end of file diff --git a/testData/prefixOperator/statement_mult/decrement.kt b/testData/prefixOperator/statement_mult/decrement.kt new file mode 100644 index 00000000000..93712ce027e --- /dev/null +++ b/testData/prefixOperator/statement_mult/decrement.kt @@ -0,0 +1 @@ +(--i) \ No newline at end of file diff --git a/testData/prefixOperator/statement_mult/increment.jav b/testData/prefixOperator/statement_mult/increment.jav new file mode 100644 index 00000000000..97ad097f1e2 --- /dev/null +++ b/testData/prefixOperator/statement_mult/increment.jav @@ -0,0 +1 @@ +++i; \ No newline at end of file diff --git a/testData/prefixOperator/statement_mult/increment.kt b/testData/prefixOperator/statement_mult/increment.kt new file mode 100644 index 00000000000..b981de4d9b3 --- /dev/null +++ b/testData/prefixOperator/statement_mult/increment.kt @@ -0,0 +1 @@ +(++i) \ No newline at end of file diff --git a/testData/returnStatement/statement/returnChar.jav b/testData/returnStatement/statement/returnChar.jav new file mode 100644 index 00000000000..d693916818c --- /dev/null +++ b/testData/returnStatement/statement/returnChar.jav @@ -0,0 +1 @@ +return 'c'; \ No newline at end of file diff --git a/testData/returnStatement/statement/returnChar.kt b/testData/returnStatement/statement/returnChar.kt new file mode 100644 index 00000000000..b6284fba897 --- /dev/null +++ b/testData/returnStatement/statement/returnChar.kt @@ -0,0 +1 @@ +return 'c' \ No newline at end of file diff --git a/testData/returnStatement/statement/returnLiteral.jav b/testData/returnStatement/statement/returnLiteral.jav new file mode 100644 index 00000000000..5acac407ebf --- /dev/null +++ b/testData/returnStatement/statement/returnLiteral.jav @@ -0,0 +1 @@ +return true; \ No newline at end of file diff --git a/testData/returnStatement/statement/returnLiteral.kt b/testData/returnStatement/statement/returnLiteral.kt new file mode 100644 index 00000000000..2a925639120 --- /dev/null +++ b/testData/returnStatement/statement/returnLiteral.kt @@ -0,0 +1 @@ +return true \ No newline at end of file diff --git a/testData/returnStatement/statement/returnNumber.jav b/testData/returnStatement/statement/returnNumber.jav new file mode 100644 index 00000000000..eb224e0951e --- /dev/null +++ b/testData/returnStatement/statement/returnNumber.jav @@ -0,0 +1 @@ +return 1; \ No newline at end of file diff --git a/testData/returnStatement/statement/returnNumber.kt b/testData/returnStatement/statement/returnNumber.kt new file mode 100644 index 00000000000..5efef616fdb --- /dev/null +++ b/testData/returnStatement/statement/returnNumber.kt @@ -0,0 +1 @@ +return 1 \ No newline at end of file diff --git a/testData/returnStatement/statement/returnString.jav b/testData/returnStatement/statement/returnString.jav new file mode 100644 index 00000000000..b98a6ce7734 --- /dev/null +++ b/testData/returnStatement/statement/returnString.jav @@ -0,0 +1 @@ +return "str"; \ No newline at end of file diff --git a/testData/returnStatement/statement/returnString.kt b/testData/returnStatement/statement/returnString.kt new file mode 100644 index 00000000000..f831e0baf83 --- /dev/null +++ b/testData/returnStatement/statement/returnString.kt @@ -0,0 +1 @@ +return "str" \ No newline at end of file diff --git a/testData/starProjectionType/method/methodParams.jav b/testData/starProjectionType/method/methodParams.jav new file mode 100644 index 00000000000..18d4217e0d9 --- /dev/null +++ b/testData/starProjectionType/method/methodParams.jav @@ -0,0 +1 @@ +void wtf(Collection w) {} \ No newline at end of file diff --git a/testData/starProjectionType/method/methodParams.kt b/testData/starProjectionType/method/methodParams.kt new file mode 100644 index 00000000000..2f5330f87b6 --- /dev/null +++ b/testData/starProjectionType/method/methodParams.kt @@ -0,0 +1 @@ +fun wtf(w : Collection<*>?) : Unit { } \ No newline at end of file diff --git a/testData/synchronizedStatement/statement/singleLineExample.jav b/testData/synchronizedStatement/statement/singleLineExample.jav new file mode 100644 index 00000000000..4c4b01beee5 --- /dev/null +++ b/testData/synchronizedStatement/statement/singleLineExample.jav @@ -0,0 +1 @@ +synchronized (s) { doSomething(s); } \ No newline at end of file diff --git a/testData/synchronizedStatement/statement/singleLineExample.kt b/testData/synchronizedStatement/statement/singleLineExample.kt new file mode 100644 index 00000000000..033b39c45cf --- /dev/null +++ b/testData/synchronizedStatement/statement/singleLineExample.kt @@ -0,0 +1 @@ +synchronized (s) { doSomething(s) } \ No newline at end of file diff --git a/testData/throwStatement/statement/simpleThrowStatement.jav b/testData/throwStatement/statement/simpleThrowStatement.jav new file mode 100644 index 00000000000..2d879427e7c --- /dev/null +++ b/testData/throwStatement/statement/simpleThrowStatement.jav @@ -0,0 +1 @@ +throw exception; \ No newline at end of file diff --git a/testData/throwStatement/statement/simpleThrowStatement.kt b/testData/throwStatement/statement/simpleThrowStatement.kt new file mode 100644 index 00000000000..0894cfeda14 --- /dev/null +++ b/testData/throwStatement/statement/simpleThrowStatement.kt @@ -0,0 +1 @@ +throw exception \ No newline at end of file diff --git a/testData/trait/class/emptyInterface.jav b/testData/trait/class/emptyInterface.jav new file mode 100644 index 00000000000..0bdb5912e9b --- /dev/null +++ b/testData/trait/class/emptyInterface.jav @@ -0,0 +1 @@ +interface A {} \ No newline at end of file diff --git a/testData/trait/class/emptyInterface.kt b/testData/trait/class/emptyInterface.kt new file mode 100644 index 00000000000..a2cce28acad --- /dev/null +++ b/testData/trait/class/emptyInterface.kt @@ -0,0 +1 @@ +trait A { } \ No newline at end of file diff --git a/testData/trait/class/extendsOneClassAndImplementsSeveralInterfaces.jav b/testData/trait/class/extendsOneClassAndImplementsSeveralInterfaces.jav new file mode 100644 index 00000000000..f0434f0b324 --- /dev/null +++ b/testData/trait/class/extendsOneClassAndImplementsSeveralInterfaces.jav @@ -0,0 +1 @@ +interface A extends I0, I1, I2 {} \ No newline at end of file diff --git a/testData/trait/class/extendsOneClassAndImplementsSeveralInterfaces.kt b/testData/trait/class/extendsOneClassAndImplementsSeveralInterfaces.kt new file mode 100644 index 00000000000..354dd60f348 --- /dev/null +++ b/testData/trait/class/extendsOneClassAndImplementsSeveralInterfaces.kt @@ -0,0 +1 @@ +trait A : I0, I1, I2 { } \ No newline at end of file diff --git a/testData/trait/class/extendsOneInterface.jav b/testData/trait/class/extendsOneInterface.jav new file mode 100644 index 00000000000..fdd7b33cb4b --- /dev/null +++ b/testData/trait/class/extendsOneInterface.jav @@ -0,0 +1 @@ +interface A extends I {} \ No newline at end of file diff --git a/testData/trait/class/extendsOneInterface.kt b/testData/trait/class/extendsOneInterface.kt new file mode 100644 index 00000000000..1d64da28e8d --- /dev/null +++ b/testData/trait/class/extendsOneInterface.kt @@ -0,0 +1 @@ +trait A : I { } \ No newline at end of file diff --git a/testData/trait/class/internalInterface.jav b/testData/trait/class/internalInterface.jav new file mode 100644 index 00000000000..6afccc2f169 --- /dev/null +++ b/testData/trait/class/internalInterface.jav @@ -0,0 +1 @@ +interface Test {} \ No newline at end of file diff --git a/testData/trait/class/internalInterface.kt b/testData/trait/class/internalInterface.kt new file mode 100644 index 00000000000..1a34b23ead0 --- /dev/null +++ b/testData/trait/class/internalInterface.kt @@ -0,0 +1 @@ +trait Test { } \ No newline at end of file diff --git a/testData/trait/class/privateInterface.jav b/testData/trait/class/privateInterface.jav new file mode 100644 index 00000000000..cf33d97c99c --- /dev/null +++ b/testData/trait/class/privateInterface.jav @@ -0,0 +1 @@ +private interface Test {} \ No newline at end of file diff --git a/testData/trait/class/privateInterface.kt b/testData/trait/class/privateInterface.kt new file mode 100644 index 00000000000..40dd81f4759 --- /dev/null +++ b/testData/trait/class/privateInterface.kt @@ -0,0 +1 @@ +private trait Test { } \ No newline at end of file diff --git a/testData/trait/class/protectedInterface.jav b/testData/trait/class/protectedInterface.jav new file mode 100644 index 00000000000..e91d5694021 --- /dev/null +++ b/testData/trait/class/protectedInterface.jav @@ -0,0 +1 @@ +protected interface Test {} \ No newline at end of file diff --git a/testData/trait/class/protectedInterface.kt b/testData/trait/class/protectedInterface.kt new file mode 100644 index 00000000000..16e306a9859 --- /dev/null +++ b/testData/trait/class/protectedInterface.kt @@ -0,0 +1 @@ +protected trait Test { } \ No newline at end of file diff --git a/testData/trait/class/publicInterface.jav b/testData/trait/class/publicInterface.jav new file mode 100644 index 00000000000..19c4ff3a675 --- /dev/null +++ b/testData/trait/class/publicInterface.jav @@ -0,0 +1 @@ +public interface Test {} \ No newline at end of file diff --git a/testData/trait/class/publicInterface.kt b/testData/trait/class/publicInterface.kt new file mode 100644 index 00000000000..3c2f3d72209 --- /dev/null +++ b/testData/trait/class/publicInterface.kt @@ -0,0 +1 @@ +public trait Test { } \ No newline at end of file diff --git a/testData/trait/class_mult/interfaceWithFields.jav b/testData/trait/class_mult/interfaceWithFields.jav new file mode 100644 index 00000000000..5fdf82bfa6c --- /dev/null +++ b/testData/trait/class_mult/interfaceWithFields.jav @@ -0,0 +1 @@ +interface INode {String IN = "in";String AT = "@";String COMMA_WITH_SPACE = COMMA + SPACE;} \ No newline at end of file diff --git a/testData/trait/class_mult/interfaceWithFields.kt b/testData/trait/class_mult/interfaceWithFields.kt new file mode 100644 index 00000000000..fc2ab5e9a4f --- /dev/null +++ b/testData/trait/class_mult/interfaceWithFields.kt @@ -0,0 +1,7 @@ +trait INode { +class object { +public val IN : String? = "in" +public val AT : String? = "@" +public val COMMA_WITH_SPACE : String? = (COMMA + SPACE) +} +} \ No newline at end of file diff --git a/testData/trait/class_mult/interfaceWithMethodDeclaration.jav b/testData/trait/class_mult/interfaceWithMethodDeclaration.jav new file mode 100644 index 00000000000..4023476a76e --- /dev/null +++ b/testData/trait/class_mult/interfaceWithMethodDeclaration.jav @@ -0,0 +1 @@ +interface INode {Tag getTag();String toKotlin();} \ No newline at end of file diff --git a/testData/trait/class_mult/interfaceWithMethodDeclaration.kt b/testData/trait/class_mult/interfaceWithMethodDeclaration.kt new file mode 100644 index 00000000000..bf3ade94a28 --- /dev/null +++ b/testData/trait/class_mult/interfaceWithMethodDeclaration.kt @@ -0,0 +1,4 @@ +trait INode { +public fun getTag() : Tag? +public fun toKotlin() : String? +} \ No newline at end of file diff --git a/testData/trait/class_mult/interfaceWithStaticFields.jav b/testData/trait/class_mult/interfaceWithStaticFields.jav new file mode 100644 index 00000000000..831ea008a23 --- /dev/null +++ b/testData/trait/class_mult/interfaceWithStaticFields.jav @@ -0,0 +1 @@ +public interface INode { public static final String IN = "in"; public static final String AT = "@"; public static final String COMMA_WITH_SPACE = COMMA + SPACE;} \ No newline at end of file diff --git a/testData/trait/class_mult/interfaceWithStaticFields.kt b/testData/trait/class_mult/interfaceWithStaticFields.kt new file mode 100644 index 00000000000..22d47bf9a91 --- /dev/null +++ b/testData/trait/class_mult/interfaceWithStaticFields.kt @@ -0,0 +1,7 @@ +public trait INode { +class object { +public val IN : String? = "in" +public val AT : String? = "@" +public val COMMA_WITH_SPACE : String? = (COMMA + SPACE) +} +} \ No newline at end of file diff --git a/testData/tryStatement/statement_mult/commonCaseForTryStatement.jav b/testData/tryStatement/statement_mult/commonCaseForTryStatement.jav new file mode 100644 index 00000000000..ba4d634d21b --- /dev/null +++ b/testData/tryStatement/statement_mult/commonCaseForTryStatement.jav @@ -0,0 +1 @@ +try { callMethod(params);} catch (Exception e) { println(1);} catch (IOException e) { println(0);} finally { println(3);} \ No newline at end of file diff --git a/testData/tryStatement/statement_mult/commonCaseForTryStatement.kt b/testData/tryStatement/statement_mult/commonCaseForTryStatement.kt new file mode 100644 index 00000000000..8ff1a9a7da8 --- /dev/null +++ b/testData/tryStatement/statement_mult/commonCaseForTryStatement.kt @@ -0,0 +1,14 @@ +try +{ +callMethod(params) +} +catch (e : Exception?) { +println(1) +} +catch (e : IOException?) { +println(0) +} +finally +{ +println(3) +} \ No newline at end of file diff --git a/testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithEmptyFinally.jav b/testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithEmptyFinally.jav new file mode 100644 index 00000000000..f334b56c36a --- /dev/null +++ b/testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithEmptyFinally.jav @@ -0,0 +1 @@ +try {} catch (Exception e) { println(1);} catch (IOException e) { println(0);} finally {} \ No newline at end of file diff --git a/testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithEmptyFinally.kt b/testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithEmptyFinally.kt new file mode 100644 index 00000000000..cb84316d7a2 --- /dev/null +++ b/testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithEmptyFinally.kt @@ -0,0 +1,12 @@ +try +{ +} +catch (e : Exception?) { +println(1) +} +catch (e : IOException?) { +println(0) +} +finally +{ +} \ No newline at end of file diff --git a/testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithFinally.jav b/testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithFinally.jav new file mode 100644 index 00000000000..9658c4120c2 --- /dev/null +++ b/testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithFinally.jav @@ -0,0 +1 @@ +try {} catch (Exception e) { println(1);} catch (IOException e) { println(0);} finally { println(3);} \ No newline at end of file diff --git a/testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithFinally.kt b/testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithFinally.kt new file mode 100644 index 00000000000..9cef76b4596 --- /dev/null +++ b/testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithFinally.kt @@ -0,0 +1,13 @@ +try +{ +} +catch (e : Exception?) { +println(1) +} +catch (e : IOException?) { +println(0) +} +finally +{ +println(3) +} \ No newline at end of file diff --git a/testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithoutFinally.jav b/testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithoutFinally.jav new file mode 100644 index 00000000000..5e85a85b378 --- /dev/null +++ b/testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithoutFinally.jav @@ -0,0 +1 @@ +try {} catch (Exception e) { println(1);} catch (IOException e) { println(0);} \ No newline at end of file diff --git a/testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithoutFinally.kt b/testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithoutFinally.kt new file mode 100644 index 00000000000..47bd997f98a --- /dev/null +++ b/testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithoutFinally.kt @@ -0,0 +1,9 @@ +try +{ +} +catch (e : Exception?) { +println(1) +} +catch (e : IOException?) { +println(0) +} \ No newline at end of file diff --git a/testData/typeCastExpression/expression_mult/extendsWildcardCast.jav b/testData/typeCastExpression/expression_mult/extendsWildcardCast.jav new file mode 100644 index 00000000000..c19f94da6e8 --- /dev/null +++ b/testData/typeCastExpression/expression_mult/extendsWildcardCast.jav @@ -0,0 +1 @@ +(List)list \ No newline at end of file diff --git a/testData/typeCastExpression/expression_mult/extendsWildcardCast.kt b/testData/typeCastExpression/expression_mult/extendsWildcardCast.kt new file mode 100644 index 00000000000..05db17e423f --- /dev/null +++ b/testData/typeCastExpression/expression_mult/extendsWildcardCast.kt @@ -0,0 +1 @@ +(list as List?) \ No newline at end of file diff --git a/testData/typeCastExpression/expression_mult/fooCast.jav b/testData/typeCastExpression/expression_mult/fooCast.jav new file mode 100644 index 00000000000..8edd243486a --- /dev/null +++ b/testData/typeCastExpression/expression_mult/fooCast.jav @@ -0,0 +1 @@ +(Foo)t \ No newline at end of file diff --git a/testData/typeCastExpression/expression_mult/fooCast.kt b/testData/typeCastExpression/expression_mult/fooCast.kt new file mode 100644 index 00000000000..109689e1240 --- /dev/null +++ b/testData/typeCastExpression/expression_mult/fooCast.kt @@ -0,0 +1 @@ +(t as Foo?) \ No newline at end of file diff --git a/testData/typeCastExpression/expression_mult/intCast.jav b/testData/typeCastExpression/expression_mult/intCast.jav new file mode 100644 index 00000000000..c000fb4d468 --- /dev/null +++ b/testData/typeCastExpression/expression_mult/intCast.jav @@ -0,0 +1 @@ +(int)t \ No newline at end of file diff --git a/testData/typeCastExpression/expression_mult/intCast.kt b/testData/typeCastExpression/expression_mult/intCast.kt new file mode 100644 index 00000000000..28dc4fc3816 --- /dev/null +++ b/testData/typeCastExpression/expression_mult/intCast.kt @@ -0,0 +1 @@ +(t as Int) \ No newline at end of file diff --git a/testData/typeCastExpression/expression_mult/primitiveType.jav b/testData/typeCastExpression/expression_mult/primitiveType.jav new file mode 100644 index 00000000000..a9cc54cd6b8 --- /dev/null +++ b/testData/typeCastExpression/expression_mult/primitiveType.jav @@ -0,0 +1 @@ +(int)100.00; \ No newline at end of file diff --git a/testData/typeCastExpression/expression_mult/primitiveType.kt b/testData/typeCastExpression/expression_mult/primitiveType.kt new file mode 100644 index 00000000000..ad9dd5d2a7b --- /dev/null +++ b/testData/typeCastExpression/expression_mult/primitiveType.kt @@ -0,0 +1 @@ +(100.00 as Int) \ No newline at end of file diff --git a/testData/typeCastExpression/expression_mult/simpleGenericCast.jav b/testData/typeCastExpression/expression_mult/simpleGenericCast.jav new file mode 100644 index 00000000000..cdfdd30aea4 --- /dev/null +++ b/testData/typeCastExpression/expression_mult/simpleGenericCast.jav @@ -0,0 +1 @@ +(List)list \ No newline at end of file diff --git a/testData/typeCastExpression/expression_mult/simpleGenericCast.kt b/testData/typeCastExpression/expression_mult/simpleGenericCast.kt new file mode 100644 index 00000000000..c48c5d7637d --- /dev/null +++ b/testData/typeCastExpression/expression_mult/simpleGenericCast.kt @@ -0,0 +1 @@ +(list as List?) \ No newline at end of file diff --git a/testData/typeCastExpression/expression_mult/stringCast.jav b/testData/typeCastExpression/expression_mult/stringCast.jav new file mode 100644 index 00000000000..b4cf91cf340 --- /dev/null +++ b/testData/typeCastExpression/expression_mult/stringCast.jav @@ -0,0 +1 @@ +(String)t \ No newline at end of file diff --git a/testData/typeCastExpression/expression_mult/stringCast.kt b/testData/typeCastExpression/expression_mult/stringCast.kt new file mode 100644 index 00000000000..a2020f03831 --- /dev/null +++ b/testData/typeCastExpression/expression_mult/stringCast.kt @@ -0,0 +1 @@ +(t as String?) \ No newline at end of file diff --git a/testData/typeCastExpression/expression_mult/superWildcardCast.jav b/testData/typeCastExpression/expression_mult/superWildcardCast.jav new file mode 100644 index 00000000000..c197fc42e15 --- /dev/null +++ b/testData/typeCastExpression/expression_mult/superWildcardCast.jav @@ -0,0 +1 @@ +(List)list \ No newline at end of file diff --git a/testData/typeCastExpression/expression_mult/superWildcardCast.kt b/testData/typeCastExpression/expression_mult/superWildcardCast.kt new file mode 100644 index 00000000000..1bc5cd16259 --- /dev/null +++ b/testData/typeCastExpression/expression_mult/superWildcardCast.kt @@ -0,0 +1 @@ +(list as List?) \ No newline at end of file diff --git a/testData/typeCastExpression/expression_mult/wildcardCast.jav b/testData/typeCastExpression/expression_mult/wildcardCast.jav new file mode 100644 index 00000000000..38bd7a07f97 --- /dev/null +++ b/testData/typeCastExpression/expression_mult/wildcardCast.jav @@ -0,0 +1 @@ +(List)list \ No newline at end of file diff --git a/testData/typeCastExpression/expression_mult/wildcardCast.kt b/testData/typeCastExpression/expression_mult/wildcardCast.kt new file mode 100644 index 00000000000..47484fba27b --- /dev/null +++ b/testData/typeCastExpression/expression_mult/wildcardCast.kt @@ -0,0 +1 @@ +(list as List<*>?) \ No newline at end of file diff --git a/testData/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.jav b/testData/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.jav new file mode 100644 index 00000000000..c576f7f0633 --- /dev/null +++ b/testData/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.jav @@ -0,0 +1 @@ +final class CC , K extends Node & Collection> extends A {} \ No newline at end of file diff --git a/testData/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.kt b/testData/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.kt new file mode 100644 index 00000000000..4177d8f1720 --- /dev/null +++ b/testData/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.kt @@ -0,0 +1 @@ +class CC : A where T : Comparable?, K : Collection? { } \ No newline at end of file diff --git a/testData/typeParameters/class/classParametrizationWithTwoBounds.jav b/testData/typeParameters/class/classParametrizationWithTwoBounds.jav new file mode 100644 index 00000000000..9794cb4338c --- /dev/null +++ b/testData/typeParameters/class/classParametrizationWithTwoBounds.jav @@ -0,0 +1 @@ +final class C> {} \ No newline at end of file diff --git a/testData/typeParameters/class/classParametrizationWithTwoBounds.kt b/testData/typeParameters/class/classParametrizationWithTwoBounds.kt new file mode 100644 index 00000000000..16234cc8e44 --- /dev/null +++ b/testData/typeParameters/class/classParametrizationWithTwoBounds.kt @@ -0,0 +1 @@ +class C where T : Comparable? { } \ No newline at end of file diff --git a/testData/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.jav b/testData/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.jav new file mode 100644 index 00000000000..aaea17bff62 --- /dev/null +++ b/testData/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.jav @@ -0,0 +1 @@ +final class C> extends A {} \ No newline at end of file diff --git a/testData/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.kt b/testData/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.kt new file mode 100644 index 00000000000..a22d76df018 --- /dev/null +++ b/testData/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.kt @@ -0,0 +1 @@ +class C : A where T : Comparable? { } \ No newline at end of file diff --git a/testData/typeParameters/class/complexExampleWithClassExtending.jav b/testData/typeParameters/class/complexExampleWithClassExtending.jav new file mode 100644 index 00000000000..d23995b68a2 --- /dev/null +++ b/testData/typeParameters/class/complexExampleWithClassExtending.jav @@ -0,0 +1 @@ +interface CommandHandler {} \ No newline at end of file diff --git a/testData/typeParameters/class/complexExampleWithClassExtending.kt b/testData/typeParameters/class/complexExampleWithClassExtending.kt new file mode 100644 index 00000000000..c915d092f82 --- /dev/null +++ b/testData/typeParameters/class/complexExampleWithClassExtending.kt @@ -0,0 +1 @@ +trait CommandHandler { } \ No newline at end of file diff --git a/testData/typeParameters/class/complexExampleWithClassMultiplyExtending.jav b/testData/typeParameters/class/complexExampleWithClassMultiplyExtending.jav new file mode 100644 index 00000000000..8d1c87481ff --- /dev/null +++ b/testData/typeParameters/class/complexExampleWithClassMultiplyExtending.jav @@ -0,0 +1 @@ +interface CommandHandler {} \ No newline at end of file diff --git a/testData/typeParameters/class/complexExampleWithClassMultiplyExtending.kt b/testData/typeParameters/class/complexExampleWithClassMultiplyExtending.kt new file mode 100644 index 00000000000..9b684ed9022 --- /dev/null +++ b/testData/typeParameters/class/complexExampleWithClassMultiplyExtending.kt @@ -0,0 +1 @@ +trait CommandHandler { } \ No newline at end of file diff --git a/testData/typeParameters/class/genericClass.jav b/testData/typeParameters/class/genericClass.jav new file mode 100644 index 00000000000..10066e3b55d --- /dev/null +++ b/testData/typeParameters/class/genericClass.jav @@ -0,0 +1 @@ +final class Comparable {} \ No newline at end of file diff --git a/testData/typeParameters/class/genericClass.kt b/testData/typeParameters/class/genericClass.kt new file mode 100644 index 00000000000..eba6f27b2bf --- /dev/null +++ b/testData/typeParameters/class/genericClass.kt @@ -0,0 +1 @@ +class Comparable { } \ No newline at end of file diff --git a/testData/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.jav b/testData/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.jav new file mode 100644 index 00000000000..533a138632d --- /dev/null +++ b/testData/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.jav @@ -0,0 +1 @@ +interface I , K extends Node & Collection> extends II {} \ No newline at end of file diff --git a/testData/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.kt b/testData/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.kt new file mode 100644 index 00000000000..27a4ec88adc --- /dev/null +++ b/testData/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.kt @@ -0,0 +1 @@ +trait I : II where T : Comparable?, K : Collection? { } \ No newline at end of file diff --git a/testData/typeParameters/method/methodDoubleParametrizationWithTwoBounds.jav b/testData/typeParameters/method/methodDoubleParametrizationWithTwoBounds.jav new file mode 100644 index 00000000000..40ab13a5851 --- /dev/null +++ b/testData/typeParameters/method/methodDoubleParametrizationWithTwoBounds.jav @@ -0,0 +1 @@ +, K extends Node & Collection> T max(Collection coll) {} \ No newline at end of file diff --git a/testData/typeParameters/method/methodDoubleParametrizationWithTwoBounds.kt b/testData/typeParameters/method/methodDoubleParametrizationWithTwoBounds.kt new file mode 100644 index 00000000000..1e9e0b36ed5 --- /dev/null +++ b/testData/typeParameters/method/methodDoubleParametrizationWithTwoBounds.kt @@ -0,0 +1 @@ +fun max(coll : Collection?) : T? where T : Comparable?, K : Collection? { } \ No newline at end of file diff --git a/testData/typeParameters/method/where.jav b/testData/typeParameters/method/where.jav new file mode 100644 index 00000000000..20bb1bf62fd --- /dev/null +++ b/testData/typeParameters/method/where.jav @@ -0,0 +1 @@ +> T max(Collection coll) {} \ No newline at end of file diff --git a/testData/typeParameters/method/where.kt b/testData/typeParameters/method/where.kt new file mode 100644 index 00000000000..fed3c38569d --- /dev/null +++ b/testData/typeParameters/method/where.kt @@ -0,0 +1 @@ +fun max(coll : Collection?) : T? where T : Comparable? { } \ No newline at end of file diff --git a/testData/typeParameters/statement_mult/genericParam.jav b/testData/typeParameters/statement_mult/genericParam.jav new file mode 100644 index 00000000000..89c94caafda --- /dev/null +++ b/testData/typeParameters/statement_mult/genericParam.jav @@ -0,0 +1 @@ +List l; \ No newline at end of file diff --git a/testData/typeParameters/statement_mult/genericParam.kt b/testData/typeParameters/statement_mult/genericParam.kt new file mode 100644 index 00000000000..53f9c91dba7 --- /dev/null +++ b/testData/typeParameters/statement_mult/genericParam.kt @@ -0,0 +1 @@ +var l : List? \ No newline at end of file diff --git a/testData/typeParameters/statement_mult/manyGenericParams.jav b/testData/typeParameters/statement_mult/manyGenericParams.jav new file mode 100644 index 00000000000..65eb2f4ca9d --- /dev/null +++ b/testData/typeParameters/statement_mult/manyGenericParams.jav @@ -0,0 +1 @@ +List l; \ No newline at end of file diff --git a/testData/typeParameters/statement_mult/manyGenericParams.kt b/testData/typeParameters/statement_mult/manyGenericParams.kt new file mode 100644 index 00000000000..007056e4c03 --- /dev/null +++ b/testData/typeParameters/statement_mult/manyGenericParams.kt @@ -0,0 +1 @@ +var l : List? \ No newline at end of file diff --git a/testData/varArg/method/ellipsisTypeSeveralParams.jav b/testData/varArg/method/ellipsisTypeSeveralParams.jav new file mode 100644 index 00000000000..46bdd2765ee --- /dev/null +++ b/testData/varArg/method/ellipsisTypeSeveralParams.jav @@ -0,0 +1 @@ +String format(String pattern, Object... arguments); \ No newline at end of file diff --git a/testData/varArg/method/ellipsisTypeSeveralParams.kt b/testData/varArg/method/ellipsisTypeSeveralParams.kt new file mode 100644 index 00000000000..78207eee74b --- /dev/null +++ b/testData/varArg/method/ellipsisTypeSeveralParams.kt @@ -0,0 +1 @@ +fun format(pattern : String?, vararg arguments : Any?) : String? \ No newline at end of file diff --git a/testData/varArg/method/ellipsisTypeSingleParams.jav b/testData/varArg/method/ellipsisTypeSingleParams.jav new file mode 100644 index 00000000000..2c1f529675e --- /dev/null +++ b/testData/varArg/method/ellipsisTypeSingleParams.jav @@ -0,0 +1 @@ +void pushAll(Object... objs) {} \ No newline at end of file diff --git a/testData/varArg/method/ellipsisTypeSingleParams.kt b/testData/varArg/method/ellipsisTypeSingleParams.kt new file mode 100644 index 00000000000..0456fca4c8f --- /dev/null +++ b/testData/varArg/method/ellipsisTypeSingleParams.kt @@ -0,0 +1 @@ +fun pushAll(vararg objs : Any?) : Unit { } \ No newline at end of file diff --git a/testData/whileStatement/statement_mult/whileWithBlock.jav b/testData/whileStatement/statement_mult/whileWithBlock.jav new file mode 100644 index 00000000000..729a9e5f6f7 --- /dev/null +++ b/testData/whileStatement/statement_mult/whileWithBlock.jav @@ -0,0 +1 @@ +while (a > b) {int i = 1; i = i + 1;} \ No newline at end of file diff --git a/testData/whileStatement/statement_mult/whileWithBlock.kt b/testData/whileStatement/statement_mult/whileWithBlock.kt new file mode 100644 index 00000000000..fa368e489ee --- /dev/null +++ b/testData/whileStatement/statement_mult/whileWithBlock.kt @@ -0,0 +1,5 @@ +while ((a > b)) +{ +var i : Int = 1 +i = (i + 1) +} \ No newline at end of file diff --git a/testData/whileStatement/statement_mult/whileWithEmptyBlock.jav b/testData/whileStatement/statement_mult/whileWithEmptyBlock.jav new file mode 100644 index 00000000000..5055fb08ee2 --- /dev/null +++ b/testData/whileStatement/statement_mult/whileWithEmptyBlock.jav @@ -0,0 +1 @@ +while (true) {} \ No newline at end of file diff --git a/testData/whileStatement/statement_mult/whileWithEmptyBlock.kt b/testData/whileStatement/statement_mult/whileWithEmptyBlock.kt new file mode 100644 index 00000000000..7c69899ce77 --- /dev/null +++ b/testData/whileStatement/statement_mult/whileWithEmptyBlock.kt @@ -0,0 +1,3 @@ +while (true) +{ +} \ No newline at end of file diff --git a/testData/whileStatement/statement_mult/whileWithExpression.jav b/testData/whileStatement/statement_mult/whileWithExpression.jav new file mode 100644 index 00000000000..b0e6f1b9b32 --- /dev/null +++ b/testData/whileStatement/statement_mult/whileWithExpression.jav @@ -0,0 +1 @@ +while (true) i = i + 1; \ No newline at end of file diff --git a/testData/whileStatement/statement_mult/whileWithExpression.kt b/testData/whileStatement/statement_mult/whileWithExpression.kt new file mode 100644 index 00000000000..af7baeada37 --- /dev/null +++ b/testData/whileStatement/statement_mult/whileWithExpression.kt @@ -0,0 +1,2 @@ +while (true) +i = (i + 1) \ No newline at end of file diff --git a/testData/whileStatement/statement_mult/whileWithReturn.jav b/testData/whileStatement/statement_mult/whileWithReturn.jav new file mode 100644 index 00000000000..2174fc827bd --- /dev/null +++ b/testData/whileStatement/statement_mult/whileWithReturn.jav @@ -0,0 +1 @@ +while (true) return 1; \ No newline at end of file diff --git a/testData/whileStatement/statement_mult/whileWithReturn.kt b/testData/whileStatement/statement_mult/whileWithReturn.kt new file mode 100644 index 00000000000..ec1e88ceed8 --- /dev/null +++ b/testData/whileStatement/statement_mult/whileWithReturn.kt @@ -0,0 +1,2 @@ +while (true) +return 1 \ No newline at end of file From d0b352714f2dbc3dda1bcc32155b85b63b4e24a5 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 7 Nov 2011 12:21:49 +0400 Subject: [PATCH 059/206] testData/* moved to testData/ast/ --- test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java | 2 +- .../arrayAccessExpression/expression/expressionIndex.jav | 0 .../arrayAccessExpression/expression/expressionIndex.kt | 0 .../{ => ast}/arrayAccessExpression/expression/intIndex.jav | 0 testData/{ => ast}/arrayAccessExpression/expression/intIndex.kt | 0 .../arrayAccessExpression/expression/variableIndex.jav | 0 .../{ => ast}/arrayAccessExpression/expression/variableIndex.kt | 0 .../{ => ast}/arrayInitializerExpression/expression/newInt.jav | 0 .../{ => ast}/arrayInitializerExpression/expression/newInt.kt | 0 .../{ => ast}/arrayInitializerExpression/expression/oneDim.jav | 0 .../{ => ast}/arrayInitializerExpression/expression/oneDim.kt | 0 .../expression/oneDimWithVariables.jav | 0 .../expression/oneDimWithVariables.kt | 0 .../{ => ast}/arrayInitializerExpression/expression/twoDim.jav | 0 .../{ => ast}/arrayInitializerExpression/expression/twoDim.kt | 0 testData/{ => ast}/arrayType/method/methodArrayArgs.jav | 0 testData/{ => ast}/arrayType/method/methodArrayArgs.kt | 0 .../arrayType/statement/arrayInitializationStatement.jav | 0 .../arrayType/statement/arrayInitializationStatement.kt | 0 .../statement/arrayInitializationStatementWithDimension.jav | 0 .../statement/arrayInitializationStatementWithDimension.kt | 0 testData/{ => ast}/arrayType/statement_mult/doubleArray.jav | 0 testData/{ => ast}/arrayType/statement_mult/doubleArray.kt | 0 testData/{ => ast}/arrayType/statement_mult/longArray.jav | 0 testData/{ => ast}/arrayType/statement_mult/longArray.kt | 0 testData/{ => ast}/arrayType/statement_mult/newIntArray.jav | 0 testData/{ => ast}/arrayType/statement_mult/newIntArray.kt | 0 testData/{ => ast}/arrayType/statement_mult/newStringArray.jav | 0 testData/{ => ast}/arrayType/statement_mult/newStringArray.kt | 0 .../{ => ast}/assertStatement/statement_mult/onlyCondition.jav | 0 .../{ => ast}/assertStatement/statement_mult/onlyCondition.kt | 0 .../assertStatement/statement_mult/onlyConditionWithBraces.jav | 0 .../assertStatement/statement_mult/onlyConditionWithBraces.kt | 0 .../assertStatement/statement_mult/withStringDetail.jav | 0 .../assertStatement/statement_mult/withStringDetail.kt | 0 testData/{ => ast}/assignmentExpression/expression_mult/and.jav | 0 testData/{ => ast}/assignmentExpression/expression_mult/and.kt | 0 .../assignmentExpression/expression_mult/assignment.jav | 0 .../assignmentExpression/expression_mult/assignment.kt | 0 .../assignmentExpression/expression_mult/divideAssign.jav | 0 .../assignmentExpression/expression_mult/divideAssign.kt | 0 .../assignmentExpression/expression_mult/minusAssign.jav | 0 .../assignmentExpression/expression_mult/minusAssign.kt | 0 .../assignmentExpression/expression_mult/multiplyAssign.jav | 0 .../assignmentExpression/expression_mult/multiplyAssign.kt | 0 testData/{ => ast}/assignmentExpression/expression_mult/or.jav | 0 testData/{ => ast}/assignmentExpression/expression_mult/or.kt | 0 .../assignmentExpression/expression_mult/plusAssign.jav | 0 .../assignmentExpression/expression_mult/plusAssign.kt | 0 .../{ => ast}/assignmentExpression/expression_mult/reminder.jav | 0 .../{ => ast}/assignmentExpression/expression_mult/reminder.kt | 0 .../assignmentExpression/expression_mult/shiftLeft.jav | 0 .../{ => ast}/assignmentExpression/expression_mult/shiftLeft.kt | 0 .../assignmentExpression/expression_mult/shiftRight.jav | 0 .../assignmentExpression/expression_mult/shiftRight.kt | 0 .../assignmentExpression/expression_mult/unsignedRightShift.jav | 0 .../assignmentExpression/expression_mult/unsignedRightShift.kt | 0 testData/{ => ast}/assignmentExpression/expression_mult/xor.jav | 0 testData/{ => ast}/assignmentExpression/expression_mult/xor.kt | 0 .../assignmentExpression/statement/simpleAssignment.jav | 0 .../assignmentExpression/statement/simpleAssignment.kt | 0 testData/{ => ast}/binaryExpression/expression_mult/and.jav | 0 testData/{ => ast}/binaryExpression/expression_mult/and.kt | 0 .../binaryExpression/expression_mult/conditionalAnd.jav | 0 .../binaryExpression/expression_mult/conditionalAnd.kt | 0 .../binaryExpression/expression_mult/conditionalOr.jav | 0 .../{ => ast}/binaryExpression/expression_mult/conditionalOr.kt | 0 testData/{ => ast}/binaryExpression/expression_mult/divide.jav | 0 testData/{ => ast}/binaryExpression/expression_mult/divide.kt | 0 .../{ => ast}/binaryExpression/expression_mult/greaterThan.jav | 0 .../{ => ast}/binaryExpression/expression_mult/greaterThan.kt | 0 .../binaryExpression/expression_mult/greaterThanEqual.jav | 0 .../binaryExpression/expression_mult/greaterThanEqual.kt | 0 .../{ => ast}/binaryExpression/expression_mult/lessThan.jav | 0 testData/{ => ast}/binaryExpression/expression_mult/lessThan.kt | 0 .../binaryExpression/expression_mult/lessThanEqual.jav | 0 .../{ => ast}/binaryExpression/expression_mult/lessThanEqual.kt | 0 testData/{ => ast}/binaryExpression/expression_mult/minus.jav | 0 testData/{ => ast}/binaryExpression/expression_mult/minus.kt | 0 .../{ => ast}/binaryExpression/expression_mult/multiply.jav | 0 testData/{ => ast}/binaryExpression/expression_mult/multiply.kt | 0 testData/{ => ast}/binaryExpression/expression_mult/or.jav | 0 testData/{ => ast}/binaryExpression/expression_mult/or.kt | 0 testData/{ => ast}/binaryExpression/expression_mult/plus.jav | 0 testData/{ => ast}/binaryExpression/expression_mult/plus.kt | 0 .../{ => ast}/binaryExpression/expression_mult/remainder.jav | 0 .../{ => ast}/binaryExpression/expression_mult/remainder.kt | 0 .../{ => ast}/binaryExpression/expression_mult/shiftLeft.jav | 0 .../{ => ast}/binaryExpression/expression_mult/shiftLeft.kt | 0 .../{ => ast}/binaryExpression/expression_mult/shiftRight.jav | 0 .../{ => ast}/binaryExpression/expression_mult/shiftRight.kt | 0 .../binaryExpression/expression_mult/unsignedRightShift.jav | 0 .../binaryExpression/expression_mult/unsignedRightShift.kt | 0 testData/{ => ast}/binaryExpression/expression_mult/xor.jav | 0 testData/{ => ast}/binaryExpression/expression_mult/xor.kt | 0 testData/{ => ast}/boxedType/statement_mult/boolean.jav | 0 testData/{ => ast}/boxedType/statement_mult/boolean.kt | 0 testData/{ => ast}/boxedType/statement_mult/byte.jav | 0 testData/{ => ast}/boxedType/statement_mult/byte.kt | 0 testData/{ => ast}/boxedType/statement_mult/character.jav | 0 testData/{ => ast}/boxedType/statement_mult/character.kt | 0 testData/{ => ast}/boxedType/statement_mult/double.jav | 0 testData/{ => ast}/boxedType/statement_mult/double.kt | 0 testData/{ => ast}/boxedType/statement_mult/float.jav | 0 testData/{ => ast}/boxedType/statement_mult/float.kt | 0 testData/{ => ast}/boxedType/statement_mult/integer.jav | 0 testData/{ => ast}/boxedType/statement_mult/integer.kt | 0 testData/{ => ast}/boxedType/statement_mult/long.jav | 0 testData/{ => ast}/boxedType/statement_mult/long.kt | 0 testData/{ => ast}/boxedType/statement_mult/object.jav | 0 testData/{ => ast}/boxedType/statement_mult/object.kt | 0 testData/{ => ast}/boxedType/statement_mult/short.jav | 0 testData/{ => ast}/boxedType/statement_mult/short.kt | 0 testData/{ => ast}/breakStatement/statement/breakWithLabel.jav | 0 testData/{ => ast}/breakStatement/statement/breakWithLabel.kt | 0 .../{ => ast}/breakStatement/statement/breakWithoutLabel.jav | 0 .../{ => ast}/breakStatement/statement/breakWithoutLabel.kt | 0 testData/{ => ast}/class_/class/class.jav | 0 testData/{ => ast}/class_/class/class.kt | 0 testData/{ => ast}/class_/class/emptyClass.jav | 0 testData/{ => ast}/class_/class/emptyClass.kt | 0 .../class_/class/extendsOneClassAndImplementsOneInterface.jav | 0 .../class_/class/extendsOneClassAndImplementsOneInterface.kt | 0 .../class/extendsOneClassAndImplementsSeveralInterfaces.jav | 0 .../class/extendsOneClassAndImplementsSeveralInterfaces.kt | 0 testData/{ => ast}/class_/class/finalClass.jav | 0 testData/{ => ast}/class_/class/finalClass.kt | 0 testData/{ => ast}/class_/class/genericClass.jav | 0 testData/{ => ast}/class_/class/genericClass.kt | 0 testData/{ => ast}/class_/class/innerEmptyClass.jav | 0 testData/{ => ast}/class_/class/innerEmptyClass.kt | 0 testData/{ => ast}/class_/class/innerStaticClass.jav | 0 testData/{ => ast}/class_/class/innerStaticClass.kt | 0 testData/{ => ast}/class_/class/internalClass.jav | 0 testData/{ => ast}/class_/class/internalClass.kt | 0 testData/{ => ast}/class_/class/oneStaticFieldOneNonStatic.jav | 0 testData/{ => ast}/class_/class/oneStaticFieldOneNonStatic.kt | 0 testData/{ => ast}/class_/class/oneStaticMethod.jav | 0 testData/{ => ast}/class_/class/oneStaticMethod.kt | 0 testData/{ => ast}/class_/class/oneStaticMethodOneNonStatic.jav | 0 testData/{ => ast}/class_/class/oneStaticMethodOneNonStatic.kt | 0 testData/{ => ast}/class_/class/pivateClass.jav | 0 testData/{ => ast}/class_/class/pivateClass.kt | 0 testData/{ => ast}/class_/class/protectedClass.jav | 0 testData/{ => ast}/class_/class/protectedClass.kt | 0 testData/{ => ast}/class_/class/publicClass.jav | 0 testData/{ => ast}/class_/class/publicClass.kt | 0 testData/{ => ast}/class_/class/simpleInheritance.jav | 0 testData/{ => ast}/class_/class/simpleInheritance.kt | 0 testData/{ => ast}/class_/class/twoStaticMethod.jav | 0 testData/{ => ast}/class_/class/twoStaticMethod.kt | 0 testData/{ => ast}/class_/class_mult/classWithEmptyMethods.jav | 0 testData/{ => ast}/class_/class_mult/classWithEmptyMethods.kt | 0 testData/{ => ast}/class_/class_mult/classWithFields.jav | 0 testData/{ => ast}/class_/class_mult/classWithFields.kt | 0 .../{ => ast}/class_/class_mult/classWithMultiplyFields.jav | 0 testData/{ => ast}/class_/class_mult/classWithMultiplyFields.kt | 0 .../expression_mult/simpleConditionalExpression.jav | 0 .../expression_mult/simpleConditionalExpression.kt | 0 .../{ => ast}/continueStatement/statement/continueWithLabel.jav | 0 .../{ => ast}/continueStatement/statement/continueWithLabel.kt | 0 .../continueStatement/statement/continueWithoutLabel.jav | 0 .../continueStatement/statement/continueWithoutLabel.kt | 0 .../statement/singleFinalIntDeclaration.jav | 0 .../declarationStatement/statement/singleFinalIntDeclaration.kt | 0 .../statement/singleFinalStringDeclaration.jav | 0 .../statement/singleFinalStringDeclaration.kt | 0 .../declarationStatement/statement/singleIntDeclaration.jav | 0 .../declarationStatement/statement/singleIntDeclaration.kt | 0 .../declarationStatement/statement/singleStringDeclaration.jav | 0 .../declarationStatement/statement/singleStringDeclaration.kt | 0 .../statement_mult/multiplyFinalIntDeclaration.jav | 0 .../statement_mult/multiplyFinalIntDeclaration.kt | 0 .../statement_mult/multiplyIntDeclaration.jav | 0 .../statement_mult/multiplyIntDeclaration.kt | 0 .../doWhileStatement/statement_mult/whileWithBlock.jav | 0 .../{ => ast}/doWhileStatement/statement_mult/whileWithBlock.kt | 0 .../doWhileStatement/statement_mult/whileWithEmptyBlock.jav | 0 .../doWhileStatement/statement_mult/whileWithEmptyBlock.kt | 0 .../doWhileStatement/statement_mult/whileWithExpression.jav | 0 .../doWhileStatement/statement_mult/whileWithExpression.kt | 0 .../doWhileStatement/statement_mult/whileWithReturn.jav | 0 .../doWhileStatement/statement_mult/whileWithReturn.kt | 0 testData/{ => ast}/enum/class/emptyEnum.jav | 0 testData/{ => ast}/enum/class/emptyEnum.kt | 0 testData/{ => ast}/enum/class/enumImplementsOneInterface.jav | 0 testData/{ => ast}/enum/class/enumImplementsOneInterface.kt | 0 .../{ => ast}/enum/class/enumImplementsSeveralInterfaces.jav | 0 .../{ => ast}/enum/class/enumImplementsSeveralInterfaces.kt | 0 testData/{ => ast}/enum/class/internalEnum.jav | 0 testData/{ => ast}/enum/class/internalEnum.kt | 0 testData/{ => ast}/enum/class/privateEnum.jav | 0 testData/{ => ast}/enum/class/privateEnum.kt | 0 testData/{ => ast}/enum/class/protectedEnum.jav | 0 testData/{ => ast}/enum/class/protectedEnum.kt | 0 testData/{ => ast}/enum/class/publicEnum.jav | 0 testData/{ => ast}/enum/class/publicEnum.kt | 0 testData/{ => ast}/enum/class_mult/enumWithNameField.jav | 0 testData/{ => ast}/enum/class_mult/enumWithNameField.kt | 0 .../enum/class_mult/fieldsWithPrimaryPrivateConstructor.jav | 0 .../enum/class_mult/fieldsWithPrimaryPrivateConstructor.kt | 0 testData/{ => ast}/enum/class_mult/overrideToString.jav | 0 testData/{ => ast}/enum/class_mult/overrideToString.kt | 0 testData/{ => ast}/enum/class_mult/runnableImplementation.jav | 0 testData/{ => ast}/enum/class_mult/runnableImplementation.kt | 0 testData/{ => ast}/enum/class_mult/typeSafeEnum.jav | 0 testData/{ => ast}/enum/class_mult/typeSafeEnum.kt | 0 testData/{ => ast}/field/method/internalField.jav | 0 testData/{ => ast}/field/method/internalField.kt | 0 testData/{ => ast}/field/method/privateField.jav | 0 testData/{ => ast}/field/method/privateField.kt | 0 testData/{ => ast}/field/method/protectedField.jav | 0 testData/{ => ast}/field/method/protectedField.kt | 0 testData/{ => ast}/field/method/publicField.jav | 0 testData/{ => ast}/field/method/publicField.kt | 0 testData/{ => ast}/field/method/valWithInit.jav | 0 testData/{ => ast}/field/method/valWithInit.kt | 0 testData/{ => ast}/field/method/varWithInit.jav | 0 testData/{ => ast}/field/method/varWithInit.kt | 0 testData/{ => ast}/field/method/varWithoutInit.jav | 0 testData/{ => ast}/field/method/varWithoutInit.kt | 0 testData/{ => ast}/file_/file/packageWithClass.jav | 0 testData/{ => ast}/file_/file/packageWithClass.kt | 0 testData/{ => ast}/file_/file/packageWithClasses.jav | 0 testData/{ => ast}/file_/file/packageWithClasses.kt | 0 testData/{ => ast}/file_/file/packageWithOpenClass.jav | 0 testData/{ => ast}/file_/file/packageWithOpenClass.kt | 0 testData/{ => ast}/file_/file_mult/packageWithImports.jav | 0 testData/{ => ast}/file_/file_mult/packageWithImports.kt | 0 testData/{ => ast}/file_/file_mult/packageWithMixedImports.jav | 0 testData/{ => ast}/file_/file_mult/packageWithMixedImports.kt | 0 testData/{ => ast}/file_/file_mult/packageWithStaticImports.jav | 0 testData/{ => ast}/file_/file_mult/packageWithStaticImports.kt | 0 testData/{ => ast}/for/statement_mult/commonCaseForTest.jav | 0 testData/{ => ast}/for/statement_mult/commonCaseForTest.kt | 0 testData/{ => ast}/for/statement_mult/forWithBlock.jav | 0 testData/{ => ast}/for/statement_mult/forWithBlock.kt | 0 .../for/statement_mult/forWithBlockAndDoubleUpdate.jav | 0 .../{ => ast}/for/statement_mult/forWithBlockAndDoubleUpdate.kt | 0 testData/{ => ast}/for/statement_mult/forWithEmptyBlock.jav | 0 testData/{ => ast}/for/statement_mult/forWithEmptyBlock.kt | 0 testData/{ => ast}/for/statement_mult/forWithExpression.jav | 0 testData/{ => ast}/for/statement_mult/forWithExpression.kt | 0 testData/{ => ast}/for/statement_mult/forWithReturn.jav | 0 testData/{ => ast}/for/statement_mult/forWithReturn.kt | 0 .../foreachStatement/statement_mult/enhancedForWithBlock.jav | 0 .../foreachStatement/statement_mult/enhancedForWithBlock.kt | 0 .../statement_mult/enhancedForWithEmptyBlock.jav | 0 .../statement_mult/enhancedForWithEmptyBlock.kt | 0 .../statement_mult/enhancedForWithExpression.jav | 0 .../statement_mult/enhancedForWithExpression.kt | 0 .../foreachStatement/statement_mult/enhancedForWithReturn.jav | 0 .../foreachStatement/statement_mult/enhancedForWithReturn.kt | 0 testData/{ => ast}/function/file/override.jav | 0 testData/{ => ast}/function/file/override.kt | 0 testData/{ => ast}/function/method/classGenericParam.jav | 0 testData/{ => ast}/function/method/classGenericParam.kt | 0 testData/{ => ast}/function/method/emptyVoidMethod.jav | 0 testData/{ => ast}/function/method/emptyVoidMethod.kt | 0 testData/{ => ast}/function/method/internal.jav | 0 testData/{ => ast}/function/method/internal.kt | 0 testData/{ => ast}/function/method/methodClassType.jav | 0 testData/{ => ast}/function/method/methodClassType.kt | 0 testData/{ => ast}/function/method/methodPrimitiveType.jav | 0 testData/{ => ast}/function/method/methodPrimitiveType.kt | 0 testData/{ => ast}/function/method/methodPrimitiveType2.jav | 0 testData/{ => ast}/function/method/methodPrimitiveType2.kt | 0 .../{ => ast}/function/method/methodWithReturnStatement.jav | 0 testData/{ => ast}/function/method/methodWithReturnStatement.kt | 0 testData/{ => ast}/function/method/ownGenericParam.jav | 0 testData/{ => ast}/function/method/ownGenericParam.kt | 0 testData/{ => ast}/function/method/ownSeveralGenericParams.jav | 0 testData/{ => ast}/function/method/ownSeveralGenericParams.kt | 0 testData/{ => ast}/function/method/private.jav | 0 testData/{ => ast}/function/method/private.kt | 0 testData/{ => ast}/function/method/protected.jav | 0 testData/{ => ast}/function/method/protected.kt | 0 testData/{ => ast}/function/method/public.jav | 0 testData/{ => ast}/function/method/public.kt | 0 .../ifStatement/statement_mult/ifStatementWithEmptyBlocks.jav | 0 .../ifStatement/statement_mult/ifStatementWithEmptyBlocks.kt | 0 .../statement_mult/ifStatementWithMultilineBlocks.jav | 0 .../statement_mult/ifStatementWithMultilineBlocks.kt | 0 .../ifStatement/statement_mult/ifStatementWithOneLineBlocks.jav | 0 .../ifStatement/statement_mult/ifStatementWithOneLineBlocks.kt | 0 .../ifStatement/statement_mult/ifStatementWithoutElse.jav | 0 .../ifStatement/statement_mult/ifStatementWithoutElse.kt | 0 testData/{ => ast}/inProjectionType/method/methodParams.jav | 0 testData/{ => ast}/inProjectionType/method/methodParams.kt | 0 .../isOperator/expression_mult/complicatedExpression.jav | 0 .../isOperator/expression_mult/complicatedExpression.kt | 0 .../{ => ast}/isOperator/expression_mult/simpleReference.jav | 0 .../{ => ast}/isOperator/expression_mult/simpleReference.kt | 0 .../statement_mult/complicatedExampleFromJavaTutorial.jav | 0 .../statement_mult/complicatedExampleFromJavaTutorial.kt | 0 testData/{ => ast}/localVariable/statement/object.jav | 0 testData/{ => ast}/localVariable/statement/object.kt | 0 .../methodCallExpression/statement/callWithKeywords.jav | 0 .../methodCallExpression/statement/callWithKeywords.kt | 0 testData/{ => ast}/methodCallExpression/statement/emptyCall.jav | 0 testData/{ => ast}/methodCallExpression/statement/emptyCall.kt | 0 .../{ => ast}/methodCallExpression/statement/simpleCall.jav | 0 testData/{ => ast}/methodCallExpression/statement/simpleCall.kt | 0 .../{ => ast}/newClassExpression/expression/classWithParam.jav | 0 .../{ => ast}/newClassExpression/expression/classWithParam.kt | 0 .../{ => ast}/newClassExpression/expression/classWithParams.jav | 0 .../{ => ast}/newClassExpression/expression/classWithParams.kt | 0 .../newClassExpression/expression/classWithoutBody.jav | 0 .../{ => ast}/newClassExpression/expression/classWithoutBody.kt | 0 .../newClassExpression/expression/classWithoutBody2.jav | 0 .../newClassExpression/expression/classWithoutBody2.kt | 0 testData/{ => ast}/outProjectionType/method/methodParams.jav | 0 testData/{ => ast}/outProjectionType/method/methodParams.kt | 0 .../parenthesizedExpression/expression/parenthesized.jav | 0 .../parenthesizedExpression/expression/parenthesized.kt | 0 .../parenthesizedExpression/expression/parenthesized2.jav | 0 .../parenthesizedExpression/expression/parenthesized2.kt | 0 .../{ => ast}/polyadicExpression/expression_mult/divide.jav | 0 testData/{ => ast}/polyadicExpression/expression_mult/divide.kt | 0 testData/{ => ast}/polyadicExpression/expression_mult/minus.jav | 0 testData/{ => ast}/polyadicExpression/expression_mult/minus.kt | 0 .../{ => ast}/polyadicExpression/expression_mult/multiply.jav | 0 .../{ => ast}/polyadicExpression/expression_mult/multiply.kt | 0 testData/{ => ast}/polyadicExpression/expression_mult/plus.jav | 0 testData/{ => ast}/polyadicExpression/expression_mult/plus.kt | 0 .../{ => ast}/polyadicExpression/expression_mult/remainder.jav | 0 .../{ => ast}/polyadicExpression/expression_mult/remainder.kt | 0 testData/{ => ast}/postfixOperator/statement_mult/decrement.jav | 0 testData/{ => ast}/postfixOperator/statement_mult/decrement.kt | 0 testData/{ => ast}/postfixOperator/statement_mult/increment.jav | 0 testData/{ => ast}/postfixOperator/statement_mult/increment.kt | 0 testData/{ => ast}/prefixOperator/statement_mult/decrement.jav | 0 testData/{ => ast}/prefixOperator/statement_mult/decrement.kt | 0 testData/{ => ast}/prefixOperator/statement_mult/increment.jav | 0 testData/{ => ast}/prefixOperator/statement_mult/increment.kt | 0 testData/{ => ast}/returnStatement/statement/returnChar.jav | 0 testData/{ => ast}/returnStatement/statement/returnChar.kt | 0 testData/{ => ast}/returnStatement/statement/returnLiteral.jav | 0 testData/{ => ast}/returnStatement/statement/returnLiteral.kt | 0 testData/{ => ast}/returnStatement/statement/returnNumber.jav | 0 testData/{ => ast}/returnStatement/statement/returnNumber.kt | 0 testData/{ => ast}/returnStatement/statement/returnString.jav | 0 testData/{ => ast}/returnStatement/statement/returnString.kt | 0 testData/{ => ast}/starProjectionType/method/methodParams.jav | 0 testData/{ => ast}/starProjectionType/method/methodParams.kt | 0 .../synchronizedStatement/statement/singleLineExample.jav | 0 .../synchronizedStatement/statement/singleLineExample.kt | 0 .../{ => ast}/throwStatement/statement/simpleThrowStatement.jav | 0 .../{ => ast}/throwStatement/statement/simpleThrowStatement.kt | 0 testData/{ => ast}/trait/class/emptyInterface.jav | 0 testData/{ => ast}/trait/class/emptyInterface.kt | 0 .../class/extendsOneClassAndImplementsSeveralInterfaces.jav | 0 .../class/extendsOneClassAndImplementsSeveralInterfaces.kt | 0 testData/{ => ast}/trait/class/extendsOneInterface.jav | 0 testData/{ => ast}/trait/class/extendsOneInterface.kt | 0 testData/{ => ast}/trait/class/internalInterface.jav | 0 testData/{ => ast}/trait/class/internalInterface.kt | 0 testData/{ => ast}/trait/class/privateInterface.jav | 0 testData/{ => ast}/trait/class/privateInterface.kt | 0 testData/{ => ast}/trait/class/protectedInterface.jav | 0 testData/{ => ast}/trait/class/protectedInterface.kt | 0 testData/{ => ast}/trait/class/publicInterface.jav | 0 testData/{ => ast}/trait/class/publicInterface.kt | 0 testData/{ => ast}/trait/class_mult/interfaceWithFields.jav | 0 testData/{ => ast}/trait/class_mult/interfaceWithFields.kt | 0 .../trait/class_mult/interfaceWithMethodDeclaration.jav | 0 .../trait/class_mult/interfaceWithMethodDeclaration.kt | 0 .../{ => ast}/trait/class_mult/interfaceWithStaticFields.jav | 0 .../{ => ast}/trait/class_mult/interfaceWithStaticFields.kt | 0 .../tryStatement/statement_mult/commonCaseForTryStatement.jav | 0 .../tryStatement/statement_mult/commonCaseForTryStatement.kt | 0 .../statement_mult/emptyTryWithTwoCatchesWithEmptyFinally.jav | 0 .../statement_mult/emptyTryWithTwoCatchesWithEmptyFinally.kt | 0 .../statement_mult/emptyTryWithTwoCatchesWithFinally.jav | 0 .../statement_mult/emptyTryWithTwoCatchesWithFinally.kt | 0 .../statement_mult/emptyTryWithTwoCatchesWithoutFinally.jav | 0 .../statement_mult/emptyTryWithTwoCatchesWithoutFinally.kt | 0 .../typeCastExpression/expression_mult/extendsWildcardCast.jav | 0 .../typeCastExpression/expression_mult/extendsWildcardCast.kt | 0 .../{ => ast}/typeCastExpression/expression_mult/fooCast.jav | 0 .../{ => ast}/typeCastExpression/expression_mult/fooCast.kt | 0 .../{ => ast}/typeCastExpression/expression_mult/intCast.jav | 0 .../{ => ast}/typeCastExpression/expression_mult/intCast.kt | 0 .../typeCastExpression/expression_mult/primitiveType.jav | 0 .../typeCastExpression/expression_mult/primitiveType.kt | 0 .../typeCastExpression/expression_mult/simpleGenericCast.jav | 0 .../typeCastExpression/expression_mult/simpleGenericCast.kt | 0 .../{ => ast}/typeCastExpression/expression_mult/stringCast.jav | 0 .../{ => ast}/typeCastExpression/expression_mult/stringCast.kt | 0 .../typeCastExpression/expression_mult/superWildcardCast.jav | 0 .../typeCastExpression/expression_mult/superWildcardCast.kt | 0 .../typeCastExpression/expression_mult/wildcardCast.jav | 0 .../typeCastExpression/expression_mult/wildcardCast.kt | 0 .../classDoubleParametrizationWithTwoBoundsWithExtending.jav | 0 .../classDoubleParametrizationWithTwoBoundsWithExtending.kt | 0 .../typeParameters/class/classParametrizationWithTwoBounds.jav | 0 .../typeParameters/class/classParametrizationWithTwoBounds.kt | 0 .../class/classParametrizationWithTwoBoundsWithExtending.jav | 0 .../class/classParametrizationWithTwoBoundsWithExtending.kt | 0 .../typeParameters/class/complexExampleWithClassExtending.jav | 0 .../typeParameters/class/complexExampleWithClassExtending.kt | 0 .../class/complexExampleWithClassMultiplyExtending.jav | 0 .../class/complexExampleWithClassMultiplyExtending.kt | 0 testData/{ => ast}/typeParameters/class/genericClass.jav | 0 testData/{ => ast}/typeParameters/class/genericClass.kt | 0 .../traitDoubleParametrizationWithTwoBoundsWithExtending.jav | 0 .../traitDoubleParametrizationWithTwoBoundsWithExtending.kt | 0 .../method/methodDoubleParametrizationWithTwoBounds.jav | 0 .../method/methodDoubleParametrizationWithTwoBounds.kt | 0 testData/{ => ast}/typeParameters/method/where.jav | 0 testData/{ => ast}/typeParameters/method/where.kt | 0 .../{ => ast}/typeParameters/statement_mult/genericParam.jav | 0 .../{ => ast}/typeParameters/statement_mult/genericParam.kt | 0 .../typeParameters/statement_mult/manyGenericParams.jav | 0 .../typeParameters/statement_mult/manyGenericParams.kt | 0 testData/{ => ast}/varArg/method/ellipsisTypeSeveralParams.jav | 0 testData/{ => ast}/varArg/method/ellipsisTypeSeveralParams.kt | 0 testData/{ => ast}/varArg/method/ellipsisTypeSingleParams.jav | 0 testData/{ => ast}/varArg/method/ellipsisTypeSingleParams.kt | 0 .../{ => ast}/whileStatement/statement_mult/whileWithBlock.jav | 0 .../{ => ast}/whileStatement/statement_mult/whileWithBlock.kt | 0 .../whileStatement/statement_mult/whileWithEmptyBlock.jav | 0 .../whileStatement/statement_mult/whileWithEmptyBlock.kt | 0 .../whileStatement/statement_mult/whileWithExpression.jav | 0 .../whileStatement/statement_mult/whileWithExpression.kt | 0 .../{ => ast}/whileStatement/statement_mult/whileWithReturn.jav | 0 .../{ => ast}/whileStatement/statement_mult/whileWithReturn.kt | 0 427 files changed, 1 insertion(+), 1 deletion(-) rename testData/{ => ast}/arrayAccessExpression/expression/expressionIndex.jav (100%) rename testData/{ => ast}/arrayAccessExpression/expression/expressionIndex.kt (100%) rename testData/{ => ast}/arrayAccessExpression/expression/intIndex.jav (100%) rename testData/{ => ast}/arrayAccessExpression/expression/intIndex.kt (100%) rename testData/{ => ast}/arrayAccessExpression/expression/variableIndex.jav (100%) rename testData/{ => ast}/arrayAccessExpression/expression/variableIndex.kt (100%) rename testData/{ => ast}/arrayInitializerExpression/expression/newInt.jav (100%) rename testData/{ => ast}/arrayInitializerExpression/expression/newInt.kt (100%) rename testData/{ => ast}/arrayInitializerExpression/expression/oneDim.jav (100%) rename testData/{ => ast}/arrayInitializerExpression/expression/oneDim.kt (100%) rename testData/{ => ast}/arrayInitializerExpression/expression/oneDimWithVariables.jav (100%) rename testData/{ => ast}/arrayInitializerExpression/expression/oneDimWithVariables.kt (100%) rename testData/{ => ast}/arrayInitializerExpression/expression/twoDim.jav (100%) rename testData/{ => ast}/arrayInitializerExpression/expression/twoDim.kt (100%) rename testData/{ => ast}/arrayType/method/methodArrayArgs.jav (100%) rename testData/{ => ast}/arrayType/method/methodArrayArgs.kt (100%) rename testData/{ => ast}/arrayType/statement/arrayInitializationStatement.jav (100%) rename testData/{ => ast}/arrayType/statement/arrayInitializationStatement.kt (100%) rename testData/{ => ast}/arrayType/statement/arrayInitializationStatementWithDimension.jav (100%) rename testData/{ => ast}/arrayType/statement/arrayInitializationStatementWithDimension.kt (100%) rename testData/{ => ast}/arrayType/statement_mult/doubleArray.jav (100%) rename testData/{ => ast}/arrayType/statement_mult/doubleArray.kt (100%) rename testData/{ => ast}/arrayType/statement_mult/longArray.jav (100%) rename testData/{ => ast}/arrayType/statement_mult/longArray.kt (100%) rename testData/{ => ast}/arrayType/statement_mult/newIntArray.jav (100%) rename testData/{ => ast}/arrayType/statement_mult/newIntArray.kt (100%) rename testData/{ => ast}/arrayType/statement_mult/newStringArray.jav (100%) rename testData/{ => ast}/arrayType/statement_mult/newStringArray.kt (100%) rename testData/{ => ast}/assertStatement/statement_mult/onlyCondition.jav (100%) rename testData/{ => ast}/assertStatement/statement_mult/onlyCondition.kt (100%) rename testData/{ => ast}/assertStatement/statement_mult/onlyConditionWithBraces.jav (100%) rename testData/{ => ast}/assertStatement/statement_mult/onlyConditionWithBraces.kt (100%) rename testData/{ => ast}/assertStatement/statement_mult/withStringDetail.jav (100%) rename testData/{ => ast}/assertStatement/statement_mult/withStringDetail.kt (100%) rename testData/{ => ast}/assignmentExpression/expression_mult/and.jav (100%) rename testData/{ => ast}/assignmentExpression/expression_mult/and.kt (100%) rename testData/{ => ast}/assignmentExpression/expression_mult/assignment.jav (100%) rename testData/{ => ast}/assignmentExpression/expression_mult/assignment.kt (100%) rename testData/{ => ast}/assignmentExpression/expression_mult/divideAssign.jav (100%) rename testData/{ => ast}/assignmentExpression/expression_mult/divideAssign.kt (100%) rename testData/{ => ast}/assignmentExpression/expression_mult/minusAssign.jav (100%) rename testData/{ => ast}/assignmentExpression/expression_mult/minusAssign.kt (100%) rename testData/{ => ast}/assignmentExpression/expression_mult/multiplyAssign.jav (100%) rename testData/{ => ast}/assignmentExpression/expression_mult/multiplyAssign.kt (100%) rename testData/{ => ast}/assignmentExpression/expression_mult/or.jav (100%) rename testData/{ => ast}/assignmentExpression/expression_mult/or.kt (100%) rename testData/{ => ast}/assignmentExpression/expression_mult/plusAssign.jav (100%) rename testData/{ => ast}/assignmentExpression/expression_mult/plusAssign.kt (100%) rename testData/{ => ast}/assignmentExpression/expression_mult/reminder.jav (100%) rename testData/{ => ast}/assignmentExpression/expression_mult/reminder.kt (100%) rename testData/{ => ast}/assignmentExpression/expression_mult/shiftLeft.jav (100%) rename testData/{ => ast}/assignmentExpression/expression_mult/shiftLeft.kt (100%) rename testData/{ => ast}/assignmentExpression/expression_mult/shiftRight.jav (100%) rename testData/{ => ast}/assignmentExpression/expression_mult/shiftRight.kt (100%) rename testData/{ => ast}/assignmentExpression/expression_mult/unsignedRightShift.jav (100%) rename testData/{ => ast}/assignmentExpression/expression_mult/unsignedRightShift.kt (100%) rename testData/{ => ast}/assignmentExpression/expression_mult/xor.jav (100%) rename testData/{ => ast}/assignmentExpression/expression_mult/xor.kt (100%) rename testData/{ => ast}/assignmentExpression/statement/simpleAssignment.jav (100%) rename testData/{ => ast}/assignmentExpression/statement/simpleAssignment.kt (100%) rename testData/{ => ast}/binaryExpression/expression_mult/and.jav (100%) rename testData/{ => ast}/binaryExpression/expression_mult/and.kt (100%) rename testData/{ => ast}/binaryExpression/expression_mult/conditionalAnd.jav (100%) rename testData/{ => ast}/binaryExpression/expression_mult/conditionalAnd.kt (100%) rename testData/{ => ast}/binaryExpression/expression_mult/conditionalOr.jav (100%) rename testData/{ => ast}/binaryExpression/expression_mult/conditionalOr.kt (100%) rename testData/{ => ast}/binaryExpression/expression_mult/divide.jav (100%) rename testData/{ => ast}/binaryExpression/expression_mult/divide.kt (100%) rename testData/{ => ast}/binaryExpression/expression_mult/greaterThan.jav (100%) rename testData/{ => ast}/binaryExpression/expression_mult/greaterThan.kt (100%) rename testData/{ => ast}/binaryExpression/expression_mult/greaterThanEqual.jav (100%) rename testData/{ => ast}/binaryExpression/expression_mult/greaterThanEqual.kt (100%) rename testData/{ => ast}/binaryExpression/expression_mult/lessThan.jav (100%) rename testData/{ => ast}/binaryExpression/expression_mult/lessThan.kt (100%) rename testData/{ => ast}/binaryExpression/expression_mult/lessThanEqual.jav (100%) rename testData/{ => ast}/binaryExpression/expression_mult/lessThanEqual.kt (100%) rename testData/{ => ast}/binaryExpression/expression_mult/minus.jav (100%) rename testData/{ => ast}/binaryExpression/expression_mult/minus.kt (100%) rename testData/{ => ast}/binaryExpression/expression_mult/multiply.jav (100%) rename testData/{ => ast}/binaryExpression/expression_mult/multiply.kt (100%) rename testData/{ => ast}/binaryExpression/expression_mult/or.jav (100%) rename testData/{ => ast}/binaryExpression/expression_mult/or.kt (100%) rename testData/{ => ast}/binaryExpression/expression_mult/plus.jav (100%) rename testData/{ => ast}/binaryExpression/expression_mult/plus.kt (100%) rename testData/{ => ast}/binaryExpression/expression_mult/remainder.jav (100%) rename testData/{ => ast}/binaryExpression/expression_mult/remainder.kt (100%) rename testData/{ => ast}/binaryExpression/expression_mult/shiftLeft.jav (100%) rename testData/{ => ast}/binaryExpression/expression_mult/shiftLeft.kt (100%) rename testData/{ => ast}/binaryExpression/expression_mult/shiftRight.jav (100%) rename testData/{ => ast}/binaryExpression/expression_mult/shiftRight.kt (100%) rename testData/{ => ast}/binaryExpression/expression_mult/unsignedRightShift.jav (100%) rename testData/{ => ast}/binaryExpression/expression_mult/unsignedRightShift.kt (100%) rename testData/{ => ast}/binaryExpression/expression_mult/xor.jav (100%) rename testData/{ => ast}/binaryExpression/expression_mult/xor.kt (100%) rename testData/{ => ast}/boxedType/statement_mult/boolean.jav (100%) rename testData/{ => ast}/boxedType/statement_mult/boolean.kt (100%) rename testData/{ => ast}/boxedType/statement_mult/byte.jav (100%) rename testData/{ => ast}/boxedType/statement_mult/byte.kt (100%) rename testData/{ => ast}/boxedType/statement_mult/character.jav (100%) rename testData/{ => ast}/boxedType/statement_mult/character.kt (100%) rename testData/{ => ast}/boxedType/statement_mult/double.jav (100%) rename testData/{ => ast}/boxedType/statement_mult/double.kt (100%) rename testData/{ => ast}/boxedType/statement_mult/float.jav (100%) rename testData/{ => ast}/boxedType/statement_mult/float.kt (100%) rename testData/{ => ast}/boxedType/statement_mult/integer.jav (100%) rename testData/{ => ast}/boxedType/statement_mult/integer.kt (100%) rename testData/{ => ast}/boxedType/statement_mult/long.jav (100%) rename testData/{ => ast}/boxedType/statement_mult/long.kt (100%) rename testData/{ => ast}/boxedType/statement_mult/object.jav (100%) rename testData/{ => ast}/boxedType/statement_mult/object.kt (100%) rename testData/{ => ast}/boxedType/statement_mult/short.jav (100%) rename testData/{ => ast}/boxedType/statement_mult/short.kt (100%) rename testData/{ => ast}/breakStatement/statement/breakWithLabel.jav (100%) rename testData/{ => ast}/breakStatement/statement/breakWithLabel.kt (100%) rename testData/{ => ast}/breakStatement/statement/breakWithoutLabel.jav (100%) rename testData/{ => ast}/breakStatement/statement/breakWithoutLabel.kt (100%) rename testData/{ => ast}/class_/class/class.jav (100%) rename testData/{ => ast}/class_/class/class.kt (100%) rename testData/{ => ast}/class_/class/emptyClass.jav (100%) rename testData/{ => ast}/class_/class/emptyClass.kt (100%) rename testData/{ => ast}/class_/class/extendsOneClassAndImplementsOneInterface.jav (100%) rename testData/{ => ast}/class_/class/extendsOneClassAndImplementsOneInterface.kt (100%) rename testData/{ => ast}/class_/class/extendsOneClassAndImplementsSeveralInterfaces.jav (100%) rename testData/{ => ast}/class_/class/extendsOneClassAndImplementsSeveralInterfaces.kt (100%) rename testData/{ => ast}/class_/class/finalClass.jav (100%) rename testData/{ => ast}/class_/class/finalClass.kt (100%) rename testData/{ => ast}/class_/class/genericClass.jav (100%) rename testData/{ => ast}/class_/class/genericClass.kt (100%) rename testData/{ => ast}/class_/class/innerEmptyClass.jav (100%) rename testData/{ => ast}/class_/class/innerEmptyClass.kt (100%) rename testData/{ => ast}/class_/class/innerStaticClass.jav (100%) rename testData/{ => ast}/class_/class/innerStaticClass.kt (100%) rename testData/{ => ast}/class_/class/internalClass.jav (100%) rename testData/{ => ast}/class_/class/internalClass.kt (100%) rename testData/{ => ast}/class_/class/oneStaticFieldOneNonStatic.jav (100%) rename testData/{ => ast}/class_/class/oneStaticFieldOneNonStatic.kt (100%) rename testData/{ => ast}/class_/class/oneStaticMethod.jav (100%) rename testData/{ => ast}/class_/class/oneStaticMethod.kt (100%) rename testData/{ => ast}/class_/class/oneStaticMethodOneNonStatic.jav (100%) rename testData/{ => ast}/class_/class/oneStaticMethodOneNonStatic.kt (100%) rename testData/{ => ast}/class_/class/pivateClass.jav (100%) rename testData/{ => ast}/class_/class/pivateClass.kt (100%) rename testData/{ => ast}/class_/class/protectedClass.jav (100%) rename testData/{ => ast}/class_/class/protectedClass.kt (100%) rename testData/{ => ast}/class_/class/publicClass.jav (100%) rename testData/{ => ast}/class_/class/publicClass.kt (100%) rename testData/{ => ast}/class_/class/simpleInheritance.jav (100%) rename testData/{ => ast}/class_/class/simpleInheritance.kt (100%) rename testData/{ => ast}/class_/class/twoStaticMethod.jav (100%) rename testData/{ => ast}/class_/class/twoStaticMethod.kt (100%) rename testData/{ => ast}/class_/class_mult/classWithEmptyMethods.jav (100%) rename testData/{ => ast}/class_/class_mult/classWithEmptyMethods.kt (100%) rename testData/{ => ast}/class_/class_mult/classWithFields.jav (100%) rename testData/{ => ast}/class_/class_mult/classWithFields.kt (100%) rename testData/{ => ast}/class_/class_mult/classWithMultiplyFields.jav (100%) rename testData/{ => ast}/class_/class_mult/classWithMultiplyFields.kt (100%) rename testData/{ => ast}/conditionalExpression/expression_mult/simpleConditionalExpression.jav (100%) rename testData/{ => ast}/conditionalExpression/expression_mult/simpleConditionalExpression.kt (100%) rename testData/{ => ast}/continueStatement/statement/continueWithLabel.jav (100%) rename testData/{ => ast}/continueStatement/statement/continueWithLabel.kt (100%) rename testData/{ => ast}/continueStatement/statement/continueWithoutLabel.jav (100%) rename testData/{ => ast}/continueStatement/statement/continueWithoutLabel.kt (100%) rename testData/{ => ast}/declarationStatement/statement/singleFinalIntDeclaration.jav (100%) rename testData/{ => ast}/declarationStatement/statement/singleFinalIntDeclaration.kt (100%) rename testData/{ => ast}/declarationStatement/statement/singleFinalStringDeclaration.jav (100%) rename testData/{ => ast}/declarationStatement/statement/singleFinalStringDeclaration.kt (100%) rename testData/{ => ast}/declarationStatement/statement/singleIntDeclaration.jav (100%) rename testData/{ => ast}/declarationStatement/statement/singleIntDeclaration.kt (100%) rename testData/{ => ast}/declarationStatement/statement/singleStringDeclaration.jav (100%) rename testData/{ => ast}/declarationStatement/statement/singleStringDeclaration.kt (100%) rename testData/{ => ast}/declarationStatement/statement_mult/multiplyFinalIntDeclaration.jav (100%) rename testData/{ => ast}/declarationStatement/statement_mult/multiplyFinalIntDeclaration.kt (100%) rename testData/{ => ast}/declarationStatement/statement_mult/multiplyIntDeclaration.jav (100%) rename testData/{ => ast}/declarationStatement/statement_mult/multiplyIntDeclaration.kt (100%) rename testData/{ => ast}/doWhileStatement/statement_mult/whileWithBlock.jav (100%) rename testData/{ => ast}/doWhileStatement/statement_mult/whileWithBlock.kt (100%) rename testData/{ => ast}/doWhileStatement/statement_mult/whileWithEmptyBlock.jav (100%) rename testData/{ => ast}/doWhileStatement/statement_mult/whileWithEmptyBlock.kt (100%) rename testData/{ => ast}/doWhileStatement/statement_mult/whileWithExpression.jav (100%) rename testData/{ => ast}/doWhileStatement/statement_mult/whileWithExpression.kt (100%) rename testData/{ => ast}/doWhileStatement/statement_mult/whileWithReturn.jav (100%) rename testData/{ => ast}/doWhileStatement/statement_mult/whileWithReturn.kt (100%) rename testData/{ => ast}/enum/class/emptyEnum.jav (100%) rename testData/{ => ast}/enum/class/emptyEnum.kt (100%) rename testData/{ => ast}/enum/class/enumImplementsOneInterface.jav (100%) rename testData/{ => ast}/enum/class/enumImplementsOneInterface.kt (100%) rename testData/{ => ast}/enum/class/enumImplementsSeveralInterfaces.jav (100%) rename testData/{ => ast}/enum/class/enumImplementsSeveralInterfaces.kt (100%) rename testData/{ => ast}/enum/class/internalEnum.jav (100%) rename testData/{ => ast}/enum/class/internalEnum.kt (100%) rename testData/{ => ast}/enum/class/privateEnum.jav (100%) rename testData/{ => ast}/enum/class/privateEnum.kt (100%) rename testData/{ => ast}/enum/class/protectedEnum.jav (100%) rename testData/{ => ast}/enum/class/protectedEnum.kt (100%) rename testData/{ => ast}/enum/class/publicEnum.jav (100%) rename testData/{ => ast}/enum/class/publicEnum.kt (100%) rename testData/{ => ast}/enum/class_mult/enumWithNameField.jav (100%) rename testData/{ => ast}/enum/class_mult/enumWithNameField.kt (100%) rename testData/{ => ast}/enum/class_mult/fieldsWithPrimaryPrivateConstructor.jav (100%) rename testData/{ => ast}/enum/class_mult/fieldsWithPrimaryPrivateConstructor.kt (100%) rename testData/{ => ast}/enum/class_mult/overrideToString.jav (100%) rename testData/{ => ast}/enum/class_mult/overrideToString.kt (100%) rename testData/{ => ast}/enum/class_mult/runnableImplementation.jav (100%) rename testData/{ => ast}/enum/class_mult/runnableImplementation.kt (100%) rename testData/{ => ast}/enum/class_mult/typeSafeEnum.jav (100%) rename testData/{ => ast}/enum/class_mult/typeSafeEnum.kt (100%) rename testData/{ => ast}/field/method/internalField.jav (100%) rename testData/{ => ast}/field/method/internalField.kt (100%) rename testData/{ => ast}/field/method/privateField.jav (100%) rename testData/{ => ast}/field/method/privateField.kt (100%) rename testData/{ => ast}/field/method/protectedField.jav (100%) rename testData/{ => ast}/field/method/protectedField.kt (100%) rename testData/{ => ast}/field/method/publicField.jav (100%) rename testData/{ => ast}/field/method/publicField.kt (100%) rename testData/{ => ast}/field/method/valWithInit.jav (100%) rename testData/{ => ast}/field/method/valWithInit.kt (100%) rename testData/{ => ast}/field/method/varWithInit.jav (100%) rename testData/{ => ast}/field/method/varWithInit.kt (100%) rename testData/{ => ast}/field/method/varWithoutInit.jav (100%) rename testData/{ => ast}/field/method/varWithoutInit.kt (100%) rename testData/{ => ast}/file_/file/packageWithClass.jav (100%) rename testData/{ => ast}/file_/file/packageWithClass.kt (100%) rename testData/{ => ast}/file_/file/packageWithClasses.jav (100%) rename testData/{ => ast}/file_/file/packageWithClasses.kt (100%) rename testData/{ => ast}/file_/file/packageWithOpenClass.jav (100%) rename testData/{ => ast}/file_/file/packageWithOpenClass.kt (100%) rename testData/{ => ast}/file_/file_mult/packageWithImports.jav (100%) rename testData/{ => ast}/file_/file_mult/packageWithImports.kt (100%) rename testData/{ => ast}/file_/file_mult/packageWithMixedImports.jav (100%) rename testData/{ => ast}/file_/file_mult/packageWithMixedImports.kt (100%) rename testData/{ => ast}/file_/file_mult/packageWithStaticImports.jav (100%) rename testData/{ => ast}/file_/file_mult/packageWithStaticImports.kt (100%) rename testData/{ => ast}/for/statement_mult/commonCaseForTest.jav (100%) rename testData/{ => ast}/for/statement_mult/commonCaseForTest.kt (100%) rename testData/{ => ast}/for/statement_mult/forWithBlock.jav (100%) rename testData/{ => ast}/for/statement_mult/forWithBlock.kt (100%) rename testData/{ => ast}/for/statement_mult/forWithBlockAndDoubleUpdate.jav (100%) rename testData/{ => ast}/for/statement_mult/forWithBlockAndDoubleUpdate.kt (100%) rename testData/{ => ast}/for/statement_mult/forWithEmptyBlock.jav (100%) rename testData/{ => ast}/for/statement_mult/forWithEmptyBlock.kt (100%) rename testData/{ => ast}/for/statement_mult/forWithExpression.jav (100%) rename testData/{ => ast}/for/statement_mult/forWithExpression.kt (100%) rename testData/{ => ast}/for/statement_mult/forWithReturn.jav (100%) rename testData/{ => ast}/for/statement_mult/forWithReturn.kt (100%) rename testData/{ => ast}/foreachStatement/statement_mult/enhancedForWithBlock.jav (100%) rename testData/{ => ast}/foreachStatement/statement_mult/enhancedForWithBlock.kt (100%) rename testData/{ => ast}/foreachStatement/statement_mult/enhancedForWithEmptyBlock.jav (100%) rename testData/{ => ast}/foreachStatement/statement_mult/enhancedForWithEmptyBlock.kt (100%) rename testData/{ => ast}/foreachStatement/statement_mult/enhancedForWithExpression.jav (100%) rename testData/{ => ast}/foreachStatement/statement_mult/enhancedForWithExpression.kt (100%) rename testData/{ => ast}/foreachStatement/statement_mult/enhancedForWithReturn.jav (100%) rename testData/{ => ast}/foreachStatement/statement_mult/enhancedForWithReturn.kt (100%) rename testData/{ => ast}/function/file/override.jav (100%) rename testData/{ => ast}/function/file/override.kt (100%) rename testData/{ => ast}/function/method/classGenericParam.jav (100%) rename testData/{ => ast}/function/method/classGenericParam.kt (100%) rename testData/{ => ast}/function/method/emptyVoidMethod.jav (100%) rename testData/{ => ast}/function/method/emptyVoidMethod.kt (100%) rename testData/{ => ast}/function/method/internal.jav (100%) rename testData/{ => ast}/function/method/internal.kt (100%) rename testData/{ => ast}/function/method/methodClassType.jav (100%) rename testData/{ => ast}/function/method/methodClassType.kt (100%) rename testData/{ => ast}/function/method/methodPrimitiveType.jav (100%) rename testData/{ => ast}/function/method/methodPrimitiveType.kt (100%) rename testData/{ => ast}/function/method/methodPrimitiveType2.jav (100%) rename testData/{ => ast}/function/method/methodPrimitiveType2.kt (100%) rename testData/{ => ast}/function/method/methodWithReturnStatement.jav (100%) rename testData/{ => ast}/function/method/methodWithReturnStatement.kt (100%) rename testData/{ => ast}/function/method/ownGenericParam.jav (100%) rename testData/{ => ast}/function/method/ownGenericParam.kt (100%) rename testData/{ => ast}/function/method/ownSeveralGenericParams.jav (100%) rename testData/{ => ast}/function/method/ownSeveralGenericParams.kt (100%) rename testData/{ => ast}/function/method/private.jav (100%) rename testData/{ => ast}/function/method/private.kt (100%) rename testData/{ => ast}/function/method/protected.jav (100%) rename testData/{ => ast}/function/method/protected.kt (100%) rename testData/{ => ast}/function/method/public.jav (100%) rename testData/{ => ast}/function/method/public.kt (100%) rename testData/{ => ast}/ifStatement/statement_mult/ifStatementWithEmptyBlocks.jav (100%) rename testData/{ => ast}/ifStatement/statement_mult/ifStatementWithEmptyBlocks.kt (100%) rename testData/{ => ast}/ifStatement/statement_mult/ifStatementWithMultilineBlocks.jav (100%) rename testData/{ => ast}/ifStatement/statement_mult/ifStatementWithMultilineBlocks.kt (100%) rename testData/{ => ast}/ifStatement/statement_mult/ifStatementWithOneLineBlocks.jav (100%) rename testData/{ => ast}/ifStatement/statement_mult/ifStatementWithOneLineBlocks.kt (100%) rename testData/{ => ast}/ifStatement/statement_mult/ifStatementWithoutElse.jav (100%) rename testData/{ => ast}/ifStatement/statement_mult/ifStatementWithoutElse.kt (100%) rename testData/{ => ast}/inProjectionType/method/methodParams.jav (100%) rename testData/{ => ast}/inProjectionType/method/methodParams.kt (100%) rename testData/{ => ast}/isOperator/expression_mult/complicatedExpression.jav (100%) rename testData/{ => ast}/isOperator/expression_mult/complicatedExpression.kt (100%) rename testData/{ => ast}/isOperator/expression_mult/simpleReference.jav (100%) rename testData/{ => ast}/isOperator/expression_mult/simpleReference.kt (100%) rename testData/{ => ast}/labelStatement/statement_mult/complicatedExampleFromJavaTutorial.jav (100%) rename testData/{ => ast}/labelStatement/statement_mult/complicatedExampleFromJavaTutorial.kt (100%) rename testData/{ => ast}/localVariable/statement/object.jav (100%) rename testData/{ => ast}/localVariable/statement/object.kt (100%) rename testData/{ => ast}/methodCallExpression/statement/callWithKeywords.jav (100%) rename testData/{ => ast}/methodCallExpression/statement/callWithKeywords.kt (100%) rename testData/{ => ast}/methodCallExpression/statement/emptyCall.jav (100%) rename testData/{ => ast}/methodCallExpression/statement/emptyCall.kt (100%) rename testData/{ => ast}/methodCallExpression/statement/simpleCall.jav (100%) rename testData/{ => ast}/methodCallExpression/statement/simpleCall.kt (100%) rename testData/{ => ast}/newClassExpression/expression/classWithParam.jav (100%) rename testData/{ => ast}/newClassExpression/expression/classWithParam.kt (100%) rename testData/{ => ast}/newClassExpression/expression/classWithParams.jav (100%) rename testData/{ => ast}/newClassExpression/expression/classWithParams.kt (100%) rename testData/{ => ast}/newClassExpression/expression/classWithoutBody.jav (100%) rename testData/{ => ast}/newClassExpression/expression/classWithoutBody.kt (100%) rename testData/{ => ast}/newClassExpression/expression/classWithoutBody2.jav (100%) rename testData/{ => ast}/newClassExpression/expression/classWithoutBody2.kt (100%) rename testData/{ => ast}/outProjectionType/method/methodParams.jav (100%) rename testData/{ => ast}/outProjectionType/method/methodParams.kt (100%) rename testData/{ => ast}/parenthesizedExpression/expression/parenthesized.jav (100%) rename testData/{ => ast}/parenthesizedExpression/expression/parenthesized.kt (100%) rename testData/{ => ast}/parenthesizedExpression/expression/parenthesized2.jav (100%) rename testData/{ => ast}/parenthesizedExpression/expression/parenthesized2.kt (100%) rename testData/{ => ast}/polyadicExpression/expression_mult/divide.jav (100%) rename testData/{ => ast}/polyadicExpression/expression_mult/divide.kt (100%) rename testData/{ => ast}/polyadicExpression/expression_mult/minus.jav (100%) rename testData/{ => ast}/polyadicExpression/expression_mult/minus.kt (100%) rename testData/{ => ast}/polyadicExpression/expression_mult/multiply.jav (100%) rename testData/{ => ast}/polyadicExpression/expression_mult/multiply.kt (100%) rename testData/{ => ast}/polyadicExpression/expression_mult/plus.jav (100%) rename testData/{ => ast}/polyadicExpression/expression_mult/plus.kt (100%) rename testData/{ => ast}/polyadicExpression/expression_mult/remainder.jav (100%) rename testData/{ => ast}/polyadicExpression/expression_mult/remainder.kt (100%) rename testData/{ => ast}/postfixOperator/statement_mult/decrement.jav (100%) rename testData/{ => ast}/postfixOperator/statement_mult/decrement.kt (100%) rename testData/{ => ast}/postfixOperator/statement_mult/increment.jav (100%) rename testData/{ => ast}/postfixOperator/statement_mult/increment.kt (100%) rename testData/{ => ast}/prefixOperator/statement_mult/decrement.jav (100%) rename testData/{ => ast}/prefixOperator/statement_mult/decrement.kt (100%) rename testData/{ => ast}/prefixOperator/statement_mult/increment.jav (100%) rename testData/{ => ast}/prefixOperator/statement_mult/increment.kt (100%) rename testData/{ => ast}/returnStatement/statement/returnChar.jav (100%) rename testData/{ => ast}/returnStatement/statement/returnChar.kt (100%) rename testData/{ => ast}/returnStatement/statement/returnLiteral.jav (100%) rename testData/{ => ast}/returnStatement/statement/returnLiteral.kt (100%) rename testData/{ => ast}/returnStatement/statement/returnNumber.jav (100%) rename testData/{ => ast}/returnStatement/statement/returnNumber.kt (100%) rename testData/{ => ast}/returnStatement/statement/returnString.jav (100%) rename testData/{ => ast}/returnStatement/statement/returnString.kt (100%) rename testData/{ => ast}/starProjectionType/method/methodParams.jav (100%) rename testData/{ => ast}/starProjectionType/method/methodParams.kt (100%) rename testData/{ => ast}/synchronizedStatement/statement/singleLineExample.jav (100%) rename testData/{ => ast}/synchronizedStatement/statement/singleLineExample.kt (100%) rename testData/{ => ast}/throwStatement/statement/simpleThrowStatement.jav (100%) rename testData/{ => ast}/throwStatement/statement/simpleThrowStatement.kt (100%) rename testData/{ => ast}/trait/class/emptyInterface.jav (100%) rename testData/{ => ast}/trait/class/emptyInterface.kt (100%) rename testData/{ => ast}/trait/class/extendsOneClassAndImplementsSeveralInterfaces.jav (100%) rename testData/{ => ast}/trait/class/extendsOneClassAndImplementsSeveralInterfaces.kt (100%) rename testData/{ => ast}/trait/class/extendsOneInterface.jav (100%) rename testData/{ => ast}/trait/class/extendsOneInterface.kt (100%) rename testData/{ => ast}/trait/class/internalInterface.jav (100%) rename testData/{ => ast}/trait/class/internalInterface.kt (100%) rename testData/{ => ast}/trait/class/privateInterface.jav (100%) rename testData/{ => ast}/trait/class/privateInterface.kt (100%) rename testData/{ => ast}/trait/class/protectedInterface.jav (100%) rename testData/{ => ast}/trait/class/protectedInterface.kt (100%) rename testData/{ => ast}/trait/class/publicInterface.jav (100%) rename testData/{ => ast}/trait/class/publicInterface.kt (100%) rename testData/{ => ast}/trait/class_mult/interfaceWithFields.jav (100%) rename testData/{ => ast}/trait/class_mult/interfaceWithFields.kt (100%) rename testData/{ => ast}/trait/class_mult/interfaceWithMethodDeclaration.jav (100%) rename testData/{ => ast}/trait/class_mult/interfaceWithMethodDeclaration.kt (100%) rename testData/{ => ast}/trait/class_mult/interfaceWithStaticFields.jav (100%) rename testData/{ => ast}/trait/class_mult/interfaceWithStaticFields.kt (100%) rename testData/{ => ast}/tryStatement/statement_mult/commonCaseForTryStatement.jav (100%) rename testData/{ => ast}/tryStatement/statement_mult/commonCaseForTryStatement.kt (100%) rename testData/{ => ast}/tryStatement/statement_mult/emptyTryWithTwoCatchesWithEmptyFinally.jav (100%) rename testData/{ => ast}/tryStatement/statement_mult/emptyTryWithTwoCatchesWithEmptyFinally.kt (100%) rename testData/{ => ast}/tryStatement/statement_mult/emptyTryWithTwoCatchesWithFinally.jav (100%) rename testData/{ => ast}/tryStatement/statement_mult/emptyTryWithTwoCatchesWithFinally.kt (100%) rename testData/{ => ast}/tryStatement/statement_mult/emptyTryWithTwoCatchesWithoutFinally.jav (100%) rename testData/{ => ast}/tryStatement/statement_mult/emptyTryWithTwoCatchesWithoutFinally.kt (100%) rename testData/{ => ast}/typeCastExpression/expression_mult/extendsWildcardCast.jav (100%) rename testData/{ => ast}/typeCastExpression/expression_mult/extendsWildcardCast.kt (100%) rename testData/{ => ast}/typeCastExpression/expression_mult/fooCast.jav (100%) rename testData/{ => ast}/typeCastExpression/expression_mult/fooCast.kt (100%) rename testData/{ => ast}/typeCastExpression/expression_mult/intCast.jav (100%) rename testData/{ => ast}/typeCastExpression/expression_mult/intCast.kt (100%) rename testData/{ => ast}/typeCastExpression/expression_mult/primitiveType.jav (100%) rename testData/{ => ast}/typeCastExpression/expression_mult/primitiveType.kt (100%) rename testData/{ => ast}/typeCastExpression/expression_mult/simpleGenericCast.jav (100%) rename testData/{ => ast}/typeCastExpression/expression_mult/simpleGenericCast.kt (100%) rename testData/{ => ast}/typeCastExpression/expression_mult/stringCast.jav (100%) rename testData/{ => ast}/typeCastExpression/expression_mult/stringCast.kt (100%) rename testData/{ => ast}/typeCastExpression/expression_mult/superWildcardCast.jav (100%) rename testData/{ => ast}/typeCastExpression/expression_mult/superWildcardCast.kt (100%) rename testData/{ => ast}/typeCastExpression/expression_mult/wildcardCast.jav (100%) rename testData/{ => ast}/typeCastExpression/expression_mult/wildcardCast.kt (100%) rename testData/{ => ast}/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.jav (100%) rename testData/{ => ast}/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.kt (100%) rename testData/{ => ast}/typeParameters/class/classParametrizationWithTwoBounds.jav (100%) rename testData/{ => ast}/typeParameters/class/classParametrizationWithTwoBounds.kt (100%) rename testData/{ => ast}/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.jav (100%) rename testData/{ => ast}/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.kt (100%) rename testData/{ => ast}/typeParameters/class/complexExampleWithClassExtending.jav (100%) rename testData/{ => ast}/typeParameters/class/complexExampleWithClassExtending.kt (100%) rename testData/{ => ast}/typeParameters/class/complexExampleWithClassMultiplyExtending.jav (100%) rename testData/{ => ast}/typeParameters/class/complexExampleWithClassMultiplyExtending.kt (100%) rename testData/{ => ast}/typeParameters/class/genericClass.jav (100%) rename testData/{ => ast}/typeParameters/class/genericClass.kt (100%) rename testData/{ => ast}/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.jav (100%) rename testData/{ => ast}/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.kt (100%) rename testData/{ => ast}/typeParameters/method/methodDoubleParametrizationWithTwoBounds.jav (100%) rename testData/{ => ast}/typeParameters/method/methodDoubleParametrizationWithTwoBounds.kt (100%) rename testData/{ => ast}/typeParameters/method/where.jav (100%) rename testData/{ => ast}/typeParameters/method/where.kt (100%) rename testData/{ => ast}/typeParameters/statement_mult/genericParam.jav (100%) rename testData/{ => ast}/typeParameters/statement_mult/genericParam.kt (100%) rename testData/{ => ast}/typeParameters/statement_mult/manyGenericParams.jav (100%) rename testData/{ => ast}/typeParameters/statement_mult/manyGenericParams.kt (100%) rename testData/{ => ast}/varArg/method/ellipsisTypeSeveralParams.jav (100%) rename testData/{ => ast}/varArg/method/ellipsisTypeSeveralParams.kt (100%) rename testData/{ => ast}/varArg/method/ellipsisTypeSingleParams.jav (100%) rename testData/{ => ast}/varArg/method/ellipsisTypeSingleParams.kt (100%) rename testData/{ => ast}/whileStatement/statement_mult/whileWithBlock.jav (100%) rename testData/{ => ast}/whileStatement/statement_mult/whileWithBlock.kt (100%) rename testData/{ => ast}/whileStatement/statement_mult/whileWithEmptyBlock.jav (100%) rename testData/{ => ast}/whileStatement/statement_mult/whileWithEmptyBlock.kt (100%) rename testData/{ => ast}/whileStatement/statement_mult/whileWithExpression.jav (100%) rename testData/{ => ast}/whileStatement/statement_mult/whileWithExpression.kt (100%) rename testData/{ => ast}/whileStatement/statement_mult/whileWithReturn.jav (100%) rename testData/{ => ast}/whileStatement/statement_mult/whileWithReturn.kt (100%) diff --git a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java index 2fec5296537..ad3a83f7589 100644 --- a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java +++ b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java @@ -95,7 +95,7 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { public static Test suite() { TestSuite suite = new TestSuite(); - suite.addTest(TestCaseBuilder.suiteForDirectory(getTestDataPathBase(), "", true, new TestCaseBuilder.NamedTestFactory() { + suite.addTest(TestCaseBuilder.suiteForDirectory(getTestDataPathBase(), "/ast", true, new TestCaseBuilder.NamedTestFactory() { @NotNull @Override public Test createTest(@NotNull String dataPath, @NotNull String name) { diff --git a/testData/arrayAccessExpression/expression/expressionIndex.jav b/testData/ast/arrayAccessExpression/expression/expressionIndex.jav similarity index 100% rename from testData/arrayAccessExpression/expression/expressionIndex.jav rename to testData/ast/arrayAccessExpression/expression/expressionIndex.jav diff --git a/testData/arrayAccessExpression/expression/expressionIndex.kt b/testData/ast/arrayAccessExpression/expression/expressionIndex.kt similarity index 100% rename from testData/arrayAccessExpression/expression/expressionIndex.kt rename to testData/ast/arrayAccessExpression/expression/expressionIndex.kt diff --git a/testData/arrayAccessExpression/expression/intIndex.jav b/testData/ast/arrayAccessExpression/expression/intIndex.jav similarity index 100% rename from testData/arrayAccessExpression/expression/intIndex.jav rename to testData/ast/arrayAccessExpression/expression/intIndex.jav diff --git a/testData/arrayAccessExpression/expression/intIndex.kt b/testData/ast/arrayAccessExpression/expression/intIndex.kt similarity index 100% rename from testData/arrayAccessExpression/expression/intIndex.kt rename to testData/ast/arrayAccessExpression/expression/intIndex.kt diff --git a/testData/arrayAccessExpression/expression/variableIndex.jav b/testData/ast/arrayAccessExpression/expression/variableIndex.jav similarity index 100% rename from testData/arrayAccessExpression/expression/variableIndex.jav rename to testData/ast/arrayAccessExpression/expression/variableIndex.jav diff --git a/testData/arrayAccessExpression/expression/variableIndex.kt b/testData/ast/arrayAccessExpression/expression/variableIndex.kt similarity index 100% rename from testData/arrayAccessExpression/expression/variableIndex.kt rename to testData/ast/arrayAccessExpression/expression/variableIndex.kt diff --git a/testData/arrayInitializerExpression/expression/newInt.jav b/testData/ast/arrayInitializerExpression/expression/newInt.jav similarity index 100% rename from testData/arrayInitializerExpression/expression/newInt.jav rename to testData/ast/arrayInitializerExpression/expression/newInt.jav diff --git a/testData/arrayInitializerExpression/expression/newInt.kt b/testData/ast/arrayInitializerExpression/expression/newInt.kt similarity index 100% rename from testData/arrayInitializerExpression/expression/newInt.kt rename to testData/ast/arrayInitializerExpression/expression/newInt.kt diff --git a/testData/arrayInitializerExpression/expression/oneDim.jav b/testData/ast/arrayInitializerExpression/expression/oneDim.jav similarity index 100% rename from testData/arrayInitializerExpression/expression/oneDim.jav rename to testData/ast/arrayInitializerExpression/expression/oneDim.jav diff --git a/testData/arrayInitializerExpression/expression/oneDim.kt b/testData/ast/arrayInitializerExpression/expression/oneDim.kt similarity index 100% rename from testData/arrayInitializerExpression/expression/oneDim.kt rename to testData/ast/arrayInitializerExpression/expression/oneDim.kt diff --git a/testData/arrayInitializerExpression/expression/oneDimWithVariables.jav b/testData/ast/arrayInitializerExpression/expression/oneDimWithVariables.jav similarity index 100% rename from testData/arrayInitializerExpression/expression/oneDimWithVariables.jav rename to testData/ast/arrayInitializerExpression/expression/oneDimWithVariables.jav diff --git a/testData/arrayInitializerExpression/expression/oneDimWithVariables.kt b/testData/ast/arrayInitializerExpression/expression/oneDimWithVariables.kt similarity index 100% rename from testData/arrayInitializerExpression/expression/oneDimWithVariables.kt rename to testData/ast/arrayInitializerExpression/expression/oneDimWithVariables.kt diff --git a/testData/arrayInitializerExpression/expression/twoDim.jav b/testData/ast/arrayInitializerExpression/expression/twoDim.jav similarity index 100% rename from testData/arrayInitializerExpression/expression/twoDim.jav rename to testData/ast/arrayInitializerExpression/expression/twoDim.jav diff --git a/testData/arrayInitializerExpression/expression/twoDim.kt b/testData/ast/arrayInitializerExpression/expression/twoDim.kt similarity index 100% rename from testData/arrayInitializerExpression/expression/twoDim.kt rename to testData/ast/arrayInitializerExpression/expression/twoDim.kt diff --git a/testData/arrayType/method/methodArrayArgs.jav b/testData/ast/arrayType/method/methodArrayArgs.jav similarity index 100% rename from testData/arrayType/method/methodArrayArgs.jav rename to testData/ast/arrayType/method/methodArrayArgs.jav diff --git a/testData/arrayType/method/methodArrayArgs.kt b/testData/ast/arrayType/method/methodArrayArgs.kt similarity index 100% rename from testData/arrayType/method/methodArrayArgs.kt rename to testData/ast/arrayType/method/methodArrayArgs.kt diff --git a/testData/arrayType/statement/arrayInitializationStatement.jav b/testData/ast/arrayType/statement/arrayInitializationStatement.jav similarity index 100% rename from testData/arrayType/statement/arrayInitializationStatement.jav rename to testData/ast/arrayType/statement/arrayInitializationStatement.jav diff --git a/testData/arrayType/statement/arrayInitializationStatement.kt b/testData/ast/arrayType/statement/arrayInitializationStatement.kt similarity index 100% rename from testData/arrayType/statement/arrayInitializationStatement.kt rename to testData/ast/arrayType/statement/arrayInitializationStatement.kt diff --git a/testData/arrayType/statement/arrayInitializationStatementWithDimension.jav b/testData/ast/arrayType/statement/arrayInitializationStatementWithDimension.jav similarity index 100% rename from testData/arrayType/statement/arrayInitializationStatementWithDimension.jav rename to testData/ast/arrayType/statement/arrayInitializationStatementWithDimension.jav diff --git a/testData/arrayType/statement/arrayInitializationStatementWithDimension.kt b/testData/ast/arrayType/statement/arrayInitializationStatementWithDimension.kt similarity index 100% rename from testData/arrayType/statement/arrayInitializationStatementWithDimension.kt rename to testData/ast/arrayType/statement/arrayInitializationStatementWithDimension.kt diff --git a/testData/arrayType/statement_mult/doubleArray.jav b/testData/ast/arrayType/statement_mult/doubleArray.jav similarity index 100% rename from testData/arrayType/statement_mult/doubleArray.jav rename to testData/ast/arrayType/statement_mult/doubleArray.jav diff --git a/testData/arrayType/statement_mult/doubleArray.kt b/testData/ast/arrayType/statement_mult/doubleArray.kt similarity index 100% rename from testData/arrayType/statement_mult/doubleArray.kt rename to testData/ast/arrayType/statement_mult/doubleArray.kt diff --git a/testData/arrayType/statement_mult/longArray.jav b/testData/ast/arrayType/statement_mult/longArray.jav similarity index 100% rename from testData/arrayType/statement_mult/longArray.jav rename to testData/ast/arrayType/statement_mult/longArray.jav diff --git a/testData/arrayType/statement_mult/longArray.kt b/testData/ast/arrayType/statement_mult/longArray.kt similarity index 100% rename from testData/arrayType/statement_mult/longArray.kt rename to testData/ast/arrayType/statement_mult/longArray.kt diff --git a/testData/arrayType/statement_mult/newIntArray.jav b/testData/ast/arrayType/statement_mult/newIntArray.jav similarity index 100% rename from testData/arrayType/statement_mult/newIntArray.jav rename to testData/ast/arrayType/statement_mult/newIntArray.jav diff --git a/testData/arrayType/statement_mult/newIntArray.kt b/testData/ast/arrayType/statement_mult/newIntArray.kt similarity index 100% rename from testData/arrayType/statement_mult/newIntArray.kt rename to testData/ast/arrayType/statement_mult/newIntArray.kt diff --git a/testData/arrayType/statement_mult/newStringArray.jav b/testData/ast/arrayType/statement_mult/newStringArray.jav similarity index 100% rename from testData/arrayType/statement_mult/newStringArray.jav rename to testData/ast/arrayType/statement_mult/newStringArray.jav diff --git a/testData/arrayType/statement_mult/newStringArray.kt b/testData/ast/arrayType/statement_mult/newStringArray.kt similarity index 100% rename from testData/arrayType/statement_mult/newStringArray.kt rename to testData/ast/arrayType/statement_mult/newStringArray.kt diff --git a/testData/assertStatement/statement_mult/onlyCondition.jav b/testData/ast/assertStatement/statement_mult/onlyCondition.jav similarity index 100% rename from testData/assertStatement/statement_mult/onlyCondition.jav rename to testData/ast/assertStatement/statement_mult/onlyCondition.jav diff --git a/testData/assertStatement/statement_mult/onlyCondition.kt b/testData/ast/assertStatement/statement_mult/onlyCondition.kt similarity index 100% rename from testData/assertStatement/statement_mult/onlyCondition.kt rename to testData/ast/assertStatement/statement_mult/onlyCondition.kt diff --git a/testData/assertStatement/statement_mult/onlyConditionWithBraces.jav b/testData/ast/assertStatement/statement_mult/onlyConditionWithBraces.jav similarity index 100% rename from testData/assertStatement/statement_mult/onlyConditionWithBraces.jav rename to testData/ast/assertStatement/statement_mult/onlyConditionWithBraces.jav diff --git a/testData/assertStatement/statement_mult/onlyConditionWithBraces.kt b/testData/ast/assertStatement/statement_mult/onlyConditionWithBraces.kt similarity index 100% rename from testData/assertStatement/statement_mult/onlyConditionWithBraces.kt rename to testData/ast/assertStatement/statement_mult/onlyConditionWithBraces.kt diff --git a/testData/assertStatement/statement_mult/withStringDetail.jav b/testData/ast/assertStatement/statement_mult/withStringDetail.jav similarity index 100% rename from testData/assertStatement/statement_mult/withStringDetail.jav rename to testData/ast/assertStatement/statement_mult/withStringDetail.jav diff --git a/testData/assertStatement/statement_mult/withStringDetail.kt b/testData/ast/assertStatement/statement_mult/withStringDetail.kt similarity index 100% rename from testData/assertStatement/statement_mult/withStringDetail.kt rename to testData/ast/assertStatement/statement_mult/withStringDetail.kt diff --git a/testData/assignmentExpression/expression_mult/and.jav b/testData/ast/assignmentExpression/expression_mult/and.jav similarity index 100% rename from testData/assignmentExpression/expression_mult/and.jav rename to testData/ast/assignmentExpression/expression_mult/and.jav diff --git a/testData/assignmentExpression/expression_mult/and.kt b/testData/ast/assignmentExpression/expression_mult/and.kt similarity index 100% rename from testData/assignmentExpression/expression_mult/and.kt rename to testData/ast/assignmentExpression/expression_mult/and.kt diff --git a/testData/assignmentExpression/expression_mult/assignment.jav b/testData/ast/assignmentExpression/expression_mult/assignment.jav similarity index 100% rename from testData/assignmentExpression/expression_mult/assignment.jav rename to testData/ast/assignmentExpression/expression_mult/assignment.jav diff --git a/testData/assignmentExpression/expression_mult/assignment.kt b/testData/ast/assignmentExpression/expression_mult/assignment.kt similarity index 100% rename from testData/assignmentExpression/expression_mult/assignment.kt rename to testData/ast/assignmentExpression/expression_mult/assignment.kt diff --git a/testData/assignmentExpression/expression_mult/divideAssign.jav b/testData/ast/assignmentExpression/expression_mult/divideAssign.jav similarity index 100% rename from testData/assignmentExpression/expression_mult/divideAssign.jav rename to testData/ast/assignmentExpression/expression_mult/divideAssign.jav diff --git a/testData/assignmentExpression/expression_mult/divideAssign.kt b/testData/ast/assignmentExpression/expression_mult/divideAssign.kt similarity index 100% rename from testData/assignmentExpression/expression_mult/divideAssign.kt rename to testData/ast/assignmentExpression/expression_mult/divideAssign.kt diff --git a/testData/assignmentExpression/expression_mult/minusAssign.jav b/testData/ast/assignmentExpression/expression_mult/minusAssign.jav similarity index 100% rename from testData/assignmentExpression/expression_mult/minusAssign.jav rename to testData/ast/assignmentExpression/expression_mult/minusAssign.jav diff --git a/testData/assignmentExpression/expression_mult/minusAssign.kt b/testData/ast/assignmentExpression/expression_mult/minusAssign.kt similarity index 100% rename from testData/assignmentExpression/expression_mult/minusAssign.kt rename to testData/ast/assignmentExpression/expression_mult/minusAssign.kt diff --git a/testData/assignmentExpression/expression_mult/multiplyAssign.jav b/testData/ast/assignmentExpression/expression_mult/multiplyAssign.jav similarity index 100% rename from testData/assignmentExpression/expression_mult/multiplyAssign.jav rename to testData/ast/assignmentExpression/expression_mult/multiplyAssign.jav diff --git a/testData/assignmentExpression/expression_mult/multiplyAssign.kt b/testData/ast/assignmentExpression/expression_mult/multiplyAssign.kt similarity index 100% rename from testData/assignmentExpression/expression_mult/multiplyAssign.kt rename to testData/ast/assignmentExpression/expression_mult/multiplyAssign.kt diff --git a/testData/assignmentExpression/expression_mult/or.jav b/testData/ast/assignmentExpression/expression_mult/or.jav similarity index 100% rename from testData/assignmentExpression/expression_mult/or.jav rename to testData/ast/assignmentExpression/expression_mult/or.jav diff --git a/testData/assignmentExpression/expression_mult/or.kt b/testData/ast/assignmentExpression/expression_mult/or.kt similarity index 100% rename from testData/assignmentExpression/expression_mult/or.kt rename to testData/ast/assignmentExpression/expression_mult/or.kt diff --git a/testData/assignmentExpression/expression_mult/plusAssign.jav b/testData/ast/assignmentExpression/expression_mult/plusAssign.jav similarity index 100% rename from testData/assignmentExpression/expression_mult/plusAssign.jav rename to testData/ast/assignmentExpression/expression_mult/plusAssign.jav diff --git a/testData/assignmentExpression/expression_mult/plusAssign.kt b/testData/ast/assignmentExpression/expression_mult/plusAssign.kt similarity index 100% rename from testData/assignmentExpression/expression_mult/plusAssign.kt rename to testData/ast/assignmentExpression/expression_mult/plusAssign.kt diff --git a/testData/assignmentExpression/expression_mult/reminder.jav b/testData/ast/assignmentExpression/expression_mult/reminder.jav similarity index 100% rename from testData/assignmentExpression/expression_mult/reminder.jav rename to testData/ast/assignmentExpression/expression_mult/reminder.jav diff --git a/testData/assignmentExpression/expression_mult/reminder.kt b/testData/ast/assignmentExpression/expression_mult/reminder.kt similarity index 100% rename from testData/assignmentExpression/expression_mult/reminder.kt rename to testData/ast/assignmentExpression/expression_mult/reminder.kt diff --git a/testData/assignmentExpression/expression_mult/shiftLeft.jav b/testData/ast/assignmentExpression/expression_mult/shiftLeft.jav similarity index 100% rename from testData/assignmentExpression/expression_mult/shiftLeft.jav rename to testData/ast/assignmentExpression/expression_mult/shiftLeft.jav diff --git a/testData/assignmentExpression/expression_mult/shiftLeft.kt b/testData/ast/assignmentExpression/expression_mult/shiftLeft.kt similarity index 100% rename from testData/assignmentExpression/expression_mult/shiftLeft.kt rename to testData/ast/assignmentExpression/expression_mult/shiftLeft.kt diff --git a/testData/assignmentExpression/expression_mult/shiftRight.jav b/testData/ast/assignmentExpression/expression_mult/shiftRight.jav similarity index 100% rename from testData/assignmentExpression/expression_mult/shiftRight.jav rename to testData/ast/assignmentExpression/expression_mult/shiftRight.jav diff --git a/testData/assignmentExpression/expression_mult/shiftRight.kt b/testData/ast/assignmentExpression/expression_mult/shiftRight.kt similarity index 100% rename from testData/assignmentExpression/expression_mult/shiftRight.kt rename to testData/ast/assignmentExpression/expression_mult/shiftRight.kt diff --git a/testData/assignmentExpression/expression_mult/unsignedRightShift.jav b/testData/ast/assignmentExpression/expression_mult/unsignedRightShift.jav similarity index 100% rename from testData/assignmentExpression/expression_mult/unsignedRightShift.jav rename to testData/ast/assignmentExpression/expression_mult/unsignedRightShift.jav diff --git a/testData/assignmentExpression/expression_mult/unsignedRightShift.kt b/testData/ast/assignmentExpression/expression_mult/unsignedRightShift.kt similarity index 100% rename from testData/assignmentExpression/expression_mult/unsignedRightShift.kt rename to testData/ast/assignmentExpression/expression_mult/unsignedRightShift.kt diff --git a/testData/assignmentExpression/expression_mult/xor.jav b/testData/ast/assignmentExpression/expression_mult/xor.jav similarity index 100% rename from testData/assignmentExpression/expression_mult/xor.jav rename to testData/ast/assignmentExpression/expression_mult/xor.jav diff --git a/testData/assignmentExpression/expression_mult/xor.kt b/testData/ast/assignmentExpression/expression_mult/xor.kt similarity index 100% rename from testData/assignmentExpression/expression_mult/xor.kt rename to testData/ast/assignmentExpression/expression_mult/xor.kt diff --git a/testData/assignmentExpression/statement/simpleAssignment.jav b/testData/ast/assignmentExpression/statement/simpleAssignment.jav similarity index 100% rename from testData/assignmentExpression/statement/simpleAssignment.jav rename to testData/ast/assignmentExpression/statement/simpleAssignment.jav diff --git a/testData/assignmentExpression/statement/simpleAssignment.kt b/testData/ast/assignmentExpression/statement/simpleAssignment.kt similarity index 100% rename from testData/assignmentExpression/statement/simpleAssignment.kt rename to testData/ast/assignmentExpression/statement/simpleAssignment.kt diff --git a/testData/binaryExpression/expression_mult/and.jav b/testData/ast/binaryExpression/expression_mult/and.jav similarity index 100% rename from testData/binaryExpression/expression_mult/and.jav rename to testData/ast/binaryExpression/expression_mult/and.jav diff --git a/testData/binaryExpression/expression_mult/and.kt b/testData/ast/binaryExpression/expression_mult/and.kt similarity index 100% rename from testData/binaryExpression/expression_mult/and.kt rename to testData/ast/binaryExpression/expression_mult/and.kt diff --git a/testData/binaryExpression/expression_mult/conditionalAnd.jav b/testData/ast/binaryExpression/expression_mult/conditionalAnd.jav similarity index 100% rename from testData/binaryExpression/expression_mult/conditionalAnd.jav rename to testData/ast/binaryExpression/expression_mult/conditionalAnd.jav diff --git a/testData/binaryExpression/expression_mult/conditionalAnd.kt b/testData/ast/binaryExpression/expression_mult/conditionalAnd.kt similarity index 100% rename from testData/binaryExpression/expression_mult/conditionalAnd.kt rename to testData/ast/binaryExpression/expression_mult/conditionalAnd.kt diff --git a/testData/binaryExpression/expression_mult/conditionalOr.jav b/testData/ast/binaryExpression/expression_mult/conditionalOr.jav similarity index 100% rename from testData/binaryExpression/expression_mult/conditionalOr.jav rename to testData/ast/binaryExpression/expression_mult/conditionalOr.jav diff --git a/testData/binaryExpression/expression_mult/conditionalOr.kt b/testData/ast/binaryExpression/expression_mult/conditionalOr.kt similarity index 100% rename from testData/binaryExpression/expression_mult/conditionalOr.kt rename to testData/ast/binaryExpression/expression_mult/conditionalOr.kt diff --git a/testData/binaryExpression/expression_mult/divide.jav b/testData/ast/binaryExpression/expression_mult/divide.jav similarity index 100% rename from testData/binaryExpression/expression_mult/divide.jav rename to testData/ast/binaryExpression/expression_mult/divide.jav diff --git a/testData/binaryExpression/expression_mult/divide.kt b/testData/ast/binaryExpression/expression_mult/divide.kt similarity index 100% rename from testData/binaryExpression/expression_mult/divide.kt rename to testData/ast/binaryExpression/expression_mult/divide.kt diff --git a/testData/binaryExpression/expression_mult/greaterThan.jav b/testData/ast/binaryExpression/expression_mult/greaterThan.jav similarity index 100% rename from testData/binaryExpression/expression_mult/greaterThan.jav rename to testData/ast/binaryExpression/expression_mult/greaterThan.jav diff --git a/testData/binaryExpression/expression_mult/greaterThan.kt b/testData/ast/binaryExpression/expression_mult/greaterThan.kt similarity index 100% rename from testData/binaryExpression/expression_mult/greaterThan.kt rename to testData/ast/binaryExpression/expression_mult/greaterThan.kt diff --git a/testData/binaryExpression/expression_mult/greaterThanEqual.jav b/testData/ast/binaryExpression/expression_mult/greaterThanEqual.jav similarity index 100% rename from testData/binaryExpression/expression_mult/greaterThanEqual.jav rename to testData/ast/binaryExpression/expression_mult/greaterThanEqual.jav diff --git a/testData/binaryExpression/expression_mult/greaterThanEqual.kt b/testData/ast/binaryExpression/expression_mult/greaterThanEqual.kt similarity index 100% rename from testData/binaryExpression/expression_mult/greaterThanEqual.kt rename to testData/ast/binaryExpression/expression_mult/greaterThanEqual.kt diff --git a/testData/binaryExpression/expression_mult/lessThan.jav b/testData/ast/binaryExpression/expression_mult/lessThan.jav similarity index 100% rename from testData/binaryExpression/expression_mult/lessThan.jav rename to testData/ast/binaryExpression/expression_mult/lessThan.jav diff --git a/testData/binaryExpression/expression_mult/lessThan.kt b/testData/ast/binaryExpression/expression_mult/lessThan.kt similarity index 100% rename from testData/binaryExpression/expression_mult/lessThan.kt rename to testData/ast/binaryExpression/expression_mult/lessThan.kt diff --git a/testData/binaryExpression/expression_mult/lessThanEqual.jav b/testData/ast/binaryExpression/expression_mult/lessThanEqual.jav similarity index 100% rename from testData/binaryExpression/expression_mult/lessThanEqual.jav rename to testData/ast/binaryExpression/expression_mult/lessThanEqual.jav diff --git a/testData/binaryExpression/expression_mult/lessThanEqual.kt b/testData/ast/binaryExpression/expression_mult/lessThanEqual.kt similarity index 100% rename from testData/binaryExpression/expression_mult/lessThanEqual.kt rename to testData/ast/binaryExpression/expression_mult/lessThanEqual.kt diff --git a/testData/binaryExpression/expression_mult/minus.jav b/testData/ast/binaryExpression/expression_mult/minus.jav similarity index 100% rename from testData/binaryExpression/expression_mult/minus.jav rename to testData/ast/binaryExpression/expression_mult/minus.jav diff --git a/testData/binaryExpression/expression_mult/minus.kt b/testData/ast/binaryExpression/expression_mult/minus.kt similarity index 100% rename from testData/binaryExpression/expression_mult/minus.kt rename to testData/ast/binaryExpression/expression_mult/minus.kt diff --git a/testData/binaryExpression/expression_mult/multiply.jav b/testData/ast/binaryExpression/expression_mult/multiply.jav similarity index 100% rename from testData/binaryExpression/expression_mult/multiply.jav rename to testData/ast/binaryExpression/expression_mult/multiply.jav diff --git a/testData/binaryExpression/expression_mult/multiply.kt b/testData/ast/binaryExpression/expression_mult/multiply.kt similarity index 100% rename from testData/binaryExpression/expression_mult/multiply.kt rename to testData/ast/binaryExpression/expression_mult/multiply.kt diff --git a/testData/binaryExpression/expression_mult/or.jav b/testData/ast/binaryExpression/expression_mult/or.jav similarity index 100% rename from testData/binaryExpression/expression_mult/or.jav rename to testData/ast/binaryExpression/expression_mult/or.jav diff --git a/testData/binaryExpression/expression_mult/or.kt b/testData/ast/binaryExpression/expression_mult/or.kt similarity index 100% rename from testData/binaryExpression/expression_mult/or.kt rename to testData/ast/binaryExpression/expression_mult/or.kt diff --git a/testData/binaryExpression/expression_mult/plus.jav b/testData/ast/binaryExpression/expression_mult/plus.jav similarity index 100% rename from testData/binaryExpression/expression_mult/plus.jav rename to testData/ast/binaryExpression/expression_mult/plus.jav diff --git a/testData/binaryExpression/expression_mult/plus.kt b/testData/ast/binaryExpression/expression_mult/plus.kt similarity index 100% rename from testData/binaryExpression/expression_mult/plus.kt rename to testData/ast/binaryExpression/expression_mult/plus.kt diff --git a/testData/binaryExpression/expression_mult/remainder.jav b/testData/ast/binaryExpression/expression_mult/remainder.jav similarity index 100% rename from testData/binaryExpression/expression_mult/remainder.jav rename to testData/ast/binaryExpression/expression_mult/remainder.jav diff --git a/testData/binaryExpression/expression_mult/remainder.kt b/testData/ast/binaryExpression/expression_mult/remainder.kt similarity index 100% rename from testData/binaryExpression/expression_mult/remainder.kt rename to testData/ast/binaryExpression/expression_mult/remainder.kt diff --git a/testData/binaryExpression/expression_mult/shiftLeft.jav b/testData/ast/binaryExpression/expression_mult/shiftLeft.jav similarity index 100% rename from testData/binaryExpression/expression_mult/shiftLeft.jav rename to testData/ast/binaryExpression/expression_mult/shiftLeft.jav diff --git a/testData/binaryExpression/expression_mult/shiftLeft.kt b/testData/ast/binaryExpression/expression_mult/shiftLeft.kt similarity index 100% rename from testData/binaryExpression/expression_mult/shiftLeft.kt rename to testData/ast/binaryExpression/expression_mult/shiftLeft.kt diff --git a/testData/binaryExpression/expression_mult/shiftRight.jav b/testData/ast/binaryExpression/expression_mult/shiftRight.jav similarity index 100% rename from testData/binaryExpression/expression_mult/shiftRight.jav rename to testData/ast/binaryExpression/expression_mult/shiftRight.jav diff --git a/testData/binaryExpression/expression_mult/shiftRight.kt b/testData/ast/binaryExpression/expression_mult/shiftRight.kt similarity index 100% rename from testData/binaryExpression/expression_mult/shiftRight.kt rename to testData/ast/binaryExpression/expression_mult/shiftRight.kt diff --git a/testData/binaryExpression/expression_mult/unsignedRightShift.jav b/testData/ast/binaryExpression/expression_mult/unsignedRightShift.jav similarity index 100% rename from testData/binaryExpression/expression_mult/unsignedRightShift.jav rename to testData/ast/binaryExpression/expression_mult/unsignedRightShift.jav diff --git a/testData/binaryExpression/expression_mult/unsignedRightShift.kt b/testData/ast/binaryExpression/expression_mult/unsignedRightShift.kt similarity index 100% rename from testData/binaryExpression/expression_mult/unsignedRightShift.kt rename to testData/ast/binaryExpression/expression_mult/unsignedRightShift.kt diff --git a/testData/binaryExpression/expression_mult/xor.jav b/testData/ast/binaryExpression/expression_mult/xor.jav similarity index 100% rename from testData/binaryExpression/expression_mult/xor.jav rename to testData/ast/binaryExpression/expression_mult/xor.jav diff --git a/testData/binaryExpression/expression_mult/xor.kt b/testData/ast/binaryExpression/expression_mult/xor.kt similarity index 100% rename from testData/binaryExpression/expression_mult/xor.kt rename to testData/ast/binaryExpression/expression_mult/xor.kt diff --git a/testData/boxedType/statement_mult/boolean.jav b/testData/ast/boxedType/statement_mult/boolean.jav similarity index 100% rename from testData/boxedType/statement_mult/boolean.jav rename to testData/ast/boxedType/statement_mult/boolean.jav diff --git a/testData/boxedType/statement_mult/boolean.kt b/testData/ast/boxedType/statement_mult/boolean.kt similarity index 100% rename from testData/boxedType/statement_mult/boolean.kt rename to testData/ast/boxedType/statement_mult/boolean.kt diff --git a/testData/boxedType/statement_mult/byte.jav b/testData/ast/boxedType/statement_mult/byte.jav similarity index 100% rename from testData/boxedType/statement_mult/byte.jav rename to testData/ast/boxedType/statement_mult/byte.jav diff --git a/testData/boxedType/statement_mult/byte.kt b/testData/ast/boxedType/statement_mult/byte.kt similarity index 100% rename from testData/boxedType/statement_mult/byte.kt rename to testData/ast/boxedType/statement_mult/byte.kt diff --git a/testData/boxedType/statement_mult/character.jav b/testData/ast/boxedType/statement_mult/character.jav similarity index 100% rename from testData/boxedType/statement_mult/character.jav rename to testData/ast/boxedType/statement_mult/character.jav diff --git a/testData/boxedType/statement_mult/character.kt b/testData/ast/boxedType/statement_mult/character.kt similarity index 100% rename from testData/boxedType/statement_mult/character.kt rename to testData/ast/boxedType/statement_mult/character.kt diff --git a/testData/boxedType/statement_mult/double.jav b/testData/ast/boxedType/statement_mult/double.jav similarity index 100% rename from testData/boxedType/statement_mult/double.jav rename to testData/ast/boxedType/statement_mult/double.jav diff --git a/testData/boxedType/statement_mult/double.kt b/testData/ast/boxedType/statement_mult/double.kt similarity index 100% rename from testData/boxedType/statement_mult/double.kt rename to testData/ast/boxedType/statement_mult/double.kt diff --git a/testData/boxedType/statement_mult/float.jav b/testData/ast/boxedType/statement_mult/float.jav similarity index 100% rename from testData/boxedType/statement_mult/float.jav rename to testData/ast/boxedType/statement_mult/float.jav diff --git a/testData/boxedType/statement_mult/float.kt b/testData/ast/boxedType/statement_mult/float.kt similarity index 100% rename from testData/boxedType/statement_mult/float.kt rename to testData/ast/boxedType/statement_mult/float.kt diff --git a/testData/boxedType/statement_mult/integer.jav b/testData/ast/boxedType/statement_mult/integer.jav similarity index 100% rename from testData/boxedType/statement_mult/integer.jav rename to testData/ast/boxedType/statement_mult/integer.jav diff --git a/testData/boxedType/statement_mult/integer.kt b/testData/ast/boxedType/statement_mult/integer.kt similarity index 100% rename from testData/boxedType/statement_mult/integer.kt rename to testData/ast/boxedType/statement_mult/integer.kt diff --git a/testData/boxedType/statement_mult/long.jav b/testData/ast/boxedType/statement_mult/long.jav similarity index 100% rename from testData/boxedType/statement_mult/long.jav rename to testData/ast/boxedType/statement_mult/long.jav diff --git a/testData/boxedType/statement_mult/long.kt b/testData/ast/boxedType/statement_mult/long.kt similarity index 100% rename from testData/boxedType/statement_mult/long.kt rename to testData/ast/boxedType/statement_mult/long.kt diff --git a/testData/boxedType/statement_mult/object.jav b/testData/ast/boxedType/statement_mult/object.jav similarity index 100% rename from testData/boxedType/statement_mult/object.jav rename to testData/ast/boxedType/statement_mult/object.jav diff --git a/testData/boxedType/statement_mult/object.kt b/testData/ast/boxedType/statement_mult/object.kt similarity index 100% rename from testData/boxedType/statement_mult/object.kt rename to testData/ast/boxedType/statement_mult/object.kt diff --git a/testData/boxedType/statement_mult/short.jav b/testData/ast/boxedType/statement_mult/short.jav similarity index 100% rename from testData/boxedType/statement_mult/short.jav rename to testData/ast/boxedType/statement_mult/short.jav diff --git a/testData/boxedType/statement_mult/short.kt b/testData/ast/boxedType/statement_mult/short.kt similarity index 100% rename from testData/boxedType/statement_mult/short.kt rename to testData/ast/boxedType/statement_mult/short.kt diff --git a/testData/breakStatement/statement/breakWithLabel.jav b/testData/ast/breakStatement/statement/breakWithLabel.jav similarity index 100% rename from testData/breakStatement/statement/breakWithLabel.jav rename to testData/ast/breakStatement/statement/breakWithLabel.jav diff --git a/testData/breakStatement/statement/breakWithLabel.kt b/testData/ast/breakStatement/statement/breakWithLabel.kt similarity index 100% rename from testData/breakStatement/statement/breakWithLabel.kt rename to testData/ast/breakStatement/statement/breakWithLabel.kt diff --git a/testData/breakStatement/statement/breakWithoutLabel.jav b/testData/ast/breakStatement/statement/breakWithoutLabel.jav similarity index 100% rename from testData/breakStatement/statement/breakWithoutLabel.jav rename to testData/ast/breakStatement/statement/breakWithoutLabel.jav diff --git a/testData/breakStatement/statement/breakWithoutLabel.kt b/testData/ast/breakStatement/statement/breakWithoutLabel.kt similarity index 100% rename from testData/breakStatement/statement/breakWithoutLabel.kt rename to testData/ast/breakStatement/statement/breakWithoutLabel.kt diff --git a/testData/class_/class/class.jav b/testData/ast/class_/class/class.jav similarity index 100% rename from testData/class_/class/class.jav rename to testData/ast/class_/class/class.jav diff --git a/testData/class_/class/class.kt b/testData/ast/class_/class/class.kt similarity index 100% rename from testData/class_/class/class.kt rename to testData/ast/class_/class/class.kt diff --git a/testData/class_/class/emptyClass.jav b/testData/ast/class_/class/emptyClass.jav similarity index 100% rename from testData/class_/class/emptyClass.jav rename to testData/ast/class_/class/emptyClass.jav diff --git a/testData/class_/class/emptyClass.kt b/testData/ast/class_/class/emptyClass.kt similarity index 100% rename from testData/class_/class/emptyClass.kt rename to testData/ast/class_/class/emptyClass.kt diff --git a/testData/class_/class/extendsOneClassAndImplementsOneInterface.jav b/testData/ast/class_/class/extendsOneClassAndImplementsOneInterface.jav similarity index 100% rename from testData/class_/class/extendsOneClassAndImplementsOneInterface.jav rename to testData/ast/class_/class/extendsOneClassAndImplementsOneInterface.jav diff --git a/testData/class_/class/extendsOneClassAndImplementsOneInterface.kt b/testData/ast/class_/class/extendsOneClassAndImplementsOneInterface.kt similarity index 100% rename from testData/class_/class/extendsOneClassAndImplementsOneInterface.kt rename to testData/ast/class_/class/extendsOneClassAndImplementsOneInterface.kt diff --git a/testData/class_/class/extendsOneClassAndImplementsSeveralInterfaces.jav b/testData/ast/class_/class/extendsOneClassAndImplementsSeveralInterfaces.jav similarity index 100% rename from testData/class_/class/extendsOneClassAndImplementsSeveralInterfaces.jav rename to testData/ast/class_/class/extendsOneClassAndImplementsSeveralInterfaces.jav diff --git a/testData/class_/class/extendsOneClassAndImplementsSeveralInterfaces.kt b/testData/ast/class_/class/extendsOneClassAndImplementsSeveralInterfaces.kt similarity index 100% rename from testData/class_/class/extendsOneClassAndImplementsSeveralInterfaces.kt rename to testData/ast/class_/class/extendsOneClassAndImplementsSeveralInterfaces.kt diff --git a/testData/class_/class/finalClass.jav b/testData/ast/class_/class/finalClass.jav similarity index 100% rename from testData/class_/class/finalClass.jav rename to testData/ast/class_/class/finalClass.jav diff --git a/testData/class_/class/finalClass.kt b/testData/ast/class_/class/finalClass.kt similarity index 100% rename from testData/class_/class/finalClass.kt rename to testData/ast/class_/class/finalClass.kt diff --git a/testData/class_/class/genericClass.jav b/testData/ast/class_/class/genericClass.jav similarity index 100% rename from testData/class_/class/genericClass.jav rename to testData/ast/class_/class/genericClass.jav diff --git a/testData/class_/class/genericClass.kt b/testData/ast/class_/class/genericClass.kt similarity index 100% rename from testData/class_/class/genericClass.kt rename to testData/ast/class_/class/genericClass.kt diff --git a/testData/class_/class/innerEmptyClass.jav b/testData/ast/class_/class/innerEmptyClass.jav similarity index 100% rename from testData/class_/class/innerEmptyClass.jav rename to testData/ast/class_/class/innerEmptyClass.jav diff --git a/testData/class_/class/innerEmptyClass.kt b/testData/ast/class_/class/innerEmptyClass.kt similarity index 100% rename from testData/class_/class/innerEmptyClass.kt rename to testData/ast/class_/class/innerEmptyClass.kt diff --git a/testData/class_/class/innerStaticClass.jav b/testData/ast/class_/class/innerStaticClass.jav similarity index 100% rename from testData/class_/class/innerStaticClass.jav rename to testData/ast/class_/class/innerStaticClass.jav diff --git a/testData/class_/class/innerStaticClass.kt b/testData/ast/class_/class/innerStaticClass.kt similarity index 100% rename from testData/class_/class/innerStaticClass.kt rename to testData/ast/class_/class/innerStaticClass.kt diff --git a/testData/class_/class/internalClass.jav b/testData/ast/class_/class/internalClass.jav similarity index 100% rename from testData/class_/class/internalClass.jav rename to testData/ast/class_/class/internalClass.jav diff --git a/testData/class_/class/internalClass.kt b/testData/ast/class_/class/internalClass.kt similarity index 100% rename from testData/class_/class/internalClass.kt rename to testData/ast/class_/class/internalClass.kt diff --git a/testData/class_/class/oneStaticFieldOneNonStatic.jav b/testData/ast/class_/class/oneStaticFieldOneNonStatic.jav similarity index 100% rename from testData/class_/class/oneStaticFieldOneNonStatic.jav rename to testData/ast/class_/class/oneStaticFieldOneNonStatic.jav diff --git a/testData/class_/class/oneStaticFieldOneNonStatic.kt b/testData/ast/class_/class/oneStaticFieldOneNonStatic.kt similarity index 100% rename from testData/class_/class/oneStaticFieldOneNonStatic.kt rename to testData/ast/class_/class/oneStaticFieldOneNonStatic.kt diff --git a/testData/class_/class/oneStaticMethod.jav b/testData/ast/class_/class/oneStaticMethod.jav similarity index 100% rename from testData/class_/class/oneStaticMethod.jav rename to testData/ast/class_/class/oneStaticMethod.jav diff --git a/testData/class_/class/oneStaticMethod.kt b/testData/ast/class_/class/oneStaticMethod.kt similarity index 100% rename from testData/class_/class/oneStaticMethod.kt rename to testData/ast/class_/class/oneStaticMethod.kt diff --git a/testData/class_/class/oneStaticMethodOneNonStatic.jav b/testData/ast/class_/class/oneStaticMethodOneNonStatic.jav similarity index 100% rename from testData/class_/class/oneStaticMethodOneNonStatic.jav rename to testData/ast/class_/class/oneStaticMethodOneNonStatic.jav diff --git a/testData/class_/class/oneStaticMethodOneNonStatic.kt b/testData/ast/class_/class/oneStaticMethodOneNonStatic.kt similarity index 100% rename from testData/class_/class/oneStaticMethodOneNonStatic.kt rename to testData/ast/class_/class/oneStaticMethodOneNonStatic.kt diff --git a/testData/class_/class/pivateClass.jav b/testData/ast/class_/class/pivateClass.jav similarity index 100% rename from testData/class_/class/pivateClass.jav rename to testData/ast/class_/class/pivateClass.jav diff --git a/testData/class_/class/pivateClass.kt b/testData/ast/class_/class/pivateClass.kt similarity index 100% rename from testData/class_/class/pivateClass.kt rename to testData/ast/class_/class/pivateClass.kt diff --git a/testData/class_/class/protectedClass.jav b/testData/ast/class_/class/protectedClass.jav similarity index 100% rename from testData/class_/class/protectedClass.jav rename to testData/ast/class_/class/protectedClass.jav diff --git a/testData/class_/class/protectedClass.kt b/testData/ast/class_/class/protectedClass.kt similarity index 100% rename from testData/class_/class/protectedClass.kt rename to testData/ast/class_/class/protectedClass.kt diff --git a/testData/class_/class/publicClass.jav b/testData/ast/class_/class/publicClass.jav similarity index 100% rename from testData/class_/class/publicClass.jav rename to testData/ast/class_/class/publicClass.jav diff --git a/testData/class_/class/publicClass.kt b/testData/ast/class_/class/publicClass.kt similarity index 100% rename from testData/class_/class/publicClass.kt rename to testData/ast/class_/class/publicClass.kt diff --git a/testData/class_/class/simpleInheritance.jav b/testData/ast/class_/class/simpleInheritance.jav similarity index 100% rename from testData/class_/class/simpleInheritance.jav rename to testData/ast/class_/class/simpleInheritance.jav diff --git a/testData/class_/class/simpleInheritance.kt b/testData/ast/class_/class/simpleInheritance.kt similarity index 100% rename from testData/class_/class/simpleInheritance.kt rename to testData/ast/class_/class/simpleInheritance.kt diff --git a/testData/class_/class/twoStaticMethod.jav b/testData/ast/class_/class/twoStaticMethod.jav similarity index 100% rename from testData/class_/class/twoStaticMethod.jav rename to testData/ast/class_/class/twoStaticMethod.jav diff --git a/testData/class_/class/twoStaticMethod.kt b/testData/ast/class_/class/twoStaticMethod.kt similarity index 100% rename from testData/class_/class/twoStaticMethod.kt rename to testData/ast/class_/class/twoStaticMethod.kt diff --git a/testData/class_/class_mult/classWithEmptyMethods.jav b/testData/ast/class_/class_mult/classWithEmptyMethods.jav similarity index 100% rename from testData/class_/class_mult/classWithEmptyMethods.jav rename to testData/ast/class_/class_mult/classWithEmptyMethods.jav diff --git a/testData/class_/class_mult/classWithEmptyMethods.kt b/testData/ast/class_/class_mult/classWithEmptyMethods.kt similarity index 100% rename from testData/class_/class_mult/classWithEmptyMethods.kt rename to testData/ast/class_/class_mult/classWithEmptyMethods.kt diff --git a/testData/class_/class_mult/classWithFields.jav b/testData/ast/class_/class_mult/classWithFields.jav similarity index 100% rename from testData/class_/class_mult/classWithFields.jav rename to testData/ast/class_/class_mult/classWithFields.jav diff --git a/testData/class_/class_mult/classWithFields.kt b/testData/ast/class_/class_mult/classWithFields.kt similarity index 100% rename from testData/class_/class_mult/classWithFields.kt rename to testData/ast/class_/class_mult/classWithFields.kt diff --git a/testData/class_/class_mult/classWithMultiplyFields.jav b/testData/ast/class_/class_mult/classWithMultiplyFields.jav similarity index 100% rename from testData/class_/class_mult/classWithMultiplyFields.jav rename to testData/ast/class_/class_mult/classWithMultiplyFields.jav diff --git a/testData/class_/class_mult/classWithMultiplyFields.kt b/testData/ast/class_/class_mult/classWithMultiplyFields.kt similarity index 100% rename from testData/class_/class_mult/classWithMultiplyFields.kt rename to testData/ast/class_/class_mult/classWithMultiplyFields.kt diff --git a/testData/conditionalExpression/expression_mult/simpleConditionalExpression.jav b/testData/ast/conditionalExpression/expression_mult/simpleConditionalExpression.jav similarity index 100% rename from testData/conditionalExpression/expression_mult/simpleConditionalExpression.jav rename to testData/ast/conditionalExpression/expression_mult/simpleConditionalExpression.jav diff --git a/testData/conditionalExpression/expression_mult/simpleConditionalExpression.kt b/testData/ast/conditionalExpression/expression_mult/simpleConditionalExpression.kt similarity index 100% rename from testData/conditionalExpression/expression_mult/simpleConditionalExpression.kt rename to testData/ast/conditionalExpression/expression_mult/simpleConditionalExpression.kt diff --git a/testData/continueStatement/statement/continueWithLabel.jav b/testData/ast/continueStatement/statement/continueWithLabel.jav similarity index 100% rename from testData/continueStatement/statement/continueWithLabel.jav rename to testData/ast/continueStatement/statement/continueWithLabel.jav diff --git a/testData/continueStatement/statement/continueWithLabel.kt b/testData/ast/continueStatement/statement/continueWithLabel.kt similarity index 100% rename from testData/continueStatement/statement/continueWithLabel.kt rename to testData/ast/continueStatement/statement/continueWithLabel.kt diff --git a/testData/continueStatement/statement/continueWithoutLabel.jav b/testData/ast/continueStatement/statement/continueWithoutLabel.jav similarity index 100% rename from testData/continueStatement/statement/continueWithoutLabel.jav rename to testData/ast/continueStatement/statement/continueWithoutLabel.jav diff --git a/testData/continueStatement/statement/continueWithoutLabel.kt b/testData/ast/continueStatement/statement/continueWithoutLabel.kt similarity index 100% rename from testData/continueStatement/statement/continueWithoutLabel.kt rename to testData/ast/continueStatement/statement/continueWithoutLabel.kt diff --git a/testData/declarationStatement/statement/singleFinalIntDeclaration.jav b/testData/ast/declarationStatement/statement/singleFinalIntDeclaration.jav similarity index 100% rename from testData/declarationStatement/statement/singleFinalIntDeclaration.jav rename to testData/ast/declarationStatement/statement/singleFinalIntDeclaration.jav diff --git a/testData/declarationStatement/statement/singleFinalIntDeclaration.kt b/testData/ast/declarationStatement/statement/singleFinalIntDeclaration.kt similarity index 100% rename from testData/declarationStatement/statement/singleFinalIntDeclaration.kt rename to testData/ast/declarationStatement/statement/singleFinalIntDeclaration.kt diff --git a/testData/declarationStatement/statement/singleFinalStringDeclaration.jav b/testData/ast/declarationStatement/statement/singleFinalStringDeclaration.jav similarity index 100% rename from testData/declarationStatement/statement/singleFinalStringDeclaration.jav rename to testData/ast/declarationStatement/statement/singleFinalStringDeclaration.jav diff --git a/testData/declarationStatement/statement/singleFinalStringDeclaration.kt b/testData/ast/declarationStatement/statement/singleFinalStringDeclaration.kt similarity index 100% rename from testData/declarationStatement/statement/singleFinalStringDeclaration.kt rename to testData/ast/declarationStatement/statement/singleFinalStringDeclaration.kt diff --git a/testData/declarationStatement/statement/singleIntDeclaration.jav b/testData/ast/declarationStatement/statement/singleIntDeclaration.jav similarity index 100% rename from testData/declarationStatement/statement/singleIntDeclaration.jav rename to testData/ast/declarationStatement/statement/singleIntDeclaration.jav diff --git a/testData/declarationStatement/statement/singleIntDeclaration.kt b/testData/ast/declarationStatement/statement/singleIntDeclaration.kt similarity index 100% rename from testData/declarationStatement/statement/singleIntDeclaration.kt rename to testData/ast/declarationStatement/statement/singleIntDeclaration.kt diff --git a/testData/declarationStatement/statement/singleStringDeclaration.jav b/testData/ast/declarationStatement/statement/singleStringDeclaration.jav similarity index 100% rename from testData/declarationStatement/statement/singleStringDeclaration.jav rename to testData/ast/declarationStatement/statement/singleStringDeclaration.jav diff --git a/testData/declarationStatement/statement/singleStringDeclaration.kt b/testData/ast/declarationStatement/statement/singleStringDeclaration.kt similarity index 100% rename from testData/declarationStatement/statement/singleStringDeclaration.kt rename to testData/ast/declarationStatement/statement/singleStringDeclaration.kt diff --git a/testData/declarationStatement/statement_mult/multiplyFinalIntDeclaration.jav b/testData/ast/declarationStatement/statement_mult/multiplyFinalIntDeclaration.jav similarity index 100% rename from testData/declarationStatement/statement_mult/multiplyFinalIntDeclaration.jav rename to testData/ast/declarationStatement/statement_mult/multiplyFinalIntDeclaration.jav diff --git a/testData/declarationStatement/statement_mult/multiplyFinalIntDeclaration.kt b/testData/ast/declarationStatement/statement_mult/multiplyFinalIntDeclaration.kt similarity index 100% rename from testData/declarationStatement/statement_mult/multiplyFinalIntDeclaration.kt rename to testData/ast/declarationStatement/statement_mult/multiplyFinalIntDeclaration.kt diff --git a/testData/declarationStatement/statement_mult/multiplyIntDeclaration.jav b/testData/ast/declarationStatement/statement_mult/multiplyIntDeclaration.jav similarity index 100% rename from testData/declarationStatement/statement_mult/multiplyIntDeclaration.jav rename to testData/ast/declarationStatement/statement_mult/multiplyIntDeclaration.jav diff --git a/testData/declarationStatement/statement_mult/multiplyIntDeclaration.kt b/testData/ast/declarationStatement/statement_mult/multiplyIntDeclaration.kt similarity index 100% rename from testData/declarationStatement/statement_mult/multiplyIntDeclaration.kt rename to testData/ast/declarationStatement/statement_mult/multiplyIntDeclaration.kt diff --git a/testData/doWhileStatement/statement_mult/whileWithBlock.jav b/testData/ast/doWhileStatement/statement_mult/whileWithBlock.jav similarity index 100% rename from testData/doWhileStatement/statement_mult/whileWithBlock.jav rename to testData/ast/doWhileStatement/statement_mult/whileWithBlock.jav diff --git a/testData/doWhileStatement/statement_mult/whileWithBlock.kt b/testData/ast/doWhileStatement/statement_mult/whileWithBlock.kt similarity index 100% rename from testData/doWhileStatement/statement_mult/whileWithBlock.kt rename to testData/ast/doWhileStatement/statement_mult/whileWithBlock.kt diff --git a/testData/doWhileStatement/statement_mult/whileWithEmptyBlock.jav b/testData/ast/doWhileStatement/statement_mult/whileWithEmptyBlock.jav similarity index 100% rename from testData/doWhileStatement/statement_mult/whileWithEmptyBlock.jav rename to testData/ast/doWhileStatement/statement_mult/whileWithEmptyBlock.jav diff --git a/testData/doWhileStatement/statement_mult/whileWithEmptyBlock.kt b/testData/ast/doWhileStatement/statement_mult/whileWithEmptyBlock.kt similarity index 100% rename from testData/doWhileStatement/statement_mult/whileWithEmptyBlock.kt rename to testData/ast/doWhileStatement/statement_mult/whileWithEmptyBlock.kt diff --git a/testData/doWhileStatement/statement_mult/whileWithExpression.jav b/testData/ast/doWhileStatement/statement_mult/whileWithExpression.jav similarity index 100% rename from testData/doWhileStatement/statement_mult/whileWithExpression.jav rename to testData/ast/doWhileStatement/statement_mult/whileWithExpression.jav diff --git a/testData/doWhileStatement/statement_mult/whileWithExpression.kt b/testData/ast/doWhileStatement/statement_mult/whileWithExpression.kt similarity index 100% rename from testData/doWhileStatement/statement_mult/whileWithExpression.kt rename to testData/ast/doWhileStatement/statement_mult/whileWithExpression.kt diff --git a/testData/doWhileStatement/statement_mult/whileWithReturn.jav b/testData/ast/doWhileStatement/statement_mult/whileWithReturn.jav similarity index 100% rename from testData/doWhileStatement/statement_mult/whileWithReturn.jav rename to testData/ast/doWhileStatement/statement_mult/whileWithReturn.jav diff --git a/testData/doWhileStatement/statement_mult/whileWithReturn.kt b/testData/ast/doWhileStatement/statement_mult/whileWithReturn.kt similarity index 100% rename from testData/doWhileStatement/statement_mult/whileWithReturn.kt rename to testData/ast/doWhileStatement/statement_mult/whileWithReturn.kt diff --git a/testData/enum/class/emptyEnum.jav b/testData/ast/enum/class/emptyEnum.jav similarity index 100% rename from testData/enum/class/emptyEnum.jav rename to testData/ast/enum/class/emptyEnum.jav diff --git a/testData/enum/class/emptyEnum.kt b/testData/ast/enum/class/emptyEnum.kt similarity index 100% rename from testData/enum/class/emptyEnum.kt rename to testData/ast/enum/class/emptyEnum.kt diff --git a/testData/enum/class/enumImplementsOneInterface.jav b/testData/ast/enum/class/enumImplementsOneInterface.jav similarity index 100% rename from testData/enum/class/enumImplementsOneInterface.jav rename to testData/ast/enum/class/enumImplementsOneInterface.jav diff --git a/testData/enum/class/enumImplementsOneInterface.kt b/testData/ast/enum/class/enumImplementsOneInterface.kt similarity index 100% rename from testData/enum/class/enumImplementsOneInterface.kt rename to testData/ast/enum/class/enumImplementsOneInterface.kt diff --git a/testData/enum/class/enumImplementsSeveralInterfaces.jav b/testData/ast/enum/class/enumImplementsSeveralInterfaces.jav similarity index 100% rename from testData/enum/class/enumImplementsSeveralInterfaces.jav rename to testData/ast/enum/class/enumImplementsSeveralInterfaces.jav diff --git a/testData/enum/class/enumImplementsSeveralInterfaces.kt b/testData/ast/enum/class/enumImplementsSeveralInterfaces.kt similarity index 100% rename from testData/enum/class/enumImplementsSeveralInterfaces.kt rename to testData/ast/enum/class/enumImplementsSeveralInterfaces.kt diff --git a/testData/enum/class/internalEnum.jav b/testData/ast/enum/class/internalEnum.jav similarity index 100% rename from testData/enum/class/internalEnum.jav rename to testData/ast/enum/class/internalEnum.jav diff --git a/testData/enum/class/internalEnum.kt b/testData/ast/enum/class/internalEnum.kt similarity index 100% rename from testData/enum/class/internalEnum.kt rename to testData/ast/enum/class/internalEnum.kt diff --git a/testData/enum/class/privateEnum.jav b/testData/ast/enum/class/privateEnum.jav similarity index 100% rename from testData/enum/class/privateEnum.jav rename to testData/ast/enum/class/privateEnum.jav diff --git a/testData/enum/class/privateEnum.kt b/testData/ast/enum/class/privateEnum.kt similarity index 100% rename from testData/enum/class/privateEnum.kt rename to testData/ast/enum/class/privateEnum.kt diff --git a/testData/enum/class/protectedEnum.jav b/testData/ast/enum/class/protectedEnum.jav similarity index 100% rename from testData/enum/class/protectedEnum.jav rename to testData/ast/enum/class/protectedEnum.jav diff --git a/testData/enum/class/protectedEnum.kt b/testData/ast/enum/class/protectedEnum.kt similarity index 100% rename from testData/enum/class/protectedEnum.kt rename to testData/ast/enum/class/protectedEnum.kt diff --git a/testData/enum/class/publicEnum.jav b/testData/ast/enum/class/publicEnum.jav similarity index 100% rename from testData/enum/class/publicEnum.jav rename to testData/ast/enum/class/publicEnum.jav diff --git a/testData/enum/class/publicEnum.kt b/testData/ast/enum/class/publicEnum.kt similarity index 100% rename from testData/enum/class/publicEnum.kt rename to testData/ast/enum/class/publicEnum.kt diff --git a/testData/enum/class_mult/enumWithNameField.jav b/testData/ast/enum/class_mult/enumWithNameField.jav similarity index 100% rename from testData/enum/class_mult/enumWithNameField.jav rename to testData/ast/enum/class_mult/enumWithNameField.jav diff --git a/testData/enum/class_mult/enumWithNameField.kt b/testData/ast/enum/class_mult/enumWithNameField.kt similarity index 100% rename from testData/enum/class_mult/enumWithNameField.kt rename to testData/ast/enum/class_mult/enumWithNameField.kt diff --git a/testData/enum/class_mult/fieldsWithPrimaryPrivateConstructor.jav b/testData/ast/enum/class_mult/fieldsWithPrimaryPrivateConstructor.jav similarity index 100% rename from testData/enum/class_mult/fieldsWithPrimaryPrivateConstructor.jav rename to testData/ast/enum/class_mult/fieldsWithPrimaryPrivateConstructor.jav diff --git a/testData/enum/class_mult/fieldsWithPrimaryPrivateConstructor.kt b/testData/ast/enum/class_mult/fieldsWithPrimaryPrivateConstructor.kt similarity index 100% rename from testData/enum/class_mult/fieldsWithPrimaryPrivateConstructor.kt rename to testData/ast/enum/class_mult/fieldsWithPrimaryPrivateConstructor.kt diff --git a/testData/enum/class_mult/overrideToString.jav b/testData/ast/enum/class_mult/overrideToString.jav similarity index 100% rename from testData/enum/class_mult/overrideToString.jav rename to testData/ast/enum/class_mult/overrideToString.jav diff --git a/testData/enum/class_mult/overrideToString.kt b/testData/ast/enum/class_mult/overrideToString.kt similarity index 100% rename from testData/enum/class_mult/overrideToString.kt rename to testData/ast/enum/class_mult/overrideToString.kt diff --git a/testData/enum/class_mult/runnableImplementation.jav b/testData/ast/enum/class_mult/runnableImplementation.jav similarity index 100% rename from testData/enum/class_mult/runnableImplementation.jav rename to testData/ast/enum/class_mult/runnableImplementation.jav diff --git a/testData/enum/class_mult/runnableImplementation.kt b/testData/ast/enum/class_mult/runnableImplementation.kt similarity index 100% rename from testData/enum/class_mult/runnableImplementation.kt rename to testData/ast/enum/class_mult/runnableImplementation.kt diff --git a/testData/enum/class_mult/typeSafeEnum.jav b/testData/ast/enum/class_mult/typeSafeEnum.jav similarity index 100% rename from testData/enum/class_mult/typeSafeEnum.jav rename to testData/ast/enum/class_mult/typeSafeEnum.jav diff --git a/testData/enum/class_mult/typeSafeEnum.kt b/testData/ast/enum/class_mult/typeSafeEnum.kt similarity index 100% rename from testData/enum/class_mult/typeSafeEnum.kt rename to testData/ast/enum/class_mult/typeSafeEnum.kt diff --git a/testData/field/method/internalField.jav b/testData/ast/field/method/internalField.jav similarity index 100% rename from testData/field/method/internalField.jav rename to testData/ast/field/method/internalField.jav diff --git a/testData/field/method/internalField.kt b/testData/ast/field/method/internalField.kt similarity index 100% rename from testData/field/method/internalField.kt rename to testData/ast/field/method/internalField.kt diff --git a/testData/field/method/privateField.jav b/testData/ast/field/method/privateField.jav similarity index 100% rename from testData/field/method/privateField.jav rename to testData/ast/field/method/privateField.jav diff --git a/testData/field/method/privateField.kt b/testData/ast/field/method/privateField.kt similarity index 100% rename from testData/field/method/privateField.kt rename to testData/ast/field/method/privateField.kt diff --git a/testData/field/method/protectedField.jav b/testData/ast/field/method/protectedField.jav similarity index 100% rename from testData/field/method/protectedField.jav rename to testData/ast/field/method/protectedField.jav diff --git a/testData/field/method/protectedField.kt b/testData/ast/field/method/protectedField.kt similarity index 100% rename from testData/field/method/protectedField.kt rename to testData/ast/field/method/protectedField.kt diff --git a/testData/field/method/publicField.jav b/testData/ast/field/method/publicField.jav similarity index 100% rename from testData/field/method/publicField.jav rename to testData/ast/field/method/publicField.jav diff --git a/testData/field/method/publicField.kt b/testData/ast/field/method/publicField.kt similarity index 100% rename from testData/field/method/publicField.kt rename to testData/ast/field/method/publicField.kt diff --git a/testData/field/method/valWithInit.jav b/testData/ast/field/method/valWithInit.jav similarity index 100% rename from testData/field/method/valWithInit.jav rename to testData/ast/field/method/valWithInit.jav diff --git a/testData/field/method/valWithInit.kt b/testData/ast/field/method/valWithInit.kt similarity index 100% rename from testData/field/method/valWithInit.kt rename to testData/ast/field/method/valWithInit.kt diff --git a/testData/field/method/varWithInit.jav b/testData/ast/field/method/varWithInit.jav similarity index 100% rename from testData/field/method/varWithInit.jav rename to testData/ast/field/method/varWithInit.jav diff --git a/testData/field/method/varWithInit.kt b/testData/ast/field/method/varWithInit.kt similarity index 100% rename from testData/field/method/varWithInit.kt rename to testData/ast/field/method/varWithInit.kt diff --git a/testData/field/method/varWithoutInit.jav b/testData/ast/field/method/varWithoutInit.jav similarity index 100% rename from testData/field/method/varWithoutInit.jav rename to testData/ast/field/method/varWithoutInit.jav diff --git a/testData/field/method/varWithoutInit.kt b/testData/ast/field/method/varWithoutInit.kt similarity index 100% rename from testData/field/method/varWithoutInit.kt rename to testData/ast/field/method/varWithoutInit.kt diff --git a/testData/file_/file/packageWithClass.jav b/testData/ast/file_/file/packageWithClass.jav similarity index 100% rename from testData/file_/file/packageWithClass.jav rename to testData/ast/file_/file/packageWithClass.jav diff --git a/testData/file_/file/packageWithClass.kt b/testData/ast/file_/file/packageWithClass.kt similarity index 100% rename from testData/file_/file/packageWithClass.kt rename to testData/ast/file_/file/packageWithClass.kt diff --git a/testData/file_/file/packageWithClasses.jav b/testData/ast/file_/file/packageWithClasses.jav similarity index 100% rename from testData/file_/file/packageWithClasses.jav rename to testData/ast/file_/file/packageWithClasses.jav diff --git a/testData/file_/file/packageWithClasses.kt b/testData/ast/file_/file/packageWithClasses.kt similarity index 100% rename from testData/file_/file/packageWithClasses.kt rename to testData/ast/file_/file/packageWithClasses.kt diff --git a/testData/file_/file/packageWithOpenClass.jav b/testData/ast/file_/file/packageWithOpenClass.jav similarity index 100% rename from testData/file_/file/packageWithOpenClass.jav rename to testData/ast/file_/file/packageWithOpenClass.jav diff --git a/testData/file_/file/packageWithOpenClass.kt b/testData/ast/file_/file/packageWithOpenClass.kt similarity index 100% rename from testData/file_/file/packageWithOpenClass.kt rename to testData/ast/file_/file/packageWithOpenClass.kt diff --git a/testData/file_/file_mult/packageWithImports.jav b/testData/ast/file_/file_mult/packageWithImports.jav similarity index 100% rename from testData/file_/file_mult/packageWithImports.jav rename to testData/ast/file_/file_mult/packageWithImports.jav diff --git a/testData/file_/file_mult/packageWithImports.kt b/testData/ast/file_/file_mult/packageWithImports.kt similarity index 100% rename from testData/file_/file_mult/packageWithImports.kt rename to testData/ast/file_/file_mult/packageWithImports.kt diff --git a/testData/file_/file_mult/packageWithMixedImports.jav b/testData/ast/file_/file_mult/packageWithMixedImports.jav similarity index 100% rename from testData/file_/file_mult/packageWithMixedImports.jav rename to testData/ast/file_/file_mult/packageWithMixedImports.jav diff --git a/testData/file_/file_mult/packageWithMixedImports.kt b/testData/ast/file_/file_mult/packageWithMixedImports.kt similarity index 100% rename from testData/file_/file_mult/packageWithMixedImports.kt rename to testData/ast/file_/file_mult/packageWithMixedImports.kt diff --git a/testData/file_/file_mult/packageWithStaticImports.jav b/testData/ast/file_/file_mult/packageWithStaticImports.jav similarity index 100% rename from testData/file_/file_mult/packageWithStaticImports.jav rename to testData/ast/file_/file_mult/packageWithStaticImports.jav diff --git a/testData/file_/file_mult/packageWithStaticImports.kt b/testData/ast/file_/file_mult/packageWithStaticImports.kt similarity index 100% rename from testData/file_/file_mult/packageWithStaticImports.kt rename to testData/ast/file_/file_mult/packageWithStaticImports.kt diff --git a/testData/for/statement_mult/commonCaseForTest.jav b/testData/ast/for/statement_mult/commonCaseForTest.jav similarity index 100% rename from testData/for/statement_mult/commonCaseForTest.jav rename to testData/ast/for/statement_mult/commonCaseForTest.jav diff --git a/testData/for/statement_mult/commonCaseForTest.kt b/testData/ast/for/statement_mult/commonCaseForTest.kt similarity index 100% rename from testData/for/statement_mult/commonCaseForTest.kt rename to testData/ast/for/statement_mult/commonCaseForTest.kt diff --git a/testData/for/statement_mult/forWithBlock.jav b/testData/ast/for/statement_mult/forWithBlock.jav similarity index 100% rename from testData/for/statement_mult/forWithBlock.jav rename to testData/ast/for/statement_mult/forWithBlock.jav diff --git a/testData/for/statement_mult/forWithBlock.kt b/testData/ast/for/statement_mult/forWithBlock.kt similarity index 100% rename from testData/for/statement_mult/forWithBlock.kt rename to testData/ast/for/statement_mult/forWithBlock.kt diff --git a/testData/for/statement_mult/forWithBlockAndDoubleUpdate.jav b/testData/ast/for/statement_mult/forWithBlockAndDoubleUpdate.jav similarity index 100% rename from testData/for/statement_mult/forWithBlockAndDoubleUpdate.jav rename to testData/ast/for/statement_mult/forWithBlockAndDoubleUpdate.jav diff --git a/testData/for/statement_mult/forWithBlockAndDoubleUpdate.kt b/testData/ast/for/statement_mult/forWithBlockAndDoubleUpdate.kt similarity index 100% rename from testData/for/statement_mult/forWithBlockAndDoubleUpdate.kt rename to testData/ast/for/statement_mult/forWithBlockAndDoubleUpdate.kt diff --git a/testData/for/statement_mult/forWithEmptyBlock.jav b/testData/ast/for/statement_mult/forWithEmptyBlock.jav similarity index 100% rename from testData/for/statement_mult/forWithEmptyBlock.jav rename to testData/ast/for/statement_mult/forWithEmptyBlock.jav diff --git a/testData/for/statement_mult/forWithEmptyBlock.kt b/testData/ast/for/statement_mult/forWithEmptyBlock.kt similarity index 100% rename from testData/for/statement_mult/forWithEmptyBlock.kt rename to testData/ast/for/statement_mult/forWithEmptyBlock.kt diff --git a/testData/for/statement_mult/forWithExpression.jav b/testData/ast/for/statement_mult/forWithExpression.jav similarity index 100% rename from testData/for/statement_mult/forWithExpression.jav rename to testData/ast/for/statement_mult/forWithExpression.jav diff --git a/testData/for/statement_mult/forWithExpression.kt b/testData/ast/for/statement_mult/forWithExpression.kt similarity index 100% rename from testData/for/statement_mult/forWithExpression.kt rename to testData/ast/for/statement_mult/forWithExpression.kt diff --git a/testData/for/statement_mult/forWithReturn.jav b/testData/ast/for/statement_mult/forWithReturn.jav similarity index 100% rename from testData/for/statement_mult/forWithReturn.jav rename to testData/ast/for/statement_mult/forWithReturn.jav diff --git a/testData/for/statement_mult/forWithReturn.kt b/testData/ast/for/statement_mult/forWithReturn.kt similarity index 100% rename from testData/for/statement_mult/forWithReturn.kt rename to testData/ast/for/statement_mult/forWithReturn.kt diff --git a/testData/foreachStatement/statement_mult/enhancedForWithBlock.jav b/testData/ast/foreachStatement/statement_mult/enhancedForWithBlock.jav similarity index 100% rename from testData/foreachStatement/statement_mult/enhancedForWithBlock.jav rename to testData/ast/foreachStatement/statement_mult/enhancedForWithBlock.jav diff --git a/testData/foreachStatement/statement_mult/enhancedForWithBlock.kt b/testData/ast/foreachStatement/statement_mult/enhancedForWithBlock.kt similarity index 100% rename from testData/foreachStatement/statement_mult/enhancedForWithBlock.kt rename to testData/ast/foreachStatement/statement_mult/enhancedForWithBlock.kt diff --git a/testData/foreachStatement/statement_mult/enhancedForWithEmptyBlock.jav b/testData/ast/foreachStatement/statement_mult/enhancedForWithEmptyBlock.jav similarity index 100% rename from testData/foreachStatement/statement_mult/enhancedForWithEmptyBlock.jav rename to testData/ast/foreachStatement/statement_mult/enhancedForWithEmptyBlock.jav diff --git a/testData/foreachStatement/statement_mult/enhancedForWithEmptyBlock.kt b/testData/ast/foreachStatement/statement_mult/enhancedForWithEmptyBlock.kt similarity index 100% rename from testData/foreachStatement/statement_mult/enhancedForWithEmptyBlock.kt rename to testData/ast/foreachStatement/statement_mult/enhancedForWithEmptyBlock.kt diff --git a/testData/foreachStatement/statement_mult/enhancedForWithExpression.jav b/testData/ast/foreachStatement/statement_mult/enhancedForWithExpression.jav similarity index 100% rename from testData/foreachStatement/statement_mult/enhancedForWithExpression.jav rename to testData/ast/foreachStatement/statement_mult/enhancedForWithExpression.jav diff --git a/testData/foreachStatement/statement_mult/enhancedForWithExpression.kt b/testData/ast/foreachStatement/statement_mult/enhancedForWithExpression.kt similarity index 100% rename from testData/foreachStatement/statement_mult/enhancedForWithExpression.kt rename to testData/ast/foreachStatement/statement_mult/enhancedForWithExpression.kt diff --git a/testData/foreachStatement/statement_mult/enhancedForWithReturn.jav b/testData/ast/foreachStatement/statement_mult/enhancedForWithReturn.jav similarity index 100% rename from testData/foreachStatement/statement_mult/enhancedForWithReturn.jav rename to testData/ast/foreachStatement/statement_mult/enhancedForWithReturn.jav diff --git a/testData/foreachStatement/statement_mult/enhancedForWithReturn.kt b/testData/ast/foreachStatement/statement_mult/enhancedForWithReturn.kt similarity index 100% rename from testData/foreachStatement/statement_mult/enhancedForWithReturn.kt rename to testData/ast/foreachStatement/statement_mult/enhancedForWithReturn.kt diff --git a/testData/function/file/override.jav b/testData/ast/function/file/override.jav similarity index 100% rename from testData/function/file/override.jav rename to testData/ast/function/file/override.jav diff --git a/testData/function/file/override.kt b/testData/ast/function/file/override.kt similarity index 100% rename from testData/function/file/override.kt rename to testData/ast/function/file/override.kt diff --git a/testData/function/method/classGenericParam.jav b/testData/ast/function/method/classGenericParam.jav similarity index 100% rename from testData/function/method/classGenericParam.jav rename to testData/ast/function/method/classGenericParam.jav diff --git a/testData/function/method/classGenericParam.kt b/testData/ast/function/method/classGenericParam.kt similarity index 100% rename from testData/function/method/classGenericParam.kt rename to testData/ast/function/method/classGenericParam.kt diff --git a/testData/function/method/emptyVoidMethod.jav b/testData/ast/function/method/emptyVoidMethod.jav similarity index 100% rename from testData/function/method/emptyVoidMethod.jav rename to testData/ast/function/method/emptyVoidMethod.jav diff --git a/testData/function/method/emptyVoidMethod.kt b/testData/ast/function/method/emptyVoidMethod.kt similarity index 100% rename from testData/function/method/emptyVoidMethod.kt rename to testData/ast/function/method/emptyVoidMethod.kt diff --git a/testData/function/method/internal.jav b/testData/ast/function/method/internal.jav similarity index 100% rename from testData/function/method/internal.jav rename to testData/ast/function/method/internal.jav diff --git a/testData/function/method/internal.kt b/testData/ast/function/method/internal.kt similarity index 100% rename from testData/function/method/internal.kt rename to testData/ast/function/method/internal.kt diff --git a/testData/function/method/methodClassType.jav b/testData/ast/function/method/methodClassType.jav similarity index 100% rename from testData/function/method/methodClassType.jav rename to testData/ast/function/method/methodClassType.jav diff --git a/testData/function/method/methodClassType.kt b/testData/ast/function/method/methodClassType.kt similarity index 100% rename from testData/function/method/methodClassType.kt rename to testData/ast/function/method/methodClassType.kt diff --git a/testData/function/method/methodPrimitiveType.jav b/testData/ast/function/method/methodPrimitiveType.jav similarity index 100% rename from testData/function/method/methodPrimitiveType.jav rename to testData/ast/function/method/methodPrimitiveType.jav diff --git a/testData/function/method/methodPrimitiveType.kt b/testData/ast/function/method/methodPrimitiveType.kt similarity index 100% rename from testData/function/method/methodPrimitiveType.kt rename to testData/ast/function/method/methodPrimitiveType.kt diff --git a/testData/function/method/methodPrimitiveType2.jav b/testData/ast/function/method/methodPrimitiveType2.jav similarity index 100% rename from testData/function/method/methodPrimitiveType2.jav rename to testData/ast/function/method/methodPrimitiveType2.jav diff --git a/testData/function/method/methodPrimitiveType2.kt b/testData/ast/function/method/methodPrimitiveType2.kt similarity index 100% rename from testData/function/method/methodPrimitiveType2.kt rename to testData/ast/function/method/methodPrimitiveType2.kt diff --git a/testData/function/method/methodWithReturnStatement.jav b/testData/ast/function/method/methodWithReturnStatement.jav similarity index 100% rename from testData/function/method/methodWithReturnStatement.jav rename to testData/ast/function/method/methodWithReturnStatement.jav diff --git a/testData/function/method/methodWithReturnStatement.kt b/testData/ast/function/method/methodWithReturnStatement.kt similarity index 100% rename from testData/function/method/methodWithReturnStatement.kt rename to testData/ast/function/method/methodWithReturnStatement.kt diff --git a/testData/function/method/ownGenericParam.jav b/testData/ast/function/method/ownGenericParam.jav similarity index 100% rename from testData/function/method/ownGenericParam.jav rename to testData/ast/function/method/ownGenericParam.jav diff --git a/testData/function/method/ownGenericParam.kt b/testData/ast/function/method/ownGenericParam.kt similarity index 100% rename from testData/function/method/ownGenericParam.kt rename to testData/ast/function/method/ownGenericParam.kt diff --git a/testData/function/method/ownSeveralGenericParams.jav b/testData/ast/function/method/ownSeveralGenericParams.jav similarity index 100% rename from testData/function/method/ownSeveralGenericParams.jav rename to testData/ast/function/method/ownSeveralGenericParams.jav diff --git a/testData/function/method/ownSeveralGenericParams.kt b/testData/ast/function/method/ownSeveralGenericParams.kt similarity index 100% rename from testData/function/method/ownSeveralGenericParams.kt rename to testData/ast/function/method/ownSeveralGenericParams.kt diff --git a/testData/function/method/private.jav b/testData/ast/function/method/private.jav similarity index 100% rename from testData/function/method/private.jav rename to testData/ast/function/method/private.jav diff --git a/testData/function/method/private.kt b/testData/ast/function/method/private.kt similarity index 100% rename from testData/function/method/private.kt rename to testData/ast/function/method/private.kt diff --git a/testData/function/method/protected.jav b/testData/ast/function/method/protected.jav similarity index 100% rename from testData/function/method/protected.jav rename to testData/ast/function/method/protected.jav diff --git a/testData/function/method/protected.kt b/testData/ast/function/method/protected.kt similarity index 100% rename from testData/function/method/protected.kt rename to testData/ast/function/method/protected.kt diff --git a/testData/function/method/public.jav b/testData/ast/function/method/public.jav similarity index 100% rename from testData/function/method/public.jav rename to testData/ast/function/method/public.jav diff --git a/testData/function/method/public.kt b/testData/ast/function/method/public.kt similarity index 100% rename from testData/function/method/public.kt rename to testData/ast/function/method/public.kt diff --git a/testData/ifStatement/statement_mult/ifStatementWithEmptyBlocks.jav b/testData/ast/ifStatement/statement_mult/ifStatementWithEmptyBlocks.jav similarity index 100% rename from testData/ifStatement/statement_mult/ifStatementWithEmptyBlocks.jav rename to testData/ast/ifStatement/statement_mult/ifStatementWithEmptyBlocks.jav diff --git a/testData/ifStatement/statement_mult/ifStatementWithEmptyBlocks.kt b/testData/ast/ifStatement/statement_mult/ifStatementWithEmptyBlocks.kt similarity index 100% rename from testData/ifStatement/statement_mult/ifStatementWithEmptyBlocks.kt rename to testData/ast/ifStatement/statement_mult/ifStatementWithEmptyBlocks.kt diff --git a/testData/ifStatement/statement_mult/ifStatementWithMultilineBlocks.jav b/testData/ast/ifStatement/statement_mult/ifStatementWithMultilineBlocks.jav similarity index 100% rename from testData/ifStatement/statement_mult/ifStatementWithMultilineBlocks.jav rename to testData/ast/ifStatement/statement_mult/ifStatementWithMultilineBlocks.jav diff --git a/testData/ifStatement/statement_mult/ifStatementWithMultilineBlocks.kt b/testData/ast/ifStatement/statement_mult/ifStatementWithMultilineBlocks.kt similarity index 100% rename from testData/ifStatement/statement_mult/ifStatementWithMultilineBlocks.kt rename to testData/ast/ifStatement/statement_mult/ifStatementWithMultilineBlocks.kt diff --git a/testData/ifStatement/statement_mult/ifStatementWithOneLineBlocks.jav b/testData/ast/ifStatement/statement_mult/ifStatementWithOneLineBlocks.jav similarity index 100% rename from testData/ifStatement/statement_mult/ifStatementWithOneLineBlocks.jav rename to testData/ast/ifStatement/statement_mult/ifStatementWithOneLineBlocks.jav diff --git a/testData/ifStatement/statement_mult/ifStatementWithOneLineBlocks.kt b/testData/ast/ifStatement/statement_mult/ifStatementWithOneLineBlocks.kt similarity index 100% rename from testData/ifStatement/statement_mult/ifStatementWithOneLineBlocks.kt rename to testData/ast/ifStatement/statement_mult/ifStatementWithOneLineBlocks.kt diff --git a/testData/ifStatement/statement_mult/ifStatementWithoutElse.jav b/testData/ast/ifStatement/statement_mult/ifStatementWithoutElse.jav similarity index 100% rename from testData/ifStatement/statement_mult/ifStatementWithoutElse.jav rename to testData/ast/ifStatement/statement_mult/ifStatementWithoutElse.jav diff --git a/testData/ifStatement/statement_mult/ifStatementWithoutElse.kt b/testData/ast/ifStatement/statement_mult/ifStatementWithoutElse.kt similarity index 100% rename from testData/ifStatement/statement_mult/ifStatementWithoutElse.kt rename to testData/ast/ifStatement/statement_mult/ifStatementWithoutElse.kt diff --git a/testData/inProjectionType/method/methodParams.jav b/testData/ast/inProjectionType/method/methodParams.jav similarity index 100% rename from testData/inProjectionType/method/methodParams.jav rename to testData/ast/inProjectionType/method/methodParams.jav diff --git a/testData/inProjectionType/method/methodParams.kt b/testData/ast/inProjectionType/method/methodParams.kt similarity index 100% rename from testData/inProjectionType/method/methodParams.kt rename to testData/ast/inProjectionType/method/methodParams.kt diff --git a/testData/isOperator/expression_mult/complicatedExpression.jav b/testData/ast/isOperator/expression_mult/complicatedExpression.jav similarity index 100% rename from testData/isOperator/expression_mult/complicatedExpression.jav rename to testData/ast/isOperator/expression_mult/complicatedExpression.jav diff --git a/testData/isOperator/expression_mult/complicatedExpression.kt b/testData/ast/isOperator/expression_mult/complicatedExpression.kt similarity index 100% rename from testData/isOperator/expression_mult/complicatedExpression.kt rename to testData/ast/isOperator/expression_mult/complicatedExpression.kt diff --git a/testData/isOperator/expression_mult/simpleReference.jav b/testData/ast/isOperator/expression_mult/simpleReference.jav similarity index 100% rename from testData/isOperator/expression_mult/simpleReference.jav rename to testData/ast/isOperator/expression_mult/simpleReference.jav diff --git a/testData/isOperator/expression_mult/simpleReference.kt b/testData/ast/isOperator/expression_mult/simpleReference.kt similarity index 100% rename from testData/isOperator/expression_mult/simpleReference.kt rename to testData/ast/isOperator/expression_mult/simpleReference.kt diff --git a/testData/labelStatement/statement_mult/complicatedExampleFromJavaTutorial.jav b/testData/ast/labelStatement/statement_mult/complicatedExampleFromJavaTutorial.jav similarity index 100% rename from testData/labelStatement/statement_mult/complicatedExampleFromJavaTutorial.jav rename to testData/ast/labelStatement/statement_mult/complicatedExampleFromJavaTutorial.jav diff --git a/testData/labelStatement/statement_mult/complicatedExampleFromJavaTutorial.kt b/testData/ast/labelStatement/statement_mult/complicatedExampleFromJavaTutorial.kt similarity index 100% rename from testData/labelStatement/statement_mult/complicatedExampleFromJavaTutorial.kt rename to testData/ast/labelStatement/statement_mult/complicatedExampleFromJavaTutorial.kt diff --git a/testData/localVariable/statement/object.jav b/testData/ast/localVariable/statement/object.jav similarity index 100% rename from testData/localVariable/statement/object.jav rename to testData/ast/localVariable/statement/object.jav diff --git a/testData/localVariable/statement/object.kt b/testData/ast/localVariable/statement/object.kt similarity index 100% rename from testData/localVariable/statement/object.kt rename to testData/ast/localVariable/statement/object.kt diff --git a/testData/methodCallExpression/statement/callWithKeywords.jav b/testData/ast/methodCallExpression/statement/callWithKeywords.jav similarity index 100% rename from testData/methodCallExpression/statement/callWithKeywords.jav rename to testData/ast/methodCallExpression/statement/callWithKeywords.jav diff --git a/testData/methodCallExpression/statement/callWithKeywords.kt b/testData/ast/methodCallExpression/statement/callWithKeywords.kt similarity index 100% rename from testData/methodCallExpression/statement/callWithKeywords.kt rename to testData/ast/methodCallExpression/statement/callWithKeywords.kt diff --git a/testData/methodCallExpression/statement/emptyCall.jav b/testData/ast/methodCallExpression/statement/emptyCall.jav similarity index 100% rename from testData/methodCallExpression/statement/emptyCall.jav rename to testData/ast/methodCallExpression/statement/emptyCall.jav diff --git a/testData/methodCallExpression/statement/emptyCall.kt b/testData/ast/methodCallExpression/statement/emptyCall.kt similarity index 100% rename from testData/methodCallExpression/statement/emptyCall.kt rename to testData/ast/methodCallExpression/statement/emptyCall.kt diff --git a/testData/methodCallExpression/statement/simpleCall.jav b/testData/ast/methodCallExpression/statement/simpleCall.jav similarity index 100% rename from testData/methodCallExpression/statement/simpleCall.jav rename to testData/ast/methodCallExpression/statement/simpleCall.jav diff --git a/testData/methodCallExpression/statement/simpleCall.kt b/testData/ast/methodCallExpression/statement/simpleCall.kt similarity index 100% rename from testData/methodCallExpression/statement/simpleCall.kt rename to testData/ast/methodCallExpression/statement/simpleCall.kt diff --git a/testData/newClassExpression/expression/classWithParam.jav b/testData/ast/newClassExpression/expression/classWithParam.jav similarity index 100% rename from testData/newClassExpression/expression/classWithParam.jav rename to testData/ast/newClassExpression/expression/classWithParam.jav diff --git a/testData/newClassExpression/expression/classWithParam.kt b/testData/ast/newClassExpression/expression/classWithParam.kt similarity index 100% rename from testData/newClassExpression/expression/classWithParam.kt rename to testData/ast/newClassExpression/expression/classWithParam.kt diff --git a/testData/newClassExpression/expression/classWithParams.jav b/testData/ast/newClassExpression/expression/classWithParams.jav similarity index 100% rename from testData/newClassExpression/expression/classWithParams.jav rename to testData/ast/newClassExpression/expression/classWithParams.jav diff --git a/testData/newClassExpression/expression/classWithParams.kt b/testData/ast/newClassExpression/expression/classWithParams.kt similarity index 100% rename from testData/newClassExpression/expression/classWithParams.kt rename to testData/ast/newClassExpression/expression/classWithParams.kt diff --git a/testData/newClassExpression/expression/classWithoutBody.jav b/testData/ast/newClassExpression/expression/classWithoutBody.jav similarity index 100% rename from testData/newClassExpression/expression/classWithoutBody.jav rename to testData/ast/newClassExpression/expression/classWithoutBody.jav diff --git a/testData/newClassExpression/expression/classWithoutBody.kt b/testData/ast/newClassExpression/expression/classWithoutBody.kt similarity index 100% rename from testData/newClassExpression/expression/classWithoutBody.kt rename to testData/ast/newClassExpression/expression/classWithoutBody.kt diff --git a/testData/newClassExpression/expression/classWithoutBody2.jav b/testData/ast/newClassExpression/expression/classWithoutBody2.jav similarity index 100% rename from testData/newClassExpression/expression/classWithoutBody2.jav rename to testData/ast/newClassExpression/expression/classWithoutBody2.jav diff --git a/testData/newClassExpression/expression/classWithoutBody2.kt b/testData/ast/newClassExpression/expression/classWithoutBody2.kt similarity index 100% rename from testData/newClassExpression/expression/classWithoutBody2.kt rename to testData/ast/newClassExpression/expression/classWithoutBody2.kt diff --git a/testData/outProjectionType/method/methodParams.jav b/testData/ast/outProjectionType/method/methodParams.jav similarity index 100% rename from testData/outProjectionType/method/methodParams.jav rename to testData/ast/outProjectionType/method/methodParams.jav diff --git a/testData/outProjectionType/method/methodParams.kt b/testData/ast/outProjectionType/method/methodParams.kt similarity index 100% rename from testData/outProjectionType/method/methodParams.kt rename to testData/ast/outProjectionType/method/methodParams.kt diff --git a/testData/parenthesizedExpression/expression/parenthesized.jav b/testData/ast/parenthesizedExpression/expression/parenthesized.jav similarity index 100% rename from testData/parenthesizedExpression/expression/parenthesized.jav rename to testData/ast/parenthesizedExpression/expression/parenthesized.jav diff --git a/testData/parenthesizedExpression/expression/parenthesized.kt b/testData/ast/parenthesizedExpression/expression/parenthesized.kt similarity index 100% rename from testData/parenthesizedExpression/expression/parenthesized.kt rename to testData/ast/parenthesizedExpression/expression/parenthesized.kt diff --git a/testData/parenthesizedExpression/expression/parenthesized2.jav b/testData/ast/parenthesizedExpression/expression/parenthesized2.jav similarity index 100% rename from testData/parenthesizedExpression/expression/parenthesized2.jav rename to testData/ast/parenthesizedExpression/expression/parenthesized2.jav diff --git a/testData/parenthesizedExpression/expression/parenthesized2.kt b/testData/ast/parenthesizedExpression/expression/parenthesized2.kt similarity index 100% rename from testData/parenthesizedExpression/expression/parenthesized2.kt rename to testData/ast/parenthesizedExpression/expression/parenthesized2.kt diff --git a/testData/polyadicExpression/expression_mult/divide.jav b/testData/ast/polyadicExpression/expression_mult/divide.jav similarity index 100% rename from testData/polyadicExpression/expression_mult/divide.jav rename to testData/ast/polyadicExpression/expression_mult/divide.jav diff --git a/testData/polyadicExpression/expression_mult/divide.kt b/testData/ast/polyadicExpression/expression_mult/divide.kt similarity index 100% rename from testData/polyadicExpression/expression_mult/divide.kt rename to testData/ast/polyadicExpression/expression_mult/divide.kt diff --git a/testData/polyadicExpression/expression_mult/minus.jav b/testData/ast/polyadicExpression/expression_mult/minus.jav similarity index 100% rename from testData/polyadicExpression/expression_mult/minus.jav rename to testData/ast/polyadicExpression/expression_mult/minus.jav diff --git a/testData/polyadicExpression/expression_mult/minus.kt b/testData/ast/polyadicExpression/expression_mult/minus.kt similarity index 100% rename from testData/polyadicExpression/expression_mult/minus.kt rename to testData/ast/polyadicExpression/expression_mult/minus.kt diff --git a/testData/polyadicExpression/expression_mult/multiply.jav b/testData/ast/polyadicExpression/expression_mult/multiply.jav similarity index 100% rename from testData/polyadicExpression/expression_mult/multiply.jav rename to testData/ast/polyadicExpression/expression_mult/multiply.jav diff --git a/testData/polyadicExpression/expression_mult/multiply.kt b/testData/ast/polyadicExpression/expression_mult/multiply.kt similarity index 100% rename from testData/polyadicExpression/expression_mult/multiply.kt rename to testData/ast/polyadicExpression/expression_mult/multiply.kt diff --git a/testData/polyadicExpression/expression_mult/plus.jav b/testData/ast/polyadicExpression/expression_mult/plus.jav similarity index 100% rename from testData/polyadicExpression/expression_mult/plus.jav rename to testData/ast/polyadicExpression/expression_mult/plus.jav diff --git a/testData/polyadicExpression/expression_mult/plus.kt b/testData/ast/polyadicExpression/expression_mult/plus.kt similarity index 100% rename from testData/polyadicExpression/expression_mult/plus.kt rename to testData/ast/polyadicExpression/expression_mult/plus.kt diff --git a/testData/polyadicExpression/expression_mult/remainder.jav b/testData/ast/polyadicExpression/expression_mult/remainder.jav similarity index 100% rename from testData/polyadicExpression/expression_mult/remainder.jav rename to testData/ast/polyadicExpression/expression_mult/remainder.jav diff --git a/testData/polyadicExpression/expression_mult/remainder.kt b/testData/ast/polyadicExpression/expression_mult/remainder.kt similarity index 100% rename from testData/polyadicExpression/expression_mult/remainder.kt rename to testData/ast/polyadicExpression/expression_mult/remainder.kt diff --git a/testData/postfixOperator/statement_mult/decrement.jav b/testData/ast/postfixOperator/statement_mult/decrement.jav similarity index 100% rename from testData/postfixOperator/statement_mult/decrement.jav rename to testData/ast/postfixOperator/statement_mult/decrement.jav diff --git a/testData/postfixOperator/statement_mult/decrement.kt b/testData/ast/postfixOperator/statement_mult/decrement.kt similarity index 100% rename from testData/postfixOperator/statement_mult/decrement.kt rename to testData/ast/postfixOperator/statement_mult/decrement.kt diff --git a/testData/postfixOperator/statement_mult/increment.jav b/testData/ast/postfixOperator/statement_mult/increment.jav similarity index 100% rename from testData/postfixOperator/statement_mult/increment.jav rename to testData/ast/postfixOperator/statement_mult/increment.jav diff --git a/testData/postfixOperator/statement_mult/increment.kt b/testData/ast/postfixOperator/statement_mult/increment.kt similarity index 100% rename from testData/postfixOperator/statement_mult/increment.kt rename to testData/ast/postfixOperator/statement_mult/increment.kt diff --git a/testData/prefixOperator/statement_mult/decrement.jav b/testData/ast/prefixOperator/statement_mult/decrement.jav similarity index 100% rename from testData/prefixOperator/statement_mult/decrement.jav rename to testData/ast/prefixOperator/statement_mult/decrement.jav diff --git a/testData/prefixOperator/statement_mult/decrement.kt b/testData/ast/prefixOperator/statement_mult/decrement.kt similarity index 100% rename from testData/prefixOperator/statement_mult/decrement.kt rename to testData/ast/prefixOperator/statement_mult/decrement.kt diff --git a/testData/prefixOperator/statement_mult/increment.jav b/testData/ast/prefixOperator/statement_mult/increment.jav similarity index 100% rename from testData/prefixOperator/statement_mult/increment.jav rename to testData/ast/prefixOperator/statement_mult/increment.jav diff --git a/testData/prefixOperator/statement_mult/increment.kt b/testData/ast/prefixOperator/statement_mult/increment.kt similarity index 100% rename from testData/prefixOperator/statement_mult/increment.kt rename to testData/ast/prefixOperator/statement_mult/increment.kt diff --git a/testData/returnStatement/statement/returnChar.jav b/testData/ast/returnStatement/statement/returnChar.jav similarity index 100% rename from testData/returnStatement/statement/returnChar.jav rename to testData/ast/returnStatement/statement/returnChar.jav diff --git a/testData/returnStatement/statement/returnChar.kt b/testData/ast/returnStatement/statement/returnChar.kt similarity index 100% rename from testData/returnStatement/statement/returnChar.kt rename to testData/ast/returnStatement/statement/returnChar.kt diff --git a/testData/returnStatement/statement/returnLiteral.jav b/testData/ast/returnStatement/statement/returnLiteral.jav similarity index 100% rename from testData/returnStatement/statement/returnLiteral.jav rename to testData/ast/returnStatement/statement/returnLiteral.jav diff --git a/testData/returnStatement/statement/returnLiteral.kt b/testData/ast/returnStatement/statement/returnLiteral.kt similarity index 100% rename from testData/returnStatement/statement/returnLiteral.kt rename to testData/ast/returnStatement/statement/returnLiteral.kt diff --git a/testData/returnStatement/statement/returnNumber.jav b/testData/ast/returnStatement/statement/returnNumber.jav similarity index 100% rename from testData/returnStatement/statement/returnNumber.jav rename to testData/ast/returnStatement/statement/returnNumber.jav diff --git a/testData/returnStatement/statement/returnNumber.kt b/testData/ast/returnStatement/statement/returnNumber.kt similarity index 100% rename from testData/returnStatement/statement/returnNumber.kt rename to testData/ast/returnStatement/statement/returnNumber.kt diff --git a/testData/returnStatement/statement/returnString.jav b/testData/ast/returnStatement/statement/returnString.jav similarity index 100% rename from testData/returnStatement/statement/returnString.jav rename to testData/ast/returnStatement/statement/returnString.jav diff --git a/testData/returnStatement/statement/returnString.kt b/testData/ast/returnStatement/statement/returnString.kt similarity index 100% rename from testData/returnStatement/statement/returnString.kt rename to testData/ast/returnStatement/statement/returnString.kt diff --git a/testData/starProjectionType/method/methodParams.jav b/testData/ast/starProjectionType/method/methodParams.jav similarity index 100% rename from testData/starProjectionType/method/methodParams.jav rename to testData/ast/starProjectionType/method/methodParams.jav diff --git a/testData/starProjectionType/method/methodParams.kt b/testData/ast/starProjectionType/method/methodParams.kt similarity index 100% rename from testData/starProjectionType/method/methodParams.kt rename to testData/ast/starProjectionType/method/methodParams.kt diff --git a/testData/synchronizedStatement/statement/singleLineExample.jav b/testData/ast/synchronizedStatement/statement/singleLineExample.jav similarity index 100% rename from testData/synchronizedStatement/statement/singleLineExample.jav rename to testData/ast/synchronizedStatement/statement/singleLineExample.jav diff --git a/testData/synchronizedStatement/statement/singleLineExample.kt b/testData/ast/synchronizedStatement/statement/singleLineExample.kt similarity index 100% rename from testData/synchronizedStatement/statement/singleLineExample.kt rename to testData/ast/synchronizedStatement/statement/singleLineExample.kt diff --git a/testData/throwStatement/statement/simpleThrowStatement.jav b/testData/ast/throwStatement/statement/simpleThrowStatement.jav similarity index 100% rename from testData/throwStatement/statement/simpleThrowStatement.jav rename to testData/ast/throwStatement/statement/simpleThrowStatement.jav diff --git a/testData/throwStatement/statement/simpleThrowStatement.kt b/testData/ast/throwStatement/statement/simpleThrowStatement.kt similarity index 100% rename from testData/throwStatement/statement/simpleThrowStatement.kt rename to testData/ast/throwStatement/statement/simpleThrowStatement.kt diff --git a/testData/trait/class/emptyInterface.jav b/testData/ast/trait/class/emptyInterface.jav similarity index 100% rename from testData/trait/class/emptyInterface.jav rename to testData/ast/trait/class/emptyInterface.jav diff --git a/testData/trait/class/emptyInterface.kt b/testData/ast/trait/class/emptyInterface.kt similarity index 100% rename from testData/trait/class/emptyInterface.kt rename to testData/ast/trait/class/emptyInterface.kt diff --git a/testData/trait/class/extendsOneClassAndImplementsSeveralInterfaces.jav b/testData/ast/trait/class/extendsOneClassAndImplementsSeveralInterfaces.jav similarity index 100% rename from testData/trait/class/extendsOneClassAndImplementsSeveralInterfaces.jav rename to testData/ast/trait/class/extendsOneClassAndImplementsSeveralInterfaces.jav diff --git a/testData/trait/class/extendsOneClassAndImplementsSeveralInterfaces.kt b/testData/ast/trait/class/extendsOneClassAndImplementsSeveralInterfaces.kt similarity index 100% rename from testData/trait/class/extendsOneClassAndImplementsSeveralInterfaces.kt rename to testData/ast/trait/class/extendsOneClassAndImplementsSeveralInterfaces.kt diff --git a/testData/trait/class/extendsOneInterface.jav b/testData/ast/trait/class/extendsOneInterface.jav similarity index 100% rename from testData/trait/class/extendsOneInterface.jav rename to testData/ast/trait/class/extendsOneInterface.jav diff --git a/testData/trait/class/extendsOneInterface.kt b/testData/ast/trait/class/extendsOneInterface.kt similarity index 100% rename from testData/trait/class/extendsOneInterface.kt rename to testData/ast/trait/class/extendsOneInterface.kt diff --git a/testData/trait/class/internalInterface.jav b/testData/ast/trait/class/internalInterface.jav similarity index 100% rename from testData/trait/class/internalInterface.jav rename to testData/ast/trait/class/internalInterface.jav diff --git a/testData/trait/class/internalInterface.kt b/testData/ast/trait/class/internalInterface.kt similarity index 100% rename from testData/trait/class/internalInterface.kt rename to testData/ast/trait/class/internalInterface.kt diff --git a/testData/trait/class/privateInterface.jav b/testData/ast/trait/class/privateInterface.jav similarity index 100% rename from testData/trait/class/privateInterface.jav rename to testData/ast/trait/class/privateInterface.jav diff --git a/testData/trait/class/privateInterface.kt b/testData/ast/trait/class/privateInterface.kt similarity index 100% rename from testData/trait/class/privateInterface.kt rename to testData/ast/trait/class/privateInterface.kt diff --git a/testData/trait/class/protectedInterface.jav b/testData/ast/trait/class/protectedInterface.jav similarity index 100% rename from testData/trait/class/protectedInterface.jav rename to testData/ast/trait/class/protectedInterface.jav diff --git a/testData/trait/class/protectedInterface.kt b/testData/ast/trait/class/protectedInterface.kt similarity index 100% rename from testData/trait/class/protectedInterface.kt rename to testData/ast/trait/class/protectedInterface.kt diff --git a/testData/trait/class/publicInterface.jav b/testData/ast/trait/class/publicInterface.jav similarity index 100% rename from testData/trait/class/publicInterface.jav rename to testData/ast/trait/class/publicInterface.jav diff --git a/testData/trait/class/publicInterface.kt b/testData/ast/trait/class/publicInterface.kt similarity index 100% rename from testData/trait/class/publicInterface.kt rename to testData/ast/trait/class/publicInterface.kt diff --git a/testData/trait/class_mult/interfaceWithFields.jav b/testData/ast/trait/class_mult/interfaceWithFields.jav similarity index 100% rename from testData/trait/class_mult/interfaceWithFields.jav rename to testData/ast/trait/class_mult/interfaceWithFields.jav diff --git a/testData/trait/class_mult/interfaceWithFields.kt b/testData/ast/trait/class_mult/interfaceWithFields.kt similarity index 100% rename from testData/trait/class_mult/interfaceWithFields.kt rename to testData/ast/trait/class_mult/interfaceWithFields.kt diff --git a/testData/trait/class_mult/interfaceWithMethodDeclaration.jav b/testData/ast/trait/class_mult/interfaceWithMethodDeclaration.jav similarity index 100% rename from testData/trait/class_mult/interfaceWithMethodDeclaration.jav rename to testData/ast/trait/class_mult/interfaceWithMethodDeclaration.jav diff --git a/testData/trait/class_mult/interfaceWithMethodDeclaration.kt b/testData/ast/trait/class_mult/interfaceWithMethodDeclaration.kt similarity index 100% rename from testData/trait/class_mult/interfaceWithMethodDeclaration.kt rename to testData/ast/trait/class_mult/interfaceWithMethodDeclaration.kt diff --git a/testData/trait/class_mult/interfaceWithStaticFields.jav b/testData/ast/trait/class_mult/interfaceWithStaticFields.jav similarity index 100% rename from testData/trait/class_mult/interfaceWithStaticFields.jav rename to testData/ast/trait/class_mult/interfaceWithStaticFields.jav diff --git a/testData/trait/class_mult/interfaceWithStaticFields.kt b/testData/ast/trait/class_mult/interfaceWithStaticFields.kt similarity index 100% rename from testData/trait/class_mult/interfaceWithStaticFields.kt rename to testData/ast/trait/class_mult/interfaceWithStaticFields.kt diff --git a/testData/tryStatement/statement_mult/commonCaseForTryStatement.jav b/testData/ast/tryStatement/statement_mult/commonCaseForTryStatement.jav similarity index 100% rename from testData/tryStatement/statement_mult/commonCaseForTryStatement.jav rename to testData/ast/tryStatement/statement_mult/commonCaseForTryStatement.jav diff --git a/testData/tryStatement/statement_mult/commonCaseForTryStatement.kt b/testData/ast/tryStatement/statement_mult/commonCaseForTryStatement.kt similarity index 100% rename from testData/tryStatement/statement_mult/commonCaseForTryStatement.kt rename to testData/ast/tryStatement/statement_mult/commonCaseForTryStatement.kt diff --git a/testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithEmptyFinally.jav b/testData/ast/tryStatement/statement_mult/emptyTryWithTwoCatchesWithEmptyFinally.jav similarity index 100% rename from testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithEmptyFinally.jav rename to testData/ast/tryStatement/statement_mult/emptyTryWithTwoCatchesWithEmptyFinally.jav diff --git a/testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithEmptyFinally.kt b/testData/ast/tryStatement/statement_mult/emptyTryWithTwoCatchesWithEmptyFinally.kt similarity index 100% rename from testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithEmptyFinally.kt rename to testData/ast/tryStatement/statement_mult/emptyTryWithTwoCatchesWithEmptyFinally.kt diff --git a/testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithFinally.jav b/testData/ast/tryStatement/statement_mult/emptyTryWithTwoCatchesWithFinally.jav similarity index 100% rename from testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithFinally.jav rename to testData/ast/tryStatement/statement_mult/emptyTryWithTwoCatchesWithFinally.jav diff --git a/testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithFinally.kt b/testData/ast/tryStatement/statement_mult/emptyTryWithTwoCatchesWithFinally.kt similarity index 100% rename from testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithFinally.kt rename to testData/ast/tryStatement/statement_mult/emptyTryWithTwoCatchesWithFinally.kt diff --git a/testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithoutFinally.jav b/testData/ast/tryStatement/statement_mult/emptyTryWithTwoCatchesWithoutFinally.jav similarity index 100% rename from testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithoutFinally.jav rename to testData/ast/tryStatement/statement_mult/emptyTryWithTwoCatchesWithoutFinally.jav diff --git a/testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithoutFinally.kt b/testData/ast/tryStatement/statement_mult/emptyTryWithTwoCatchesWithoutFinally.kt similarity index 100% rename from testData/tryStatement/statement_mult/emptyTryWithTwoCatchesWithoutFinally.kt rename to testData/ast/tryStatement/statement_mult/emptyTryWithTwoCatchesWithoutFinally.kt diff --git a/testData/typeCastExpression/expression_mult/extendsWildcardCast.jav b/testData/ast/typeCastExpression/expression_mult/extendsWildcardCast.jav similarity index 100% rename from testData/typeCastExpression/expression_mult/extendsWildcardCast.jav rename to testData/ast/typeCastExpression/expression_mult/extendsWildcardCast.jav diff --git a/testData/typeCastExpression/expression_mult/extendsWildcardCast.kt b/testData/ast/typeCastExpression/expression_mult/extendsWildcardCast.kt similarity index 100% rename from testData/typeCastExpression/expression_mult/extendsWildcardCast.kt rename to testData/ast/typeCastExpression/expression_mult/extendsWildcardCast.kt diff --git a/testData/typeCastExpression/expression_mult/fooCast.jav b/testData/ast/typeCastExpression/expression_mult/fooCast.jav similarity index 100% rename from testData/typeCastExpression/expression_mult/fooCast.jav rename to testData/ast/typeCastExpression/expression_mult/fooCast.jav diff --git a/testData/typeCastExpression/expression_mult/fooCast.kt b/testData/ast/typeCastExpression/expression_mult/fooCast.kt similarity index 100% rename from testData/typeCastExpression/expression_mult/fooCast.kt rename to testData/ast/typeCastExpression/expression_mult/fooCast.kt diff --git a/testData/typeCastExpression/expression_mult/intCast.jav b/testData/ast/typeCastExpression/expression_mult/intCast.jav similarity index 100% rename from testData/typeCastExpression/expression_mult/intCast.jav rename to testData/ast/typeCastExpression/expression_mult/intCast.jav diff --git a/testData/typeCastExpression/expression_mult/intCast.kt b/testData/ast/typeCastExpression/expression_mult/intCast.kt similarity index 100% rename from testData/typeCastExpression/expression_mult/intCast.kt rename to testData/ast/typeCastExpression/expression_mult/intCast.kt diff --git a/testData/typeCastExpression/expression_mult/primitiveType.jav b/testData/ast/typeCastExpression/expression_mult/primitiveType.jav similarity index 100% rename from testData/typeCastExpression/expression_mult/primitiveType.jav rename to testData/ast/typeCastExpression/expression_mult/primitiveType.jav diff --git a/testData/typeCastExpression/expression_mult/primitiveType.kt b/testData/ast/typeCastExpression/expression_mult/primitiveType.kt similarity index 100% rename from testData/typeCastExpression/expression_mult/primitiveType.kt rename to testData/ast/typeCastExpression/expression_mult/primitiveType.kt diff --git a/testData/typeCastExpression/expression_mult/simpleGenericCast.jav b/testData/ast/typeCastExpression/expression_mult/simpleGenericCast.jav similarity index 100% rename from testData/typeCastExpression/expression_mult/simpleGenericCast.jav rename to testData/ast/typeCastExpression/expression_mult/simpleGenericCast.jav diff --git a/testData/typeCastExpression/expression_mult/simpleGenericCast.kt b/testData/ast/typeCastExpression/expression_mult/simpleGenericCast.kt similarity index 100% rename from testData/typeCastExpression/expression_mult/simpleGenericCast.kt rename to testData/ast/typeCastExpression/expression_mult/simpleGenericCast.kt diff --git a/testData/typeCastExpression/expression_mult/stringCast.jav b/testData/ast/typeCastExpression/expression_mult/stringCast.jav similarity index 100% rename from testData/typeCastExpression/expression_mult/stringCast.jav rename to testData/ast/typeCastExpression/expression_mult/stringCast.jav diff --git a/testData/typeCastExpression/expression_mult/stringCast.kt b/testData/ast/typeCastExpression/expression_mult/stringCast.kt similarity index 100% rename from testData/typeCastExpression/expression_mult/stringCast.kt rename to testData/ast/typeCastExpression/expression_mult/stringCast.kt diff --git a/testData/typeCastExpression/expression_mult/superWildcardCast.jav b/testData/ast/typeCastExpression/expression_mult/superWildcardCast.jav similarity index 100% rename from testData/typeCastExpression/expression_mult/superWildcardCast.jav rename to testData/ast/typeCastExpression/expression_mult/superWildcardCast.jav diff --git a/testData/typeCastExpression/expression_mult/superWildcardCast.kt b/testData/ast/typeCastExpression/expression_mult/superWildcardCast.kt similarity index 100% rename from testData/typeCastExpression/expression_mult/superWildcardCast.kt rename to testData/ast/typeCastExpression/expression_mult/superWildcardCast.kt diff --git a/testData/typeCastExpression/expression_mult/wildcardCast.jav b/testData/ast/typeCastExpression/expression_mult/wildcardCast.jav similarity index 100% rename from testData/typeCastExpression/expression_mult/wildcardCast.jav rename to testData/ast/typeCastExpression/expression_mult/wildcardCast.jav diff --git a/testData/typeCastExpression/expression_mult/wildcardCast.kt b/testData/ast/typeCastExpression/expression_mult/wildcardCast.kt similarity index 100% rename from testData/typeCastExpression/expression_mult/wildcardCast.kt rename to testData/ast/typeCastExpression/expression_mult/wildcardCast.kt diff --git a/testData/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.jav b/testData/ast/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.jav similarity index 100% rename from testData/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.jav rename to testData/ast/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.jav diff --git a/testData/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.kt b/testData/ast/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.kt similarity index 100% rename from testData/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.kt rename to testData/ast/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.kt diff --git a/testData/typeParameters/class/classParametrizationWithTwoBounds.jav b/testData/ast/typeParameters/class/classParametrizationWithTwoBounds.jav similarity index 100% rename from testData/typeParameters/class/classParametrizationWithTwoBounds.jav rename to testData/ast/typeParameters/class/classParametrizationWithTwoBounds.jav diff --git a/testData/typeParameters/class/classParametrizationWithTwoBounds.kt b/testData/ast/typeParameters/class/classParametrizationWithTwoBounds.kt similarity index 100% rename from testData/typeParameters/class/classParametrizationWithTwoBounds.kt rename to testData/ast/typeParameters/class/classParametrizationWithTwoBounds.kt diff --git a/testData/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.jav b/testData/ast/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.jav similarity index 100% rename from testData/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.jav rename to testData/ast/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.jav diff --git a/testData/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.kt b/testData/ast/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.kt similarity index 100% rename from testData/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.kt rename to testData/ast/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.kt diff --git a/testData/typeParameters/class/complexExampleWithClassExtending.jav b/testData/ast/typeParameters/class/complexExampleWithClassExtending.jav similarity index 100% rename from testData/typeParameters/class/complexExampleWithClassExtending.jav rename to testData/ast/typeParameters/class/complexExampleWithClassExtending.jav diff --git a/testData/typeParameters/class/complexExampleWithClassExtending.kt b/testData/ast/typeParameters/class/complexExampleWithClassExtending.kt similarity index 100% rename from testData/typeParameters/class/complexExampleWithClassExtending.kt rename to testData/ast/typeParameters/class/complexExampleWithClassExtending.kt diff --git a/testData/typeParameters/class/complexExampleWithClassMultiplyExtending.jav b/testData/ast/typeParameters/class/complexExampleWithClassMultiplyExtending.jav similarity index 100% rename from testData/typeParameters/class/complexExampleWithClassMultiplyExtending.jav rename to testData/ast/typeParameters/class/complexExampleWithClassMultiplyExtending.jav diff --git a/testData/typeParameters/class/complexExampleWithClassMultiplyExtending.kt b/testData/ast/typeParameters/class/complexExampleWithClassMultiplyExtending.kt similarity index 100% rename from testData/typeParameters/class/complexExampleWithClassMultiplyExtending.kt rename to testData/ast/typeParameters/class/complexExampleWithClassMultiplyExtending.kt diff --git a/testData/typeParameters/class/genericClass.jav b/testData/ast/typeParameters/class/genericClass.jav similarity index 100% rename from testData/typeParameters/class/genericClass.jav rename to testData/ast/typeParameters/class/genericClass.jav diff --git a/testData/typeParameters/class/genericClass.kt b/testData/ast/typeParameters/class/genericClass.kt similarity index 100% rename from testData/typeParameters/class/genericClass.kt rename to testData/ast/typeParameters/class/genericClass.kt diff --git a/testData/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.jav b/testData/ast/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.jav similarity index 100% rename from testData/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.jav rename to testData/ast/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.jav diff --git a/testData/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.kt b/testData/ast/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.kt similarity index 100% rename from testData/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.kt rename to testData/ast/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.kt diff --git a/testData/typeParameters/method/methodDoubleParametrizationWithTwoBounds.jav b/testData/ast/typeParameters/method/methodDoubleParametrizationWithTwoBounds.jav similarity index 100% rename from testData/typeParameters/method/methodDoubleParametrizationWithTwoBounds.jav rename to testData/ast/typeParameters/method/methodDoubleParametrizationWithTwoBounds.jav diff --git a/testData/typeParameters/method/methodDoubleParametrizationWithTwoBounds.kt b/testData/ast/typeParameters/method/methodDoubleParametrizationWithTwoBounds.kt similarity index 100% rename from testData/typeParameters/method/methodDoubleParametrizationWithTwoBounds.kt rename to testData/ast/typeParameters/method/methodDoubleParametrizationWithTwoBounds.kt diff --git a/testData/typeParameters/method/where.jav b/testData/ast/typeParameters/method/where.jav similarity index 100% rename from testData/typeParameters/method/where.jav rename to testData/ast/typeParameters/method/where.jav diff --git a/testData/typeParameters/method/where.kt b/testData/ast/typeParameters/method/where.kt similarity index 100% rename from testData/typeParameters/method/where.kt rename to testData/ast/typeParameters/method/where.kt diff --git a/testData/typeParameters/statement_mult/genericParam.jav b/testData/ast/typeParameters/statement_mult/genericParam.jav similarity index 100% rename from testData/typeParameters/statement_mult/genericParam.jav rename to testData/ast/typeParameters/statement_mult/genericParam.jav diff --git a/testData/typeParameters/statement_mult/genericParam.kt b/testData/ast/typeParameters/statement_mult/genericParam.kt similarity index 100% rename from testData/typeParameters/statement_mult/genericParam.kt rename to testData/ast/typeParameters/statement_mult/genericParam.kt diff --git a/testData/typeParameters/statement_mult/manyGenericParams.jav b/testData/ast/typeParameters/statement_mult/manyGenericParams.jav similarity index 100% rename from testData/typeParameters/statement_mult/manyGenericParams.jav rename to testData/ast/typeParameters/statement_mult/manyGenericParams.jav diff --git a/testData/typeParameters/statement_mult/manyGenericParams.kt b/testData/ast/typeParameters/statement_mult/manyGenericParams.kt similarity index 100% rename from testData/typeParameters/statement_mult/manyGenericParams.kt rename to testData/ast/typeParameters/statement_mult/manyGenericParams.kt diff --git a/testData/varArg/method/ellipsisTypeSeveralParams.jav b/testData/ast/varArg/method/ellipsisTypeSeveralParams.jav similarity index 100% rename from testData/varArg/method/ellipsisTypeSeveralParams.jav rename to testData/ast/varArg/method/ellipsisTypeSeveralParams.jav diff --git a/testData/varArg/method/ellipsisTypeSeveralParams.kt b/testData/ast/varArg/method/ellipsisTypeSeveralParams.kt similarity index 100% rename from testData/varArg/method/ellipsisTypeSeveralParams.kt rename to testData/ast/varArg/method/ellipsisTypeSeveralParams.kt diff --git a/testData/varArg/method/ellipsisTypeSingleParams.jav b/testData/ast/varArg/method/ellipsisTypeSingleParams.jav similarity index 100% rename from testData/varArg/method/ellipsisTypeSingleParams.jav rename to testData/ast/varArg/method/ellipsisTypeSingleParams.jav diff --git a/testData/varArg/method/ellipsisTypeSingleParams.kt b/testData/ast/varArg/method/ellipsisTypeSingleParams.kt similarity index 100% rename from testData/varArg/method/ellipsisTypeSingleParams.kt rename to testData/ast/varArg/method/ellipsisTypeSingleParams.kt diff --git a/testData/whileStatement/statement_mult/whileWithBlock.jav b/testData/ast/whileStatement/statement_mult/whileWithBlock.jav similarity index 100% rename from testData/whileStatement/statement_mult/whileWithBlock.jav rename to testData/ast/whileStatement/statement_mult/whileWithBlock.jav diff --git a/testData/whileStatement/statement_mult/whileWithBlock.kt b/testData/ast/whileStatement/statement_mult/whileWithBlock.kt similarity index 100% rename from testData/whileStatement/statement_mult/whileWithBlock.kt rename to testData/ast/whileStatement/statement_mult/whileWithBlock.kt diff --git a/testData/whileStatement/statement_mult/whileWithEmptyBlock.jav b/testData/ast/whileStatement/statement_mult/whileWithEmptyBlock.jav similarity index 100% rename from testData/whileStatement/statement_mult/whileWithEmptyBlock.jav rename to testData/ast/whileStatement/statement_mult/whileWithEmptyBlock.jav diff --git a/testData/whileStatement/statement_mult/whileWithEmptyBlock.kt b/testData/ast/whileStatement/statement_mult/whileWithEmptyBlock.kt similarity index 100% rename from testData/whileStatement/statement_mult/whileWithEmptyBlock.kt rename to testData/ast/whileStatement/statement_mult/whileWithEmptyBlock.kt diff --git a/testData/whileStatement/statement_mult/whileWithExpression.jav b/testData/ast/whileStatement/statement_mult/whileWithExpression.jav similarity index 100% rename from testData/whileStatement/statement_mult/whileWithExpression.jav rename to testData/ast/whileStatement/statement_mult/whileWithExpression.jav diff --git a/testData/whileStatement/statement_mult/whileWithExpression.kt b/testData/ast/whileStatement/statement_mult/whileWithExpression.kt similarity index 100% rename from testData/whileStatement/statement_mult/whileWithExpression.kt rename to testData/ast/whileStatement/statement_mult/whileWithExpression.kt diff --git a/testData/whileStatement/statement_mult/whileWithReturn.jav b/testData/ast/whileStatement/statement_mult/whileWithReturn.jav similarity index 100% rename from testData/whileStatement/statement_mult/whileWithReturn.jav rename to testData/ast/whileStatement/statement_mult/whileWithReturn.jav diff --git a/testData/whileStatement/statement_mult/whileWithReturn.kt b/testData/ast/whileStatement/statement_mult/whileWithReturn.kt similarity index 100% rename from testData/whileStatement/statement_mult/whileWithReturn.kt rename to testData/ast/whileStatement/statement_mult/whileWithReturn.kt From 9c0ac7b31c2aad1341790bc4b547be54ee42db91 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 7 Nov 2011 12:47:00 +0400 Subject: [PATCH 060/206] expression_mult avoided --- j2k.iml | 1 + j2k.ipr | 9 ++++ lib/commons-io-2.1.jar | Bin 0 -> 163151 bytes .../jet/j2k/JavaToKotlinConverterTest.java | 47 ++++++------------ .../{expression_mult => expression}/and.jav | 0 .../{expression_mult => expression}/and.kt | 0 .../assignment.jav | 0 .../assignment.kt | 0 .../divideAssign.jav | 0 .../divideAssign.kt | 0 .../minusAssign.jav | 0 .../minusAssign.kt | 0 .../multiplyAssign.jav | 0 .../multiplyAssign.kt | 0 .../{expression_mult => expression}/or.jav | 0 .../{expression_mult => expression}/or.kt | 0 .../plusAssign.jav | 0 .../plusAssign.kt | 0 .../reminder.jav | 0 .../reminder.kt | 0 .../shiftLeft.jav | 0 .../shiftLeft.kt | 0 .../shiftRight.jav | 0 .../shiftRight.kt | 0 .../unsignedRightShift.jav | 0 .../unsignedRightShift.kt | 0 .../{expression_mult => expression}/xor.jav | 0 .../{expression_mult => expression}/xor.kt | 0 .../{expression_mult => expression}/and.jav | 0 .../{expression_mult => expression}/and.kt | 0 .../conditionalAnd.jav | 0 .../conditionalAnd.kt | 0 .../conditionalOr.jav | 0 .../conditionalOr.kt | 0 .../divide.jav | 0 .../{expression_mult => expression}/divide.kt | 0 .../greaterThan.jav | 0 .../greaterThan.kt | 0 .../greaterThanEqual.jav | 0 .../greaterThanEqual.kt | 0 .../lessThan.jav | 0 .../lessThan.kt | 0 .../lessThanEqual.jav | 0 .../lessThanEqual.kt | 0 .../{expression_mult => expression}/minus.jav | 0 .../{expression_mult => expression}/minus.kt | 0 .../multiply.jav | 0 .../multiply.kt | 0 .../{expression_mult => expression}/or.jav | 0 .../{expression_mult => expression}/or.kt | 0 .../{expression_mult => expression}/plus.jav | 0 .../{expression_mult => expression}/plus.kt | 0 .../remainder.jav | 0 .../remainder.kt | 0 .../shiftLeft.jav | 0 .../shiftLeft.kt | 0 .../shiftRight.jav | 0 .../shiftRight.kt | 0 .../unsignedRightShift.jav | 0 .../unsignedRightShift.kt | 0 .../{expression_mult => expression}/xor.jav | 0 .../{expression_mult => expression}/xor.kt | 0 .../ast/{class_ => class}/class/class.jav | 0 testData/ast/{class_ => class}/class/class.kt | 0 .../{class_ => class}/class/emptyClass.jav | 0 .../ast/{class_ => class}/class/emptyClass.kt | 0 ...tendsOneClassAndImplementsOneInterface.jav | 0 ...xtendsOneClassAndImplementsOneInterface.kt | 0 ...OneClassAndImplementsSeveralInterfaces.jav | 0 ...sOneClassAndImplementsSeveralInterfaces.kt | 0 .../{class_ => class}/class/finalClass.jav | 0 .../ast/{class_ => class}/class/finalClass.kt | 0 .../{class_ => class}/class/genericClass.jav | 0 .../{class_ => class}/class/genericClass.kt | 0 .../class/innerEmptyClass.jav | 0 .../class/innerEmptyClass.kt | 0 .../class/innerStaticClass.jav | 0 .../class/innerStaticClass.kt | 0 .../{class_ => class}/class/internalClass.jav | 0 .../{class_ => class}/class/internalClass.kt | 0 .../class/oneStaticFieldOneNonStatic.jav | 0 .../class/oneStaticFieldOneNonStatic.kt | 0 .../class/oneStaticMethod.jav | 0 .../class/oneStaticMethod.kt | 0 .../class/oneStaticMethodOneNonStatic.jav | 0 .../class/oneStaticMethodOneNonStatic.kt | 0 .../{class_ => class}/class/pivateClass.jav | 0 .../{class_ => class}/class/pivateClass.kt | 0 .../class/protectedClass.jav | 0 .../{class_ => class}/class/protectedClass.kt | 0 .../{class_ => class}/class/publicClass.jav | 0 .../{class_ => class}/class/publicClass.kt | 0 .../class/simpleInheritance.jav | 0 .../class/simpleInheritance.kt | 0 .../class/twoStaticMethod.jav | 0 .../class/twoStaticMethod.kt | 0 .../class_mult/classWithEmptyMethods.jav | 0 .../class_mult/classWithEmptyMethods.kt | 0 .../class_mult/classWithFields.jav | 0 .../class_mult/classWithFields.kt | 0 .../class_mult/classWithMultiplyFields.jav | 0 .../class_mult/classWithMultiplyFields.kt | 0 .../simpleConditionalExpression.jav | 0 .../simpleConditionalExpression.kt | 0 .../{file_ => file}/file/packageWithClass.jav | 0 .../{file_ => file}/file/packageWithClass.kt | 0 .../file/packageWithClasses.jav | 0 .../file/packageWithClasses.kt | 0 .../file/packageWithOpenClass.jav | 0 .../file/packageWithOpenClass.kt | 0 .../file_mult/packageWithImports.jav | 0 .../file_mult/packageWithImports.kt | 0 .../file_mult/packageWithMixedImports.jav | 0 .../file_mult/packageWithMixedImports.kt | 0 .../file_mult/packageWithStaticImports.jav | 0 .../file_mult/packageWithStaticImports.kt | 0 .../complicatedExpression.jav | 0 .../complicatedExpression.kt | 0 .../simpleReference.jav | 0 .../simpleReference.kt | 0 .../divide.jav | 0 .../{expression_mult => expression}/divide.kt | 0 .../{expression_mult => expression}/minus.jav | 0 .../{expression_mult => expression}/minus.kt | 0 .../multiply.jav | 0 .../multiply.kt | 0 .../{expression_mult => expression}/plus.jav | 0 .../{expression_mult => expression}/plus.kt | 0 .../remainder.jav | 0 .../remainder.kt | 0 .../extendsWildcardCast.jav | 0 .../extendsWildcardCast.kt | 0 .../fooCast.jav | 0 .../fooCast.kt | 0 .../intCast.jav | 0 .../intCast.kt | 0 .../primitiveType.jav | 0 .../primitiveType.kt | 0 .../simpleGenericCast.jav | 0 .../simpleGenericCast.kt | 0 .../stringCast.jav | 0 .../stringCast.kt | 0 .../superWildcardCast.jav | 0 .../superWildcardCast.kt | 0 .../wildcardCast.jav | 0 .../wildcardCast.kt | 0 146 files changed, 24 insertions(+), 33 deletions(-) create mode 100644 lib/commons-io-2.1.jar rename testData/ast/assignmentExpression/{expression_mult => expression}/and.jav (100%) rename testData/ast/assignmentExpression/{expression_mult => expression}/and.kt (100%) rename testData/ast/assignmentExpression/{expression_mult => expression}/assignment.jav (100%) rename testData/ast/assignmentExpression/{expression_mult => expression}/assignment.kt (100%) rename testData/ast/assignmentExpression/{expression_mult => expression}/divideAssign.jav (100%) rename testData/ast/assignmentExpression/{expression_mult => expression}/divideAssign.kt (100%) rename testData/ast/assignmentExpression/{expression_mult => expression}/minusAssign.jav (100%) rename testData/ast/assignmentExpression/{expression_mult => expression}/minusAssign.kt (100%) rename testData/ast/assignmentExpression/{expression_mult => expression}/multiplyAssign.jav (100%) rename testData/ast/assignmentExpression/{expression_mult => expression}/multiplyAssign.kt (100%) rename testData/ast/assignmentExpression/{expression_mult => expression}/or.jav (100%) rename testData/ast/assignmentExpression/{expression_mult => expression}/or.kt (100%) rename testData/ast/assignmentExpression/{expression_mult => expression}/plusAssign.jav (100%) rename testData/ast/assignmentExpression/{expression_mult => expression}/plusAssign.kt (100%) rename testData/ast/assignmentExpression/{expression_mult => expression}/reminder.jav (100%) rename testData/ast/assignmentExpression/{expression_mult => expression}/reminder.kt (100%) rename testData/ast/assignmentExpression/{expression_mult => expression}/shiftLeft.jav (100%) rename testData/ast/assignmentExpression/{expression_mult => expression}/shiftLeft.kt (100%) rename testData/ast/assignmentExpression/{expression_mult => expression}/shiftRight.jav (100%) rename testData/ast/assignmentExpression/{expression_mult => expression}/shiftRight.kt (100%) rename testData/ast/assignmentExpression/{expression_mult => expression}/unsignedRightShift.jav (100%) rename testData/ast/assignmentExpression/{expression_mult => expression}/unsignedRightShift.kt (100%) rename testData/ast/assignmentExpression/{expression_mult => expression}/xor.jav (100%) rename testData/ast/assignmentExpression/{expression_mult => expression}/xor.kt (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/and.jav (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/and.kt (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/conditionalAnd.jav (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/conditionalAnd.kt (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/conditionalOr.jav (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/conditionalOr.kt (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/divide.jav (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/divide.kt (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/greaterThan.jav (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/greaterThan.kt (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/greaterThanEqual.jav (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/greaterThanEqual.kt (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/lessThan.jav (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/lessThan.kt (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/lessThanEqual.jav (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/lessThanEqual.kt (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/minus.jav (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/minus.kt (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/multiply.jav (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/multiply.kt (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/or.jav (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/or.kt (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/plus.jav (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/plus.kt (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/remainder.jav (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/remainder.kt (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/shiftLeft.jav (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/shiftLeft.kt (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/shiftRight.jav (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/shiftRight.kt (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/unsignedRightShift.jav (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/unsignedRightShift.kt (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/xor.jav (100%) rename testData/ast/binaryExpression/{expression_mult => expression}/xor.kt (100%) rename testData/ast/{class_ => class}/class/class.jav (100%) rename testData/ast/{class_ => class}/class/class.kt (100%) rename testData/ast/{class_ => class}/class/emptyClass.jav (100%) rename testData/ast/{class_ => class}/class/emptyClass.kt (100%) rename testData/ast/{class_ => class}/class/extendsOneClassAndImplementsOneInterface.jav (100%) rename testData/ast/{class_ => class}/class/extendsOneClassAndImplementsOneInterface.kt (100%) rename testData/ast/{class_ => class}/class/extendsOneClassAndImplementsSeveralInterfaces.jav (100%) rename testData/ast/{class_ => class}/class/extendsOneClassAndImplementsSeveralInterfaces.kt (100%) rename testData/ast/{class_ => class}/class/finalClass.jav (100%) rename testData/ast/{class_ => class}/class/finalClass.kt (100%) rename testData/ast/{class_ => class}/class/genericClass.jav (100%) rename testData/ast/{class_ => class}/class/genericClass.kt (100%) rename testData/ast/{class_ => class}/class/innerEmptyClass.jav (100%) rename testData/ast/{class_ => class}/class/innerEmptyClass.kt (100%) rename testData/ast/{class_ => class}/class/innerStaticClass.jav (100%) rename testData/ast/{class_ => class}/class/innerStaticClass.kt (100%) rename testData/ast/{class_ => class}/class/internalClass.jav (100%) rename testData/ast/{class_ => class}/class/internalClass.kt (100%) rename testData/ast/{class_ => class}/class/oneStaticFieldOneNonStatic.jav (100%) rename testData/ast/{class_ => class}/class/oneStaticFieldOneNonStatic.kt (100%) rename testData/ast/{class_ => class}/class/oneStaticMethod.jav (100%) rename testData/ast/{class_ => class}/class/oneStaticMethod.kt (100%) rename testData/ast/{class_ => class}/class/oneStaticMethodOneNonStatic.jav (100%) rename testData/ast/{class_ => class}/class/oneStaticMethodOneNonStatic.kt (100%) rename testData/ast/{class_ => class}/class/pivateClass.jav (100%) rename testData/ast/{class_ => class}/class/pivateClass.kt (100%) rename testData/ast/{class_ => class}/class/protectedClass.jav (100%) rename testData/ast/{class_ => class}/class/protectedClass.kt (100%) rename testData/ast/{class_ => class}/class/publicClass.jav (100%) rename testData/ast/{class_ => class}/class/publicClass.kt (100%) rename testData/ast/{class_ => class}/class/simpleInheritance.jav (100%) rename testData/ast/{class_ => class}/class/simpleInheritance.kt (100%) rename testData/ast/{class_ => class}/class/twoStaticMethod.jav (100%) rename testData/ast/{class_ => class}/class/twoStaticMethod.kt (100%) rename testData/ast/{class_ => class}/class_mult/classWithEmptyMethods.jav (100%) rename testData/ast/{class_ => class}/class_mult/classWithEmptyMethods.kt (100%) rename testData/ast/{class_ => class}/class_mult/classWithFields.jav (100%) rename testData/ast/{class_ => class}/class_mult/classWithFields.kt (100%) rename testData/ast/{class_ => class}/class_mult/classWithMultiplyFields.jav (100%) rename testData/ast/{class_ => class}/class_mult/classWithMultiplyFields.kt (100%) rename testData/ast/conditionalExpression/{expression_mult => expression}/simpleConditionalExpression.jav (100%) rename testData/ast/conditionalExpression/{expression_mult => expression}/simpleConditionalExpression.kt (100%) rename testData/ast/{file_ => file}/file/packageWithClass.jav (100%) rename testData/ast/{file_ => file}/file/packageWithClass.kt (100%) rename testData/ast/{file_ => file}/file/packageWithClasses.jav (100%) rename testData/ast/{file_ => file}/file/packageWithClasses.kt (100%) rename testData/ast/{file_ => file}/file/packageWithOpenClass.jav (100%) rename testData/ast/{file_ => file}/file/packageWithOpenClass.kt (100%) rename testData/ast/{file_ => file}/file_mult/packageWithImports.jav (100%) rename testData/ast/{file_ => file}/file_mult/packageWithImports.kt (100%) rename testData/ast/{file_ => file}/file_mult/packageWithMixedImports.jav (100%) rename testData/ast/{file_ => file}/file_mult/packageWithMixedImports.kt (100%) rename testData/ast/{file_ => file}/file_mult/packageWithStaticImports.jav (100%) rename testData/ast/{file_ => file}/file_mult/packageWithStaticImports.kt (100%) rename testData/ast/isOperator/{expression_mult => expression}/complicatedExpression.jav (100%) rename testData/ast/isOperator/{expression_mult => expression}/complicatedExpression.kt (100%) rename testData/ast/isOperator/{expression_mult => expression}/simpleReference.jav (100%) rename testData/ast/isOperator/{expression_mult => expression}/simpleReference.kt (100%) rename testData/ast/polyadicExpression/{expression_mult => expression}/divide.jav (100%) rename testData/ast/polyadicExpression/{expression_mult => expression}/divide.kt (100%) rename testData/ast/polyadicExpression/{expression_mult => expression}/minus.jav (100%) rename testData/ast/polyadicExpression/{expression_mult => expression}/minus.kt (100%) rename testData/ast/polyadicExpression/{expression_mult => expression}/multiply.jav (100%) rename testData/ast/polyadicExpression/{expression_mult => expression}/multiply.kt (100%) rename testData/ast/polyadicExpression/{expression_mult => expression}/plus.jav (100%) rename testData/ast/polyadicExpression/{expression_mult => expression}/plus.kt (100%) rename testData/ast/polyadicExpression/{expression_mult => expression}/remainder.jav (100%) rename testData/ast/polyadicExpression/{expression_mult => expression}/remainder.kt (100%) rename testData/ast/typeCastExpression/{expression_mult => expression}/extendsWildcardCast.jav (100%) rename testData/ast/typeCastExpression/{expression_mult => expression}/extendsWildcardCast.kt (100%) rename testData/ast/typeCastExpression/{expression_mult => expression}/fooCast.jav (100%) rename testData/ast/typeCastExpression/{expression_mult => expression}/fooCast.kt (100%) rename testData/ast/typeCastExpression/{expression_mult => expression}/intCast.jav (100%) rename testData/ast/typeCastExpression/{expression_mult => expression}/intCast.kt (100%) rename testData/ast/typeCastExpression/{expression_mult => expression}/primitiveType.jav (100%) rename testData/ast/typeCastExpression/{expression_mult => expression}/primitiveType.kt (100%) rename testData/ast/typeCastExpression/{expression_mult => expression}/simpleGenericCast.jav (100%) rename testData/ast/typeCastExpression/{expression_mult => expression}/simpleGenericCast.kt (100%) rename testData/ast/typeCastExpression/{expression_mult => expression}/stringCast.jav (100%) rename testData/ast/typeCastExpression/{expression_mult => expression}/stringCast.kt (100%) rename testData/ast/typeCastExpression/{expression_mult => expression}/superWildcardCast.jav (100%) rename testData/ast/typeCastExpression/{expression_mult => expression}/superWildcardCast.kt (100%) rename testData/ast/typeCastExpression/{expression_mult => expression}/wildcardCast.jav (100%) rename testData/ast/typeCastExpression/{expression_mult => expression}/wildcardCast.kt (100%) diff --git a/j2k.iml b/j2k.iml index 06922e896d4..26774724cb1 100644 --- a/j2k.iml +++ b/j2k.iml @@ -8,6 +8,7 @@ + diff --git a/j2k.ipr b/j2k.ipr index c7e7afb9ac9..2a46e027d3d 100644 --- a/j2k.ipr +++ b/j2k.ipr @@ -167,5 +167,14 @@ + + + + + + + + + diff --git a/lib/commons-io-2.1.jar b/lib/commons-io-2.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..b5c7d692fe5616af4332c1a1db6efd23e3ff881b GIT binary patch literal 163151 zcmbTe1CXrYvL)K?-L`FOw{6?D?cQzMwryLxZQHhOygoB`X6~7H&yDk5Mf_D26`Aq< zQIWZF<;tv*lLQ8V1o+3}JwlN8f4upRCy1X{X<;RP8gUsBI=TNa`vvg!V-~V_?k5EV z0AL6T0D%0T&7}Ed#6^S^m1w0!qLj34%lY8F$aZg&G5Y?zYmY*)N$#B*Fd-;~d;>=n7PT}1v z4b6iwMjR)Qa63;nKou%SnL{1>#^0+&JDE&@4~M9XTnnY|6nRh>j;$i(?Z?4XedyZE zEK9H>iK|uU0{cSI5F`H>??Z7U>jv#a%ZLKt)%l&(^4@->L672B)+W-SL@Ah~UTcD| zfWpBqzPvjZmnP2W*g^sIR9(BHTmaTYqae7?%c`Iqyj&}36vPV*ihcjV3WTRvywU#l zeog1Oc>U7Jrbbiw^K>`7;w8bd4;UVEwJK8l)5Ni36E`UT$V98%+3`1Sw8=e!HG8$8 z%Mr2<9EThiv+$ahNKyR2hcrXe@YddvW215K@J23y31$LI=+G3_ha7QWP8N9kop^%7 z!f=a4Vmdtnq7|-b{z$SdkXcDSNdPZhLPGiegvD5^)t-Df{**v2U2X)?&8So3$^7lb zE;$?8dIdMDjPL3^(4;Y=Sk0Hq4*fQnEh3hh%=b77NY^ZLO_sZ5;oTL&^VjHtK)vU~c>0_z?U{pP%#W z^d0n_Y#si8xto|<8UI{P#{Zo=_P;#c+{Vt?>AyJ`_g{Mcd`ag2{Y~TiOJ7@Or~iEH zFMyRFaLE~`)AfV{0HCD#zraOGTu@j>QJB`r)oD}1+7@dV;Y$bqTVFD_6eQD_OnPnT zwNTBWZz&I2yc!GSwYGDesD)?icgLUn72R!96Wy3XW3*2d0<)_5%d3k{uKS4zuUpRB zvYhd%%4Lbp*`~9sx4kmZZ@DG&`G^`?9i=_ndc2~|h#H;Fm$&_jrT$v4*N<15mX27@ znV`Cg<1F3@?(e-noey7cPbHl8ZLNqkHmIui@2``4GM(LRDA!ljRQ4X9Pftf@n^f*v zx0mM-F8hHOSn?U& zx938ZmFQXJfy$be>2<}!${P_nHjP-7I?)f{1X*S$N{gX~IvZtc*LNhawI*6sgDriH zFT(rWiZNJ=aKrf+9>ki~%^nr1=lrSKHI=?fYULqavHP_wD&HBhkyu$8zbg;%?XJco zDlb$&6lMm6z?$N-T8}nk4$wW?Np$%k)bDxZ;ZK0BhrFP-ehF9{ew@yn>q)CZm@9u2 z8TL}OBXHxqgN<7>tfunVpll&?a#wzee2qZeuBjy(ajsSQeH$H;&XZ|Q_OUQ_M}1c5$I ziPkcZEx9O&&=ky1wvHB`T>QNn$!H(E_&~?WNmmu~Eye)Xj$zJ9CBYlUSt=@4i8Bhc z%DTqx;^V@OhiH|Br1K{P*m8h)&)V_CNwY%3n1*HNZ*%1foYTk<6XtUQw(;m(dre0i zihn6`7lu#?YdVN8f0lU&j$8UZl71$bNNDc}=b+aImU3XAN{z@kT@P1Qy5892o$gJz z;jQuC=V`r^x_vwIs@0vCM~$agu0bfS!aon?kyC@R?KhTGg*O~~pXH|{`=sE1gwd^; zK~wc_`?OW}F{|HqdN*f9cv4x*XBD8|FCVV1qdx6GkU6=G$}qA=t{ucq zcyvg>16B1}*F{+PQozeN+b#%6k?oWbrs7$bezzt~s3FM1wfC$;Jau;8G@Bfb>E~Yb zTZG>YaZlNSKa#U*W=19Tc)51zir47av_P8j61Hw?_R$p)Q9WU2!r%z>0*Kzhiu(Y*vgq_i*X%jLhj z&=c6=HA1dnQ8@Nh)-+!=7Gw2Hh^jANCnA4?tL!A%2*xf>!E(lps_~O)PGTmDEtkp{ zZxA(z3r;kbJpW6W2`9BvcnAkfIB4f)q+s}~C)GNEym5Vi>0(-1kJ_ASpLt;Xrf-;5 z4h7-2oCG~vhh*s05Xlblj(8#2g()=`6#AaOtU)L*A>Qa(CR~mb2}vG7>(Tw_V+tgs zbzT&i*wirt5QAh(`rsrNnV4Oaa=9Rz25@Zk2(sjAo!})k%|%*%q!+zku5YTDj7Q)ue?WcSGMR2^0hQk(tecHGGm z_%SSVUU>91seD9MMVT7+DTo{KdSuJzLP<(bR) z!szhrZ#rEz-4SsSW=>fhw^`w}tm?DHM84@=2)rI%9O|3v|@7 zj~J0B$#&VCaP#&6V(`v&@gkm!YdpzH0fQ*O*u}$fFVt*W8|Lz+s9(|&U;FaiFJ`J% z()`1pD3b^fDMC*?Nt|h$zuJQk_;2dgHF(HP0>p`{2c_2$34~naaO76M>G+0Lde_Ma z1alYtcz)j%j>lnkmhH7UbX=CIF>^;wmy>cq^(|&C$hG^lbmA$Eb|g~Dn5_||XC z6Y3^u6Dvs${y_LGQ;hL221TG6|25HrX7SySIsO}|WvI=xlDS>nTEsy8>kpeRa@Izh zJe(p$obiN0ah4$DQwmtH+6yt=e^$`u zfek6_a5#x;M_Pd+SfaY8~!q{}opp*TER+iEZwmby5!?RymA(j0_ zgVj;w55d;sNPV<*39h|LRhjP*cZ9vvRpJGlxalko)tUjGbr8xSV3yko%H4pSx=YJ< zML8|~Z`8&c?7tx;?b7L9Z!oAPxyt5R18Jt_p4_7PoqKb!cTiBrB83non1`aW$Vf%T zee&79FH2NPX%=NDXZ*1KUZJS8M+*hzk|(BIG7@zbBvp9EILXxJ2REkpMn)9TGxa-L zQTlv1T+(zVa)n>?Blp;3(ozS(?)G8NazxUr;OW?bx&$gWrr!=uJLFCdXy@===IGEuW( zNz-MD!AA5Qok;f`X)j-QHr^>pAKu>I`;#3Ww_kTpPY(9Hf4h-bTMk))SZf9k_e^h} zU-uw0#ojR?J*|R=8P%TDlVJs5bQ&9lRk zwcGpKU!vb-l{uF;a<7Fj(6zXavtQdYV|U%upt&NVNRDrrwJqSl-5w{VgNiBe){=Xp zah%YtEuM8s2tHfPQA~Li%D#Q29V0TapFG5;;YGCM zcZ=Z04hVw3VfWo8emPaTN@X3OSlkegJEzCMMuD=_ZHz2BDe#T&FGIX?g0?6#?bCtp zgwodP@z&#~?{f|@fk1bN>=d)$5|;$GJ|=jK-La?4ue{aDnIuI+IE#D>J@*!ZuE@N> zn##f+6=*r#Pq{8@W6WPTv7U-~^G&g=R~2p%)dj~H*%n=ioFgS&tkq3}gd!c3*(#c? z@Of*U4d7K_V~1kL|N7LorL&30e5!Yw;mWq|e2E>Xt1mX9&p>2&BI@1`H8ZEQ+i=OV)=OusnhXhj^9As=`0UsOu`FmqAjeWhfg zh-%Wf$gCOJUVYGJcNItGmeOk##KuKxH?cAfOM^M|lLmZfyHt7+JYiETE7FWvL;mLZ zQ0KK?k}c3!VDpA>b#lySr@IW!qfodl93^ZQwY(3cWh(YtAU`XcdHh^GYo+Si0B2Fy zFqhRB370~y^szcjq^?XOAoBV!_w;II(2e{<%l#utf6!S5( zcNu(uZ_meNEF3&9eK6DHvuxDre10IX8c-Uo32-`g$;AdwbB*>HLquW5)3 z+1U9tYKMmtG0Tz|DNN%{FjXz}J^XMefYE6GzMTVA{n9q!oQrPFDH-e)|CmP zc+tuo`^6BY-^Q>b4B(_^d~8N~v<)l05_tVl|4h(|eXFTk%Rsg{WQ0T3A(_Nmu={Ei zKR7#vaj<{H=64@?H{x`K**!wQzZ=Big9^WZcHCVypO8T^w`7@~E?P6s7g>#Jnh2amLvn`Orqu{d{!ja6t$gX-M zK==$h5szi(Fb5u~LlbiGne%4!1cUy)clCxb02{#*vg{LC7+ACKnv<{i=K}_Hl6(w} zM`Hb3bP9L0eR(TO0f``go)Op|c-Q6ABJkah1K;u?M3-=ANz&x?>c!&1=o|2Vi824P zTh|g#qX_tE@auoBe<&#bTQQW8Rr=}I|Iw^_O?JWd;Un|yW(EFfEr10wcCt)Qb#kbs z^YslXJVf*+_VTD2TKpVm_flF@N4L{vFhZ|Mghp>UFjeJ)B#>2b!jZC__c?{ZD=IVE z^=C#`<^q!-Ps^N!M@lb;ddW?(unPX@AL6<6pT%so<@`zs2%sX#X1A?kc+`iUpNO%- z>jL;c_xuk5Nqkzg;pRuWO!*N$DgLE6A>ig@EbCxo>>#c0U`cCerSIq%rJ|{*sEYgr z+lFIs5FP3}M+hm7zXFwyPe~3sUX&a`*yN5Fy{k78Hp<_tX)Q^|*ff8tX{mX+vM%UV zI**yTr}w@mX!?fqwp1cx`UY3Hy+sBlbjAc{TGh3*X6a*DWo!F#xjP*J;IiXIm)#qS z){lO>6B=Hi!$x1er$*a}j+C?9$rioL&9-}JAmk|%&Yk`e$Q|k$M~4_Gh_*&?8&;kw zr(c@-u*YOT_?}ohtei^7FL1zJKuBRE5kzv(2yV*FR+5WfLjDdH>p3BEx zsOMFJA*-&jfjMh1-wyR8E5Cz@d&V)FpWD1FB_gOH5FvGv7s}2&_!6rh%wa;~h0k71 z_TG4KssdUbx;?vLPhat*ppBL`6Hl>uwp{E4D%_Q@rcQ%Azc)LRo5ZvyZ{rk{Mp1-s zS}E$+F&T=b(&1mBchf&^t){eJ!>hj z_rOhl^Gpk(sIc0bhW;uQH%0>q65IJPaDRv8sPsH8B5+g+k~!%J7OSbD+PgA9CBR}p zY9gGY)#co@xC#BUi0T~um+TorMbj60LfY==Fjl<%912T`>rh~Fdaa~#pHwwTf+j_1 z4B_yOXplGo3c>pGiV&7CCSJPT zN&p6)My+IT!+4p80RwmW;1gNFyrTOC2OH8X5~^E~p5b5hE`yWBvOru08H~49v7smA zSvs=rIV7O~xTs%lc3UA(t);m~KDARJn`V!@h_vrBGyut;qL;XxyZtB^54+NxBs{ha zK^+yVtN2O97;s0PuHe^iH`%|=`eib{VQ7FJVDZl6Z0Fng={LZ?!=34t0qbbhxFzeQ z(nCGuba?hVrN{gi*;H?d1w|S1lkyrUB*_>Z#6hi>NHct3+#f6T<5@*#ni-3W#K!lA zPw1kE#l9$!a=>jcn2He@HoIADXyRt}_aQNt`reVRl$V@&Cbe7rHS8s0ASr7aCTzS+ z+W5IGx70*nkQD0`B~Lv$2j9hu`=X>vdsWVwJf|IMVGa$#7sdx43Zcc+iC4%-AjHxn zz3ommUa?hm`v*&~PVS}!A-H^5V@0NzD|LMh8%NmTmOpoZOM3@JNn7Y&f&c8>f}>r# zUC$ife1j|^Xmv(xtRs%!f7tA^^D$;cG`-)1 zZ(d#4==4oosfZlQxer{04=t__A3VXhh&5xvt*JGzHD@uehbde{l(wn#wU#__JSj;$ zl7<5-R9Jnun$e2B+ML$(I7DILfB8lU21OfW3ZNLnkk(5-)K9*9p zmBAhXc*&lX8SC=X-R%NP*;m;?bA2Zc*26rv`IS)6MG0K4HBvsLr;N#Sn(hd{mNRt- z`{Kr?SGQ&^^M!p!FBm+PA3we6qD7o4nYjb%-$A(h=JsJ?6=x?*_GI!-;yNpw>UJ37+s#Ejint%{(slhsg_!&}dcpTA~VQfZHnu#{m`dTHw;dnje z@B}aIH63aMFH4l)wkKFKRb)1fuU8FoP!!1juY_1bl%b%eG_rEL~|4GN^H*j=v&^L4v`O)SD|F^vVKTAoLqNMFS zAN&^!T}kzNAWt6=pP<{}BBncFBBDH@JcRHeyb^@{8hV1w;mWLgzyi^CsTSm3PaH5W zB!f$4EL&MDo2%*5x^4Grn)>(K=O?)D@XCCizN9F`A1AAQo7%3DeI8sh*V4SoyuR2~ zv}!r&V52sNiC7CaJgZXsg;f1=xvdwGBq&xBr}r`NJC(mZ>r zkk%VJy|*2`6kYu|cjBpJ)4{cM#cj$|`|322TKN&X$xsB#KDxcecyIBkcbF*axCP&c z)W?!DI9F+7V)GEAS5dnyl=c7wy>TfgmYi77mzBfqpG_HAC|t^j+-X$>#UD~`KO8?^ zyik9cBrVG;v~mYWISl-1U1t;}XULZEvu!VFF2Yo-_vvWo)4FyQG+*t_&TDl=@8D1L zBRRn=2fHgZF9mlQ?xB@}iGg-k5)LN&X17k~?*u4!mIpO7`GqGoI&F6Kc#HIE3XIt+ zxs}Odk4*^GPA+JCRi{-Qcez@AXqVHsWNL!wzp$(YZJ?GH8+`(Y{T}*!sRV)Xb}kn7 zHG=H5puI+uU>a|1G{0D*r#m9vlgo_cuc?-|h>lPjj=eg~6iy|7Lr{lglw!#nSEc-y zK%O&4tddaNGVAVAj)yUkGV&x&X{Sn`yOSRm%Lz5KJ0gNqaP}ba#1YXt{v<+Dm{q)< zzRkl|i{x6vwe9?1laHZXpU#4>+1+mebndtgw=?^UpJgmAG|^^H#mx3U)31L}nHvcY z{?;EVQveMB!1M3KNm8KBMK_uXyJM}DY)=A!q1e9ks1;U0#=2L}n-`LRpYrZk+0cXhHh;+GueoB`u(6T=g~LE0;MR zzt(ACt_~4WPR^mV8JabpppjF1_jqo;iJ5zCmxR1VCw>Es;TZXsxw@pOPRl}tv1DPD znElb7D36q`teAG|UMi+3moaRsRex%DAu?TU#sGpS>GzyE0;l|qbqGU!dr_FDgx)o^ zb7!i$BW_u|DF#d2b9HUMbouG)N^MbEUkD9Er73~GGDWwfZ9;8gEUQsWIeF=cxs~*H}~{d$a(|-n^w9Q2U5o5 z=_q^DrVX_s`+lg9VneWaO4V+Zwl$q?!}%8i1dZjs8i0$lVV~wWTS)jg7mtUgq?*?u zwtW7ZL-VhR_Lq00(T}tC{wE<>Om;?n+xS4aq)86y4GObBT9Y%q5S@WjQj_nh&rogemEOT^3#H2j1p)|Yu&!I3O;XV^u8x)3=AM0}djuVKjK%u1%2;6M+)qtRpJQ}bhO=o~YjMSFtBaJIhzd+N^j zMF|#4-^4xj^yfVlpuwD&P9&TRPy|w}p1O*168d^M)Q84S3h;Kqr{Mj@w_qU-t~nwzcj=YSAu z^rxYvY{gMMH`53MbPX_@x@VGNBC0gcd=arn-Tw$}H!I*6s&tp@-!NRTHoOvj5k4xu zGI!cl#=4gRyodh89XGVeOEz@NOpg8v>-45-hjKpI4O<2&EA6*!L`-w;02e}X=Z?x= zMACVN&<&{ReMf%B;)dz2)@hTEM%+_j1$*N0vxQ)e@tT_(-+tzy0@xUy7TCcA);e|z z*0ZTSV1?M{K$2M5Aw{>qYtD<&N;{TmZcH0pl6OZ04#Yip!QK^b?Ct<)$e`i1ZfV2{ z;A(sMgKb)ROxw7A>yhbAVsCu3>m?4unsZ?mi?fLuQ@{NtO+tc-i zJefxa9}30^!b<6yS8dEB#p?o*JG(=a@i#I{cU2iVmgrY(@h{@Z9WWQ7ezy+6v{72M zN{8UE?Lqd9hTRBQW`vz{DXj-%Vz`;Y7xF!%M|>YUDz0LR@_;GrD2gFB<(?4US%O0a(|;7!sEpvmj%+DnA=~1G<}o`CoCeW6HwtpO;j2-i?{gqWMu z3{bE-WR^uxO-&BHW@&1U4LeHYB9Z3Re7 zZdt+ai|(n~=jL$I{?LWbY|^5wZgn-q|?oTtT-}U>~CkvYj!q(>>tm z_cOsytiZZ=q4At!oZh;(vSGtc!(8`h41SEW&HA=Axvzd}%(?ly(UVOH)UbVi`sJj6R??+nrjmslsP`n;r(+``1jgr0s#X6ME@kkzeSXU%pHsk ze->NZ{!5~yWc`yC$lg~gOLflB@bJh7!a+7WV;TO?z3jn&C8<%d_;^wj&WVvpPB;kP zVc&jmgbDi7~ZO2^C?8n(p$2GRwfKmiFLLiL%jRq{g0ApV7 zAkZAOCZJr$o>4)FTeHnc>d1H0;R%yp4AgrZ0mXx>lbWnJn%d$vy>r%FKUvbG<0oel z*yW;8+N@4N*^RMrDT)m+O#JhhOO7MLm06gBXN&nGqE%TBl)G|ClF7^V&tk3Isj?=E zFg_yO3avTC$Tme-agp`kGP zC&tI(@~;UAC=oKr1+Wq=D3+`9Eup*NjHDSF7j4?G z=0TE|D<>0(fX-tv=exMV3G^`7#}^{pEIN>#`yeG4=s0!!?~|eD4bbDNommP}Duo)i zdUsygMrXE8@Zw$0&@UDmqM2NW3N4*jT;NJg!$ja}iW+7o+vFU9A}o5l=Jlq?Gs>GS zQZ~O+I71!r5x84v3_zZRJNYCA1S7-I0|o}!0$j67LjgAoQ@^)0(PsT*f={vT8`kPf zk}ZCF)Dq@rluU1?W^d4_7w2ma(5b@B&7TJ&C)>6 zKVt!Ia&w*Rqr`bdd_m$m&9--#;NWLqO4X-u{Wcd_L#y!3S|#uz{%mH9<|Gy-1Nbv5 zn|>SIF?w#67eZ*TkK$^8MEoRkPM>TYNkBF=xU+=+nraP`aF`cDyD{h`z9z`QMpLCSBq4n6#R&4$D>1%TVeRXM*8h`T z|5%IDR1-rB|7nZmeiYSzE4zeUos4Z9&24S|%j{CoRK@&}S)&Q@qnFX6;?R*45Az8$ z9Lvx(1;s6eYWb`x>rO+7qJa!UdQ-phx)1VZQ9I5ww7t$XKIOGHJxqi!!bZ=4k1x(! z=uC4MKkl#be1K91u<(NGR>DD&HS9sf@!I3=^f9(y#FC%z_XEHqtdfk++R&&vea;7= zwi+tc4-YxvmOMdj=K`F!&@iq&;B;PRLhw@K*eAfw9VTq<@@uUk%DCv(aZ7P8emxB7 z8tsox2vELKCTnP9%TAjrn)`JRM0e7OQU+^;4m9p%SB?i4i-Kw}T67a*p=cwZTbnUi ziYwFHDbbM6vOApdK*dMb49uss_S~dd5v1u;cGM!)NbZRkCSVTir13PQj}E1rb=GLl zEMapxI;fA57u8#ozL(#M=#l50zJ_*^9XBV5$xxv-DWplNi4BeVCveQ9$w^AoD{RO;RCdbai^~d(j|QQrtEROC(Hd&fKuvU#iB&Ikh<)_zG&UkW zS6AP*0Hu_SsJl@Uhr2S$`9MBu+41KZN0f^DMY|_er4rUU7+XqmryitBCHQNNiT)0* zPQIH>PlxUbHW4>Z2kI4RuC6b}0%`$11|!W&jxw8}fH&i4C7W@U=fPHUM6NrU=)Ctg zqPC;WS{RCsXUs<<*@(`LFqjG|f1Wymd|G|~tsy*30ZqH(Gp)X9j1Pg-dfrs12W_G8oNlOw*N{($zeM60P3Ia0A$Cla zVuuF@g8R8`pJ0bY1f+=fAWQWgu2X%V+0z{;A1UTKDJ-j}(TCmur~|8pYD77Jfa^`) z_aU-6bC@ZggD<^i-h~lVt-=2}+HU?ee)a3GPD#x#7&{$?c!#(`qNpr3qcG^~dE~jv zq>=6=I`D6!f?9y%(op92c@BABgXM zeEZMYcuCEUwsb{CT}7?JcyanO4MN++fVgP+*E1>A5IOL?XFJ2#o;|(bIG&}^*Sqh6 zjVVS>Rc2A}tfCzJ9mpKPzi{$TS(*Maa$n7^`I%_U+Ytn?7@a~%B`0$i-%wmeGFuzc zB&Z@?c9E*Q{4nyZX}cgSy=sIb$#U<_fs2L@E2&~O)%Gk;Q0oV;JIlPyA6$6k)QI0- z;@OA%3_l73R7JUJi6-w*viAETLY^d_Pxhe+$Ah~asT_)#4z(aW*O|bV=-yPirk1Cj zn`bmQt~L5&c>t2VXy{rtvqb61ZQW>xsw~ERDWp1kD@lXWa(efsbuUth+f zanvTbYv{z$g_miW(4pdsb?*wKzc+xn>*U2Xl|nk@HDH}7Yys3#%Z>a6wYmRLk$-G0 z*s4EX3$`p{CoAp6*-aS!{^o4G2PZ)O zw+MrY*;~@Fe*s!Ooj}p?K8rmpbJ=+e+9{ofqs!Z39LHjU*q9;2)TmDH==*~ApHWUm zL5$$@hgd8Ba0vc?hgeJLJ32|*8kw7z8yo#sKv$%sDT^cz|0QF)POI57wn>SG(hRC@ z<3Hz*N)Cx?sUaZXO21y;6JI3RtSRt;!-MI=k0*pEM$EwTUJ&Wn+?3Y{hBSY{?%196 zdX&M~@cDYa{s$mI4RJPH9Dzs5-ZGtz(bJ7mPbCn~5h(lC>o?!HBj7!u2K;_Vt1l>E z1oUQ^kc%TxSABDPvX3`bZe6*{ z_#y^qR_Ab4xlJV%XTb;>1vydeY$*q-v{6zFPy4Ri^}>D{(Pnh6@gv&0=AsAxr)H(e#b6eZOdIeX$h?=~IRPm21XolPRk_`Ies<;Ou}6eIJ&czwoNXRyE4CO?z53&l@| zLPUeoAg>~Sh13!=jRP)X-HzczokqjB41j=hC;z-I1iaWkHorF8%BrgXG2&`Q#gAc| zI&mz8Tu1XnQZ4f&Z-(zhn!F5_sMXz~66Tq|KHG=cQvzk2#9jST5OMe70*BF$Bm?=| zX%z*~pD_%+XLTShTl?vqsf0y1XDbb~jmQuYIb2^hs&>P)W}6o}wR5u8zDlwyMG7oW z@F)|gFqV-y`(@|ns93-E2sP0QWt&kJL|bRZB?&o&z5!`BiX25Z)$uc~QkHB4kk>FS zw@ye_()Q;BE2aU-$kAgdVNd$G*D(G*Slm!>1p@ERLbVQ^%qD{Y3=*X^W zSKB`!P}KqE)cY?BYD!NC+>VX zct9Xa0V~5~li8v@M@Q@Q&2zO^?8ze?_5U)W46CD0Mz5WSf= zrI{w+_+4V2Ln37FAo~IK&$&e=PzA*B!yrt5es;qC@8p(@zV&~tVJcfI{*VXnYD7M* zq}*AvEoONgsZcueH9e^?VaWhJzjU>X;`8=BOuaN?=ee&u@6!+w&D1i+EbntEAElDx zi)v`xRJ8 ziygeJZoZ1}+J2mFx@RA2rN`t&OJ}G4>L01m z&Wo4ams%?NMCt01t;&NX*7#Q=h7>gPN$e3(hmV#3(-vX9)1}Zo8*Is>6I51_QEwv4;EQO(#I+ziG+`|=E{>= zs3$O@ETCLeZ?q&FiL>PvPqp<0n8I!)Qt@&kst0$)R%R2N0x@khi=eol;{*~FLbsJ# z@@*VAMO{eUY#gv7rU5hhEqz(eR|kaVev%$SlMv7@<=BIrzS|2>#d*q-Kt#Kt*2>8h zMXfX>lCs*YQhuX$>(Zu;?P;N{pg`Q$xR4+nhb{f<)ho@LfH2PDCVkes2QIKmgHleC zY~yk*sfKx-pOO-*ZIgWbyiCXy2SA3Ki#|Q*h$i;i;L3ft28j8ci8n%hJWO{EDaWsQ zDqG4h5IMDzfLoASTQ1HUiYkeq1C|gF)VFt$LwVfl5D~7#wKu%(B7HbgkP|*L%r&@W zB3=ECs3;K6^b~nxZc_&QeM}9EohQ^#j3~QExIQ<52Qr&XMuQj7v2SP8i~bS?3QOL# zWQT9UQByG!s~3vHDM|^7B|M~-hgDJ4sLrYhY~1TKyQH^cP3am%DOX?Yw3}JiTGoBW zK1!(h1eMb@&s4Q^`~ zmc6}e_%*m|qSTcuIVVJ&c)MX)0k84&y87svs7Ixj$9lg9>*h{wJlRgv?+mB)9?%|! zFmER2mV1hFG)8o&>baqAo2}Ocp!bNlnjiQ*rI1af8_xA=IF(a5g8o!M;F0Xu=F%bO z2E|zB@)9F#_Vi3w?^{?4r`5+mk-BZ+oRG=Lch0II1=w52qsJ!2r*%6_DPU|yz~gwb^DpWE=Xbw(d%=8yBc zqTvfdFJQY;FmOa3{H-!dXgv7$4epdc8Ap~=8Xr=lvUM{^@fLvriO$k+Mjdvl1hiN7~?f1{hi0NAa z$7WLCa5BZ|1OM^GBWH()OU&2Xd&@T9gdSZWmfC4Aqmc)E?=eB(EtilLt?wfIhnju> zmtqipc&877P}nn0g^?Nc! zP|7600zfkeSorB(!?I-1qCtBiEt&*Se;dvrpZJxgJ9C@S#nt~%6C`p)m#CNr*I1eT zMj4|}vCC|TQy$BcHHgVZhv~JcRy5s0d8@SUqP^MCg_X}Bkw8VU z%&3@GS<{@oFWC15g8hZ#LbRrH>_VH2(s~nIisAR=l2nn3@=GJwD$Tu$kRCaTT}8P_ zMVv#S{$UYj9uYmJdBaJjMzbtc6@TXOs++G>(VMY-H_W;pYlbhxh;j{4M&D6Xu}Y~V zup!bZoE>$Hvo%*`a~*ngsJqMpnwEY}{nI0oKp*oD@C4$U%)Z94XL+5ygqzr(Eesn~bvw^A)$f`kwwQ8~Y!G`J+sanVO8$97KRZF+dY9GebKVL$DWe@`kc`Z5=~g^?6dv42K7KB8>37I#*Ycvr7Hb ziyRxEj8;TE5nxf>lDYr77JWf9)$7KeNI@THk7B=gX-k!|uVmuj!lQN1{#aqe{s!F) z1M{4JV7A*WA+6tzt~4Opaxfq~*x8Y&H4#>=I(HWr&P% zvL&DtiV(ifLc$^_Pi>G!{oCbZ{QEy`sr^G!u{z1e-~Q<~hJMDoZ2t};QZRNgc5wWE zZ5kx~qsib${wk)iqR{NofOPc>*KiL26_SfEYa=l$7{Wv}@LXv&RIlH(Zr1ewBE@5x zMI@2mmimw%V(ch-NJhtVd75bR+-5bMy1M4w?gm!tvjHHW7L)r>gYF3^BGBr)qrcJ< z?%M<)rVfo%)~|ZCr}KSRd))V1sgW1~A@|bm6NJD*#ASGq)H*g^Jc5qfh;y%`bk>|t zqG?c2rdedEg6@~op~5QHZXu^wVm04dOy^Ek*oG!aK>9$%^18-fggCKlbx2b23b5$xf$QdS{E6(kiJp`9om%NHX=g6>u z`i=AY*)o4E==>%^sfMEW_M zQGs>6>>NOB@t1f{?uNCy(cogR+K-2gw@N36SYalSUO}0{4NT$VWcJC5Vq4(DV-^d` zG2=&A$0mb`@VGFT;E1StO&DX3hqGJf^IDg~k}C2tq!*X?)!D4hTh|BBtnypv&V_-O zg^7!rtd(VcL;Z94=B+)~2>2=AZ2xW>p=j>@FWQJrMJ#3H@6A}Fgv&b=v)E)*$fkpU z_~d30zx-WEbKqVOIX($ieF&&g+AAB22#)Ue3n<3u8n4~naDO7k=;<$6j_i(AlRM_6 zTY~2wv7h~~2aork`{V7upRhZ$;e>DW*P>`V$g^QFFZK9)2)K?E6ngT3zHV1d14W5& zvY?d_zYGGXGB!RiQkq}xgnF8NOQ0{)f}+|k z(-!s|2(#40i!l60ysnjh9SPIbKj0KyW4E=j^y;M`?=AS# zQuFaghh(R#CW{yyL2N4076(^@oF=QZ7r{}UZ5os^m0?Ikcj!!y&H+0hUpxosWI}_m{#T#qm zCP|);5Y}dNduo#qu8VXpyfLug*oC#e;S8$B+kFhNpsHEygM!Z1j=%cdxQNRRZrGUN zgv4Ge8ZE_Alb2fLKe*HI5NTYhk*$FUnL+?rpB$4^#YLjXI$}?+#GG1ap@FpP4jgd) ziW3|y^3G@0Kzlp+X0?t*-Je(Pq_FChz9>`>)Pg@_cGM;}**&V&n^v4UD=9K%!!9Um z_${bXkbnH_&f zU#jpsEpf-v*KKIZHFh?c?mH^;a49w71h40b__I1}rIE>(#^~(-#eNP>_nGOlY~|PO ztO}ELb&^n%}GO?zkJj zi<(&rLRCrH5rOh1Balc_dKiMVm>-K3z|L_Aw^53zX5d>R%pnP^HOKiI+k%Hla`EOf zA6Eywq6xp4)4i1xn3}N#8Q$EM(n zW{bAh_%ym7;%4>7C7}fY{r zSQ||4a6kr2Zv5`)HZ1ht(xa@n-F|Mv{8Y=PY%zhwv(H0L#Vq-Ieb$%mDK` z_JE+#W7d4yKTO*&v~{8Xdpu?+FlWNyoI z_>BYcb!wM8oHgo3H0#*7EV^Bjp4_4ko|1YGKQWYM5j=mpZNJrGZ}8I7>n3%%<7plx z^qmVacMa{AP;3WmJPfHt)k|`5uX1MUPw1Ii7V9U~j_W$|?rkdWAngAiq15CRVI62s(jQ`qex}#h!Ix85LGc)Xd+=s#rmM-E)bQdD(@;VUQ}Glt9QvzAO6JzH)H=UWp|s3% z?CwPLx5zadu4qIyl`RE#W&#zpM$ykjycZ`9vYMFhjHt;HoR@5;+f?)oLua_ifZh>R zMagV1ZLu7D+7GHzHq=|pFf9e+ySD1v@a6tECyrq^(ahl3;OEA4Ww0)5M>t_Z`&H-O zj|-18M~qo_y2L>z)6{P3{y&s`Q*@J%$8-zp#;}?Y^WRMY$+S^^)=Inxxy@AGG?VDS4kJvT z4rXpsA;`mAAD~>qM3sQ-Bqy|i!0~Q%>Qtx&)AhP6k1{Ud^pBhTFM)LgCA)C0B~&jw z15KT{gy6>6BY!7??|sg#9y=jzDd|Q+C8oruo()lF*{qe2cfA~{IkkE#dc!}Fxq0HJ zLH~?ZeVq$k+e7G$wEM#{g_0`(|K6Rw?6@+;2pwUIug-J<`u=vn8_@~XkY^jL>gHDe90;VaYSqBUh+AF1w^!<=XtlXUnI6*D*)hjCF_7=x?S5v z##`(B0rN^+;0m1pIuRvTqWr9=@3>vq!e2O#8^^DP0zOH`CrVAJ82`8JJm0+6pr=LF8(8=!TC7`K zkID3`htj;C8cMSsO2^#`hHP1;Y{nHXPdYWz zNBT`~S!*BU3fzwT8jihgCUCQMl{thzrgt){g4u>sd&1GsGJh-syw~qUgYH~&Q2o@R5Z;U^$170 zj_q+?{+kMfRFtlX{+m;Qe?vs>|5!x-Dg974w6QjIA`v#UGd8sm^)NPdaQS|+{=Wil zUi)te2=6s%O;S8tjpZu@Es6x8BNQ625ye@e0wuzH0fK>#s~&E!v3Lvc13x1`p^DKC z_>Hv&h6cj(T7f_&VEyK`_l&3dQyP9AA8=bJHmDA*AzU+(OBFh0N6C~cE-WruFyiDG zvY)(IJv!JAZd)+7Ji{JTFh`=GV)BprrKxB9)*gTF#}vZe>(@lXf_I%Rlos^$jbwW! z3tvttu%=DJ^v-ioy@p|fl`p(=7O#*wsP_tvM zU!gHp${fXAY>21Pea-GkW6+z^m<^8wF~++kT=G-O8!6*%URXt2>3nj5nU@!Q?Owrj zD(kSL3B-+|KPh9`m)QnSa}r`gklIrtpGBO%F!R&rdf>;y=X=2c6<()H-HhIt7E<@HI@r`V739V}I z1)n4As(I2DKKP_pg#+M}KTv-M{rct9UTWOlGK$m9|2!mM_HUJ z#>6RIII+_Om~{%pb97d=WN7iHG>%-HOlx;^yr|zm6-PBu{DJ<9ru@~+e}tVo27vQU6cl@b7WgtbXo{t&aMI%S-Edu3k-ImAynNXC>{FT#9@VKgZ>$SfmkI-PQ(Y zyRtB$=iSXjT`uWSqF^COp+J!{?t)=v0OoI)Z;Hh|SY!wWZPVUuBrq;Ttau z+!r;3ZMZ#Hq4%Ffp_wP-FusnZUl7%Qjp;$(=xpo$dK;JF;Vc>Sa#D@M)| ztBLe+T*8q1E=Rsdgi)QdPN`=rZ64NK=F_DoCY|i`B#)w`rA50*X!6uyN!97FTJ;i}MHfG6VzumO z)mcefO7~>gxSdiTFHX0ox|44VT6!a?;$n3 z97*i!{Bg!({bDs5r8Jili$rCOld>NW0}0}psRJFXyc5nVD{;W))Tk!K))I_I#P&n- z3zDg{+DVXFDUk-YWYH@;p}3#gV0(liWGkFIbZRh&4mWO>l}K=|YLVqxf5=j>*IIcJ z4hN>d7X3hGQ@+lUS9a06DdP#rf&F=Q&~<{WmQou!n%C+Pydk6{yw#sEPFn({2F5}< zI|5DCHsh%|Yb{lAptW9;M}Lg~G1;npq%)$orq=B{0EOIh+>&?jH7HeixLRChJ}Rqj z=>E&mrvJB^G1tX>p`MzH;??-u*hwb%^Ux-R_P3$xYIYZ`btJl0vLH%cYaz;SF|8r)_IS zsUEm?t=8GHrjo&1U{9GSY(3w5kb-%x*h@AH}Y?hd2y> z>J3s4g`pV42gtRQho-`>AqKhw_}$Ww;Ejf9P{llmfuv<2DN~&q@>Up&l`;zBD{K;O z$48*uu~cm9tQsdw$8k5h@#yBDsS_;ssmGkHLSXKmFA_sF2b$jT#+v+!{CnUpSMg5hu&fM-tza2 zi@|jBwlc1fVf*&rK829|m(z{tJEl+&BV&zVZ}F1!U>-2{Y6=*DR-!S-iKJm1NFTVH zeVkMJ1uT}-x(D5Qe_BRYb|Qzb2eHrF;q_%b(W8S4Z|0RD=JlEse^?g(S~tT+Ozx8- zBc1cs3ER*O`>`7K1=u?m6T^VxAM*5#Fh?Q)t9D#IY9U6{5ngaVPC*tSqkB;N0|dBk z0s5sGzw+joE@S28-jR~v5s>2XDa;&v%;M-g%aqQV&D zN@c>0&~QczV7}lv%m!w6IF#{{kZL@2YfNo^b-eO$jZ+UagI7tONY!b}e*o^D)~v8f zz#HEVQRPMqcSo`|4X4}b3!Za0gR9TK5?WjD=i}`ZYrnt~4!!7`e4ull?8op2ce`Zx zrVjyj1o34GWH-P)@y%Q#$Yoeca_EsbVCAtUkTJv{a?^Io*dwvISzp53^O=)HI-ng- z1%2>*y<|6k6vBJN8b>{9bcHjzYvz$(@3NyU|K9K9JBaoL*?x~FBD%mNQotIt+zNV|Afcj1W}E4YPxVH;Bd~W)mYEzh zZrS##@tE@uA#Li>^3Hz(F_&OLNZ$=_Mt;*U0vTZvZc6i#N4ofD*n|mg!Cvs*LLFkbS+n1e<^o zoPcFP`Ctf-1*=^|uef8$0FKk;q3~>lH%%7=D2tnCSJK5;QJJ=R9yWHnZRYOCqx8O3 zakDnCdppKI{xnw$;`m<>y!;4*-HRIE02$&$7Lm0aP~;jgb`D-LxKUlPR{TYnwXMkm zd^@+#kMyB+A$sEf@2x!N;`FT-0s!FRyOopw$5t+CXJTn+_b<#mMO{}xdlZ$g62B%s zv>l-j2$5!QDfM8;KqT165674wjEamleWiKd0T8nWwj+vUN`8UER!GXvHgl9sZarCt&Qtv&pZi&EW2aVi$N|Ze!}Z$l#_iXc+1&288-M;c zN&uYjUmplTqVy5H8-5x<8}POcp~aPc8eyndC6Z2U>$V?7!(X= z%PH+DZtI!aBN-#b%=Wai8k$)nP76u;4bCudq&XKxX({zbX-c~HGZRrsGp=iLzbw4^ zTNaM*o}6m(1a0l6CuC?j*Ldt=WJF6bJZd#3D4{EK+~yL}#%`((Rjo(g-$s+vtFO^iK~1WBowD+y`f*16$@9SqmuEDmqzSpm)xnoH zabQbB1KbmKOFs}>8XeVDa=|icRa2(uOKnyambQNzG^d=yCZ9hSg&wkXwu-!*;E|dh z+jY!#SFYnKnwx6{Hd1ko-M+{-6%)P?hM4Q5)_7men6+SLMgELo3nRe2Y1`Kb=mFOP z5+Odv8>PS(O9q z2nf9dmn#S~9+3*#S#w5)d$@*G(9^OaS(XOb4=MGgX^ODf)X6 z^IYUF!H8`(@IXbq+qJ+VjvmaO?)v9|PXJJKDu9<;SO*xMIZ(r7AR$P@tA2M{oFH$~ zK1zrCW?rc-TuW?vnb+S#5bUr^1#WxS;wxIXh8hVa3KL`YE!v;2uBC(t|OC-UvVI7k=XQ~quBb)p6u>nkV3 zPd}L4CY)|WNFOJ|TG6lQAP=D(&~wuhO6Y?t>;X;N9r(1hB$S~bgG7}KskeeML3nso z=)$fytxJSLpG~@loMvt#Pta2eN>np7s!AX?AiQt_yQvs_os>6rvO;O* z^5@3&vMwU=jgT!gFTWq2BLTxJj0`0qDRB%D!U((r-hHILI9&0LfU_%@q`jAbb-i8k zU|_G#KAI);FmM~q6KayVmlg>%buvga;PKYYMPO=iF|WLMw}}YFDNCf+}y|Xkx=TG8|V7oN()n*OgV0aX)6SDBkGna(9B*s{8bV!#K%I2*IZBq|zOLKo-K!7h7 z@Iii^%eggRM0mg`90kt3OW)Mx7@W@S{;e0^5n<>BGw1?&wzfYvHDoSU%TPG5Tsg2z zI;i@i^nH?|y#SLRf+BwCMcY>_nvgCUt#-?at4{zt zR{*@>L;wzVtO)qm4#!3a@&)D980JF%h?0Ye1}9S)jwFS+S26J@BgayHmqw6lmmntT z%q~3U>E^6LI2AQAw?>;$84O$nwph$mqGFv13LU1Xl-O_5A`wRwx7IrJ{J3ri!Y3q= zwaK|ry+Fk$Dw%q0gZiwUI^60NrivA&4>8K>X2lc^al8(>#b;yv1>OjK_U*v1qRZsA zoYP~Si_X?B*QHq6v+9OSFI;6OXvprs)3(s!p6a-KK-rg1>_ZkVRi*V^#|y)sEF%VL z3miY!cM1J4SyG?ZTKh-0C@mvFzpP$S6`*{;vLXSl67YZXxt!E=y90XbTg&%AU0MS1 zr|X`j#b+t=4AcgdI7Rh}MDFjfy?*^W23lxj z_pkUKt2KWMqyIAo`kPA1#?;Wx)amb|j1*<-zmy5Q%1}QyK&hyr3VEm&Qb(igfin>x zASLH1K#U(I>tZhZ+|q2ogL{R0-@!i!G6f1F`TOuqyO?z;XjLZCxPNs2^}3qGQiNYfEUy$v!q*DX(ajRiyCcQkD=L$Us{XAx;{nS{TX_y%t>M#!jQlZF^R2iQIr zVANR&*GVnqKPdF_lZ2^@ntA;JTEw$3yeQq$CvoVMnkpgNLMBVHNeZS>X6LaM-M0}Z ze_R(;uk3gN*n;t0Vyh;>0k#+!Ia8|l7AP6n)13xRoEMn;@?0PWD*)d&tz3t4z1 zst!z+E}o#um!t;^dvs9ay7hcn<2xV}3qNOF(WFpSj`>FK{skw?qryY7 zjP+tHE3eomx!28Ee=wsW3|>qmJG`Aba$4JvK4DL$9WfS(!^y8}U)5`G>F$a&{_jC@ z9dKHO;tvm0BtsSgOfusvq>ajXK;g(4h|BfzCSAje5jv-L`r-_D}$e0#+{-Ls5+g`6RjsJ5BQDn2hr2gV+x4N0Z zvJgjJOe5z_^vih=Wij`VtBIE90PQCw3i@CLC)71<34x-yjy z1zS!2OJZaG&0g4H>`~~Vw6N|NG}P<}W<}6iKBx6v5~WwFZL!VZ z6mu$BjrCHq=dy(38U{*QC`ue9SX3cJgvF)NxeFkPs(Vgys>X-Eitd+7wf`Q};Ua3O z5|#4+T5cX<25ZmSByA_fGH=vOCA~2!PvHVt`TXXja;$$S%uJBPA2&j~+@cxP^d-GW zIj;h&lUJkpvP{#3i4*G)DuyaD+kgwCL7^82K~EyATtN!NOu^y7#6he?*)oFH zr~_-Sj;(w&dr0qaG$B_aGJ&g{Cp-Yb*3=2w@Qx3 zhxA%vTA?pljr)I*{QNabKbiWfi}`LoAm7=@{=dq`e`Mv~n^E`w-NotL_~}ZiM5iRs zRnYRYPUR*sfCS9QNU1$sWE*a>KzH+M<#Hv&9sd)*=Otf^WPV5;*+1EF=G3Z@(n>Ki5=;D@P_0;e418&p9&OL6lH@9b{)(VlZ7ju8Ya^r z@SiAcx@W2tH4F|t(?G&*avek{u6qR)I7}#0{xXfOnahegn_jj1?y$p`72{D<>QWy{ zuKE)XxwfI58*T}f$zr)t@HdZ67kqaw;oBf?(c;?z&x{yB9wp8EBw z%P51a>kgrX2ivQwo4$nOv9eIr(tZOQ@J&BLAh7$$<4A+G!`QI==yteay3QbP5sIjs znBrpn{Xn6~Z1cYS-sE8>85goa2A__-!ME#*V=gf|xxCp95r=Ww(!JX{OoV~+FV3_l z&~ZadRK%J}Qk<#7jcUWf<}jFBoj;s|9~nI7s#l?Ym+~FMPgBa;e#~{DCIbu$W^T+( zQzBTT$doz^4x>XjUb5*YKXVlF6{(AVbwzfzneXrkpVmGHgKcMkOtU}JXXTx{`7Nz1 zH&2)Tn1B(seG)KwY#2+&I_BY*n@1)?N@!9grZGc5U2MMy6AR_ z|4CAu@Kf~-EduYSd0W`I;*Bs+iaRh$m2c=DnIIhETg;J8W(8vMd@!Oi50!aX87fa? zVG`wo#b8VrqX+bVM^^;|1c;5_$`5Q<008>`O@RLcWvN>$BdcTh!GW+^6N#6OcktY%)e5;uSQ z_ABJ_oi$q2C^YHDNJO8j;LK zN^T`3F=aueECoHpt?#1VjgfiRguH%r{2r>PU@}WU8fnpN{?LTPNc5|Lk8-@ z4G~-u4viD4rDRl0Mwc9InkC}cVi{Z*a&cm4$&)qZus%6sGDD27B%@wY_L!JU9d>%G zP420q)3}~=+STq}QFRfLZOxWiIdATc?e;+}exhG~4b9R`rTKO;)0b*8R&jdnPBXWp zET;rP%MJqA)M!z&utc)VF(UoaFzn4?TM}$LBBNxdnT#b^9>s}yGgHmng)U?|xgt-6 zR(4ajaCXKDgj1{Y+N8cel2KT`En?IZM<)Xje6EU&rkQ72y3M)5wP%4^J zGD4HVrj%#|V+EO2Pq8S_VS9q=cXLpiRL+F5S-;e+B6)pQCCYdJg7OWJp2=#58ag#Z z(GP;uDLlpdHA*?*!@?lxwyJ!5Zw$6%3^>iy4uU>PjXqRR#tYRt{8`2j>)7m|V2lDw z6(KgoxyStyv(-&5AI{<9VF81a^qISOifx6O_*UUC%WyM~F#^5a4OPfrC|y6!p|*z7 z=Qxj|BCs?F2j+Ae*u|8|i_VnUb}5-Tcnrf}{3x4vhJ+}W5$=*ra^W&iniUQsAf7{6 z`o*CZq2P8r!@8T{8}=N~wl?D(l>5PnjNfxT5uiZvrCucZM_)wxOC=~?WXjGeHBn`I zC)5lqYT3%leYEeP#i*<^!rVej%e63sb{iH*Ck*t5a~{&5BY})o5o<1jsBGu;e%gwj zQyv0GZ3QfujpiI}w{42cw|)t{V3t%d%&Bo+T0R`vE)(sTH7hFJ@02mQtoYDFGhkQ# z3=)G$F%ykQEhX%3_wkHk?Ox6qX@I(CYgr5zrT3j-nd5Kfvp`rZhf{nbDUf@<0(L2# zdAfSP$+U2a;HPrZ$~wV>#n93(%!>5lnm1Q6fuwPQcO55Pq8|_+1><7d3T%Sl|DAb4 zw%y+$N`Yu((Q{blpRppxvcLs^k7-4^ym157k41*?H3z8>1;!9TxQ_YwUT5u-ZE|L* zj~@Bd2yW3HyOOAN+YE+N^x0NKrefl{9I;q=fbA?7e#7Mmy-ZwlhEx7DzlG=I@_)X%3B*GT3gZKlColbu;ALXFP0%KIIA_+i1wfZ)j@ZO zu(;OzPD~=sg!c+Ny$!vXl^8fJebOc$GD8lb6lf!<1Zk@)QcCc9gl+xfc`ha9>a?`T z9`d(4V#Q!N(gfWCl#k$fn#PY>iW~iJlq5WSPkVUV$u#5$@3<+9^NcXsO@bpjAnFs~ z)=vtJ;a;D!i#}^tbbk=uu$SDuhcgP|2noxmE(~m`;8%_Cr(CA3AC-=6lhJDVQ_uS_ zk_f4bd9NrJF~Kv2)<~KR4{g7R`0d2}WwhwW+x0fl5$tM|9nwk3i@SQ$DlpR{Ii|0K z&X0&EbkTE1%=jF-c&;;y`rJOcQnWLQ1>T3IB){Yb19qVQ?(ydO$6P-e5CGuy8{~-n zf9t=9sg0?Nsq(k!po^)wCyAK7lkwlg&Hw)W-`m1ZrAetl0TfQ>L4jW2Lk5jEzaZ3(Sys+ zL)1R1qolEtxzKr(5e7Tsfe{kI`WhfqREV7RVWj@`1ye~0bX9_9`m<6d9;8w}aVF7A z$X*g5)c5Lq)Mb_6_}|L~2r=6lKqHrK`B4k=`sC{*vzEdXeq}lh3PWeTtO#rWBSx@n8wC+foMe z7@X5?0W5_ShJX7eIb!_8Mv*|<81skbE?V&XC|4NX_9$Xn}?wU+p;O+QY)d5F>7jSi}N|# z`+76unxD@f&;iZe1!l*H+{;mN)Kq7_9V^z5CM-LSg3by<{a%$-M|sc{7g2`dqBx8a zc9C()B3;!FIf@K_5El1Sb|#B)3KHhvx0d7)t@ezBw%1*cIy0}PC#}I0XIz!+hFLe= zInaFQUia&GkU+=I3YDhw8clcnTB3G!ha9hU`cG#-mKFLxUpaf=W=l%!gi_URNoqoPOZerZ*~bY=^?iY+?tUn@SJxA z(}{D@#K>&YJv^k)ziDO!^f|sHw>&o@?WXV}u2|l6TNg4;0#{u-MV=Z7INV{T zPY`CuZ>3X?oM~{Xjcj(z6NG z%B$s1rbhI_qq_!|37}H9vjH|`g}O~PALVm=51gZA?48G}KE4!2^>>w_?ESMB4sk>^ z)-VFJG2$Wkxy3Am(<$;0z8m@wVw}!#pco|nFu4PVWdBGqtWh7iW~C|~RGd+XK1<{x z9^?%BIcDq=k8lYO+G$k}+aBZCGCHxv(b3}aq#daALAuSo86J1Emnan9ZbPO=WOpD* zea?9$IfBrp+U$PGE6PJCW7V=4CEsX7{d?RntOy!51l>&$ni|{uBr{*&PBufI-?>-H z4?CEV)3m2%T7?+`4=BG3XAtAMAOb%qXrb^4{eNjib4W4o*b>GxK@i)92eiD ztA2OA4AG91NsY*2l0#9^!|yIt;2I)2Trs_vNM?fwV}gea9}%inwQK=cXr{Uua>Z~d zCFC#_>hRsLmv|q(5ZU49W|U6}s?5xDmBmkVDnb@5#m)O6ffw|J`y#)*W*$_}QL1=x zbt=iEB5Hj&CAKA!s?KWZTTPEZ2=6UTtjfAyOABuLWRWMB)tCT=q}Y=l(-Du7me|t% z?hrp4Eim5iR$W?;R#z8+;nWmX45RBft6$8@g1!abp1gXl3gW`y<~B`Kuvx*n7l>A0 zpZ6il+hX!^wW`oY4Dp6(b==pMW>Oi=M<{=qoGCva@?MOvWTiq_-O*Nu*d9u5jdtL0 zXq@!+Hh@w+hb8#YM^$UOc4V^e9~n=g1FIZq9KqZS`iHslvLPX`S6PZbmN5GPiCJ3| z>|^Q~rf;&%pI`?^KvEb_7HwO^!p`kRTxX70DwMv$Hb)t&ocuzBj6phe4hA9Ek0iQ= zc)L2t6kmxIcjbm9Hrbis{r*Lu|JS}=KDK)q5+n&< zzz?CR8riH82?9JfbMvREwT#C5{o`NP0J%lR`(&xMDDw&%QLxyRWO$Uv^-j4IeahIf zO)_m{>trh!QuKoy$+Z|UX6Nw*by+yjVHNlzMqf5_$fw*}(G*O_%x_J?2+zDJMTF8gDoZ8}n7*SxFW&NT2 z8dHq}vT2Qr&^BdOso7$vk~3tc-*enPpJ0i3=i1qU|rV z`ul(eR;7KY-laPjHf29QCMwv~hT}%Ty)Iw_X2v8E>P|*?)9ECSP1c6fBamxw#eZx> zp_Aq@-<=9*!Tz&W#2$`}a>AEz`%Yzu$-3rAJ3u-^Ht53o@sFSb7Ebg{CnEkl$CQ48 zGI(Si7wSaCNm#HU$&zp=*it~E8_Nu6LoxNG>K#u*jLkeR_`6Uz=8^^dsR3|f6E`M+ zb2|BC@~Y<@9LxZ)X)Est46Sj@Kq)1XdJ>IUU$#gNT7B_$iTw1bkJk`^wqtL>OHa33 z+ycfCi@x|ht@#*q57d9PFYDIdwFvcFH_GxKalyaFm-*ko-@k^|_b#aOh6=);xN40CqCz!U?R+~W zC=~GmMQK8v#3mLQSuKfNg#+VfhBy-wOf!#wUVtAuTlWLNQ%#V-%pU=ND8h6l zK}H=*7QruNy?Z`quB7Duyx!Xb{JPDEbnG(SqcNK_>7L%hjqA4F?^|uX-KMS#bzoQ zW9!aUFOaf>vRGbU0#=e%6oy)LMV)Bgx{8Zo|IA?%&GtfhxdivCTAdBnx>IlktywN= zJAB3E_n_z|SpOY6P*X}&TfUx{D>AZmnW{r*Px^QSB399CTjO4$^)>J{@$408%9(x3(l__M~+ zhq*(9qW4G)OR_0ph{}esv7Dy+GMtt^S}D>AArv;HjN(8JPLhGWP!Fe=w=jnIcjm4O zG`d5E=D zXM#>AuuKF)Qyf4d8|O-UMDbg>vHr-youhZMwwE-_i4lDdc{|SpUkGd-F;; zz?#q)#keZjNmGJ*B5cbEZXB+Pw#-O_=R{{_x?*v}!#wB`&2E+7`GC@!=F}hWKl22Z zareUiIT4R1QMi6lWQn(z!HK6W(-=?G%a&Zi2eCnzsh=y*7*(EK!W~n>7<1Gra^Hz; zVdnA4QhMtZ_rYoE{AZ}?9bz4yfcUV-(1avgza}$92cCt1s7U%7S4LdiT1ZgtZi^BjNsP&&JPy?ifw z0l4h!6KFX|3`rp1;ZzKX;g~g=i^hOCkU;R~8lM*la(VKFpx+oFj1n}iVPGrSNHhu> z3X_GKO%-5up!Z;TV0}zB2=*L+qHAB*Et+gh28J5OFVvW+ON%4HZXF z0v5znPy$z&QN0EQWF9!ahTza=R-nmOfHq1C9M)wnn>MDagOEtYbtZ}NVW*KFEVUuY zW431(pzl>6nx|vNVd8J{?_ivq5%T!AR#ck(0I)B16$z-Fl|XiKRa#CdFtU>w$4?$* zS%)N#O|FU^^GvC}l+EL;L7J|9ZpoTkq#FcM6PMC8UcpYq%E;7USkkBJaZ<=MD z$#xWa^{2xjoC!sm@#9QUB9j4Zc9TK?K;BvCkD1IB|4ouVb2v$0J6X~XbZHzE(t{!- zAPrg8ykNqMjn8&pk$Y(7(~-STs^~^VV1TufZ9^~OR35@_jO=oLjn7?EtnmVxk}H^q zMQz3;Q&A6NEU&n{z@r~DD8`t#r%2XD%GwfYDQO{`9A(Q07U`pxYm`Q{E66i6QwnOM z)5K6_DW$f8^lHOcdUCWSiDt7r2g-trqn=577J8&pZ@_jQw#HM!a{et`7bsnI&>AT6 zkQt&z(i_G^td;b@wU^+CW=5JJr26Y1$u19_ga`=uqzN?Nv#4Wm3k_cWu9u9tJ-NfP?=n*_n93N5YurLXe+ zWQ#S)aitzVPVNh6)g@;!t?8RETR>YH`^!V!5&K7QKvYWEg!`(R#nX_I-^1i;9-yvT zyLnU<@c~x9n0?t(A86Eb!YAF!C*vkV2~8Ic1iG?cjV#-_Ku^=i$xw2HkhSUZ-6`eh zo3+vA`b`b3rJm~o{kXJFu8on|g3}w{irqu}ba*U8Q1pM$xn+Q{nbjrR>9g2`<3cM;-7y*cp1vYnQni&g5s- z7CM*J$$GR$f~m~4MXPut2+&s}9|+;IFB|l)m8?!Vl`aold*gnr7krm#di=mmA>?p)~k9g7!M^D>5qOHFY_WL9oxFvN; z%dO<*FLTMlXB}#6O{k?xeNh1DSCs4?jOmZJFK@0#0Pv1?3$CN5@30fiD7U@AQ-v9` z4&PRRCUbhk^piQ*JGsaj3cM@c(NVxU-rdq_hD5WH;+@KsO;0M;Kqer8`F#ZA#?L~XXTXB6&7Dq z1u5Ds0Szqi+`R5rU~z*Eya8rLFmBYCg`4#Z$=K)>ADqTVpj z@{;`%#C8qMCQEEFgh&jzfkcAk#fa{_#SXYibA|7L{ZUj>N-6PAz@M@b=E)U#0p{^P|m-_FliQ7swsdt+RAtu~A_jrCSYg7|hsIa;n@jg`1ezs;KNR)vD9En{0Qz zvaw1A(8R+;SC!i27LcimV}GW@@+Ntl#V0P@+6`vi*^iSJ+&AD+c6aLy6Pxgnus)i= zYAxacYnnJKwPwnEn+{!e4|;^jqbJZk)9Y2l^x6*HQLghQoL)k0+jU7*UhS6WpVtkz zwj;sFt>krl8SUTFxSo`dNb z2MTvF#_u5vj}vNj_oY2yfCe7+Hg7nW+1fszmsyW^NP?<(yBs=zl--41B<~M9GiMN> zKJ~c+n`h@E#vTg#wkjgVFPi0MQZPLf9|<^%I)!pe%R7f|piHPx7)RVM#s6|`h#~JS)o!J1oGmF)KrrKwuFqkxR#Qd@8s@&<7<|M7{YJ>N^C7k(4SL(;2jC zd{NK`3}pJn4uPN9EQC&v;0o#}gOeK?(R0O_P9@XdyoWLaJ17i?MxvreDUesbf-9o6 z9U!fR3;ZzP3#H21+HCU&OYK;>9Z3!Vav8Sx-*S!CfIrJiJGjdrpox?R#&H{*W+%R0 zD5zkk?t!U;NJYVzkJ>(H%wgPHG!J6Jy1c`STw8|Nde=d98PG&}HrT{#}vyzpK-KK2Pv3JXYBL zdwJro#alz0?-==u)BbZ*@-x2w`w;^n?5n)KetAX9o=?!raXvULDlLit#EZh?riE;y zjdU$#x&;2XAN;1EI0*+vL@){(nwkIWZGdHnWC+ucWbxZ-Evi;M&H;CL z#Z;(g{6IBw2rZQL=bT#AT9cj3p5vO_l(~F}V~G!SN{A&(G`kbE=%Fi}k?tF(VckMT zLXT5a-HTz{Z|7@Va=C1(3$@Q5Um35Ha9^HF!?k&y+p5pzHO67o+U>;!WI8lelFh$X z#=2bfR=gqD{YSpIrtudYjuuReUKterKKAH^=xNW!_&;LgwGkMF0Iinv?uDOWM(|@Kig>Lp4Du z#Oj@&=*3RT^*X2u#r@zBkXA7pPYS6v?v86%`{;L};IbiLk`J)R{K<}HohVSl-*!re7G(M{z1$zMpE1LGOX8u`}sln<>y)f2XDja5Vnx`QE(E(5m8;ga%oC zTCHgusj=G6T7sF*MLUVrMWOg3)c3wRB^}rjV>Xte#7JGu%38T7M`3)V@)>Gn`Eh0E zbt!8rZop%#6`I^peZ*!;WsVkIQa^ahSq)3>W~F!5kiXvWeg263_)4R@m=ixQb8_5P zJHKd!1lM2E18h!pITr#ZyS}>Xv_es$dOg()1;<`qkGLs~K46mDoOq{oI!dk;EBaUS zSf{HZvf6ZFiZfJk(9AFHp)0`$Bf;r-i1Vj#(tEWKVpz=X&fmu+wcUa1GC_@BS3KQm&-YN?Z zT}?qAVWxnHMdWl0Z}`=J&}-W-;%v(~-<#Br9nsZEV{>YJt7LM>N0R1I|1!pd&&eYR zoO~45%l{-9xxYxATH|rr*jV`9+b$R9Xg$IS zw-B~nB;fD}Hw;E~F-MIt>O&r}(jNN^g{aq5#6fL?2DE`Bo=|_-bk@0Bb0ejAX}d0n zUmyXG5>q)vCcQGCXp3y|FALz1B-MmSo*Yk|Su+BVC5m=exl}JgvLxWEg+q>wl;dW9 z^Z$F!#YMlfH+*+H;P1TS`kz3ofBFjiKS`%#Esgyxgl4a0J%5X+#j4h-6jE_Pl&*gP zh>QwE=m+Wd$%-k8vuSA141HpM9fm@sdIA1W9OlkqQ9}svTjg}V&UU_TXMTS;ekKk; zom#77Ff+!%rWc@o8X?mAFQMbH7gs9yAWpeh6k(*Mah^(K-Ef?pJhb zwavSnyGO4QsLipuZ$J;V0;wCS)ZU;wagC&e-BB<|E5yU@FCua9i7a|TeHKQgyKGHW z7Lhrc5m-nc>P`Y=yXVG)n0rpPd;SjQ=8|u60=}*P`hOVv#^6fVwat#RV%xT@?%1|F zw(X8>+vwP~(=j`?)v+;apYP1f!A#YzT7Oop{7Sv=^W4{cNdiEo&pdLwOT#?BXCh6>^9KFZdKj^l^_6}CyByY@ zMB2_%V``zQn4t{AdY~;(Sw&dGL0UVuK!0~TWf33O_l48|N%#WD(86=JJ;Byx%K591 zEyoT5<%QbTt^--Dmjce-bfS1fw?Ce)`BB^?K16O1ey){mMV6uuvrk2dRn<@b`;!nY zv$ahDyv`tj!}kAQ5N!H?SO20m_Rjw(7Wvo9ELrKFm4L3hgY2@nFg8@NGdE%LNU0^5 z3(!Bm(fZ$fVUIxLA{t3EjYk!4j#Tl5!h8bLX-$$6DNu^Vdr}P3{2kPYS3uxuYUbMg zet3WO7;E(9v98(>h8tKMPc~SO)PlCIhAhq?x*HSFL6a~FE3B@dP}`5RRnBkMj2%^e zc7b!)+t}W0(AJf+_6UE8W7lRh53rtgUtOj!;$`E&Qo0wrbqSJFanFT9#4hUGG>jwc zu(J+vPJX<2(W^1?l5N08QHj{>l5*JGE0*NEj55_fQi7l z%rENeEf;grFw)?+BgSF)o{`UntnL=*umJZ9XAV>=2YTcD$=^)N$erfQ?wOZEc5sJK z4zeKHE!ZI9Rle0s+yCq$6t!fj1n)9b|GD7)#SdPN%hiwbIAmwqy!qLwI(4()K6+kE znInvt7DvP?2YoRig(&iH-YTRLSm?o{hZTT7Lmm=IraIS45iHP;x6znLq|TbLXg-0h*tNJ2(t#)^(g+E6l3>E4r^gba3ISf3 z$_qGCgtApwJ9l&&<|?ei~!R3U&gORzvG9hkBhRf zBX2~Cyb2U}suNs2%3gw+Iv|2bF2=2J@Z!mCTFKZ_3rMd;&3`bM)BBkk!jtoL`U<7> zDDs9W#k&Ny(y1)5n_KClPsE4kAb;q?fBuLjt9p6ZeJhfP;^=>Z&#qx#3XO#d;(WB3 z8$seD9JqomR3~xe5og)yR{wKvS$Sc1RJSiKv8etInRbwG@7`u!o4ufZ^Cokuy|VUJ z=YCbQZ=TIxS5uP}DCeO(0Ikh$;JI&IX^`ahkq0dsRY%F!?=E^3(^Xxixy3LW^V1f4 zKe5juc%fq?i*(?+ardcrvpt!V4UaW&-j9m{4ob#rdYR+ut-e^*iFD>Ie6`d`!>qPv zKtT9?L88afF8-Z%s*_2Ck?}u5MAyUD6a#?I#{lqjV*fjL)IYDLf19$C75_&nWHeVK zTX?Tnaj(0f0bz6^r3H=*8=MC#IJ`|^$(p8Ww@&PuHmKC6!+s) z_G4@+=NI-$oEavoyeMw`TS&Bt!%@0pARjcC*Sz`w5@_<;mpt^k-sVa_^2haE&m6GT zj+P@$=?GTgvrtfkP6-cLMeRwlYND`IQCigSN52&gLi=ugV9j;}Ue0}_@K@0V?>g^+ zf1HPwN}&}p%fiQH#>3leDsRkMEEdJm1+MQ1xgIFaqSIWmOi0}pC)`TOUhy8z$cN4L zUWRQPnj0q}j*^KE2cR@IvBi#L03$JV@m{wFDW$XxjC&G?KM)`HhGZsIA zP&J}{vb@FILZPjn{(_~-DU&B#=w&zPD$LXsiDvt(xL~#7Fk(znOGJp)sEr}a5fk9R z=901b0OoX<^SIRIi9=Q~f)G$G8S}w?B~XbmmJFfz%Z4<9sX7d!A8)it4Im4Y#sqtE zTZWm&(hh;?^8bF_T=9eWngEFe3}AH3-+Sr*4{Z7u2YQ#L*>~+l^pENgld{y zi~`nUD7+!eNCppacRSbw7BBUhWc&e469$Jk9}LDnrM{iII1vG+nC%-bZxA?-1X0wS zkcI!8sI)d!upCvxQRgGw89)EtDA~Ky?~WthE$+v4r$5OEJwA^hUuc820$HzGVdahY zjtG{oieP)}cTx$Acdo7Zk^>R=vID*O28L={-Is!i5#OHJF?$?#T68|A0=M?KF+a8i zi9bdm3zNQ^gBUAqwn%M2uE+TO zG36NoFFM{ouQ!T=9PeBr${JqGYrl#ZhuS<6d_PVCk@Y?tLmFnkIC^~c*pP)mmk14R9%`26yK>o%@fQ|4 zbp-H$wcS2{jH=uk0L5s~DF-w^vaBmzrEo9 zI4e)_|B6#n%5i5q;!K4Fai<;?kLp6@m zFkCQ^v%Zm-hhpGHg6Tdo5DFXyDv63-m#m%jeh95g!iq5NM1V+PJsWx?IX+K6oEj|*e#f4S!6|Db!Am6CAAl{COfsv| zaIp`GkpA(R$~|b~QS$3p3T?+eT)gqtV~_2)B>TJ2j&y3o?>JX1laQ%r=7$_^S#c`{ zdXG~_Q*SzXBg&ydz<^u^GgYWz2(n~Mv1?{m2pYG|q^KGbXqA{df3l4HP}W!;mjN7h zROPj8j@Tgr*=~HFU_|#MC~a3}i!nlcAwM*aFxZ5Ub^g_TiHH*F#jOR_pK(X7%4+P;Gg5M-SU2KHwXxe;1O5smCDvxsv7@{)!fkBQ*pg9XhzuDCtGV1H zh}0k#`B}fHDNS_p#&(sMvY*J0MxKPa=hk|dogB13#r##tc;FZ3!n}QJXa88WDjd4y zuiiiN-d#GZ+u-!jJBJAK-cv{AyEL4E62FH+#xf>^K`z)OsZlJHeTAbl5|=z4c?HKP zS${mn;3f;jDG&~i|IW4988{GtpdA6A&@HcHP&F*x5up;fF+^6Bh?dRZt^@v=qDQG~ z)}-Qr2>}(nNWX(7;Ec$yPJ<-8cvnQyT{NBSmuPShc(e3!L?pF+G!%3!q)venimD-Y zoAK@$1viJxZ%+zUS!CnZvyMSW$x0-4hB_sbia|@sN@OdD7N+WO9N#F zgVYny3GgNS@I1zgY7PEkna~}C6O^U|jaY%yvc$o$V^j?eav|Z<YgK`{m#YR>Fr zIObWhjM%}-m<3)?T3d&3W%9c4?0K5-$@8pa@Y9cTO5 zF;Ps+Qm0uTvWg4VgL8IesYdMs$)%&cg3w4kfLT3fiQe79KH1J~t71RKon$KlVW~8G zF*V@#wj*Gxm-8f}jjlQSX7EPFub}AmJBa{KOO7~i{7u&)>YV&fP2Mu|txWk9dhba> zET(Wv_fvH!Ld(F)rnsvLVOnYV=*!7mD zKBo8kE}TuSoSYBNu8;U*o94`2F8K6SHj}4_U?UIV(humKldu&ZMSpA-g`C%#iF!CI z==>nl$uQ?olH%Svyr*Ks8;NgmDEv@=jy>t_e?<|0Ov@39$+_G-Bwal|q)com&Yu)7 zXsFtf8Z_P9pT=7p$ZT`GN$l^0TTSepo|5bte5FT$v}UnEyjm2MH#`+jeE zGy=HVgZsiUaS$X`)s{u@vpQ%y6Fu2X(T;pEz|!oQY7oD?cSYq!-{TuR9@`F{rQ|AE z7Hs+{?Q=#UNLYI9fT$5>5~0wg!14>sd7=HfwgdFa!@K?EW@u%%V(Tg`PdP%R!}4z~ zGafS@TOrv+88cZMHHW2E6%OfSOtXvNwGdn)RmXXw0ql;f-9tBmpOx#8cpyUSuwx;w zaUGdStE%f3NNqE^qAee; zgH_gkGBDI&3G2Ofq!&ED8x}Z)OVz2M%9JxuEMmqL(4m!-PoxO~}FNtYXl$;4gM1#8?x39Vk zI4xi8tzuqL&M0ssGN1Dkx52$ zYAlrTMU;p1CNPf6RwKCs9>!=a(O_Xn%&H2PnFYM6o73@7Gs81(%~?0zrUH{ugHjXx zk%H~RNcO`usgN2J$q)0y&aomIP7O8UEDdhRq z)h$JUo@a=5I|)r$Tp24azP*(EgyrM5M?(vg_Q?FiE}#8&Xqi2ss%DH)W-P}<>Wn?A zlPz|L1N=FCf`nD2$A1EtV`Wu2N~bbL$3Y5*JF1f@7Gk@^qZVEcVZRYg{VRrNJLM9*@lKzxkc5|EYtZTFVXu*HX_XO7jE>Q7M{oBk>uIU4k_KpR;Ydy-> zDCAiECR4b@F}j;8;g=6wkiNxm54(vEnYTX*osst#Orgw38H>?*(_kJ{O%5jk5v_-G zPWlAyI2WpY0pnMuh*OT&G4cZ_+y3^OgbZPgLDmNY?t^-C2zIa9dSgU2^vaT9f=b0( zc-eVG16=(6P@0LKdql-C!bv;?MaIrp#k<6G=!k`)d=U(%uR}&--n^JDPc+#@=Nqgp zhfcL1oU_Cn@#szQHRKJuza?S2w&q%TwKhR1(>HFT3}DSQ$D%W<0vxirv2sh(x9T%A zt#Y1WCOaWoN)olEi%utsHd*3dnzgn9)+j)@R=~eIWq#={Tx!|tko-d52*~TU`=F9z z2Akmcaz2dD)0;guv8_@#TnL&JWf+KUP-kFg4!zzEyQTbxr)BT;WND#+9p1DI9g@Y1 zsXP%|T3#8P$qo&768avJ1*e}2JKyjkJ4mJwyL|H7p)JoU8_O#N>AbPnvLR6+aZy6s zh-G?)N4nO8f-oe@>%B?)U*8u^cow6OIOA4wbxOcqST>{|!QpA;P&8E-)#~tqRL{0e ze~LFdjf{m?E-Rk1747gX*>#|CH;*%oG)ph4$(bS}_~uz@M-eKGi~Vjfd<%2U3*=}D zB2*rigu86vndZ1&ZOn*n+uV)`eDQGoics7U_yr@%umO9ABajz?V!8n;EKi}1AS-CX z!nDjw))?W;m>?rcCKG!HfSNu)!GcIRuY>y>bw5!|cG-@4(UJW+J8Q=Hc(2G|`52u) z-$}yQYv6^v(wwTKF(rH0BTgZF$wK6&N!%kiYKL;OmNFVk5wGpMPXg~TW*b9TK0d!U z!q8_hUHp3|3T>i*>`o^jPVgF8WQS__pC+ojiY0Uw|FWKjT0&ZUfxb{Qs@W z|FS2PurM|@`A0|Uzb^{cm?5SM2w2ht zAhXb%sWbmJkl-kA@>ID88|bRCzV(%gS)=(#U*j!;H?`lf({sa$js8UQXb$}js=pjI3Xo*b8D*)+_w9zA3^M;#STxY;^v&ZUdyO?BOyPLzQ)0=o;5sC57++im0*(~>mGW~4U5MP;)K9@A*hHc$nu)9#uSI&9 z%IkM`;i=;8@+bTf+KdQ{Fi(nXCDA~fAEzuT7!&r=3#hc-Or#XCm7#(ltWSQ&qUp9% zDb#eFZ=0)T+;;Wb#_Za;YT#hpB*McglQNwGM!c5}#m}p1U`x-f5=yx4X*dW&B;lnJHUjJK-MT0`z8|;$}IurVlLF zEZ=`A!TZbllLxur-Ui&#paY)~*1xl@k(B@EzUKchqPnrNF#SwO!CU4wjURaooj-7O z&FwGrkiaoF+9HXo=xvlO@9i1*euSbVmTQo~jdeaBnjBttZh%xWeZRtLhvN?s=tEa3 z?<9*d?a%$4R|aWW`BSfXV^h46^Ej&H-tZ*V(<{f~dDedqK;B*5e2EChOOi_QanS z7EV@=Y&L9{kybVtI6GZa>wZv>)ao} zagNL%32i!7ojDo`6lkp*3H3a`FW8C%Vct*|6ALt4{xbjq_iT?eV8~UpU5knMtPmVJ zWG@1jfyjI;5cPu=OBD(8*hqkGgn$u_IF^Qs!d{jU#n8sX0G7Li=;wB80GhCBMk(AR z-u}-<1MSxWUTh6YVbM^VV*E)*NOsl%=}){W@8_2kD=;`qp-5a$I|^h{#E^s?S4e&9 z^&OwWLW@f#_hy`w9cv>hc!U;CIF?r4bL1(76&nq{GtRsrnYpJ9n{2tIV{fgaBwMoy zqV>rQR~mxZgbaaU()Mf#r0g&QaWVMB`RSdX64Q9`8$}!RO;vCQ5OCO*0UP2?s9J*y zmF`7blGtjUs^z#2&yyUisN&(ZSy#s@Cnxn>gnYBROkrhqOt9rgE`M>ApxLqlz!`d$3UiDy41wx3mRyB9 zUMY48W0F_kPz2>QP?_nj)yGPcGvox5qkau^RBI^hCt#=0$JwHHIDFlKRL$zs zEDwHm-R*?NW`hZIVzc;e{^3X8Uwe`gV^i0dIOkkCQ{l-`;QMTdRay^!2J_36sSVw2 zct3$=1NUgk`W*^)5LXdv)_rvcaEd~oJU8sZ%RPlebKcp#tXR!kHA_-n#w9~v>CUq@ zstcPfJ6Spt{3n^e#Z=DigE zqt=8Caj`dmxa{@JfI2Bu34nYOeV<=v)cR2r`cO7(-kGSjc5;Vxlx-l>WNFghVT;-n%XKRBTuWZkbZiudss zc6FsTA*2?(M2>tKcS&5g!6aF~osfZgWY}uvw3iBe@OvcX&L0c1 zY#x8|Xj#-UTi4&M#gk`c_Ux$~dV;dDC!+Zl?E%FeqBU`tdCl&FMN3YLF7cKHIQUp4 z<~+1=H^=6b+5hSPP0Lo8oN_@kcy!VL}2TUcAQzx#t9=N~BVf^oE*ngdwvQ^iB;(5Fej>n?>Z|1PUO8uge8O;{3T@r2R*5n!yaaweF zt+FjADU-Gm9N#={K=56L#TCUzpa?3bnD$JH4hrsXh*&?6r=DWVwpQpY5=vBjmN&Mz zy`~;tyMY<2+&!Q7=GfmjZ6Rj@ltIo#`XlEBI`Mv>7V2ePH~3A&Hn@w591Ygq3Xp+e zjZ_pc?+gU9F0+SVG zy**3u2BldCCp)ob+(C9}{<^;4rR1O@JwNObrd>_vXre(&fGF84!cr4 z2l0{0Y%{O!VWkvs$ScZLWDk!0xxZ_K#?pTnwn&DW8b|Tn3Yu3TaJ?ZJa4H**ql)qs zVdes<#_ zo?wv|de=QU{3q?*y#t>kO|h{oAk*gC2Sx=iR+o8Zb0{s{k>l&rELt`pHE~~lM6-Qx z(95rIlm|7zMGfhISDC`)gc+ppC6?Htge?^VQ?W5gb3OK55y8b0dML;QG2+yEow1>6 zHuKUnj6uD|NX*0w%|1!koM#u-xwalo^F#)Q1dJ_;1=os#d z77^4qm=Bt)EP}^O0i(Mam~BKiT*yJ;0YOz(Dzst5%!fR-wcW@97v2RZyPpnQPF6L% zM&>kjhxH3TwPi<_#a7s%VKQGIy!5fCGF7#7E4JgoG^}CnC{peHoOX zJxp_vT2j5neqqAK$`{eoQKhh(6OsLD676GM}31 zJ4|*{#8A1~StIAO8rlr=q`c}(3Ahz@%(`G!;YVNQ2oroOR_b6bJWw zI&W4u9)z;>;#Y5qJFk!2E#sHGEfjb~NNUv~GhW4pipK87k>}@-K{}+da3_i8RXU& zZmSq<8$XO<%s=34%cjqF3uPttjjm-5vx|3dAP#MN6_X)&Cq8`C0-eCZyfd54((D$JVTb_=ocl*Q@^ zn)E5Sbfkt{_<~{}ae=hC*F!rt_Gls!tGW3lEP1Ec?>|QUjztFaXdpe!3OwTfmNiPw z&iOw_{AA^Ss1`ruw3n4qw6z%`QX$Zq>78NSh2y~Cuo6OWq$QZTty@OwjXTz?TZW&2 zg*w3Wu5h6^5kgsD&n0&UtwtF!pR?=X#G?;uHY?CIYX_{_HDdQCo{&%g@|j42%}{}( z_l6iw{rlwRfI()`?+`naBXx1TBrp!^s1AbtJ^(~AKI3Cw8!ZAi?8btA}L)@FG~)(4EvY~>iF z@r1&YNViyNtvJbcVAR@lU2=L8k0U*1^_odkq|1egtXQ;#n5&pKHf3YlV-L6wGI@w? z)YIwBSFyJ&l{>Aixzm26oh-xc@xJN+AoCWqW##Me<$u}_*=nZDXePu9Y4sanbJ{Co z1smJ}69(w#%N^B+(Jn_dhGD>z$@%i-Lx}yFW?AX1@Po{%zcCxo3pj*k{eR?!HVyEKc0h}Rx17l!pSEyvxf`1k@s0hJ&zk5 z|1}D^z7VZTC`pf+DTN<&{9R-VK;kuajBNO|zOCl?MWzi{kr0y?X`S-K?OD=Llu8K! z|NAYg#{Ucp%3FS+paPi_N6k|V%U{Z*Cy&-G>JoZWIKt-}-OF{O1gF1$v7d-?X#w?m z|Am4IKvZAhRq>_7XLiL%V)nD#_NiRz$5&O^(DMGwUNYu1jXH(THbSs@%CJB9`Jp9A zTq1T#6r@rF1@b}f#t6(;CptsGL{S8^{s=fXpM|@B35)z|=hONdGzzVUN zF34{`;o_OSk?yv+wXE4F`JaYvraDdgOgT;QA6dV=Zhd`+%R^NkFz+KqE;M+uFGI<+ zPpis7XU6D{X9{qSxrhxp*?)%C>y0$P3!G5f1KR$G2O!A<=p3!nkn+W9aYk0I5}@g$ zAn^=CZmf$#zt_Sh5_e9RvIYrZVcZa-t$64S0+1<1Wx~@ikjBb0Sn@1W3^BkLiekno z_l;+jnvA9BH8wzL#22y{v_+MXXS5wVSxwT~iukBYDU*y>M~~pU;#8u^1|}RQ_P4Ko zSmkwuUIp-~>Na_TKN(dOf`a;pg~U}Tmsi7~-|j_tC=mRXK#|3^(8Nua1(x_2^kyi8 zo8DZyhRVk3f>an4=P>WVOWVlEGc2Dls_M6u!s*9UU9G|_0)2l1$DO5RbZr-#7bvw- zQ^pvv;LcS^+=V1RLof?zN;SYX&m)Gl#&0WXWS;cv%ZF8Nh5-kkZT3N2m{MF&2hLjQ zjo=GB)Pi4R{H;P82)qPb8h-G^G6s^R&<8^B^r8WLsDpl_peT5ij(IY08>W}%?3seL zXC0ycW&AV7e#rQT@lTBD4C!u@kl<@|ktWdi_W>zs)tNTQQZ>vH)g`Jre&r2_#S&$m zER+GcPSJqsAj^k$C~q1@gj?Lkq%pKV>hpB*2NaP;DkAiZ;w0aVbXH)(gE>n|w?(LNj$C-I6{pg^=E zDApmJpLiC-Ay}m9(QpG-8$|n0`4+EUtqiw~hn-E&S(SkBbQ#@d{b83zOI#u;jEk5o zzX|7%n4R)D>+#9lIRoSS%QDN)@l`MDI9XL`+N_MP_n8UWa#Hm{HTqKsuYBnDo$-nd zow{q^GJoNEdBg%%Hw3?lYAG8hs=83jS6H}Rg=++Rsot}BuRHtc9I6gTq_V}>MA zNBZr#zu!#Gy*Se{QOV2E@Q9Mu>A?L_i1rWgl-l7a^L<~i*8B#Q+N7vVGa&XdG%NI# zpTh`t6kaWdZRA)z60r(;KEpD7*frriI9KhP>>6HBGwxONWZx$k=$69;c(iH}h%@nz zs_Fs}P!*ID^4)(%Z;d z&*rkx6T}PhUWaiD5B#9l9wOdco#u=a)5A!8$g#Hxk@N;oBN#K$*>Zy&PXy4w9yVg1 zvjT{=x3r@nA%q0{a$T~seEYQtSKbK{ga%as9Y+6O9ulHDO30}T1f1}52pargnd0bO z;n7+bPiK$&DKS!5WdlV}-J8KRj9ynS^-!f4m+lTBWFQ&5)&uOI4=vM$YQ5}ivm`Xz z>XigiNQpdzV>F<@&1^pp^qtv$+2s!M$iy#N^m`{aSdu>T)NhGbzx4S6GqwrMR(Dt~ zdVyv?|Gb*;fg==)hW$(DXE<^^0bCSVZ&z>}Fb6~RKl*uhX4u6}Nl{1P!w@WP@ye@W zy=T-xQA$6kY<7~~-f|Nmq_Ppnn{fsc`LIv4593}3084}LYzooUl0!dbmZl1>?fEDN$4MSP+MmS4B41JT7Ja^JdWCyOi+@*% z^0jo{z$!^Fo@Uy4!Yc^+`t4vW#~^5p_X+Xe)nF9$*f$Bl*+~fqkN*~_px|g?YT^E$ zBUHBP#$N!LKl4w}j1UkYYxTQjHp)I9hoZ#=RDlcmmterc*v{Lu$65EA1|~t>`*WHs zh>IJG5$r>VU|R?lA8vW1&EK5S_=+Tgu5zn8c?*1u=%m$8ypSA!pT@poW;gP7i7phcbQ5Z!>w}5 ze-48HqHUy+*G9;>5X?%@gho_kvByd&(S2lcWSCLHOi&yxb(U0_n*$Jx#K^lg*yrRb zsA(jyBM7)HEU`_$FT+7IK=^>RN3?FJLU-$A=WQ*h6)WuyjA$FxjpAC;peQ?q zVC$-48}HuSOql8?nOhC5`$${hZF}13$XeC|wQ0uUCUfOh;PKhg$MlRA$NKq8+`NR1LQ#f5@c16~VAb2BIsoL+?-+6Lb1GI*rsJnv;DT+}ultL8f2uAkS30XRw?R_1rTb1?YkxzE zQVm9o=J@y$rkg}-Se^^E+mr{2;VwlHm87Q+EW$+l`RIJ&?{w?%xAL9K&B991ih`PZH4_V6w5; zxxrzNMGz-e50RAwe-fM*0BB>&sF;)ob=0om?m!u99rM_jquoKVKGLZ`pgtdi7i&SJsN)5eI1LFbz zQu;U4>}q{ePZCWHed^aOg6YN-BtuE13#%r+MxIm{*gV$TvkhunoWIu?!fJyhMH>HhbOi$ zqfm2evC3a=ATuBepNiFJa_P}uhwb@`@fn6QBc~BgTxF=d4v7vOTWN1DWfOd0C;xlu z&_%i8HJ*ifq!}hQ%6#-uKz;+A4f9qdBj5-`zuufe**0xmYd=P1&z@yxv1pu0%a%(O z2s9fg;2IQbIIVxj!S4k(g7XjBtg8!|n)B_&M#5Y%g1{Le*Smr+Ze$-;Ux~V9ps5C3 zNXb`A{9zZ~+LVMF!^Egba8@(qLJ`zbYHiEctx_4Mw#_hHG2%kLBn5RDGz@Br#oC=N z9+;`~q4hAo<1rkHT1Qv;{wU=A zH;M&rq7DCcXWhBHIYi6Wf<2n*ljCotA!j@hSn8~t&NAPX24wM-vCOzWd(ewl-&sv8 z$L{fLJ+&L!IWEeeE$OAZ0X(zgnT|9xFlI`=_?bLBX zi@4#|3HR74G~$dUC6o*U~wgUg-*ffN9@Bk#i_7cL%^#Gqj5-u z=^fA#k8gf^W8sxR`!4v~k|-Ll#GTW}lOJn8Wzq>Szu~`J;WWBQP*C0kZ^Ad)kP?zf zZ6kmrQDu<#vLH|A6W%&cLA2joJ`3G|h)PQkqZJeoB;Xe6ZjdpG8z!}GDy&Q6jGSaf zI+C;~%YGjs-Sw2Q%t7i`?)N^V#e%lif^npW;LhbdynP7nl<$WzE_5g5su&b4tceYd22eU+5&Ws~+wV&VTprmpwg!kPP{eN3&tbDDyBOwX2$M{xJsC5uST zB_PrF@aNXQPgFO=;RV;gjTAp{s`^`|31th<|Mt}U@0C=CbBjrSy@~=|GtfvIgszCD z{p}l)<$ZAwIErlZ#cK5mFi<`P%Qut}XUpSS5S2Qd?Bz0+Wokw3a`>s%jDeSRi<9-} z?d|@8_lIO<@J#GA5(yA-OSR$$5GD#bZtjezK)X4}_csQ;k`M&VL<0!;2AV=qSaeLu zCmgv+4dn(q!^Gi)29{^BHDUypq{zE257|o#c=uNgp^f3k?T@JF(xq+UH0sCE@TYK7 zJ~}mNPp8_|*v1O?FA_{`&13p5VwCMG!~zXi?0C^tE3Askt5eRkCYy1}4JvBjluM@< z@teMpsg3GfPrwPQv$PC>fZ52w`Ha0;*=X;1@G&KlxPsR7&UoD*1}>Lbl#F@B>2z%K zgs2*XktttrDL2qqu1VMRCDncY^g(aQR)bFLr?1nw8GeuN~& zm~WUR(9Sj`CBX!XZ_=^OBF$tYKK`51Fieg@R%vBIf}z5v(+8aL=Y$3ohmJUH+eib6 z--E);2|?Ph+$+vgqIV)@qFL$q`_1*iY`^SAd8;ZT?Z~5k&6!%d!CU7YYxNYFxs76b zt>1ezvL_2N67^HwmF7II@>8oM%syd1I!~eTWa0%Sb%{~Gz%r(i4^|1Q2+AnY54!3E zj_nl^!!WR%;c=FlWr@;dTpEhFsN%<+NQf;Tk!g^(Oc>S6m-v_q;y8lMKzDE!kpq9q zq(-S9R)f#f4il)`tcYxv4w3i)!#sI9dmB%ZghNdTowFz8%u4}D9}!=Wk%D!hKQ!wH zAECv+x+9FqPaT&kcXj6>ckw}Has|n5^VlMV34wJ<)(Xs>Ft~oFk2rjuw?UEwToy;#{^BSg^+EceZK=kYNNgk*>>WW6WG+wO7y z{T)K@CYOo@zCQ|o7nLZxnEpReiMAW6D%M7#mk<@ws!)E4y=Ljs85s%*k9a7;q2lf~jBPExQCQe(A=rAV0%=9RAggEb1s@9Gj3R(4Auv^Q zE32WWtEXW)9f(SNk$VYr9(J*SsARVlk#Q#oh)U#MwtLHPjr4}Mkp4m?>p)b33PdFo zKvV)_XCU=&sN~PfOc*NYRn~F#MDBJ@y6Za%ReW`jR6hWNunYvt$XSX=7)4LdAOt=W{9` zDmlvoq7nmu?8P`TF9kVQ%;`J~&|pv!g~0+K=Om__ivlv#lv+PcJw2SeYR1S+FiHVqY-7M#gS z4&hnbn|VeDlMm9z1sG>z%G;n)=eZ{CH(N92j0@xT5;hhkt*Vhl9_R{N>Wg;#g1cE_ zq~$1*D~S!VAx5VS{h)ZKX0RL?S^{et3$DpU$(L1_F=FCo6xx0`$WAeJcftG|Rzq1c zIv$D-8h(h;+KgA3lb+F)k`o%Q#}lr)euwJU!xZ_zjw`xUEceQU(a zBPx7uBONyDtR*>ilCM)9r^sgXR9_ZeZiT`jKS9%1Fcg?BvsIX3 z(b7|<=r&qH>Qx;*m(=;V+RqKU(-0isL4wataL}%P$j%!dKhSt_{C+vcg=QznC%xF&TjCltQ?n%YlM!w_KkbD>>PI@{!yBewXfr+{`ft?D>he3Wr(L6mWdZ2dWRBf8yR>E z@Zd<4RmXSewsbg3+xNzID6kZD*uYq4m)7wMZdEO5y&_pu)LbTbK_KvQzXo}8QEl#< zR4bIq2Cr91A2202*x(!Up-Q5@U_?G`0V0xw|3M^DCze1&QgR1I(XOR#f!Oy@`-c-X zY*g>zAwB337>8da@;jU+3|?g+FJB|@O1Lr}h)4#taD98*SG8>z*G^+Kf~@u*m?N(M z+&)qsxyk6?^9G%Icd0#xKE@@c@^L*ucKfI(J%r&61s> z7@==;Vds7%u)hv$X&7RUz0VyuX}!%?ZhwEwec)A{>Xd_B-~QMrI_u7xwq-h?PrPKN zuo%FZk7dB<0%OcX!I9Yg0!i(JFG*-TO+A`qe7}o?kXW9$tGA<-Dfyuq`Id_Dobx%^ zu`=O?Nl!P(ux_;3!FJa|K1EMHHHBhk2PE&JoaDouVu!FzvYr#`xW3lXv3x*BE5n*c z1fL`ydRTMeBUqy`<{w}Norh|P+FfHbH*N+o;+Zoag=w7W&A!k41CnG;Jn?aC(f&Lg zrfH6~$P!(;2XM^UXkR5s`R=#mYAohz4wPc`)pW}G(qdcEViOb-IDik+^Aq5WSYdG> zzJ{gm-2W$Y=g06v=r1{|F%XvgtvN}>(dEDAB%t^BuM)Uuk}vhXMwBt3XqIO3eL@h#Nt z=2psYwRdCI#cEFXSYl}<4tvcwzVv~>1Wf7Fr_sV?K#q&oV8mn=+i3t(X zXyZ;sR-0XtlYQ|QmG5Vt;H#SY@QU^(Xg?Em^4eFqQgVxaazZpU#SXG(gFc41fv0?w z;fvJCv>VV)JI^(39Drpblg9Ipzt-TKZpG{hHE&71Y8tlzWDw@PO|`(lTgRoliwD0H zUV*LqGcx%K8`L;el9X?DE+ztG-sd)yy!|!&I1qn8AOwwX2?x6_;f<}NvzN~CzK!B{ zN{BHYL%ff^kPl*Gl1I&EoUrU2ZgUT}!9a?Z83yF22mA!xChz)5&#hnGp{uRiko^eN zAzG>lY?Y=P4g}p}_j%66a*1UAy8I4rG;G-W%S%GLuh2>|^Fbu<1-=+Dl}f*tJJiWP zo>lr?Y!l`kk~NloCXx2vCxB98O7L9Z1ds)s0RC1ajk<-kv5|qJ@qce7|4D!S0RW{t zv_R=jWCDeavfc{`MB@TUU*k9B2nYzy6As<=^Auw+G?!t-iL%1CFAF?!@%XFpNP+;X(ojY%xGwr*TZ?&v_}q5x%oKlM=$}h?2ia)E=KYrn(KT>8>rH; zHyn*L`1&sX#uZ`IkApm~Bmm67#53C63qrK3>E)7(*h#|N`Lfy90g^S0&A17hM-U28 zPFLB8h)qc0tuUB+K2(IM$yh@6#8|c}A~q$DMpnt6%txD>x|dODwnxocbGjk`s9IQ;oV@$pT}+%*w)YbPwFDsyLA6z4_d)ZQ}WgkKFJxg~xJ zj*D`1dxV2_hxF>QO9<%Z$IW2sL3Q?yB$=~9ce zf;O+zx#j8mkEDMjavmjILn?}fXsz`U*RI)PE;(B1!(^z-{D#nsO!xFshi<5Izy0J(nyv> zCMLp=veBnI&Ji^i$ij(i)c;7HVI!xtdjFp!%Wctk z)WsQcYrJfw{##LkDRfv<4bBOBEdVgc5>+Cp$CJ5&h=cfiXoYBVB!!40(twsH?EomK zRnE}_J%w;^ni)!9n5)z(aHz1VWC}Kv^;I*1H@Fok>+A9Lz)M-ky>?mZcS8Df64rUbg{3Kn1}<%*D7z(7I=hGl)~`3 zzEk=%>NKgCo~k?3C<}s$*h=bWN{D-{j;UAdSgTQzS8tnfUW9JlHS=dJD?v8Do*tVUH zZQCcd-Lc)Vla6iMIQousgT?@!3>uq|gxW-TszTRqt=CkX z#)P38Ap!#f^Jfx~iBf2qeyNU!iGisKmo+wnfLa4?9Js)S**RRsbJ>S}!kP8ITzd|C z(bCour^%paPP~6#q^%@y)Y0hi$sFJ5kv9RtqfPiPqvrhgUvRCs;!q4H9u+XD1JH)b zBdV-x%$vb218IH96rJ;dTDlkmS+NZGcSeoILhw;Wol({#+H*HKu}`jlFxdQoygJ1@ zwip;L8}eJM0_@7MJBP}Et%l8w-+?oY7i*uY(RLl^l&f@7{RO|iRRi-PIF3EuW6FI37*y?4YC6*$G%V6V-FXdO-5L@8LVgR z5L?%_`gu&(;kQa4Rd7Zlt-jU5De{pzr%=|j18L8R2dqmtC`}QetJh|XioY&&1~jkC zKL+d7C+WFkOYd2(E?ZeqL}$gI&Jrzu*LfEN$0kFoJ7)Ww%JX&>LWT*38zQ7bFFA?` z{aF(2Gb0Vmd{!I*g10#E2F5u^2%Y*rHU~!i%V5r=f6Xy^{n47SsAZN^w^A4Tk+)H4 zrQ7TtBi13dHQvBqL<}@C*XVP&SnkZ|GEe_pP!1|0SE{J$PFm#=dlLdgT$H?pXent5 zbzZ_%{+49Zd{gL>-^T3VvTulb4{V{`S!o7~=|WW#t=S@yaWl4l&`(9!+7Nifvqr)3 zH}C@8YV1qQ0~E6O0{uRB-F|iWtck7Pv~Z86#f;TuvL@Yq+p0mh5|R20T{?ocX|8yi z(TBGdByBCDU=<{~$BzS_8K{eb*|u*Et+43Fn_$R8it-S<98>nd==v4?`b>q&r2c)Q z?A!3!H&>W6J|dFY#MA31=(4e(5(^&TOQG;R*aVFTpX^a<(J90555HgnLD4vwKC^qj zOPKrV{Be~Cp8G=G@T5l1)0s5P4CkGa#9$D!7Ltet=sOnK?vthYl!8!;LrAuL*xiaduQd8`J(iK?=os z8jQKrwi%Fi=pQ>N#*vgl!My?MTMyC2}GTGeKhP3o`zd5tq{4~B zgOTBx4PnUwz~jY6NHQiZJV0he4Bi0 zu3YP)^s3gnU(1_sL2Y+asZ!W9f>R%$uBVNLT<2;09RH&z^KW!{@kmwA0a(^I1#w}7 zuiFE0;I9e+pE4YN=L7zG{(R37xPr+;xnqyh5MEMw2CX+Tgts?f06+498Z!?qWIxgY zdx$f4mUsP7!O=BBUk?cX+a0w|iuq-;SM$}6DA|7+c|GITq457Gt^LuCTd;rpB(5*LA72;+#{4`HaI~bLQysP8m zebNx?$I!xo5^G~qufOqMD#XUVpiJj3=jr06a-m&Z2x znbcB#I!9_#XJ2f*hXf0<)t@u8G@Pi>#hMCfH%p=gJ4*rG**hNQ7UuSv;E}FjUYw!3 zDCz4_;!X-=LTL>Ym|J?dr%0|>Fw1TuudkYmYm$|2W`8*G5FSD}$w<3kQUnDPkGXzJ zhQ4u#74X-A!3?>;5r-`geB^sj0isxEBPp~N+Mkd+XEi$+7jWBR)2FJqmMM}~C-+y) z?#L%6oPaV*B5h!^qkZty;bPYm!-p#PQrad{vpMjSSvi_#X}>YFxH!zrrBFVtcY3-e z{S3G^axH^{3l2}?!ra9WQ70Ao2zUn7SI6sqW64~?jIh?;d5c7t%IuCy@@-7PMIW8U zigk!c_3zT%>XzcWhobI0Dkgp~SuX#yw_nT7t{cuFc*LLP8pXpU=P|)8AgP$G0m*_k z9QpLq+A<;`Q~cezR;$_c&|)uB20m>-K%KTXlL&MyED_n{gX6yqKVz`aikUL6`P~S%D9Nsz<7RJFI z-o_PkT&pDYAh}auEQjBumJz5!?1+(gQVGVeZPvuNCn4%cTyXHLGiNN$nKcy0^ zqKXF!iJG=e0TWt$j+XG=2M{o|2Yl=mMO6{W>bEZi0QkEO&o+@pIq^q{#4O|aPi_dc zB^LO7gt$Jt*_5aH)TpY}DKiI{v?^~{&*Tno9~fIuyUgdYYUBCQWU=cab zK0)~Xqf6K>zqN=|o5=0R)BxV;rz5RN!n}`A!rf&+q3wb6L1ft5fO5bC*ycHu0+m;( zr2-Wwk9Q2w>LdYYSO@m{65jPnX4rFEJ2T%-A~AJE_%p)#K}ToMsV(C3uVg*_8eknO zHizB&$vF(*`gBLkTjH>ho%8vAg+S{VYAC^ zVCO6xVX$Mssp7hcsahkA(VX69hyyNj){Z#TFA6v-h8epJi~`Q%!RgFg7Pnze6~g{# zm6kOf1uvcJw>z(+l2pU=>dh+7kwA(1lD!LFRB301FzNF`F!h9^=*~r3LNe3f|57$$ z&J@{|HypFPFf<=KX&cWf_f?n3(EEsz>53y@UJmME#v0XxtRHN!Xxr@w5VKMZRJE?k zX=pBlhtYo-qUp2)!rCgM$ChaxcrYWJNH_@35uYg4Zc1%qM@()2C%c0 zPY|re9Y65{RweH1KgzKA389vR%hz$Dn3=W+Q zZQCXbTs_jIzjpax*>-D2N?2YQY#tjTvRiSD--~!dE>a6nEM>_4oR*l_! z2Aq}F2+LSfbWutxs)ng8?075pCnflX8)Xuz*eiLpa96%v>{~%(F`dLq^w=TFLT6o9 zQ@Pa4+n=rszGk{dcvs3If_*X*T+Ol8g-+Fpzoso(^p-I9-SMi;gT0{ODwPC>af-km zk~gnaLE0uK`_a9!1~U`Zb-srcZiS;!`EetX&9{sThN0Y{`O_bhZj0f1Xj8r)PG{aE zk4;pks=yuwxM@8zRBz#kCDo~z@@WsGb(Y%ISCfwodumI39iTOucKz`x$>!5fwzi_=h9U9KK_8dNd{9F;4y!UAP|DlbWGbw5G!d4#S(Qg5N7M!u1) zSh`Eo$zm0yI`*h{t)*bi$JXYB3_afca@nVL5(c0#z4lA?xiHMy4CrZuC&yBA`fGs> zpK2^J{3@PfKb~eV<=mZt{ulEhd&JwvW>PKf=UnQ=1X>-%2+Qz&` zuFj&pX-mM-<@C0GxSsU)8r|gB=k~Qb$n-8|SYMAH0ro)TYmx#w3h>7@a1N&LFZjkz z+f;lIO(INi&Gc|7F_g*m!#c8uwqkbTr{Qw)dA`SHftVY|CIEII$`nJPUv;!o3Fa?y|C;sZa0X(~R6`vwWV zcR@5?;=SwP`yI8%oxqnM&C@67$lc?ow8&jPan7&Cd1X{)t7Y)pt3P9c`<#<(FO+lp zgp)-6lf^XGw*BL>4NlbR%SB6&Ly-X84+3|E?B%NmTuQ}}6@Bs)(x~O*db6Flt@ZhN zA{o~lV(>VRX~gW0&>+j`9e|#n2vf4q@B500tDuS*UfoMhfspt4Yg^z}vS37(QO_F{ zMJhgiPg-aUK{_|eBMZY3G~7U*p2IA`z9RTbBUVx=mP#3t8Tt@gJEk*LECkyxinTa( zo?jIwM9r)lB3DCp?cbN@Vz@-F28?(Db&i1>GK7Oi$0FFpI@eq^{9-M;)-Jf8qAhy} z?O^tE*`~94zZKk7h&QE&T#($Cp5}nl%Q0X~$pl; z(S%&9tPp`udQ@4UW>1wQ(|(a9c9T1||J=*4VlK_V4|481wtWjbc%~fCk{9k9fMrF! zX8RkWlbLP7)i!djLtPBPu&Yo1l-RZxUUO8hwGU|j>MxD_sF@iJ{={WiSjp1$b7j-= zia+US@&>-xU!~t!;-80hL< zv&oKFZIs$H{3?_^?d)6YnJ&w(xWLgy^}%fG3$!Io>sON)SLx$GSr??R$w3#GisG9J z`|$3Jm?{Dfq#OoK6^`Jpx7?XYmL)>wDGp3h*0iuiPcDAL-Cr4`Y zi8o2w6zYMCWFn+;V5M*%B{fdc=8xus;>N$^=S6PipA8}HZqj@Pgxg+Kxv)-3AU$>U zT2n=iAHzhE6R>vM5uW9;Ljk_CzJz91+NUq0ZHbUFYKJIeZ5?(HNIqIGbkZPmHS$%luM(x4SN7Pt=c?hk?VKsqy zi1CJNG@V_?y73=ag;|!n1>HV)RTEa!q7$lW&BTU0$Co2BI)wWv3NadoXtO%PT^{tf zMMz}WYGmQjC;>!u^_<$AWn75~r6k}-ii&vxm3fWH7A8*BXp-sSYP-f2c|!JX3{)As4=BMh&jd29Ju}XHhFsC-Q<5PB5L$*2 zVP#FbPe+oU1h!5_vzVLZet{ODq8KaD z*sY~(w&ru|F#^;>FLZGn`4OGkLeJ2xPv*f31JvXbmtptx_dBrP7K{brZwZN2R712E zu&Qg-*Sm-k1yL8p%NYBE>CE|13;NTN9;x$SesmL-9~<-S$p?)Je#>&zv0pXs(Ou170!T4&(5Kg!Althp>QZ}p!8z0y}I`Qod8>N&v>2Azcq z3Hb&JX*dvx#4#=Db67CqHpU^~m<2r+iuPb0c;PkNlL6156w3%r_Xzq)KD^jY!|Ig% z8MW_mS>d}t%=bJSg|8oYmnO=g)uJJ`$Kr>cHMYlZcq*(GIHtu7J9>8 z6bC!sUyR={O3@(bli!s7!NR?&Vcu(D-gBcL8;qEKyub&5#r8tP_68vi#81_l{t&T5 zqEL-Q??_GCWK7$v`FhefC#V+uGyAFsjZ%+lc>|I-Iv|^?3||7(UQNCYU!{e>B91tK!lsnpX~@nqc5WW0G4jkq47nHPDy;%vHpbJPAtXgx zYYyYnnP?1~0bI(3kaJa79OK4Pg-Y7#6n0Q_60tll53j5wP!$%_&z)48ma@uNT`rqi z*Lfo5aC+JtA}ZPkhj#HpEVFow$I%ROEkM{&Ytse83HD@)cJPKNb%aqdU>0nM1ra-# zdtT(PYINhqAY_!4p&!$IwYM%1z+Gmw#`0&Q$5yN0KmH08tvCjTe7oy^SVV>>pEK2G z%l4(kDo&|&Wqs64)$XYM2J@N@sp-&vvp_Ns^MP%l7Pb#cp7FRmk{6X$qi0XR8~Frd zd{EJP(Nf^H7!^D69^$yyCK3*KNAu1CeKyLLVww{n4MG|;^HB~OCSgAz_{LzT%tBOP zV|Wgf9&?P3qsAvo((mTwb?F-_QaCk>>Ro3C;l0^N2RadX8M{r*SJKb_&@{xq9(Kfg zWf)ABVNJ*{tyuSHc4md!2=J1x;xCq|>Q1D4Syoi*N)hWmYb{z&9cvu8 zehTZ*I2;H@<0~%*Bl{MPUREv<`okz#C6bv;grfS=qe69I%6HujDlEpQcjw;Nf;-yx zD$mimg)<&7D$xe@_dUYtH!LH|_FPB)QJ%wB$ZURbGSPxYWj8b#G0U}U9{6X`f`#)Q zU^+29MlCm(k2v|jd>`W^Nhc6Z#zvUdNF7bK`29r*K|1>Ia?i|h(VDO`ZeuY>tUAOL#4Tl?~UfE;-j{3{5 zFcR$aXY!V&YVAAMGVJ%jpcPHlKne!H;yXQFUvj3^bK7Q?@Lrg6ljv459$2bcoZ*4e zHR+3=s@jC8U$oW`glNbXGrAfaQK@E-l9!E8f&F^StC*gM$=Ca(=~OY9a9e$!FZ z>Z+sjsP8Gu-^fA@BFYkdl5ohIVB~b9_R!Jd6e=MraBbuu%tWD&<8xe4aAxIU*fuS! z?QjRuPxo&)OJ}bAFC?bnCpDDUxPMUpd-wAn#ni39pSuO+3vWj9?b{cc`kTFzIirz- zk%@&Fqlvw(t-YNyqoqCLe-u*{PiGf1+y6r|h4WE8NdA}WxtTd8Cm9Nkx6hoHNGU3c zj5a9z4JH^IKmek_2D*JmEh5<=lN2Q}glCW)G(MbL)Oryi+F>`)|^Y z;0EQnzkbe#a;U-BwKYVK(oHv(+4IlPEt==-NTjaPcu#o3Hlt5xA>hBV?H<+lzfm|o zdAmsZ?RAKJro1GBWFym_`|GJj!Z&0dR+(azZ*bvFiDnNuF6-U%w8cOkW5jbTBuwltpaXd zE?iQ!|6~l1OWJWsF0Nn`=}p(q5c{4Cq-B%HXI15yk79R85q9pwjCXRKr$pRTtcKDPmBMfsHO|>DcR4mIRT>_*hI$el; z#fuK~wS_KNDt{X#=T)g6lO!*dE)b7ecQwZHm}%B1rlx)BCAX`sZ5KsZ7D@{xbHEHt z(by`LNfgPbo~l_^NT-&&q)Vq(xP(Zre+@Z_)ylcT#3B9X!Lilb#Rqy970|BP5eq+~ zau!5_#AT>ZqR4koQX~t^T*<7!-Ah=-ZJa4k^=I3x_yc&LF)pIB zXZOmJRwr-r3#Fs>HMLdjp$6cCUxi*8j*zcA(aHxF z@{SISFM=B!A%4(wk(ZA^X$PjOk_q(w@JJEgO_*c}Z0I(Eo3~O3M(F8r>0zQ-cE+9_Z=Uv655$r&c zX#`fo&W;gqI#tCCYg{rft$4g*MZ$wh7j8n?kY5#C{$7_O$(OY<zAsY!*Y zpR=>)+bQrer|jkq$8n{um8lgQmI9LGnWtF8O!snUF~4LT*I#XWLDvkaN>lS;rtD zBRp^DMhq&OV%WAGx;+)8DK@_)9xb6w5--oySm%~es>_BU2uV zXtHE7J4Ve22po#_7?v!mmqJ_#Yw76zzSVf`jVd5-;&)=yMEMRU{)ta7+uQlt4_)Iobp1T%XbUCJQc!H4LP+Q7A*5%TBX=mH?B_?-5dDZzs2TYvM>5;8irELYyqP2R_U~^n&Lff!cXAlt^8= z3m4kW;@JzAFmZ!F>no^5);gfwA=mjew0`$-hg5L`RPW8IS$>xq@u%4j9R8nRIQ)_Z zOBOYv4+372g&(_V4Uq){%F*n{h>)#IPSC-v-igpMGwgWMuE2$mb5dCT%2`sEU$uGR z<7LMF=jTE(1ZEMQTx4KTAJ_y$lY9^4B3w1$8lmuulvE8kX)g$YSyHT;~NyK zDfctQc@s?rhkg#93bn)6a@a*oxjrw16f7Z{0Ks%he89|iA&mf*Z0=+E$a;T|u5H-vmz%1+qPf8q^V$elm2*VRAVY27Y7jIDcC~OmnqS4~aGtPwXbfDKTIbt+!W^TY9Gr|GGXbPTj)HnaRu1 z&PljzDGZQllTf%#p2E!5kd9Dc^R%K!=)k9m@&+r;<_K}A|1{2y73N8qU5lJt2eF*! z!f+WSOL`SOtAg9uZwqwLWnajwM;9-+yZlyFhQn3rMp(DqEM89iiHp`Hsiu>ovg1Ea zkioA{u=^8~rnc#l#%wC*#KCgIi&h|$zS^YiuvZ3fkVs!4NBWi&#$`7lWios!uzZB0 z;=XpeV|}*F@%vP%f|AXIj;5n3PuFQLK57l-qeRrhXqvjqZ(yulDZfKHav$4Hs=i=z zzmC2`E?G_O&m|k7mKp>zWgNM_vbw9@!YYbxlKlvrTM_3J84p@Vv}y-K%lyV`1Q)r; z#L!P!X<;rthI!|N1~u4Jg0V`>ppLn8Q760tTie;ZN$g0?=~ohr$ukD})wE`o5jZh4%e`Hj!BJ87J6BDEHExm&R1U6b)DCjrr5qZ3SmR;8I_I~6 z?kNSUsPe2Xy5fCA7S#=dHGDg6!lUOs3XTTvNzM`mvD=ni)xrJ3!P#!nzB0SCF~;JZ=6%rCIRxM(Qba|t=ju(Xf?Q%A(CL++*o%Q#_x z!kZ36<04FB$eamB(SeV!pL2O_i0c#$@hOt5lZq^y>dHR27oNe+hjG6_6U;PA-S?s2 ziu}f(kR0N-7mg!{>mzHLINX}P@Mc{CSJ2~O`BQZHyI~MC>Y0h?<njcK&89NZF)+UE02?{S89NzT~w z<%f8^_aM8?tY)hjQL*_G^X30Q{9eTaU=QVF>)pYqlICu+JuZ!=-U0 zeQGui!8BVFL3`Xc36L3Rh@p;MXF%`F5864yYSYGvd5Y@rB1HYn&DP+YC%T^Bj$@EF za9%mM0qIj)LGAAQ^E2zeZ{r7p^&0_%OYKj4(ZY9A<`wL5thwjxQ>6!^Hh{j>DuN^9 zBJ~^Z(7J8pjE@}c$1(1HV`an~f8^vJS4#5mCPqj-n~1p{g-Y_1#%o8hMf!s8mG)S8 z3kaOHKOyws32g`2V2u%Nh4>%xBD|P$n~lHgMGmZ}iK8*T>6Gv{ea)1W z^f}x9_X!xmo*w)ABEdHuA0@N2wF42lao%$9%n{4lC7kOA#i%XdItY+3(SsVweuF&= zwO6Vzf7O4sMG8*_zGCVu**{ET_c-g@Nfi4n?_KLqKeDAb#J=!nnaK4Gl)7P6azN-{ zfUx7xQya9^daR1m-jGw!+dqAZC!hQOsD(D`QqUjt)gbQu;3ar3r_D_;8>y{aHaP5X z0ME62c66W|R1+Jw;Ci$i*3mcTok2b7c z4Syi#7Olm-6*j+e$@w!MS4obuFvTt)*G>#>Gd9Episx7!ewM#A;c_V3MNq$>%OmJ< zkKPOWYWBO2FqG8Jh#LZaLD@aFo~Xi%mtPO$3&i?F+`@&+V02AIenLOW4JRJGvKgdv z-C(>PK6awh8B>00W&cFHnuj&_p#hK&DfF2oaV>xJpCOxdSR|)rYR|zYOXm>&IIRbU zKInV$I`~dX1s&$6l0IW}|J5N4T&`<+s&IiNdWHHVLx;T}X3pSkg>#BMf%(g-M0>1} zTp1~TQS2mc-`XCKgnkI3byWV{Qu*fzHs!}1RSDLNIOFaQuZX0#gZIsYVN{f(tZp4Q(YmBIU!sUi8K(YKqNnn^+wQ4{z7j&#&EE9bc%;_ofv^1dlSG zv2<^?M1J{2@VsJZycw9Fd_c;a_`1wOt;qI-2=$0W3JkK}qu3Q}?IFIBUKYpIr3&;- z+?&7uN;>rogCpb_zkv!1RlvjG+9@SVH9<}0E-zi%$sa=uN#PkU+svQEk$|W=`iSY= z+AC!VvO_Yr|3>KO{rZ%plG!#qfuA>PideeL1x8-ca?r5WzBLy7*=JRP?X>~F;xxYb zlI&CX5q|}TWW65Z-=CSa$le%xmFT}imo07m?B|)(;DuAw-?Ka7BXQugTA;K+{+{XS z{5d$e-*S*G111JKqT6P z^b;Nr#9>e{pNcn>e3m)Y-IBkYnkZ@AyzA@Rz{npRz4uL3W8G+D@qA+Zo`}KbQO`^$ zD#N#fuC#2G(^RM-)3<}(!m8oQ3a;GZ(RYdB0H{ox>ASqIR6SMb0}`fwYJ90aGpJ^J#s@}c^Z%s`t5C8bS-UYgp z=dyWw>lW-GWWDNKb|$>4d$|f92?9ekDcIFd|#KpMinLey=8xR)v2g)z? z%>#n)z$6gLMPKTQ#;UA%#3Ckc_F0qg{=hFguJFmjOLpc()Jx%3NPw{@C&^VnY>)EH zryL3LPB~`z*^nw%d|s~P5x|oxb)|KmR&~eClUs44P5ArHlcoT+;id-(=h-KlF&-lx zDeq2Yl7&iBK<&ttZAX|;FlHHT4S`Lk5QKGbJ>&z!pJG)RPLo->$5O6UeS^Vca1x{? zdO;Jz>HT8m*B+PKH~nWsqw}54uYGv>v9D}Hfn5lvBXqdgqEqdNn9+XVyJnmE-kDEr zaM+1S7l;$N6qNd?GuHh4SnDC zUZHx&?v-`4cXS6=dMWJXlTCo->9{{6(4B0sySGJj*>WvYw!;!*AWx_t> zl)L!c;_{gV$}L&5*NFtH68QY#ue7(7zm{ro>|S=ylH4s3cQt=RtLl|3EtofgbaKZ| z(*<MEP3FX~|`huR@# z&PrCY!cA6~CNV!i882g?iaJHr9)VVBu44W)O-`VlhpiqPiZO0B?MUM7SXhg|yaJi3N$?fmE+m=S-DFh?Sn>3DZB;SJXAL_< zNh)ZYA$WNwuRp_sW|F+Ao-#p?5$f_7ZSr=?Tq46VZ_L(B;)2NQ0S|;2o_#R zjV6RI@b41Q7{$wsT!*MQeQsI3P1HipvL^QOLDAfItQAU%b+L+#3~RH=Kaukdd4rSy z=W@9lvlu(ihxT?bu4MgGj9J;m+6&1JlNem5x}a_@Ei>_>MTv`xldtb8fT08DMYf|I zw_vCF%%G1@w5_Dg(8SEdiggza)XC^SDxia<#caQ2Em>TZiI_;u2zPBF>Ujkg#KC@5 z&%>P_VLvht568uBN2LuaZrsPU%jlc=SnRm-F{hVm^ zBBc(ssd`Q==2bfGqK-zfvKA4n?KLi_nIbUZX*1=@xHL4zw2bNGJ!T@NDbJ#;R#~A(ucy zpkzS>tFbx9*!O)DVfwTc`jX)Uj4mMi2~FX!HYzcEN_4$pR>$D1C3WbrgZC(iP;#Ik z{0>Kz#)%cIfg+1m$3i>u#xe8z?-bAwPKO?=qu9Udbi6#nELE3GsMRqBWda4WKI*lE zI86t6V;R~C`<@id5lpMX`vLj-SmHa3-yAN@Y5l_IdoXx1+p!#0>U6Z&Kg#>(}MKqEZo>{0VuWF#n0O!uNBZ}M%~gE{um2&4G~VVK#*mKy2RI1WwwMJ z9fn*OvCOhHG#YAom#huAo>=Wbg|fO^Pta$PZ?r^kMrN;ZY*;m4bJ!#*+*bC8F?|EC{m{ZX zOV>GZUYca1{`*7DioKV-3Zqv;qe&<}Kf2gIM)PeWGUG1}3!ATE54r~|#nKP@q*JAm z>0}t0+T=&h_~@IFsDk+%tgP!ieL4YF;nv>q{T)Y;jc9zgsk*Zdc87VzL#(InEO)h$ z@AS#w`(NY@|A?Krgj9k|td)xMw61;Aaxyya`JvhD=CurA z+z!PGxj5$9mf`b{l)qlmEAz1p4ZH#KJ@*zcx`Sw?8Xx2@&3)uz>x`@)IWi(#0E2&( z6s+yz5p;!FURecGYi`5=qLbW_n;L-cEU|_0evL1dOaY_1^!SWki8BBLf@Zv{oVPZ| ze!Wz${IcEF;$&=7yE}aRt@&=UhK=MUiMeb-_8^hHRP&;@^M`*Ny5uKOpV`l2fK7zG zXU(JP`;jSJ_aZ@g`BvJGoB8Z{%mGoy9NFT^hkIjfuGxY=HHEfH=o+h<8fghhF-K(a78r$QysU%`uO%YsuL?{36jR}1|r7D#&KH#_+EP4UA>DY8EeXDiGLe&tHwv+ zPP@(n_$H>LMVe!O;ek)F#dt=pvNC*gIOo3(mwvAktnW|8@MkXx4D~jKHk##yqn)|n(AZ6Iu&c62h;%M|P* zG{e4fiESLrI|s8eIVLd_!U*b&@bX{#9Q!8&{>m(-Uzvi=Y4+G#IXSmSU!44Y)XWI;-o zoKSR{buG0`IdLdjD+wi+G&yR1sUQmLAT$RExoClWL>=D0jhko*!&1&^U6o_dDG%+B zvvUxc8ZbNw8$bE=#6sg4cRvX+g5R&LOpGhLG9n?A3JW6?oBT&;DY_bbd8)(-7nI}e zhzN|ovEC>lOhN6sWBz<7tR&ralIzxvTm3<38gYEvOZw~Rub8Dl zx**?>>>04P%5S3<3(dW(3u!7Qsc#Bb`(=^3XO9RFL6Ux zIY*nh&+u%J5B0=HgpLS9P%O)eNig|zP*^03;uK*i1d|Hq3on2l1Dj&2*4R}B^Ly90 zZV*{UEQvTJ;vhrQC_LFXnK)y}N+e5OSx_X)vi7@89!0ltc*Edo26W;_6|-m*S5jZz z!bbXf?LyU}VMt|o-{^tN8EfMP-z$uM62O{rkndpOI~+XBaX(e)bnyyv~D?=nIid>qUYB2zhKAMUK=I;1hQ4F5>wJ&Al2 zamVf$K+J%iiE!iUr5kMfb&`wQL7H)Wi1{iQsqqbXSxy>2nuBc{)Vh0Ln&=*_%Z^;! zfb%PxYKm^7aG4=9OQ8kZtuaHiRkCQ>U8kU~(QcD)T5zXZ3`Y!sl?q62J(~e2?*T(W zV|(0lJx6wd6)4EJaNmLm>(WE*Am4F;fv{GPVH~Tcd04+TPd&Tj(l5G#bvm#YO6Ef^ zRrp7Uq3mf(Of`_Osm>2_3^6Z&s#!eWT5iUQsP7SNh2P9S&ZkA*02M)8FORzSR ze%|1Ps0vBMVY7`MRbirPZ5%*#>`00Yq1u7*u-VdC3AH=|7rsspoMqjDBNr0jIP%(N_0Hhit*SCGG`M0#;_u*f^>RH5kmNj_ProVm{0tGuVW%dWcD0sTBzXM z37ogWr{ci|?=Jf1q|K^XtkO-uezqLx*q|mFFMM4R>bMT|>xJBmEG*T1TK09|rhO>9x}p}Y}8{wdewUE_Q^Yfjg0 z60LzPnjY7mgJWcO%q9AIY>P%w;uYKkrxHV6qn7)0ytMF}a*|GyJniLu>0$2C^fuP6`56 z+(xn7z`)y5Ya4Bjk~%kmpt_MPV)hwhR|f51=jH}l`RDSHh`%1FLhV=RqK}^?#Q0Ex zfe9X?Qi3I|%t!i5tH~U$31<*kJbcl?1=dOKBo}6#X3E58)#9$w zBf3a8S;>Foz&76|=&9xh$c*Wk@7G@_f_XfB)N!N3yl&LF%M|c^=44bQZ}S|lIpAM(V6@H9qF~$>^z}xzbr}`95AGVx z`%~E_I6!4%alKKzAv9L7*wK>;9b%wNHqqz?a1|FaKmPvEEmujxqa`D|s+nORLB!SF zA!%1-YYYTdMEs5&h!Vr)9C%z4n_KdX|Nk8yHLDn2~4HDolyd+3wru_W+?mz(Ye zkPJY85l&g_gYxKQp!U4ldYJc1@#9-X&6#i{220QM9HT+qP{dJGQ-J+xcQU*|BZgcCusJ z){bqfb8dIly{Auiom(|$ty;h5T4RiQ#~kmo;;jn+RUM54@tCHE)Ji;Q5`_sl1<8uN z;-S1B29A+gJ;gM-E7Pvt=jh9W`&GO}N#$rKM5g3WZTFraOt4JvvaK~LVp*hnq$W8` zNwdvuNpxh^PO7QZGQAo0dp};WYyj@^bR=xeiSWLTpK_1aj_`ngMcCtt{}BxMS8N|{ zjNgR=zT}KOvxgg?BQ*C5;1l1Bexzi+pu{NWrFcoX>?3C!M86_k&bXG{-S=@d6$QG2$_?YkGF1@I3q!^hU#IDB!J*-AIqlp?T z)`7C@+c~xwMcAV#o%sPR_;hXb@Khs7vWe`lDs5J(H)3U5FTXGrbH#_$_UR50!rFJD z&ihMoQsoGEnC;^q6Go5Ah#Nbck>1EN`|6dGcWnQ4)*>hC4bRN&7G%#m_uDsUk3(_r zp^=u&m>V%||1;4#$KbQoh4v)Go)eR=91w+{ZxI9nh?l6mCW&9_sHr-*ytzo7Nm}-* zA_v?~Dysl4K<>upLL~2}69d&A>d%Q87LKx@yP*0+7~&q#r1g^2k9mZd=Y@sh8xn)$Ao+ptof3I z_$>7xFNQ`TjDXuG-3RK+6`ow5C@6?MZb(Ku@@w3XscNy>>#DpEVh2nH7(KzIUi>D7!Xo1z&d17tccwJNmB`ve9KOQlBIBfW=z=a%Xly+ zLGEMusEuB9IW;c3PB8RJD6-x`Oo%{I!>0(W&`ZVz)_Cg$jF-|hC5ktmCpuq3f=MC0 z&V|;`C6(zPz@#-V{^nXy6y_`K*-!)pAA#UU7ZIW*zr0zje$>m*N{8A#Id`c*LTYRT6(Ghwvn% z3%?Fb-^W$(lz7yRAIv8cQCLW*2XGR*6bvq=aS{RyX}F90!LSY8T(bpH+<_n1w{}TB z_C&nO--Hcsq9Gk9B6W)G2{lX{3!UT-lQ@fz%F5`RKU5NRGBWI-?t0d+)uI#U9kai?lrA#JS=Y{8f9nj*=C^3aPQ1u@62fL%t-G_vA^{GOBZM_ zFg)laRR}dk@CmL0%FQ^#jX0LslDT8xni<0-g-}@^X#uR6Fi+s?Ft__1`JaX=oo?>{ zEPx>mt!Ey}99GNUu z4AVf|C0e-(FQ+PEEJs)&KZ2lJgZd$=b}oY5QnWq5sJa5u>_Ti9-CChn7J;_abGESO zHY_@YdZKeq@> zrsI)$K0T4`IJ0PMp6Yb6yeW-dNZ!K$Lp#DaIOyip@((AmTWb9w#auw^IK zj2S!TBtMjsa=s^n80Vv9nJq@L+|)R5+6w4>rl*0B@ls@*6Oeql(vxufTK@QjU^V+V zF&Fw$NsTzY8mO5QI|nB1Y6lXwdR55*Ck`u#0b?PE58_*cdVbs|P)I!|Q$=@l#2sqd z)OIk%6L3}^{~!6Mdi*W(-4}F8uAw#t9$&ZmWQ`FM%Vd)Y(X@e#da@t40S(gWUc4}@ z^7SefYxx13MAgc8)zU^*I(*Hr!ZEiWKuyxSr2ua8dP?B+@HVA?m z5rXG_NpJOAJX})z@zu35VUxQ;O~oTn0%vAxlNu4}IU}VGRIlISY&b5xZa^69SHZp~ zm>7wYsce|EkcO7Vc^xK@?)46g?uw9c#OY~C{{5kX2!!H(Y@iVL$gbN3g^L(6mJebG zNZw-qk`7YC@e_;HoZ;~x3LnRjF^+|mS!~x5s80hZILB_Jx+N)~$C!vU?`wx%SMotQ zqD=ymC-sD59L1qMuevsb(BGw911m0A=||KpJ;Co%!6&Lt+VE&o?RJEGZmq$6t4~6b zc`VSl35`nA1=*DIQDE7nUFzpSD=8|M_-18?j)YzGqes4eLb;GDT?o8A0*Nz%O}t&= zZ1F5%WZA4Y@xk3f9-`eJUvFl#I|{19iTsS(z;bVP*?n_id;wVbee1k{)?OomK(lQK zdT)B0-E-n$2UqXh5zf_kh;Z|B`V!rK4$0cW{$M(ip#^{O_347q&7qSGBMs&GE)U2J z3+h+#3lSI%e0ShCv?}qMtZjI6BEmIay4-YuBOvc$-01=)XV>n@HMDc6Y|3Z!q!Xxp6YE zb=Zna%pLgez-8?OdNzT+-DfNI+XW+gW2)S37_jt!V%+fIBeba+B-#S6P3 zhMI%3Ba0JvO;6iY7OxRk)r(=#z@f)lk@OZx5$CR682?x&qV zD0mQJ*h^WBj&*aqzTJ_o8zqHq##9Hi|2v-S97VQX_Ikze@P#xiVMRtD>joxpcAsTy2Uerz1mSZsuU=4D%4{ZJKF%3r3l! z!sAkuE@*&9$gGXX5a7abBG)2~7^0!1dp^UphrD^nRrrp*J&_2LEnxg0ft0-9UQsl; z>3~b1{UFUr)Dwm64%U84F253zVRBSYjGC$d?ru<$3i*&pH!6@D*1v1zNpwu5m*Grs`bD|e)8u(D-$ui#lS=}hP3RawiuJX)H=k{x7|Vq0 zjZF6WTBOc$BSYmt9r-1(6pf-cOrJY1j;0l~j=5qG1jLmW2|)_JjQ)A7r2 zrYo8>tVz0z>Y948MRo=o4kj>|gt|Yv{od#7>^;&mUMTzJN$?l~cw9Sdr4qL7(i*nx zuc0$q=AhG%N~Yrx#U^-A+~NMpQj2YBz3Zeb61(^oAIvD~`G~IkFMD`~)b5vc*p8}v zgdr}F&O_$`mpc@1IDx+|e{BEW;ik0HOTr25L#neaeQbU_LWXHp3 zztTo=4)6f|?APNGaksyjLAM!oXMiOLJQ%oPkUEv30ikn7h*9WneP9lpvKY_3D)pF0 z5$}0=-l!=N@A;a%K<1G?vp;6x9JffKLj(5ZtB5>9h4!89a90?y1Ds-O4oA zp~-r5))D2&`kNRP2w>D*de_JYyu>{@6&%@~xT6(COV@wOOXV%C>sRL@7b3o=5zYd} zSG3?DYk(ILOwNzmwj2M2(85hSdF=L0K9uXc_@2ml4@CG6ALm`dUYlEDoR^V0=?^^k zkKb)NAN_lVwFaGZPVN2VKwHa^`+t88IM7;5MI;=xx#5%7Y?+NT2dk|vgC@iIEYqjo z#|YBM;4fEi+@HB#%*oA}39e?t=Sw>T%>F@2!AI>ka`nRa!$bEyhnXC>2zcqCez~|H zf4O)`4MOCm!$FTDb-VI+QEh7)s@0x*o&9_0yk6`MoPt&v$_y_6)|pZ7j0C7uicozp z${9#xXVzp~gl*}yvvb90JBYl;6P3Y7(ynU%7>t^*P2xJoeO;-b| zo+=>NElKw#-4XY9(pFV%LnOT76H||4Dw;7Q#SF|r0}r<5pm|ztJm*dSdmC>dJUOB_ z9O^;Hk85MUMtgqI!2Rst6H_{J!=4m+Z$dGMMgk3yOc4O&D&&4u_X41EK<*|#nc+2` z;=|wJ5T%k>aG)Kbd^G%ox!{IRDgC@zz{1md!d`BF;bdOf zo3O323r;1-cO%W$mS~KJEl-H0@{ZvZ>65~75sdeS6PO;cm>3#TB#~ECGYZ~)M|C!8 z%p~Z6H~dqC(8x1sdw@)<1vc06bi`8A^t_{^Ykl}Lji0ctWM(aq zUX5>>;;JZR1&LM%^1D$vGroadPN51v)vmy}J@+S!FswI{rX~f+u92b^bt-Smmn^B=AtAf^mFjgbo^6Er3U=v*UKE;8bXtkS1>?6-^HSI?doaPvrN^)+> zU{C7J&p4k1mGwmE>8tiCs!}QPDOOoA$u3>OGi1#S5B?yIibJc(lXEXqC7cPc1_=xy zk!p>iF#eQggd7)MFvHHg+v8pKgCV7d!v|ClwAqpKQ(S`UlXh3ef|;0^EK&itt2-Yc zX9Y(g-0OerDEtN9dm(QXA8p-VRl;0AMCG@O-qBvl=Vt3YNFr3V-ID^YIBk?VjT zQ{ImtB?WXEHJ%Pik!|@R0LW#xX$(ApW5uD0B}&;DMCbZ@HBtfT+Ak#qyP5j1A6){z zoamueLdZ25?c%~_afUU!bQ^XDc2X)IB6Nn9mM0&4dd9{>rXVQVQO%c+eKf6)lK`n1 z+bm>HzKoP0!jzS+?P}46GSr>7h??7Yj9go@CQVrm2KW^0^ zZ-0oJD%Kn<{-s7FcYa?dldFAB8++xhd35R>?!m2){_Oj(mO-h94c6ay$s#QE8Uy1XGy1x)qUj^2m*_K_nt?HGcupeqZ(TjT0HT?Uv zNV(paWZM^BZ%#RZ0q2NR?1rnn0+YP>|MraxY)T#zuNoM%f0>XVLZ$6>a(B%sPc+Vb5Fe95{2fgBAL$!(5q|0 zBPiK9JK4F*sQQjG*{4+DA(IA5;uVCxVQq#-9IbUOm(cPTp2G{8!wY!BlRD+N7VY|% zpwXiUY$Y3pK>FCf9=zzGW$)TO@7hLAI<*}NRoFO8Y8u2#&M{u2ZnAiYgmlK8Ps756 zNY7bP&k+A3Y?$^O!?@$Vumfy_Pd?JT+21fjIV|rcB#7~z2=FN%)XCGylUO#a#&uIs zMwonF+1;ll<_e}veXL(to=>Dt#;K~QCjq6bYPvaEMOJ$26_w+9F5RZV)VlvBS&6!A zg;s4ZiIVpUDEy_02v<0Uig-g0eMj|1i!U+TSsf3M(b!Ye`S|3BcqjUf zHGzHjD)UAcqPld!i*uG@5_4H_2mWKBifCp~Ebs#l9IpLM2zXSWt1{Pag}3NFA5K*} zkQp^p*7P1rd&YluabE7q=Cb=p`^ZUYj`2zUYg8{xIy zuC(8_?Kb+_R$}^2?_@9&>IIv0I%g&}Iseyr0SenMo^A>P*J~m?aF`QfU23jKuS6JH z1T8{wne#rEL@3C)<2IWhZd&AVT-cxcsi-md5_el>Ic3@kJWSNJTX0R_@*cUCPZ~QaLYIFc}(b~Uy_BlS^jO3 z3#SoTr4nc`j2LNig%(3bZfUj$b_{QW%0+#@k^r~P@VCf;b`hLdC2+o6D4s3E!-83# zpe+a7@Uzr9-pIUXk=%%6W=uQ>KB*kHNjR1aLY)dutTCqWlUw1XLPCo`=Vy}R23`;F^iL0BweGTbpN|olPQAI~UO1A2$jA#0@rEZ>OCXvEM6igjB zgynI+;$us-sTHWI4hU{?`{)J0jn*DrbSX^LnvZww&%d56 zd8f-H*tr30Yq0Da9Q#$!`@Livkg8y!E$9Um?uP~MEs*pxKT`aJH91cZ`n#DR=@GR~ z)C+}VeF13+VLvM<;a zXuShPYbvG3OZP#}^7HBPHEsG2y|mq0H;17hQ2lq5+Xg5r{L#qhV5_3SP6*8qcd$;yXE_#JS%gy{NUQMSHq}tZPat)jdJy7M-D)&=SPx40PA zuz(lMtPW~e(g%I?S8y;rv7Sk_zFEexV`B!aUSeqdm{a>=`}z6UKrAQTagBzLen^4;4>O9(c-06x&L5_ zyW_^yLBY)yBDBS922Jc36K`huF&6Gj4<4U~&4`7~s0|*Ym^_${7&uQmu)JN$ithya zyAtJT$M&6Mp_)9@=wW>V^>2jU5D51Zh>Ht2!inRaz$*7Z=jnYS^eM#UUN0`xk9N|= z*W~i22`x6}o$m+}&HSQhHR9?>#LJnupU3ojc($ZtLe!*Qy%4+uFe<+gD2*}&dG!49 zcm>}Yo586-=z|QK2wfhNZFFH-(D5m9?2%O-?nleAhRLGaK_IN@36?*wJ*n&g{d~wR zAoW1R-=8rk_yU&gdzRg5cg(b9HRCW^$8@-YTw24`exTH=qRSscna}**6M4JuWWBO6 zY>jQ0Q5BGPeQ#G8R4_}r_;X6uqd?uvHekNq{>7L8d`Mx;0tg0T)$WR;Kc>2!|n;DZK<*sUl0B2$#WOD7Q)Wm39rg` z;V}wb$AT7<&2{inkF=iG8nifch%|S#o~5t)FU{|Bvf`dT zkcRIbm@gjkpu%ih9+Nm%{Srvu%zumSvJ8DZSZH?82Ogoq0d81H?x7;>ZeS`N69$3L zWLyKEuA&M4$9heWJ4QEuUc;;J^06mfVbGK8)cQhMCbKU z+SKv_c2ViKF@x8z;q5bRw#c`=cLYtM{xzJ*x2(yxjmbBji64EE=dn<=8!+8N4#;`8 zOIaDLlG6Deh8^gGJ7%BZwb4t88+6x+E=;X^=B~>%%S)(RvItx5hMTxRE5HvwM3VuA z=jIzS_|v$g-$>`_X8{Cb#Nv#VR93NQF2q$<N1rKTe;AekH+WFTUL+8 zf2Z`j2r)Dp< z_VO&7ZU0o-W~g<}vV}dGRP8G?TE4L=&4K#G3n&;mcYUs4GJDnT(5lxKZ`BnDeIacm zNct4N!lv}3_ZT3*C;4E5^kZFjBZjvTzIhS)lUxTe&AubS-SfklZc8XCLK;*&J8%tc zz`JY{j5Ls?BAOk|a49tUp>hSJnru?cz9PLJpVIbzWZ%4eF||N`Z4-V4%m7}F3vY&i zUq~Lu1bN|eB#7r?>j{PlgQ1vnic?MrVHYyZD2bX9e2&{WaBN;)^vvl;AdJA;Fl0rCG_o9TPNwFE6* zt*dpxq;-Ai7Pi)04LTYpr-dU$jRJ=;nfIo!qS$b9WRobg(dZOHLIMq^tDA9ZL2){BXFdClZavZ^#y6df8Q0=RYX8Xa>4E>#uV z7sj=>0Y+q6F|<%mvnqWNzO;4-Ny8Gd&uPp?nJAlMSWgZE%|A#5=96emFslo<%{kXX z1C!y&rzlqbtAohPlm*|>tW|X!My3dZl)}J}!Lh5q?NsgAG#chyU@PNwoa zub2)_6?{7DYIgC8awd_Tkjadw(ZCV^deJIX1ht&6DfAEdOmBsq!pqbutyZOGgZi*> zXlQ^&<24Fs6*t8;voHkz8Fd3YwpUa>LP;$kG6$8D%zblg$d*;$EPBr5=elh`vCcbG zn;U{fEsqus=l!^vQDoU$4NqTl^`z+KfB}d zWL>ls##;^N<0>#sv~b^KqoG!AmE(%?QnkVZgQoXPy0)@nru%#x##|}#cxLuZt%gs5 zIkorg4!v?rhTd}#C1IRFf!KEMdZ{iuM~gmvOxIxoO;V%G5Hr6}7vR&E^aIzg;UwL; zlH|*9g*vTFC|ze{g|mwZ#KaY+c+fS@hVZ=H!<2zXDGt1=g%bTQ zo?ytawX&2;D2V}KZwS?}7<<`j*sVSoWJVD1ESXhC5I^WP}0j}>v0>AvcKMs1D z5bEVZN}54U^M4Zb$MCGZz_n*1IIK)Ba#kABgm{{n_FsT;%PbozJ|gW3QWrTEWNw?Q zqqughH!LtsHhT36a ze}s`g=Xd}@H|HyU)m8Gd1&d2{hb%r8+{tbfi`~H_e7}Lc!V{dMrd&Z>&y~i;bG{zj z^|KjY^Lnt3bxKv_o8Q*>TowWms@DDuVqYjj{-;NUkAw@cAXM+bgpZO5v5;(ZZ=i*) z4Y821%AJOhTo9y;zCp!apUpz&s(5C^XqtRd5*0=;ZfZn$=vbfY7|g}Q6|E}VS(=!~ zFBYgujj~uGNu*2`RwS8MESaZV7O==>)F6WX-8=C~r)%_*x~6|^?~;-I;%p~kW9MWl^&hXlogGaLZU1L_NKUwv|6xXj?5z3P z@YMLDAywtRsA7y)_%Txv$FY?!LJ+A)pF zEyaLQxhKswtb%1NN=xUhFP_xgy2dXPNxSn9leC%&#VZ$W7i|16Pr>xHiYGC9DiYJ9 zAQNst1;RjMMT|V}9ER_2&%c0X=T&BV)7@<~&gG4OtI@e;EIM?SNd>h2xLY|;kqQ&h z+iX_-7Gp6DTv|8}2fT@sXf*f)#fmf(aV9mxQT$3pu(QObJ>~tsSK@y+RmCsn$%xO* zd?4}E@pJ~NqE#WmCz+ENH)>nTTYTCRXHSKO>#+p!&yU8XMln~(^feZZ4ycnKE}O5oP+R+iS@#+ zx=Z<2gIzsrK-|0rjDkn3)N}b?BmB85c*Jh;in-uwls3|zqp&6od{tx`K>;ASB`aff2#MLc=nS#Vgl1#)&U|L~X z02a=H;(I7oPAKWzKvnHztED?CRc|obrY3S!D*Cs`ifBu|Qq2Az zNqyAp+SEO=oTvSCr14uDpqa5}4{W`-J=_9!8qvs7v9}V79*q#Yy$u#`2@XA&JyUOW z*B;FNX9w{j^}z>3ljl$tAJr0pgwt5DxA2p0ih1h>FSQV-23NfhSeCA<5ix;n#hc92 z`~!>4pL!6THz-|2-q7J0`7>>s+bVr*8Nh1ZObzxv`E$QUym4`p%eu3hCsD5HjPz~R zu+W7nQQCCAU5#~N-Jzewv(bTcqtHCpYD1XzFsN7t#v0REnV8MS%qgV`CEGerhM0+W z)wT$A*%0J-QGjSJZa(P z431|-wSz!n9Utkd#-eRW^j2ZH5a~uOB1OCMS~m84;`?J2wUharF+K-$#p`bp<{@`$ z2|I;y%>GzhDbjpxHl!TPFyW;SC`6b+`ul5mI;w1=JVV0@m{@O^h~UmU{AH&o{XTqK zvLRuf7({H+6e%A8-wLE?hDnszjxqUl8LSjrJKZLS0HL-?c9;oijSW+5&8=~h_EK3K z`O|~(guuPa&_|o;I@fb*y=j)Wx>)i@=Yr(E%u_H#RVL`$X%u-Dj)qxQo05GpW9ing zunB^>!dM{&aY*it4$%odE^a!ytGqPqk`sBHQ|cJInW&Png@!EVB&m_?^i*@(cj`_n z-Z=&-8^tKfsU&I~&7d?}y#C$I-$!95msXo%*K9Q}@Q zaSHGP1E4tT^}j==V4h_u%V?>qBP?Fnx0CibacT^DLS|r}D%+~|gluMSFt(reGeX?zWCl9j6$V^*_eR=6d=J=V zca;PH7FfNgI2=ZaA)u>;dnFp4k|mIHg?m1m^EYi}aJv&Y1S!!RRVxMt8Uu!DI5Gau z7~1ZU1|qL?hkR?3x2UX(sTh?_tz_rhKA+hN0HfIOY14Wn(_3dLn+dZ=)S@bd87T#G zyBLHdyfb{>e(x6cX&-DFvzofrTN1i0*<-WUY!(N_tf(j~Wg7Z>;LOH@O^*$_&-ApT zB}9$%eiR=Z35iECA#mB!H}n(<+~aGQWG8ja{tJ`N=zX}k#1;Y8&LGgxoP_BK73S`> z!ihjmEel`Q}*KLJxr{t-fK zz{El8C%NtAwaE0d;qiu9u6}=Gl~If~*Lh$rk4`juJ0GDizI_j@`VQFU^{NEH9##W7 zL>-oXznb&}EMy%#zCXR~NFf`gnH!hcyT!6DllFbOS*Rt4VP-TM!Xz_og6LKMz4PoT z*D82yH6hW}k;g?0Qtuo}XF$Q0;2gj|{UgxWtE6tSB>KZK(4zZ7Hg|TA z$5!BKEb()^N>#lD&2sf$O|d&ZJ&|7|)XG-emz_rAx5a49L0XUWTnb_(S+nMAaKMkjq1lx{-CH#~f@e5gv8>(wd`oV+y4EVA z<1q&-vg?bkYiebf;=86KsIsa2p4s}c_Tip$d5vK~wruqC!liOVazCCdTqKJEbPDZj+gg4^KbJkn;I&4UnywofeW}x6 z`~|&EOS=qJ&ySgZT(4=?Al|uNK_lIL+Fr=fhSwfd$ho*(Xq49+OH8YEZqO9D9>w2D zUUx~M`QKvpY)gwr^=3hg7oGm(hBIPd{TJ{V*0O)ID-^|J5`c$*$w%(PbJPDLi#0ur_B`S<*?EFhCZc4Pdry()+skg*RVL|MtjCo$BzH zDA-rcB5nVIXA+x{k^9qP^*|MoB#$HR7#CS7QyOmt6Mv<#a+G{|LSKdw;uJI?9>-yU z34nRh(deClhHDf+5xtO;!b+>CeQJr@xD#M%1zDkLE)~B#xnTQ3xP0r{>jAJn53JQQ zX(SVvCRM>?X^D~BMz?eE7_6E0Mq4zdQujKo=pidxH&SetBw>$Cx7-ju`u@+Qk|RX3 z;pPvUE$2swVf*h&B|8^@iK)qdDVLH}be(>H+`b%RM-#<6@CLB9N^DzDz!fURXzMT; z^U8S|MUU2*45q|mW(jhTi`dlS@G@W{EuYo%P3`V0P$L)S{&h=bW#L2-e@ceAQjvD03*oyz8G+#Yo&*dE4O zKpj?U}89H49y$J*B@>`fJ-*f zr|ohbV4hB;eb*SWTT`6yPBR=D)c}1ozviDIMYc^tD+$sZWGXEye;iIXPOCC!I)fYX zcmi{BoN0s6y$%ikQ}41_T`)E?1Nis00(9&~h(U3=S4%+CIt~ zv!MYDqvh)Nx4eJI6~_BE7q|L`3BhqkPh*OkW=yvZ4BxM6j_SfMFTiU=_9N5aM#`?- z(j57EnoGE13-Da+x^GW0tj$JVIB=B6MKy64(uR-|YzFp*VDE*HJ!l8^y5K6_rr@Bg zEs>`J@rB`LG}Jy;>O0eiMl-xl*LDPP@-)q0Kuodxgo_@(9 z(e`qfm9#x!7(EXCI~!pu;41b1ksk<@!V4$Ika5s8x1fHf z)S;<{Ce5=heB>0tl8C6pLhY-6k)b2g*2|j21ve^iBEeH6SJ#M?+&e2`ItKoOH z6VPIVtgO+p5`#H)qBUY1G{rTjMk3~?f0_jTNbxO=sYbSi%6dZjr=fr6qTFPl}v9~_5#_ecv#L@dp=h~3;3BMijluL2L z)R1}p+H#BOvlEH=kjW7+qR%ZRJ{MjW!YX#JtTY+SoQ`~pj-h(0F&%4T+=C?%Dp}6isT0ijRsBTek?&e z4Unx9RSKlLo{l>9X5~326zK5=y#d0boV~C$ToQ zs|~ZK#PTV0TcfySRXrcNnOFiU`@iM2ja5`6-n`wbL6&&xXQD;u#!Vl-7|{00sG>*p zsrRE^mn@;e7#y8|`%+o|x$-(&9y>}kD;2jXWz5yL+MuJ#gTg7BuY5vyUIqNf z2KcLkL3s+m9s5wEw|1nVrxO!qeTE^y#;5>Ot<%1P*}j84bm}V~VpqQq{p`xdFCSf9 zxF4mlX6@tr|LcJCA7aF7S*|ADPpgCC|3`)uu`qP}ZR+4+3NSWRHZ?Rcb^KrAmg@h) zU9U}1SW+S32->WVYA+PAbzy*O(W4g?D@y0hgRI*&*rotn2h0Xk__=~W3kOc37*8-i ziDFp2sad&6t5>ma5~p8qKj{BCaa!VNnGBmaUbi3rh!IZHK37Mze!gBH287avP5aqI z^1-tqLd;H~uOcSpPqWe#^h&xoK#{{YsDdsBX!EB;V z%sHvcUYKN_Vjk=`O4Obv0wrlA1t&kez10u&vBuzKAkRrnz$ZHGQt7=QgS^ zmhPGk^;MM0{)?)_EOhS+B-F6*=ib>e^wpYlxd~5A&an~9EAoYSD_G9m59qEB;UdZa)3st$ z!X6Ehbe5Su-xmDKW{7QOE#&ZQI=nqg&k;Uzum#$kUc$V;lG!i`Rjg2l0`;c>?p7rT zr{&=TDEb#8OK9Hr>IgcWvgCqSi$&2cZE^N&-#9GS%^3&+$E=fxbSABWyLP^|q~|yS zv>o#U>5*RDj$31U#GblvGoumPa>PZsu9l9_2;X$1KK%1DW{n+YCEGpeBGib&=`zBf zfOKlEnud&KSYAi&{4G$fq(Z<9&~$C0<7wa?vcci3)Y|^|r!8~{Rq+W>ElyIQYgdC5 z?gp+_nWu+wnu+A7a#-?|hi*oBF5b&e4bD^-HfJNY_nR}QOg@OCJb|a(i!ZnKoGu32 zc;QHl^Cwgymi+tATR3sMYa&x5>RKFfgiM|E;hoD)nqFAC_}f3j7l{1K3+#JlTO=DV z6B@FJh*WNsL2DOw$}1{|p|??#dz{REhbD~t)jBQO5! z38zeSI2}jDFWQ_c`3?NeNzjmScI5d!6MjGqahl0`R6~pW1fT}kA}Xg-I_MN;2aKB#BvfM z86rz;$_Z0yr=6V~a&HP%+QRm{I9j4FmLJ+|&BK%n3ciDX$=RYAiCO-Jxy&7bS1AZ+ z_J*8@YgPA$&4(>$^p=P<@jgC}ei4wD4Eps>FM=5H1!(j>^MNpX@NeP#rZ5g*WZX_E z-iUbEUE8S-5q~t~lgLh%ZA<{c1t>Z+R`m^n+31Lc$Dix``bbgQdluR3rGFC`&QgD+ zRx>9FAs~?R_Y217l9fS5UqQTL&>O+k3%&XWRmeZXEj=-V=Vc$2GU;xoYaePIc&}1$ z1E*GbfT4P)ByukDxcscdry92-C5hBNPtfsp&%|$mlLR)J1P&4C*E6m%u*!TNch|Aju0%sY9&MD^BW7 z^oaTXfli#Pdbh5w1^s%_g%*O7Tp{T%lu#t@;ls5cq=ib zWfp@GaqO4*^Twwur~dSFuD(2Q6w#F!{?%fCq!Qzm(IhP574$~ipLac31LgiCE(Mvi z_#6Lx`K4rMZU9Z@rqM~%HC3mysCtyBNzHDW$&IXKh}jI2=m$EJW}}(7kvNTU?J9

!H~16qX{l) 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 ZmXm}6{8lh97vN6^HLyZ02TZNN{tshuH*)|0 literal 0 HcmV?d00001 diff --git a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java index ad3a83f7589..e7a536f9dde 100644 --- a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java +++ b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java @@ -9,11 +9,10 @@ import junit.framework.Test; import junit.framework.TestSuite; import org.jetbrains.annotations.NotNull; -import java.io.BufferedReader; import java.io.File; -import java.io.FileReader; import java.io.IOException; +import static org.apache.commons.io.FileUtils.readFileToString; import static org.jetbrains.jet.j2k.TestCaseBuilder.getTestDataPathBase; /** @@ -28,43 +27,29 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { myName = name; } - private static String readFileAsString(String filePath) - throws java.io.IOException { - StringBuffer fileData = new StringBuffer(1000); - BufferedReader reader = new BufferedReader( - new FileReader(filePath)); - char[] buf = new char[1024]; - int numRead = 0; - while ((numRead = reader.read(buf)) != -1) { - String readData = String.valueOf(buf, 0, numRead); - fileData.append(readData); - buf = new char[1024]; - } - reader.close(); - return fileData.toString(); - } - @Override protected void runTest() throws Throwable { String javaPath = getTestDataPath() + File.separator + getTestFilePath(); String kotlinPath = javaPath.replace(".jav", ".kt"); - String expected = readFileAsString(kotlinPath); + final String expected = readFileToString(new File(kotlinPath)); + final File javaFile = new File(javaPath); + final String javaCode = readFileToString(javaFile); String actual = ""; - if (javaPath.contains("/expression_mult/")) actual = expressionToKotlin(readFileAsString(javaPath)); - else if (javaPath.contains("/expression/")) actual = expressionToKotlin(readFileAsString(javaPath)); - else if (javaPath.contains("/statement/")) actual = statementToSingleLineKotlin(readFileAsString(javaPath)); - else if (javaPath.contains("/statement_mult/")) actual = statementToKotlin(readFileAsString(javaPath)); + if (javaFile.getParent().endsWith("/expression")) actual = expressionToKotlin(javaCode); - else if (javaPath.contains("/method/")) actual = methodToSingleLineKotlin(readFileAsString(javaPath)); - else if (javaPath.contains("/method_mult/")) actual = methodToKotlin(readFileAsString(javaPath)); + else if (javaFile.getParent().endsWith("/statement")) actual = statementToSingleLineKotlin(javaCode); + else if (javaFile.getParent().endsWith("/statement_mult")) actual = statementToKotlin(javaCode); - else if (javaPath.contains("/class/")) actual = classToSingleLineKotlin(readFileAsString(javaPath)); - else if (javaPath.contains("/class_mult/")) actual = classToKotlin(readFileAsString(javaPath)); + else if (javaFile.getParent().endsWith("/method")) actual = methodToSingleLineKotlin(javaCode); + else if (javaFile.getParent().endsWith("/method_mult")) actual = methodToKotlin(javaCode); - else if (javaPath.contains("/file/")) actual = fileToSingleLineKotlin(readFileAsString(javaPath)); - else if (javaPath.contains("/file_mult/")) actual = fileToKotlin(readFileAsString(javaPath)); + else if (javaFile.getParent().endsWith("/class")) actual = classToSingleLineKotlin(javaCode); + else if (javaFile.getParent().endsWith("/class_mult")) actual = classToKotlin(javaCode); + + else if (javaFile.getParent().endsWith("/file")) actual = fileToSingleLineKotlin(javaCode); + else if (javaFile.getParent().endsWith("/file_mult")) actual = fileToKotlin(javaCode); assert !actual.equals(""); Assert.assertEquals(expected, actual); @@ -162,10 +147,6 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { return prettify(result); } - protected String expressionToSingleLineKotlin(String code) throws Exception { - return toSingleLine(expressionToKotlin(code)); - } - @NotNull private static String prettify(String code) { if (code == null) diff --git a/testData/ast/assignmentExpression/expression_mult/and.jav b/testData/ast/assignmentExpression/expression/and.jav similarity index 100% rename from testData/ast/assignmentExpression/expression_mult/and.jav rename to testData/ast/assignmentExpression/expression/and.jav diff --git a/testData/ast/assignmentExpression/expression_mult/and.kt b/testData/ast/assignmentExpression/expression/and.kt similarity index 100% rename from testData/ast/assignmentExpression/expression_mult/and.kt rename to testData/ast/assignmentExpression/expression/and.kt diff --git a/testData/ast/assignmentExpression/expression_mult/assignment.jav b/testData/ast/assignmentExpression/expression/assignment.jav similarity index 100% rename from testData/ast/assignmentExpression/expression_mult/assignment.jav rename to testData/ast/assignmentExpression/expression/assignment.jav diff --git a/testData/ast/assignmentExpression/expression_mult/assignment.kt b/testData/ast/assignmentExpression/expression/assignment.kt similarity index 100% rename from testData/ast/assignmentExpression/expression_mult/assignment.kt rename to testData/ast/assignmentExpression/expression/assignment.kt diff --git a/testData/ast/assignmentExpression/expression_mult/divideAssign.jav b/testData/ast/assignmentExpression/expression/divideAssign.jav similarity index 100% rename from testData/ast/assignmentExpression/expression_mult/divideAssign.jav rename to testData/ast/assignmentExpression/expression/divideAssign.jav diff --git a/testData/ast/assignmentExpression/expression_mult/divideAssign.kt b/testData/ast/assignmentExpression/expression/divideAssign.kt similarity index 100% rename from testData/ast/assignmentExpression/expression_mult/divideAssign.kt rename to testData/ast/assignmentExpression/expression/divideAssign.kt diff --git a/testData/ast/assignmentExpression/expression_mult/minusAssign.jav b/testData/ast/assignmentExpression/expression/minusAssign.jav similarity index 100% rename from testData/ast/assignmentExpression/expression_mult/minusAssign.jav rename to testData/ast/assignmentExpression/expression/minusAssign.jav diff --git a/testData/ast/assignmentExpression/expression_mult/minusAssign.kt b/testData/ast/assignmentExpression/expression/minusAssign.kt similarity index 100% rename from testData/ast/assignmentExpression/expression_mult/minusAssign.kt rename to testData/ast/assignmentExpression/expression/minusAssign.kt diff --git a/testData/ast/assignmentExpression/expression_mult/multiplyAssign.jav b/testData/ast/assignmentExpression/expression/multiplyAssign.jav similarity index 100% rename from testData/ast/assignmentExpression/expression_mult/multiplyAssign.jav rename to testData/ast/assignmentExpression/expression/multiplyAssign.jav diff --git a/testData/ast/assignmentExpression/expression_mult/multiplyAssign.kt b/testData/ast/assignmentExpression/expression/multiplyAssign.kt similarity index 100% rename from testData/ast/assignmentExpression/expression_mult/multiplyAssign.kt rename to testData/ast/assignmentExpression/expression/multiplyAssign.kt diff --git a/testData/ast/assignmentExpression/expression_mult/or.jav b/testData/ast/assignmentExpression/expression/or.jav similarity index 100% rename from testData/ast/assignmentExpression/expression_mult/or.jav rename to testData/ast/assignmentExpression/expression/or.jav diff --git a/testData/ast/assignmentExpression/expression_mult/or.kt b/testData/ast/assignmentExpression/expression/or.kt similarity index 100% rename from testData/ast/assignmentExpression/expression_mult/or.kt rename to testData/ast/assignmentExpression/expression/or.kt diff --git a/testData/ast/assignmentExpression/expression_mult/plusAssign.jav b/testData/ast/assignmentExpression/expression/plusAssign.jav similarity index 100% rename from testData/ast/assignmentExpression/expression_mult/plusAssign.jav rename to testData/ast/assignmentExpression/expression/plusAssign.jav diff --git a/testData/ast/assignmentExpression/expression_mult/plusAssign.kt b/testData/ast/assignmentExpression/expression/plusAssign.kt similarity index 100% rename from testData/ast/assignmentExpression/expression_mult/plusAssign.kt rename to testData/ast/assignmentExpression/expression/plusAssign.kt diff --git a/testData/ast/assignmentExpression/expression_mult/reminder.jav b/testData/ast/assignmentExpression/expression/reminder.jav similarity index 100% rename from testData/ast/assignmentExpression/expression_mult/reminder.jav rename to testData/ast/assignmentExpression/expression/reminder.jav diff --git a/testData/ast/assignmentExpression/expression_mult/reminder.kt b/testData/ast/assignmentExpression/expression/reminder.kt similarity index 100% rename from testData/ast/assignmentExpression/expression_mult/reminder.kt rename to testData/ast/assignmentExpression/expression/reminder.kt diff --git a/testData/ast/assignmentExpression/expression_mult/shiftLeft.jav b/testData/ast/assignmentExpression/expression/shiftLeft.jav similarity index 100% rename from testData/ast/assignmentExpression/expression_mult/shiftLeft.jav rename to testData/ast/assignmentExpression/expression/shiftLeft.jav diff --git a/testData/ast/assignmentExpression/expression_mult/shiftLeft.kt b/testData/ast/assignmentExpression/expression/shiftLeft.kt similarity index 100% rename from testData/ast/assignmentExpression/expression_mult/shiftLeft.kt rename to testData/ast/assignmentExpression/expression/shiftLeft.kt diff --git a/testData/ast/assignmentExpression/expression_mult/shiftRight.jav b/testData/ast/assignmentExpression/expression/shiftRight.jav similarity index 100% rename from testData/ast/assignmentExpression/expression_mult/shiftRight.jav rename to testData/ast/assignmentExpression/expression/shiftRight.jav diff --git a/testData/ast/assignmentExpression/expression_mult/shiftRight.kt b/testData/ast/assignmentExpression/expression/shiftRight.kt similarity index 100% rename from testData/ast/assignmentExpression/expression_mult/shiftRight.kt rename to testData/ast/assignmentExpression/expression/shiftRight.kt diff --git a/testData/ast/assignmentExpression/expression_mult/unsignedRightShift.jav b/testData/ast/assignmentExpression/expression/unsignedRightShift.jav similarity index 100% rename from testData/ast/assignmentExpression/expression_mult/unsignedRightShift.jav rename to testData/ast/assignmentExpression/expression/unsignedRightShift.jav diff --git a/testData/ast/assignmentExpression/expression_mult/unsignedRightShift.kt b/testData/ast/assignmentExpression/expression/unsignedRightShift.kt similarity index 100% rename from testData/ast/assignmentExpression/expression_mult/unsignedRightShift.kt rename to testData/ast/assignmentExpression/expression/unsignedRightShift.kt diff --git a/testData/ast/assignmentExpression/expression_mult/xor.jav b/testData/ast/assignmentExpression/expression/xor.jav similarity index 100% rename from testData/ast/assignmentExpression/expression_mult/xor.jav rename to testData/ast/assignmentExpression/expression/xor.jav diff --git a/testData/ast/assignmentExpression/expression_mult/xor.kt b/testData/ast/assignmentExpression/expression/xor.kt similarity index 100% rename from testData/ast/assignmentExpression/expression_mult/xor.kt rename to testData/ast/assignmentExpression/expression/xor.kt diff --git a/testData/ast/binaryExpression/expression_mult/and.jav b/testData/ast/binaryExpression/expression/and.jav similarity index 100% rename from testData/ast/binaryExpression/expression_mult/and.jav rename to testData/ast/binaryExpression/expression/and.jav diff --git a/testData/ast/binaryExpression/expression_mult/and.kt b/testData/ast/binaryExpression/expression/and.kt similarity index 100% rename from testData/ast/binaryExpression/expression_mult/and.kt rename to testData/ast/binaryExpression/expression/and.kt diff --git a/testData/ast/binaryExpression/expression_mult/conditionalAnd.jav b/testData/ast/binaryExpression/expression/conditionalAnd.jav similarity index 100% rename from testData/ast/binaryExpression/expression_mult/conditionalAnd.jav rename to testData/ast/binaryExpression/expression/conditionalAnd.jav diff --git a/testData/ast/binaryExpression/expression_mult/conditionalAnd.kt b/testData/ast/binaryExpression/expression/conditionalAnd.kt similarity index 100% rename from testData/ast/binaryExpression/expression_mult/conditionalAnd.kt rename to testData/ast/binaryExpression/expression/conditionalAnd.kt diff --git a/testData/ast/binaryExpression/expression_mult/conditionalOr.jav b/testData/ast/binaryExpression/expression/conditionalOr.jav similarity index 100% rename from testData/ast/binaryExpression/expression_mult/conditionalOr.jav rename to testData/ast/binaryExpression/expression/conditionalOr.jav diff --git a/testData/ast/binaryExpression/expression_mult/conditionalOr.kt b/testData/ast/binaryExpression/expression/conditionalOr.kt similarity index 100% rename from testData/ast/binaryExpression/expression_mult/conditionalOr.kt rename to testData/ast/binaryExpression/expression/conditionalOr.kt diff --git a/testData/ast/binaryExpression/expression_mult/divide.jav b/testData/ast/binaryExpression/expression/divide.jav similarity index 100% rename from testData/ast/binaryExpression/expression_mult/divide.jav rename to testData/ast/binaryExpression/expression/divide.jav diff --git a/testData/ast/binaryExpression/expression_mult/divide.kt b/testData/ast/binaryExpression/expression/divide.kt similarity index 100% rename from testData/ast/binaryExpression/expression_mult/divide.kt rename to testData/ast/binaryExpression/expression/divide.kt diff --git a/testData/ast/binaryExpression/expression_mult/greaterThan.jav b/testData/ast/binaryExpression/expression/greaterThan.jav similarity index 100% rename from testData/ast/binaryExpression/expression_mult/greaterThan.jav rename to testData/ast/binaryExpression/expression/greaterThan.jav diff --git a/testData/ast/binaryExpression/expression_mult/greaterThan.kt b/testData/ast/binaryExpression/expression/greaterThan.kt similarity index 100% rename from testData/ast/binaryExpression/expression_mult/greaterThan.kt rename to testData/ast/binaryExpression/expression/greaterThan.kt diff --git a/testData/ast/binaryExpression/expression_mult/greaterThanEqual.jav b/testData/ast/binaryExpression/expression/greaterThanEqual.jav similarity index 100% rename from testData/ast/binaryExpression/expression_mult/greaterThanEqual.jav rename to testData/ast/binaryExpression/expression/greaterThanEqual.jav diff --git a/testData/ast/binaryExpression/expression_mult/greaterThanEqual.kt b/testData/ast/binaryExpression/expression/greaterThanEqual.kt similarity index 100% rename from testData/ast/binaryExpression/expression_mult/greaterThanEqual.kt rename to testData/ast/binaryExpression/expression/greaterThanEqual.kt diff --git a/testData/ast/binaryExpression/expression_mult/lessThan.jav b/testData/ast/binaryExpression/expression/lessThan.jav similarity index 100% rename from testData/ast/binaryExpression/expression_mult/lessThan.jav rename to testData/ast/binaryExpression/expression/lessThan.jav diff --git a/testData/ast/binaryExpression/expression_mult/lessThan.kt b/testData/ast/binaryExpression/expression/lessThan.kt similarity index 100% rename from testData/ast/binaryExpression/expression_mult/lessThan.kt rename to testData/ast/binaryExpression/expression/lessThan.kt diff --git a/testData/ast/binaryExpression/expression_mult/lessThanEqual.jav b/testData/ast/binaryExpression/expression/lessThanEqual.jav similarity index 100% rename from testData/ast/binaryExpression/expression_mult/lessThanEqual.jav rename to testData/ast/binaryExpression/expression/lessThanEqual.jav diff --git a/testData/ast/binaryExpression/expression_mult/lessThanEqual.kt b/testData/ast/binaryExpression/expression/lessThanEqual.kt similarity index 100% rename from testData/ast/binaryExpression/expression_mult/lessThanEqual.kt rename to testData/ast/binaryExpression/expression/lessThanEqual.kt diff --git a/testData/ast/binaryExpression/expression_mult/minus.jav b/testData/ast/binaryExpression/expression/minus.jav similarity index 100% rename from testData/ast/binaryExpression/expression_mult/minus.jav rename to testData/ast/binaryExpression/expression/minus.jav diff --git a/testData/ast/binaryExpression/expression_mult/minus.kt b/testData/ast/binaryExpression/expression/minus.kt similarity index 100% rename from testData/ast/binaryExpression/expression_mult/minus.kt rename to testData/ast/binaryExpression/expression/minus.kt diff --git a/testData/ast/binaryExpression/expression_mult/multiply.jav b/testData/ast/binaryExpression/expression/multiply.jav similarity index 100% rename from testData/ast/binaryExpression/expression_mult/multiply.jav rename to testData/ast/binaryExpression/expression/multiply.jav diff --git a/testData/ast/binaryExpression/expression_mult/multiply.kt b/testData/ast/binaryExpression/expression/multiply.kt similarity index 100% rename from testData/ast/binaryExpression/expression_mult/multiply.kt rename to testData/ast/binaryExpression/expression/multiply.kt diff --git a/testData/ast/binaryExpression/expression_mult/or.jav b/testData/ast/binaryExpression/expression/or.jav similarity index 100% rename from testData/ast/binaryExpression/expression_mult/or.jav rename to testData/ast/binaryExpression/expression/or.jav diff --git a/testData/ast/binaryExpression/expression_mult/or.kt b/testData/ast/binaryExpression/expression/or.kt similarity index 100% rename from testData/ast/binaryExpression/expression_mult/or.kt rename to testData/ast/binaryExpression/expression/or.kt diff --git a/testData/ast/binaryExpression/expression_mult/plus.jav b/testData/ast/binaryExpression/expression/plus.jav similarity index 100% rename from testData/ast/binaryExpression/expression_mult/plus.jav rename to testData/ast/binaryExpression/expression/plus.jav diff --git a/testData/ast/binaryExpression/expression_mult/plus.kt b/testData/ast/binaryExpression/expression/plus.kt similarity index 100% rename from testData/ast/binaryExpression/expression_mult/plus.kt rename to testData/ast/binaryExpression/expression/plus.kt diff --git a/testData/ast/binaryExpression/expression_mult/remainder.jav b/testData/ast/binaryExpression/expression/remainder.jav similarity index 100% rename from testData/ast/binaryExpression/expression_mult/remainder.jav rename to testData/ast/binaryExpression/expression/remainder.jav diff --git a/testData/ast/binaryExpression/expression_mult/remainder.kt b/testData/ast/binaryExpression/expression/remainder.kt similarity index 100% rename from testData/ast/binaryExpression/expression_mult/remainder.kt rename to testData/ast/binaryExpression/expression/remainder.kt diff --git a/testData/ast/binaryExpression/expression_mult/shiftLeft.jav b/testData/ast/binaryExpression/expression/shiftLeft.jav similarity index 100% rename from testData/ast/binaryExpression/expression_mult/shiftLeft.jav rename to testData/ast/binaryExpression/expression/shiftLeft.jav diff --git a/testData/ast/binaryExpression/expression_mult/shiftLeft.kt b/testData/ast/binaryExpression/expression/shiftLeft.kt similarity index 100% rename from testData/ast/binaryExpression/expression_mult/shiftLeft.kt rename to testData/ast/binaryExpression/expression/shiftLeft.kt diff --git a/testData/ast/binaryExpression/expression_mult/shiftRight.jav b/testData/ast/binaryExpression/expression/shiftRight.jav similarity index 100% rename from testData/ast/binaryExpression/expression_mult/shiftRight.jav rename to testData/ast/binaryExpression/expression/shiftRight.jav diff --git a/testData/ast/binaryExpression/expression_mult/shiftRight.kt b/testData/ast/binaryExpression/expression/shiftRight.kt similarity index 100% rename from testData/ast/binaryExpression/expression_mult/shiftRight.kt rename to testData/ast/binaryExpression/expression/shiftRight.kt diff --git a/testData/ast/binaryExpression/expression_mult/unsignedRightShift.jav b/testData/ast/binaryExpression/expression/unsignedRightShift.jav similarity index 100% rename from testData/ast/binaryExpression/expression_mult/unsignedRightShift.jav rename to testData/ast/binaryExpression/expression/unsignedRightShift.jav diff --git a/testData/ast/binaryExpression/expression_mult/unsignedRightShift.kt b/testData/ast/binaryExpression/expression/unsignedRightShift.kt similarity index 100% rename from testData/ast/binaryExpression/expression_mult/unsignedRightShift.kt rename to testData/ast/binaryExpression/expression/unsignedRightShift.kt diff --git a/testData/ast/binaryExpression/expression_mult/xor.jav b/testData/ast/binaryExpression/expression/xor.jav similarity index 100% rename from testData/ast/binaryExpression/expression_mult/xor.jav rename to testData/ast/binaryExpression/expression/xor.jav diff --git a/testData/ast/binaryExpression/expression_mult/xor.kt b/testData/ast/binaryExpression/expression/xor.kt similarity index 100% rename from testData/ast/binaryExpression/expression_mult/xor.kt rename to testData/ast/binaryExpression/expression/xor.kt diff --git a/testData/ast/class_/class/class.jav b/testData/ast/class/class/class.jav similarity index 100% rename from testData/ast/class_/class/class.jav rename to testData/ast/class/class/class.jav diff --git a/testData/ast/class_/class/class.kt b/testData/ast/class/class/class.kt similarity index 100% rename from testData/ast/class_/class/class.kt rename to testData/ast/class/class/class.kt diff --git a/testData/ast/class_/class/emptyClass.jav b/testData/ast/class/class/emptyClass.jav similarity index 100% rename from testData/ast/class_/class/emptyClass.jav rename to testData/ast/class/class/emptyClass.jav diff --git a/testData/ast/class_/class/emptyClass.kt b/testData/ast/class/class/emptyClass.kt similarity index 100% rename from testData/ast/class_/class/emptyClass.kt rename to testData/ast/class/class/emptyClass.kt diff --git a/testData/ast/class_/class/extendsOneClassAndImplementsOneInterface.jav b/testData/ast/class/class/extendsOneClassAndImplementsOneInterface.jav similarity index 100% rename from testData/ast/class_/class/extendsOneClassAndImplementsOneInterface.jav rename to testData/ast/class/class/extendsOneClassAndImplementsOneInterface.jav diff --git a/testData/ast/class_/class/extendsOneClassAndImplementsOneInterface.kt b/testData/ast/class/class/extendsOneClassAndImplementsOneInterface.kt similarity index 100% rename from testData/ast/class_/class/extendsOneClassAndImplementsOneInterface.kt rename to testData/ast/class/class/extendsOneClassAndImplementsOneInterface.kt diff --git a/testData/ast/class_/class/extendsOneClassAndImplementsSeveralInterfaces.jav b/testData/ast/class/class/extendsOneClassAndImplementsSeveralInterfaces.jav similarity index 100% rename from testData/ast/class_/class/extendsOneClassAndImplementsSeveralInterfaces.jav rename to testData/ast/class/class/extendsOneClassAndImplementsSeveralInterfaces.jav diff --git a/testData/ast/class_/class/extendsOneClassAndImplementsSeveralInterfaces.kt b/testData/ast/class/class/extendsOneClassAndImplementsSeveralInterfaces.kt similarity index 100% rename from testData/ast/class_/class/extendsOneClassAndImplementsSeveralInterfaces.kt rename to testData/ast/class/class/extendsOneClassAndImplementsSeveralInterfaces.kt diff --git a/testData/ast/class_/class/finalClass.jav b/testData/ast/class/class/finalClass.jav similarity index 100% rename from testData/ast/class_/class/finalClass.jav rename to testData/ast/class/class/finalClass.jav diff --git a/testData/ast/class_/class/finalClass.kt b/testData/ast/class/class/finalClass.kt similarity index 100% rename from testData/ast/class_/class/finalClass.kt rename to testData/ast/class/class/finalClass.kt diff --git a/testData/ast/class_/class/genericClass.jav b/testData/ast/class/class/genericClass.jav similarity index 100% rename from testData/ast/class_/class/genericClass.jav rename to testData/ast/class/class/genericClass.jav diff --git a/testData/ast/class_/class/genericClass.kt b/testData/ast/class/class/genericClass.kt similarity index 100% rename from testData/ast/class_/class/genericClass.kt rename to testData/ast/class/class/genericClass.kt diff --git a/testData/ast/class_/class/innerEmptyClass.jav b/testData/ast/class/class/innerEmptyClass.jav similarity index 100% rename from testData/ast/class_/class/innerEmptyClass.jav rename to testData/ast/class/class/innerEmptyClass.jav diff --git a/testData/ast/class_/class/innerEmptyClass.kt b/testData/ast/class/class/innerEmptyClass.kt similarity index 100% rename from testData/ast/class_/class/innerEmptyClass.kt rename to testData/ast/class/class/innerEmptyClass.kt diff --git a/testData/ast/class_/class/innerStaticClass.jav b/testData/ast/class/class/innerStaticClass.jav similarity index 100% rename from testData/ast/class_/class/innerStaticClass.jav rename to testData/ast/class/class/innerStaticClass.jav diff --git a/testData/ast/class_/class/innerStaticClass.kt b/testData/ast/class/class/innerStaticClass.kt similarity index 100% rename from testData/ast/class_/class/innerStaticClass.kt rename to testData/ast/class/class/innerStaticClass.kt diff --git a/testData/ast/class_/class/internalClass.jav b/testData/ast/class/class/internalClass.jav similarity index 100% rename from testData/ast/class_/class/internalClass.jav rename to testData/ast/class/class/internalClass.jav diff --git a/testData/ast/class_/class/internalClass.kt b/testData/ast/class/class/internalClass.kt similarity index 100% rename from testData/ast/class_/class/internalClass.kt rename to testData/ast/class/class/internalClass.kt diff --git a/testData/ast/class_/class/oneStaticFieldOneNonStatic.jav b/testData/ast/class/class/oneStaticFieldOneNonStatic.jav similarity index 100% rename from testData/ast/class_/class/oneStaticFieldOneNonStatic.jav rename to testData/ast/class/class/oneStaticFieldOneNonStatic.jav diff --git a/testData/ast/class_/class/oneStaticFieldOneNonStatic.kt b/testData/ast/class/class/oneStaticFieldOneNonStatic.kt similarity index 100% rename from testData/ast/class_/class/oneStaticFieldOneNonStatic.kt rename to testData/ast/class/class/oneStaticFieldOneNonStatic.kt diff --git a/testData/ast/class_/class/oneStaticMethod.jav b/testData/ast/class/class/oneStaticMethod.jav similarity index 100% rename from testData/ast/class_/class/oneStaticMethod.jav rename to testData/ast/class/class/oneStaticMethod.jav diff --git a/testData/ast/class_/class/oneStaticMethod.kt b/testData/ast/class/class/oneStaticMethod.kt similarity index 100% rename from testData/ast/class_/class/oneStaticMethod.kt rename to testData/ast/class/class/oneStaticMethod.kt diff --git a/testData/ast/class_/class/oneStaticMethodOneNonStatic.jav b/testData/ast/class/class/oneStaticMethodOneNonStatic.jav similarity index 100% rename from testData/ast/class_/class/oneStaticMethodOneNonStatic.jav rename to testData/ast/class/class/oneStaticMethodOneNonStatic.jav diff --git a/testData/ast/class_/class/oneStaticMethodOneNonStatic.kt b/testData/ast/class/class/oneStaticMethodOneNonStatic.kt similarity index 100% rename from testData/ast/class_/class/oneStaticMethodOneNonStatic.kt rename to testData/ast/class/class/oneStaticMethodOneNonStatic.kt diff --git a/testData/ast/class_/class/pivateClass.jav b/testData/ast/class/class/pivateClass.jav similarity index 100% rename from testData/ast/class_/class/pivateClass.jav rename to testData/ast/class/class/pivateClass.jav diff --git a/testData/ast/class_/class/pivateClass.kt b/testData/ast/class/class/pivateClass.kt similarity index 100% rename from testData/ast/class_/class/pivateClass.kt rename to testData/ast/class/class/pivateClass.kt diff --git a/testData/ast/class_/class/protectedClass.jav b/testData/ast/class/class/protectedClass.jav similarity index 100% rename from testData/ast/class_/class/protectedClass.jav rename to testData/ast/class/class/protectedClass.jav diff --git a/testData/ast/class_/class/protectedClass.kt b/testData/ast/class/class/protectedClass.kt similarity index 100% rename from testData/ast/class_/class/protectedClass.kt rename to testData/ast/class/class/protectedClass.kt diff --git a/testData/ast/class_/class/publicClass.jav b/testData/ast/class/class/publicClass.jav similarity index 100% rename from testData/ast/class_/class/publicClass.jav rename to testData/ast/class/class/publicClass.jav diff --git a/testData/ast/class_/class/publicClass.kt b/testData/ast/class/class/publicClass.kt similarity index 100% rename from testData/ast/class_/class/publicClass.kt rename to testData/ast/class/class/publicClass.kt diff --git a/testData/ast/class_/class/simpleInheritance.jav b/testData/ast/class/class/simpleInheritance.jav similarity index 100% rename from testData/ast/class_/class/simpleInheritance.jav rename to testData/ast/class/class/simpleInheritance.jav diff --git a/testData/ast/class_/class/simpleInheritance.kt b/testData/ast/class/class/simpleInheritance.kt similarity index 100% rename from testData/ast/class_/class/simpleInheritance.kt rename to testData/ast/class/class/simpleInheritance.kt diff --git a/testData/ast/class_/class/twoStaticMethod.jav b/testData/ast/class/class/twoStaticMethod.jav similarity index 100% rename from testData/ast/class_/class/twoStaticMethod.jav rename to testData/ast/class/class/twoStaticMethod.jav diff --git a/testData/ast/class_/class/twoStaticMethod.kt b/testData/ast/class/class/twoStaticMethod.kt similarity index 100% rename from testData/ast/class_/class/twoStaticMethod.kt rename to testData/ast/class/class/twoStaticMethod.kt diff --git a/testData/ast/class_/class_mult/classWithEmptyMethods.jav b/testData/ast/class/class_mult/classWithEmptyMethods.jav similarity index 100% rename from testData/ast/class_/class_mult/classWithEmptyMethods.jav rename to testData/ast/class/class_mult/classWithEmptyMethods.jav diff --git a/testData/ast/class_/class_mult/classWithEmptyMethods.kt b/testData/ast/class/class_mult/classWithEmptyMethods.kt similarity index 100% rename from testData/ast/class_/class_mult/classWithEmptyMethods.kt rename to testData/ast/class/class_mult/classWithEmptyMethods.kt diff --git a/testData/ast/class_/class_mult/classWithFields.jav b/testData/ast/class/class_mult/classWithFields.jav similarity index 100% rename from testData/ast/class_/class_mult/classWithFields.jav rename to testData/ast/class/class_mult/classWithFields.jav diff --git a/testData/ast/class_/class_mult/classWithFields.kt b/testData/ast/class/class_mult/classWithFields.kt similarity index 100% rename from testData/ast/class_/class_mult/classWithFields.kt rename to testData/ast/class/class_mult/classWithFields.kt diff --git a/testData/ast/class_/class_mult/classWithMultiplyFields.jav b/testData/ast/class/class_mult/classWithMultiplyFields.jav similarity index 100% rename from testData/ast/class_/class_mult/classWithMultiplyFields.jav rename to testData/ast/class/class_mult/classWithMultiplyFields.jav diff --git a/testData/ast/class_/class_mult/classWithMultiplyFields.kt b/testData/ast/class/class_mult/classWithMultiplyFields.kt similarity index 100% rename from testData/ast/class_/class_mult/classWithMultiplyFields.kt rename to testData/ast/class/class_mult/classWithMultiplyFields.kt diff --git a/testData/ast/conditionalExpression/expression_mult/simpleConditionalExpression.jav b/testData/ast/conditionalExpression/expression/simpleConditionalExpression.jav similarity index 100% rename from testData/ast/conditionalExpression/expression_mult/simpleConditionalExpression.jav rename to testData/ast/conditionalExpression/expression/simpleConditionalExpression.jav diff --git a/testData/ast/conditionalExpression/expression_mult/simpleConditionalExpression.kt b/testData/ast/conditionalExpression/expression/simpleConditionalExpression.kt similarity index 100% rename from testData/ast/conditionalExpression/expression_mult/simpleConditionalExpression.kt rename to testData/ast/conditionalExpression/expression/simpleConditionalExpression.kt diff --git a/testData/ast/file_/file/packageWithClass.jav b/testData/ast/file/file/packageWithClass.jav similarity index 100% rename from testData/ast/file_/file/packageWithClass.jav rename to testData/ast/file/file/packageWithClass.jav diff --git a/testData/ast/file_/file/packageWithClass.kt b/testData/ast/file/file/packageWithClass.kt similarity index 100% rename from testData/ast/file_/file/packageWithClass.kt rename to testData/ast/file/file/packageWithClass.kt diff --git a/testData/ast/file_/file/packageWithClasses.jav b/testData/ast/file/file/packageWithClasses.jav similarity index 100% rename from testData/ast/file_/file/packageWithClasses.jav rename to testData/ast/file/file/packageWithClasses.jav diff --git a/testData/ast/file_/file/packageWithClasses.kt b/testData/ast/file/file/packageWithClasses.kt similarity index 100% rename from testData/ast/file_/file/packageWithClasses.kt rename to testData/ast/file/file/packageWithClasses.kt diff --git a/testData/ast/file_/file/packageWithOpenClass.jav b/testData/ast/file/file/packageWithOpenClass.jav similarity index 100% rename from testData/ast/file_/file/packageWithOpenClass.jav rename to testData/ast/file/file/packageWithOpenClass.jav diff --git a/testData/ast/file_/file/packageWithOpenClass.kt b/testData/ast/file/file/packageWithOpenClass.kt similarity index 100% rename from testData/ast/file_/file/packageWithOpenClass.kt rename to testData/ast/file/file/packageWithOpenClass.kt diff --git a/testData/ast/file_/file_mult/packageWithImports.jav b/testData/ast/file/file_mult/packageWithImports.jav similarity index 100% rename from testData/ast/file_/file_mult/packageWithImports.jav rename to testData/ast/file/file_mult/packageWithImports.jav diff --git a/testData/ast/file_/file_mult/packageWithImports.kt b/testData/ast/file/file_mult/packageWithImports.kt similarity index 100% rename from testData/ast/file_/file_mult/packageWithImports.kt rename to testData/ast/file/file_mult/packageWithImports.kt diff --git a/testData/ast/file_/file_mult/packageWithMixedImports.jav b/testData/ast/file/file_mult/packageWithMixedImports.jav similarity index 100% rename from testData/ast/file_/file_mult/packageWithMixedImports.jav rename to testData/ast/file/file_mult/packageWithMixedImports.jav diff --git a/testData/ast/file_/file_mult/packageWithMixedImports.kt b/testData/ast/file/file_mult/packageWithMixedImports.kt similarity index 100% rename from testData/ast/file_/file_mult/packageWithMixedImports.kt rename to testData/ast/file/file_mult/packageWithMixedImports.kt diff --git a/testData/ast/file_/file_mult/packageWithStaticImports.jav b/testData/ast/file/file_mult/packageWithStaticImports.jav similarity index 100% rename from testData/ast/file_/file_mult/packageWithStaticImports.jav rename to testData/ast/file/file_mult/packageWithStaticImports.jav diff --git a/testData/ast/file_/file_mult/packageWithStaticImports.kt b/testData/ast/file/file_mult/packageWithStaticImports.kt similarity index 100% rename from testData/ast/file_/file_mult/packageWithStaticImports.kt rename to testData/ast/file/file_mult/packageWithStaticImports.kt diff --git a/testData/ast/isOperator/expression_mult/complicatedExpression.jav b/testData/ast/isOperator/expression/complicatedExpression.jav similarity index 100% rename from testData/ast/isOperator/expression_mult/complicatedExpression.jav rename to testData/ast/isOperator/expression/complicatedExpression.jav diff --git a/testData/ast/isOperator/expression_mult/complicatedExpression.kt b/testData/ast/isOperator/expression/complicatedExpression.kt similarity index 100% rename from testData/ast/isOperator/expression_mult/complicatedExpression.kt rename to testData/ast/isOperator/expression/complicatedExpression.kt diff --git a/testData/ast/isOperator/expression_mult/simpleReference.jav b/testData/ast/isOperator/expression/simpleReference.jav similarity index 100% rename from testData/ast/isOperator/expression_mult/simpleReference.jav rename to testData/ast/isOperator/expression/simpleReference.jav diff --git a/testData/ast/isOperator/expression_mult/simpleReference.kt b/testData/ast/isOperator/expression/simpleReference.kt similarity index 100% rename from testData/ast/isOperator/expression_mult/simpleReference.kt rename to testData/ast/isOperator/expression/simpleReference.kt diff --git a/testData/ast/polyadicExpression/expression_mult/divide.jav b/testData/ast/polyadicExpression/expression/divide.jav similarity index 100% rename from testData/ast/polyadicExpression/expression_mult/divide.jav rename to testData/ast/polyadicExpression/expression/divide.jav diff --git a/testData/ast/polyadicExpression/expression_mult/divide.kt b/testData/ast/polyadicExpression/expression/divide.kt similarity index 100% rename from testData/ast/polyadicExpression/expression_mult/divide.kt rename to testData/ast/polyadicExpression/expression/divide.kt diff --git a/testData/ast/polyadicExpression/expression_mult/minus.jav b/testData/ast/polyadicExpression/expression/minus.jav similarity index 100% rename from testData/ast/polyadicExpression/expression_mult/minus.jav rename to testData/ast/polyadicExpression/expression/minus.jav diff --git a/testData/ast/polyadicExpression/expression_mult/minus.kt b/testData/ast/polyadicExpression/expression/minus.kt similarity index 100% rename from testData/ast/polyadicExpression/expression_mult/minus.kt rename to testData/ast/polyadicExpression/expression/minus.kt diff --git a/testData/ast/polyadicExpression/expression_mult/multiply.jav b/testData/ast/polyadicExpression/expression/multiply.jav similarity index 100% rename from testData/ast/polyadicExpression/expression_mult/multiply.jav rename to testData/ast/polyadicExpression/expression/multiply.jav diff --git a/testData/ast/polyadicExpression/expression_mult/multiply.kt b/testData/ast/polyadicExpression/expression/multiply.kt similarity index 100% rename from testData/ast/polyadicExpression/expression_mult/multiply.kt rename to testData/ast/polyadicExpression/expression/multiply.kt diff --git a/testData/ast/polyadicExpression/expression_mult/plus.jav b/testData/ast/polyadicExpression/expression/plus.jav similarity index 100% rename from testData/ast/polyadicExpression/expression_mult/plus.jav rename to testData/ast/polyadicExpression/expression/plus.jav diff --git a/testData/ast/polyadicExpression/expression_mult/plus.kt b/testData/ast/polyadicExpression/expression/plus.kt similarity index 100% rename from testData/ast/polyadicExpression/expression_mult/plus.kt rename to testData/ast/polyadicExpression/expression/plus.kt diff --git a/testData/ast/polyadicExpression/expression_mult/remainder.jav b/testData/ast/polyadicExpression/expression/remainder.jav similarity index 100% rename from testData/ast/polyadicExpression/expression_mult/remainder.jav rename to testData/ast/polyadicExpression/expression/remainder.jav diff --git a/testData/ast/polyadicExpression/expression_mult/remainder.kt b/testData/ast/polyadicExpression/expression/remainder.kt similarity index 100% rename from testData/ast/polyadicExpression/expression_mult/remainder.kt rename to testData/ast/polyadicExpression/expression/remainder.kt diff --git a/testData/ast/typeCastExpression/expression_mult/extendsWildcardCast.jav b/testData/ast/typeCastExpression/expression/extendsWildcardCast.jav similarity index 100% rename from testData/ast/typeCastExpression/expression_mult/extendsWildcardCast.jav rename to testData/ast/typeCastExpression/expression/extendsWildcardCast.jav diff --git a/testData/ast/typeCastExpression/expression_mult/extendsWildcardCast.kt b/testData/ast/typeCastExpression/expression/extendsWildcardCast.kt similarity index 100% rename from testData/ast/typeCastExpression/expression_mult/extendsWildcardCast.kt rename to testData/ast/typeCastExpression/expression/extendsWildcardCast.kt diff --git a/testData/ast/typeCastExpression/expression_mult/fooCast.jav b/testData/ast/typeCastExpression/expression/fooCast.jav similarity index 100% rename from testData/ast/typeCastExpression/expression_mult/fooCast.jav rename to testData/ast/typeCastExpression/expression/fooCast.jav diff --git a/testData/ast/typeCastExpression/expression_mult/fooCast.kt b/testData/ast/typeCastExpression/expression/fooCast.kt similarity index 100% rename from testData/ast/typeCastExpression/expression_mult/fooCast.kt rename to testData/ast/typeCastExpression/expression/fooCast.kt diff --git a/testData/ast/typeCastExpression/expression_mult/intCast.jav b/testData/ast/typeCastExpression/expression/intCast.jav similarity index 100% rename from testData/ast/typeCastExpression/expression_mult/intCast.jav rename to testData/ast/typeCastExpression/expression/intCast.jav diff --git a/testData/ast/typeCastExpression/expression_mult/intCast.kt b/testData/ast/typeCastExpression/expression/intCast.kt similarity index 100% rename from testData/ast/typeCastExpression/expression_mult/intCast.kt rename to testData/ast/typeCastExpression/expression/intCast.kt diff --git a/testData/ast/typeCastExpression/expression_mult/primitiveType.jav b/testData/ast/typeCastExpression/expression/primitiveType.jav similarity index 100% rename from testData/ast/typeCastExpression/expression_mult/primitiveType.jav rename to testData/ast/typeCastExpression/expression/primitiveType.jav diff --git a/testData/ast/typeCastExpression/expression_mult/primitiveType.kt b/testData/ast/typeCastExpression/expression/primitiveType.kt similarity index 100% rename from testData/ast/typeCastExpression/expression_mult/primitiveType.kt rename to testData/ast/typeCastExpression/expression/primitiveType.kt diff --git a/testData/ast/typeCastExpression/expression_mult/simpleGenericCast.jav b/testData/ast/typeCastExpression/expression/simpleGenericCast.jav similarity index 100% rename from testData/ast/typeCastExpression/expression_mult/simpleGenericCast.jav rename to testData/ast/typeCastExpression/expression/simpleGenericCast.jav diff --git a/testData/ast/typeCastExpression/expression_mult/simpleGenericCast.kt b/testData/ast/typeCastExpression/expression/simpleGenericCast.kt similarity index 100% rename from testData/ast/typeCastExpression/expression_mult/simpleGenericCast.kt rename to testData/ast/typeCastExpression/expression/simpleGenericCast.kt diff --git a/testData/ast/typeCastExpression/expression_mult/stringCast.jav b/testData/ast/typeCastExpression/expression/stringCast.jav similarity index 100% rename from testData/ast/typeCastExpression/expression_mult/stringCast.jav rename to testData/ast/typeCastExpression/expression/stringCast.jav diff --git a/testData/ast/typeCastExpression/expression_mult/stringCast.kt b/testData/ast/typeCastExpression/expression/stringCast.kt similarity index 100% rename from testData/ast/typeCastExpression/expression_mult/stringCast.kt rename to testData/ast/typeCastExpression/expression/stringCast.kt diff --git a/testData/ast/typeCastExpression/expression_mult/superWildcardCast.jav b/testData/ast/typeCastExpression/expression/superWildcardCast.jav similarity index 100% rename from testData/ast/typeCastExpression/expression_mult/superWildcardCast.jav rename to testData/ast/typeCastExpression/expression/superWildcardCast.jav diff --git a/testData/ast/typeCastExpression/expression_mult/superWildcardCast.kt b/testData/ast/typeCastExpression/expression/superWildcardCast.kt similarity index 100% rename from testData/ast/typeCastExpression/expression_mult/superWildcardCast.kt rename to testData/ast/typeCastExpression/expression/superWildcardCast.kt diff --git a/testData/ast/typeCastExpression/expression_mult/wildcardCast.jav b/testData/ast/typeCastExpression/expression/wildcardCast.jav similarity index 100% rename from testData/ast/typeCastExpression/expression_mult/wildcardCast.jav rename to testData/ast/typeCastExpression/expression/wildcardCast.jav diff --git a/testData/ast/typeCastExpression/expression_mult/wildcardCast.kt b/testData/ast/typeCastExpression/expression/wildcardCast.kt similarity index 100% rename from testData/ast/typeCastExpression/expression_mult/wildcardCast.kt rename to testData/ast/typeCastExpression/expression/wildcardCast.kt From 58e8aa8fbb4d8760e567d0c862a700a67ce2fd10 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 7 Nov 2011 13:11:33 +0400 Subject: [PATCH 061/206] file_mult avoided --- remove.sh | 3 +++ rename.sh | 3 +++ .../jetbrains/jet/j2k/JavaToKotlinConverterTest.java | 10 ++++------ testData/ast/file/file/packageWithClass.kt | 5 ++++- testData/ast/file/file/packageWithClasses.kt | 7 ++++++- .../file/{file_mult => file}/packageWithImports.jav | 0 .../file/{file_mult => file}/packageWithImports.kt | 0 .../{file_mult => file}/packageWithMixedImports.jav | 0 .../{file_mult => file}/packageWithMixedImports.kt | 0 testData/ast/file/file/packageWithOpenClass.kt | 5 ++++- .../{file_mult => file}/packageWithStaticImports.jav | 0 .../{file_mult => file}/packageWithStaticImports.kt | 0 testData/ast/function/file/override.kt | 11 ++++++++++- 13 files changed, 34 insertions(+), 10 deletions(-) create mode 100755 remove.sh create mode 100755 rename.sh rename testData/ast/file/{file_mult => file}/packageWithImports.jav (100%) rename testData/ast/file/{file_mult => file}/packageWithImports.kt (100%) rename testData/ast/file/{file_mult => file}/packageWithMixedImports.jav (100%) rename testData/ast/file/{file_mult => file}/packageWithMixedImports.kt (100%) rename testData/ast/file/{file_mult => file}/packageWithStaticImports.jav (100%) rename testData/ast/file/{file_mult => file}/packageWithStaticImports.kt (100%) diff --git a/remove.sh b/remove.sh new file mode 100755 index 00000000000..2b067d09bc6 --- /dev/null +++ b/remove.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +rm `find "testData" -name "*.kt.tmp"` diff --git a/rename.sh b/rename.sh new file mode 100755 index 00000000000..e131fdc40c6 --- /dev/null +++ b/rename.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +rename -f s/.kt.tmp/.kt/ `find "testData" -name "*.kt.tmp"` diff --git a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java index e7a536f9dde..8906c793fec 100644 --- a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java +++ b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java @@ -13,6 +13,7 @@ import java.io.File; import java.io.IOException; import static org.apache.commons.io.FileUtils.readFileToString; +import static org.apache.commons.io.FileUtils.writeStringToFile; import static org.jetbrains.jet.j2k.TestCaseBuilder.getTestDataPathBase; /** @@ -48,10 +49,11 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { else if (javaFile.getParent().endsWith("/class")) actual = classToSingleLineKotlin(javaCode); else if (javaFile.getParent().endsWith("/class_mult")) actual = classToKotlin(javaCode); - else if (javaFile.getParent().endsWith("/file")) actual = fileToSingleLineKotlin(javaCode); - else if (javaFile.getParent().endsWith("/file_mult")) actual = fileToKotlin(javaCode); + else if (javaFile.getParent().endsWith("/file")) actual = fileToKotlin(javaCode); assert !actual.equals(""); + if (!expected.equals(actual)) + writeStringToFile(new File(kotlinPath + ".tmp"), actual); Assert.assertEquals(expected, actual); } @@ -99,10 +101,6 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { return prettify(Converter.fileToFile((PsiJavaFile) myFile).toKotlin()); } - protected String fileToSingleLineKotlin(String text) throws IOException { - return toSingleLine(fileToKotlin(text)); - } - @NotNull protected String classToKotlin(String text) throws IOException { configureFromText(text); diff --git a/testData/ast/file/file/packageWithClass.kt b/testData/ast/file/file/packageWithClass.kt index 399e3faa127..f08440c2d5d 100644 --- a/testData/ast/file/file/packageWithClass.kt +++ b/testData/ast/file/file/packageWithClass.kt @@ -1 +1,4 @@ -namespace test { class C { } } \ No newline at end of file +namespace test { +class C { +} +} \ No newline at end of file diff --git a/testData/ast/file/file/packageWithClasses.kt b/testData/ast/file/file/packageWithClasses.kt index b5c20e59452..c57933a501a 100644 --- a/testData/ast/file/file/packageWithClasses.kt +++ b/testData/ast/file/file/packageWithClasses.kt @@ -1 +1,6 @@ -namespace { class A { } class B { } } \ No newline at end of file +namespace { +class A { +} +class B { +} +} \ No newline at end of file diff --git a/testData/ast/file/file_mult/packageWithImports.jav b/testData/ast/file/file/packageWithImports.jav similarity index 100% rename from testData/ast/file/file_mult/packageWithImports.jav rename to testData/ast/file/file/packageWithImports.jav diff --git a/testData/ast/file/file_mult/packageWithImports.kt b/testData/ast/file/file/packageWithImports.kt similarity index 100% rename from testData/ast/file/file_mult/packageWithImports.kt rename to testData/ast/file/file/packageWithImports.kt diff --git a/testData/ast/file/file_mult/packageWithMixedImports.jav b/testData/ast/file/file/packageWithMixedImports.jav similarity index 100% rename from testData/ast/file/file_mult/packageWithMixedImports.jav rename to testData/ast/file/file/packageWithMixedImports.jav diff --git a/testData/ast/file/file_mult/packageWithMixedImports.kt b/testData/ast/file/file/packageWithMixedImports.kt similarity index 100% rename from testData/ast/file/file_mult/packageWithMixedImports.kt rename to testData/ast/file/file/packageWithMixedImports.kt diff --git a/testData/ast/file/file/packageWithOpenClass.kt b/testData/ast/file/file/packageWithOpenClass.kt index 3b7f5a190e6..17aa91ce5cb 100644 --- a/testData/ast/file/file/packageWithOpenClass.kt +++ b/testData/ast/file/file/packageWithOpenClass.kt @@ -1 +1,4 @@ -namespace test { open class C { } } \ No newline at end of file +namespace test { +open class C { +} +} \ No newline at end of file diff --git a/testData/ast/file/file_mult/packageWithStaticImports.jav b/testData/ast/file/file/packageWithStaticImports.jav similarity index 100% rename from testData/ast/file/file_mult/packageWithStaticImports.jav rename to testData/ast/file/file/packageWithStaticImports.jav diff --git a/testData/ast/file/file_mult/packageWithStaticImports.kt b/testData/ast/file/file/packageWithStaticImports.kt similarity index 100% rename from testData/ast/file/file_mult/packageWithStaticImports.kt rename to testData/ast/file/file/packageWithStaticImports.kt diff --git a/testData/ast/function/file/override.kt b/testData/ast/function/file/override.kt index 0d941e24a2d..706b160fda9 100644 --- a/testData/ast/function/file/override.kt +++ b/testData/ast/function/file/override.kt @@ -1 +1,10 @@ -namespace { open class A { fun a() : Unit { } } class B : A { override fun a() : Unit { } } } \ No newline at end of file +namespace { +open class A { +fun a() : Unit { +} +} +class B : A { +override fun a() : Unit { +} +} +} \ No newline at end of file From c9c153cd72bb2e193fc35fa679e5cbba55968351 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 7 Nov 2011 13:18:50 +0400 Subject: [PATCH 062/206] class_mult avoided --- .../jet/j2k/JavaToKotlinConverterTest.java | 23 ++++++++----------- testData/ast/class/class/class.kt | 3 ++- .../classWithEmptyMethods.jav | 0 .../classWithEmptyMethods.kt | 0 .../{class_mult => class}/classWithFields.jav | 0 .../{class_mult => class}/classWithFields.kt | 0 .../classWithMultiplyFields.jav | 0 .../classWithMultiplyFields.kt | 0 testData/ast/class/class/emptyClass.kt | 3 ++- ...xtendsOneClassAndImplementsOneInterface.kt | 3 ++- ...sOneClassAndImplementsSeveralInterfaces.kt | 3 ++- testData/ast/class/class/finalClass.kt | 3 ++- testData/ast/class/class/genericClass.kt | 3 ++- testData/ast/class/class/innerEmptyClass.kt | 5 +++- testData/ast/class/class/innerStaticClass.kt | 7 +++++- testData/ast/class/class/internalClass.kt | 3 ++- .../class/class/oneStaticFieldOneNonStatic.kt | 9 +++++++- testData/ast/class/class/oneStaticMethod.kt | 8 ++++++- .../class/oneStaticMethodOneNonStatic.kt | 11 ++++++++- testData/ast/class/class/pivateClass.kt | 3 ++- testData/ast/class/class/protectedClass.kt | 3 ++- testData/ast/class/class/publicClass.kt | 3 ++- testData/ast/class/class/simpleInheritance.kt | 3 ++- testData/ast/class/class/twoStaticMethod.kt | 11 ++++++++- testData/ast/enum/class/emptyEnum.kt | 3 ++- .../enum/class/enumImplementsOneInterface.kt | 3 ++- .../class/enumImplementsSeveralInterfaces.kt | 3 ++- .../enumWithNameField.jav | 0 .../enumWithNameField.kt | 0 .../fieldsWithPrimaryPrivateConstructor.jav | 0 .../fieldsWithPrimaryPrivateConstructor.kt | 0 testData/ast/enum/class/internalEnum.kt | 3 ++- .../overrideToString.jav | 0 .../{class_mult => class}/overrideToString.kt | 0 testData/ast/enum/class/privateEnum.kt | 3 ++- testData/ast/enum/class/protectedEnum.kt | 3 ++- testData/ast/enum/class/publicEnum.kt | 3 ++- .../runnableImplementation.jav | 0 .../runnableImplementation.kt | 0 .../{class_mult => class}/typeSafeEnum.jav | 0 .../{class_mult => class}/typeSafeEnum.kt | 0 testData/ast/trait/class/emptyInterface.kt | 3 ++- ...sOneClassAndImplementsSeveralInterfaces.kt | 3 ++- .../ast/trait/class/extendsOneInterface.kt | 3 ++- .../interfaceWithFields.jav | 0 .../interfaceWithFields.kt | 0 .../interfaceWithMethodDeclaration.jav | 0 .../interfaceWithMethodDeclaration.kt | 0 .../interfaceWithStaticFields.jav | 0 .../interfaceWithStaticFields.kt | 0 testData/ast/trait/class/internalInterface.kt | 3 ++- testData/ast/trait/class/privateInterface.kt | 3 ++- .../ast/trait/class/protectedInterface.kt | 3 ++- testData/ast/trait/class/publicInterface.kt | 3 ++- ...rametrizationWithTwoBoundsWithExtending.kt | 3 ++- .../classParametrizationWithTwoBounds.kt | 3 ++- ...rametrizationWithTwoBoundsWithExtending.kt | 3 ++- .../class/complexExampleWithClassExtending.kt | 3 ++- ...omplexExampleWithClassMultiplyExtending.kt | 3 ++- .../ast/typeParameters/class/genericClass.kt | 3 ++- ...rametrizationWithTwoBoundsWithExtending.kt | 3 ++- 61 files changed, 119 insertions(+), 51 deletions(-) rename testData/ast/class/{class_mult => class}/classWithEmptyMethods.jav (100%) rename testData/ast/class/{class_mult => class}/classWithEmptyMethods.kt (100%) rename testData/ast/class/{class_mult => class}/classWithFields.jav (100%) rename testData/ast/class/{class_mult => class}/classWithFields.kt (100%) rename testData/ast/class/{class_mult => class}/classWithMultiplyFields.jav (100%) rename testData/ast/class/{class_mult => class}/classWithMultiplyFields.kt (100%) rename testData/ast/enum/{class_mult => class}/enumWithNameField.jav (100%) rename testData/ast/enum/{class_mult => class}/enumWithNameField.kt (100%) rename testData/ast/enum/{class_mult => class}/fieldsWithPrimaryPrivateConstructor.jav (100%) rename testData/ast/enum/{class_mult => class}/fieldsWithPrimaryPrivateConstructor.kt (100%) rename testData/ast/enum/{class_mult => class}/overrideToString.jav (100%) rename testData/ast/enum/{class_mult => class}/overrideToString.kt (100%) rename testData/ast/enum/{class_mult => class}/runnableImplementation.jav (100%) rename testData/ast/enum/{class_mult => class}/runnableImplementation.kt (100%) rename testData/ast/enum/{class_mult => class}/typeSafeEnum.jav (100%) rename testData/ast/enum/{class_mult => class}/typeSafeEnum.kt (100%) rename testData/ast/trait/{class_mult => class}/interfaceWithFields.jav (100%) rename testData/ast/trait/{class_mult => class}/interfaceWithFields.kt (100%) rename testData/ast/trait/{class_mult => class}/interfaceWithMethodDeclaration.jav (100%) rename testData/ast/trait/{class_mult => class}/interfaceWithMethodDeclaration.kt (100%) rename testData/ast/trait/{class_mult => class}/interfaceWithStaticFields.jav (100%) rename testData/ast/trait/{class_mult => class}/interfaceWithStaticFields.kt (100%) diff --git a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java index 8906c793fec..1741520cb27 100644 --- a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java +++ b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java @@ -46,8 +46,7 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { else if (javaFile.getParent().endsWith("/method")) actual = methodToSingleLineKotlin(javaCode); else if (javaFile.getParent().endsWith("/method_mult")) actual = methodToKotlin(javaCode); - else if (javaFile.getParent().endsWith("/class")) actual = classToSingleLineKotlin(javaCode); - else if (javaFile.getParent().endsWith("/class_mult")) actual = classToKotlin(javaCode); + else if (javaFile.getParent().endsWith("/class")) actual = classToKotlin(javaCode); else if (javaFile.getParent().endsWith("/file")) actual = fileToKotlin(javaCode); @@ -112,11 +111,15 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { return prettify(result); } - @NotNull - protected String classToSingleLineKotlin(String text) throws IOException { - return toSingleLine(classToKotlin(text)); + protected String methodToSingleLineKotlin(String text) throws IOException { + return toSingleLine(methodToKotlin(text)); } + protected String statementToSingleLineKotlin(String code) throws Exception { + return toSingleLine(statementToKotlin(code)); + } + + @NotNull protected String methodToKotlin(String text) throws IOException { String result = classToKotlin("final class C {" + text + "}") .replaceAll("class C \\{", ""); @@ -124,10 +127,7 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { return prettify(result); } - protected String methodToSingleLineKotlin(String text) throws IOException { - return toSingleLine(methodToKotlin(text)); - } - + @NotNull protected String statementToKotlin(String text) throws Exception { String result = methodToKotlin("void main() {" + text + "}"); int pos = result.lastIndexOf("}"); @@ -135,10 +135,7 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { return prettify(result); } - protected String statementToSingleLineKotlin(String code) throws Exception { - return toSingleLine(statementToKotlin(code)); - } - + @NotNull protected String expressionToKotlin(String code) throws Exception { String result = statementToKotlin("Object o =" + code + "}"); result = result.replaceFirst("var o : Any\\? =", ""); diff --git a/testData/ast/class/class/class.kt b/testData/ast/class/class/class.kt index 503cbe46e7f..23873d0aaa3 100644 --- a/testData/ast/class/class/class.kt +++ b/testData/ast/class/class/class.kt @@ -1 +1,2 @@ -open class Test { } \ No newline at end of file +open class Test { +} \ No newline at end of file diff --git a/testData/ast/class/class_mult/classWithEmptyMethods.jav b/testData/ast/class/class/classWithEmptyMethods.jav similarity index 100% rename from testData/ast/class/class_mult/classWithEmptyMethods.jav rename to testData/ast/class/class/classWithEmptyMethods.jav diff --git a/testData/ast/class/class_mult/classWithEmptyMethods.kt b/testData/ast/class/class/classWithEmptyMethods.kt similarity index 100% rename from testData/ast/class/class_mult/classWithEmptyMethods.kt rename to testData/ast/class/class/classWithEmptyMethods.kt diff --git a/testData/ast/class/class_mult/classWithFields.jav b/testData/ast/class/class/classWithFields.jav similarity index 100% rename from testData/ast/class/class_mult/classWithFields.jav rename to testData/ast/class/class/classWithFields.jav diff --git a/testData/ast/class/class_mult/classWithFields.kt b/testData/ast/class/class/classWithFields.kt similarity index 100% rename from testData/ast/class/class_mult/classWithFields.kt rename to testData/ast/class/class/classWithFields.kt diff --git a/testData/ast/class/class_mult/classWithMultiplyFields.jav b/testData/ast/class/class/classWithMultiplyFields.jav similarity index 100% rename from testData/ast/class/class_mult/classWithMultiplyFields.jav rename to testData/ast/class/class/classWithMultiplyFields.jav diff --git a/testData/ast/class/class_mult/classWithMultiplyFields.kt b/testData/ast/class/class/classWithMultiplyFields.kt similarity index 100% rename from testData/ast/class/class_mult/classWithMultiplyFields.kt rename to testData/ast/class/class/classWithMultiplyFields.kt diff --git a/testData/ast/class/class/emptyClass.kt b/testData/ast/class/class/emptyClass.kt index 0e9ef9e73c2..a7ca22abab4 100644 --- a/testData/ast/class/class/emptyClass.kt +++ b/testData/ast/class/class/emptyClass.kt @@ -1 +1,2 @@ -class A { } \ No newline at end of file +class A { +} \ No newline at end of file diff --git a/testData/ast/class/class/extendsOneClassAndImplementsOneInterface.kt b/testData/ast/class/class/extendsOneClassAndImplementsOneInterface.kt index 4bb2a7ab769..0567238ee84 100644 --- a/testData/ast/class/class/extendsOneClassAndImplementsOneInterface.kt +++ b/testData/ast/class/class/extendsOneClassAndImplementsOneInterface.kt @@ -1 +1,2 @@ -class A : Base, I { } \ No newline at end of file +class A : Base, I { +} \ No newline at end of file diff --git a/testData/ast/class/class/extendsOneClassAndImplementsSeveralInterfaces.kt b/testData/ast/class/class/extendsOneClassAndImplementsSeveralInterfaces.kt index e86ee0f0518..dc9dddf3cba 100644 --- a/testData/ast/class/class/extendsOneClassAndImplementsSeveralInterfaces.kt +++ b/testData/ast/class/class/extendsOneClassAndImplementsSeveralInterfaces.kt @@ -1 +1,2 @@ -class A : Base, I0, I1, I2 { } \ No newline at end of file +class A : Base, I0, I1, I2 { +} \ No newline at end of file diff --git a/testData/ast/class/class/finalClass.kt b/testData/ast/class/class/finalClass.kt index 5a0c97725b1..96d83e0c503 100644 --- a/testData/ast/class/class/finalClass.kt +++ b/testData/ast/class/class/finalClass.kt @@ -1 +1,2 @@ -class Test { } \ No newline at end of file +class Test { +} \ No newline at end of file diff --git a/testData/ast/class/class/genericClass.kt b/testData/ast/class/class/genericClass.kt index e7612b27f50..3bdd861a5fd 100644 --- a/testData/ast/class/class/genericClass.kt +++ b/testData/ast/class/class/genericClass.kt @@ -1 +1,2 @@ -class Entry { } \ No newline at end of file +class Entry { +} \ No newline at end of file diff --git a/testData/ast/class/class/innerEmptyClass.kt b/testData/ast/class/class/innerEmptyClass.kt index 630943255b1..22bcf13b976 100644 --- a/testData/ast/class/class/innerEmptyClass.kt +++ b/testData/ast/class/class/innerEmptyClass.kt @@ -1 +1,4 @@ -class A { class B { } } \ No newline at end of file +class A { +class B { +} +} \ No newline at end of file diff --git a/testData/ast/class/class/innerStaticClass.kt b/testData/ast/class/class/innerStaticClass.kt index 0041dfabfdd..96ce2d1beab 100644 --- a/testData/ast/class/class/innerStaticClass.kt +++ b/testData/ast/class/class/innerStaticClass.kt @@ -1 +1,6 @@ -class S { class object { open class Inner { } } } \ No newline at end of file +class S { +class object { +open class Inner { +} +} +} \ No newline at end of file diff --git a/testData/ast/class/class/internalClass.kt b/testData/ast/class/class/internalClass.kt index 503cbe46e7f..23873d0aaa3 100644 --- a/testData/ast/class/class/internalClass.kt +++ b/testData/ast/class/class/internalClass.kt @@ -1 +1,2 @@ -open class Test { } \ No newline at end of file +open class Test { +} \ No newline at end of file diff --git a/testData/ast/class/class/oneStaticFieldOneNonStatic.kt b/testData/ast/class/class/oneStaticFieldOneNonStatic.kt index 37e1a2c5efa..d2b11e44c60 100644 --- a/testData/ast/class/class/oneStaticFieldOneNonStatic.kt +++ b/testData/ast/class/class/oneStaticFieldOneNonStatic.kt @@ -1 +1,8 @@ -class S { class object { var myI : Int = 10 } fun sB() : Boolean { return true } } \ No newline at end of file +class S { +class object { +var myI : Int = 10 +} +fun sB() : Boolean { +return true +} +} \ No newline at end of file diff --git a/testData/ast/class/class/oneStaticMethod.kt b/testData/ast/class/class/oneStaticMethod.kt index 0b95364abcf..1e39f93f167 100644 --- a/testData/ast/class/class/oneStaticMethod.kt +++ b/testData/ast/class/class/oneStaticMethod.kt @@ -1 +1,7 @@ -class S { class object { fun staticF() : Boolean { return true } } } \ No newline at end of file +class S { +class object { +fun staticF() : Boolean { +return true +} +} +} \ No newline at end of file diff --git a/testData/ast/class/class/oneStaticMethodOneNonStatic.kt b/testData/ast/class/class/oneStaticMethodOneNonStatic.kt index ba3e67dd26e..dc7a84e71e4 100644 --- a/testData/ast/class/class/oneStaticMethodOneNonStatic.kt +++ b/testData/ast/class/class/oneStaticMethodOneNonStatic.kt @@ -1 +1,10 @@ -class S { class object { fun sI() : Int { return 1 } } fun sB() : Boolean { return true } } \ No newline at end of file +class S { +class object { +fun sI() : Int { +return 1 +} +} +fun sB() : Boolean { +return true +} +} \ No newline at end of file diff --git a/testData/ast/class/class/pivateClass.kt b/testData/ast/class/class/pivateClass.kt index 8f0cfde9556..8085e2675d2 100644 --- a/testData/ast/class/class/pivateClass.kt +++ b/testData/ast/class/class/pivateClass.kt @@ -1 +1,2 @@ -private open class Test { } \ No newline at end of file +private open class Test { +} \ No newline at end of file diff --git a/testData/ast/class/class/protectedClass.kt b/testData/ast/class/class/protectedClass.kt index 2f626ef896b..60bd6ecdb0c 100644 --- a/testData/ast/class/class/protectedClass.kt +++ b/testData/ast/class/class/protectedClass.kt @@ -1 +1,2 @@ -protected open class Test { } \ No newline at end of file +protected open class Test { +} \ No newline at end of file diff --git a/testData/ast/class/class/publicClass.kt b/testData/ast/class/class/publicClass.kt index ec3ccb82f12..44aae358376 100644 --- a/testData/ast/class/class/publicClass.kt +++ b/testData/ast/class/class/publicClass.kt @@ -1 +1,2 @@ -public open class Test { } \ No newline at end of file +public open class Test { +} \ No newline at end of file diff --git a/testData/ast/class/class/simpleInheritance.kt b/testData/ast/class/class/simpleInheritance.kt index 2aee0acad51..9fe01fc7381 100644 --- a/testData/ast/class/class/simpleInheritance.kt +++ b/testData/ast/class/class/simpleInheritance.kt @@ -1 +1,2 @@ -class A : Base { } \ No newline at end of file +class A : Base { +} \ No newline at end of file diff --git a/testData/ast/class/class/twoStaticMethod.kt b/testData/ast/class/class/twoStaticMethod.kt index 034258422aa..4b8bfbbab24 100644 --- a/testData/ast/class/class/twoStaticMethod.kt +++ b/testData/ast/class/class/twoStaticMethod.kt @@ -1 +1,10 @@ -class S { class object { fun sB() : Boolean { return true } fun sI() : Int { return 1 } } } \ No newline at end of file +class S { +class object { +fun sB() : Boolean { +return true +} +fun sI() : Int { +return 1 +} +} +} \ No newline at end of file diff --git a/testData/ast/enum/class/emptyEnum.kt b/testData/ast/enum/class/emptyEnum.kt index ee5f5b8e52b..1af4d906515 100644 --- a/testData/ast/enum/class/emptyEnum.kt +++ b/testData/ast/enum/class/emptyEnum.kt @@ -1 +1,2 @@ -enum A { } \ No newline at end of file +enum A { +} \ No newline at end of file diff --git a/testData/ast/enum/class/enumImplementsOneInterface.kt b/testData/ast/enum/class/enumImplementsOneInterface.kt index 9aaec583855..057767b736e 100644 --- a/testData/ast/enum/class/enumImplementsOneInterface.kt +++ b/testData/ast/enum/class/enumImplementsOneInterface.kt @@ -1 +1,2 @@ -enum A : I { } \ No newline at end of file +enum A : I { +} \ No newline at end of file diff --git a/testData/ast/enum/class/enumImplementsSeveralInterfaces.kt b/testData/ast/enum/class/enumImplementsSeveralInterfaces.kt index 4db3cfa0033..82b4ca0a510 100644 --- a/testData/ast/enum/class/enumImplementsSeveralInterfaces.kt +++ b/testData/ast/enum/class/enumImplementsSeveralInterfaces.kt @@ -1 +1,2 @@ -enum A : I0, I1, I2 { } \ No newline at end of file +enum A : I0, I1, I2 { +} \ No newline at end of file diff --git a/testData/ast/enum/class_mult/enumWithNameField.jav b/testData/ast/enum/class/enumWithNameField.jav similarity index 100% rename from testData/ast/enum/class_mult/enumWithNameField.jav rename to testData/ast/enum/class/enumWithNameField.jav diff --git a/testData/ast/enum/class_mult/enumWithNameField.kt b/testData/ast/enum/class/enumWithNameField.kt similarity index 100% rename from testData/ast/enum/class_mult/enumWithNameField.kt rename to testData/ast/enum/class/enumWithNameField.kt diff --git a/testData/ast/enum/class_mult/fieldsWithPrimaryPrivateConstructor.jav b/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.jav similarity index 100% rename from testData/ast/enum/class_mult/fieldsWithPrimaryPrivateConstructor.jav rename to testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.jav diff --git a/testData/ast/enum/class_mult/fieldsWithPrimaryPrivateConstructor.kt b/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt similarity index 100% rename from testData/ast/enum/class_mult/fieldsWithPrimaryPrivateConstructor.kt rename to testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt diff --git a/testData/ast/enum/class/internalEnum.kt b/testData/ast/enum/class/internalEnum.kt index a677a0e3d81..9a04f7dee8d 100644 --- a/testData/ast/enum/class/internalEnum.kt +++ b/testData/ast/enum/class/internalEnum.kt @@ -1 +1,2 @@ -enum Test { } \ No newline at end of file +enum Test { +} \ No newline at end of file diff --git a/testData/ast/enum/class_mult/overrideToString.jav b/testData/ast/enum/class/overrideToString.jav similarity index 100% rename from testData/ast/enum/class_mult/overrideToString.jav rename to testData/ast/enum/class/overrideToString.jav diff --git a/testData/ast/enum/class_mult/overrideToString.kt b/testData/ast/enum/class/overrideToString.kt similarity index 100% rename from testData/ast/enum/class_mult/overrideToString.kt rename to testData/ast/enum/class/overrideToString.kt diff --git a/testData/ast/enum/class/privateEnum.kt b/testData/ast/enum/class/privateEnum.kt index 91956cea0d2..6d712e6d618 100644 --- a/testData/ast/enum/class/privateEnum.kt +++ b/testData/ast/enum/class/privateEnum.kt @@ -1 +1,2 @@ -private enum Test { } \ No newline at end of file +private enum Test { +} \ No newline at end of file diff --git a/testData/ast/enum/class/protectedEnum.kt b/testData/ast/enum/class/protectedEnum.kt index 00aaa1306e8..cee5a49cba3 100644 --- a/testData/ast/enum/class/protectedEnum.kt +++ b/testData/ast/enum/class/protectedEnum.kt @@ -1 +1,2 @@ -protected enum Test { } \ No newline at end of file +protected enum Test { +} \ No newline at end of file diff --git a/testData/ast/enum/class/publicEnum.kt b/testData/ast/enum/class/publicEnum.kt index 86f25500c54..1f30de10d07 100644 --- a/testData/ast/enum/class/publicEnum.kt +++ b/testData/ast/enum/class/publicEnum.kt @@ -1 +1,2 @@ -public enum Test { } \ No newline at end of file +public enum Test { +} \ No newline at end of file diff --git a/testData/ast/enum/class_mult/runnableImplementation.jav b/testData/ast/enum/class/runnableImplementation.jav similarity index 100% rename from testData/ast/enum/class_mult/runnableImplementation.jav rename to testData/ast/enum/class/runnableImplementation.jav diff --git a/testData/ast/enum/class_mult/runnableImplementation.kt b/testData/ast/enum/class/runnableImplementation.kt similarity index 100% rename from testData/ast/enum/class_mult/runnableImplementation.kt rename to testData/ast/enum/class/runnableImplementation.kt diff --git a/testData/ast/enum/class_mult/typeSafeEnum.jav b/testData/ast/enum/class/typeSafeEnum.jav similarity index 100% rename from testData/ast/enum/class_mult/typeSafeEnum.jav rename to testData/ast/enum/class/typeSafeEnum.jav diff --git a/testData/ast/enum/class_mult/typeSafeEnum.kt b/testData/ast/enum/class/typeSafeEnum.kt similarity index 100% rename from testData/ast/enum/class_mult/typeSafeEnum.kt rename to testData/ast/enum/class/typeSafeEnum.kt diff --git a/testData/ast/trait/class/emptyInterface.kt b/testData/ast/trait/class/emptyInterface.kt index a2cce28acad..670cabdb241 100644 --- a/testData/ast/trait/class/emptyInterface.kt +++ b/testData/ast/trait/class/emptyInterface.kt @@ -1 +1,2 @@ -trait A { } \ No newline at end of file +trait A { +} \ No newline at end of file diff --git a/testData/ast/trait/class/extendsOneClassAndImplementsSeveralInterfaces.kt b/testData/ast/trait/class/extendsOneClassAndImplementsSeveralInterfaces.kt index 354dd60f348..3bbc299803d 100644 --- a/testData/ast/trait/class/extendsOneClassAndImplementsSeveralInterfaces.kt +++ b/testData/ast/trait/class/extendsOneClassAndImplementsSeveralInterfaces.kt @@ -1 +1,2 @@ -trait A : I0, I1, I2 { } \ No newline at end of file +trait A : I0, I1, I2 { +} \ No newline at end of file diff --git a/testData/ast/trait/class/extendsOneInterface.kt b/testData/ast/trait/class/extendsOneInterface.kt index 1d64da28e8d..a5d59a56576 100644 --- a/testData/ast/trait/class/extendsOneInterface.kt +++ b/testData/ast/trait/class/extendsOneInterface.kt @@ -1 +1,2 @@ -trait A : I { } \ No newline at end of file +trait A : I { +} \ No newline at end of file diff --git a/testData/ast/trait/class_mult/interfaceWithFields.jav b/testData/ast/trait/class/interfaceWithFields.jav similarity index 100% rename from testData/ast/trait/class_mult/interfaceWithFields.jav rename to testData/ast/trait/class/interfaceWithFields.jav diff --git a/testData/ast/trait/class_mult/interfaceWithFields.kt b/testData/ast/trait/class/interfaceWithFields.kt similarity index 100% rename from testData/ast/trait/class_mult/interfaceWithFields.kt rename to testData/ast/trait/class/interfaceWithFields.kt diff --git a/testData/ast/trait/class_mult/interfaceWithMethodDeclaration.jav b/testData/ast/trait/class/interfaceWithMethodDeclaration.jav similarity index 100% rename from testData/ast/trait/class_mult/interfaceWithMethodDeclaration.jav rename to testData/ast/trait/class/interfaceWithMethodDeclaration.jav diff --git a/testData/ast/trait/class_mult/interfaceWithMethodDeclaration.kt b/testData/ast/trait/class/interfaceWithMethodDeclaration.kt similarity index 100% rename from testData/ast/trait/class_mult/interfaceWithMethodDeclaration.kt rename to testData/ast/trait/class/interfaceWithMethodDeclaration.kt diff --git a/testData/ast/trait/class_mult/interfaceWithStaticFields.jav b/testData/ast/trait/class/interfaceWithStaticFields.jav similarity index 100% rename from testData/ast/trait/class_mult/interfaceWithStaticFields.jav rename to testData/ast/trait/class/interfaceWithStaticFields.jav diff --git a/testData/ast/trait/class_mult/interfaceWithStaticFields.kt b/testData/ast/trait/class/interfaceWithStaticFields.kt similarity index 100% rename from testData/ast/trait/class_mult/interfaceWithStaticFields.kt rename to testData/ast/trait/class/interfaceWithStaticFields.kt diff --git a/testData/ast/trait/class/internalInterface.kt b/testData/ast/trait/class/internalInterface.kt index 1a34b23ead0..802809a5724 100644 --- a/testData/ast/trait/class/internalInterface.kt +++ b/testData/ast/trait/class/internalInterface.kt @@ -1 +1,2 @@ -trait Test { } \ No newline at end of file +trait Test { +} \ No newline at end of file diff --git a/testData/ast/trait/class/privateInterface.kt b/testData/ast/trait/class/privateInterface.kt index 40dd81f4759..72942402d0b 100644 --- a/testData/ast/trait/class/privateInterface.kt +++ b/testData/ast/trait/class/privateInterface.kt @@ -1 +1,2 @@ -private trait Test { } \ No newline at end of file +private trait Test { +} \ No newline at end of file diff --git a/testData/ast/trait/class/protectedInterface.kt b/testData/ast/trait/class/protectedInterface.kt index 16e306a9859..359d3b99929 100644 --- a/testData/ast/trait/class/protectedInterface.kt +++ b/testData/ast/trait/class/protectedInterface.kt @@ -1 +1,2 @@ -protected trait Test { } \ No newline at end of file +protected trait Test { +} \ No newline at end of file diff --git a/testData/ast/trait/class/publicInterface.kt b/testData/ast/trait/class/publicInterface.kt index 3c2f3d72209..14565fbd6b3 100644 --- a/testData/ast/trait/class/publicInterface.kt +++ b/testData/ast/trait/class/publicInterface.kt @@ -1 +1,2 @@ -public trait Test { } \ No newline at end of file +public trait Test { +} \ No newline at end of file diff --git a/testData/ast/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.kt b/testData/ast/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.kt index 4177d8f1720..d85353e99f4 100644 --- a/testData/ast/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.kt +++ b/testData/ast/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.kt @@ -1 +1,2 @@ -class CC : A where T : Comparable?, K : Collection? { } \ No newline at end of file +class CC : A where T : Comparable?, K : Collection? { +} \ No newline at end of file diff --git a/testData/ast/typeParameters/class/classParametrizationWithTwoBounds.kt b/testData/ast/typeParameters/class/classParametrizationWithTwoBounds.kt index 16234cc8e44..ef570ae9618 100644 --- a/testData/ast/typeParameters/class/classParametrizationWithTwoBounds.kt +++ b/testData/ast/typeParameters/class/classParametrizationWithTwoBounds.kt @@ -1 +1,2 @@ -class C where T : Comparable? { } \ No newline at end of file +class C where T : Comparable? { +} \ No newline at end of file diff --git a/testData/ast/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.kt b/testData/ast/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.kt index a22d76df018..7ac90335e6e 100644 --- a/testData/ast/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.kt +++ b/testData/ast/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.kt @@ -1 +1,2 @@ -class C : A where T : Comparable? { } \ No newline at end of file +class C : A where T : Comparable? { +} \ No newline at end of file diff --git a/testData/ast/typeParameters/class/complexExampleWithClassExtending.kt b/testData/ast/typeParameters/class/complexExampleWithClassExtending.kt index c915d092f82..077c6618b24 100644 --- a/testData/ast/typeParameters/class/complexExampleWithClassExtending.kt +++ b/testData/ast/typeParameters/class/complexExampleWithClassExtending.kt @@ -1 +1,2 @@ -trait CommandHandler { } \ No newline at end of file +trait CommandHandler { +} \ No newline at end of file diff --git a/testData/ast/typeParameters/class/complexExampleWithClassMultiplyExtending.kt b/testData/ast/typeParameters/class/complexExampleWithClassMultiplyExtending.kt index 9b684ed9022..4c3fd7537b6 100644 --- a/testData/ast/typeParameters/class/complexExampleWithClassMultiplyExtending.kt +++ b/testData/ast/typeParameters/class/complexExampleWithClassMultiplyExtending.kt @@ -1 +1,2 @@ -trait CommandHandler { } \ No newline at end of file +trait CommandHandler { +} \ No newline at end of file diff --git a/testData/ast/typeParameters/class/genericClass.kt b/testData/ast/typeParameters/class/genericClass.kt index eba6f27b2bf..c2be9da34e3 100644 --- a/testData/ast/typeParameters/class/genericClass.kt +++ b/testData/ast/typeParameters/class/genericClass.kt @@ -1 +1,2 @@ -class Comparable { } \ No newline at end of file +class Comparable { +} \ No newline at end of file diff --git a/testData/ast/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.kt b/testData/ast/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.kt index 27a4ec88adc..f73bbabea8b 100644 --- a/testData/ast/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.kt +++ b/testData/ast/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.kt @@ -1 +1,2 @@ -trait I : II where T : Comparable?, K : Collection? { } \ No newline at end of file +trait I : II where T : Comparable?, K : Collection? { +} \ No newline at end of file From 4e6e488e28a468cd740f3d28ae864320c931ee7d Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 7 Nov 2011 13:20:46 +0400 Subject: [PATCH 063/206] method_mult avoided --- test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java | 5 +---- testData/ast/arrayType/method/methodArrayArgs.kt | 3 ++- testData/ast/function/method/classGenericParam.kt | 3 ++- testData/ast/function/method/emptyVoidMethod.kt | 3 ++- testData/ast/function/method/internal.kt | 3 ++- testData/ast/function/method/methodClassType.kt | 3 ++- testData/ast/function/method/methodPrimitiveType.kt | 3 ++- testData/ast/function/method/methodPrimitiveType2.kt | 3 ++- testData/ast/function/method/methodWithReturnStatement.kt | 4 +++- testData/ast/function/method/ownGenericParam.kt | 3 ++- testData/ast/function/method/ownSeveralGenericParams.kt | 3 ++- testData/ast/function/method/private.kt | 3 ++- testData/ast/function/method/protected.kt | 3 ++- testData/ast/function/method/public.kt | 3 ++- testData/ast/inProjectionType/method/methodParams.kt | 3 ++- testData/ast/outProjectionType/method/methodParams.kt | 3 ++- testData/ast/starProjectionType/method/methodParams.kt | 3 ++- .../method/methodDoubleParametrizationWithTwoBounds.kt | 3 ++- testData/ast/typeParameters/method/where.kt | 3 ++- testData/ast/varArg/method/ellipsisTypeSingleParams.kt | 3 ++- 20 files changed, 40 insertions(+), 23 deletions(-) diff --git a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java index 1741520cb27..ae47e98b7d6 100644 --- a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java +++ b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java @@ -43,11 +43,8 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { else if (javaFile.getParent().endsWith("/statement")) actual = statementToSingleLineKotlin(javaCode); else if (javaFile.getParent().endsWith("/statement_mult")) actual = statementToKotlin(javaCode); - else if (javaFile.getParent().endsWith("/method")) actual = methodToSingleLineKotlin(javaCode); - else if (javaFile.getParent().endsWith("/method_mult")) actual = methodToKotlin(javaCode); - + else if (javaFile.getParent().endsWith("/method")) actual = methodToKotlin(javaCode); else if (javaFile.getParent().endsWith("/class")) actual = classToKotlin(javaCode); - else if (javaFile.getParent().endsWith("/file")) actual = fileToKotlin(javaCode); assert !actual.equals(""); diff --git a/testData/ast/arrayType/method/methodArrayArgs.kt b/testData/ast/arrayType/method/methodArrayArgs.kt index 6bd0c42dd8b..b095e2dd099 100644 --- a/testData/ast/arrayType/method/methodArrayArgs.kt +++ b/testData/ast/arrayType/method/methodArrayArgs.kt @@ -1 +1,2 @@ -fun fromArrayToCollection(a : Array?) : Unit { } \ No newline at end of file +fun fromArrayToCollection(a : Array?) : Unit { +} \ No newline at end of file diff --git a/testData/ast/function/method/classGenericParam.kt b/testData/ast/function/method/classGenericParam.kt index 7f936986c02..b9ea1d49799 100644 --- a/testData/ast/function/method/classGenericParam.kt +++ b/testData/ast/function/method/classGenericParam.kt @@ -1 +1,2 @@ -fun getT() : T? { } \ No newline at end of file +fun getT() : T? { +} \ No newline at end of file diff --git a/testData/ast/function/method/emptyVoidMethod.kt b/testData/ast/function/method/emptyVoidMethod.kt index 93eff2fa681..ae299eb173a 100644 --- a/testData/ast/function/method/emptyVoidMethod.kt +++ b/testData/ast/function/method/emptyVoidMethod.kt @@ -1 +1,2 @@ -fun main() : Unit { } \ No newline at end of file +fun main() : Unit { +} \ No newline at end of file diff --git a/testData/ast/function/method/internal.kt b/testData/ast/function/method/internal.kt index 8155b96fa2f..5b3e9634f3f 100644 --- a/testData/ast/function/method/internal.kt +++ b/testData/ast/function/method/internal.kt @@ -1 +1,2 @@ -fun test() : Unit { } \ No newline at end of file +fun test() : Unit { +} \ No newline at end of file diff --git a/testData/ast/function/method/methodClassType.kt b/testData/ast/function/method/methodClassType.kt index a501cae6c7c..196c45b6bf8 100644 --- a/testData/ast/function/method/methodClassType.kt +++ b/testData/ast/function/method/methodClassType.kt @@ -1 +1,2 @@ -fun main() : String? { } \ No newline at end of file +fun main() : String? { +} \ No newline at end of file diff --git a/testData/ast/function/method/methodPrimitiveType.kt b/testData/ast/function/method/methodPrimitiveType.kt index ee968dfc778..c6ef43f8a14 100644 --- a/testData/ast/function/method/methodPrimitiveType.kt +++ b/testData/ast/function/method/methodPrimitiveType.kt @@ -1 +1,2 @@ -fun main() : Int { } \ No newline at end of file +fun main() : Int { +} \ No newline at end of file diff --git a/testData/ast/function/method/methodPrimitiveType2.kt b/testData/ast/function/method/methodPrimitiveType2.kt index 30327d5bfd0..c978e93e7aa 100644 --- a/testData/ast/function/method/methodPrimitiveType2.kt +++ b/testData/ast/function/method/methodPrimitiveType2.kt @@ -1 +1,2 @@ -fun main() : Boolean { } \ No newline at end of file +fun main() : Boolean { +} \ No newline at end of file diff --git a/testData/ast/function/method/methodWithReturnStatement.kt b/testData/ast/function/method/methodWithReturnStatement.kt index 641bd3e4f6e..acfbd1010d8 100644 --- a/testData/ast/function/method/methodWithReturnStatement.kt +++ b/testData/ast/function/method/methodWithReturnStatement.kt @@ -1 +1,3 @@ -fun isTrue() : Boolean { return true } \ No newline at end of file +fun isTrue() : Boolean { +return true +} \ No newline at end of file diff --git a/testData/ast/function/method/ownGenericParam.kt b/testData/ast/function/method/ownGenericParam.kt index bcc017c4dcc..e5533fdcb5f 100644 --- a/testData/ast/function/method/ownGenericParam.kt +++ b/testData/ast/function/method/ownGenericParam.kt @@ -1 +1,2 @@ -fun putU(u : U?) : Unit { } \ No newline at end of file +fun putU(u : U?) : Unit { +} \ No newline at end of file diff --git a/testData/ast/function/method/ownSeveralGenericParams.kt b/testData/ast/function/method/ownSeveralGenericParams.kt index 6fd24774822..19fb6188681 100644 --- a/testData/ast/function/method/ownSeveralGenericParams.kt +++ b/testData/ast/function/method/ownSeveralGenericParams.kt @@ -1 +1,2 @@ -fun putUVW(u : U?, v : V?, w : W?) : Unit { } \ No newline at end of file +fun putUVW(u : U?, v : V?, w : W?) : Unit { +} \ No newline at end of file diff --git a/testData/ast/function/method/private.kt b/testData/ast/function/method/private.kt index f71b1d7c6c8..45e5e8bab00 100644 --- a/testData/ast/function/method/private.kt +++ b/testData/ast/function/method/private.kt @@ -1 +1,2 @@ -private fun test() : Unit { } \ No newline at end of file +private fun test() : Unit { +} \ No newline at end of file diff --git a/testData/ast/function/method/protected.kt b/testData/ast/function/method/protected.kt index e03000581bc..dbbc30b447b 100644 --- a/testData/ast/function/method/protected.kt +++ b/testData/ast/function/method/protected.kt @@ -1 +1,2 @@ -protected fun test() : Unit { } \ No newline at end of file +protected fun test() : Unit { +} \ No newline at end of file diff --git a/testData/ast/function/method/public.kt b/testData/ast/function/method/public.kt index 6e8c3855f6c..d835330ec86 100644 --- a/testData/ast/function/method/public.kt +++ b/testData/ast/function/method/public.kt @@ -1 +1,2 @@ -public fun test() : Unit { } \ No newline at end of file +public fun test() : Unit { +} \ No newline at end of file diff --git a/testData/ast/inProjectionType/method/methodParams.kt b/testData/ast/inProjectionType/method/methodParams.kt index 8073329f038..6888dcd5c36 100644 --- a/testData/ast/inProjectionType/method/methodParams.kt +++ b/testData/ast/inProjectionType/method/methodParams.kt @@ -1 +1,2 @@ -fun popAll(dst : Collection?) : Unit { } \ No newline at end of file +fun popAll(dst : Collection?) : Unit { +} \ No newline at end of file diff --git a/testData/ast/outProjectionType/method/methodParams.kt b/testData/ast/outProjectionType/method/methodParams.kt index 6117f1d6945..373c01e629f 100644 --- a/testData/ast/outProjectionType/method/methodParams.kt +++ b/testData/ast/outProjectionType/method/methodParams.kt @@ -1 +1,2 @@ -fun pushAll(src : Collection?) : Unit { } \ No newline at end of file +fun pushAll(src : Collection?) : Unit { +} \ No newline at end of file diff --git a/testData/ast/starProjectionType/method/methodParams.kt b/testData/ast/starProjectionType/method/methodParams.kt index 2f5330f87b6..01ea4c15302 100644 --- a/testData/ast/starProjectionType/method/methodParams.kt +++ b/testData/ast/starProjectionType/method/methodParams.kt @@ -1 +1,2 @@ -fun wtf(w : Collection<*>?) : Unit { } \ No newline at end of file +fun wtf(w : Collection<*>?) : Unit { +} \ No newline at end of file diff --git a/testData/ast/typeParameters/method/methodDoubleParametrizationWithTwoBounds.kt b/testData/ast/typeParameters/method/methodDoubleParametrizationWithTwoBounds.kt index 1e9e0b36ed5..21f892b7d8d 100644 --- a/testData/ast/typeParameters/method/methodDoubleParametrizationWithTwoBounds.kt +++ b/testData/ast/typeParameters/method/methodDoubleParametrizationWithTwoBounds.kt @@ -1 +1,2 @@ -fun max(coll : Collection?) : T? where T : Comparable?, K : Collection? { } \ No newline at end of file +fun max(coll : Collection?) : T? where T : Comparable?, K : Collection? { +} \ No newline at end of file diff --git a/testData/ast/typeParameters/method/where.kt b/testData/ast/typeParameters/method/where.kt index fed3c38569d..6a1ccaeeec6 100644 --- a/testData/ast/typeParameters/method/where.kt +++ b/testData/ast/typeParameters/method/where.kt @@ -1 +1,2 @@ -fun max(coll : Collection?) : T? where T : Comparable? { } \ No newline at end of file +fun max(coll : Collection?) : T? where T : Comparable? { +} \ No newline at end of file diff --git a/testData/ast/varArg/method/ellipsisTypeSingleParams.kt b/testData/ast/varArg/method/ellipsisTypeSingleParams.kt index 0456fca4c8f..5219629e1e3 100644 --- a/testData/ast/varArg/method/ellipsisTypeSingleParams.kt +++ b/testData/ast/varArg/method/ellipsisTypeSingleParams.kt @@ -1 +1,2 @@ -fun pushAll(vararg objs : Any?) : Unit { } \ No newline at end of file +fun pushAll(vararg objs : Any?) : Unit { +} \ No newline at end of file From 992675a1bc8e5ff3d6b18da0b617016780b97490 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 7 Nov 2011 13:36:12 +0400 Subject: [PATCH 064/206] *_mult avoided --- .../jet/j2k/JavaToKotlinConverterTest.java | 18 +----------------- .../doubleArray.jav | 0 .../doubleArray.kt | 0 .../longArray.jav | 0 .../{statement_mult => statement}/longArray.kt | 0 .../newIntArray.jav | 0 .../newIntArray.kt | 0 .../newStringArray.jav | 0 .../newStringArray.kt | 0 .../onlyCondition.jav | 0 .../onlyCondition.kt | 0 .../onlyConditionWithBraces.jav | 0 .../onlyConditionWithBraces.kt | 0 .../withStringDetail.jav | 0 .../withStringDetail.kt | 0 .../{statement_mult => statement}/boolean.jav | 0 .../{statement_mult => statement}/boolean.kt | 0 .../{statement_mult => statement}/byte.jav | 0 .../{statement_mult => statement}/byte.kt | 0 .../character.jav | 0 .../{statement_mult => statement}/character.kt | 0 .../{statement_mult => statement}/double.jav | 0 .../{statement_mult => statement}/double.kt | 0 .../{statement_mult => statement}/float.jav | 0 .../{statement_mult => statement}/float.kt | 0 .../{statement_mult => statement}/integer.jav | 0 .../{statement_mult => statement}/integer.kt | 0 .../{statement_mult => statement}/long.jav | 0 .../{statement_mult => statement}/long.kt | 0 .../{statement_mult => statement}/object.jav | 0 .../{statement_mult => statement}/object.kt | 0 .../{statement_mult => statement}/short.jav | 0 .../{statement_mult => statement}/short.kt | 0 .../multiplyFinalIntDeclaration.jav | 0 .../multiplyFinalIntDeclaration.kt | 0 .../multiplyIntDeclaration.jav | 0 .../multiplyIntDeclaration.kt | 0 .../whileWithBlock.jav | 0 .../whileWithBlock.kt | 0 .../whileWithEmptyBlock.jav | 0 .../whileWithEmptyBlock.kt | 0 .../whileWithExpression.jav | 0 .../whileWithExpression.kt | 0 .../whileWithReturn.jav | 0 .../whileWithReturn.kt | 0 .../commonCaseForTest.jav | 0 .../commonCaseForTest.kt | 0 .../forWithBlock.jav | 0 .../forWithBlock.kt | 0 .../forWithBlockAndDoubleUpdate.jav | 0 .../forWithBlockAndDoubleUpdate.kt | 0 .../forWithEmptyBlock.jav | 0 .../forWithEmptyBlock.kt | 0 .../forWithExpression.jav | 0 .../forWithExpression.kt | 0 .../forWithReturn.jav | 0 .../forWithReturn.kt | 0 .../enhancedForWithBlock.jav | 0 .../enhancedForWithBlock.kt | 0 .../enhancedForWithEmptyBlock.jav | 0 .../enhancedForWithEmptyBlock.kt | 0 .../enhancedForWithExpression.jav | 0 .../enhancedForWithExpression.kt | 0 .../enhancedForWithReturn.jav | 0 .../enhancedForWithReturn.kt | 0 .../ifStatementWithEmptyBlocks.jav | 0 .../ifStatementWithEmptyBlocks.kt | 0 .../ifStatementWithMultilineBlocks.jav | 0 .../ifStatementWithMultilineBlocks.kt | 0 .../ifStatementWithOneLineBlocks.jav | 0 .../ifStatementWithOneLineBlocks.kt | 0 .../ifStatementWithoutElse.jav | 0 .../ifStatementWithoutElse.kt | 0 .../complicatedExampleFromJavaTutorial.jav | 0 .../complicatedExampleFromJavaTutorial.kt | 0 .../decrement.jav | 0 .../{statement_mult => statement}/decrement.kt | 0 .../increment.jav | 0 .../{statement_mult => statement}/increment.kt | 0 .../decrement.jav | 0 .../{statement_mult => statement}/decrement.kt | 0 .../increment.jav | 0 .../{statement_mult => statement}/increment.kt | 0 .../statement/singleLineExample.kt | 4 +++- .../commonCaseForTryStatement.jav | 0 .../commonCaseForTryStatement.kt | 0 .../emptyTryWithTwoCatchesWithEmptyFinally.jav | 0 .../emptyTryWithTwoCatchesWithEmptyFinally.kt | 0 .../emptyTryWithTwoCatchesWithFinally.jav | 0 .../emptyTryWithTwoCatchesWithFinally.kt | 0 .../emptyTryWithTwoCatchesWithoutFinally.jav | 0 .../emptyTryWithTwoCatchesWithoutFinally.kt | 0 .../genericParam.jav | 0 .../genericParam.kt | 0 .../manyGenericParams.jav | 0 .../manyGenericParams.kt | 0 .../whileWithBlock.jav | 0 .../whileWithBlock.kt | 0 .../whileWithEmptyBlock.jav | 0 .../whileWithEmptyBlock.kt | 0 .../whileWithExpression.jav | 0 .../whileWithExpression.kt | 0 .../whileWithReturn.jav | 0 .../whileWithReturn.kt | 0 104 files changed, 4 insertions(+), 18 deletions(-) rename testData/ast/arrayType/{statement_mult => statement}/doubleArray.jav (100%) rename testData/ast/arrayType/{statement_mult => statement}/doubleArray.kt (100%) rename testData/ast/arrayType/{statement_mult => statement}/longArray.jav (100%) rename testData/ast/arrayType/{statement_mult => statement}/longArray.kt (100%) rename testData/ast/arrayType/{statement_mult => statement}/newIntArray.jav (100%) rename testData/ast/arrayType/{statement_mult => statement}/newIntArray.kt (100%) rename testData/ast/arrayType/{statement_mult => statement}/newStringArray.jav (100%) rename testData/ast/arrayType/{statement_mult => statement}/newStringArray.kt (100%) rename testData/ast/assertStatement/{statement_mult => statement}/onlyCondition.jav (100%) rename testData/ast/assertStatement/{statement_mult => statement}/onlyCondition.kt (100%) rename testData/ast/assertStatement/{statement_mult => statement}/onlyConditionWithBraces.jav (100%) rename testData/ast/assertStatement/{statement_mult => statement}/onlyConditionWithBraces.kt (100%) rename testData/ast/assertStatement/{statement_mult => statement}/withStringDetail.jav (100%) rename testData/ast/assertStatement/{statement_mult => statement}/withStringDetail.kt (100%) rename testData/ast/boxedType/{statement_mult => statement}/boolean.jav (100%) rename testData/ast/boxedType/{statement_mult => statement}/boolean.kt (100%) rename testData/ast/boxedType/{statement_mult => statement}/byte.jav (100%) rename testData/ast/boxedType/{statement_mult => statement}/byte.kt (100%) rename testData/ast/boxedType/{statement_mult => statement}/character.jav (100%) rename testData/ast/boxedType/{statement_mult => statement}/character.kt (100%) rename testData/ast/boxedType/{statement_mult => statement}/double.jav (100%) rename testData/ast/boxedType/{statement_mult => statement}/double.kt (100%) rename testData/ast/boxedType/{statement_mult => statement}/float.jav (100%) rename testData/ast/boxedType/{statement_mult => statement}/float.kt (100%) rename testData/ast/boxedType/{statement_mult => statement}/integer.jav (100%) rename testData/ast/boxedType/{statement_mult => statement}/integer.kt (100%) rename testData/ast/boxedType/{statement_mult => statement}/long.jav (100%) rename testData/ast/boxedType/{statement_mult => statement}/long.kt (100%) rename testData/ast/boxedType/{statement_mult => statement}/object.jav (100%) rename testData/ast/boxedType/{statement_mult => statement}/object.kt (100%) rename testData/ast/boxedType/{statement_mult => statement}/short.jav (100%) rename testData/ast/boxedType/{statement_mult => statement}/short.kt (100%) rename testData/ast/declarationStatement/{statement_mult => statement}/multiplyFinalIntDeclaration.jav (100%) rename testData/ast/declarationStatement/{statement_mult => statement}/multiplyFinalIntDeclaration.kt (100%) rename testData/ast/declarationStatement/{statement_mult => statement}/multiplyIntDeclaration.jav (100%) rename testData/ast/declarationStatement/{statement_mult => statement}/multiplyIntDeclaration.kt (100%) rename testData/ast/doWhileStatement/{statement_mult => statement}/whileWithBlock.jav (100%) rename testData/ast/doWhileStatement/{statement_mult => statement}/whileWithBlock.kt (100%) rename testData/ast/doWhileStatement/{statement_mult => statement}/whileWithEmptyBlock.jav (100%) rename testData/ast/doWhileStatement/{statement_mult => statement}/whileWithEmptyBlock.kt (100%) rename testData/ast/doWhileStatement/{statement_mult => statement}/whileWithExpression.jav (100%) rename testData/ast/doWhileStatement/{statement_mult => statement}/whileWithExpression.kt (100%) rename testData/ast/doWhileStatement/{statement_mult => statement}/whileWithReturn.jav (100%) rename testData/ast/doWhileStatement/{statement_mult => statement}/whileWithReturn.kt (100%) rename testData/ast/for/{statement_mult => statement}/commonCaseForTest.jav (100%) rename testData/ast/for/{statement_mult => statement}/commonCaseForTest.kt (100%) rename testData/ast/for/{statement_mult => statement}/forWithBlock.jav (100%) rename testData/ast/for/{statement_mult => statement}/forWithBlock.kt (100%) rename testData/ast/for/{statement_mult => statement}/forWithBlockAndDoubleUpdate.jav (100%) rename testData/ast/for/{statement_mult => statement}/forWithBlockAndDoubleUpdate.kt (100%) rename testData/ast/for/{statement_mult => statement}/forWithEmptyBlock.jav (100%) rename testData/ast/for/{statement_mult => statement}/forWithEmptyBlock.kt (100%) rename testData/ast/for/{statement_mult => statement}/forWithExpression.jav (100%) rename testData/ast/for/{statement_mult => statement}/forWithExpression.kt (100%) rename testData/ast/for/{statement_mult => statement}/forWithReturn.jav (100%) rename testData/ast/for/{statement_mult => statement}/forWithReturn.kt (100%) rename testData/ast/foreachStatement/{statement_mult => statement}/enhancedForWithBlock.jav (100%) rename testData/ast/foreachStatement/{statement_mult => statement}/enhancedForWithBlock.kt (100%) rename testData/ast/foreachStatement/{statement_mult => statement}/enhancedForWithEmptyBlock.jav (100%) rename testData/ast/foreachStatement/{statement_mult => statement}/enhancedForWithEmptyBlock.kt (100%) rename testData/ast/foreachStatement/{statement_mult => statement}/enhancedForWithExpression.jav (100%) rename testData/ast/foreachStatement/{statement_mult => statement}/enhancedForWithExpression.kt (100%) rename testData/ast/foreachStatement/{statement_mult => statement}/enhancedForWithReturn.jav (100%) rename testData/ast/foreachStatement/{statement_mult => statement}/enhancedForWithReturn.kt (100%) rename testData/ast/ifStatement/{statement_mult => statement}/ifStatementWithEmptyBlocks.jav (100%) rename testData/ast/ifStatement/{statement_mult => statement}/ifStatementWithEmptyBlocks.kt (100%) rename testData/ast/ifStatement/{statement_mult => statement}/ifStatementWithMultilineBlocks.jav (100%) rename testData/ast/ifStatement/{statement_mult => statement}/ifStatementWithMultilineBlocks.kt (100%) rename testData/ast/ifStatement/{statement_mult => statement}/ifStatementWithOneLineBlocks.jav (100%) rename testData/ast/ifStatement/{statement_mult => statement}/ifStatementWithOneLineBlocks.kt (100%) rename testData/ast/ifStatement/{statement_mult => statement}/ifStatementWithoutElse.jav (100%) rename testData/ast/ifStatement/{statement_mult => statement}/ifStatementWithoutElse.kt (100%) rename testData/ast/labelStatement/{statement_mult => statement}/complicatedExampleFromJavaTutorial.jav (100%) rename testData/ast/labelStatement/{statement_mult => statement}/complicatedExampleFromJavaTutorial.kt (100%) rename testData/ast/postfixOperator/{statement_mult => statement}/decrement.jav (100%) rename testData/ast/postfixOperator/{statement_mult => statement}/decrement.kt (100%) rename testData/ast/postfixOperator/{statement_mult => statement}/increment.jav (100%) rename testData/ast/postfixOperator/{statement_mult => statement}/increment.kt (100%) rename testData/ast/prefixOperator/{statement_mult => statement}/decrement.jav (100%) rename testData/ast/prefixOperator/{statement_mult => statement}/decrement.kt (100%) rename testData/ast/prefixOperator/{statement_mult => statement}/increment.jav (100%) rename testData/ast/prefixOperator/{statement_mult => statement}/increment.kt (100%) rename testData/ast/tryStatement/{statement_mult => statement}/commonCaseForTryStatement.jav (100%) rename testData/ast/tryStatement/{statement_mult => statement}/commonCaseForTryStatement.kt (100%) rename testData/ast/tryStatement/{statement_mult => statement}/emptyTryWithTwoCatchesWithEmptyFinally.jav (100%) rename testData/ast/tryStatement/{statement_mult => statement}/emptyTryWithTwoCatchesWithEmptyFinally.kt (100%) rename testData/ast/tryStatement/{statement_mult => statement}/emptyTryWithTwoCatchesWithFinally.jav (100%) rename testData/ast/tryStatement/{statement_mult => statement}/emptyTryWithTwoCatchesWithFinally.kt (100%) rename testData/ast/tryStatement/{statement_mult => statement}/emptyTryWithTwoCatchesWithoutFinally.jav (100%) rename testData/ast/tryStatement/{statement_mult => statement}/emptyTryWithTwoCatchesWithoutFinally.kt (100%) rename testData/ast/typeParameters/{statement_mult => statement}/genericParam.jav (100%) rename testData/ast/typeParameters/{statement_mult => statement}/genericParam.kt (100%) rename testData/ast/typeParameters/{statement_mult => statement}/manyGenericParams.jav (100%) rename testData/ast/typeParameters/{statement_mult => statement}/manyGenericParams.kt (100%) rename testData/ast/whileStatement/{statement_mult => statement}/whileWithBlock.jav (100%) rename testData/ast/whileStatement/{statement_mult => statement}/whileWithBlock.kt (100%) rename testData/ast/whileStatement/{statement_mult => statement}/whileWithEmptyBlock.jav (100%) rename testData/ast/whileStatement/{statement_mult => statement}/whileWithEmptyBlock.kt (100%) rename testData/ast/whileStatement/{statement_mult => statement}/whileWithExpression.jav (100%) rename testData/ast/whileStatement/{statement_mult => statement}/whileWithExpression.kt (100%) rename testData/ast/whileStatement/{statement_mult => statement}/whileWithReturn.jav (100%) rename testData/ast/whileStatement/{statement_mult => statement}/whileWithReturn.kt (100%) diff --git a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java index ae47e98b7d6..cfbc8e24a8a 100644 --- a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java +++ b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java @@ -39,10 +39,7 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { String actual = ""; if (javaFile.getParent().endsWith("/expression")) actual = expressionToKotlin(javaCode); - - else if (javaFile.getParent().endsWith("/statement")) actual = statementToSingleLineKotlin(javaCode); - else if (javaFile.getParent().endsWith("/statement_mult")) actual = statementToKotlin(javaCode); - + else if (javaFile.getParent().endsWith("/statement")) actual = statementToKotlin(javaCode); else if (javaFile.getParent().endsWith("/method")) actual = methodToKotlin(javaCode); else if (javaFile.getParent().endsWith("/class")) actual = classToKotlin(javaCode); else if (javaFile.getParent().endsWith("/file")) actual = fileToKotlin(javaCode); @@ -108,14 +105,6 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { return prettify(result); } - protected String methodToSingleLineKotlin(String text) throws IOException { - return toSingleLine(methodToKotlin(text)); - } - - protected String statementToSingleLineKotlin(String code) throws Exception { - return toSingleLine(statementToKotlin(code)); - } - @NotNull protected String methodToKotlin(String text) throws IOException { String result = classToKotlin("final class C {" + text + "}") @@ -152,9 +141,4 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { .trim() ; } - - @NotNull - public static String toSingleLine(String string) { - return prettify(string.replaceAll("\n", " ")); - } } \ No newline at end of file diff --git a/testData/ast/arrayType/statement_mult/doubleArray.jav b/testData/ast/arrayType/statement/doubleArray.jav similarity index 100% rename from testData/ast/arrayType/statement_mult/doubleArray.jav rename to testData/ast/arrayType/statement/doubleArray.jav diff --git a/testData/ast/arrayType/statement_mult/doubleArray.kt b/testData/ast/arrayType/statement/doubleArray.kt similarity index 100% rename from testData/ast/arrayType/statement_mult/doubleArray.kt rename to testData/ast/arrayType/statement/doubleArray.kt diff --git a/testData/ast/arrayType/statement_mult/longArray.jav b/testData/ast/arrayType/statement/longArray.jav similarity index 100% rename from testData/ast/arrayType/statement_mult/longArray.jav rename to testData/ast/arrayType/statement/longArray.jav diff --git a/testData/ast/arrayType/statement_mult/longArray.kt b/testData/ast/arrayType/statement/longArray.kt similarity index 100% rename from testData/ast/arrayType/statement_mult/longArray.kt rename to testData/ast/arrayType/statement/longArray.kt diff --git a/testData/ast/arrayType/statement_mult/newIntArray.jav b/testData/ast/arrayType/statement/newIntArray.jav similarity index 100% rename from testData/ast/arrayType/statement_mult/newIntArray.jav rename to testData/ast/arrayType/statement/newIntArray.jav diff --git a/testData/ast/arrayType/statement_mult/newIntArray.kt b/testData/ast/arrayType/statement/newIntArray.kt similarity index 100% rename from testData/ast/arrayType/statement_mult/newIntArray.kt rename to testData/ast/arrayType/statement/newIntArray.kt diff --git a/testData/ast/arrayType/statement_mult/newStringArray.jav b/testData/ast/arrayType/statement/newStringArray.jav similarity index 100% rename from testData/ast/arrayType/statement_mult/newStringArray.jav rename to testData/ast/arrayType/statement/newStringArray.jav diff --git a/testData/ast/arrayType/statement_mult/newStringArray.kt b/testData/ast/arrayType/statement/newStringArray.kt similarity index 100% rename from testData/ast/arrayType/statement_mult/newStringArray.kt rename to testData/ast/arrayType/statement/newStringArray.kt diff --git a/testData/ast/assertStatement/statement_mult/onlyCondition.jav b/testData/ast/assertStatement/statement/onlyCondition.jav similarity index 100% rename from testData/ast/assertStatement/statement_mult/onlyCondition.jav rename to testData/ast/assertStatement/statement/onlyCondition.jav diff --git a/testData/ast/assertStatement/statement_mult/onlyCondition.kt b/testData/ast/assertStatement/statement/onlyCondition.kt similarity index 100% rename from testData/ast/assertStatement/statement_mult/onlyCondition.kt rename to testData/ast/assertStatement/statement/onlyCondition.kt diff --git a/testData/ast/assertStatement/statement_mult/onlyConditionWithBraces.jav b/testData/ast/assertStatement/statement/onlyConditionWithBraces.jav similarity index 100% rename from testData/ast/assertStatement/statement_mult/onlyConditionWithBraces.jav rename to testData/ast/assertStatement/statement/onlyConditionWithBraces.jav diff --git a/testData/ast/assertStatement/statement_mult/onlyConditionWithBraces.kt b/testData/ast/assertStatement/statement/onlyConditionWithBraces.kt similarity index 100% rename from testData/ast/assertStatement/statement_mult/onlyConditionWithBraces.kt rename to testData/ast/assertStatement/statement/onlyConditionWithBraces.kt diff --git a/testData/ast/assertStatement/statement_mult/withStringDetail.jav b/testData/ast/assertStatement/statement/withStringDetail.jav similarity index 100% rename from testData/ast/assertStatement/statement_mult/withStringDetail.jav rename to testData/ast/assertStatement/statement/withStringDetail.jav diff --git a/testData/ast/assertStatement/statement_mult/withStringDetail.kt b/testData/ast/assertStatement/statement/withStringDetail.kt similarity index 100% rename from testData/ast/assertStatement/statement_mult/withStringDetail.kt rename to testData/ast/assertStatement/statement/withStringDetail.kt diff --git a/testData/ast/boxedType/statement_mult/boolean.jav b/testData/ast/boxedType/statement/boolean.jav similarity index 100% rename from testData/ast/boxedType/statement_mult/boolean.jav rename to testData/ast/boxedType/statement/boolean.jav diff --git a/testData/ast/boxedType/statement_mult/boolean.kt b/testData/ast/boxedType/statement/boolean.kt similarity index 100% rename from testData/ast/boxedType/statement_mult/boolean.kt rename to testData/ast/boxedType/statement/boolean.kt diff --git a/testData/ast/boxedType/statement_mult/byte.jav b/testData/ast/boxedType/statement/byte.jav similarity index 100% rename from testData/ast/boxedType/statement_mult/byte.jav rename to testData/ast/boxedType/statement/byte.jav diff --git a/testData/ast/boxedType/statement_mult/byte.kt b/testData/ast/boxedType/statement/byte.kt similarity index 100% rename from testData/ast/boxedType/statement_mult/byte.kt rename to testData/ast/boxedType/statement/byte.kt diff --git a/testData/ast/boxedType/statement_mult/character.jav b/testData/ast/boxedType/statement/character.jav similarity index 100% rename from testData/ast/boxedType/statement_mult/character.jav rename to testData/ast/boxedType/statement/character.jav diff --git a/testData/ast/boxedType/statement_mult/character.kt b/testData/ast/boxedType/statement/character.kt similarity index 100% rename from testData/ast/boxedType/statement_mult/character.kt rename to testData/ast/boxedType/statement/character.kt diff --git a/testData/ast/boxedType/statement_mult/double.jav b/testData/ast/boxedType/statement/double.jav similarity index 100% rename from testData/ast/boxedType/statement_mult/double.jav rename to testData/ast/boxedType/statement/double.jav diff --git a/testData/ast/boxedType/statement_mult/double.kt b/testData/ast/boxedType/statement/double.kt similarity index 100% rename from testData/ast/boxedType/statement_mult/double.kt rename to testData/ast/boxedType/statement/double.kt diff --git a/testData/ast/boxedType/statement_mult/float.jav b/testData/ast/boxedType/statement/float.jav similarity index 100% rename from testData/ast/boxedType/statement_mult/float.jav rename to testData/ast/boxedType/statement/float.jav diff --git a/testData/ast/boxedType/statement_mult/float.kt b/testData/ast/boxedType/statement/float.kt similarity index 100% rename from testData/ast/boxedType/statement_mult/float.kt rename to testData/ast/boxedType/statement/float.kt diff --git a/testData/ast/boxedType/statement_mult/integer.jav b/testData/ast/boxedType/statement/integer.jav similarity index 100% rename from testData/ast/boxedType/statement_mult/integer.jav rename to testData/ast/boxedType/statement/integer.jav diff --git a/testData/ast/boxedType/statement_mult/integer.kt b/testData/ast/boxedType/statement/integer.kt similarity index 100% rename from testData/ast/boxedType/statement_mult/integer.kt rename to testData/ast/boxedType/statement/integer.kt diff --git a/testData/ast/boxedType/statement_mult/long.jav b/testData/ast/boxedType/statement/long.jav similarity index 100% rename from testData/ast/boxedType/statement_mult/long.jav rename to testData/ast/boxedType/statement/long.jav diff --git a/testData/ast/boxedType/statement_mult/long.kt b/testData/ast/boxedType/statement/long.kt similarity index 100% rename from testData/ast/boxedType/statement_mult/long.kt rename to testData/ast/boxedType/statement/long.kt diff --git a/testData/ast/boxedType/statement_mult/object.jav b/testData/ast/boxedType/statement/object.jav similarity index 100% rename from testData/ast/boxedType/statement_mult/object.jav rename to testData/ast/boxedType/statement/object.jav diff --git a/testData/ast/boxedType/statement_mult/object.kt b/testData/ast/boxedType/statement/object.kt similarity index 100% rename from testData/ast/boxedType/statement_mult/object.kt rename to testData/ast/boxedType/statement/object.kt diff --git a/testData/ast/boxedType/statement_mult/short.jav b/testData/ast/boxedType/statement/short.jav similarity index 100% rename from testData/ast/boxedType/statement_mult/short.jav rename to testData/ast/boxedType/statement/short.jav diff --git a/testData/ast/boxedType/statement_mult/short.kt b/testData/ast/boxedType/statement/short.kt similarity index 100% rename from testData/ast/boxedType/statement_mult/short.kt rename to testData/ast/boxedType/statement/short.kt diff --git a/testData/ast/declarationStatement/statement_mult/multiplyFinalIntDeclaration.jav b/testData/ast/declarationStatement/statement/multiplyFinalIntDeclaration.jav similarity index 100% rename from testData/ast/declarationStatement/statement_mult/multiplyFinalIntDeclaration.jav rename to testData/ast/declarationStatement/statement/multiplyFinalIntDeclaration.jav diff --git a/testData/ast/declarationStatement/statement_mult/multiplyFinalIntDeclaration.kt b/testData/ast/declarationStatement/statement/multiplyFinalIntDeclaration.kt similarity index 100% rename from testData/ast/declarationStatement/statement_mult/multiplyFinalIntDeclaration.kt rename to testData/ast/declarationStatement/statement/multiplyFinalIntDeclaration.kt diff --git a/testData/ast/declarationStatement/statement_mult/multiplyIntDeclaration.jav b/testData/ast/declarationStatement/statement/multiplyIntDeclaration.jav similarity index 100% rename from testData/ast/declarationStatement/statement_mult/multiplyIntDeclaration.jav rename to testData/ast/declarationStatement/statement/multiplyIntDeclaration.jav diff --git a/testData/ast/declarationStatement/statement_mult/multiplyIntDeclaration.kt b/testData/ast/declarationStatement/statement/multiplyIntDeclaration.kt similarity index 100% rename from testData/ast/declarationStatement/statement_mult/multiplyIntDeclaration.kt rename to testData/ast/declarationStatement/statement/multiplyIntDeclaration.kt diff --git a/testData/ast/doWhileStatement/statement_mult/whileWithBlock.jav b/testData/ast/doWhileStatement/statement/whileWithBlock.jav similarity index 100% rename from testData/ast/doWhileStatement/statement_mult/whileWithBlock.jav rename to testData/ast/doWhileStatement/statement/whileWithBlock.jav diff --git a/testData/ast/doWhileStatement/statement_mult/whileWithBlock.kt b/testData/ast/doWhileStatement/statement/whileWithBlock.kt similarity index 100% rename from testData/ast/doWhileStatement/statement_mult/whileWithBlock.kt rename to testData/ast/doWhileStatement/statement/whileWithBlock.kt diff --git a/testData/ast/doWhileStatement/statement_mult/whileWithEmptyBlock.jav b/testData/ast/doWhileStatement/statement/whileWithEmptyBlock.jav similarity index 100% rename from testData/ast/doWhileStatement/statement_mult/whileWithEmptyBlock.jav rename to testData/ast/doWhileStatement/statement/whileWithEmptyBlock.jav diff --git a/testData/ast/doWhileStatement/statement_mult/whileWithEmptyBlock.kt b/testData/ast/doWhileStatement/statement/whileWithEmptyBlock.kt similarity index 100% rename from testData/ast/doWhileStatement/statement_mult/whileWithEmptyBlock.kt rename to testData/ast/doWhileStatement/statement/whileWithEmptyBlock.kt diff --git a/testData/ast/doWhileStatement/statement_mult/whileWithExpression.jav b/testData/ast/doWhileStatement/statement/whileWithExpression.jav similarity index 100% rename from testData/ast/doWhileStatement/statement_mult/whileWithExpression.jav rename to testData/ast/doWhileStatement/statement/whileWithExpression.jav diff --git a/testData/ast/doWhileStatement/statement_mult/whileWithExpression.kt b/testData/ast/doWhileStatement/statement/whileWithExpression.kt similarity index 100% rename from testData/ast/doWhileStatement/statement_mult/whileWithExpression.kt rename to testData/ast/doWhileStatement/statement/whileWithExpression.kt diff --git a/testData/ast/doWhileStatement/statement_mult/whileWithReturn.jav b/testData/ast/doWhileStatement/statement/whileWithReturn.jav similarity index 100% rename from testData/ast/doWhileStatement/statement_mult/whileWithReturn.jav rename to testData/ast/doWhileStatement/statement/whileWithReturn.jav diff --git a/testData/ast/doWhileStatement/statement_mult/whileWithReturn.kt b/testData/ast/doWhileStatement/statement/whileWithReturn.kt similarity index 100% rename from testData/ast/doWhileStatement/statement_mult/whileWithReturn.kt rename to testData/ast/doWhileStatement/statement/whileWithReturn.kt diff --git a/testData/ast/for/statement_mult/commonCaseForTest.jav b/testData/ast/for/statement/commonCaseForTest.jav similarity index 100% rename from testData/ast/for/statement_mult/commonCaseForTest.jav rename to testData/ast/for/statement/commonCaseForTest.jav diff --git a/testData/ast/for/statement_mult/commonCaseForTest.kt b/testData/ast/for/statement/commonCaseForTest.kt similarity index 100% rename from testData/ast/for/statement_mult/commonCaseForTest.kt rename to testData/ast/for/statement/commonCaseForTest.kt diff --git a/testData/ast/for/statement_mult/forWithBlock.jav b/testData/ast/for/statement/forWithBlock.jav similarity index 100% rename from testData/ast/for/statement_mult/forWithBlock.jav rename to testData/ast/for/statement/forWithBlock.jav diff --git a/testData/ast/for/statement_mult/forWithBlock.kt b/testData/ast/for/statement/forWithBlock.kt similarity index 100% rename from testData/ast/for/statement_mult/forWithBlock.kt rename to testData/ast/for/statement/forWithBlock.kt diff --git a/testData/ast/for/statement_mult/forWithBlockAndDoubleUpdate.jav b/testData/ast/for/statement/forWithBlockAndDoubleUpdate.jav similarity index 100% rename from testData/ast/for/statement_mult/forWithBlockAndDoubleUpdate.jav rename to testData/ast/for/statement/forWithBlockAndDoubleUpdate.jav diff --git a/testData/ast/for/statement_mult/forWithBlockAndDoubleUpdate.kt b/testData/ast/for/statement/forWithBlockAndDoubleUpdate.kt similarity index 100% rename from testData/ast/for/statement_mult/forWithBlockAndDoubleUpdate.kt rename to testData/ast/for/statement/forWithBlockAndDoubleUpdate.kt diff --git a/testData/ast/for/statement_mult/forWithEmptyBlock.jav b/testData/ast/for/statement/forWithEmptyBlock.jav similarity index 100% rename from testData/ast/for/statement_mult/forWithEmptyBlock.jav rename to testData/ast/for/statement/forWithEmptyBlock.jav diff --git a/testData/ast/for/statement_mult/forWithEmptyBlock.kt b/testData/ast/for/statement/forWithEmptyBlock.kt similarity index 100% rename from testData/ast/for/statement_mult/forWithEmptyBlock.kt rename to testData/ast/for/statement/forWithEmptyBlock.kt diff --git a/testData/ast/for/statement_mult/forWithExpression.jav b/testData/ast/for/statement/forWithExpression.jav similarity index 100% rename from testData/ast/for/statement_mult/forWithExpression.jav rename to testData/ast/for/statement/forWithExpression.jav diff --git a/testData/ast/for/statement_mult/forWithExpression.kt b/testData/ast/for/statement/forWithExpression.kt similarity index 100% rename from testData/ast/for/statement_mult/forWithExpression.kt rename to testData/ast/for/statement/forWithExpression.kt diff --git a/testData/ast/for/statement_mult/forWithReturn.jav b/testData/ast/for/statement/forWithReturn.jav similarity index 100% rename from testData/ast/for/statement_mult/forWithReturn.jav rename to testData/ast/for/statement/forWithReturn.jav diff --git a/testData/ast/for/statement_mult/forWithReturn.kt b/testData/ast/for/statement/forWithReturn.kt similarity index 100% rename from testData/ast/for/statement_mult/forWithReturn.kt rename to testData/ast/for/statement/forWithReturn.kt diff --git a/testData/ast/foreachStatement/statement_mult/enhancedForWithBlock.jav b/testData/ast/foreachStatement/statement/enhancedForWithBlock.jav similarity index 100% rename from testData/ast/foreachStatement/statement_mult/enhancedForWithBlock.jav rename to testData/ast/foreachStatement/statement/enhancedForWithBlock.jav diff --git a/testData/ast/foreachStatement/statement_mult/enhancedForWithBlock.kt b/testData/ast/foreachStatement/statement/enhancedForWithBlock.kt similarity index 100% rename from testData/ast/foreachStatement/statement_mult/enhancedForWithBlock.kt rename to testData/ast/foreachStatement/statement/enhancedForWithBlock.kt diff --git a/testData/ast/foreachStatement/statement_mult/enhancedForWithEmptyBlock.jav b/testData/ast/foreachStatement/statement/enhancedForWithEmptyBlock.jav similarity index 100% rename from testData/ast/foreachStatement/statement_mult/enhancedForWithEmptyBlock.jav rename to testData/ast/foreachStatement/statement/enhancedForWithEmptyBlock.jav diff --git a/testData/ast/foreachStatement/statement_mult/enhancedForWithEmptyBlock.kt b/testData/ast/foreachStatement/statement/enhancedForWithEmptyBlock.kt similarity index 100% rename from testData/ast/foreachStatement/statement_mult/enhancedForWithEmptyBlock.kt rename to testData/ast/foreachStatement/statement/enhancedForWithEmptyBlock.kt diff --git a/testData/ast/foreachStatement/statement_mult/enhancedForWithExpression.jav b/testData/ast/foreachStatement/statement/enhancedForWithExpression.jav similarity index 100% rename from testData/ast/foreachStatement/statement_mult/enhancedForWithExpression.jav rename to testData/ast/foreachStatement/statement/enhancedForWithExpression.jav diff --git a/testData/ast/foreachStatement/statement_mult/enhancedForWithExpression.kt b/testData/ast/foreachStatement/statement/enhancedForWithExpression.kt similarity index 100% rename from testData/ast/foreachStatement/statement_mult/enhancedForWithExpression.kt rename to testData/ast/foreachStatement/statement/enhancedForWithExpression.kt diff --git a/testData/ast/foreachStatement/statement_mult/enhancedForWithReturn.jav b/testData/ast/foreachStatement/statement/enhancedForWithReturn.jav similarity index 100% rename from testData/ast/foreachStatement/statement_mult/enhancedForWithReturn.jav rename to testData/ast/foreachStatement/statement/enhancedForWithReturn.jav diff --git a/testData/ast/foreachStatement/statement_mult/enhancedForWithReturn.kt b/testData/ast/foreachStatement/statement/enhancedForWithReturn.kt similarity index 100% rename from testData/ast/foreachStatement/statement_mult/enhancedForWithReturn.kt rename to testData/ast/foreachStatement/statement/enhancedForWithReturn.kt diff --git a/testData/ast/ifStatement/statement_mult/ifStatementWithEmptyBlocks.jav b/testData/ast/ifStatement/statement/ifStatementWithEmptyBlocks.jav similarity index 100% rename from testData/ast/ifStatement/statement_mult/ifStatementWithEmptyBlocks.jav rename to testData/ast/ifStatement/statement/ifStatementWithEmptyBlocks.jav diff --git a/testData/ast/ifStatement/statement_mult/ifStatementWithEmptyBlocks.kt b/testData/ast/ifStatement/statement/ifStatementWithEmptyBlocks.kt similarity index 100% rename from testData/ast/ifStatement/statement_mult/ifStatementWithEmptyBlocks.kt rename to testData/ast/ifStatement/statement/ifStatementWithEmptyBlocks.kt diff --git a/testData/ast/ifStatement/statement_mult/ifStatementWithMultilineBlocks.jav b/testData/ast/ifStatement/statement/ifStatementWithMultilineBlocks.jav similarity index 100% rename from testData/ast/ifStatement/statement_mult/ifStatementWithMultilineBlocks.jav rename to testData/ast/ifStatement/statement/ifStatementWithMultilineBlocks.jav diff --git a/testData/ast/ifStatement/statement_mult/ifStatementWithMultilineBlocks.kt b/testData/ast/ifStatement/statement/ifStatementWithMultilineBlocks.kt similarity index 100% rename from testData/ast/ifStatement/statement_mult/ifStatementWithMultilineBlocks.kt rename to testData/ast/ifStatement/statement/ifStatementWithMultilineBlocks.kt diff --git a/testData/ast/ifStatement/statement_mult/ifStatementWithOneLineBlocks.jav b/testData/ast/ifStatement/statement/ifStatementWithOneLineBlocks.jav similarity index 100% rename from testData/ast/ifStatement/statement_mult/ifStatementWithOneLineBlocks.jav rename to testData/ast/ifStatement/statement/ifStatementWithOneLineBlocks.jav diff --git a/testData/ast/ifStatement/statement_mult/ifStatementWithOneLineBlocks.kt b/testData/ast/ifStatement/statement/ifStatementWithOneLineBlocks.kt similarity index 100% rename from testData/ast/ifStatement/statement_mult/ifStatementWithOneLineBlocks.kt rename to testData/ast/ifStatement/statement/ifStatementWithOneLineBlocks.kt diff --git a/testData/ast/ifStatement/statement_mult/ifStatementWithoutElse.jav b/testData/ast/ifStatement/statement/ifStatementWithoutElse.jav similarity index 100% rename from testData/ast/ifStatement/statement_mult/ifStatementWithoutElse.jav rename to testData/ast/ifStatement/statement/ifStatementWithoutElse.jav diff --git a/testData/ast/ifStatement/statement_mult/ifStatementWithoutElse.kt b/testData/ast/ifStatement/statement/ifStatementWithoutElse.kt similarity index 100% rename from testData/ast/ifStatement/statement_mult/ifStatementWithoutElse.kt rename to testData/ast/ifStatement/statement/ifStatementWithoutElse.kt diff --git a/testData/ast/labelStatement/statement_mult/complicatedExampleFromJavaTutorial.jav b/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.jav similarity index 100% rename from testData/ast/labelStatement/statement_mult/complicatedExampleFromJavaTutorial.jav rename to testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.jav diff --git a/testData/ast/labelStatement/statement_mult/complicatedExampleFromJavaTutorial.kt b/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.kt similarity index 100% rename from testData/ast/labelStatement/statement_mult/complicatedExampleFromJavaTutorial.kt rename to testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.kt diff --git a/testData/ast/postfixOperator/statement_mult/decrement.jav b/testData/ast/postfixOperator/statement/decrement.jav similarity index 100% rename from testData/ast/postfixOperator/statement_mult/decrement.jav rename to testData/ast/postfixOperator/statement/decrement.jav diff --git a/testData/ast/postfixOperator/statement_mult/decrement.kt b/testData/ast/postfixOperator/statement/decrement.kt similarity index 100% rename from testData/ast/postfixOperator/statement_mult/decrement.kt rename to testData/ast/postfixOperator/statement/decrement.kt diff --git a/testData/ast/postfixOperator/statement_mult/increment.jav b/testData/ast/postfixOperator/statement/increment.jav similarity index 100% rename from testData/ast/postfixOperator/statement_mult/increment.jav rename to testData/ast/postfixOperator/statement/increment.jav diff --git a/testData/ast/postfixOperator/statement_mult/increment.kt b/testData/ast/postfixOperator/statement/increment.kt similarity index 100% rename from testData/ast/postfixOperator/statement_mult/increment.kt rename to testData/ast/postfixOperator/statement/increment.kt diff --git a/testData/ast/prefixOperator/statement_mult/decrement.jav b/testData/ast/prefixOperator/statement/decrement.jav similarity index 100% rename from testData/ast/prefixOperator/statement_mult/decrement.jav rename to testData/ast/prefixOperator/statement/decrement.jav diff --git a/testData/ast/prefixOperator/statement_mult/decrement.kt b/testData/ast/prefixOperator/statement/decrement.kt similarity index 100% rename from testData/ast/prefixOperator/statement_mult/decrement.kt rename to testData/ast/prefixOperator/statement/decrement.kt diff --git a/testData/ast/prefixOperator/statement_mult/increment.jav b/testData/ast/prefixOperator/statement/increment.jav similarity index 100% rename from testData/ast/prefixOperator/statement_mult/increment.jav rename to testData/ast/prefixOperator/statement/increment.jav diff --git a/testData/ast/prefixOperator/statement_mult/increment.kt b/testData/ast/prefixOperator/statement/increment.kt similarity index 100% rename from testData/ast/prefixOperator/statement_mult/increment.kt rename to testData/ast/prefixOperator/statement/increment.kt diff --git a/testData/ast/synchronizedStatement/statement/singleLineExample.kt b/testData/ast/synchronizedStatement/statement/singleLineExample.kt index 033b39c45cf..6665fbbba33 100644 --- a/testData/ast/synchronizedStatement/statement/singleLineExample.kt +++ b/testData/ast/synchronizedStatement/statement/singleLineExample.kt @@ -1 +1,3 @@ -synchronized (s) { doSomething(s) } \ No newline at end of file +synchronized (s) { +doSomething(s) +} \ No newline at end of file diff --git a/testData/ast/tryStatement/statement_mult/commonCaseForTryStatement.jav b/testData/ast/tryStatement/statement/commonCaseForTryStatement.jav similarity index 100% rename from testData/ast/tryStatement/statement_mult/commonCaseForTryStatement.jav rename to testData/ast/tryStatement/statement/commonCaseForTryStatement.jav diff --git a/testData/ast/tryStatement/statement_mult/commonCaseForTryStatement.kt b/testData/ast/tryStatement/statement/commonCaseForTryStatement.kt similarity index 100% rename from testData/ast/tryStatement/statement_mult/commonCaseForTryStatement.kt rename to testData/ast/tryStatement/statement/commonCaseForTryStatement.kt diff --git a/testData/ast/tryStatement/statement_mult/emptyTryWithTwoCatchesWithEmptyFinally.jav b/testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithEmptyFinally.jav similarity index 100% rename from testData/ast/tryStatement/statement_mult/emptyTryWithTwoCatchesWithEmptyFinally.jav rename to testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithEmptyFinally.jav diff --git a/testData/ast/tryStatement/statement_mult/emptyTryWithTwoCatchesWithEmptyFinally.kt b/testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithEmptyFinally.kt similarity index 100% rename from testData/ast/tryStatement/statement_mult/emptyTryWithTwoCatchesWithEmptyFinally.kt rename to testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithEmptyFinally.kt diff --git a/testData/ast/tryStatement/statement_mult/emptyTryWithTwoCatchesWithFinally.jav b/testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithFinally.jav similarity index 100% rename from testData/ast/tryStatement/statement_mult/emptyTryWithTwoCatchesWithFinally.jav rename to testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithFinally.jav diff --git a/testData/ast/tryStatement/statement_mult/emptyTryWithTwoCatchesWithFinally.kt b/testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithFinally.kt similarity index 100% rename from testData/ast/tryStatement/statement_mult/emptyTryWithTwoCatchesWithFinally.kt rename to testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithFinally.kt diff --git a/testData/ast/tryStatement/statement_mult/emptyTryWithTwoCatchesWithoutFinally.jav b/testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithoutFinally.jav similarity index 100% rename from testData/ast/tryStatement/statement_mult/emptyTryWithTwoCatchesWithoutFinally.jav rename to testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithoutFinally.jav diff --git a/testData/ast/tryStatement/statement_mult/emptyTryWithTwoCatchesWithoutFinally.kt b/testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithoutFinally.kt similarity index 100% rename from testData/ast/tryStatement/statement_mult/emptyTryWithTwoCatchesWithoutFinally.kt rename to testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithoutFinally.kt diff --git a/testData/ast/typeParameters/statement_mult/genericParam.jav b/testData/ast/typeParameters/statement/genericParam.jav similarity index 100% rename from testData/ast/typeParameters/statement_mult/genericParam.jav rename to testData/ast/typeParameters/statement/genericParam.jav diff --git a/testData/ast/typeParameters/statement_mult/genericParam.kt b/testData/ast/typeParameters/statement/genericParam.kt similarity index 100% rename from testData/ast/typeParameters/statement_mult/genericParam.kt rename to testData/ast/typeParameters/statement/genericParam.kt diff --git a/testData/ast/typeParameters/statement_mult/manyGenericParams.jav b/testData/ast/typeParameters/statement/manyGenericParams.jav similarity index 100% rename from testData/ast/typeParameters/statement_mult/manyGenericParams.jav rename to testData/ast/typeParameters/statement/manyGenericParams.jav diff --git a/testData/ast/typeParameters/statement_mult/manyGenericParams.kt b/testData/ast/typeParameters/statement/manyGenericParams.kt similarity index 100% rename from testData/ast/typeParameters/statement_mult/manyGenericParams.kt rename to testData/ast/typeParameters/statement/manyGenericParams.kt diff --git a/testData/ast/whileStatement/statement_mult/whileWithBlock.jav b/testData/ast/whileStatement/statement/whileWithBlock.jav similarity index 100% rename from testData/ast/whileStatement/statement_mult/whileWithBlock.jav rename to testData/ast/whileStatement/statement/whileWithBlock.jav diff --git a/testData/ast/whileStatement/statement_mult/whileWithBlock.kt b/testData/ast/whileStatement/statement/whileWithBlock.kt similarity index 100% rename from testData/ast/whileStatement/statement_mult/whileWithBlock.kt rename to testData/ast/whileStatement/statement/whileWithBlock.kt diff --git a/testData/ast/whileStatement/statement_mult/whileWithEmptyBlock.jav b/testData/ast/whileStatement/statement/whileWithEmptyBlock.jav similarity index 100% rename from testData/ast/whileStatement/statement_mult/whileWithEmptyBlock.jav rename to testData/ast/whileStatement/statement/whileWithEmptyBlock.jav diff --git a/testData/ast/whileStatement/statement_mult/whileWithEmptyBlock.kt b/testData/ast/whileStatement/statement/whileWithEmptyBlock.kt similarity index 100% rename from testData/ast/whileStatement/statement_mult/whileWithEmptyBlock.kt rename to testData/ast/whileStatement/statement/whileWithEmptyBlock.kt diff --git a/testData/ast/whileStatement/statement_mult/whileWithExpression.jav b/testData/ast/whileStatement/statement/whileWithExpression.jav similarity index 100% rename from testData/ast/whileStatement/statement_mult/whileWithExpression.jav rename to testData/ast/whileStatement/statement/whileWithExpression.jav diff --git a/testData/ast/whileStatement/statement_mult/whileWithExpression.kt b/testData/ast/whileStatement/statement/whileWithExpression.kt similarity index 100% rename from testData/ast/whileStatement/statement_mult/whileWithExpression.kt rename to testData/ast/whileStatement/statement/whileWithExpression.kt diff --git a/testData/ast/whileStatement/statement_mult/whileWithReturn.jav b/testData/ast/whileStatement/statement/whileWithReturn.jav similarity index 100% rename from testData/ast/whileStatement/statement_mult/whileWithReturn.jav rename to testData/ast/whileStatement/statement/whileWithReturn.jav diff --git a/testData/ast/whileStatement/statement_mult/whileWithReturn.kt b/testData/ast/whileStatement/statement/whileWithReturn.kt similarity index 100% rename from testData/ast/whileStatement/statement_mult/whileWithReturn.kt rename to testData/ast/whileStatement/statement/whileWithReturn.kt From 43013a6dc87ce1cde219e8bde98a96773f7c23d3 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 7 Nov 2011 14:07:42 +0400 Subject: [PATCH 065/206] abstract modifier added for classes and methods --- src/org/jetbrains/jet/j2k/Converter.java | 3 +++ src/org/jetbrains/jet/j2k/ast/Class.java | 7 +++++++ src/org/jetbrains/jet/j2k/ast/Field.java | 3 +++ src/org/jetbrains/jet/j2k/ast/Function.java | 3 +++ src/org/jetbrains/jet/j2k/ast/IMember.java | 2 ++ src/org/jetbrains/jet/j2k/ast/Member.java | 5 +++++ src/org/jetbrains/jet/j2k/ast/Trait.java | 4 ++++ .../jetbrains/jet/j2k/JavaToKotlinConverterTest.java | 5 ++++- testData/ast/class/class/abstractClass.jav | 7 +++++++ testData/ast/class/class/abstractClass.kt | 6 ++++++ testData/ast/class/class/abstractClassShape.jav | 12 ++++++++++++ testData/ast/class/class/abstractClassShape.kt | 10 ++++++++++ testData/ast/function/method/abstractMethod.jav | 1 + testData/ast/function/method/abstractMethod.kt | 1 + 14 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 testData/ast/class/class/abstractClass.jav create mode 100644 testData/ast/class/class/abstractClass.kt create mode 100644 testData/ast/class/class/abstractClassShape.jav create mode 100644 testData/ast/class/class/abstractClassShape.kt create mode 100644 testData/ast/function/method/abstractMethod.jav create mode 100644 testData/ast/function/method/abstractMethod.kt diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 9944ae30da0..9ba3e1b13a1 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -126,6 +126,8 @@ public class Converter { final Set modifiers = modifiersListToModifiersSet(method.getModifierList()); if (method.getHierarchicalMethodSignature().getSuperSignatures().size() > 0) modifiers.add(Modifier.OVERRIDE); + if (method.getParent() instanceof PsiClass && ((PsiClass) method.getParent()).isInterface()) + modifiers.remove(Modifier.ABSTRACT); if (method.isConstructor()) return new Constructor( @@ -288,6 +290,7 @@ public class Converter { public static Set modifiersListToModifiersSet(PsiModifierList modifierList) { HashSet modifiersSet = new HashSet(); if (modifierList != null) { + if (modifierList.hasModifierProperty(PsiModifier.ABSTRACT)) modifiersSet.add(Modifier.ABSTRACT); if (modifierList.hasModifierProperty(PsiModifier.FINAL)) modifiersSet.add(Modifier.FINAL); if (modifierList.hasModifierProperty(PsiModifier.STATIC)) modifiersSet.add(Modifier.STATIC); if (modifierList.hasModifierProperty(PsiModifier.PUBLIC)) modifiersSet.add(Modifier.PUBLIC); diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java index 87c05308f31..302c6c467ad 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -76,6 +76,9 @@ public class Class extends Member { String modifiersToKotlin() { List modifierList = new LinkedList(); + if (needAbstractModifier()) + modifierList.add(Modifier.ABSTRACT); + modifierList.add(accessModifier()); if (needOpenModifier()) @@ -91,6 +94,10 @@ public class Class extends Member { return !myModifiers.contains(Modifier.FINAL); } + boolean needAbstractModifier() { + return isAbstract(); + } + String bodyToKotlin() { return classObjectToKotlin() + N + AstUtil.joinNodes(getNonStatic(myFields), N) + N + diff --git a/src/org/jetbrains/jet/j2k/ast/Field.java b/src/org/jetbrains/jet/j2k/ast/Field.java index 8efc6b4fb8a..60839930067 100644 --- a/src/org/jetbrains/jet/j2k/ast/Field.java +++ b/src/org/jetbrains/jet/j2k/ast/Field.java @@ -25,6 +25,9 @@ public class Field extends Member { String modifiersToKotlin() { List modifierList = new LinkedList(); + if (isAbstract()) + modifierList.add(Modifier.ABSTRACT); + modifierList.add(accessModifier()); modifierList.add(myModifiers.contains(Modifier.FINAL) ? "val" : "var"); diff --git a/src/org/jetbrains/jet/j2k/ast/Function.java b/src/org/jetbrains/jet/j2k/ast/Function.java index cd9d435cf71..bfdfca1c769 100644 --- a/src/org/jetbrains/jet/j2k/ast/Function.java +++ b/src/org/jetbrains/jet/j2k/ast/Function.java @@ -51,6 +51,9 @@ public class Function extends Member { String modifiersToKotlin() { List modifierList = new LinkedList(); + if (isAbstract()) + modifierList.add(Modifier.ABSTRACT); + if (myModifiers.contains(Modifier.OVERRIDE)) modifierList.add(Modifier.OVERRIDE); diff --git a/src/org/jetbrains/jet/j2k/ast/IMember.java b/src/org/jetbrains/jet/j2k/ast/IMember.java index 98f4fb46a20..9c3b406f3be 100644 --- a/src/org/jetbrains/jet/j2k/ast/IMember.java +++ b/src/org/jetbrains/jet/j2k/ast/IMember.java @@ -5,4 +5,6 @@ package org.jetbrains.jet.j2k.ast; */ public interface IMember extends INode { public boolean isStatic(); + + boolean isAbstract(); } diff --git a/src/org/jetbrains/jet/j2k/ast/Member.java b/src/org/jetbrains/jet/j2k/ast/Member.java index a93b8104777..e0fff02e4c3 100644 --- a/src/org/jetbrains/jet/j2k/ast/Member.java +++ b/src/org/jetbrains/jet/j2k/ast/Member.java @@ -15,6 +15,11 @@ public abstract class Member extends Node implements IMember { return EMPTY; // package local converted to internal, but we use internal by default } + @Override + public boolean isAbstract() { + return myModifiers.contains(Modifier.ABSTRACT); + } + @Override public boolean isStatic() { return myModifiers.contains(Modifier.STATIC); diff --git a/src/org/jetbrains/jet/j2k/ast/Trait.java b/src/org/jetbrains/jet/j2k/ast/Trait.java index dcf23b4eca7..d450bef933d 100644 --- a/src/org/jetbrains/jet/j2k/ast/Trait.java +++ b/src/org/jetbrains/jet/j2k/ast/Trait.java @@ -17,4 +17,8 @@ public class Trait extends Class { boolean needOpenModifier() { return false; } + + boolean needAbstractModifier() { + return false; + } } diff --git a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java index cfbc8e24a8a..67b8a051b86 100644 --- a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java +++ b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java @@ -33,7 +33,10 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { String javaPath = getTestDataPath() + File.separator + getTestFilePath(); String kotlinPath = javaPath.replace(".jav", ".kt"); - final String expected = readFileToString(new File(kotlinPath)); + final File kotlinFile = new File(kotlinPath); + if (!kotlinFile.exists()) + writeStringToFile(kotlinFile, ""); + final String expected = readFileToString(kotlinFile); final File javaFile = new File(javaPath); final String javaCode = readFileToString(javaFile); diff --git a/testData/ast/class/class/abstractClass.jav b/testData/ast/class/class/abstractClass.jav new file mode 100644 index 00000000000..0ff487db135 --- /dev/null +++ b/testData/ast/class/class/abstractClass.jav @@ -0,0 +1,7 @@ +abstract class A { + abstract void callme(); + + void callmetoo() { + print("This is a concrete method."); + } +} \ No newline at end of file diff --git a/testData/ast/class/class/abstractClass.kt b/testData/ast/class/class/abstractClass.kt new file mode 100644 index 00000000000..38c5d667a48 --- /dev/null +++ b/testData/ast/class/class/abstractClass.kt @@ -0,0 +1,6 @@ +abstract open class A { +abstract fun callme() : Unit +fun callmetoo() : Unit { +print("This is a concrete method.") +} +} \ No newline at end of file diff --git a/testData/ast/class/class/abstractClassShape.jav b/testData/ast/class/class/abstractClassShape.jav new file mode 100644 index 00000000000..9cf102a0c6b --- /dev/null +++ b/testData/ast/class/class/abstractClassShape.jav @@ -0,0 +1,12 @@ +abstract class Shape { + public String color; + public Shape() { + } + public void setColor(String c) { + color = c; + } + public String getColor() { + return color; + } + abstract public double area(); +} \ No newline at end of file diff --git a/testData/ast/class/class/abstractClassShape.kt b/testData/ast/class/class/abstractClassShape.kt new file mode 100644 index 00000000000..9237e4ca894 --- /dev/null +++ b/testData/ast/class/class/abstractClassShape.kt @@ -0,0 +1,10 @@ +abstract open class Shape { +public var color : String? +public fun setColor(c : String?) : Unit { +color = c +} +public fun getColor() : String? { +return color +} +abstract public fun area() : Double +} \ No newline at end of file diff --git a/testData/ast/function/method/abstractMethod.jav b/testData/ast/function/method/abstractMethod.jav new file mode 100644 index 00000000000..03a2e8270c8 --- /dev/null +++ b/testData/ast/function/method/abstractMethod.jav @@ -0,0 +1 @@ +abstract int getNoofGears(); \ No newline at end of file diff --git a/testData/ast/function/method/abstractMethod.kt b/testData/ast/function/method/abstractMethod.kt new file mode 100644 index 00000000000..8163dfad9bb --- /dev/null +++ b/testData/ast/function/method/abstractMethod.kt @@ -0,0 +1 @@ +abstract fun getNoofGears() : Int \ No newline at end of file From b4d5ff5ff8bb7a7fc9b9b586e347b466e252d2f9 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 7 Nov 2011 14:16:21 +0400 Subject: [PATCH 066/206] >>> supported in polyadic and binary expressions --- .../jet/j2k/visitors/ExpressionVisitor.java | 64 +++++++------------ .../expression/unsignedRightShift.kt | 2 +- .../expression/unassignedShiftRight.jav | 1 + .../expression/unassignedShiftRight.kt | 1 + 4 files changed, 27 insertions(+), 41 deletions(-) create mode 100644 testData/ast/polyadicExpression/expression/unassignedShiftRight.jav create mode 100644 testData/ast/polyadicExpression/expression/unassignedShiftRight.kt diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 4483b754779..522f06a5398 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -47,42 +47,30 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { final IElementType tokenType = expression.getOperationSign().getTokenType(); - if (tokenType == JavaTokenType.GTGTGTEQ) { // because it's transform to the method call + String secondOp = ""; + if (tokenType == JavaTokenType.GTGTEQ) secondOp = "shr"; + if (tokenType == JavaTokenType.LTLTEQ) secondOp = "shl"; + if (tokenType == JavaTokenType.XOREQ) secondOp = "xor"; + if (tokenType == JavaTokenType.ANDEQ) secondOp = "and"; + if (tokenType == JavaTokenType.OREQ) secondOp = "or"; + if (tokenType == JavaTokenType.GTGTGTEQ) secondOp = "cyclicShiftRight"; + + if (!secondOp.equals("")) // if not Kotlin operators myResult = new AssignmentExpression( expressionToExpression(expression.getLExpression()), - new DummyMethodCallExpression( + new BinaryExpression( expressionToExpression(expression.getLExpression()), - "cyclicShiftRight", - expressionToExpression(expression.getRExpression()) + expressionToExpression(expression.getRExpression()), + secondOp ), "=" ); - } else { - - String secondOp = ""; - if (tokenType == JavaTokenType.GTGTEQ) secondOp = "shr"; - if (tokenType == JavaTokenType.LTLTEQ) secondOp = "shl"; - if (tokenType == JavaTokenType.XOREQ) secondOp = "xor"; - if (tokenType == JavaTokenType.ANDEQ) secondOp = "and"; - if (tokenType == JavaTokenType.OREQ) secondOp = "or"; - - if (!secondOp.equals("")) // if not Kotlin operators - myResult = new AssignmentExpression( - expressionToExpression(expression.getLExpression()), - new BinaryExpression( - expressionToExpression(expression.getLExpression()), - expressionToExpression(expression.getRExpression()), - secondOp - ), - "=" - ); - else - myResult = new AssignmentExpression( - expressionToExpression(expression.getLExpression()), - expressionToExpression(expression.getRExpression()), - expression.getOperationSign().getText() // TODO - ); - } + else + myResult = new AssignmentExpression( + expressionToExpression(expression.getLExpression()), + expressionToExpression(expression.getRExpression()), + expression.getOperationSign().getText() // TODO + ); } @NotNull @@ -97,7 +85,7 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { if (tokenType == JavaTokenType.XOR) return "xor"; if (tokenType == JavaTokenType.AND) return "and"; if (tokenType == JavaTokenType.OR) return "or"; - if (tokenType == JavaTokenType.OR) return "or"; + if (tokenType == JavaTokenType.GTGTGT) return "cyclicShiftRight"; if (tokenType == JavaTokenType.GT) return ">"; if (tokenType == JavaTokenType.LT) return "<"; if (tokenType == JavaTokenType.GE) return ">="; @@ -266,13 +254,9 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { @Override public void visitPolyadicExpression(PsiPolyadicExpression expression) { super.visitPolyadicExpression(expression); - if (expression.getOperationTokenType() != JavaTokenType.GTGTGT) - myResult = new PolyadicExpression( - expressionsToExpressionList(expression.getOperands()), - getOperatorString(expression.getOperationTokenType()) - ); - else { - // TODO: support GTGTGT - } - } + myResult = new PolyadicExpression( + expressionsToExpressionList(expression.getOperands()), + getOperatorString(expression.getOperationTokenType()) + ); } +} diff --git a/testData/ast/assignmentExpression/expression/unsignedRightShift.kt b/testData/ast/assignmentExpression/expression/unsignedRightShift.kt index ce853a663b7..bf15c8f56c5 100644 --- a/testData/ast/assignmentExpression/expression/unsignedRightShift.kt +++ b/testData/ast/assignmentExpression/expression/unsignedRightShift.kt @@ -1 +1 @@ -x = x.cyclicShiftRight(2) \ No newline at end of file +x = (x cyclicShiftRight 2) \ No newline at end of file diff --git a/testData/ast/polyadicExpression/expression/unassignedShiftRight.jav b/testData/ast/polyadicExpression/expression/unassignedShiftRight.jav new file mode 100644 index 00000000000..c9745ec8062 --- /dev/null +++ b/testData/ast/polyadicExpression/expression/unassignedShiftRight.jav @@ -0,0 +1 @@ +1 >>> 2 >>> 3 \ No newline at end of file diff --git a/testData/ast/polyadicExpression/expression/unassignedShiftRight.kt b/testData/ast/polyadicExpression/expression/unassignedShiftRight.kt new file mode 100644 index 00000000000..789248920ea --- /dev/null +++ b/testData/ast/polyadicExpression/expression/unassignedShiftRight.kt @@ -0,0 +1 @@ +(1 cyclicShiftRight 2 cyclicShiftRight 3) \ No newline at end of file From 8f1727882a6c090a4aafe6c9e36e2c0afc60c3b3 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 7 Nov 2011 15:22:36 +0400 Subject: [PATCH 067/206] nullable safe calls supported (only for fields) --- src/org/jetbrains/jet/j2k/ast/CallChain.java | 32 +++++++++++++++++++ src/org/jetbrains/jet/j2k/ast/Expression.java | 13 ++++++++ .../jetbrains/jet/j2k/ast/IdentifierImpl.java | 11 +++++++ src/org/jetbrains/jet/j2k/ast/Node.java | 1 + .../jet/j2k/visitors/ExpressionVisitor.java | 6 +++- .../ast/callChain/file/libraryFieldCall.jav | 9 ++++++ .../ast/callChain/file/libraryFieldCall.kt | 12 +++++++ testData/ast/callChain/statement/sout.jav | 1 + testData/ast/callChain/statement/sout.kt | 1 + .../ast/enum/class/runnableImplementation.kt | 2 +- .../complicatedExampleFromJavaTutorial.kt | 2 +- .../expression/parenthesized2.jav | 2 +- .../expression/parenthesized2.kt | 2 +- 13 files changed, 89 insertions(+), 5 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/CallChain.java create mode 100644 testData/ast/callChain/file/libraryFieldCall.jav create mode 100644 testData/ast/callChain/file/libraryFieldCall.kt create mode 100644 testData/ast/callChain/statement/sout.jav create mode 100644 testData/ast/callChain/statement/sout.kt diff --git a/src/org/jetbrains/jet/j2k/ast/CallChain.java b/src/org/jetbrains/jet/j2k/ast/CallChain.java new file mode 100644 index 00000000000..e53d6f85bb6 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/CallChain.java @@ -0,0 +1,32 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class CallChain extends Expression { + private Expression myExpression; + private IdentifierImpl myIdentifier; + + public CallChain(Expression expression, IdentifierImpl identifier) { + myExpression = expression; + myIdentifier = identifier; + } + + @Override + public boolean isNullable() { + return myIdentifier.isNullable(); + } + + @NotNull + @Override + public String toKotlin() { + if (!myExpression.isEmpty()) + if (myExpression.isNullable()) + return myExpression.toKotlin() + QUESTDOT + myIdentifier.toKotlin(); + else + return myExpression.toKotlin() + DOT + myIdentifier.toKotlin(); + return myIdentifier.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/Expression.java b/src/org/jetbrains/jet/j2k/ast/Expression.java index a18e4322dfd..b557b85ad63 100644 --- a/src/org/jetbrains/jet/j2k/ast/Expression.java +++ b/src/org/jetbrains/jet/j2k/ast/Expression.java @@ -17,5 +17,18 @@ public abstract class Expression extends Statement { public String toKotlin() { return EMPTY; } + + @Override + public boolean isEmpty() { + return true; + } + } + + public boolean isNullable() { + return false; + } + + public boolean isEmpty() { + return false; } } diff --git a/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java b/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java index a17b486ed9b..dd631e04846 100644 --- a/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java +++ b/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java @@ -7,11 +7,17 @@ import org.jetbrains.annotations.NotNull; */ public class IdentifierImpl extends Expression implements Identifier { private final String myName; + private boolean myNullable = true; public IdentifierImpl(String name) { myName = name; } + public IdentifierImpl(String name, boolean nullable) { + myName = name; + myNullable = nullable; + } + @Override public String getName() { return myName; @@ -26,6 +32,11 @@ public class IdentifierImpl extends Expression implements Identifier { return BACKTICK + str + BACKTICK; } + @Override + public boolean isNullable() { + return myNullable; + } + @NotNull @Override public String toKotlin() { diff --git a/src/org/jetbrains/jet/j2k/ast/Node.java b/src/org/jetbrains/jet/j2k/ast/Node.java index 954a77ba3b8..17f454d112a 100644 --- a/src/org/jetbrains/jet/j2k/ast/Node.java +++ b/src/org/jetbrains/jet/j2k/ast/Node.java @@ -33,6 +33,7 @@ public abstract class Node implements INode { static final String EQUAL = "="; static final String EMPTY = ""; static final String DOT = "."; + static final String QUESTDOT = "?."; static final String COLON = ":"; static final String IN = "in"; static final String AT = "@"; diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 522f06a5398..947e9550a65 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -225,7 +225,11 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { @Override public void visitReferenceExpression(PsiReferenceExpression expression) { super.visitReferenceExpression(expression); - myResult = new IdentifierImpl(expression.getQualifiedName()); // TODO + final IdentifierImpl identifier = expression.getType() != null ? // TODO: if type exists so id is nullable + new IdentifierImpl(expression.getReferenceName()) : + new IdentifierImpl(expression.getReferenceName(), false); + + myResult = new CallChain(expressionToExpression(expression.getQualifierExpression()), identifier); } @Override diff --git a/testData/ast/callChain/file/libraryFieldCall.jav b/testData/ast/callChain/file/libraryFieldCall.jav new file mode 100644 index 00000000000..2278e35a1bc --- /dev/null +++ b/testData/ast/callChain/file/libraryFieldCall.jav @@ -0,0 +1,9 @@ +class Library { + final static java.io.PrintStream ourOut; +} + +class User { + void main() { + Library.ourOut.print(); + } +} \ No newline at end of file diff --git a/testData/ast/callChain/file/libraryFieldCall.kt b/testData/ast/callChain/file/libraryFieldCall.kt new file mode 100644 index 00000000000..c77bf3464a2 --- /dev/null +++ b/testData/ast/callChain/file/libraryFieldCall.kt @@ -0,0 +1,12 @@ +namespace { +open class Library { +class object { +val ourOut : PrintStream? +} +} +open class User { +fun main() : Unit { +Library.ourOut?.print() +} +} +} \ No newline at end of file diff --git a/testData/ast/callChain/statement/sout.jav b/testData/ast/callChain/statement/sout.jav new file mode 100644 index 00000000000..a16cbe89562 --- /dev/null +++ b/testData/ast/callChain/statement/sout.jav @@ -0,0 +1 @@ +System.out.println("Hello, world"); \ No newline at end of file diff --git a/testData/ast/callChain/statement/sout.kt b/testData/ast/callChain/statement/sout.kt new file mode 100644 index 00000000000..fcb68d6e04d --- /dev/null +++ b/testData/ast/callChain/statement/sout.kt @@ -0,0 +1 @@ +System.`out`?.println("Hello, world") \ No newline at end of file diff --git a/testData/ast/enum/class/runnableImplementation.kt b/testData/ast/enum/class/runnableImplementation.kt index 912272d9e94..36d35060e78 100644 --- a/testData/ast/enum/class/runnableImplementation.kt +++ b/testData/ast/enum/class/runnableImplementation.kt @@ -5,6 +5,6 @@ RED YELLOW BLUE override public fun run() : Unit { -System.out.println(("name()=" + name() + ", toString()=" + toString())) +System.`out`?.println(("name()=" + name() + ", toString()=" + toString())) } } \ No newline at end of file diff --git a/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.kt b/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.kt index 9451018950a..4959a4593a2 100644 --- a/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.kt +++ b/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.kt @@ -21,7 +21,7 @@ break@test } } } -System.out.println((if (foundIt) +System.`out`?.println((if (foundIt) "Found it" else "Didn't find it")) \ No newline at end of file diff --git a/testData/ast/parenthesizedExpression/expression/parenthesized2.jav b/testData/ast/parenthesizedExpression/expression/parenthesized2.jav index 390ddb6f123..01d3d19b7d8 100644 --- a/testData/ast/parenthesizedExpression/expression/parenthesized2.jav +++ b/testData/ast/parenthesizedExpression/expression/parenthesized2.jav @@ -1 +1 @@ -(o.toString() + "abc") \ No newline at end of file +(str.toString() + "abc") \ No newline at end of file diff --git a/testData/ast/parenthesizedExpression/expression/parenthesized2.kt b/testData/ast/parenthesizedExpression/expression/parenthesized2.kt index 53aa2923a2c..42a621de6bb 100644 --- a/testData/ast/parenthesizedExpression/expression/parenthesized2.kt +++ b/testData/ast/parenthesizedExpression/expression/parenthesized2.kt @@ -1 +1 @@ -((o.toString() + "abc")) \ No newline at end of file +((str.toString() + "abc")) \ No newline at end of file From 510fb25e806503d42d18be45edd7e5b42a634c86 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 7 Nov 2011 15:58:32 +0400 Subject: [PATCH 068/206] nullable safe calls supported (for methods and instances) --- .../jet/j2k/ast/MethodCallExpression.java | 9 ++++++++- .../jetbrains/jet/j2k/ast/PrimitiveType.java | 5 +++++ src/org/jetbrains/jet/j2k/ast/Type.java | 7 ++++++- .../jet/j2k/visitors/ExpressionVisitor.java | 13 +++++++------ .../ast/callChain/file/libraryMethodCall.jav | 12 ++++++++++++ .../ast/callChain/file/libraryMethodCall.kt | 17 +++++++++++++++++ .../file/libraryMethodCallFromInstance.jav | 16 ++++++++++++++++ .../file/libraryMethodCallFromInstance.kt | 18 ++++++++++++++++++ .../callChain/file/libraryStringFieldCall.jav | 9 +++++++++ .../callChain/file/libraryStringFieldCall.kt | 10 ++++++++++ 10 files changed, 108 insertions(+), 8 deletions(-) create mode 100644 testData/ast/callChain/file/libraryMethodCall.jav create mode 100644 testData/ast/callChain/file/libraryMethodCall.kt create mode 100644 testData/ast/callChain/file/libraryMethodCallFromInstance.jav create mode 100644 testData/ast/callChain/file/libraryMethodCallFromInstance.kt create mode 100644 testData/ast/callChain/file/libraryStringFieldCall.jav create mode 100644 testData/ast/callChain/file/libraryStringFieldCall.kt diff --git a/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java b/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java index 9178f9ef278..78f65584a21 100644 --- a/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java @@ -8,10 +8,17 @@ import org.jetbrains.annotations.NotNull; public class MethodCallExpression extends Expression { private final Expression myMethodCall; private final Element myParamList; + private boolean myIsResultNullable; - public MethodCallExpression(Expression methodCall, Element paramList) { + public MethodCallExpression(Expression methodCall, Element paramList, boolean nullable) { myMethodCall = methodCall; myParamList = paramList; + myIsResultNullable = nullable; + } + + @Override + public boolean isNullable() { + return myIsResultNullable; } @NotNull diff --git a/src/org/jetbrains/jet/j2k/ast/PrimitiveType.java b/src/org/jetbrains/jet/j2k/ast/PrimitiveType.java index cb862c0b11c..9a84b467fa2 100644 --- a/src/org/jetbrains/jet/j2k/ast/PrimitiveType.java +++ b/src/org/jetbrains/jet/j2k/ast/PrimitiveType.java @@ -12,6 +12,11 @@ public class PrimitiveType extends Type { myType = type; } + @Override + public boolean isNullable() { + return false; + } + @NotNull @Override public String toKotlin() { diff --git a/src/org/jetbrains/jet/j2k/ast/Type.java b/src/org/jetbrains/jet/j2k/ast/Type.java index fa6160c5bb3..e8f27fd9eb1 100644 --- a/src/org/jetbrains/jet/j2k/ast/Type.java +++ b/src/org/jetbrains/jet/j2k/ast/Type.java @@ -19,7 +19,7 @@ public abstract class Type extends Element { myNullable = nullable; } - boolean isNullable() { + public boolean isNullable() { return myNullable; } @@ -36,5 +36,10 @@ public abstract class Type extends Element { public String toKotlin() { return "UNRESOLVED_TYPE"; } + + @Override + public boolean isNullable() { + return false; + } } } diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 947e9550a65..9af9ed3a73f 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -165,7 +165,8 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { myResult = // TODO: not resolved new MethodCallExpression( expressionToExpression(expression.getMethodExpression()), - elementToElement(expression.getArgumentList()) + elementToElement(expression.getArgumentList()), + typeToType(expression.getType()).isNullable() ); } @@ -225,11 +226,11 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { @Override public void visitReferenceExpression(PsiReferenceExpression expression) { super.visitReferenceExpression(expression); - final IdentifierImpl identifier = expression.getType() != null ? // TODO: if type exists so id is nullable - new IdentifierImpl(expression.getReferenceName()) : - new IdentifierImpl(expression.getReferenceName(), false); - - myResult = new CallChain(expressionToExpression(expression.getQualifierExpression()), identifier); + boolean isNullable = typeToType(expression.getType()).isNullable(); + myResult = new CallChain( + expressionToExpression(expression.getQualifierExpression()), + new IdentifierImpl(expression.getReferenceName(), isNullable) // TODO: if type exists so id is nullable + ); } @Override diff --git a/testData/ast/callChain/file/libraryMethodCall.jav b/testData/ast/callChain/file/libraryMethodCall.jav new file mode 100644 index 00000000000..265696edc72 --- /dev/null +++ b/testData/ast/callChain/file/libraryMethodCall.jav @@ -0,0 +1,12 @@ +class Library { + static void call() {} + + static String getString() { return ""; } +} + +class User { + void main() { + Library.call(); + Library.getString().isEmpty(); + } +} \ No newline at end of file diff --git a/testData/ast/callChain/file/libraryMethodCall.kt b/testData/ast/callChain/file/libraryMethodCall.kt new file mode 100644 index 00000000000..f5e0204d979 --- /dev/null +++ b/testData/ast/callChain/file/libraryMethodCall.kt @@ -0,0 +1,17 @@ +namespace { +open class Library { +class object { +fun call() : Unit { +} +fun getString() : String? { +return "" +} +} +} +open class User { +fun main() : Unit { +Library.call() +Library.getString()?.isEmpty() +} +} +} \ No newline at end of file diff --git a/testData/ast/callChain/file/libraryMethodCallFromInstance.jav b/testData/ast/callChain/file/libraryMethodCallFromInstance.jav new file mode 100644 index 00000000000..3a22446070d --- /dev/null +++ b/testData/ast/callChain/file/libraryMethodCallFromInstance.jav @@ -0,0 +1,16 @@ +class Library { + void call() {} + + String getString() { return ""; } +} + +class User { + void main() { + Library lib = new Library(); + lib.call(); + lib.getString().isEmpty(); + + new Library().call(); + new Library().getString().isEmpty(); + } +} \ No newline at end of file diff --git a/testData/ast/callChain/file/libraryMethodCallFromInstance.kt b/testData/ast/callChain/file/libraryMethodCallFromInstance.kt new file mode 100644 index 00000000000..0160fa34117 --- /dev/null +++ b/testData/ast/callChain/file/libraryMethodCallFromInstance.kt @@ -0,0 +1,18 @@ +namespace { +open class Library { +fun call() : Unit { +} +fun getString() : String? { +return "" +} +} +open class User { +fun main() : Unit { +var lib : Library? = Library() +lib?.call() +lib?.getString()?.isEmpty() +Library().call() +Library().getString()?.isEmpty() +} +} +} \ No newline at end of file diff --git a/testData/ast/callChain/file/libraryStringFieldCall.jav b/testData/ast/callChain/file/libraryStringFieldCall.jav new file mode 100644 index 00000000000..67d826da1d9 --- /dev/null +++ b/testData/ast/callChain/file/libraryStringFieldCall.jav @@ -0,0 +1,9 @@ +class Library { + final public String myString; +} + +class User { + void main() { + Library.myString.isEmpty(); + } +} \ No newline at end of file diff --git a/testData/ast/callChain/file/libraryStringFieldCall.kt b/testData/ast/callChain/file/libraryStringFieldCall.kt new file mode 100644 index 00000000000..382a87f7797 --- /dev/null +++ b/testData/ast/callChain/file/libraryStringFieldCall.kt @@ -0,0 +1,10 @@ +namespace { +open class Library { +public val myString : String? +} +open class User { +fun main() : Unit { +Library.myString?.isEmpty() +} +} +} \ No newline at end of file From 029e0dc9a981861f99570980b6e6f6cd4ba4fd91 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 7 Nov 2011 16:29:01 +0400 Subject: [PATCH 069/206] added test for full path constructor invocation --- .../ast/{CallChain.java => CallChainExpression.java} | 4 ++-- .../jetbrains/jet/j2k/visitors/ExpressionVisitor.java | 2 +- .../file/libraryFieldCall.jav | 0 .../file/libraryFieldCall.kt | 0 .../file/libraryMethodCall.jav | 0 .../file/libraryMethodCall.kt | 0 .../file/libraryMethodCallFromInstance.jav | 0 .../file/libraryMethodCallFromInstance.kt | 0 .../file/libraryStringFieldCall.jav | 0 .../file/libraryStringFieldCall.kt | 0 .../statement/sout.jav | 0 .../statement/sout.kt | 0 .../ast/newClassExpression/file/newClassByFullName.jav | 10 ++++++++++ .../ast/newClassExpression/file/newClassByFullName.kt | 9 +++++++++ 14 files changed, 22 insertions(+), 3 deletions(-) rename src/org/jetbrains/jet/j2k/ast/{CallChain.java => CallChainExpression.java} (82%) rename testData/ast/{callChain => callChainExpression}/file/libraryFieldCall.jav (100%) rename testData/ast/{callChain => callChainExpression}/file/libraryFieldCall.kt (100%) rename testData/ast/{callChain => callChainExpression}/file/libraryMethodCall.jav (100%) rename testData/ast/{callChain => callChainExpression}/file/libraryMethodCall.kt (100%) rename testData/ast/{callChain => callChainExpression}/file/libraryMethodCallFromInstance.jav (100%) rename testData/ast/{callChain => callChainExpression}/file/libraryMethodCallFromInstance.kt (100%) rename testData/ast/{callChain => callChainExpression}/file/libraryStringFieldCall.jav (100%) rename testData/ast/{callChain => callChainExpression}/file/libraryStringFieldCall.kt (100%) rename testData/ast/{callChain => callChainExpression}/statement/sout.jav (100%) rename testData/ast/{callChain => callChainExpression}/statement/sout.kt (100%) create mode 100644 testData/ast/newClassExpression/file/newClassByFullName.jav create mode 100644 testData/ast/newClassExpression/file/newClassByFullName.kt diff --git a/src/org/jetbrains/jet/j2k/ast/CallChain.java b/src/org/jetbrains/jet/j2k/ast/CallChainExpression.java similarity index 82% rename from src/org/jetbrains/jet/j2k/ast/CallChain.java rename to src/org/jetbrains/jet/j2k/ast/CallChainExpression.java index e53d6f85bb6..ae57d9a119a 100644 --- a/src/org/jetbrains/jet/j2k/ast/CallChain.java +++ b/src/org/jetbrains/jet/j2k/ast/CallChainExpression.java @@ -5,11 +5,11 @@ import org.jetbrains.annotations.NotNull; /** * @author ignatov */ -public class CallChain extends Expression { +public class CallChainExpression extends Expression { private Expression myExpression; private IdentifierImpl myIdentifier; - public CallChain(Expression expression, IdentifierImpl identifier) { + public CallChainExpression(Expression expression, IdentifierImpl identifier) { myExpression = expression; myIdentifier = identifier; } diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 9af9ed3a73f..cb40da43b4f 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -227,7 +227,7 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { public void visitReferenceExpression(PsiReferenceExpression expression) { super.visitReferenceExpression(expression); boolean isNullable = typeToType(expression.getType()).isNullable(); - myResult = new CallChain( + myResult = new CallChainExpression( expressionToExpression(expression.getQualifierExpression()), new IdentifierImpl(expression.getReferenceName(), isNullable) // TODO: if type exists so id is nullable ); diff --git a/testData/ast/callChain/file/libraryFieldCall.jav b/testData/ast/callChainExpression/file/libraryFieldCall.jav similarity index 100% rename from testData/ast/callChain/file/libraryFieldCall.jav rename to testData/ast/callChainExpression/file/libraryFieldCall.jav diff --git a/testData/ast/callChain/file/libraryFieldCall.kt b/testData/ast/callChainExpression/file/libraryFieldCall.kt similarity index 100% rename from testData/ast/callChain/file/libraryFieldCall.kt rename to testData/ast/callChainExpression/file/libraryFieldCall.kt diff --git a/testData/ast/callChain/file/libraryMethodCall.jav b/testData/ast/callChainExpression/file/libraryMethodCall.jav similarity index 100% rename from testData/ast/callChain/file/libraryMethodCall.jav rename to testData/ast/callChainExpression/file/libraryMethodCall.jav diff --git a/testData/ast/callChain/file/libraryMethodCall.kt b/testData/ast/callChainExpression/file/libraryMethodCall.kt similarity index 100% rename from testData/ast/callChain/file/libraryMethodCall.kt rename to testData/ast/callChainExpression/file/libraryMethodCall.kt diff --git a/testData/ast/callChain/file/libraryMethodCallFromInstance.jav b/testData/ast/callChainExpression/file/libraryMethodCallFromInstance.jav similarity index 100% rename from testData/ast/callChain/file/libraryMethodCallFromInstance.jav rename to testData/ast/callChainExpression/file/libraryMethodCallFromInstance.jav diff --git a/testData/ast/callChain/file/libraryMethodCallFromInstance.kt b/testData/ast/callChainExpression/file/libraryMethodCallFromInstance.kt similarity index 100% rename from testData/ast/callChain/file/libraryMethodCallFromInstance.kt rename to testData/ast/callChainExpression/file/libraryMethodCallFromInstance.kt diff --git a/testData/ast/callChain/file/libraryStringFieldCall.jav b/testData/ast/callChainExpression/file/libraryStringFieldCall.jav similarity index 100% rename from testData/ast/callChain/file/libraryStringFieldCall.jav rename to testData/ast/callChainExpression/file/libraryStringFieldCall.jav diff --git a/testData/ast/callChain/file/libraryStringFieldCall.kt b/testData/ast/callChainExpression/file/libraryStringFieldCall.kt similarity index 100% rename from testData/ast/callChain/file/libraryStringFieldCall.kt rename to testData/ast/callChainExpression/file/libraryStringFieldCall.kt diff --git a/testData/ast/callChain/statement/sout.jav b/testData/ast/callChainExpression/statement/sout.jav similarity index 100% rename from testData/ast/callChain/statement/sout.jav rename to testData/ast/callChainExpression/statement/sout.jav diff --git a/testData/ast/callChain/statement/sout.kt b/testData/ast/callChainExpression/statement/sout.kt similarity index 100% rename from testData/ast/callChain/statement/sout.kt rename to testData/ast/callChainExpression/statement/sout.kt diff --git a/testData/ast/newClassExpression/file/newClassByFullName.jav b/testData/ast/newClassExpression/file/newClassByFullName.jav new file mode 100644 index 00000000000..486db1bec93 --- /dev/null +++ b/testData/ast/newClassExpression/file/newClassByFullName.jav @@ -0,0 +1,10 @@ +package org.test + +class Library {} +} + +class User { + void main() { + Library lib = new Library(); + } +} \ No newline at end of file diff --git a/testData/ast/newClassExpression/file/newClassByFullName.kt b/testData/ast/newClassExpression/file/newClassByFullName.kt new file mode 100644 index 00000000000..9ce9a5525b4 --- /dev/null +++ b/testData/ast/newClassExpression/file/newClassByFullName.kt @@ -0,0 +1,9 @@ +namespace org.test { +open class Library { +} +open class User { +fun main() : Unit { +var lib : Library? = org.test.Library() +} +} +} \ No newline at end of file From 4bab2ba87755d617e274dbb9807b7cbc2f0f617c Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 7 Nov 2011 16:50:40 +0400 Subject: [PATCH 070/206] cleanup --- src/org/jetbrains/jet/j2k/Converter.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 9ba3e1b13a1..a67abfd0508 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -46,17 +46,14 @@ public class Converter { final List fields = fieldsToFieldList(psiClass.getAllFields()); final List typeParameters = elementsToElementList(psiClass.getTypeParameters()); final List implementsTypes = typesToNotNullableTypeList(psiClass.getImplementsListTypes()); - final List extendsListTypes = new LinkedList(); - for (PsiClassType e : psiClass.getExtendsListTypes()) - if (!e.getCanonicalText().equals("java.lang.Enum")) - extendsListTypes.add(e); - final List extendsTypes = typesToNotNullableTypeList(extendsListTypes.toArray(new PsiType[extendsListTypes.size()])); + final List extendsTypes = typesToNotNullableTypeList(psiClass.getExtendsListTypes()); final IdentifierImpl name = new IdentifierImpl(psiClass.getName()); if (psiClass.isInterface()) return new Trait(name, modifiers, typeParameters, extendsTypes, implementsTypes, innerClasses, methods, fields); if (psiClass.isEnum()) - return new Enum(name, modifiers, typeParameters, new LinkedList(), implementsTypes, innerClasses, methods, fieldsToFieldListForEnums(psiClass.getAllFields())); + return new Enum(name, modifiers, typeParameters, new LinkedList(), implementsTypes, + innerClasses, methods, fieldsToFieldListForEnums(psiClass.getAllFields())); return new Class(name, modifiers, typeParameters, extendsTypes, implementsTypes, innerClasses, methods, fields); } @@ -258,7 +255,7 @@ public class Converter { @NotNull private static Import importToImport(PsiImportStatementBase t) { - if (t.getImportReference() != null) + if (t != null && t.getImportReference() != null) return new Import(t.getImportReference().getQualifiedName()); // TODO: use identifier return new Import(""); } From 15cad77cd06afba2de7371c2b57a03af1df1208d Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 7 Nov 2011 17:14:36 +0400 Subject: [PATCH 071/206] super expression added --- .../jet/j2k/ast/SuperExpression.java | 20 +++++++++++++++++++ .../jet/j2k/visitors/ExpressionVisitor.java | 1 + .../superExpression/class/classAextendsB.jav | 11 ++++++++++ .../superExpression/class/classAextendsB.kt | 9 +++++++++ .../statement/superStatement.jav | 1 + .../statement/superStatement.kt | 1 + 6 files changed, 43 insertions(+) create mode 100644 src/org/jetbrains/jet/j2k/ast/SuperExpression.java create mode 100644 testData/ast/superExpression/class/classAextendsB.jav create mode 100644 testData/ast/superExpression/class/classAextendsB.kt create mode 100644 testData/ast/superExpression/statement/superStatement.jav create mode 100644 testData/ast/superExpression/statement/superStatement.kt diff --git a/src/org/jetbrains/jet/j2k/ast/SuperExpression.java b/src/org/jetbrains/jet/j2k/ast/SuperExpression.java new file mode 100644 index 00000000000..a52ce00c448 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/SuperExpression.java @@ -0,0 +1,20 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class SuperExpression extends Expression { + private Type myType; + + public SuperExpression(Type type) { + myType = type; + } + + @NotNull + @Override + public String toKotlin() { + return "super" + "<" + myType.toKotlin() + ">"; + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index cb40da43b4f..18b7deb3e9c 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -236,6 +236,7 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { @Override public void visitSuperExpression(PsiSuperExpression expression) { super.visitSuperExpression(expression); + myResult = new SuperExpression(typeToNotNullableType(expression.getType())); } @Override diff --git a/testData/ast/superExpression/class/classAextendsB.jav b/testData/ast/superExpression/class/classAextendsB.jav new file mode 100644 index 00000000000..b50235108d0 --- /dev/null +++ b/testData/ast/superExpression/class/classAextendsB.jav @@ -0,0 +1,11 @@ +class B { + void call() {} +} + +class A extends B { + A() { + super(); + } + + void call() { return super.call(); } +} \ No newline at end of file diff --git a/testData/ast/superExpression/class/classAextendsB.kt b/testData/ast/superExpression/class/classAextendsB.kt new file mode 100644 index 00000000000..4d9518ab15b --- /dev/null +++ b/testData/ast/superExpression/class/classAextendsB.kt @@ -0,0 +1,9 @@ +open class B { +fun call() : Unit { +} +} +open class A : B { +override fun call() : Unit { +return super.call() +} +} \ No newline at end of file diff --git a/testData/ast/superExpression/statement/superStatement.jav b/testData/ast/superExpression/statement/superStatement.jav new file mode 100644 index 00000000000..4b2f79a6823 --- /dev/null +++ b/testData/ast/superExpression/statement/superStatement.jav @@ -0,0 +1 @@ +super.call(); \ No newline at end of file diff --git a/testData/ast/superExpression/statement/superStatement.kt b/testData/ast/superExpression/statement/superStatement.kt new file mode 100644 index 00000000000..2ee17f5e923 --- /dev/null +++ b/testData/ast/superExpression/statement/superStatement.kt @@ -0,0 +1 @@ +super.call() \ No newline at end of file From d36c2a46d377c5fc7914bc9498b5dbe461e2f7be Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 7 Nov 2011 17:49:05 +0400 Subject: [PATCH 072/206] AnonymousClasses supported --- src/org/jetbrains/jet/j2k/Converter.java | 13 +++++++-- .../jetbrains/jet/j2k/ast/AnonymousClass.java | 29 +++++++++++++++++++ src/org/jetbrains/jet/j2k/ast/Class.java | 9 +++--- .../jet/j2k/ast/NewClassExpression.java | 11 ++++++- .../jet/j2k/visitors/ExpressionVisitor.java | 6 +++- .../expression/newClassWithAnonymousScope.jav | 6 ++++ .../expression/newClassWithAnonymousScope.kt | 5 ++++ 7 files changed, 70 insertions(+), 9 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/AnonymousClass.java create mode 100644 testData/ast/newClassExpression/expression/newClassWithAnonymousScope.jav create mode 100644 testData/ast/newClassExpression/expression/newClassWithAnonymousScope.kt 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 From 98c9fcf68fadb53343e03bf79f0b7d423a49ee5b Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 7 Nov 2011 19:05:31 +0400 Subject: [PATCH 073/206] cleanup --- src/org/jetbrains/jet/j2k/Converter.java | 10 +++++----- src/org/jetbrains/jet/j2k/ast/Class.java | 4 ++-- src/org/jetbrains/jet/j2k/ast/Enum.java | 5 +++++ src/org/jetbrains/jet/j2k/ast/NewClassExpression.java | 2 +- src/org/jetbrains/jet/j2k/ast/Trait.java | 6 +----- .../jetbrains/jet/j2k/JavaToKotlinConverterTest.java | 8 ++++++-- testData/ast/class/class/abstractClass.kt | 2 +- testData/ast/class/class/abstractClassShape.kt | 2 +- testData/ast/trait/class/abstactInterface.jav | 1 + testData/ast/trait/class/abstactInterface.kt | 2 ++ testData/ast/trait/class/interfaceWithFields.kt | 6 +++--- .../ast/trait/class/interfaceWithMethodDeclaration.kt | 4 ++-- 12 files changed, 30 insertions(+), 22 deletions(-) create mode 100644 testData/ast/trait/class/abstactInterface.jav create mode 100644 testData/ast/trait/class/abstactInterface.kt diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 9b69450431f..0c63e555730 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -296,13 +296,13 @@ public class Converter { public static Set modifiersListToModifiersSet(PsiModifierList modifierList) { HashSet modifiersSet = new HashSet(); if (modifierList != null) { - if (modifierList.hasModifierProperty(PsiModifier.ABSTRACT)) modifiersSet.add(Modifier.ABSTRACT); + if (modifierList.hasExplicitModifier(PsiModifier.ABSTRACT)) modifiersSet.add(Modifier.ABSTRACT); if (modifierList.hasModifierProperty(PsiModifier.FINAL)) modifiersSet.add(Modifier.FINAL); if (modifierList.hasModifierProperty(PsiModifier.STATIC)) modifiersSet.add(Modifier.STATIC); - if (modifierList.hasModifierProperty(PsiModifier.PUBLIC)) modifiersSet.add(Modifier.PUBLIC); - if (modifierList.hasModifierProperty(PsiModifier.PROTECTED)) modifiersSet.add(Modifier.PROTECTED); - if (modifierList.hasModifierProperty(PsiModifier.PACKAGE_LOCAL)) modifiersSet.add(Modifier.INTERNAL); - if (modifierList.hasModifierProperty(PsiModifier.PRIVATE)) modifiersSet.add(Modifier.PRIVATE); + if (modifierList.hasExplicitModifier(PsiModifier.PUBLIC)) modifiersSet.add(Modifier.PUBLIC); + if (modifierList.hasExplicitModifier(PsiModifier.PROTECTED)) modifiersSet.add(Modifier.PROTECTED); + if (modifierList.hasExplicitModifier(PsiModifier.PACKAGE_LOCAL)) modifiersSet.add(Modifier.INTERNAL); + if (modifierList.hasExplicitModifier(PsiModifier.PRIVATE)) modifiersSet.add(Modifier.PRIVATE); } return modifiersSet; } diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java index 5d2fe19f18f..4d2ea0238ef 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -99,7 +99,7 @@ public class Class extends Member { } String bodyToKotlin() { - return "{" + N + classObjectToKotlin() + N + + return SPACE + "{" + N + classObjectToKotlin() + N + AstUtil.joinNodes(getNonStatic(myFields), N) + N + AstUtil.joinNodes(getNonStatic(methodsExceptConstructors()), N) + N + AstUtil.joinNodes(getNonStatic(myInnerClasses), N) + N + @@ -142,6 +142,6 @@ public class Class extends Member { return modifiersToKotlin() + TYPE + SPACE + myName.toKotlin() + typeParametersToKotlin() + implementTypesToKotlin() + typeParameterWhereToKotlin() + - SPACE + bodyToKotlin(); + bodyToKotlin(); } } diff --git a/src/org/jetbrains/jet/j2k/ast/Enum.java b/src/org/jetbrains/jet/j2k/ast/Enum.java index f16a7393718..4f69eb11f23 100644 --- a/src/org/jetbrains/jet/j2k/ast/Enum.java +++ b/src/org/jetbrains/jet/j2k/ast/Enum.java @@ -30,6 +30,11 @@ public class Enum extends Class { return EMPTY; } + @Override + boolean needOpenModifier() { + return false; + } + @NotNull @Override public String toKotlin() { diff --git a/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java b/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java index 9e946a02118..8d4bd4549b6 100644 --- a/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java @@ -25,7 +25,7 @@ public class NewClassExpression extends Expression { @Override public String toKotlin() { return myAnonymousClass != null ? - myName.toKotlin() + "(" + myArguments.toKotlin() + ")" + SPACE + myAnonymousClass.toKotlin() : + myName.toKotlin() + "(" + myArguments.toKotlin() + ")" + myAnonymousClass.toKotlin() : myName.toKotlin() + "(" + myArguments.toKotlin() + ")"; } } \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/ast/Trait.java b/src/org/jetbrains/jet/j2k/ast/Trait.java index d450bef933d..14fea577b6e 100644 --- a/src/org/jetbrains/jet/j2k/ast/Trait.java +++ b/src/org/jetbrains/jet/j2k/ast/Trait.java @@ -17,8 +17,4 @@ public class Trait extends Class { boolean needOpenModifier() { return false; } - - boolean needAbstractModifier() { - return false; - } -} +} \ No newline at end of file diff --git a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java index 67b8a051b86..52cdde52219 100644 --- a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java +++ b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java @@ -48,8 +48,11 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { else if (javaFile.getParent().endsWith("/file")) actual = fileToKotlin(javaCode); assert !actual.equals(""); + final File tmp = new File(kotlinPath + ".tmp"); if (!expected.equals(actual)) - writeStringToFile(new File(kotlinPath + ".tmp"), actual); + writeStringToFile(tmp, actual); + if (expected.equals(actual) && tmp.exists()) + tmp.delete(); Assert.assertEquals(expected, actual); } @@ -138,8 +141,9 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { return code .trim() .replaceAll("\r\n", "\n") - .replaceAll("\n+", "\n") + .replaceAll(" \n", "\n") .replaceAll("\n ", "\n") + .replaceAll("\n+", "\n") .replaceAll(" +", " ") .trim() ; diff --git a/testData/ast/class/class/abstractClass.kt b/testData/ast/class/class/abstractClass.kt index 38c5d667a48..a8010e20dc2 100644 --- a/testData/ast/class/class/abstractClass.kt +++ b/testData/ast/class/class/abstractClass.kt @@ -1,5 +1,5 @@ abstract open class A { -abstract fun callme() : Unit +abstract fun callme() : Unit fun callmetoo() : Unit { print("This is a concrete method.") } diff --git a/testData/ast/class/class/abstractClassShape.kt b/testData/ast/class/class/abstractClassShape.kt index 9237e4ca894..f564ee18325 100644 --- a/testData/ast/class/class/abstractClassShape.kt +++ b/testData/ast/class/class/abstractClassShape.kt @@ -6,5 +6,5 @@ color = c public fun getColor() : String? { return color } -abstract public fun area() : Double +abstract public fun area() : Double } \ No newline at end of file diff --git a/testData/ast/trait/class/abstactInterface.jav b/testData/ast/trait/class/abstactInterface.jav new file mode 100644 index 00000000000..17b89868943 --- /dev/null +++ b/testData/ast/trait/class/abstactInterface.jav @@ -0,0 +1 @@ +abstract interface I {} \ No newline at end of file diff --git a/testData/ast/trait/class/abstactInterface.kt b/testData/ast/trait/class/abstactInterface.kt new file mode 100644 index 00000000000..97c0b5c0bed --- /dev/null +++ b/testData/ast/trait/class/abstactInterface.kt @@ -0,0 +1,2 @@ +abstract trait I { +} \ No newline at end of file diff --git a/testData/ast/trait/class/interfaceWithFields.kt b/testData/ast/trait/class/interfaceWithFields.kt index fc2ab5e9a4f..8e2b43d7e84 100644 --- a/testData/ast/trait/class/interfaceWithFields.kt +++ b/testData/ast/trait/class/interfaceWithFields.kt @@ -1,7 +1,7 @@ trait INode { class object { -public val IN : String? = "in" -public val AT : String? = "@" -public val COMMA_WITH_SPACE : String? = (COMMA + SPACE) +val IN : String? = "in" +val AT : String? = "@" +val COMMA_WITH_SPACE : String? = (COMMA + SPACE) } } \ No newline at end of file diff --git a/testData/ast/trait/class/interfaceWithMethodDeclaration.kt b/testData/ast/trait/class/interfaceWithMethodDeclaration.kt index bf3ade94a28..6ce36f8d783 100644 --- a/testData/ast/trait/class/interfaceWithMethodDeclaration.kt +++ b/testData/ast/trait/class/interfaceWithMethodDeclaration.kt @@ -1,4 +1,4 @@ trait INode { -public fun getTag() : Tag? -public fun toKotlin() : String? +fun getTag() : Tag? +fun toKotlin() : String? } \ No newline at end of file From 35a6c1973a579dd096331bc47cb2279671f6e51c Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 7 Nov 2011 19:18:00 +0400 Subject: [PATCH 074/206] super statement improved --- src/org/jetbrains/jet/j2k/ast/SuperExpression.java | 10 ++++++---- .../jet/j2k/visitors/ExpressionVisitor.java | 4 ++-- testData/ast/superExpression/class/classAextendsB.kt | 2 +- .../ast/superExpression/file/classAdotSuperFoo.jav | 11 +++++++++++ .../ast/superExpression/file/classAdotSuperFoo.kt | 12 ++++++++++++ .../ast/superExpression/statement/superStatement.kt | 2 +- 6 files changed, 33 insertions(+), 8 deletions(-) create mode 100644 testData/ast/superExpression/file/classAdotSuperFoo.jav create mode 100644 testData/ast/superExpression/file/classAdotSuperFoo.kt diff --git a/src/org/jetbrains/jet/j2k/ast/SuperExpression.java b/src/org/jetbrains/jet/j2k/ast/SuperExpression.java index a52ce00c448..556484f6f66 100644 --- a/src/org/jetbrains/jet/j2k/ast/SuperExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/SuperExpression.java @@ -6,15 +6,17 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public class SuperExpression extends Expression { - private Type myType; + private Identifier myIdentifier; - public SuperExpression(Type type) { - myType = type; + public SuperExpression(Identifier identifier) { + myIdentifier = identifier; } @NotNull @Override public String toKotlin() { - return "super" + "<" + myType.toKotlin() + ">"; + if (myIdentifier.isEmpty()) + return "super"; + return "super" + AT + myIdentifier.toKotlin(); } } diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 9683a6544e7..a96722bfa97 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -4,7 +4,6 @@ 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; @@ -240,7 +239,8 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { @Override public void visitSuperExpression(PsiSuperExpression expression) { super.visitSuperExpression(expression); - myResult = new SuperExpression(typeToNotNullableType(expression.getType())); + myResult = new SuperExpression( + expression.getQualifier() != null ? new IdentifierImpl(expression.getQualifier().getQualifiedName()): Identifier.EMPTY_IDENTIFIER); } @Override diff --git a/testData/ast/superExpression/class/classAextendsB.kt b/testData/ast/superExpression/class/classAextendsB.kt index 4d9518ab15b..b917dff44e3 100644 --- a/testData/ast/superExpression/class/classAextendsB.kt +++ b/testData/ast/superExpression/class/classAextendsB.kt @@ -4,6 +4,6 @@ fun call() : Unit { } open class A : B { override fun call() : Unit { -return super.call() +return super.call() } } \ No newline at end of file diff --git a/testData/ast/superExpression/file/classAdotSuperFoo.jav b/testData/ast/superExpression/file/classAdotSuperFoo.jav new file mode 100644 index 00000000000..f53906b2c67 --- /dev/null +++ b/testData/ast/superExpression/file/classAdotSuperFoo.jav @@ -0,0 +1,11 @@ +class Base { + void foo(); +} + +class A extends Base { + class C { + void test() { + A.super.foo(); + } + } +} \ No newline at end of file diff --git a/testData/ast/superExpression/file/classAdotSuperFoo.kt b/testData/ast/superExpression/file/classAdotSuperFoo.kt new file mode 100644 index 00000000000..e2c1d9213db --- /dev/null +++ b/testData/ast/superExpression/file/classAdotSuperFoo.kt @@ -0,0 +1,12 @@ +namespace { +open class Base { +fun foo() : Unit +} +open class A : Base { +open class C { +fun test() : Unit { +super@A.foo() +} +} +} +} \ No newline at end of file diff --git a/testData/ast/superExpression/statement/superStatement.kt b/testData/ast/superExpression/statement/superStatement.kt index 2ee17f5e923..a0ea37bcc63 100644 --- a/testData/ast/superExpression/statement/superStatement.kt +++ b/testData/ast/superExpression/statement/superStatement.kt @@ -1 +1 @@ -super.call() \ No newline at end of file +super.call() \ No newline at end of file From fd7fde10580bdfb0ef22a359a7304b8fd38d1c10 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 7 Nov 2011 19:23:45 +0400 Subject: [PATCH 075/206] this statement added --- .../jetbrains/jet/j2k/ast/ThisExpression.java | 22 +++++++++++++++++++ .../jet/j2k/visitors/ExpressionVisitor.java | 15 +++++++++++-- .../thisExpression/file/classAdotThisFoo.jav | 11 ++++++++++ .../thisExpression/file/classAdotThisFoo.kt | 13 +++++++++++ .../statement/thisStatement.jav | 1 + .../thisExpression/statement/thisStatement.kt | 1 + 6 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/ThisExpression.java create mode 100644 testData/ast/thisExpression/file/classAdotThisFoo.jav create mode 100644 testData/ast/thisExpression/file/classAdotThisFoo.kt create mode 100644 testData/ast/thisExpression/statement/thisStatement.jav create mode 100644 testData/ast/thisExpression/statement/thisStatement.kt diff --git a/src/org/jetbrains/jet/j2k/ast/ThisExpression.java b/src/org/jetbrains/jet/j2k/ast/ThisExpression.java new file mode 100644 index 00000000000..69e426ff602 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/ThisExpression.java @@ -0,0 +1,22 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class ThisExpression extends Expression { + private Identifier myIdentifier; + + public ThisExpression(Identifier identifier) { + myIdentifier = identifier; + } + + @NotNull + @Override + public String toKotlin() { + if (myIdentifier.isEmpty()) + return "this"; + return "this" + AT + myIdentifier.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index a96722bfa97..ebdb7d80e3e 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -193,7 +193,7 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { myResult = new NewClassExpression( elementToElement(expression.getClassOrAnonymousClassReference()), elementToElement(expression.getArgumentList()), - expression.getAnonymousClass() != null? + expression.getAnonymousClass() != null ? anonymousClassToAnonymousClass(expression.getAnonymousClass()) : null ); @@ -239,13 +239,24 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { @Override public void visitSuperExpression(PsiSuperExpression expression) { super.visitSuperExpression(expression); + final PsiJavaCodeReferenceElement qualifier = expression.getQualifier(); myResult = new SuperExpression( - expression.getQualifier() != null ? new IdentifierImpl(expression.getQualifier().getQualifiedName()): Identifier.EMPTY_IDENTIFIER); + qualifier != null ? + new IdentifierImpl(qualifier.getQualifiedName()) : + Identifier.EMPTY_IDENTIFIER + ); } @Override public void visitThisExpression(PsiThisExpression expression) { super.visitThisExpression(expression); + final PsiJavaCodeReferenceElement qualifier = expression.getQualifier(); + myResult = new ThisExpression( + qualifier != null ? + new IdentifierImpl(qualifier.getQualifiedName()) : + Identifier.EMPTY_IDENTIFIER + ); + } @Override diff --git a/testData/ast/thisExpression/file/classAdotThisFoo.jav b/testData/ast/thisExpression/file/classAdotThisFoo.jav new file mode 100644 index 00000000000..6449695eb81 --- /dev/null +++ b/testData/ast/thisExpression/file/classAdotThisFoo.jav @@ -0,0 +1,11 @@ +class Base { + void foo() {} +} + +class A extends Base { + class C { + void test() { + A.this.foo(); + } + } +} \ No newline at end of file diff --git a/testData/ast/thisExpression/file/classAdotThisFoo.kt b/testData/ast/thisExpression/file/classAdotThisFoo.kt new file mode 100644 index 00000000000..939b443357a --- /dev/null +++ b/testData/ast/thisExpression/file/classAdotThisFoo.kt @@ -0,0 +1,13 @@ +namespace { +open class Base { +fun foo() : Unit { +} +} +open class A : Base { +open class C { +fun test() : Unit { +this@A.foo() +} +} +} +} \ No newline at end of file diff --git a/testData/ast/thisExpression/statement/thisStatement.jav b/testData/ast/thisExpression/statement/thisStatement.jav new file mode 100644 index 00000000000..4b2f79a6823 --- /dev/null +++ b/testData/ast/thisExpression/statement/thisStatement.jav @@ -0,0 +1 @@ +super.call(); \ No newline at end of file diff --git a/testData/ast/thisExpression/statement/thisStatement.kt b/testData/ast/thisExpression/statement/thisStatement.kt new file mode 100644 index 00000000000..a0ea37bcc63 --- /dev/null +++ b/testData/ast/thisExpression/statement/thisStatement.kt @@ -0,0 +1 @@ +super.call() \ No newline at end of file From 12b03042eaeca7970ba62845157c0e396214ea0c Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 7 Nov 2011 19:35:49 +0400 Subject: [PATCH 076/206] open modifier for functions added --- src/org/jetbrains/jet/j2k/ast/Function.java | 3 +++ .../jet/j2k/JavaToKotlinConverterTest.java | 2 +- testData/ast/arrayType/method/methodArrayArgs.kt | 2 +- .../callChainExpression/file/libraryFieldCall.kt | 2 +- .../callChainExpression/file/libraryMethodCall.kt | 6 +++--- .../file/libraryMethodCallFromInstance.kt | 6 +++--- .../file/libraryStringFieldCall.kt | 2 +- testData/ast/class/class/abstractClass.kt | 4 ++-- testData/ast/class/class/abstractClassShape.kt | 6 +++--- testData/ast/class/class/classWithEmptyMethods.kt | 6 +++--- .../ast/class/class/oneStaticFieldOneNonStatic.kt | 2 +- testData/ast/class/class/oneStaticMethod.kt | 2 +- .../ast/class/class/oneStaticMethodOneNonStatic.kt | 4 ++-- testData/ast/class/class/twoStaticMethod.kt | 4 ++-- .../class/fieldsWithPrimaryPrivateConstructor.kt | 4 ++-- testData/ast/function/file/override.kt | 2 +- testData/ast/function/file/overrideAndOpen.jav | 11 +++++++++++ testData/ast/function/file/overrideAndOpen.kt | 14 ++++++++++++++ testData/ast/function/method/abstractMethod.kt | 2 +- testData/ast/function/method/classGenericParam.kt | 2 +- testData/ast/function/method/emptyVoidMethod.kt | 2 +- testData/ast/function/method/final.jav | 1 + testData/ast/function/method/final.kt | 3 +++ testData/ast/function/method/internal.kt | 2 +- testData/ast/function/method/methodClassType.kt | 2 +- .../ast/function/method/methodPrimitiveType.kt | 2 +- .../ast/function/method/methodPrimitiveType2.kt | 2 +- .../function/method/methodWithReturnStatement.kt | 2 +- testData/ast/function/method/open.jav | 1 + testData/ast/function/method/open.kt | 3 +++ testData/ast/function/method/ownGenericParam.kt | 2 +- .../ast/function/method/ownSeveralGenericParams.kt | 2 +- testData/ast/function/method/private.kt | 2 +- testData/ast/function/method/protected.kt | 2 +- testData/ast/function/method/public.kt | 2 +- .../ast/inProjectionType/method/methodParams.kt | 2 +- .../newClassExpression/file/newClassByFullName.kt | 2 +- .../ast/outProjectionType/method/methodParams.kt | 2 +- .../ast/starProjectionType/method/methodParams.kt | 2 +- .../ast/superExpression/class/classAextendsB.kt | 2 +- .../ast/superExpression/file/classAdotSuperFoo.kt | 4 ++-- .../ast/thisExpression/file/classAdotThisFoo.kt | 4 ++-- .../trait/class/interfaceWithMethodDeclaration.kt | 4 ++-- .../methodDoubleParametrizationWithTwoBounds.kt | 2 +- testData/ast/typeParameters/method/where.kt | 2 +- .../ast/varArg/method/ellipsisTypeSeveralParams.kt | 2 +- .../ast/varArg/method/ellipsisTypeSingleParams.kt | 2 +- 47 files changed, 91 insertions(+), 55 deletions(-) create mode 100644 testData/ast/function/file/overrideAndOpen.jav create mode 100644 testData/ast/function/file/overrideAndOpen.kt create mode 100644 testData/ast/function/method/final.jav create mode 100644 testData/ast/function/method/final.kt create mode 100644 testData/ast/function/method/open.jav create mode 100644 testData/ast/function/method/open.kt diff --git a/src/org/jetbrains/jet/j2k/ast/Function.java b/src/org/jetbrains/jet/j2k/ast/Function.java index bfdfca1c769..46b44d8ab82 100644 --- a/src/org/jetbrains/jet/j2k/ast/Function.java +++ b/src/org/jetbrains/jet/j2k/ast/Function.java @@ -57,6 +57,9 @@ public class Function extends Member { if (myModifiers.contains(Modifier.OVERRIDE)) modifierList.add(Modifier.OVERRIDE); + if (!myModifiers.contains(Modifier.OVERRIDE) && !myModifiers.contains(Modifier.FINAL)) + modifierList.add(Modifier.OPEN); + modifierList.add(accessModifier()); if (modifierList.size() > 0) diff --git a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java index 52cdde52219..339675b623f 100644 --- a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java +++ b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java @@ -123,7 +123,7 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { protected String statementToKotlin(String text) throws Exception { String result = methodToKotlin("void main() {" + text + "}"); int pos = result.lastIndexOf("}"); - result = result.substring(0, pos).replaceFirst("fun main\\(\\) : Unit \\{", ""); + result = result.substring(0, pos).replaceFirst("open fun main\\(\\) : Unit \\{", ""); return prettify(result); } diff --git a/testData/ast/arrayType/method/methodArrayArgs.kt b/testData/ast/arrayType/method/methodArrayArgs.kt index b095e2dd099..0eadd674755 100644 --- a/testData/ast/arrayType/method/methodArrayArgs.kt +++ b/testData/ast/arrayType/method/methodArrayArgs.kt @@ -1,2 +1,2 @@ -fun fromArrayToCollection(a : Array?) : Unit { +open fun fromArrayToCollection(a : Array?) : Unit { } \ No newline at end of file diff --git a/testData/ast/callChainExpression/file/libraryFieldCall.kt b/testData/ast/callChainExpression/file/libraryFieldCall.kt index c77bf3464a2..23aed853064 100644 --- a/testData/ast/callChainExpression/file/libraryFieldCall.kt +++ b/testData/ast/callChainExpression/file/libraryFieldCall.kt @@ -5,7 +5,7 @@ val ourOut : PrintStream? } } open class User { -fun main() : Unit { +open fun main() : Unit { Library.ourOut?.print() } } diff --git a/testData/ast/callChainExpression/file/libraryMethodCall.kt b/testData/ast/callChainExpression/file/libraryMethodCall.kt index f5e0204d979..18c230c50f7 100644 --- a/testData/ast/callChainExpression/file/libraryMethodCall.kt +++ b/testData/ast/callChainExpression/file/libraryMethodCall.kt @@ -1,15 +1,15 @@ namespace { open class Library { class object { -fun call() : Unit { +open fun call() : Unit { } -fun getString() : String? { +open fun getString() : String? { return "" } } } open class User { -fun main() : Unit { +open fun main() : Unit { Library.call() Library.getString()?.isEmpty() } diff --git a/testData/ast/callChainExpression/file/libraryMethodCallFromInstance.kt b/testData/ast/callChainExpression/file/libraryMethodCallFromInstance.kt index 0160fa34117..25c9bffb924 100644 --- a/testData/ast/callChainExpression/file/libraryMethodCallFromInstance.kt +++ b/testData/ast/callChainExpression/file/libraryMethodCallFromInstance.kt @@ -1,13 +1,13 @@ namespace { open class Library { -fun call() : Unit { +open fun call() : Unit { } -fun getString() : String? { +open fun getString() : String? { return "" } } open class User { -fun main() : Unit { +open fun main() : Unit { var lib : Library? = Library() lib?.call() lib?.getString()?.isEmpty() diff --git a/testData/ast/callChainExpression/file/libraryStringFieldCall.kt b/testData/ast/callChainExpression/file/libraryStringFieldCall.kt index 382a87f7797..82210f26905 100644 --- a/testData/ast/callChainExpression/file/libraryStringFieldCall.kt +++ b/testData/ast/callChainExpression/file/libraryStringFieldCall.kt @@ -3,7 +3,7 @@ open class Library { public val myString : String? } open class User { -fun main() : Unit { +open fun main() : Unit { Library.myString?.isEmpty() } } diff --git a/testData/ast/class/class/abstractClass.kt b/testData/ast/class/class/abstractClass.kt index a8010e20dc2..6bbb45f4c22 100644 --- a/testData/ast/class/class/abstractClass.kt +++ b/testData/ast/class/class/abstractClass.kt @@ -1,6 +1,6 @@ abstract open class A { -abstract fun callme() : Unit -fun callmetoo() : Unit { +abstract open fun callme() : Unit +open fun callmetoo() : Unit { print("This is a concrete method.") } } \ No newline at end of file diff --git a/testData/ast/class/class/abstractClassShape.kt b/testData/ast/class/class/abstractClassShape.kt index f564ee18325..747d1875178 100644 --- a/testData/ast/class/class/abstractClassShape.kt +++ b/testData/ast/class/class/abstractClassShape.kt @@ -1,10 +1,10 @@ abstract open class Shape { public var color : String? -public fun setColor(c : String?) : Unit { +open public fun setColor(c : String?) : Unit { color = c } -public fun getColor() : String? { +open public fun getColor() : String? { return color } -abstract public fun area() : Double +abstract open public fun area() : Double } \ No newline at end of file diff --git a/testData/ast/class/class/classWithEmptyMethods.kt b/testData/ast/class/class/classWithEmptyMethods.kt index 093b68e9c67..6d0b778a365 100644 --- a/testData/ast/class/class/classWithEmptyMethods.kt +++ b/testData/ast/class/class/classWithEmptyMethods.kt @@ -1,8 +1,8 @@ class T { -fun main() : Unit { +open fun main() : Unit { } -fun i() : Int { +open fun i() : Int { } -fun s() : String? { +open fun s() : String? { } } \ No newline at end of file diff --git a/testData/ast/class/class/oneStaticFieldOneNonStatic.kt b/testData/ast/class/class/oneStaticFieldOneNonStatic.kt index d2b11e44c60..c3fb86321a3 100644 --- a/testData/ast/class/class/oneStaticFieldOneNonStatic.kt +++ b/testData/ast/class/class/oneStaticFieldOneNonStatic.kt @@ -2,7 +2,7 @@ class S { class object { var myI : Int = 10 } -fun sB() : Boolean { +open fun sB() : Boolean { return true } } \ No newline at end of file diff --git a/testData/ast/class/class/oneStaticMethod.kt b/testData/ast/class/class/oneStaticMethod.kt index 1e39f93f167..90a9a2ece81 100644 --- a/testData/ast/class/class/oneStaticMethod.kt +++ b/testData/ast/class/class/oneStaticMethod.kt @@ -1,6 +1,6 @@ class S { class object { -fun staticF() : Boolean { +open fun staticF() : Boolean { return true } } diff --git a/testData/ast/class/class/oneStaticMethodOneNonStatic.kt b/testData/ast/class/class/oneStaticMethodOneNonStatic.kt index dc7a84e71e4..baad5b8c59f 100644 --- a/testData/ast/class/class/oneStaticMethodOneNonStatic.kt +++ b/testData/ast/class/class/oneStaticMethodOneNonStatic.kt @@ -1,10 +1,10 @@ class S { class object { -fun sI() : Int { +open fun sI() : Int { return 1 } } -fun sB() : Boolean { +open fun sB() : Boolean { return true } } \ No newline at end of file diff --git a/testData/ast/class/class/twoStaticMethod.kt b/testData/ast/class/class/twoStaticMethod.kt index 4b8bfbbab24..64df630cc7e 100644 --- a/testData/ast/class/class/twoStaticMethod.kt +++ b/testData/ast/class/class/twoStaticMethod.kt @@ -1,9 +1,9 @@ class S { class object { -fun sB() : Boolean { +open fun sB() : Boolean { return true } -fun sI() : Int { +open fun sI() : Int { return 1 } } diff --git a/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt b/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt index a6c5d2501b5..52e96f54c6d 100644 --- a/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt +++ b/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt @@ -5,10 +5,10 @@ RED(23) YELLOW(24) BLUE(25) private var code : Int -private (c : Int) { +open private (c : Int) { code = c } -public fun getCode() : Int { +open public fun getCode() : Int { return code } } \ No newline at end of file diff --git a/testData/ast/function/file/override.kt b/testData/ast/function/file/override.kt index 706b160fda9..c080ae67068 100644 --- a/testData/ast/function/file/override.kt +++ b/testData/ast/function/file/override.kt @@ -1,6 +1,6 @@ namespace { open class A { -fun a() : Unit { +open fun a() : Unit { } } class B : A { diff --git a/testData/ast/function/file/overrideAndOpen.jav b/testData/ast/function/file/overrideAndOpen.jav new file mode 100644 index 00000000000..bda1a410cff --- /dev/null +++ b/testData/ast/function/file/overrideAndOpen.jav @@ -0,0 +1,11 @@ +class A { + void foo() {} +} + +class B extends A { + void foo() {} +} + +class C extends B { + void foo() {} +} \ No newline at end of file diff --git a/testData/ast/function/file/overrideAndOpen.kt b/testData/ast/function/file/overrideAndOpen.kt new file mode 100644 index 00000000000..10b231c8b89 --- /dev/null +++ b/testData/ast/function/file/overrideAndOpen.kt @@ -0,0 +1,14 @@ +namespace { +open class A { +open fun foo() : Unit { +} +} +open class B : A { +override fun foo() : Unit { +} +} +open class C : B { +override fun foo() : Unit { +} +} +} \ No newline at end of file diff --git a/testData/ast/function/method/abstractMethod.kt b/testData/ast/function/method/abstractMethod.kt index 8163dfad9bb..f5e9004be67 100644 --- a/testData/ast/function/method/abstractMethod.kt +++ b/testData/ast/function/method/abstractMethod.kt @@ -1 +1 @@ -abstract fun getNoofGears() : Int \ No newline at end of file +abstract open fun getNoofGears() : Int \ No newline at end of file diff --git a/testData/ast/function/method/classGenericParam.kt b/testData/ast/function/method/classGenericParam.kt index b9ea1d49799..a232b7e30fe 100644 --- a/testData/ast/function/method/classGenericParam.kt +++ b/testData/ast/function/method/classGenericParam.kt @@ -1,2 +1,2 @@ -fun getT() : T? { +open fun getT() : T? { } \ No newline at end of file diff --git a/testData/ast/function/method/emptyVoidMethod.kt b/testData/ast/function/method/emptyVoidMethod.kt index ae299eb173a..25bd4ab1d8e 100644 --- a/testData/ast/function/method/emptyVoidMethod.kt +++ b/testData/ast/function/method/emptyVoidMethod.kt @@ -1,2 +1,2 @@ -fun main() : Unit { +open fun main() : Unit { } \ No newline at end of file diff --git a/testData/ast/function/method/final.jav b/testData/ast/function/method/final.jav new file mode 100644 index 00000000000..8a49597af12 --- /dev/null +++ b/testData/ast/function/method/final.jav @@ -0,0 +1 @@ +final String getString() { return ""; } \ No newline at end of file diff --git a/testData/ast/function/method/final.kt b/testData/ast/function/method/final.kt new file mode 100644 index 00000000000..e6cf12b2b3f --- /dev/null +++ b/testData/ast/function/method/final.kt @@ -0,0 +1,3 @@ +fun getString() : String? { +return "" +} \ No newline at end of file diff --git a/testData/ast/function/method/internal.kt b/testData/ast/function/method/internal.kt index 5b3e9634f3f..86f2b8d992f 100644 --- a/testData/ast/function/method/internal.kt +++ b/testData/ast/function/method/internal.kt @@ -1,2 +1,2 @@ -fun test() : Unit { +open fun test() : Unit { } \ No newline at end of file diff --git a/testData/ast/function/method/methodClassType.kt b/testData/ast/function/method/methodClassType.kt index 196c45b6bf8..ef426384d58 100644 --- a/testData/ast/function/method/methodClassType.kt +++ b/testData/ast/function/method/methodClassType.kt @@ -1,2 +1,2 @@ -fun main() : String? { +open fun main() : String? { } \ No newline at end of file diff --git a/testData/ast/function/method/methodPrimitiveType.kt b/testData/ast/function/method/methodPrimitiveType.kt index c6ef43f8a14..6f5f11b4c16 100644 --- a/testData/ast/function/method/methodPrimitiveType.kt +++ b/testData/ast/function/method/methodPrimitiveType.kt @@ -1,2 +1,2 @@ -fun main() : Int { +open fun main() : Int { } \ No newline at end of file diff --git a/testData/ast/function/method/methodPrimitiveType2.kt b/testData/ast/function/method/methodPrimitiveType2.kt index c978e93e7aa..d40b67fb1a4 100644 --- a/testData/ast/function/method/methodPrimitiveType2.kt +++ b/testData/ast/function/method/methodPrimitiveType2.kt @@ -1,2 +1,2 @@ -fun main() : Boolean { +open fun main() : Boolean { } \ No newline at end of file diff --git a/testData/ast/function/method/methodWithReturnStatement.kt b/testData/ast/function/method/methodWithReturnStatement.kt index acfbd1010d8..c11bfd3dc43 100644 --- a/testData/ast/function/method/methodWithReturnStatement.kt +++ b/testData/ast/function/method/methodWithReturnStatement.kt @@ -1,3 +1,3 @@ -fun isTrue() : Boolean { +open fun isTrue() : Boolean { return true } \ No newline at end of file diff --git a/testData/ast/function/method/open.jav b/testData/ast/function/method/open.jav new file mode 100644 index 00000000000..6db748fef42 --- /dev/null +++ b/testData/ast/function/method/open.jav @@ -0,0 +1 @@ +String getString() { return ""; } \ No newline at end of file diff --git a/testData/ast/function/method/open.kt b/testData/ast/function/method/open.kt new file mode 100644 index 00000000000..db906a336d7 --- /dev/null +++ b/testData/ast/function/method/open.kt @@ -0,0 +1,3 @@ +open fun getString() : String? { +return "" +} \ No newline at end of file diff --git a/testData/ast/function/method/ownGenericParam.kt b/testData/ast/function/method/ownGenericParam.kt index e5533fdcb5f..d2ab8c63c57 100644 --- a/testData/ast/function/method/ownGenericParam.kt +++ b/testData/ast/function/method/ownGenericParam.kt @@ -1,2 +1,2 @@ -fun putU(u : U?) : Unit { +open fun putU(u : U?) : Unit { } \ No newline at end of file diff --git a/testData/ast/function/method/ownSeveralGenericParams.kt b/testData/ast/function/method/ownSeveralGenericParams.kt index 19fb6188681..58e046f0576 100644 --- a/testData/ast/function/method/ownSeveralGenericParams.kt +++ b/testData/ast/function/method/ownSeveralGenericParams.kt @@ -1,2 +1,2 @@ -fun putUVW(u : U?, v : V?, w : W?) : Unit { +open fun putUVW(u : U?, v : V?, w : W?) : Unit { } \ No newline at end of file diff --git a/testData/ast/function/method/private.kt b/testData/ast/function/method/private.kt index 45e5e8bab00..f40bc043813 100644 --- a/testData/ast/function/method/private.kt +++ b/testData/ast/function/method/private.kt @@ -1,2 +1,2 @@ -private fun test() : Unit { +open private fun test() : Unit { } \ No newline at end of file diff --git a/testData/ast/function/method/protected.kt b/testData/ast/function/method/protected.kt index dbbc30b447b..597abfa9954 100644 --- a/testData/ast/function/method/protected.kt +++ b/testData/ast/function/method/protected.kt @@ -1,2 +1,2 @@ -protected fun test() : Unit { +open protected fun test() : Unit { } \ No newline at end of file diff --git a/testData/ast/function/method/public.kt b/testData/ast/function/method/public.kt index d835330ec86..8f596ec1552 100644 --- a/testData/ast/function/method/public.kt +++ b/testData/ast/function/method/public.kt @@ -1,2 +1,2 @@ -public fun test() : Unit { +open public fun test() : Unit { } \ No newline at end of file diff --git a/testData/ast/inProjectionType/method/methodParams.kt b/testData/ast/inProjectionType/method/methodParams.kt index 6888dcd5c36..51fa30eb158 100644 --- a/testData/ast/inProjectionType/method/methodParams.kt +++ b/testData/ast/inProjectionType/method/methodParams.kt @@ -1,2 +1,2 @@ -fun popAll(dst : Collection?) : Unit { +open fun popAll(dst : Collection?) : Unit { } \ No newline at end of file diff --git a/testData/ast/newClassExpression/file/newClassByFullName.kt b/testData/ast/newClassExpression/file/newClassByFullName.kt index 9ce9a5525b4..127e33a9fea 100644 --- a/testData/ast/newClassExpression/file/newClassByFullName.kt +++ b/testData/ast/newClassExpression/file/newClassByFullName.kt @@ -2,7 +2,7 @@ namespace org.test { open class Library { } open class User { -fun main() : Unit { +open fun main() : Unit { var lib : Library? = org.test.Library() } } diff --git a/testData/ast/outProjectionType/method/methodParams.kt b/testData/ast/outProjectionType/method/methodParams.kt index 373c01e629f..895538b7d7f 100644 --- a/testData/ast/outProjectionType/method/methodParams.kt +++ b/testData/ast/outProjectionType/method/methodParams.kt @@ -1,2 +1,2 @@ -fun pushAll(src : Collection?) : Unit { +open fun pushAll(src : Collection?) : Unit { } \ No newline at end of file diff --git a/testData/ast/starProjectionType/method/methodParams.kt b/testData/ast/starProjectionType/method/methodParams.kt index 01ea4c15302..4e2b7104724 100644 --- a/testData/ast/starProjectionType/method/methodParams.kt +++ b/testData/ast/starProjectionType/method/methodParams.kt @@ -1,2 +1,2 @@ -fun wtf(w : Collection<*>?) : Unit { +open fun wtf(w : Collection<*>?) : Unit { } \ No newline at end of file diff --git a/testData/ast/superExpression/class/classAextendsB.kt b/testData/ast/superExpression/class/classAextendsB.kt index b917dff44e3..51a5d46232a 100644 --- a/testData/ast/superExpression/class/classAextendsB.kt +++ b/testData/ast/superExpression/class/classAextendsB.kt @@ -1,5 +1,5 @@ open class B { -fun call() : Unit { +open fun call() : Unit { } } open class A : B { diff --git a/testData/ast/superExpression/file/classAdotSuperFoo.kt b/testData/ast/superExpression/file/classAdotSuperFoo.kt index e2c1d9213db..a6669abc1e1 100644 --- a/testData/ast/superExpression/file/classAdotSuperFoo.kt +++ b/testData/ast/superExpression/file/classAdotSuperFoo.kt @@ -1,10 +1,10 @@ namespace { open class Base { -fun foo() : Unit +open fun foo() : Unit } open class A : Base { open class C { -fun test() : Unit { +open fun test() : Unit { super@A.foo() } } diff --git a/testData/ast/thisExpression/file/classAdotThisFoo.kt b/testData/ast/thisExpression/file/classAdotThisFoo.kt index 939b443357a..066258741cf 100644 --- a/testData/ast/thisExpression/file/classAdotThisFoo.kt +++ b/testData/ast/thisExpression/file/classAdotThisFoo.kt @@ -1,11 +1,11 @@ namespace { open class Base { -fun foo() : Unit { +open fun foo() : Unit { } } open class A : Base { open class C { -fun test() : Unit { +open fun test() : Unit { this@A.foo() } } diff --git a/testData/ast/trait/class/interfaceWithMethodDeclaration.kt b/testData/ast/trait/class/interfaceWithMethodDeclaration.kt index 6ce36f8d783..aff8b40c610 100644 --- a/testData/ast/trait/class/interfaceWithMethodDeclaration.kt +++ b/testData/ast/trait/class/interfaceWithMethodDeclaration.kt @@ -1,4 +1,4 @@ trait INode { -fun getTag() : Tag? -fun toKotlin() : String? +open fun getTag() : Tag? +open fun toKotlin() : String? } \ No newline at end of file diff --git a/testData/ast/typeParameters/method/methodDoubleParametrizationWithTwoBounds.kt b/testData/ast/typeParameters/method/methodDoubleParametrizationWithTwoBounds.kt index 21f892b7d8d..d29c4d690fb 100644 --- a/testData/ast/typeParameters/method/methodDoubleParametrizationWithTwoBounds.kt +++ b/testData/ast/typeParameters/method/methodDoubleParametrizationWithTwoBounds.kt @@ -1,2 +1,2 @@ -fun max(coll : Collection?) : T? where T : Comparable?, K : Collection? { +open fun max(coll : Collection?) : T? where T : Comparable?, K : Collection? { } \ No newline at end of file diff --git a/testData/ast/typeParameters/method/where.kt b/testData/ast/typeParameters/method/where.kt index 6a1ccaeeec6..732410c49ba 100644 --- a/testData/ast/typeParameters/method/where.kt +++ b/testData/ast/typeParameters/method/where.kt @@ -1,2 +1,2 @@ -fun max(coll : Collection?) : T? where T : Comparable? { +open fun max(coll : Collection?) : T? where T : Comparable? { } \ No newline at end of file diff --git a/testData/ast/varArg/method/ellipsisTypeSeveralParams.kt b/testData/ast/varArg/method/ellipsisTypeSeveralParams.kt index 78207eee74b..b69052b794a 100644 --- a/testData/ast/varArg/method/ellipsisTypeSeveralParams.kt +++ b/testData/ast/varArg/method/ellipsisTypeSeveralParams.kt @@ -1 +1 @@ -fun format(pattern : String?, vararg arguments : Any?) : String? \ No newline at end of file +open fun format(pattern : String?, vararg arguments : Any?) : String? \ No newline at end of file diff --git a/testData/ast/varArg/method/ellipsisTypeSingleParams.kt b/testData/ast/varArg/method/ellipsisTypeSingleParams.kt index 5219629e1e3..3dc3d147740 100644 --- a/testData/ast/varArg/method/ellipsisTypeSingleParams.kt +++ b/testData/ast/varArg/method/ellipsisTypeSingleParams.kt @@ -1,2 +1,2 @@ -fun pushAll(vararg objs : Any?) : Unit { +open fun pushAll(vararg objs : Any?) : Unit { } \ No newline at end of file From 4e8da83efa7f97146d85756ae6a7370b8f0a93a3 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 7 Nov 2011 20:09:43 +0400 Subject: [PATCH 077/206] test for private init method added --- testData/ast/class/file/privateInit.jav | 4 ++++ testData/ast/class/file/privateInit.kt | 6 ++++++ 2 files changed, 10 insertions(+) create mode 100644 testData/ast/class/file/privateInit.jav create mode 100644 testData/ast/class/file/privateInit.kt diff --git a/testData/ast/class/file/privateInit.jav b/testData/ast/class/file/privateInit.jav new file mode 100644 index 00000000000..5a65a0cc32b --- /dev/null +++ b/testData/ast/class/file/privateInit.jav @@ -0,0 +1,4 @@ +public class MyClass { + private void init(int arg1, int arg2, int arg3) { + } +} \ No newline at end of file diff --git a/testData/ast/class/file/privateInit.kt b/testData/ast/class/file/privateInit.kt new file mode 100644 index 00000000000..907ba769b3f --- /dev/null +++ b/testData/ast/class/file/privateInit.kt @@ -0,0 +1,6 @@ +namespace { +public open class MyClass { +open private fun init(arg1 : Int, arg2 : Int, arg3 : Int) : Unit { +} +} +} \ No newline at end of file From 33f3350bb0a819bbd94f3ce79f4d9a61db5f2f03 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 8 Nov 2011 13:12:07 +0400 Subject: [PATCH 078/206] Makefile added --- Makefile | 11 +++++++++++ remove.sh | 3 --- rename.sh | 3 --- 3 files changed, 11 insertions(+), 6 deletions(-) create mode 100644 Makefile delete mode 100755 remove.sh delete mode 100755 rename.sh diff --git a/Makefile b/Makefile new file mode 100644 index 00000000000..f2b7eb174f3 --- /dev/null +++ b/Makefile @@ -0,0 +1,11 @@ +move-tmp-to-kt: + rename -f s/.kt.tmp/.kt/ `find "testData" -name "*.kt.tmp"` + +remove-tmp: + rm `find "testData" -name "*.kt.tmp"` + +disable-sandbox: + cd ~/.IdeaIC11/system/ && mv plugins-sandbox plugins-sandbox.tmp + +enable-sandbox: + cd ~/.IdeaIC11/system/ && mv plugins-sandbox.tmp ./plugins-sandbox \ No newline at end of file diff --git a/remove.sh b/remove.sh deleted file mode 100755 index 2b067d09bc6..00000000000 --- a/remove.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -rm `find "testData" -name "*.kt.tmp"` diff --git a/rename.sh b/rename.sh deleted file mode 100755 index e131fdc40c6..00000000000 --- a/rename.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -rename -f s/.kt.tmp/.kt/ `find "testData" -name "*.kt.tmp"` From 39112d6327e2758866c89fa024bfc0605809de17 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 8 Nov 2011 14:23:30 +0400 Subject: [PATCH 079/206] example with customer builder added, initial support for constructors added --- Makefile | 2 +- src/org/jetbrains/jet/j2k/Converter.java | 11 +++- src/org/jetbrains/jet/j2k/ast/Class.java | 32 +++++++++-- .../jetbrains/jet/j2k/ast/Constructor.java | 19 ++++++- src/org/jetbrains/jet/j2k/ast/Enum.java | 4 +- src/org/jetbrains/jet/j2k/ast/Trait.java | 5 ++ .../jet/j2k/visitors/ExpressionVisitor.java | 25 ++++++++- .../jet/j2k/JavaToKotlinConverterTest.java | 17 +++--- .../file/libraryFieldCall.kt | 4 +- .../file/libraryMethodCall.kt | 4 +- .../file/libraryMethodCallFromInstance.kt | 4 +- .../file/libraryStringFieldCall.kt | 4 +- testData/ast/class/class/abstractClass.kt | 2 +- .../ast/class/class/abstractClassShape.kt | 4 +- testData/ast/class/class/class.kt | 2 +- .../ast/class/class/classWithEmptyMethods.kt | 2 +- testData/ast/class/class/classWithFields.kt | 2 +- .../class/class/classWithMultiplyFields.kt | 2 +- testData/ast/class/class/emptyClass.kt | 2 +- ...xtendsOneClassAndImplementsOneInterface.kt | 2 +- ...sOneClassAndImplementsSeveralInterfaces.kt | 2 +- testData/ast/class/class/finalClass.kt | 2 +- testData/ast/class/class/genericClass.kt | 2 +- testData/ast/class/class/innerEmptyClass.kt | 4 +- testData/ast/class/class/innerStaticClass.kt | 4 +- testData/ast/class/class/internalClass.kt | 2 +- .../class/class/oneStaticFieldOneNonStatic.kt | 2 +- testData/ast/class/class/oneStaticMethod.kt | 2 +- .../class/oneStaticMethodOneNonStatic.kt | 2 +- testData/ast/class/class/pivateClass.kt | 2 +- testData/ast/class/class/protectedClass.kt | 2 +- testData/ast/class/class/publicClass.kt | 2 +- testData/ast/class/class/simpleInheritance.kt | 2 +- testData/ast/class/class/twoStaticMethod.kt | 2 +- testData/ast/class/file/privateInit.kt | 2 +- .../ast/constructors/file/customerBuilder.jav | 54 +++++++++++++++++++ .../ast/constructors/file/customerBuilder.kt | 46 ++++++++++++++++ testData/ast/file/file/packageWithClass.kt | 2 +- testData/ast/file/file/packageWithClasses.kt | 4 +- .../ast/file/file/packageWithOpenClass.kt | 2 +- testData/ast/function/file/override.kt | 4 +- testData/ast/function/file/overrideAndOpen.kt | 6 +-- .../file/newClassByFullName.kt | 4 +- .../superExpression/class/classAextendsB.kt | 7 ++- .../superExpression/file/classAdotSuperFoo.kt | 6 +-- .../thisExpression/file/classAdotThisFoo.kt | 6 +-- ...rametrizationWithTwoBoundsWithExtending.kt | 2 +- .../classParametrizationWithTwoBounds.kt | 2 +- ...rametrizationWithTwoBoundsWithExtending.kt | 2 +- .../ast/typeParameters/class/genericClass.kt | 2 +- 50 files changed, 259 insertions(+), 73 deletions(-) create mode 100644 testData/ast/constructors/file/customerBuilder.jav create mode 100644 testData/ast/constructors/file/customerBuilder.kt diff --git a/Makefile b/Makefile index f2b7eb174f3..3b2e38e499f 100644 --- a/Makefile +++ b/Makefile @@ -8,4 +8,4 @@ disable-sandbox: cd ~/.IdeaIC11/system/ && mv plugins-sandbox plugins-sandbox.tmp enable-sandbox: - cd ~/.IdeaIC11/system/ && mv plugins-sandbox.tmp ./plugins-sandbox \ No newline at end of file + cd ~/.IdeaIC11/system/ && rm -rf plugins-sandbox && mv plugins-sandbox.tmp ./plugins-sandbox \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 0c63e555730..e0b8c5c88df 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -135,15 +135,22 @@ public class Converter { if (method.getParent() instanceof PsiClass && ((PsiClass) method.getParent()).isInterface()) modifiers.remove(Modifier.ABSTRACT); - if (method.isConstructor()) + + if (method.isConstructor()) { + boolean isPrimary = false; + if (method.getParent() instanceof PsiClass && ((PsiClass) method.getParent()).getConstructors().length == 1) + isPrimary = true; + return new Constructor( identifier, modifiers, type, typeParameters, params, - body + body, + isPrimary ); + } return new Function( identifier, modifiers, diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java index 4d2ea0238ef..4c0ddded791 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -1,6 +1,7 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.j2k.util.AstUtil; import java.util.LinkedList; @@ -32,6 +33,29 @@ public class Class extends Member { myFields = fields; } + @Nullable + private Constructor getPrimaryConstructor() { + for (Function m : myMethods) + if (m.getKind() == Kind.CONSTRUCTOR) + if (((Constructor) m).isPrimary()) + return (Constructor) m; + return null; + } + + String primaryConstructorSignatureToKotlin() { + Constructor maybeConstructor = getPrimaryConstructor(); + if (maybeConstructor != null) + return maybeConstructor.primarySignatureToKotlin(); + return "(" + ")"; + } + + String primaryConstructorBodyToKotlin() { + Constructor maybeConstructor = getPrimaryConstructor(); + if (maybeConstructor != null) + return maybeConstructor.primaryBodyToKotlin(); + return EMPTY; + } + private boolean hasWhere() { for (Element t : myTypeParameters) if (t instanceof TypeParameter && ((TypeParameter) t).hasWhere()) @@ -99,8 +123,10 @@ public class Class extends Member { } String bodyToKotlin() { - return SPACE + "{" + N + classObjectToKotlin() + N + + return SPACE + "{" + N + + classObjectToKotlin() + N + AstUtil.joinNodes(getNonStatic(myFields), N) + N + + primaryConstructorBodyToKotlin() + N + AstUtil.joinNodes(getNonStatic(methodsExceptConstructors()), N) + N + AstUtil.joinNodes(getNonStatic(myInnerClasses), N) + N + "}"; @@ -139,9 +165,9 @@ public class Class extends Member { @NotNull @Override public String toKotlin() { - return modifiersToKotlin() + TYPE + SPACE + myName.toKotlin() + typeParametersToKotlin() + + return modifiersToKotlin() + TYPE + SPACE + myName.toKotlin() + typeParametersToKotlin() + primaryConstructorSignatureToKotlin() + implementTypesToKotlin() + typeParameterWhereToKotlin() + bodyToKotlin(); } -} +} \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/ast/Constructor.java b/src/org/jetbrains/jet/j2k/ast/Constructor.java index 3e97cadd26f..c3231f7fafd 100644 --- a/src/org/jetbrains/jet/j2k/ast/Constructor.java +++ b/src/org/jetbrains/jet/j2k/ast/Constructor.java @@ -9,11 +9,26 @@ import java.util.Set; * @author ignatov */ public class Constructor extends Function { - public Constructor(Identifier identifier, Set modifiers, Type type, List typeParameters, Element params, Block block) { + private boolean myIsPrimary; + + public Constructor(Identifier identifier, Set modifiers, Type type, List typeParameters, Element params, Block block, boolean isPrimary) { super(identifier, modifiers, type, typeParameters, params, block); + myIsPrimary = isPrimary; } - public String primary() { + public String primarySignatureToKotlin() { + return "(" + myParams.toKotlin() + ")"; + } + + public String primaryBodyToKotlin() { + return myBlock.toKotlin(); + } + + public boolean isPrimary() { + return myIsPrimary; + } + + public String privatePrimaryToKotlin() { return modifiersToKotlin() + "(" + myParams.toKotlin() + ")" + SPACE + myBlock.toKotlin(); } diff --git a/src/org/jetbrains/jet/j2k/ast/Enum.java b/src/org/jetbrains/jet/j2k/ast/Enum.java index 4f69eb11f23..e7c7dd0867f 100644 --- a/src/org/jetbrains/jet/j2k/ast/Enum.java +++ b/src/org/jetbrains/jet/j2k/ast/Enum.java @@ -26,7 +26,7 @@ public class Enum extends Class { private String primaryConstructorToKotlin() { Constructor maybeConstructor = getPrimaryConstructor(); if (maybeConstructor != null) - return maybeConstructor.primary(); + return maybeConstructor.privatePrimaryToKotlin(); return EMPTY; } @@ -45,4 +45,4 @@ public class Enum extends Class { AstUtil.joinNodes(myInnerClasses, N) + N + "}"; } -} +} \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/ast/Trait.java b/src/org/jetbrains/jet/j2k/ast/Trait.java index 14fea577b6e..db6d5a8af86 100644 --- a/src/org/jetbrains/jet/j2k/ast/Trait.java +++ b/src/org/jetbrains/jet/j2k/ast/Trait.java @@ -14,6 +14,11 @@ public class Trait extends Class { TYPE = "trait"; } + @Override + String primaryConstructorSignatureToKotlin() { + return EMPTY; + } + boolean needOpenModifier() { return false; } diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index ebdb7d80e3e..65e2ba87160 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -229,10 +229,33 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { @Override public void visitReferenceExpression(PsiReferenceExpression expression) { super.visitReferenceExpression(expression); + + boolean hasDollar = false; + final PsiReference reference = expression.getReference(); + if (reference != null) { + final PsiElement resolvedReference = reference.resolve(); + if (resolvedReference != null) { + if (resolvedReference instanceof PsiField) { + final PsiModifierList modifierList = ((PsiField) resolvedReference).getModifierList(); + if (modifierList != null && modifierList.hasExplicitModifier(PsiModifier.FINAL)) { + PsiElement context = expression.getContext(); + while (context != null) { + if (context instanceof PsiMethod && ((PsiMethod) context).isConstructor()) { + hasDollar = true; + break; + } + context = context.getContext(); + } + } + } + } + } + boolean isNullable = typeToType(expression.getType()).isNullable(); + final IdentifierImpl identifier = hasDollar ? new IdentifierImpl("$" + expression.getReferenceName(), isNullable) : new IdentifierImpl(expression.getReferenceName(), isNullable); myResult = new CallChainExpression( expressionToExpression(expression.getQualifierExpression()), - new IdentifierImpl(expression.getReferenceName(), isNullable) // TODO: if type exists so id is nullable + identifier // TODO: if type exists so id is nullable ); } diff --git a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java index 339675b623f..7c91759fc90 100644 --- a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java +++ b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java @@ -47,15 +47,20 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { else if (javaFile.getParent().endsWith("/class")) actual = classToKotlin(javaCode); else if (javaFile.getParent().endsWith("/file")) actual = fileToKotlin(javaCode); - assert !actual.equals(""); + assert !actual.equals("") : "Specify what is it: file, class, method, statement or expression"; + final File tmp = new File(kotlinPath + ".tmp"); - if (!expected.equals(actual)) - writeStringToFile(tmp, actual); - if (expected.equals(actual) && tmp.exists()) - tmp.delete(); + if (!expected.equals(actual)) writeStringToFile(tmp, actual); + if (expected.equals(actual) && tmp.exists()) tmp.delete(); + Assert.assertEquals(expected, actual); } + @Override + protected void setUp() throws Exception { + super.setUp(); + } + @NotNull protected String getTestFilePath() { return myDataPath + File.separator + myName + ".jav"; @@ -114,7 +119,7 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { @NotNull protected String methodToKotlin(String text) throws IOException { String result = classToKotlin("final class C {" + text + "}") - .replaceAll("class C \\{", ""); + .replaceAll("class C\\(\\) \\{", ""); result = result.substring(0, result.lastIndexOf("}")); return prettify(result); } diff --git a/testData/ast/callChainExpression/file/libraryFieldCall.kt b/testData/ast/callChainExpression/file/libraryFieldCall.kt index 23aed853064..a2964383fe6 100644 --- a/testData/ast/callChainExpression/file/libraryFieldCall.kt +++ b/testData/ast/callChainExpression/file/libraryFieldCall.kt @@ -1,10 +1,10 @@ namespace { -open class Library { +open class Library() { class object { val ourOut : PrintStream? } } -open class User { +open class User() { open fun main() : Unit { Library.ourOut?.print() } diff --git a/testData/ast/callChainExpression/file/libraryMethodCall.kt b/testData/ast/callChainExpression/file/libraryMethodCall.kt index 18c230c50f7..6edfbe4c62e 100644 --- a/testData/ast/callChainExpression/file/libraryMethodCall.kt +++ b/testData/ast/callChainExpression/file/libraryMethodCall.kt @@ -1,5 +1,5 @@ namespace { -open class Library { +open class Library() { class object { open fun call() : Unit { } @@ -8,7 +8,7 @@ return "" } } } -open class User { +open class User() { open fun main() : Unit { Library.call() Library.getString()?.isEmpty() diff --git a/testData/ast/callChainExpression/file/libraryMethodCallFromInstance.kt b/testData/ast/callChainExpression/file/libraryMethodCallFromInstance.kt index 25c9bffb924..c51089095b2 100644 --- a/testData/ast/callChainExpression/file/libraryMethodCallFromInstance.kt +++ b/testData/ast/callChainExpression/file/libraryMethodCallFromInstance.kt @@ -1,12 +1,12 @@ namespace { -open class Library { +open class Library() { open fun call() : Unit { } open fun getString() : String? { return "" } } -open class User { +open class User() { open fun main() : Unit { var lib : Library? = Library() lib?.call() diff --git a/testData/ast/callChainExpression/file/libraryStringFieldCall.kt b/testData/ast/callChainExpression/file/libraryStringFieldCall.kt index 82210f26905..5a349644206 100644 --- a/testData/ast/callChainExpression/file/libraryStringFieldCall.kt +++ b/testData/ast/callChainExpression/file/libraryStringFieldCall.kt @@ -1,8 +1,8 @@ namespace { -open class Library { +open class Library() { public val myString : String? } -open class User { +open class User() { open fun main() : Unit { Library.myString?.isEmpty() } diff --git a/testData/ast/class/class/abstractClass.kt b/testData/ast/class/class/abstractClass.kt index 6bbb45f4c22..7f1ee42ef6f 100644 --- a/testData/ast/class/class/abstractClass.kt +++ b/testData/ast/class/class/abstractClass.kt @@ -1,4 +1,4 @@ -abstract open class A { +abstract open class A() { abstract open fun callme() : Unit open fun callmetoo() : Unit { print("This is a concrete method.") diff --git a/testData/ast/class/class/abstractClassShape.kt b/testData/ast/class/class/abstractClassShape.kt index 747d1875178..a4a33c15910 100644 --- a/testData/ast/class/class/abstractClassShape.kt +++ b/testData/ast/class/class/abstractClassShape.kt @@ -1,5 +1,7 @@ -abstract open class Shape { +abstract open class Shape() { public var color : String? +{ +} open public fun setColor(c : String?) : Unit { color = c } diff --git a/testData/ast/class/class/class.kt b/testData/ast/class/class/class.kt index 23873d0aaa3..bc29d4b27a1 100644 --- a/testData/ast/class/class/class.kt +++ b/testData/ast/class/class/class.kt @@ -1,2 +1,2 @@ -open class Test { +open class Test() { } \ No newline at end of file diff --git a/testData/ast/class/class/classWithEmptyMethods.kt b/testData/ast/class/class/classWithEmptyMethods.kt index 6d0b778a365..d92d545ffa0 100644 --- a/testData/ast/class/class/classWithEmptyMethods.kt +++ b/testData/ast/class/class/classWithEmptyMethods.kt @@ -1,4 +1,4 @@ -class T { +class T() { open fun main() : Unit { } open fun i() : Int { diff --git a/testData/ast/class/class/classWithFields.kt b/testData/ast/class/class/classWithFields.kt index e4b83fcd5fa..defec3e4ac3 100644 --- a/testData/ast/class/class/classWithFields.kt +++ b/testData/ast/class/class/classWithFields.kt @@ -1,4 +1,4 @@ -class T { +class T() { var a : String? = "abc" var b : Int = 10 } \ No newline at end of file diff --git a/testData/ast/class/class/classWithMultiplyFields.kt b/testData/ast/class/class/classWithMultiplyFields.kt index 43274e811c8..03b2647a157 100644 --- a/testData/ast/class/class/classWithMultiplyFields.kt +++ b/testData/ast/class/class/classWithMultiplyFields.kt @@ -1,4 +1,4 @@ -class T { +class T() { var a : String? var b : String? var c : String? = "abc" diff --git a/testData/ast/class/class/emptyClass.kt b/testData/ast/class/class/emptyClass.kt index a7ca22abab4..161cb193d08 100644 --- a/testData/ast/class/class/emptyClass.kt +++ b/testData/ast/class/class/emptyClass.kt @@ -1,2 +1,2 @@ -class A { +class A() { } \ No newline at end of file diff --git a/testData/ast/class/class/extendsOneClassAndImplementsOneInterface.kt b/testData/ast/class/class/extendsOneClassAndImplementsOneInterface.kt index 0567238ee84..99eb1856528 100644 --- a/testData/ast/class/class/extendsOneClassAndImplementsOneInterface.kt +++ b/testData/ast/class/class/extendsOneClassAndImplementsOneInterface.kt @@ -1,2 +1,2 @@ -class A : Base, I { +class A() : Base, I { } \ No newline at end of file diff --git a/testData/ast/class/class/extendsOneClassAndImplementsSeveralInterfaces.kt b/testData/ast/class/class/extendsOneClassAndImplementsSeveralInterfaces.kt index dc9dddf3cba..25348484337 100644 --- a/testData/ast/class/class/extendsOneClassAndImplementsSeveralInterfaces.kt +++ b/testData/ast/class/class/extendsOneClassAndImplementsSeveralInterfaces.kt @@ -1,2 +1,2 @@ -class A : Base, I0, I1, I2 { +class A() : Base, I0, I1, I2 { } \ No newline at end of file diff --git a/testData/ast/class/class/finalClass.kt b/testData/ast/class/class/finalClass.kt index 96d83e0c503..98c16b37053 100644 --- a/testData/ast/class/class/finalClass.kt +++ b/testData/ast/class/class/finalClass.kt @@ -1,2 +1,2 @@ -class Test { +class Test() { } \ No newline at end of file diff --git a/testData/ast/class/class/genericClass.kt b/testData/ast/class/class/genericClass.kt index 3bdd861a5fd..f3565e5ec30 100644 --- a/testData/ast/class/class/genericClass.kt +++ b/testData/ast/class/class/genericClass.kt @@ -1,2 +1,2 @@ -class Entry { +class Entry() { } \ No newline at end of file diff --git a/testData/ast/class/class/innerEmptyClass.kt b/testData/ast/class/class/innerEmptyClass.kt index 22bcf13b976..983e65e757e 100644 --- a/testData/ast/class/class/innerEmptyClass.kt +++ b/testData/ast/class/class/innerEmptyClass.kt @@ -1,4 +1,4 @@ -class A { -class B { +class A() { +class B() { } } \ No newline at end of file diff --git a/testData/ast/class/class/innerStaticClass.kt b/testData/ast/class/class/innerStaticClass.kt index 96ce2d1beab..dc0ae41dff2 100644 --- a/testData/ast/class/class/innerStaticClass.kt +++ b/testData/ast/class/class/innerStaticClass.kt @@ -1,6 +1,6 @@ -class S { +class S() { class object { -open class Inner { +open class Inner() { } } } \ No newline at end of file diff --git a/testData/ast/class/class/internalClass.kt b/testData/ast/class/class/internalClass.kt index 23873d0aaa3..bc29d4b27a1 100644 --- a/testData/ast/class/class/internalClass.kt +++ b/testData/ast/class/class/internalClass.kt @@ -1,2 +1,2 @@ -open class Test { +open class Test() { } \ No newline at end of file diff --git a/testData/ast/class/class/oneStaticFieldOneNonStatic.kt b/testData/ast/class/class/oneStaticFieldOneNonStatic.kt index c3fb86321a3..ebff54572d4 100644 --- a/testData/ast/class/class/oneStaticFieldOneNonStatic.kt +++ b/testData/ast/class/class/oneStaticFieldOneNonStatic.kt @@ -1,4 +1,4 @@ -class S { +class S() { class object { var myI : Int = 10 } diff --git a/testData/ast/class/class/oneStaticMethod.kt b/testData/ast/class/class/oneStaticMethod.kt index 90a9a2ece81..6906f476300 100644 --- a/testData/ast/class/class/oneStaticMethod.kt +++ b/testData/ast/class/class/oneStaticMethod.kt @@ -1,4 +1,4 @@ -class S { +class S() { class object { open fun staticF() : Boolean { return true diff --git a/testData/ast/class/class/oneStaticMethodOneNonStatic.kt b/testData/ast/class/class/oneStaticMethodOneNonStatic.kt index baad5b8c59f..a50ebaff602 100644 --- a/testData/ast/class/class/oneStaticMethodOneNonStatic.kt +++ b/testData/ast/class/class/oneStaticMethodOneNonStatic.kt @@ -1,4 +1,4 @@ -class S { +class S() { class object { open fun sI() : Int { return 1 diff --git a/testData/ast/class/class/pivateClass.kt b/testData/ast/class/class/pivateClass.kt index 8085e2675d2..96001c69f28 100644 --- a/testData/ast/class/class/pivateClass.kt +++ b/testData/ast/class/class/pivateClass.kt @@ -1,2 +1,2 @@ -private open class Test { +private open class Test() { } \ No newline at end of file diff --git a/testData/ast/class/class/protectedClass.kt b/testData/ast/class/class/protectedClass.kt index 60bd6ecdb0c..e82caa26cd0 100644 --- a/testData/ast/class/class/protectedClass.kt +++ b/testData/ast/class/class/protectedClass.kt @@ -1,2 +1,2 @@ -protected open class Test { +protected open class Test() { } \ No newline at end of file diff --git a/testData/ast/class/class/publicClass.kt b/testData/ast/class/class/publicClass.kt index 44aae358376..98e32f1aca0 100644 --- a/testData/ast/class/class/publicClass.kt +++ b/testData/ast/class/class/publicClass.kt @@ -1,2 +1,2 @@ -public open class Test { +public open class Test() { } \ No newline at end of file diff --git a/testData/ast/class/class/simpleInheritance.kt b/testData/ast/class/class/simpleInheritance.kt index 9fe01fc7381..7292c1b424c 100644 --- a/testData/ast/class/class/simpleInheritance.kt +++ b/testData/ast/class/class/simpleInheritance.kt @@ -1,2 +1,2 @@ -class A : Base { +class A() : Base { } \ No newline at end of file diff --git a/testData/ast/class/class/twoStaticMethod.kt b/testData/ast/class/class/twoStaticMethod.kt index 64df630cc7e..0500e4be576 100644 --- a/testData/ast/class/class/twoStaticMethod.kt +++ b/testData/ast/class/class/twoStaticMethod.kt @@ -1,4 +1,4 @@ -class S { +class S() { class object { open fun sB() : Boolean { return true diff --git a/testData/ast/class/file/privateInit.kt b/testData/ast/class/file/privateInit.kt index 907ba769b3f..9b62ed9464a 100644 --- a/testData/ast/class/file/privateInit.kt +++ b/testData/ast/class/file/privateInit.kt @@ -1,5 +1,5 @@ namespace { -public open class MyClass { +public open class MyClass() { open private fun init(arg1 : Int, arg2 : Int, arg3 : Int) : Unit { } } diff --git a/testData/ast/constructors/file/customerBuilder.jav b/testData/ast/constructors/file/customerBuilder.jav new file mode 100644 index 00000000000..4f99ad3c63d --- /dev/null +++ b/testData/ast/constructors/file/customerBuilder.jav @@ -0,0 +1,54 @@ +package org.test.customer + +class Customer { + public final String _firstName; + public final String _lastName; + + Customer(String first, String last) { + doSmthBefore(); + _firstName = first; + _lastName = last; + doSmthAfter(); + } + + public String getFirstName() { + return _firstName; + } + + public String getLastName() { + return _lastName; + } + + private void doSmthBefore() {} + private void doSmthAfter() {} +} + +class CustomerBuilder { + public String _firstName = "Homer"; + public String _lastName = "Simpson"; + + public CustomerBuilder WithFirstName(String firstName) { + _firstName = firstName; + return this; + } + + public CustomerBuilder WithLastName(String lastName) { + _lastName = lastName; + return this; + } + + public Customer Build() { + return new Customer(_firstName, _lastName); + } +} + +public class User { + public static void main(Array[String] args) { + Customer customer = new CustomerBuilder() + .WithFirstName("Homer") + .WithLastName("Simpson") + .Build(); + System.out.println(customer.getFirstName()); + System.out.println(customer.getLastName()); + } +} \ No newline at end of file diff --git a/testData/ast/constructors/file/customerBuilder.kt b/testData/ast/constructors/file/customerBuilder.kt new file mode 100644 index 00000000000..8d59f2c5543 --- /dev/null +++ b/testData/ast/constructors/file/customerBuilder.kt @@ -0,0 +1,46 @@ +namespace org.test.customer { +open class Customer(first : String?, last : String?) { +public val _firstName : String? +public val _lastName : String? +{ +doSmthBefore() +$_firstName = first +$_lastName = last +doSmthAfter() +} +open public fun getFirstName() : String? { +return _firstName +} +open public fun getLastName() : String? { +return _lastName +} +open private fun doSmthBefore() : Unit { +} +open private fun doSmthAfter() : Unit { +} +} +open class CustomerBuilder() { +public var _firstName : String? = "Homer" +public var _lastName : String? = "Simpson" +open public fun WithFirstName(firstName : String?) : CustomerBuilder? { +_firstName = firstName +return this +} +open public fun WithLastName(lastName : String?) : CustomerBuilder? { +_lastName = lastName +return this +} +open public fun Build() : Customer? { +return org.test.customer.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() +System.`out`?.println(customer?.getFirstName()) +System.`out`?.println(customer?.getLastName()) +} +} +} +} \ No newline at end of file diff --git a/testData/ast/file/file/packageWithClass.kt b/testData/ast/file/file/packageWithClass.kt index f08440c2d5d..48abf7a9bbf 100644 --- a/testData/ast/file/file/packageWithClass.kt +++ b/testData/ast/file/file/packageWithClass.kt @@ -1,4 +1,4 @@ namespace test { -class C { +class C() { } } \ No newline at end of file diff --git a/testData/ast/file/file/packageWithClasses.kt b/testData/ast/file/file/packageWithClasses.kt index c57933a501a..cee28676b2a 100644 --- a/testData/ast/file/file/packageWithClasses.kt +++ b/testData/ast/file/file/packageWithClasses.kt @@ -1,6 +1,6 @@ namespace { -class A { +class A() { } -class B { +class B() { } } \ No newline at end of file diff --git a/testData/ast/file/file/packageWithOpenClass.kt b/testData/ast/file/file/packageWithOpenClass.kt index 17aa91ce5cb..e229fa8c6ee 100644 --- a/testData/ast/file/file/packageWithOpenClass.kt +++ b/testData/ast/file/file/packageWithOpenClass.kt @@ -1,4 +1,4 @@ namespace test { -open class C { +open class C() { } } \ No newline at end of file diff --git a/testData/ast/function/file/override.kt b/testData/ast/function/file/override.kt index c080ae67068..3e876fa6a4e 100644 --- a/testData/ast/function/file/override.kt +++ b/testData/ast/function/file/override.kt @@ -1,9 +1,9 @@ namespace { -open class A { +open class A() { open fun a() : Unit { } } -class B : A { +class B() : A { override fun a() : Unit { } } diff --git a/testData/ast/function/file/overrideAndOpen.kt b/testData/ast/function/file/overrideAndOpen.kt index 10b231c8b89..9d8da0fbbbb 100644 --- a/testData/ast/function/file/overrideAndOpen.kt +++ b/testData/ast/function/file/overrideAndOpen.kt @@ -1,13 +1,13 @@ namespace { -open class A { +open class A() { open fun foo() : Unit { } } -open class B : A { +open class B() : A { override fun foo() : Unit { } } -open class C : B { +open class C() : B { override fun foo() : Unit { } } diff --git a/testData/ast/newClassExpression/file/newClassByFullName.kt b/testData/ast/newClassExpression/file/newClassByFullName.kt index 127e33a9fea..560846c9186 100644 --- a/testData/ast/newClassExpression/file/newClassByFullName.kt +++ b/testData/ast/newClassExpression/file/newClassByFullName.kt @@ -1,7 +1,7 @@ namespace org.test { -open class Library { +open class Library() { } -open class User { +open class User() { open fun main() : Unit { var lib : Library? = org.test.Library() } diff --git a/testData/ast/superExpression/class/classAextendsB.kt b/testData/ast/superExpression/class/classAextendsB.kt index 51a5d46232a..1ecd361e2e6 100644 --- a/testData/ast/superExpression/class/classAextendsB.kt +++ b/testData/ast/superExpression/class/classAextendsB.kt @@ -1,8 +1,11 @@ -open class B { +open class B() { open fun call() : Unit { } } -open class A : B { +open class A() : B { +{ +super() +} override fun call() : Unit { return super.call() } diff --git a/testData/ast/superExpression/file/classAdotSuperFoo.kt b/testData/ast/superExpression/file/classAdotSuperFoo.kt index a6669abc1e1..09bf6db3f67 100644 --- a/testData/ast/superExpression/file/classAdotSuperFoo.kt +++ b/testData/ast/superExpression/file/classAdotSuperFoo.kt @@ -1,9 +1,9 @@ namespace { -open class Base { +open class Base() { open fun foo() : Unit } -open class A : Base { -open class C { +open class A() : Base { +open class C() { open fun test() : Unit { super@A.foo() } diff --git a/testData/ast/thisExpression/file/classAdotThisFoo.kt b/testData/ast/thisExpression/file/classAdotThisFoo.kt index 066258741cf..201ba4f7bd7 100644 --- a/testData/ast/thisExpression/file/classAdotThisFoo.kt +++ b/testData/ast/thisExpression/file/classAdotThisFoo.kt @@ -1,10 +1,10 @@ namespace { -open class Base { +open class Base() { open fun foo() : Unit { } } -open class A : Base { -open class C { +open class A() : Base { +open class C() { open fun test() : Unit { this@A.foo() } diff --git a/testData/ast/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.kt b/testData/ast/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.kt index d85353e99f4..ee954ff1105 100644 --- a/testData/ast/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.kt +++ b/testData/ast/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.kt @@ -1,2 +1,2 @@ -class CC : A where T : Comparable?, K : Collection? { +class CC() : A where T : Comparable?, K : Collection? { } \ No newline at end of file diff --git a/testData/ast/typeParameters/class/classParametrizationWithTwoBounds.kt b/testData/ast/typeParameters/class/classParametrizationWithTwoBounds.kt index ef570ae9618..e6fa0f4ce21 100644 --- a/testData/ast/typeParameters/class/classParametrizationWithTwoBounds.kt +++ b/testData/ast/typeParameters/class/classParametrizationWithTwoBounds.kt @@ -1,2 +1,2 @@ -class C where T : Comparable? { +class C() where T : Comparable? { } \ No newline at end of file diff --git a/testData/ast/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.kt b/testData/ast/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.kt index 7ac90335e6e..e7c258a0f24 100644 --- a/testData/ast/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.kt +++ b/testData/ast/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.kt @@ -1,2 +1,2 @@ -class C : A where T : Comparable? { +class C() : A where T : Comparable? { } \ No newline at end of file diff --git a/testData/ast/typeParameters/class/genericClass.kt b/testData/ast/typeParameters/class/genericClass.kt index c2be9da34e3..dd8d1147200 100644 --- a/testData/ast/typeParameters/class/genericClass.kt +++ b/testData/ast/typeParameters/class/genericClass.kt @@ -1,2 +1,2 @@ -class Comparable { +class Comparable() { } \ No newline at end of file From 76995743d86985e9b808d757127edb4cd1ffbc84 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 8 Nov 2011 14:35:31 +0400 Subject: [PATCH 080/206] anonymous packages supported --- src/org/jetbrains/jet/j2k/ast/File.java | 6 ++++-- .../jet/j2k/JavaToKotlinConverterTest.java | 16 +++------------- .../callChainExpression/file/libraryFieldCall.kt | 2 -- .../file/libraryMethodCall.kt | 2 -- .../file/libraryMethodCallFromInstance.kt | 2 -- .../file/libraryStringFieldCall.kt | 2 -- testData/ast/class/file/privateInit.kt | 2 -- testData/ast/file/file/packageWithClasses.kt | 2 -- testData/ast/function/file/override.kt | 2 -- testData/ast/function/file/overrideAndOpen.kt | 2 -- .../superExpression/file/classAdotSuperFoo.kt | 2 -- .../ast/thisExpression/file/classAdotThisFoo.kt | 2 -- 12 files changed, 7 insertions(+), 35 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/ast/File.java b/src/org/jetbrains/jet/j2k/ast/File.java index c3d924a569d..da873d9419b 100644 --- a/src/org/jetbrains/jet/j2k/ast/File.java +++ b/src/org/jetbrains/jet/j2k/ast/File.java @@ -22,9 +22,11 @@ public class File extends Node { @NotNull @Override public String toKotlin() { + final String common = AstUtil.joinNodes(myImports, N) + N2 + AstUtil.joinNodes(myClasses, N) + N; + if (myPackageName.isEmpty()) + return common; return "namespace" + SPACE + myPackageName + SPACE + "{" + N + - AstUtil.joinNodes(myImports, N) + N2 + - AstUtil.joinNodes(myClasses, N) + N + + common + "}"; } } diff --git a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java index 7c91759fc90..51cb41ace6b 100644 --- a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java +++ b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java @@ -44,7 +44,7 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { if (javaFile.getParent().endsWith("/expression")) actual = expressionToKotlin(javaCode); else if (javaFile.getParent().endsWith("/statement")) actual = statementToKotlin(javaCode); else if (javaFile.getParent().endsWith("/method")) actual = methodToKotlin(javaCode); - else if (javaFile.getParent().endsWith("/class")) actual = classToKotlin(javaCode); + else if (javaFile.getParent().endsWith("/class")) actual = fileToKotlin(javaCode); else if (javaFile.getParent().endsWith("/file")) actual = fileToKotlin(javaCode); assert !actual.equals("") : "Specify what is it: file, class, method, statement or expression"; @@ -100,25 +100,15 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { configureFromFileText("test.java", text); } + @NotNull protected String fileToKotlin(String text) throws IOException { configureFromText(text); return prettify(Converter.fileToFile((PsiJavaFile) myFile).toKotlin()); } - @NotNull - protected String classToKotlin(String text) throws IOException { - configureFromText(text); - - PsiJavaFile javaFile = (PsiJavaFile) myFile; - - String result = prettify(Converter.fileToFile(javaFile).toKotlin()).replaceAll("namespace \\{", ""); - result = result.substring(0, result.lastIndexOf("}")); - return prettify(result); - } - @NotNull protected String methodToKotlin(String text) throws IOException { - String result = classToKotlin("final class C {" + text + "}") + String result = fileToKotlin("final class C {" + text + "}") .replaceAll("class C\\(\\) \\{", ""); result = result.substring(0, result.lastIndexOf("}")); return prettify(result); diff --git a/testData/ast/callChainExpression/file/libraryFieldCall.kt b/testData/ast/callChainExpression/file/libraryFieldCall.kt index a2964383fe6..868d83f109a 100644 --- a/testData/ast/callChainExpression/file/libraryFieldCall.kt +++ b/testData/ast/callChainExpression/file/libraryFieldCall.kt @@ -1,4 +1,3 @@ -namespace { open class Library() { class object { val ourOut : PrintStream? @@ -8,5 +7,4 @@ open class User() { open fun main() : Unit { Library.ourOut?.print() } -} } \ No newline at end of file diff --git a/testData/ast/callChainExpression/file/libraryMethodCall.kt b/testData/ast/callChainExpression/file/libraryMethodCall.kt index 6edfbe4c62e..3c0ee4c68a4 100644 --- a/testData/ast/callChainExpression/file/libraryMethodCall.kt +++ b/testData/ast/callChainExpression/file/libraryMethodCall.kt @@ -1,4 +1,3 @@ -namespace { open class Library() { class object { open fun call() : Unit { @@ -13,5 +12,4 @@ open fun main() : Unit { Library.call() Library.getString()?.isEmpty() } -} } \ No newline at end of file diff --git a/testData/ast/callChainExpression/file/libraryMethodCallFromInstance.kt b/testData/ast/callChainExpression/file/libraryMethodCallFromInstance.kt index c51089095b2..b8a02f01152 100644 --- a/testData/ast/callChainExpression/file/libraryMethodCallFromInstance.kt +++ b/testData/ast/callChainExpression/file/libraryMethodCallFromInstance.kt @@ -1,4 +1,3 @@ -namespace { open class Library() { open fun call() : Unit { } @@ -14,5 +13,4 @@ lib?.getString()?.isEmpty() Library().call() Library().getString()?.isEmpty() } -} } \ No newline at end of file diff --git a/testData/ast/callChainExpression/file/libraryStringFieldCall.kt b/testData/ast/callChainExpression/file/libraryStringFieldCall.kt index 5a349644206..bced464f750 100644 --- a/testData/ast/callChainExpression/file/libraryStringFieldCall.kt +++ b/testData/ast/callChainExpression/file/libraryStringFieldCall.kt @@ -1,4 +1,3 @@ -namespace { open class Library() { public val myString : String? } @@ -6,5 +5,4 @@ open class User() { open fun main() : Unit { Library.myString?.isEmpty() } -} } \ No newline at end of file diff --git a/testData/ast/class/file/privateInit.kt b/testData/ast/class/file/privateInit.kt index 9b62ed9464a..30b43c541d0 100644 --- a/testData/ast/class/file/privateInit.kt +++ b/testData/ast/class/file/privateInit.kt @@ -1,6 +1,4 @@ -namespace { public open class MyClass() { open private fun init(arg1 : Int, arg2 : Int, arg3 : Int) : Unit { } -} } \ No newline at end of file diff --git a/testData/ast/file/file/packageWithClasses.kt b/testData/ast/file/file/packageWithClasses.kt index cee28676b2a..4ed94efde09 100644 --- a/testData/ast/file/file/packageWithClasses.kt +++ b/testData/ast/file/file/packageWithClasses.kt @@ -1,6 +1,4 @@ -namespace { class A() { } class B() { -} } \ No newline at end of file diff --git a/testData/ast/function/file/override.kt b/testData/ast/function/file/override.kt index 3e876fa6a4e..7a355e48c06 100644 --- a/testData/ast/function/file/override.kt +++ b/testData/ast/function/file/override.kt @@ -1,4 +1,3 @@ -namespace { open class A() { open fun a() : Unit { } @@ -6,5 +5,4 @@ open fun a() : Unit { class B() : A { override fun a() : Unit { } -} } \ No newline at end of file diff --git a/testData/ast/function/file/overrideAndOpen.kt b/testData/ast/function/file/overrideAndOpen.kt index 9d8da0fbbbb..ee0eca7b214 100644 --- a/testData/ast/function/file/overrideAndOpen.kt +++ b/testData/ast/function/file/overrideAndOpen.kt @@ -1,4 +1,3 @@ -namespace { open class A() { open fun foo() : Unit { } @@ -10,5 +9,4 @@ override fun foo() : Unit { open class C() : B { override fun foo() : Unit { } -} } \ No newline at end of file diff --git a/testData/ast/superExpression/file/classAdotSuperFoo.kt b/testData/ast/superExpression/file/classAdotSuperFoo.kt index 09bf6db3f67..bdff091103c 100644 --- a/testData/ast/superExpression/file/classAdotSuperFoo.kt +++ b/testData/ast/superExpression/file/classAdotSuperFoo.kt @@ -1,4 +1,3 @@ -namespace { open class Base() { open fun foo() : Unit } @@ -8,5 +7,4 @@ open fun test() : Unit { super@A.foo() } } -} } \ No newline at end of file diff --git a/testData/ast/thisExpression/file/classAdotThisFoo.kt b/testData/ast/thisExpression/file/classAdotThisFoo.kt index 201ba4f7bd7..92197edc7c6 100644 --- a/testData/ast/thisExpression/file/classAdotThisFoo.kt +++ b/testData/ast/thisExpression/file/classAdotThisFoo.kt @@ -1,4 +1,3 @@ -namespace { open class Base() { open fun foo() : Unit { } @@ -9,5 +8,4 @@ open fun test() : Unit { this@A.foo() } } -} } \ No newline at end of file From 846ac36fab0ec0efb206f61d7fdc2318740b809a Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 8 Nov 2011 14:40:41 +0400 Subject: [PATCH 081/206] cleanup --- .../jet/j2k/visitors/ExpressionVisitor.java | 39 ++++++++++++------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 65e2ba87160..7dc769befb5 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -230,7 +230,19 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { public void visitReferenceExpression(PsiReferenceExpression expression) { super.visitReferenceExpression(expression); - boolean hasDollar = false; + boolean hasDollar = isFinalFieldReference(expression) && isInsideConstructor(expression); + boolean isNullable = typeToType(expression.getType()).isNullable(); + + final IdentifierImpl identifier = hasDollar ? + new IdentifierImpl("$" + expression.getReferenceName(), isNullable) : + new IdentifierImpl(expression.getReferenceName(), isNullable); + myResult = new CallChainExpression( + expressionToExpression(expression.getQualifierExpression()), + identifier // TODO: if type exists so identifier is nullable + ); + } + + private boolean isFinalFieldReference(PsiReferenceExpression expression) { final PsiReference reference = expression.getReference(); if (reference != null) { final PsiElement resolvedReference = reference.resolve(); @@ -238,25 +250,22 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { if (resolvedReference instanceof PsiField) { final PsiModifierList modifierList = ((PsiField) resolvedReference).getModifierList(); if (modifierList != null && modifierList.hasExplicitModifier(PsiModifier.FINAL)) { - PsiElement context = expression.getContext(); - while (context != null) { - if (context instanceof PsiMethod && ((PsiMethod) context).isConstructor()) { - hasDollar = true; - break; - } - context = context.getContext(); - } + return true; } } } } + return false; + } - boolean isNullable = typeToType(expression.getType()).isNullable(); - final IdentifierImpl identifier = hasDollar ? new IdentifierImpl("$" + expression.getReferenceName(), isNullable) : new IdentifierImpl(expression.getReferenceName(), isNullable); - myResult = new CallChainExpression( - expressionToExpression(expression.getQualifierExpression()), - identifier // TODO: if type exists so id is nullable - ); + private boolean isInsideConstructor(PsiReferenceExpression expression) { + PsiElement context = expression.getContext(); + while (context != null) { + if (context instanceof PsiMethod && ((PsiMethod) context).isConstructor()) + return true; + context = context.getContext(); + } + return false; } @Override From 54265da3668db4e1320ec6af26f87935771d6c16 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 8 Nov 2011 15:19:57 +0400 Subject: [PATCH 082/206] improved quoting for identifier added --- .../jetbrains/jet/j2k/ast/IdentifierImpl.java | 19 ++++++++++++--- src/org/jetbrains/jet/j2k/ast/Node.java | 3 ++- .../jet/j2k/visitors/ExpressionVisitor.java | 2 +- .../ast/identifier/expression/withDollar.jav | 1 + .../ast/identifier/expression/withDollar.kt | 1 + .../identifier/file/finalFieldReference.jav | 13 +++++++++++ .../identifier/file/finalFieldReference.kt | 13 +++++++++++ .../ast/identifier/statement/keywords.jav | 5 ++++ testData/ast/identifier/statement/keywords.kt | 23 +++++++++++++++++++ 9 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 testData/ast/identifier/expression/withDollar.jav create mode 100644 testData/ast/identifier/expression/withDollar.kt create mode 100644 testData/ast/identifier/file/finalFieldReference.jav create mode 100644 testData/ast/identifier/file/finalFieldReference.kt create mode 100644 testData/ast/identifier/statement/keywords.jav create mode 100644 testData/ast/identifier/statement/keywords.kt 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 From 1bc527cd92e2d22f60373c62815908ade078e802 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 9 Nov 2011 15:07:02 +0400 Subject: [PATCH 083/206] supported two cases for constructor calling --- src/org/jetbrains/jet/j2k/Converter.java | 37 ++++++--- src/org/jetbrains/jet/j2k/ast/Block.java | 5 ++ .../jet/j2k/ast/CallChainExpression.java | 4 +- src/org/jetbrains/jet/j2k/ast/Class.java | 30 ++++++- src/org/jetbrains/jet/j2k/ast/ClassType.java | 7 ++ src/org/jetbrains/jet/j2k/ast/Function.java | 12 +++ src/org/jetbrains/jet/j2k/ast/Type.java | 2 +- .../jet/j2k/visitors/ExpressionVisitor.java | 83 +++++++++++++++---- .../jet/j2k/visitors/ThisVisitor.java | 40 +++++++++ .../ast/constructors/file/allCallsPrimary.jav | 20 +++++ .../ast/constructors/file/allCallsPrimary.kt | 23 +++++ .../constructors/file/allCallsPrimary2.jav | 31 +++++++ .../ast/constructors/file/allCallsPrimary2.kt | 33 ++++++++ .../fieldsWithPrimaryPrivateConstructor.kt | 2 +- 14 files changed, 299 insertions(+), 30 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/visitors/ThisVisitor.java create mode 100644 testData/ast/constructors/file/allCallsPrimary.jav create mode 100644 testData/ast/constructors/file/allCallsPrimary.kt create mode 100644 testData/ast/constructors/file/allCallsPrimary2.jav create mode 100644 testData/ast/constructors/file/allCallsPrimary2.kt diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index e0b8c5c88df..7a77ff4be77 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -7,10 +7,7 @@ import org.jetbrains.jet.j2k.ast.*; import org.jetbrains.jet.j2k.ast.Class; import org.jetbrains.jet.j2k.ast.Enum; import org.jetbrains.jet.j2k.ast.Modifier; -import org.jetbrains.jet.j2k.visitors.ElementVisitor; -import org.jetbrains.jet.j2k.visitors.ExpressionVisitor; -import org.jetbrains.jet.j2k.visitors.StatementVisitor; -import org.jetbrains.jet.j2k.visitors.TypeVisitor; +import org.jetbrains.jet.j2k.visitors.*; import java.util.HashSet; import java.util.LinkedList; @@ -40,7 +37,7 @@ public class Converter { } public static AnonymousClass anonymousClassToAnonymousClass(PsiAnonymousClass anonymousClass) { // TODO: replace by Block, - // use class.getChild() method + // use class.getChild() method return new AnonymousClass( classesToClassList(anonymousClass.getAllInnerClasses()), methodsToFunctionList(anonymousClass.getMethods(), true), @@ -121,6 +118,29 @@ public class Converter { return result; } + @Nullable + public static PsiMethod getPrimaryConstructor(PsiClass psiClass) { + ThisVisitor tv = new ThisVisitor(); + psiClass.accept(tv); + return tv.getPrimaryConstructor(); + } + + public static boolean isConstructorPrimary(@Nullable PsiMethod constructor) { + if (constructor == null) + return false; + if (constructor.getParent() instanceof PsiClass) { + final PsiClass parent = (PsiClass) constructor.getParent(); + if (parent.getConstructors().length == 1) + return true; + else { + PsiMethod c = getPrimaryConstructor(parent); // TODO: move up to classToClass() method + if (c != null && c.hashCode() == constructor.hashCode()) + return true; + } + } + return false; + } + @NotNull private static Function methodToFunction(PsiMethod method, boolean notEmpty) { final IdentifierImpl identifier = new IdentifierImpl(method.getName()); @@ -135,11 +155,8 @@ public class Converter { if (method.getParent() instanceof PsiClass && ((PsiClass) method.getParent()).isInterface()) modifiers.remove(Modifier.ABSTRACT); - - if (method.isConstructor()) { - boolean isPrimary = false; - if (method.getParent() instanceof PsiClass && ((PsiClass) method.getParent()).getConstructors().length == 1) - isPrimary = true; + if (method.isConstructor()) { // TODO: simplify + boolean isPrimary = isConstructorPrimary(method); return new Constructor( identifier, diff --git a/src/org/jetbrains/jet/j2k/ast/Block.java b/src/org/jetbrains/jet/j2k/ast/Block.java index 9166a3586d3..a0f3f789fd4 100644 --- a/src/org/jetbrains/jet/j2k/ast/Block.java +++ b/src/org/jetbrains/jet/j2k/ast/Block.java @@ -11,6 +11,11 @@ import java.util.List; */ public class Block extends Statement { public final static Block EMPTY_BLOCK = new Block(); + + public List getStatements() { + return myStatements; + } + private List myStatements = new LinkedList(); private boolean myNotEmpty = false; diff --git a/src/org/jetbrains/jet/j2k/ast/CallChainExpression.java b/src/org/jetbrains/jet/j2k/ast/CallChainExpression.java index ae57d9a119a..17ab3f222c1 100644 --- a/src/org/jetbrains/jet/j2k/ast/CallChainExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/CallChainExpression.java @@ -7,9 +7,9 @@ import org.jetbrains.annotations.NotNull; */ public class CallChainExpression extends Expression { private Expression myExpression; - private IdentifierImpl myIdentifier; + private Expression myIdentifier; - public CallChainExpression(Expression expression, IdentifierImpl identifier) { + public CallChainExpression(Expression expression, Expression identifier) { myExpression = expression; myIdentifier = identifier; } diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java index 4c0ddded791..79bd76c6453 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -4,6 +4,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.j2k.util.AstUtil; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; @@ -83,6 +84,30 @@ public class Class extends Member { return result; } + @NotNull + List secondaryConstructorsAsStaticInitFunction() { + final LinkedList result = new LinkedList(); + for (Function m : myMethods) + if (m.getKind() == Kind.CONSTRUCTOR && !((Constructor) m).isPrimary()) { + Set modifiers = new HashSet(m.myModifiers); + modifiers.add(Modifier.STATIC); + + final List statements = m.getBlock().getStatements(); + statements.add(new ReturnStatement(new IdentifierImpl("__"))); // TODO: move to one place, find other __ usages + final Block block = new Block(statements); + + result.add(new Function( + new IdentifierImpl("init"), + modifiers, + new ClassType(myName, false), + m.getTypeParameters(), + m.getParams(), + block + )); + } + return result; + } + String typeParametersToKotlin() { return myTypeParameters.size() > 0 ? "<" + AstUtil.joinNodes(myTypeParameters, COMMA_WITH_SPACE) + ">" : EMPTY; } @@ -124,9 +149,9 @@ public class Class extends Member { String bodyToKotlin() { return SPACE + "{" + N + - classObjectToKotlin() + N + AstUtil.joinNodes(getNonStatic(myFields), N) + N + primaryConstructorBodyToKotlin() + N + + classObjectToKotlin() + N + AstUtil.joinNodes(getNonStatic(methodsExceptConstructors()), N) + N + AstUtil.joinNodes(getNonStatic(myInnerClasses), N) + N + "}"; @@ -149,8 +174,9 @@ public class Class extends Member { } private String classObjectToKotlin() { + final List staticMethods = new LinkedList(secondaryConstructorsAsStaticInitFunction()); + staticMethods.addAll(getStatic(methodsExceptConstructors())); final List staticFields = getStatic(myFields); - final List staticMethods = getStatic(methodsExceptConstructors()); final List staticInnerClasses = getStatic(myInnerClasses); if (staticFields.size() + staticMethods.size() + staticInnerClasses.size() > 0) { return "class" + SPACE + "object" + SPACE + "{" + N + diff --git a/src/org/jetbrains/jet/j2k/ast/ClassType.java b/src/org/jetbrains/jet/j2k/ast/ClassType.java index 5ab9205c7f1..2dbb513c316 100644 --- a/src/org/jetbrains/jet/j2k/ast/ClassType.java +++ b/src/org/jetbrains/jet/j2k/ast/ClassType.java @@ -3,6 +3,7 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.j2k.util.AstUtil; +import java.util.LinkedList; import java.util.List; /** @@ -17,6 +18,12 @@ public class ClassType extends Type { myParameters = parameters; } + public ClassType(Identifier type, boolean isNullable) { + myType = type; + myNullable = isNullable; + myParameters = new LinkedList(); + } + @NotNull @Override public String toKotlin() { diff --git a/src/org/jetbrains/jet/j2k/ast/Function.java b/src/org/jetbrains/jet/j2k/ast/Function.java index 46b44d8ab82..2fd522232d2 100644 --- a/src/org/jetbrains/jet/j2k/ast/Function.java +++ b/src/org/jetbrains/jet/j2k/ast/Function.java @@ -26,6 +26,18 @@ public class Function extends Member { myBlock = block; } + public List getTypeParameters() { + return myTypeParameters; + } + + public Element getParams() { + return myParams; + } + + public Block getBlock() { + return myBlock; + } + private String typeParametersToKotlin() { return myTypeParameters.size() > 0 ? "<" + AstUtil.joinNodes(myTypeParameters, COMMA_WITH_SPACE) + ">" : EMPTY; } diff --git a/src/org/jetbrains/jet/j2k/ast/Type.java b/src/org/jetbrains/jet/j2k/ast/Type.java index e8f27fd9eb1..ad16865772f 100644 --- a/src/org/jetbrains/jet/j2k/ast/Type.java +++ b/src/org/jetbrains/jet/j2k/ast/Type.java @@ -7,7 +7,7 @@ import org.jetbrains.annotations.NotNull; */ public abstract class Type extends Element { public static final Type EMPTY_TYPE = new EmptyType(); - private boolean myNullable = true; + boolean myNullable = true; @NotNull @Override diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 965e0430a51..4ff5ed04c8d 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; @@ -189,7 +190,7 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { typeToType(expression.getType()), // TODO: remove new ExpressionList(callExpression) ); - } else { + } else { // new Class(): common case myResult = new NewClassExpression( elementToElement(expression.getClassOrAnonymousClassReference()), elementToElement(expression.getArgumentList()), @@ -197,6 +198,13 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { anonymousClassToAnonymousClass(expression.getAnonymousClass()) : null ); + // is constructor secondary + final PsiMethod constructor = expression.resolveMethod(); + if (constructor != null && !isConstructorPrimary(constructor)) { + myResult = new CallChainExpression( + new IdentifierImpl(constructor.getName(), false), + new MethodCallExpression(new IdentifierImpl("init"), elementToElement(expression.getArgumentList()), false)); + } } } @@ -230,44 +238,92 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { public void visitReferenceExpression(PsiReferenceExpression expression) { super.visitReferenceExpression(expression); - boolean hasDollar = isFinalFieldReference(expression) && isInsideConstructor(expression); - boolean isNullable = typeToType(expression.getType()).isNullable(); + final boolean isFieldReference = isFieldReference(expression); + final boolean hasDollar = isFieldReference && isInsidePrimaryConstructor(expression); + final boolean insideSecondaryConstructor = isInsideSecondaryConstructor(expression); + final boolean hasReceiver = isFieldReference && insideSecondaryConstructor; + final boolean isThis = isThisExpression(expression); + final boolean isNullable = typeToType(expression.getType()).isNullable(); + final String className = getClassName(expression); + + Expression identifier = new IdentifierImpl(expression.getReferenceName(), isNullable); + + if (hasDollar) + identifier = new IdentifierImpl(expression.getReferenceName(), hasDollar, isNullable); + else { + final String temporaryObject = "__"; + if (hasReceiver) + identifier = new CallChainExpression(new IdentifierImpl(temporaryObject, false), new IdentifierImpl(expression.getReferenceName(), isNullable)); + else if (insideSecondaryConstructor && isThis) + identifier = new IdentifierImpl("val " + temporaryObject + " = " + className); // TODO: hack + } - final IdentifierImpl identifier = hasDollar ? - new IdentifierImpl(expression.getReferenceName(), hasDollar, isNullable) : - new IdentifierImpl(expression.getReferenceName(), isNullable); myResult = new CallChainExpression( expressionToExpression(expression.getQualifierExpression()), identifier // TODO: if type exists so identifier is nullable ); } - private boolean isFinalFieldReference(PsiReferenceExpression expression) { + @NotNull + private String getClassName(PsiReferenceExpression expression) { + PsiElement context = expression.getContext(); + while (context != null) { + if (context instanceof PsiMethod && ((PsiMethod) context).isConstructor()) { + final PsiClass containingClass = ((PsiMethod) context).getContainingClass(); + if (containingClass != null) { + final PsiIdentifier identifier = containingClass.getNameIdentifier(); + if (identifier != null) + return identifier.getText(); + } + } + context = context.getContext(); + } + return ""; + } + + private boolean isFieldReference(PsiReferenceExpression expression) { final PsiReference reference = expression.getReference(); if (reference != null) { final PsiElement resolvedReference = reference.resolve(); if (resolvedReference != null) { if (resolvedReference instanceof PsiField) { - final PsiModifierList modifierList = ((PsiField) resolvedReference).getModifierList(); - if (modifierList != null && modifierList.hasExplicitModifier(PsiModifier.FINAL)) { - return true; - } + return true; } } } return false; } - private boolean isInsideConstructor(PsiReferenceExpression expression) { + private boolean isInsideSecondaryConstructor(PsiReferenceExpression expression) { PsiElement context = expression.getContext(); while (context != null) { if (context instanceof PsiMethod && ((PsiMethod) context).isConstructor()) - return true; + return !Converter.isConstructorPrimary((PsiMethod) context); context = context.getContext(); } return false; } + private boolean isInsidePrimaryConstructor(PsiReferenceExpression expression) { + PsiElement context = expression.getContext(); + while (context != null) { + if (context instanceof PsiMethod && ((PsiMethod) context).isConstructor()) + return Converter.isConstructorPrimary((PsiMethod) context); + context = context.getContext(); + } + return false; + } + + private boolean isThisExpression(PsiReferenceExpression expression) { + for (PsiReference r : expression.getReferences()) + if (r.getCanonicalText().equals("this")) { + final PsiElement res = r.resolve(); + if (res != null && res instanceof PsiMethod && ((PsiMethod) res).isConstructor()) + return true; + } + return false; + } + @Override public void visitSuperExpression(PsiSuperExpression expression) { super.visitSuperExpression(expression); @@ -288,7 +344,6 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { new IdentifierImpl(qualifier.getQualifiedName()) : Identifier.EMPTY_IDENTIFIER ); - } @Override diff --git a/src/org/jetbrains/jet/j2k/visitors/ThisVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ThisVisitor.java new file mode 100644 index 00000000000..96569d20a09 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/visitors/ThisVisitor.java @@ -0,0 +1,40 @@ +package org.jetbrains.jet.j2k.visitors; + +import com.intellij.psi.JavaRecursiveElementVisitor; +import com.intellij.psi.PsiMethod; +import com.intellij.psi.PsiReference; +import com.intellij.psi.PsiReferenceExpression; +import org.jetbrains.annotations.Nullable; + +import java.util.HashSet; + +/** + * @author ignatov + */ +public class ThisVisitor extends JavaRecursiveElementVisitor { + HashSet myResolvedConstructors = new HashSet(); + + public HashSet getResult() { + return myResolvedConstructors; + } + + @Override + public void visitReferenceExpression(PsiReferenceExpression expression) { + for (PsiReference r : expression.getReferences()) + if (r.getCanonicalText().equals("this")) + if (r.resolve() != null && r.resolve() instanceof PsiMethod && ((PsiMethod) r.resolve()).isConstructor()) + myResolvedConstructors.add((PsiMethod) r.resolve()); + } + + @Nullable + public PsiMethod getPrimaryConstructor() { + if (myResolvedConstructors.size() > 0) { + PsiMethod first = myResolvedConstructors.toArray(new PsiMethod[myResolvedConstructors.size()])[0]; + for (PsiMethod m : myResolvedConstructors) + if (m.hashCode() != first.hashCode()) + return null; + return first; + } + return null; + } +} diff --git a/testData/ast/constructors/file/allCallsPrimary.jav b/testData/ast/constructors/file/allCallsPrimary.jav new file mode 100644 index 00000000000..997b50c969c --- /dev/null +++ b/testData/ast/constructors/file/allCallsPrimary.jav @@ -0,0 +1,20 @@ +class C { + C(int arg1, int arg2, int arg3) { + } + + C(int arg1, int arg2) { + this(arg1, arg2, 0); + } + + C(int arg1) { + this(arg1, 0, 0); + } +} + +public class User { + public static void main() { + C c1 = new C(100, 100, 100); + C c2 = new C(100, 100); + C c3 = new C(100); + } +} \ No newline at end of file diff --git a/testData/ast/constructors/file/allCallsPrimary.kt b/testData/ast/constructors/file/allCallsPrimary.kt new file mode 100644 index 00000000000..c0365493e51 --- /dev/null +++ b/testData/ast/constructors/file/allCallsPrimary.kt @@ -0,0 +1,23 @@ +open class C(arg1 : Int, arg2 : Int, arg3 : Int) { +{ +} +class object { +open fun init(arg1 : Int, arg2 : Int) : C { +val __ = C(arg1, arg2, 0) +return __ +} +open fun init(arg1 : Int) : C { +val __ = C(arg1, 0, 0) +return __ +} +} +} +public open class User() { +class object { +open public fun main() : Unit { +var c1 : C? = C(100, 100, 100) +var c2 : C? = C.init(100, 100) +var c3 : C? = C.init(100) +} +} +} \ No newline at end of file diff --git a/testData/ast/constructors/file/allCallsPrimary2.jav b/testData/ast/constructors/file/allCallsPrimary2.jav new file mode 100644 index 00000000000..45b045051bc --- /dev/null +++ b/testData/ast/constructors/file/allCallsPrimary2.jav @@ -0,0 +1,31 @@ +class C { + final int myArg1; + int myArg2; + int myArg3; + + C(int arg1, int arg2, int arg3) { + this(arg1); + myArg2 = arg2; + myArg3 = arg3; + } + + C(int arg1, int arg2) { + this(arg1); + myArg2 = arg2; + myArg3 = 0; + } + + C(int arg1) { + myArg1 = arg1; + myArg2 = 0; + myArg3 = 0; + } +} + +public class User { + public static void main() { + C c1 = new C(100, 100, 100); + C c2 = new C(100, 100); + C c3 = new C(100); + } +} \ No newline at end of file diff --git a/testData/ast/constructors/file/allCallsPrimary2.kt b/testData/ast/constructors/file/allCallsPrimary2.kt new file mode 100644 index 00000000000..787f2f90451 --- /dev/null +++ b/testData/ast/constructors/file/allCallsPrimary2.kt @@ -0,0 +1,33 @@ +open class C(arg1 : Int) { +val myArg1 : Int +var myArg2 : Int +var myArg3 : Int +{ +$myArg1 = arg1 +$myArg2 = 0 +$myArg3 = 0 +} +class object { +open fun init(arg1 : Int, arg2 : Int, arg3 : Int) : C { +val __ = C(arg1) +__.myArg2 = arg2 +__.myArg3 = arg3 +return __ +} +open fun init(arg1 : Int, arg2 : Int) : C { +val __ = C(arg1) +__.myArg2 = arg2 +__.myArg3 = 0 +return __ +} +} +} +public open class User() { +class object { +open public fun main() : Unit { +var c1 : C? = C.init(100, 100, 100) +var c2 : C? = C.init(100, 100) +var c3 : C? = C(100) +} +} +} \ No newline at end of file diff --git a/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt b/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt index 52e96f54c6d..6a04cba471b 100644 --- a/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt +++ b/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt @@ -6,7 +6,7 @@ YELLOW(24) BLUE(25) private var code : Int open private (c : Int) { -code = c +$code = c } open public fun getCode() : Int { return code From d4b35bc27fdf1e13a4451cc48f3c9abe09463c5b Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 9 Nov 2011 15:55:32 +0400 Subject: [PATCH 084/206] EQEQ added as a token type --- src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 4ff5ed04c8d..ed1a81428e4 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -91,6 +91,7 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { if (tokenType == JavaTokenType.LT) return "<"; if (tokenType == JavaTokenType.GE) return ">="; if (tokenType == JavaTokenType.LE) return "<="; + if (tokenType == JavaTokenType.EQEQ) return "=="; if (tokenType == JavaTokenType.NE) return "!="; if (tokenType == JavaTokenType.ANDAND) return "&&"; if (tokenType == JavaTokenType.OROR) return "||"; From fdf18e85fcfdb8b86c89be7598eca32955c033ad Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 9 Nov 2011 16:03:22 +0400 Subject: [PATCH 085/206] IdentifierImpl fixed --- src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java b/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java index 552c78dd9aa..ea82c78f165 100644 --- a/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java +++ b/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java @@ -7,22 +7,22 @@ import org.jetbrains.annotations.NotNull; */ public class IdentifierImpl extends Expression implements Identifier { private final String myName; - private boolean myHasDollar; - private boolean myNullable = true; + private boolean myHasDollar = false; + private boolean myIsNullable = true; public IdentifierImpl(String name) { myName = name; } - public IdentifierImpl(String name, boolean nullable) { + public IdentifierImpl(String name, boolean isNullable) { myName = name; - myNullable = nullable; + myIsNullable = isNullable; } - public IdentifierImpl(String name, boolean hasDollar, boolean nullable) { + public IdentifierImpl(String name, boolean hasDollar, boolean isNullable) { myName = name; myHasDollar = hasDollar; - myNullable = nullable; + myIsNullable = isNullable; } @Override @@ -41,7 +41,7 @@ public class IdentifierImpl extends Expression implements Identifier { @Override public boolean isNullable() { - return myNullable; + return myIsNullable; } private String ifNeedQuote(String name) { From 548d89ef4e482a6f165660e05895eb15434a0e52 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 14 Nov 2011 14:29:58 +0400 Subject: [PATCH 086/206] another one case with constructors supported --- src/org/jetbrains/jet/j2k/Converter.java | 110 +++++++++++++++++- .../jet/j2k/ast/AssignmentExpression.java | 14 +++ .../jet/j2k/ast/CallChainExpression.java | 10 ++ src/org/jetbrains/jet/j2k/ast/Class.java | 4 +- .../jet/j2k/ast/DummyStringStatement.java | 20 ++++ src/org/jetbrains/jet/j2k/ast/Field.java | 16 +++ src/org/jetbrains/jet/j2k/ast/Function.java | 8 +- src/org/jetbrains/jet/j2k/ast/INode.java | 2 +- src/org/jetbrains/jet/j2k/ast/Parameter.java | 4 +- .../file/libraryFieldCall.kt | 5 +- .../file/libraryStringFieldCall.kt | 5 +- .../ast/class/class/abstractClassShape.kt | 4 +- .../class/class/classWithMultiplyFields.kt | 6 +- .../ast/constructors/file/allCallsPrimary.kt | 4 +- .../ast/constructors/file/allCallsPrimary2.kt | 10 +- .../ast/constructors/file/customerBuilder.kt | 12 +- testData/ast/constructors/file/identifier.jav | 33 ++++++ testData/ast/constructors/file/identifier.kt | 37 ++++++ ... fieldsWithPrimaryPrivateConstructor.java} | 0 .../fieldsWithPrimaryPrivateConstructor.kt | 14 +-- testData/ast/field/file/internalField.jav | 3 + testData/ast/field/file/privateField.jav | 3 + testData/ast/field/file/protectedField.jav | 3 + testData/ast/field/file/publicField.jav | 3 + testData/ast/field/file/valWithInit.jav | 3 + testData/ast/field/file/varWithInit.jav | 3 + testData/ast/field/file/varWithoutInit.jav | 3 + testData/ast/field/method/internalField.jav | 1 - testData/ast/field/method/internalField.kt | 1 - testData/ast/field/method/privateField.jav | 1 - testData/ast/field/method/privateField.kt | 1 - testData/ast/field/method/protectedField.jav | 1 - testData/ast/field/method/protectedField.kt | 1 - testData/ast/field/method/publicField.jav | 1 - testData/ast/field/method/publicField.kt | 1 - testData/ast/field/method/valWithInit.jav | 1 - testData/ast/field/method/valWithInit.kt | 1 - testData/ast/field/method/varWithInit.jav | 1 - testData/ast/field/method/varWithInit.kt | 1 - testData/ast/field/method/varWithoutInit.jav | 1 - testData/ast/field/method/varWithoutInit.kt | 1 - .../identifier/file/finalFieldReference.kt | 6 +- .../superExpression/class/classAextendsB.kt | 6 +- .../ast/trait/class/interfaceWithFields.kt | 5 + .../trait/class/interfaceWithStaticFields.kt | 5 + 45 files changed, 319 insertions(+), 56 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/DummyStringStatement.java create mode 100644 testData/ast/constructors/file/identifier.jav create mode 100644 testData/ast/constructors/file/identifier.kt rename testData/ast/enum/class/{fieldsWithPrimaryPrivateConstructor.jav => fieldsWithPrimaryPrivateConstructor.java} (100%) create mode 100644 testData/ast/field/file/internalField.jav create mode 100644 testData/ast/field/file/privateField.jav create mode 100644 testData/ast/field/file/protectedField.jav create mode 100644 testData/ast/field/file/publicField.jav create mode 100644 testData/ast/field/file/valWithInit.jav create mode 100644 testData/ast/field/file/varWithInit.jav create mode 100644 testData/ast/field/file/varWithoutInit.jav delete mode 100644 testData/ast/field/method/internalField.jav delete mode 100644 testData/ast/field/method/internalField.kt delete mode 100644 testData/ast/field/method/privateField.jav delete mode 100644 testData/ast/field/method/privateField.kt delete mode 100644 testData/ast/field/method/protectedField.jav delete mode 100644 testData/ast/field/method/protectedField.kt delete mode 100644 testData/ast/field/method/publicField.jav delete mode 100644 testData/ast/field/method/publicField.kt delete mode 100644 testData/ast/field/method/valWithInit.jav delete mode 100644 testData/ast/field/method/valWithInit.kt delete mode 100644 testData/ast/field/method/varWithInit.jav delete mode 100644 testData/ast/field/method/varWithInit.kt delete mode 100644 testData/ast/field/method/varWithoutInit.jav delete mode 100644 testData/ast/field/method/varWithoutInit.kt diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 7a77ff4be77..3934c8864ea 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -7,12 +7,10 @@ import org.jetbrains.jet.j2k.ast.*; import org.jetbrains.jet.j2k.ast.Class; import org.jetbrains.jet.j2k.ast.Enum; import org.jetbrains.jet.j2k.ast.Modifier; +import org.jetbrains.jet.j2k.util.AstUtil; import org.jetbrains.jet.j2k.visitors.*; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Set; +import java.util.*; /** * @author ignatov @@ -45,6 +43,39 @@ public class Converter { ); } + private static List getFinalOrWithEmptyInitializer(List fields) { + List result = new LinkedList(); + for (Field f : fields) + if (f.isFinal() || f.getInitializer().toKotlin().isEmpty()) + result.add(f); + return result; + } + + private static List createParametersFromFields(List fields) { + List result = new LinkedList(); + for (Field f : fields) + result.add(new Parameter(f.getIdentifier(), f.getType())); + return result; + } + + private static List createInitStatementsFromFields(List fields) { + List result = new LinkedList(); + for (Field f : fields) { + final String identifierToKotlin = f.getIdentifier().toKotlin(); + result.add(new DummyStringStatement("this." + identifierToKotlin + " = " + identifierToKotlin)); + } + return result; + } + + private static String createPrimaryConstructorInvocation(String s, List fields, Map initializers) { + List result = new LinkedList(); + for (Field f : fields) { + final String id = f.getIdentifier().toKotlin(); + result.add(initializers.get(id)); + } + return s + "(" + AstUtil.join(result, ", ") + ")"; + } + public static Class classToClass(PsiClass psiClass) { final Set modifiers = modifiersListToModifiersSet(psiClass.getModifierList()); final List innerClasses = classesToClassList(psiClass.getAllInnerClasses()); @@ -53,8 +84,68 @@ public class Converter { final List typeParameters = elementsToElementList(psiClass.getTypeParameters()); final List implementsTypes = typesToNotNullableTypeList(psiClass.getImplementsListTypes()); final List extendsTypes = typesToNotNullableTypeList(psiClass.getExtendsListTypes()); - final IdentifierImpl name = new IdentifierImpl(psiClass.getName()); + + // we create primary constructor + if (!psiClass.isEnum() && getPrimaryConstructor(psiClass) == null) { + final List finalOrWithEmptyInitializer = getFinalOrWithEmptyInitializer(fields); + final Map initializers = new HashMap(); + + for (Field f : finalOrWithEmptyInitializer) { + String init = getDefaultInitializer(f); + initializers.put(f.getIdentifier().toKotlin(), init); + } + + for (final Function f : methods) { + // and modify secondaries + if (f.getKind() == INode.Kind.CONSTRUCTOR && !((Constructor) f).isPrimary()) { + final List newStatements = new LinkedList(); + + for (Statement s : f.getBlock().getStatements()) { + boolean isRemoved = false; + + if (s.getKind() == INode.Kind.ASSINGNMENT_EXPRESSION) { + final AssignmentExpression assignmentExpression = (AssignmentExpression) s; + if (assignmentExpression.getLeft().getKind() == INode.Kind.CALL_CHAIN) { + for (Field fo : finalOrWithEmptyInitializer) { + final String id = fo.getIdentifier().toKotlin(); + if (((CallChainExpression) assignmentExpression.getLeft()).getIdentifier().toKotlin().endsWith(id)) { + initializers.put(id, assignmentExpression.getRight().toKotlin()); + isRemoved = true; + } + } + } + } + if (!isRemoved) { + newStatements.add(s); + } + } + + newStatements.add( + 0, + new DummyStringStatement( + "val __ = " + createPrimaryConstructorInvocation( + name.toKotlin(), + finalOrWithEmptyInitializer, + initializers))); + + f.setBlock(new Block(newStatements)); + } + } + + methods.add( + new Constructor( + Identifier.EMPTY_IDENTIFIER, + new HashSet(), + new ClassType(name, false), + new LinkedList(), + new ParameterList(createParametersFromFields(finalOrWithEmptyInitializer)), + new Block(createInitStatementsFromFields(finalOrWithEmptyInitializer)), + true + ) + ); + } + if (psiClass.isInterface()) return new Trait(name, modifiers, typeParameters, extendsTypes, implementsTypes, innerClasses, methods, fields); if (psiClass.isEnum()) @@ -63,6 +154,15 @@ public class Converter { return new Class(name, modifiers, typeParameters, extendsTypes, implementsTypes, innerClasses, methods, fields); } + private static String getDefaultInitializer(Field f) { + if (f.getType().isNullable()) return "null"; + + final String typeToKotlin = f.getType().toKotlin(); + if (typeToKotlin.equals("Boolean")) return "false"; + if (typeToKotlin.equals("Int")) return "0"; + return "TYPE: " + typeToKotlin + " HAVEN'T DEFAULT VALUE"; + } + // TODO: hack for enums private static List fieldsToFieldListForEnums(PsiField[] fields) { List result = new LinkedList(); diff --git a/src/org/jetbrains/jet/j2k/ast/AssignmentExpression.java b/src/org/jetbrains/jet/j2k/ast/AssignmentExpression.java index 7d0b10938a1..98529c5637e 100644 --- a/src/org/jetbrains/jet/j2k/ast/AssignmentExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/AssignmentExpression.java @@ -10,6 +10,14 @@ public class AssignmentExpression extends Expression { private final Expression myRight; private final String myOp; + public Expression getLeft() { + return myLeft; + } + + public Expression getRight() { + return myRight; + } + public AssignmentExpression(Expression left, Expression right, String op) { myLeft = left; myRight = right; @@ -21,4 +29,10 @@ public class AssignmentExpression extends Expression { public String toKotlin() { return myLeft.toKotlin() + SPACE + myOp + SPACE + myRight.toKotlin(); } + + @NotNull + @Override + public Kind getKind() { + return Kind.ASSINGNMENT_EXPRESSION; + } } diff --git a/src/org/jetbrains/jet/j2k/ast/CallChainExpression.java b/src/org/jetbrains/jet/j2k/ast/CallChainExpression.java index 17ab3f222c1..32a352e3349 100644 --- a/src/org/jetbrains/jet/j2k/ast/CallChainExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/CallChainExpression.java @@ -9,6 +9,16 @@ public class CallChainExpression extends Expression { private Expression myExpression; private Expression myIdentifier; + public Expression getIdentifier() { + return myIdentifier; + } + + @NotNull + @Override + public Kind getKind() { + return Kind.CALL_CHAIN; + } + public CallChainExpression(Expression expression, Expression identifier) { myExpression = expression; myIdentifier = identifier; diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java index 79bd76c6453..6ee09365a96 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -52,7 +52,7 @@ public class Class extends Member { String primaryConstructorBodyToKotlin() { Constructor maybeConstructor = getPrimaryConstructor(); - if (maybeConstructor != null) + if (maybeConstructor != null && !maybeConstructor.getBlock().isEmpty()) return maybeConstructor.primaryBodyToKotlin(); return EMPTY; } @@ -150,10 +150,10 @@ public class Class extends Member { String bodyToKotlin() { return SPACE + "{" + N + AstUtil.joinNodes(getNonStatic(myFields), N) + N + - primaryConstructorBodyToKotlin() + N + classObjectToKotlin() + N + AstUtil.joinNodes(getNonStatic(methodsExceptConstructors()), N) + N + AstUtil.joinNodes(getNonStatic(myInnerClasses), N) + N + + primaryConstructorBodyToKotlin() + N + "}"; } diff --git a/src/org/jetbrains/jet/j2k/ast/DummyStringStatement.java b/src/org/jetbrains/jet/j2k/ast/DummyStringStatement.java new file mode 100644 index 00000000000..161618aab16 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/DummyStringStatement.java @@ -0,0 +1,20 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class DummyStringStatement extends Statement { + private String myString; + + public DummyStringStatement(String string) { + myString = string; + } + + @NotNull + @Override + public String toKotlin() { + return myString; + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/Field.java b/src/org/jetbrains/jet/j2k/ast/Field.java index 60839930067..02542a35ef9 100644 --- a/src/org/jetbrains/jet/j2k/ast/Field.java +++ b/src/org/jetbrains/jet/j2k/ast/Field.java @@ -22,6 +22,18 @@ public class Field extends Member { myInitializer = initializer; } + public Element getInitializer() { + return myInitializer; + } + + public Identifier getIdentifier() { + return myIdentifier; + } + + public Type getType() { + return myType; + } + String modifiersToKotlin() { List modifierList = new LinkedList(); @@ -43,6 +55,10 @@ public class Field extends Member { return myModifiers.contains(Modifier.STATIC); } + public boolean isFinal() { + return myModifiers.contains(Modifier.FINAL); + } + @NotNull @Override public String toKotlin() { diff --git a/src/org/jetbrains/jet/j2k/ast/Function.java b/src/org/jetbrains/jet/j2k/ast/Function.java index 2fd522232d2..8bf2649aaa6 100644 --- a/src/org/jetbrains/jet/j2k/ast/Function.java +++ b/src/org/jetbrains/jet/j2k/ast/Function.java @@ -15,7 +15,13 @@ public class Function extends Member { private final Type myType; private final List myTypeParameters; final Element myParams; - final Block myBlock; + + // TODO: maybe remove it? + public void setBlock(Block block) { + myBlock = block; + } + + Block myBlock; public Function(Identifier name, Set modifiers, Type type, List typeParameters, Element params, Block block) { myName = name; diff --git a/src/org/jetbrains/jet/j2k/ast/INode.java b/src/org/jetbrains/jet/j2k/ast/INode.java index 4cc77364390..fb837412eb7 100644 --- a/src/org/jetbrains/jet/j2k/ast/INode.java +++ b/src/org/jetbrains/jet/j2k/ast/INode.java @@ -13,6 +13,6 @@ public interface INode { public Kind getKind(); public enum Kind { - UNDEFINED, TYPE, CONSTRUCTOR, BREAK, CONTINUE, VARARG, TRAIT, + UNDEFINED, TYPE, CONSTRUCTOR, BREAK, CONTINUE, VARARG, TRAIT, ASSINGNMENT_EXPRESSION, CALL_CHAIN, } } diff --git a/src/org/jetbrains/jet/j2k/ast/Parameter.java b/src/org/jetbrains/jet/j2k/ast/Parameter.java index 7dfa86eaed1..a4b8897df97 100644 --- a/src/org/jetbrains/jet/j2k/ast/Parameter.java +++ b/src/org/jetbrains/jet/j2k/ast/Parameter.java @@ -6,10 +6,10 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public class Parameter extends Expression { - private final IdentifierImpl myIdentifier; + private final Identifier myIdentifier; private final Type myType; - public Parameter(IdentifierImpl identifier, Type type) { + public Parameter(Identifier identifier, Type type) { myIdentifier = identifier; myType = type; } diff --git a/testData/ast/callChainExpression/file/libraryFieldCall.kt b/testData/ast/callChainExpression/file/libraryFieldCall.kt index 868d83f109a..a276cdee6ba 100644 --- a/testData/ast/callChainExpression/file/libraryFieldCall.kt +++ b/testData/ast/callChainExpression/file/libraryFieldCall.kt @@ -1,7 +1,10 @@ -open class Library() { +open class Library(ourOut : PrintStream?) { class object { val ourOut : PrintStream? } +{ +this.ourOut = ourOut +} } open class User() { open fun main() : Unit { diff --git a/testData/ast/callChainExpression/file/libraryStringFieldCall.kt b/testData/ast/callChainExpression/file/libraryStringFieldCall.kt index bced464f750..49e83aea5a9 100644 --- a/testData/ast/callChainExpression/file/libraryStringFieldCall.kt +++ b/testData/ast/callChainExpression/file/libraryStringFieldCall.kt @@ -1,5 +1,8 @@ -open class Library() { +open class Library(myString : String?) { public val myString : String? +{ +this.myString = myString +} } open class User() { open fun main() : Unit { diff --git a/testData/ast/class/class/abstractClassShape.kt b/testData/ast/class/class/abstractClassShape.kt index a4a33c15910..d6500a6c9a5 100644 --- a/testData/ast/class/class/abstractClassShape.kt +++ b/testData/ast/class/class/abstractClassShape.kt @@ -1,7 +1,5 @@ abstract open class Shape() { public var color : String? -{ -} open public fun setColor(c : String?) : Unit { color = c } @@ -9,4 +7,6 @@ open public fun getColor() : String? { return color } abstract open public fun area() : Double +{ +} } \ No newline at end of file diff --git a/testData/ast/class/class/classWithMultiplyFields.kt b/testData/ast/class/class/classWithMultiplyFields.kt index 03b2647a157..6d2dbd78c0b 100644 --- a/testData/ast/class/class/classWithMultiplyFields.kt +++ b/testData/ast/class/class/classWithMultiplyFields.kt @@ -1,5 +1,9 @@ -class T() { +class T(a : String?, b : String?) { var a : String? var b : String? var c : String? = "abc" +{ +this.a = a +this.b = b +} } \ No newline at end of file diff --git a/testData/ast/constructors/file/allCallsPrimary.kt b/testData/ast/constructors/file/allCallsPrimary.kt index c0365493e51..e564d45ba6e 100644 --- a/testData/ast/constructors/file/allCallsPrimary.kt +++ b/testData/ast/constructors/file/allCallsPrimary.kt @@ -1,6 +1,4 @@ open class C(arg1 : Int, arg2 : Int, arg3 : Int) { -{ -} class object { open fun init(arg1 : Int, arg2 : Int) : C { val __ = C(arg1, arg2, 0) @@ -11,6 +9,8 @@ val __ = C(arg1, 0, 0) return __ } } +{ +} } public open class User() { class object { diff --git a/testData/ast/constructors/file/allCallsPrimary2.kt b/testData/ast/constructors/file/allCallsPrimary2.kt index 787f2f90451..01df1ce685e 100644 --- a/testData/ast/constructors/file/allCallsPrimary2.kt +++ b/testData/ast/constructors/file/allCallsPrimary2.kt @@ -2,11 +2,6 @@ open class C(arg1 : Int) { val myArg1 : Int var myArg2 : Int var myArg3 : Int -{ -$myArg1 = arg1 -$myArg2 = 0 -$myArg3 = 0 -} class object { open fun init(arg1 : Int, arg2 : Int, arg3 : Int) : C { val __ = C(arg1) @@ -21,6 +16,11 @@ __.myArg3 = 0 return __ } } +{ +$myArg1 = arg1 +$myArg2 = 0 +$myArg3 = 0 +} } public open class User() { class object { diff --git a/testData/ast/constructors/file/customerBuilder.kt b/testData/ast/constructors/file/customerBuilder.kt index 8d59f2c5543..7092cd9f155 100644 --- a/testData/ast/constructors/file/customerBuilder.kt +++ b/testData/ast/constructors/file/customerBuilder.kt @@ -2,12 +2,6 @@ namespace org.test.customer { open class Customer(first : String?, last : String?) { public val _firstName : String? public val _lastName : String? -{ -doSmthBefore() -$_firstName = first -$_lastName = last -doSmthAfter() -} open public fun getFirstName() : String? { return _firstName } @@ -18,6 +12,12 @@ open private fun doSmthBefore() : Unit { } open private fun doSmthAfter() : Unit { } +{ +doSmthBefore() +$_firstName = first +$_lastName = last +doSmthAfter() +} } open class CustomerBuilder() { public var _firstName : String? = "Homer" diff --git a/testData/ast/constructors/file/identifier.jav b/testData/ast/constructors/file/identifier.jav new file mode 100644 index 00000000000..929628643c8 --- /dev/null +++ b/testData/ast/constructors/file/identifier.jav @@ -0,0 +1,33 @@ +public class Identifier { + private final String myName; + private boolean myHasDollar; + private boolean myNullable = true; + + public Identifier(String name) { + myName = name; + } + + public Identifier(String name, boolean isNullable) { + myName = name; + myNullable = isNullable; + } + + public Identifier(String name, boolean hasDollar, boolean isNullable) { + myName = name; + myHasDollar = hasDollar; + myNullable = isNullable; + } + + @Override + public String getName() { + return myName; + } +} + +public class User { + public static void main() { + Identifier i1 = new Identifier("name", false, true); + Identifier i2 = new Identifier("name", false); + Identifier i3 = new Identifier("name"); + } +} \ No newline at end of file diff --git a/testData/ast/constructors/file/identifier.kt b/testData/ast/constructors/file/identifier.kt new file mode 100644 index 00000000000..692852c2fdd --- /dev/null +++ b/testData/ast/constructors/file/identifier.kt @@ -0,0 +1,37 @@ +public open class Identifier(myName : String?, myHasDollar : Boolean) { +private val myName : String? +private var myHasDollar : Boolean +private var myNullable : Boolean = true +class object { +open public fun init(name : String?) : Identifier { +val __ = Identifier(name, false) +return __ +} +open public fun init(name : String?, isNullable : Boolean) : Identifier { +val __ = Identifier(name, false) +__.myNullable = isNullable +return __ +} +open public fun init(name : String?, hasDollar : Boolean, isNullable : Boolean) : Identifier { +val __ = Identifier(name, hasDollar) +__.myNullable = isNullable +return __ +} +} +open public fun getName() : String? { +return myName +} +{ +this.myName = myName +this.myHasDollar = myHasDollar +} +} +public open class User() { +class object { +open public fun main() : Unit { +var i1 : Identifier? = Identifier.init("name", false, true) +var i2 : Identifier? = Identifier.init("name", false) +var i3 : Identifier? = Identifier.init("name") +} +} +} \ No newline at end of file diff --git a/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.jav b/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.java similarity index 100% rename from testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.jav rename to testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.java diff --git a/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt b/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt index 6a04cba471b..cc200c15751 100644 --- a/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt +++ b/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt @@ -1,11 +1,11 @@ -enum Color { -WHITE(21) -BLACK(22) -RED(23) -YELLOW(24) -BLUE(25) +enum Color(c: Int) { +WHITE : Color(21) +BLACK : Color(22) +RED : Color(23) +YELLOW : Color(24) +BLUE : Color(25) private var code : Int -open private (c : Int) { +{ $code = c } open public fun getCode() : Int { diff --git a/testData/ast/field/file/internalField.jav b/testData/ast/field/file/internalField.jav new file mode 100644 index 00000000000..3c3f6a6f633 --- /dev/null +++ b/testData/ast/field/file/internalField.jav @@ -0,0 +1,3 @@ +class C { +Foo f; +} \ No newline at end of file diff --git a/testData/ast/field/file/privateField.jav b/testData/ast/field/file/privateField.jav new file mode 100644 index 00000000000..958031a23b4 --- /dev/null +++ b/testData/ast/field/file/privateField.jav @@ -0,0 +1,3 @@ +class C { +private Foo f; +} diff --git a/testData/ast/field/file/protectedField.jav b/testData/ast/field/file/protectedField.jav new file mode 100644 index 00000000000..100199e107f --- /dev/null +++ b/testData/ast/field/file/protectedField.jav @@ -0,0 +1,3 @@ +class C { +protected Foo f; +} \ No newline at end of file diff --git a/testData/ast/field/file/publicField.jav b/testData/ast/field/file/publicField.jav new file mode 100644 index 00000000000..1944ff6914a --- /dev/null +++ b/testData/ast/field/file/publicField.jav @@ -0,0 +1,3 @@ +class C { +public Foo f; +} \ No newline at end of file diff --git a/testData/ast/field/file/valWithInit.jav b/testData/ast/field/file/valWithInit.jav new file mode 100644 index 00000000000..4e007d357ce --- /dev/null +++ b/testData/ast/field/file/valWithInit.jav @@ -0,0 +1,3 @@ +class C { +final Foo f = new Foo(1, 2); +} \ No newline at end of file diff --git a/testData/ast/field/file/varWithInit.jav b/testData/ast/field/file/varWithInit.jav new file mode 100644 index 00000000000..07f05b3bc3f --- /dev/null +++ b/testData/ast/field/file/varWithInit.jav @@ -0,0 +1,3 @@ +class C { +Foo f = new Foo(1, 2); +} \ No newline at end of file diff --git a/testData/ast/field/file/varWithoutInit.jav b/testData/ast/field/file/varWithoutInit.jav new file mode 100644 index 00000000000..3c3f6a6f633 --- /dev/null +++ b/testData/ast/field/file/varWithoutInit.jav @@ -0,0 +1,3 @@ +class C { +Foo f; +} \ No newline at end of file diff --git a/testData/ast/field/method/internalField.jav b/testData/ast/field/method/internalField.jav deleted file mode 100644 index 3f94302d50a..00000000000 --- a/testData/ast/field/method/internalField.jav +++ /dev/null @@ -1 +0,0 @@ -Foo f; \ No newline at end of file diff --git a/testData/ast/field/method/internalField.kt b/testData/ast/field/method/internalField.kt deleted file mode 100644 index 698afa74245..00000000000 --- a/testData/ast/field/method/internalField.kt +++ /dev/null @@ -1 +0,0 @@ -var f : Foo? \ No newline at end of file diff --git a/testData/ast/field/method/privateField.jav b/testData/ast/field/method/privateField.jav deleted file mode 100644 index bb102febdcd..00000000000 --- a/testData/ast/field/method/privateField.jav +++ /dev/null @@ -1 +0,0 @@ -private Foo f; \ No newline at end of file diff --git a/testData/ast/field/method/privateField.kt b/testData/ast/field/method/privateField.kt deleted file mode 100644 index bdc2e2b5389..00000000000 --- a/testData/ast/field/method/privateField.kt +++ /dev/null @@ -1 +0,0 @@ -private var f : Foo? \ No newline at end of file diff --git a/testData/ast/field/method/protectedField.jav b/testData/ast/field/method/protectedField.jav deleted file mode 100644 index 5fec6e8c145..00000000000 --- a/testData/ast/field/method/protectedField.jav +++ /dev/null @@ -1 +0,0 @@ -protected Foo f; \ No newline at end of file diff --git a/testData/ast/field/method/protectedField.kt b/testData/ast/field/method/protectedField.kt deleted file mode 100644 index 1ce1567cdc0..00000000000 --- a/testData/ast/field/method/protectedField.kt +++ /dev/null @@ -1 +0,0 @@ -protected var f : Foo? \ No newline at end of file diff --git a/testData/ast/field/method/publicField.jav b/testData/ast/field/method/publicField.jav deleted file mode 100644 index 7f46379cf3d..00000000000 --- a/testData/ast/field/method/publicField.jav +++ /dev/null @@ -1 +0,0 @@ -public Foo f; \ No newline at end of file diff --git a/testData/ast/field/method/publicField.kt b/testData/ast/field/method/publicField.kt deleted file mode 100644 index 143ef31b5c8..00000000000 --- a/testData/ast/field/method/publicField.kt +++ /dev/null @@ -1 +0,0 @@ -public var f : Foo? \ No newline at end of file diff --git a/testData/ast/field/method/valWithInit.jav b/testData/ast/field/method/valWithInit.jav deleted file mode 100644 index 085241a9e9d..00000000000 --- a/testData/ast/field/method/valWithInit.jav +++ /dev/null @@ -1 +0,0 @@ -final Foo f = new Foo(1, 2); \ No newline at end of file diff --git a/testData/ast/field/method/valWithInit.kt b/testData/ast/field/method/valWithInit.kt deleted file mode 100644 index a737faf3351..00000000000 --- a/testData/ast/field/method/valWithInit.kt +++ /dev/null @@ -1 +0,0 @@ -val f : Foo? = Foo(1, 2) \ No newline at end of file diff --git a/testData/ast/field/method/varWithInit.jav b/testData/ast/field/method/varWithInit.jav deleted file mode 100644 index ac2b8d54bd4..00000000000 --- a/testData/ast/field/method/varWithInit.jav +++ /dev/null @@ -1 +0,0 @@ -Foo f = new Foo(1, 2); \ No newline at end of file diff --git a/testData/ast/field/method/varWithInit.kt b/testData/ast/field/method/varWithInit.kt deleted file mode 100644 index 996f5072c1b..00000000000 --- a/testData/ast/field/method/varWithInit.kt +++ /dev/null @@ -1 +0,0 @@ -var f : Foo? = Foo(1, 2) \ No newline at end of file diff --git a/testData/ast/field/method/varWithoutInit.jav b/testData/ast/field/method/varWithoutInit.jav deleted file mode 100644 index 3f94302d50a..00000000000 --- a/testData/ast/field/method/varWithoutInit.jav +++ /dev/null @@ -1 +0,0 @@ -Foo f; \ No newline at end of file diff --git a/testData/ast/field/method/varWithoutInit.kt b/testData/ast/field/method/varWithoutInit.kt deleted file mode 100644 index 698afa74245..00000000000 --- a/testData/ast/field/method/varWithoutInit.kt +++ /dev/null @@ -1 +0,0 @@ -var f : Foo? \ No newline at end of file diff --git a/testData/ast/identifier/file/finalFieldReference.kt b/testData/ast/identifier/file/finalFieldReference.kt index 18748be0d9d..7ae0f871828 100644 --- a/testData/ast/identifier/file/finalFieldReference.kt +++ b/testData/ast/identifier/file/finalFieldReference.kt @@ -4,10 +4,10 @@ open class `$`() { } open class `$$`(`$$$$` : `$$$$$`?) : `$` { val `$$$` : `$$$$$`? -{ -$`$$$` = `$$$$` -} open public fun `$$$$$$`() : `$$$$$`? { return `$$$` } +{ +$`$$$` = `$$$$` +} } \ No newline at end of file diff --git a/testData/ast/superExpression/class/classAextendsB.kt b/testData/ast/superExpression/class/classAextendsB.kt index 1ecd361e2e6..bbc73d9ba14 100644 --- a/testData/ast/superExpression/class/classAextendsB.kt +++ b/testData/ast/superExpression/class/classAextendsB.kt @@ -3,10 +3,10 @@ open fun call() : Unit { } } open class A() : B { -{ -super() -} override fun call() : Unit { return super.call() } +{ +super() +} } \ No newline at end of file diff --git a/testData/ast/trait/class/interfaceWithFields.kt b/testData/ast/trait/class/interfaceWithFields.kt index 8e2b43d7e84..1797878a578 100644 --- a/testData/ast/trait/class/interfaceWithFields.kt +++ b/testData/ast/trait/class/interfaceWithFields.kt @@ -4,4 +4,9 @@ val IN : String? = "in" val AT : String? = "@" val COMMA_WITH_SPACE : String? = (COMMA + SPACE) } +{ +this.IN = IN +this.AT = AT +this.COMMA_WITH_SPACE = COMMA_WITH_SPACE +} } \ No newline at end of file diff --git a/testData/ast/trait/class/interfaceWithStaticFields.kt b/testData/ast/trait/class/interfaceWithStaticFields.kt index 22d47bf9a91..8adea3fdf39 100644 --- a/testData/ast/trait/class/interfaceWithStaticFields.kt +++ b/testData/ast/trait/class/interfaceWithStaticFields.kt @@ -4,4 +4,9 @@ public val IN : String? = "in" public val AT : String? = "@" public val COMMA_WITH_SPACE : String? = (COMMA + SPACE) } +{ +this.IN = IN +this.AT = AT +this.COMMA_WITH_SPACE = COMMA_WITH_SPACE +} } \ No newline at end of file From 1e838a9dc3104d454a8a922cecccafb604311143 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 14 Nov 2011 14:39:44 +0400 Subject: [PATCH 087/206] added files for fields tests --- testData/ast/field/file/internalField.kt | 6 ++++++ testData/ast/field/file/privateField.kt | 6 ++++++ testData/ast/field/file/protectedField.kt | 6 ++++++ testData/ast/field/file/publicField.kt | 6 ++++++ testData/ast/field/file/valWithInit.kt | 6 ++++++ testData/ast/field/file/varWithInit.kt | 3 +++ testData/ast/field/file/varWithoutInit.kt | 6 ++++++ 7 files changed, 39 insertions(+) create mode 100644 testData/ast/field/file/internalField.kt create mode 100644 testData/ast/field/file/privateField.kt create mode 100644 testData/ast/field/file/protectedField.kt create mode 100644 testData/ast/field/file/publicField.kt create mode 100644 testData/ast/field/file/valWithInit.kt create mode 100644 testData/ast/field/file/varWithInit.kt create mode 100644 testData/ast/field/file/varWithoutInit.kt diff --git a/testData/ast/field/file/internalField.kt b/testData/ast/field/file/internalField.kt new file mode 100644 index 00000000000..9666f1c611d --- /dev/null +++ b/testData/ast/field/file/internalField.kt @@ -0,0 +1,6 @@ +open class C(f : Foo?) { +var f : Foo? +{ +this.f = f +} +} \ No newline at end of file diff --git a/testData/ast/field/file/privateField.kt b/testData/ast/field/file/privateField.kt new file mode 100644 index 00000000000..aefb7b6f0f0 --- /dev/null +++ b/testData/ast/field/file/privateField.kt @@ -0,0 +1,6 @@ +open class C(f : Foo?) { +private var f : Foo? +{ +this.f = f +} +} \ No newline at end of file diff --git a/testData/ast/field/file/protectedField.kt b/testData/ast/field/file/protectedField.kt new file mode 100644 index 00000000000..132c8174abc --- /dev/null +++ b/testData/ast/field/file/protectedField.kt @@ -0,0 +1,6 @@ +open class C(f : Foo?) { +protected var f : Foo? +{ +this.f = f +} +} \ No newline at end of file diff --git a/testData/ast/field/file/publicField.kt b/testData/ast/field/file/publicField.kt new file mode 100644 index 00000000000..24c1ac8956e --- /dev/null +++ b/testData/ast/field/file/publicField.kt @@ -0,0 +1,6 @@ +open class C(f : Foo?) { +public var f : Foo? +{ +this.f = f +} +} \ No newline at end of file diff --git a/testData/ast/field/file/valWithInit.kt b/testData/ast/field/file/valWithInit.kt new file mode 100644 index 00000000000..48c4b7e68f1 --- /dev/null +++ b/testData/ast/field/file/valWithInit.kt @@ -0,0 +1,6 @@ +open class C(f : Foo?) { +val f : Foo? = Foo(1, 2) +{ +this.f = f +} +} \ No newline at end of file diff --git a/testData/ast/field/file/varWithInit.kt b/testData/ast/field/file/varWithInit.kt new file mode 100644 index 00000000000..6d8dfd2b64c --- /dev/null +++ b/testData/ast/field/file/varWithInit.kt @@ -0,0 +1,3 @@ +open class C() { +var f : Foo? = Foo(1, 2) +} \ No newline at end of file diff --git a/testData/ast/field/file/varWithoutInit.kt b/testData/ast/field/file/varWithoutInit.kt new file mode 100644 index 00000000000..9666f1c611d --- /dev/null +++ b/testData/ast/field/file/varWithoutInit.kt @@ -0,0 +1,6 @@ +open class C(f : Foo?) { +var f : Foo? +{ +this.f = f +} +} \ No newline at end of file From 251b69eab3fe783ab481a5f8dc9613906798f130 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 14 Nov 2011 14:44:52 +0400 Subject: [PATCH 088/206] cleanup --- src/org/jetbrains/jet/j2k/Converter.java | 6 +++--- src/org/jetbrains/jet/j2k/ast/AnonymousClass.java | 11 +++++------ src/org/jetbrains/jet/j2k/ast/Block.java | 13 ++++++++----- src/org/jetbrains/jet/j2k/ast/ClassType.java | 4 ++-- src/org/jetbrains/jet/j2k/ast/Trait.java | 2 -- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 3934c8864ea..52d985989ac 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -136,9 +136,9 @@ public class Converter { methods.add( new Constructor( Identifier.EMPTY_IDENTIFIER, - new HashSet(), + Collections.emptySet(), new ClassType(name, false), - new LinkedList(), + Collections.emptyList(), new ParameterList(createParametersFromFields(finalOrWithEmptyInitializer)), new Block(createInitStatementsFromFields(finalOrWithEmptyInitializer)), true @@ -149,7 +149,7 @@ public class Converter { if (psiClass.isInterface()) return new Trait(name, modifiers, typeParameters, extendsTypes, implementsTypes, innerClasses, methods, fields); if (psiClass.isEnum()) - return new Enum(name, modifiers, typeParameters, new LinkedList(), implementsTypes, + return new Enum(name, modifiers, typeParameters, Collections.emptyList(), implementsTypes, innerClasses, methods, fieldsToFieldListForEnums(psiClass.getAllFields())); return new Class(name, modifiers, typeParameters, extendsTypes, implementsTypes, innerClasses, methods, fields); } diff --git a/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java b/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java index 4c4d084be07..adb95335884 100644 --- a/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java +++ b/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java @@ -2,8 +2,7 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; -import java.util.HashSet; -import java.util.LinkedList; +import java.util.Collections; import java.util.List; /** @@ -12,10 +11,10 @@ import java.util.List; 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(), + Collections.emptySet(), + Collections.emptyList(), + Collections.emptyList(), + Collections.emptyList(), innerClasses, methods, fields); diff --git a/src/org/jetbrains/jet/j2k/ast/Block.java b/src/org/jetbrains/jet/j2k/ast/Block.java index a0f3f789fd4..8d185070527 100644 --- a/src/org/jetbrains/jet/j2k/ast/Block.java +++ b/src/org/jetbrains/jet/j2k/ast/Block.java @@ -12,21 +12,20 @@ import java.util.List; public class Block extends Statement { public final static Block EMPTY_BLOCK = new Block(); - public List getStatements() { - return myStatements; - } - - private List myStatements = new LinkedList(); + private List myStatements; private boolean myNotEmpty = false; private Block() { + myStatements = new LinkedList(); } public Block(List statements) { + myStatements = new LinkedList(); myStatements = statements; } public Block(List statements, boolean notEmpty) { + myStatements = new LinkedList(); myStatements = statements; myNotEmpty = notEmpty; } @@ -35,6 +34,10 @@ public class Block extends Statement { return !myNotEmpty && myStatements.size() == 0; } + public List getStatements() { + return myStatements; + } + @NotNull @Override public String toKotlin() { diff --git a/src/org/jetbrains/jet/j2k/ast/ClassType.java b/src/org/jetbrains/jet/j2k/ast/ClassType.java index 2dbb513c316..a6822eebba4 100644 --- a/src/org/jetbrains/jet/j2k/ast/ClassType.java +++ b/src/org/jetbrains/jet/j2k/ast/ClassType.java @@ -3,7 +3,7 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.j2k.util.AstUtil; -import java.util.LinkedList; +import java.util.Collections; import java.util.List; /** @@ -21,7 +21,7 @@ public class ClassType extends Type { public ClassType(Identifier type, boolean isNullable) { myType = type; myNullable = isNullable; - myParameters = new LinkedList(); + myParameters = Collections.emptyList(); } @NotNull diff --git a/src/org/jetbrains/jet/j2k/ast/Trait.java b/src/org/jetbrains/jet/j2k/ast/Trait.java index db6d5a8af86..9f58a557785 100644 --- a/src/org/jetbrains/jet/j2k/ast/Trait.java +++ b/src/org/jetbrains/jet/j2k/ast/Trait.java @@ -1,7 +1,5 @@ package org.jetbrains.jet.j2k.ast; -import org.jetbrains.annotations.NotNull; - import java.util.List; import java.util.Set; From 26b96d95626b4ceecfb96bcba08ed7a8d0f495d0 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 14 Nov 2011 15:41:47 +0400 Subject: [PATCH 089/206] replace `this.` by `$` for fields inside anonymous initializers --- src/org/jetbrains/jet/j2k/Converter.java | 4 ++-- testData/ast/callChainExpression/file/libraryFieldCall.kt | 2 +- .../ast/callChainExpression/file/libraryStringFieldCall.kt | 2 +- testData/ast/class/class/classWithMultiplyFields.kt | 4 ++-- testData/ast/constructors/file/identifier.kt | 4 ++-- testData/ast/field/file/internalField.kt | 2 +- testData/ast/field/file/privateField.kt | 2 +- testData/ast/field/file/protectedField.kt | 2 +- testData/ast/field/file/publicField.kt | 2 +- testData/ast/field/file/valWithInit.kt | 2 +- testData/ast/field/file/varWithoutInit.kt | 2 +- testData/ast/trait/class/interfaceWithFields.kt | 5 ----- testData/ast/trait/class/interfaceWithStaticFields.kt | 5 ----- 13 files changed, 14 insertions(+), 24 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 52d985989ac..08b762da9e7 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -62,7 +62,7 @@ public class Converter { List result = new LinkedList(); for (Field f : fields) { final String identifierToKotlin = f.getIdentifier().toKotlin(); - result.add(new DummyStringStatement("this." + identifierToKotlin + " = " + identifierToKotlin)); + result.add(new DummyStringStatement("$" + identifierToKotlin + " = " + identifierToKotlin)); } return result; } @@ -87,7 +87,7 @@ public class Converter { final IdentifierImpl name = new IdentifierImpl(psiClass.getName()); // we create primary constructor - if (!psiClass.isEnum() && getPrimaryConstructor(psiClass) == null) { + if (!psiClass.isEnum() && !psiClass.isInterface() && getPrimaryConstructor(psiClass) == null) { final List finalOrWithEmptyInitializer = getFinalOrWithEmptyInitializer(fields); final Map initializers = new HashMap(); diff --git a/testData/ast/callChainExpression/file/libraryFieldCall.kt b/testData/ast/callChainExpression/file/libraryFieldCall.kt index a276cdee6ba..e73fec3b331 100644 --- a/testData/ast/callChainExpression/file/libraryFieldCall.kt +++ b/testData/ast/callChainExpression/file/libraryFieldCall.kt @@ -3,7 +3,7 @@ class object { val ourOut : PrintStream? } { -this.ourOut = ourOut +$ourOut = ourOut } } open class User() { diff --git a/testData/ast/callChainExpression/file/libraryStringFieldCall.kt b/testData/ast/callChainExpression/file/libraryStringFieldCall.kt index 49e83aea5a9..f0b4a755514 100644 --- a/testData/ast/callChainExpression/file/libraryStringFieldCall.kt +++ b/testData/ast/callChainExpression/file/libraryStringFieldCall.kt @@ -1,7 +1,7 @@ open class Library(myString : String?) { public val myString : String? { -this.myString = myString +$myString = myString } } open class User() { diff --git a/testData/ast/class/class/classWithMultiplyFields.kt b/testData/ast/class/class/classWithMultiplyFields.kt index 6d2dbd78c0b..284615f1d67 100644 --- a/testData/ast/class/class/classWithMultiplyFields.kt +++ b/testData/ast/class/class/classWithMultiplyFields.kt @@ -3,7 +3,7 @@ var a : String? var b : String? var c : String? = "abc" { -this.a = a -this.b = b +$a = a +$b = b } } \ No newline at end of file diff --git a/testData/ast/constructors/file/identifier.kt b/testData/ast/constructors/file/identifier.kt index 692852c2fdd..71bfa01998e 100644 --- a/testData/ast/constructors/file/identifier.kt +++ b/testData/ast/constructors/file/identifier.kt @@ -22,8 +22,8 @@ open public fun getName() : String? { return myName } { -this.myName = myName -this.myHasDollar = myHasDollar +$myName = myName +$myHasDollar = myHasDollar } } public open class User() { diff --git a/testData/ast/field/file/internalField.kt b/testData/ast/field/file/internalField.kt index 9666f1c611d..e1619fe519b 100644 --- a/testData/ast/field/file/internalField.kt +++ b/testData/ast/field/file/internalField.kt @@ -1,6 +1,6 @@ open class C(f : Foo?) { var f : Foo? { -this.f = f +$f = f } } \ No newline at end of file diff --git a/testData/ast/field/file/privateField.kt b/testData/ast/field/file/privateField.kt index aefb7b6f0f0..d86a453cada 100644 --- a/testData/ast/field/file/privateField.kt +++ b/testData/ast/field/file/privateField.kt @@ -1,6 +1,6 @@ open class C(f : Foo?) { private var f : Foo? { -this.f = f +$f = f } } \ No newline at end of file diff --git a/testData/ast/field/file/protectedField.kt b/testData/ast/field/file/protectedField.kt index 132c8174abc..e874bfa3195 100644 --- a/testData/ast/field/file/protectedField.kt +++ b/testData/ast/field/file/protectedField.kt @@ -1,6 +1,6 @@ open class C(f : Foo?) { protected var f : Foo? { -this.f = f +$f = f } } \ No newline at end of file diff --git a/testData/ast/field/file/publicField.kt b/testData/ast/field/file/publicField.kt index 24c1ac8956e..610d873990b 100644 --- a/testData/ast/field/file/publicField.kt +++ b/testData/ast/field/file/publicField.kt @@ -1,6 +1,6 @@ open class C(f : Foo?) { public var f : Foo? { -this.f = f +$f = f } } \ No newline at end of file diff --git a/testData/ast/field/file/valWithInit.kt b/testData/ast/field/file/valWithInit.kt index 48c4b7e68f1..94b58759762 100644 --- a/testData/ast/field/file/valWithInit.kt +++ b/testData/ast/field/file/valWithInit.kt @@ -1,6 +1,6 @@ open class C(f : Foo?) { val f : Foo? = Foo(1, 2) { -this.f = f +$f = f } } \ No newline at end of file diff --git a/testData/ast/field/file/varWithoutInit.kt b/testData/ast/field/file/varWithoutInit.kt index 9666f1c611d..e1619fe519b 100644 --- a/testData/ast/field/file/varWithoutInit.kt +++ b/testData/ast/field/file/varWithoutInit.kt @@ -1,6 +1,6 @@ open class C(f : Foo?) { var f : Foo? { -this.f = f +$f = f } } \ No newline at end of file diff --git a/testData/ast/trait/class/interfaceWithFields.kt b/testData/ast/trait/class/interfaceWithFields.kt index 1797878a578..8e2b43d7e84 100644 --- a/testData/ast/trait/class/interfaceWithFields.kt +++ b/testData/ast/trait/class/interfaceWithFields.kt @@ -4,9 +4,4 @@ val IN : String? = "in" val AT : String? = "@" val COMMA_WITH_SPACE : String? = (COMMA + SPACE) } -{ -this.IN = IN -this.AT = AT -this.COMMA_WITH_SPACE = COMMA_WITH_SPACE -} } \ No newline at end of file diff --git a/testData/ast/trait/class/interfaceWithStaticFields.kt b/testData/ast/trait/class/interfaceWithStaticFields.kt index 8adea3fdf39..22d47bf9a91 100644 --- a/testData/ast/trait/class/interfaceWithStaticFields.kt +++ b/testData/ast/trait/class/interfaceWithStaticFields.kt @@ -4,9 +4,4 @@ public val IN : String? = "in" public val AT : String? = "@" public val COMMA_WITH_SPACE : String? = (COMMA + SPACE) } -{ -this.IN = IN -this.AT = AT -this.COMMA_WITH_SPACE = COMMA_WITH_SPACE -} } \ No newline at end of file From 016064c2733b99db8d70e6f1737ba78854efb20b Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 14 Nov 2011 17:29:38 +0400 Subject: [PATCH 090/206] base class params added to the class declaration --- src/org/jetbrains/jet/j2k/Converter.java | 48 +++++++++++++++---- .../jetbrains/jet/j2k/ast/AnonymousClass.java | 1 + src/org/jetbrains/jet/j2k/ast/Class.java | 27 ++++++++--- src/org/jetbrains/jet/j2k/ast/Enum.java | 4 +- src/org/jetbrains/jet/j2k/ast/Trait.java | 4 +- src/org/jetbrains/jet/j2k/util/AstUtil.java | 2 +- .../jet/j2k/visitors/ExpressionVisitor.java | 15 +++--- .../jet/j2k/visitors/SuperVisitor.java | 38 +++++++++++++++ .../jet/j2k/visitors/ThisVisitor.java | 4 -- .../ast/class/class/abstractClassShape.kt | 2 - ...xtendsOneClassAndImplementsOneInterface.kt | 2 +- ...sOneClassAndImplementsSeveralInterfaces.kt | 2 +- testData/ast/class/class/simpleInheritance.kt | 2 +- .../ast/constructors/file/allCallsPrimary.kt | 2 - testData/ast/function/file/override.kt | 2 +- testData/ast/function/file/overrideAndOpen.kt | 4 +- .../identifier/file/finalFieldReference.kt | 2 +- .../superExpression/class/classAextendsB.jav | 7 +-- .../superExpression/class/classAextendsB.kt | 12 ++--- .../superExpression/file/classAdotSuperFoo.kt | 2 +- .../thisExpression/file/classAdotThisFoo.kt | 2 +- ...rametrizationWithTwoBoundsWithExtending.kt | 2 +- ...rametrizationWithTwoBoundsWithExtending.kt | 2 +- 23 files changed, 132 insertions(+), 56 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/visitors/SuperVisitor.java diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 08b762da9e7..f7067cc5a7e 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -85,9 +85,26 @@ public class Converter { final List implementsTypes = typesToNotNullableTypeList(psiClass.getImplementsListTypes()); final List extendsTypes = typesToNotNullableTypeList(psiClass.getExtendsListTypes()); final IdentifierImpl name = new IdentifierImpl(psiClass.getName()); + final List baseClassParams = new LinkedList(); + +// for (PsiType t : psiClass.getExtendsListTypes()) +// if (t != null && t instanceof PsiClassType) { +// final PsiClass resolve = ((PsiClassType) t).resolve(); +// if (resolve != null) { + final SuperVisitor visitor = new SuperVisitor(); + psiClass.accept(visitor); + final HashSet resolvedSuperCallParameters = visitor.getResolvedSuperCallParameters(); + if (resolvedSuperCallParameters.size() == 1) + baseClassParams.addAll( + expressionsToExpressionList( + resolvedSuperCallParameters.toArray(new PsiExpressionList[1])[0].getExpressions() + ) + ); +// } +// } // we create primary constructor - if (!psiClass.isEnum() && !psiClass.isInterface() && getPrimaryConstructor(psiClass) == null) { + if (!psiClass.isEnum() && !psiClass.isInterface() && getPrimaryConstructorForThisCase(psiClass) == null) { final List finalOrWithEmptyInitializer = getFinalOrWithEmptyInitializer(fields); final Map initializers = new HashMap(); @@ -147,11 +164,11 @@ public class Converter { } if (psiClass.isInterface()) - return new Trait(name, modifiers, typeParameters, extendsTypes, implementsTypes, innerClasses, methods, fields); + return new Trait(name, modifiers, typeParameters, extendsTypes, Collections.emptyList(), implementsTypes, innerClasses, methods, fields); if (psiClass.isEnum()) - return new Enum(name, modifiers, typeParameters, Collections.emptyList(), implementsTypes, + return new Enum(name, modifiers, typeParameters, Collections.emptyList(), Collections.emptyList(), implementsTypes, innerClasses, methods, fieldsToFieldListForEnums(psiClass.getAllFields())); - return new Class(name, modifiers, typeParameters, extendsTypes, implementsTypes, innerClasses, methods, fields); + return new Class(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, innerClasses, methods, fields); } private static String getDefaultInitializer(Field f) { @@ -219,7 +236,7 @@ public class Converter { } @Nullable - public static PsiMethod getPrimaryConstructor(PsiClass psiClass) { + public static PsiMethod getPrimaryConstructorForThisCase(PsiClass psiClass) { ThisVisitor tv = new ThisVisitor(); psiClass.accept(tv); return tv.getPrimaryConstructor(); @@ -233,7 +250,7 @@ public class Converter { if (parent.getConstructors().length == 1) return true; else { - PsiMethod c = getPrimaryConstructor(parent); // TODO: move up to classToClass() method + PsiMethod c = getPrimaryConstructorForThisCase(parent); // TODO: move up to classToClass() method if (c != null && c.hashCode() == constructor.hashCode()) return true; } @@ -241,6 +258,22 @@ public class Converter { return false; } + @Nullable + public static PsiMethod getPrimaryConstructor(@NotNull PsiClass psiClass) { // TODO + for (PsiMethod c : psiClass.getConstructors()) + if (isConstructorPrimary(c)) + return c; + return null; + } + + private static List removeEmpty(List statements) { + List result = new LinkedList(); + for (Statement s : statements) + if (s != Statement.EMPTY_STATEMENT && s != Expression.EMPTY_EXPRESSION) + result.add(s); + return result; + } + @NotNull private static Function methodToFunction(PsiMethod method, boolean notEmpty) { final IdentifierImpl identifier = new IdentifierImpl(method.getName()); @@ -257,14 +290,13 @@ public class Converter { if (method.isConstructor()) { // TODO: simplify boolean isPrimary = isConstructorPrimary(method); - return new Constructor( identifier, modifiers, type, typeParameters, params, - body, + new Block(removeEmpty(body.getStatements()), false), isPrimary ); } diff --git a/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java b/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java index adb95335884..66bc42d0340 100644 --- a/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java +++ b/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java @@ -14,6 +14,7 @@ public class AnonymousClass extends Class { Collections.emptySet(), Collections.emptyList(), Collections.emptyList(), + Collections.emptyList(), Collections.emptyList(), innerClasses, methods, diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java index 6ee09365a96..a3b45d5bb70 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -9,12 +9,15 @@ import java.util.LinkedList; import java.util.List; import java.util.Set; +import static org.jetbrains.jet.j2k.util.AstUtil.*; + /** * @author ignatov */ public class Class extends Member { String TYPE = "class"; final Identifier myName; + private final List myBaseClassParams; private final List myTypeParameters; private final List myExtendsTypes; private final List myImplementsTypes; @@ -23,8 +26,9 @@ public class Class extends Member { final List myFields; public Class(Identifier name, Set modifiers, List typeParameters, List extendsTypes, - List implementsTypes, List innerClasses, List methods, List fields) { + List baseClassParams, List implementsTypes, List innerClasses, List methods, List fields) { myName = name; + myBaseClassParams = baseClassParams; myModifiers = modifiers; myTypeParameters = typeParameters; myExtendsTypes = extendsTypes; @@ -70,7 +74,7 @@ public class Class extends Member { for (Element t : myTypeParameters) if (t instanceof TypeParameter) wheres.add(((TypeParameter) t).getWhereToKotlin()); - return SPACE + "where" + SPACE + AstUtil.join(wheres, COMMA_WITH_SPACE) + SPACE; + return SPACE + "where" + SPACE + join(wheres, COMMA_WITH_SPACE) + SPACE; } return EMPTY; } @@ -112,14 +116,23 @@ public class Class extends Member { return myTypeParameters.size() > 0 ? "<" + AstUtil.joinNodes(myTypeParameters, COMMA_WITH_SPACE) + ">" : EMPTY; } + List baseClassSignatureWithParams() { + if (TYPE.equals("class") && myExtendsTypes.size() == 1) { + LinkedList result = new LinkedList(); + result.add(myExtendsTypes.get(0).toKotlin() + "(" + joinNodes(myBaseClassParams, COMMA_WITH_SPACE) + ")"); + return result; + } else + return nodesToKotlin(myExtendsTypes); + } + String implementTypesToKotlin() { - List allTypes = new LinkedList() { + List allTypes = new LinkedList() { { - addAll(myExtendsTypes); - addAll(myImplementsTypes); + addAll(baseClassSignatureWithParams()); + addAll(nodesToKotlin(myImplementsTypes)); } }; - return allTypes.size() == 0 ? EMPTY : SPACE + COLON + SPACE + AstUtil.joinNodes(allTypes, COMMA_WITH_SPACE); + return allTypes.size() == 0 ? EMPTY : SPACE + COLON + SPACE + join(allTypes, COMMA_WITH_SPACE); } String modifiersToKotlin() { @@ -134,7 +147,7 @@ public class Class extends Member { modifierList.add(Modifier.OPEN); if (modifierList.size() > 0) - return AstUtil.join(modifierList, SPACE) + SPACE; + return join(modifierList, SPACE) + SPACE; return EMPTY; } diff --git a/src/org/jetbrains/jet/j2k/ast/Enum.java b/src/org/jetbrains/jet/j2k/ast/Enum.java index e7c7dd0867f..1b16eda4613 100644 --- a/src/org/jetbrains/jet/j2k/ast/Enum.java +++ b/src/org/jetbrains/jet/j2k/ast/Enum.java @@ -11,8 +11,8 @@ import java.util.Set; * @author ignatov */ public class Enum extends Class { - public Enum(Identifier name, Set modifiers, List typeParameters, List extendsTypes, List implementsTypes, List innerClasses, List methods, List fields) { - super(name, modifiers, typeParameters, extendsTypes, implementsTypes, innerClasses, methods, fields); + public Enum(Identifier name, Set modifiers, List typeParameters, List extendsTypes, List baseClassParams, List implementsTypes, List innerClasses, List methods, List fields) { + super(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, innerClasses, methods, fields); } @Nullable diff --git a/src/org/jetbrains/jet/j2k/ast/Trait.java b/src/org/jetbrains/jet/j2k/ast/Trait.java index 9f58a557785..efc17f38466 100644 --- a/src/org/jetbrains/jet/j2k/ast/Trait.java +++ b/src/org/jetbrains/jet/j2k/ast/Trait.java @@ -7,8 +7,8 @@ import java.util.Set; * @author ignatov */ public class Trait extends Class { - public Trait(Identifier name, Set modifiers, List typeParameters, List extendsTypes, List implementsTypes, List innerClasses, List methods, List fields) { - super(name, modifiers, typeParameters, extendsTypes, implementsTypes, innerClasses, methods, fields); + public Trait(Identifier name, Set modifiers, List typeParameters, List extendsTypes, List baseClassParams, List implementsTypes, List innerClasses, List methods, List fields) { + super(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, innerClasses, methods, fields); TYPE = "trait"; } diff --git a/src/org/jetbrains/jet/j2k/util/AstUtil.java b/src/org/jetbrains/jet/j2k/util/AstUtil.java index a4ad4b7f869..7b2c391fe3c 100644 --- a/src/org/jetbrains/jet/j2k/util/AstUtil.java +++ b/src/org/jetbrains/jet/j2k/util/AstUtil.java @@ -31,7 +31,7 @@ public class AstUtil { return join(array.toArray(new String[array.size()]), delimiter); } - private static List nodesToKotlin(List nodes) { + public static List nodesToKotlin(List nodes) { List result = new LinkedList(); for (INode n : nodes) result.add(n.toKotlin()); diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index ed1a81428e4..c7a823f0849 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -164,12 +164,13 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { @Override public void visitMethodCallExpression(PsiMethodCallExpression expression) { super.visitMethodCallExpression(expression); - myResult = // TODO: not resolved - new MethodCallExpression( - expressionToExpression(expression.getMethodExpression()), - elementToElement(expression.getArgumentList()), - typeToType(expression.getType()).isNullable() - ); + if (!SuperVisitor.isSuper(expression.getMethodExpression()) || !isInsidePrimaryConstructor(expression)) + myResult = // TODO: not resolved + new MethodCallExpression( + expressionToExpression(expression.getMethodExpression()), + elementToElement(expression.getArgumentList()), + typeToType(expression.getType()).isNullable() + ); } @Override @@ -305,7 +306,7 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { return false; } - private boolean isInsidePrimaryConstructor(PsiReferenceExpression expression) { + private boolean isInsidePrimaryConstructor(PsiExpression expression) { PsiElement context = expression.getContext(); while (context != null) { if (context instanceof PsiMethod && ((PsiMethod) context).isConstructor()) diff --git a/src/org/jetbrains/jet/j2k/visitors/SuperVisitor.java b/src/org/jetbrains/jet/j2k/visitors/SuperVisitor.java new file mode 100644 index 00000000000..27106702e96 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/visitors/SuperVisitor.java @@ -0,0 +1,38 @@ +package org.jetbrains.jet.j2k.visitors; + +import com.intellij.psi.*; + +import java.util.HashSet; + + +/** + * @author ignatov + */ +public class SuperVisitor extends JavaRecursiveElementVisitor { + private HashSet myResolvedSuperCallParameters; + + public SuperVisitor() { + myResolvedSuperCallParameters = new HashSet(); + } + + public HashSet getResolvedSuperCallParameters() { + return myResolvedSuperCallParameters; + } + + @Override + public void visitMethodCallExpression(PsiMethodCallExpression expression) { + super.visitMethodCallExpression(expression); + if (isSuper(expression.getMethodExpression())) + myResolvedSuperCallParameters.add(expression.getArgumentList()); + } + + static boolean isSuper(PsiReference r) { + if (r.getCanonicalText().equals("super")) { + final PsiElement baseConstructor = r.resolve(); + if (baseConstructor != null && baseConstructor instanceof PsiMethod && ((PsiMethod) baseConstructor).isConstructor()) { + return true; + } + } + return false; + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/ThisVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ThisVisitor.java index 96569d20a09..feea2f69e21 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ThisVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ThisVisitor.java @@ -14,10 +14,6 @@ import java.util.HashSet; public class ThisVisitor extends JavaRecursiveElementVisitor { HashSet myResolvedConstructors = new HashSet(); - public HashSet getResult() { - return myResolvedConstructors; - } - @Override public void visitReferenceExpression(PsiReferenceExpression expression) { for (PsiReference r : expression.getReferences()) diff --git a/testData/ast/class/class/abstractClassShape.kt b/testData/ast/class/class/abstractClassShape.kt index d6500a6c9a5..fff165180c7 100644 --- a/testData/ast/class/class/abstractClassShape.kt +++ b/testData/ast/class/class/abstractClassShape.kt @@ -7,6 +7,4 @@ open public fun getColor() : String? { return color } abstract open public fun area() : Double -{ -} } \ No newline at end of file diff --git a/testData/ast/class/class/extendsOneClassAndImplementsOneInterface.kt b/testData/ast/class/class/extendsOneClassAndImplementsOneInterface.kt index 99eb1856528..7206c054962 100644 --- a/testData/ast/class/class/extendsOneClassAndImplementsOneInterface.kt +++ b/testData/ast/class/class/extendsOneClassAndImplementsOneInterface.kt @@ -1,2 +1,2 @@ -class A() : Base, I { +class A() : Base(), I { } \ No newline at end of file diff --git a/testData/ast/class/class/extendsOneClassAndImplementsSeveralInterfaces.kt b/testData/ast/class/class/extendsOneClassAndImplementsSeveralInterfaces.kt index 25348484337..7812e054bda 100644 --- a/testData/ast/class/class/extendsOneClassAndImplementsSeveralInterfaces.kt +++ b/testData/ast/class/class/extendsOneClassAndImplementsSeveralInterfaces.kt @@ -1,2 +1,2 @@ -class A() : Base, I0, I1, I2 { +class A() : Base(), I0, I1, I2 { } \ No newline at end of file diff --git a/testData/ast/class/class/simpleInheritance.kt b/testData/ast/class/class/simpleInheritance.kt index 7292c1b424c..7bf6ef80f75 100644 --- a/testData/ast/class/class/simpleInheritance.kt +++ b/testData/ast/class/class/simpleInheritance.kt @@ -1,2 +1,2 @@ -class A() : Base { +class A() : Base() { } \ No newline at end of file diff --git a/testData/ast/constructors/file/allCallsPrimary.kt b/testData/ast/constructors/file/allCallsPrimary.kt index e564d45ba6e..1ba1404eccd 100644 --- a/testData/ast/constructors/file/allCallsPrimary.kt +++ b/testData/ast/constructors/file/allCallsPrimary.kt @@ -9,8 +9,6 @@ val __ = C(arg1, 0, 0) return __ } } -{ -} } public open class User() { class object { diff --git a/testData/ast/function/file/override.kt b/testData/ast/function/file/override.kt index 7a355e48c06..d895be5bb27 100644 --- a/testData/ast/function/file/override.kt +++ b/testData/ast/function/file/override.kt @@ -2,7 +2,7 @@ open class A() { open fun a() : Unit { } } -class B() : A { +class B() : A() { override fun a() : Unit { } } \ No newline at end of file diff --git a/testData/ast/function/file/overrideAndOpen.kt b/testData/ast/function/file/overrideAndOpen.kt index ee0eca7b214..678a37a4a70 100644 --- a/testData/ast/function/file/overrideAndOpen.kt +++ b/testData/ast/function/file/overrideAndOpen.kt @@ -2,11 +2,11 @@ open class A() { open fun foo() : Unit { } } -open class B() : A { +open class B() : A() { override fun foo() : Unit { } } -open class C() : B { +open class C() : B() { override fun foo() : Unit { } } \ No newline at end of file diff --git a/testData/ast/identifier/file/finalFieldReference.kt b/testData/ast/identifier/file/finalFieldReference.kt index 7ae0f871828..215a03c5f83 100644 --- a/testData/ast/identifier/file/finalFieldReference.kt +++ b/testData/ast/identifier/file/finalFieldReference.kt @@ -2,7 +2,7 @@ open class `$$$$$`() { } open class `$`() { } -open class `$$`(`$$$$` : `$$$$$`?) : `$` { +open class `$$`(`$$$$` : `$$$$$`?) : `$`() { val `$$$` : `$$$$$`? open public fun `$$$$$$`() : `$$$$$`? { return `$$$` diff --git a/testData/ast/superExpression/class/classAextendsB.jav b/testData/ast/superExpression/class/classAextendsB.jav index b50235108d0..6f07978fe79 100644 --- a/testData/ast/superExpression/class/classAextendsB.jav +++ b/testData/ast/superExpression/class/classAextendsB.jav @@ -1,11 +1,12 @@ class B { - void call() {} + B(int i) {} + int call() {return 1;} } class A extends B { A() { - super(); + super(10); } - void call() { return super.call(); } + int call() { return super.call(); } } \ No newline at end of file diff --git a/testData/ast/superExpression/class/classAextendsB.kt b/testData/ast/superExpression/class/classAextendsB.kt index bbc73d9ba14..b9c5e29b288 100644 --- a/testData/ast/superExpression/class/classAextendsB.kt +++ b/testData/ast/superExpression/class/classAextendsB.kt @@ -1,12 +1,10 @@ -open class B() { -open fun call() : Unit { +open class B(i : Int) { +open fun call() : Int { +return 1 } } -open class A() : B { -override fun call() : Unit { +open class A() : B(10) { +override fun call() : Int { return super.call() } -{ -super() -} } \ No newline at end of file diff --git a/testData/ast/superExpression/file/classAdotSuperFoo.kt b/testData/ast/superExpression/file/classAdotSuperFoo.kt index bdff091103c..a6495ce0571 100644 --- a/testData/ast/superExpression/file/classAdotSuperFoo.kt +++ b/testData/ast/superExpression/file/classAdotSuperFoo.kt @@ -1,7 +1,7 @@ open class Base() { open fun foo() : Unit } -open class A() : Base { +open class A() : Base() { open class C() { open fun test() : Unit { super@A.foo() diff --git a/testData/ast/thisExpression/file/classAdotThisFoo.kt b/testData/ast/thisExpression/file/classAdotThisFoo.kt index 92197edc7c6..615b3b5dc0a 100644 --- a/testData/ast/thisExpression/file/classAdotThisFoo.kt +++ b/testData/ast/thisExpression/file/classAdotThisFoo.kt @@ -2,7 +2,7 @@ open class Base() { open fun foo() : Unit { } } -open class A() : Base { +open class A() : Base() { open class C() { open fun test() : Unit { this@A.foo() diff --git a/testData/ast/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.kt b/testData/ast/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.kt index ee954ff1105..f40a6cda574 100644 --- a/testData/ast/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.kt +++ b/testData/ast/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.kt @@ -1,2 +1,2 @@ -class CC() : A where T : Comparable?, K : Collection? { +class CC() : A() where T : Comparable?, K : Collection? { } \ No newline at end of file diff --git a/testData/ast/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.kt b/testData/ast/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.kt index e7c258a0f24..e05e75db415 100644 --- a/testData/ast/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.kt +++ b/testData/ast/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.kt @@ -1,2 +1,2 @@ -class C() : A where T : Comparable? { +class C() : A() where T : Comparable? { } \ No newline at end of file From ab85374856defde5d7ee96650d6aa8472808f36d Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 14 Nov 2011 18:26:43 +0400 Subject: [PATCH 091/206] some tests added for previous commit --- .../inheritance/file/classOneExtendsBaseGeneric.jav | 12 ++++++++++++ .../inheritance/file/classOneExtendsBaseGeneric.kt | 8 ++++++++ .../file/classOneExtendsBaseWithOneParam.jav | 9 +++++++++ .../file/classOneExtendsBaseWithOneParam.kt | 4 ++++ .../file/classOneExtendsBaseWithZeroParams.jav | 3 +++ .../file/classOneExtendsBaseWithZeroParams.kt | 4 ++++ ...ExtendsBaseWithZeroParamsNonEmptyConstructor.jav | 13 +++++++++++++ ...eExtendsBaseWithZeroParamsNonEmptyConstructor.kt | 8 ++++++++ 8 files changed, 61 insertions(+) create mode 100644 testData/ast/inheritance/file/classOneExtendsBaseGeneric.jav create mode 100644 testData/ast/inheritance/file/classOneExtendsBaseGeneric.kt create mode 100644 testData/ast/inheritance/file/classOneExtendsBaseWithOneParam.jav create mode 100644 testData/ast/inheritance/file/classOneExtendsBaseWithOneParam.kt create mode 100644 testData/ast/inheritance/file/classOneExtendsBaseWithZeroParams.jav create mode 100644 testData/ast/inheritance/file/classOneExtendsBaseWithZeroParams.kt create mode 100644 testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.jav create mode 100644 testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.kt diff --git a/testData/ast/inheritance/file/classOneExtendsBaseGeneric.jav b/testData/ast/inheritance/file/classOneExtendsBaseGeneric.jav new file mode 100644 index 00000000000..0abe463c9ae --- /dev/null +++ b/testData/ast/inheritance/file/classOneExtendsBaseGeneric.jav @@ -0,0 +1,12 @@ +class Base { + Base(T name) { } +} + +class One extends Base { + private K mySecond; + + One(T name, K second) { + super(name) + mySecond = second; + } +} \ No newline at end of file diff --git a/testData/ast/inheritance/file/classOneExtendsBaseGeneric.kt b/testData/ast/inheritance/file/classOneExtendsBaseGeneric.kt new file mode 100644 index 00000000000..5f03b0858e4 --- /dev/null +++ b/testData/ast/inheritance/file/classOneExtendsBaseGeneric.kt @@ -0,0 +1,8 @@ +open class Base(name : T?) { +} +open class One(name : T?, second : K?) : Base(name) { +private var mySecond : K? +{ +$mySecond = second +} +} \ No newline at end of file diff --git a/testData/ast/inheritance/file/classOneExtendsBaseWithOneParam.jav b/testData/ast/inheritance/file/classOneExtendsBaseWithOneParam.jav new file mode 100644 index 00000000000..9e7190d29fa --- /dev/null +++ b/testData/ast/inheritance/file/classOneExtendsBaseWithOneParam.jav @@ -0,0 +1,9 @@ +class Base { + Base(String name) {} +} + +class One extends Base { + One(String name, String second) { + super(name) + } +} \ No newline at end of file diff --git a/testData/ast/inheritance/file/classOneExtendsBaseWithOneParam.kt b/testData/ast/inheritance/file/classOneExtendsBaseWithOneParam.kt new file mode 100644 index 00000000000..3e82be38c5c --- /dev/null +++ b/testData/ast/inheritance/file/classOneExtendsBaseWithOneParam.kt @@ -0,0 +1,4 @@ +open class Base(name : String?) { +} +open class One(name : String?, second : String?) : Base(name) { +} \ No newline at end of file diff --git a/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParams.jav b/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParams.jav new file mode 100644 index 00000000000..2a89c5bd6e0 --- /dev/null +++ b/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParams.jav @@ -0,0 +1,3 @@ +class Base {} + +class One extends Base {} \ No newline at end of file diff --git a/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParams.kt b/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParams.kt new file mode 100644 index 00000000000..94f907016db --- /dev/null +++ b/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParams.kt @@ -0,0 +1,4 @@ +open class Base() { +} +open class One() : Base() { +} \ No newline at end of file diff --git a/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.jav b/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.jav new file mode 100644 index 00000000000..94f530c95a1 --- /dev/null +++ b/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.jav @@ -0,0 +1,13 @@ +class Base { + Base(String name) { + } +} + +class One extends Base { + private String mySecond; + + One(String name, String second) { + super(name); + mySecond = second; + } +} \ No newline at end of file diff --git a/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.kt b/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.kt new file mode 100644 index 00000000000..c59aa0d172c --- /dev/null +++ b/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.kt @@ -0,0 +1,8 @@ +open class Base(name : String?) { +} +open class One(name : String?, second : String?) : Base(name) { +private var mySecond : String? +{ +$mySecond = second +} +} \ No newline at end of file From dba5e97b7a381232b4403949749c9949ac54880e Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 15 Nov 2011 14:31:18 +0400 Subject: [PATCH 092/206] added default params for all primitive types --- src/org/jetbrains/jet/j2k/Converter.java | 34 ++++++++-------- .../file/withManyDefaultParams.jav | 24 +++++++++++ .../file/withManyDefaultParams.kt | 40 +++++++++++++++++++ 3 files changed, 80 insertions(+), 18 deletions(-) create mode 100644 testData/ast/constructors/file/withManyDefaultParams.jav create mode 100644 testData/ast/constructors/file/withManyDefaultParams.kt diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index f7067cc5a7e..cb5152eb47b 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -87,10 +87,6 @@ public class Converter { final IdentifierImpl name = new IdentifierImpl(psiClass.getName()); final List baseClassParams = new LinkedList(); -// for (PsiType t : psiClass.getExtendsListTypes()) -// if (t != null && t instanceof PsiClassType) { -// final PsiClass resolve = ((PsiClassType) t).resolve(); -// if (resolve != null) { final SuperVisitor visitor = new SuperVisitor(); psiClass.accept(visitor); final HashSet resolvedSuperCallParameters = visitor.getResolvedSuperCallParameters(); @@ -100,20 +96,18 @@ public class Converter { resolvedSuperCallParameters.toArray(new PsiExpressionList[1])[0].getExpressions() ) ); -// } -// } // we create primary constructor if (!psiClass.isEnum() && !psiClass.isInterface() && getPrimaryConstructorForThisCase(psiClass) == null) { final List finalOrWithEmptyInitializer = getFinalOrWithEmptyInitializer(fields); final Map initializers = new HashMap(); - for (Field f : finalOrWithEmptyInitializer) { - String init = getDefaultInitializer(f); - initializers.put(f.getIdentifier().toKotlin(), init); - } - for (final Function f : methods) { + for (Field fo : finalOrWithEmptyInitializer) { + String init = getDefaultInitializer(fo); + initializers.put(fo.getIdentifier().toKotlin(), init); + } + // and modify secondaries if (f.getKind() == INode.Kind.CONSTRUCTOR && !((Constructor) f).isPrimary()) { final List newStatements = new LinkedList(); @@ -126,7 +120,7 @@ public class Converter { if (assignmentExpression.getLeft().getKind() == INode.Kind.CALL_CHAIN) { for (Field fo : finalOrWithEmptyInitializer) { final String id = fo.getIdentifier().toKotlin(); - if (((CallChainExpression) assignmentExpression.getLeft()).getIdentifier().toKotlin().endsWith(id)) { + if (((CallChainExpression) assignmentExpression.getLeft()).getIdentifier().toKotlin().endsWith("." + id)) { initializers.put(id, assignmentExpression.getRight().toKotlin()); isRemoved = true; } @@ -172,12 +166,16 @@ public class Converter { } private static String getDefaultInitializer(Field f) { - if (f.getType().isNullable()) return "null"; - - final String typeToKotlin = f.getType().toKotlin(); - if (typeToKotlin.equals("Boolean")) return "false"; - if (typeToKotlin.equals("Int")) return "0"; - return "TYPE: " + typeToKotlin + " HAVEN'T DEFAULT VALUE"; + if (f.getType().isNullable()) + return "null"; + else { + final String typeToKotlin = f.getType().toKotlin(); + if (typeToKotlin.equals("Boolean")) return "false"; + if (typeToKotlin.equals("Char")) return "' '"; + if (typeToKotlin.equals("Double")) return "0.dbl"; + if (typeToKotlin.equals("Float")) return "0.flt"; + return "0"; + } } // TODO: hack for enums diff --git a/testData/ast/constructors/file/withManyDefaultParams.jav b/testData/ast/constructors/file/withManyDefaultParams.jav new file mode 100644 index 00000000000..c8d04543b0b --- /dev/null +++ b/testData/ast/constructors/file/withManyDefaultParams.jav @@ -0,0 +1,24 @@ +public class Test { + private final String myName; + private boolean a; + private double b; + private float c; + private long d; + private int e; + private short f; + private char g; + + public Test() {} + + public Test(String name) { + myName = foo(name); + } + + static String foo(String n) {return "";} +} + +public class User { + public static void main() { + Test t = new Test("name"); + } +} \ No newline at end of file diff --git a/testData/ast/constructors/file/withManyDefaultParams.kt b/testData/ast/constructors/file/withManyDefaultParams.kt new file mode 100644 index 00000000000..06b13888509 --- /dev/null +++ b/testData/ast/constructors/file/withManyDefaultParams.kt @@ -0,0 +1,40 @@ +public open class Test(myName : String?, a : Boolean, b : Double, c : Float, d : Long, e : Int, f : Short, g : Char) { +private val myName : String? +private var a : Boolean +private var b : Double +private var c : Float +private var d : Long +private var e : Int +private var f : Short +private var g : Char +class object { +open public fun init() : Test { +val __ = Test(null, false, 0.dbl, 0.flt, 0, 0, 0, ' ') +return __ +} +open public fun init(name : String?) : Test { +val __ = Test(foo(name), false, 0.dbl, 0.flt, 0, 0, 0, ' ') +return __ +} +open fun foo(n : String?) : String? { +return "" +} +} +{ +$myName = myName +$a = a +$b = b +$c = c +$d = d +$e = e +$f = f +$g = g +} +} +public open class User() { +class object { +open public fun main() : Unit { +var t : Test? = Test.init("name") +} +} +} \ No newline at end of file From f5c1f098be37d7bea8004e4e3877f4566a877479 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 15 Nov 2011 15:01:16 +0400 Subject: [PATCH 093/206] Converter cleanup --- src/org/jetbrains/jet/j2k/Converter.java | 95 ++++++++---------------- 1 file changed, 31 insertions(+), 64 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index cb5152eb47b..46af108bdfa 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -28,14 +28,12 @@ public class Converter { @NotNull private static List classesToClassList(PsiClass[] classes) { List result = new LinkedList(); - for (PsiClass t : classes) { - result.add(classToClass(t)); - } + for (PsiClass t : classes) result.add(classToClass(t)); return result; } - public static AnonymousClass anonymousClassToAnonymousClass(PsiAnonymousClass anonymousClass) { // TODO: replace by Block, - // use class.getChild() method + public static AnonymousClass anonymousClassToAnonymousClass(PsiAnonymousClass anonymousClass) { + // TODO: replace by Block, use class.getChild() method return new AnonymousClass( classesToClassList(anonymousClass.getAllInnerClasses()), methodsToFunctionList(anonymousClass.getMethods(), true), @@ -53,8 +51,7 @@ public class Converter { private static List createParametersFromFields(List fields) { List result = new LinkedList(); - for (Field f : fields) - result.add(new Parameter(f.getIdentifier(), f.getType())); + for (Field f : fields) result.add(new Parameter(f.getIdentifier(), f.getType())); return result; } @@ -87,6 +84,7 @@ public class Converter { final IdentifierImpl name = new IdentifierImpl(psiClass.getName()); final List baseClassParams = new LinkedList(); + // we try to find super() call and generate class declaration like that: class A(name: String, i : Int) : Base(name) final SuperVisitor visitor = new SuperVisitor(); psiClass.accept(visitor); final HashSet resolvedSuperCallParameters = visitor.getResolvedSuperCallParameters(); @@ -97,7 +95,7 @@ public class Converter { ) ); - // we create primary constructor + // we create primary constructor from all non final fields and fields without initializers if (!psiClass.isEnum() && !psiClass.isInterface() && getPrimaryConstructorForThisCase(psiClass) == null) { final List finalOrWithEmptyInitializer = getFinalOrWithEmptyInitializer(fields); final Map initializers = new HashMap(); @@ -178,7 +176,10 @@ public class Converter { } } - // TODO: hack for enums + // hack for enums, we remove methods: + // private int ordinal() { ... } + // private String name() { ... } + // those methods any enum class inherits from java.lang.Enum private static List fieldsToFieldListForEnums(PsiField[] fields) { List result = new LinkedList(); for (PsiField f : fields) { @@ -201,9 +202,7 @@ public class Converter { private static List fieldsToFieldList(PsiField[] fields) { List result = new LinkedList(); - for (PsiField f : fields) { - result.add(fieldToField(f)); - } + for (PsiField f : fields) result.add(fieldToField(f)); return result; } @@ -227,9 +226,7 @@ public class Converter { @NotNull private static List methodsToFunctionList(PsiMethod[] methods, boolean notEmpty) { List result = new LinkedList(); - for (PsiMethod t : methods) { - result.add(methodToFunction(t, notEmpty)); - } + for (PsiMethod t : methods) result.add(methodToFunction(t, notEmpty)); return result; } @@ -256,14 +253,6 @@ public class Converter { return false; } - @Nullable - public static PsiMethod getPrimaryConstructor(@NotNull PsiClass psiClass) { // TODO - for (PsiMethod c : psiClass.getConstructors()) - if (isConstructorPrimary(c)) - return c; - return null; - } - private static List removeEmpty(List statements) { List result = new LinkedList(); for (Statement s : statements) @@ -310,8 +299,7 @@ public class Converter { @NotNull public static Block blockToBlock(@Nullable PsiCodeBlock block, boolean notEmpty) { - if (block == null) - return Block.EMPTY_BLOCK; + if (block == null) return Block.EMPTY_BLOCK; return new Block(statementsToStatementList(block.getStatements()), notEmpty); } @@ -323,16 +311,13 @@ public class Converter { @NotNull public static List statementsToStatementList(PsiStatement[] statements) { List result = new LinkedList(); - for (PsiStatement t : statements) { - result.add(statementToStatement(t)); - } + for (PsiStatement t : statements) result.add(statementToStatement(t)); return result; } @NotNull public static Statement statementToStatement(@Nullable PsiStatement s) { - if (s == null) - return Statement.EMPTY_STATEMENT; + if (s == null) return Statement.EMPTY_STATEMENT; final StatementVisitor statementVisitor = new StatementVisitor(); s.accept(statementVisitor); return statementVisitor.getResult(); @@ -341,16 +326,13 @@ public class Converter { @NotNull public static List expressionsToExpressionList(PsiExpression[] expressions) { List result = new LinkedList(); - for (PsiExpression e : expressions) { - result.add(expressionToExpression(e)); - } + for (PsiExpression e : expressions) result.add(expressionToExpression(e)); return result; } @NotNull public static Expression expressionToExpression(@Nullable PsiExpression e) { - if (e == null) - return Expression.EMPTY_EXPRESSION; + if (e == null) return Expression.EMPTY_EXPRESSION; final ExpressionVisitor expressionVisitor = new ExpressionVisitor(); e.accept(expressionVisitor); return expressionVisitor.getResult(); @@ -358,8 +340,7 @@ public class Converter { @NotNull public static Element elementToElement(PsiElement e) { - if (e == null) - return Element.EMPTY_ELEMENT; + if (e == null) return Element.EMPTY_ELEMENT; final ElementVisitor elementVisitor = new ElementVisitor(); e.accept(elementVisitor); return elementVisitor.getResult(); @@ -368,16 +349,13 @@ public class Converter { @NotNull public static List elementsToElementList(PsiElement[] elements) { List result = new LinkedList(); - for (PsiElement e : elements) { - result.add(elementToElement(e)); - } + for (PsiElement e : elements) result.add(elementToElement(e)); return result; } @NotNull public static Type typeToType(@Nullable PsiType type) { - if (type == null) - return Type.EMPTY_TYPE; // TODO + if (type == null) return Type.EMPTY_TYPE; TypeVisitor typeVisitor = new TypeVisitor(); type.accept(typeVisitor); return typeVisitor.getResult(); @@ -386,49 +364,39 @@ public class Converter { @NotNull public static List typesToTypeList(PsiType[] types) { List result = new LinkedList(); - for (PsiType t : types) { - result.add(typeToType(t)); - } + for (PsiType t : types) result.add(typeToType(t)); return result; } @NotNull private static List typesToNotNullableTypeList(PsiType[] types) { List result = new LinkedList(typesToTypeList(types)); - for (Type p : result) - p.setNullable(false); - return result; - } - - @NotNull - public static Type typeToNotNullableType(@Nullable PsiType type) { - Type result = typeToType(type); - result.setNullable(false); + for (Type p : result) p.setNullable(false); return result; } @NotNull private static List importsToImportList(PsiImportStatementBase[] imports) { List result = new LinkedList(); - for (PsiImportStatementBase t : imports) { - result.add(importToImport(t)); - } + for (PsiImportStatementBase t : imports) result.add(importToImport(t)); return result; } @NotNull private static Import importToImport(PsiImportStatementBase t) { - if (t != null && t.getImportReference() != null) - return new Import(t.getImportReference().getQualifiedName()); // TODO: use identifier + if (t != null) { + final PsiJavaCodeReferenceElement reference = t.getImportReference(); + if (reference != null) { + return new Import(reference.getQualifiedName()); // TODO: use identifier + } + } return new Import(""); } @NotNull public static List parametersToParameterList(PsiParameter[] parameters) { List result = new LinkedList(); - for (PsiParameter t : parameters) { - result.add(parameterToParameter(t)); - } + for (PsiParameter t : parameters) result.add(parameterToParameter(t)); return result; } @@ -442,8 +410,7 @@ public class Converter { @NotNull public static Identifier identifierToIdentifier(@Nullable PsiIdentifier identifier) { - if (identifier == null) - return Identifier.EMPTY_IDENTIFIER; + if (identifier == null) return Identifier.EMPTY_IDENTIFIER; return new IdentifierImpl(identifier.getText()); } From 6a979e540d2f1c314ac318a40eb04936f92f62a5 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 15 Nov 2011 15:18:42 +0400 Subject: [PATCH 094/206] set with keyword updated --- src/org/jetbrains/jet/j2k/ast/Node.java | 5 +--- .../ast/callChainExpression/statement/sout.kt | 2 +- .../ast/constructors/file/customerBuilder.kt | 4 ++-- .../ast/enum/class/runnableImplementation.kt | 2 +- .../ast/identifier/statement/keywords.jav | 6 +---- testData/ast/identifier/statement/keywords.kt | 23 +++++-------------- .../complicatedExampleFromJavaTutorial.kt | 2 +- .../statement/callWithKeywords.kt | 2 +- .../expression/newClassWithAnonymousScope.kt | 2 +- 9 files changed, 15 insertions(+), 33 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/ast/Node.java b/src/org/jetbrains/jet/j2k/ast/Node.java index 5e5a275f718..e29f53214c1 100644 --- a/src/org/jetbrains/jet/j2k/ast/Node.java +++ b/src/org/jetbrains/jet/j2k/ast/Node.java @@ -17,10 +17,7 @@ public abstract class Node implements INode { } final static Set ONLY_KOTLIN_KEYWORDS = new HashSet(Arrays.asList( - "namespace", "in", "val", "var", "when", "object", - "out", "in", "is", "as", "ref", "override", - "open", "attribute", "lazy", "set", "get", - "fun", "where", "by", "trait", "type", "This" + "namespace", "as", "type", "val", "var", "fun", "is", "in", "object", "when", "trait", "This" )); public final static Set PRIMITIVE_TYPES = new HashSet(Arrays.asList( diff --git a/testData/ast/callChainExpression/statement/sout.kt b/testData/ast/callChainExpression/statement/sout.kt index fcb68d6e04d..183416fbb5f 100644 --- a/testData/ast/callChainExpression/statement/sout.kt +++ b/testData/ast/callChainExpression/statement/sout.kt @@ -1 +1 @@ -System.`out`?.println("Hello, world") \ No newline at end of file +System.out?.println("Hello, world") \ No newline at end of file diff --git a/testData/ast/constructors/file/customerBuilder.kt b/testData/ast/constructors/file/customerBuilder.kt index 7092cd9f155..4940f8f8b50 100644 --- a/testData/ast/constructors/file/customerBuilder.kt +++ b/testData/ast/constructors/file/customerBuilder.kt @@ -38,8 +38,8 @@ public open class User() { class object { open public fun main() : Unit { var customer : Customer? = org.test.customer.CustomerBuilder().WithFirstName("Homer")?.WithLastName("Simpson")?.Build() -System.`out`?.println(customer?.getFirstName()) -System.`out`?.println(customer?.getLastName()) +System.out?.println(customer?.getFirstName()) +System.out?.println(customer?.getLastName()) } } } diff --git a/testData/ast/enum/class/runnableImplementation.kt b/testData/ast/enum/class/runnableImplementation.kt index 36d35060e78..b1cb4065b22 100644 --- a/testData/ast/enum/class/runnableImplementation.kt +++ b/testData/ast/enum/class/runnableImplementation.kt @@ -5,6 +5,6 @@ RED YELLOW BLUE override public fun run() : Unit { -System.`out`?.println(("name()=" + name() + ", toString()=" + toString())) +System.out?.println(("name()=" + name() + ", toString()=" + toString())) } } \ No newline at end of file diff --git a/testData/ast/identifier/statement/keywords.jav b/testData/ast/identifier/statement/keywords.jav index 659f1e02d04..12cf781ef6d 100644 --- a/testData/ast/identifier/statement/keywords.jav +++ b/testData/ast/identifier/statement/keywords.jav @@ -1,5 +1 @@ -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 +int namespace, as, type, val, var, fun, is, in, object, when, trait, This; \ No newline at end of file diff --git a/testData/ast/identifier/statement/keywords.kt b/testData/ast/identifier/statement/keywords.kt index a91868c5570..4458510a622 100644 --- a/testData/ast/identifier/statement/keywords.kt +++ b/testData/ast/identifier/statement/keywords.kt @@ -1,23 +1,12 @@ var `namespace` : Int -var `in` : Int +var `as` : Int +var `type` : 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 `is` : Int +var `in` : Int +var `object` : Int +var `when` : Int var `trait` : Int -var `type` : Int var `This` : Int \ No newline at end of file diff --git a/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.kt b/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.kt index 4959a4593a2..fbdba6d9552 100644 --- a/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.kt +++ b/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.kt @@ -21,7 +21,7 @@ break@test } } } -System.`out`?.println((if (foundIt) +System.out?.println((if (foundIt) "Found it" else "Didn't find it")) \ No newline at end of file diff --git a/testData/ast/methodCallExpression/statement/callWithKeywords.kt b/testData/ast/methodCallExpression/statement/callWithKeywords.kt index 92c6a067e95..489e2d97b10 100644 --- a/testData/ast/methodCallExpression/statement/callWithKeywords.kt +++ b/testData/ast/methodCallExpression/statement/callWithKeywords.kt @@ -1 +1 @@ -`when`(`open`, `trait`) \ No newline at end of file +`when`(open, `trait`) \ No newline at end of file diff --git a/testData/ast/newClassExpression/expression/newClassWithAnonymousScope.kt b/testData/ast/newClassExpression/expression/newClassWithAnonymousScope.kt index a6f4ca93dba..10ca89407e6 100644 --- a/testData/ast/newClassExpression/expression/newClassWithAnonymousScope.kt +++ b/testData/ast/newClassExpression/expression/newClassWithAnonymousScope.kt @@ -1,5 +1,5 @@ java.lang.Runnable() { override public fun run() : Unit { -System.`out`?.println("Run") +System.out?.println("Run") } } \ No newline at end of file From 4c7056b2f9745c88427d4ea2a2c3e87c3430e81b Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 15 Nov 2011 15:23:54 +0400 Subject: [PATCH 095/206] added test for main function --- testData/ast/function/method/main.jav | 1 + testData/ast/function/method/main.kt | 4 ++++ 2 files changed, 5 insertions(+) create mode 100644 testData/ast/function/method/main.jav create mode 100644 testData/ast/function/method/main.kt diff --git a/testData/ast/function/method/main.jav b/testData/ast/function/method/main.jav new file mode 100644 index 00000000000..a03c0afe12f --- /dev/null +++ b/testData/ast/function/method/main.jav @@ -0,0 +1 @@ +public static void main(String[] args) {} \ No newline at end of file diff --git a/testData/ast/function/method/main.kt b/testData/ast/function/method/main.kt new file mode 100644 index 00000000000..8d173e36a09 --- /dev/null +++ b/testData/ast/function/method/main.kt @@ -0,0 +1,4 @@ +class object { +open public fun main(args : Array?) : Unit { +} +} \ No newline at end of file From 437fe1b6b4cf827217943798f61f35741899792e Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 15 Nov 2011 15:58:17 +0400 Subject: [PATCH 096/206] getAllFields() replaced by getFields() --- src/org/jetbrains/jet/j2k/Converter.java | 2 +- testData/ast/field/file/classChildExtendsBase.jav | 7 +++++++ testData/ast/field/file/classChildExtendsBase.kt | 12 ++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 testData/ast/field/file/classChildExtendsBase.jav create mode 100644 testData/ast/field/file/classChildExtendsBase.kt diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 46af108bdfa..410c926dd51 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -77,7 +77,7 @@ public class Converter { 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 fields = fieldsToFieldList(psiClass.getFields()); final List typeParameters = elementsToElementList(psiClass.getTypeParameters()); final List implementsTypes = typesToNotNullableTypeList(psiClass.getImplementsListTypes()); final List extendsTypes = typesToNotNullableTypeList(psiClass.getExtendsListTypes()); diff --git a/testData/ast/field/file/classChildExtendsBase.jav b/testData/ast/field/file/classChildExtendsBase.jav new file mode 100644 index 00000000000..94d40fbfea4 --- /dev/null +++ b/testData/ast/field/file/classChildExtendsBase.jav @@ -0,0 +1,7 @@ +class Base { + private String myFirst; +} + +class Child extends Base { + private String mySecond; +} \ No newline at end of file diff --git a/testData/ast/field/file/classChildExtendsBase.kt b/testData/ast/field/file/classChildExtendsBase.kt new file mode 100644 index 00000000000..bbfb7fb7fb8 --- /dev/null +++ b/testData/ast/field/file/classChildExtendsBase.kt @@ -0,0 +1,12 @@ +open class Base(myFirst : String?) { +private var myFirst : String? +{ +$myFirst = myFirst +} +} +open class Child(mySecond : String?) : Base() { +private var mySecond : String? +{ +$mySecond = mySecond +} +} \ No newline at end of file From a80f0eecd499ffc23e984f0c422508e828f6abce Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 15 Nov 2011 16:19:23 +0400 Subject: [PATCH 097/206] cleanup --- src/org/jetbrains/jet/j2k/Converter.java | 18 +++++++-------- .../jet/j2k/ast/AssignmentExpression.java | 2 +- .../jet/j2k/ast/CallChainExpression.java | 4 ++-- src/org/jetbrains/jet/j2k/ast/Class.java | 2 +- src/org/jetbrains/jet/j2k/ast/ClassType.java | 6 ++--- .../jetbrains/jet/j2k/ast/Constructor.java | 2 +- .../jet/j2k/ast/DummyStringStatement.java | 2 +- src/org/jetbrains/jet/j2k/ast/Element.java | 2 +- src/org/jetbrains/jet/j2k/ast/Expression.java | 2 +- .../jetbrains/jet/j2k/ast/ExpressionList.java | 1 - src/org/jetbrains/jet/j2k/ast/INode.java | 2 +- src/org/jetbrains/jet/j2k/ast/Identifier.java | 2 -- .../jetbrains/jet/j2k/ast/IdentifierImpl.java | 5 ----- src/org/jetbrains/jet/j2k/ast/IsOperator.java | 4 ++-- .../jetbrains/jet/j2k/ast/LocalVariable.java | 2 +- .../jet/j2k/ast/MethodCallExpression.java | 2 +- .../jet/j2k/ast/PolyadicExpression.java | 4 ++-- .../jet/j2k/ast/SuperExpression.java | 2 +- .../jetbrains/jet/j2k/ast/ThisExpression.java | 2 +- src/org/jetbrains/jet/j2k/ast/Type.java | 4 ++-- .../jetbrains/jet/j2k/ast/TypeElement.java | 2 +- .../jet/j2k/visitors/ElementVisitor.java | 3 +-- .../jet/j2k/visitors/ExpressionVisitor.java | 2 +- .../jet/j2k/visitors/StatementVisitor.java | 2 +- .../jet/j2k/visitors/SuperVisitor.java | 2 +- .../jet/j2k/visitors/ThisVisitor.java | 15 ++++++------- .../jet/j2k/visitors/TypeVisitor.java | 7 +----- .../jetbrains/jet/j2k/visitors/Visitor.java | 12 ---------- .../jet/j2k/JavaToKotlinConverterTest.java | 22 ++++++++----------- .../jetbrains/jet/j2k/TestCaseBuilder.java | 6 ++--- 30 files changed, 56 insertions(+), 87 deletions(-) delete mode 100644 src/org/jetbrains/jet/j2k/visitors/Visitor.java diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 410c926dd51..807434d6055 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -36,7 +36,7 @@ public class Converter { // TODO: replace by Block, use class.getChild() method return new AnonymousClass( classesToClassList(anonymousClass.getAllInnerClasses()), - methodsToFunctionList(anonymousClass.getMethods(), true), + methodsToFunctionList(anonymousClass.getMethods()), fieldsToFieldList(anonymousClass.getAllFields()) ); } @@ -73,10 +73,10 @@ public class Converter { return s + "(" + AstUtil.join(result, ", ") + ")"; } - public static Class classToClass(PsiClass psiClass) { + private 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 methods = methodsToFunctionList(psiClass.getMethods()); final List fields = fieldsToFieldList(psiClass.getFields()); final List typeParameters = elementsToElementList(psiClass.getTypeParameters()); final List implementsTypes = typesToNotNullableTypeList(psiClass.getImplementsListTypes()); @@ -113,7 +113,7 @@ public class Converter { for (Statement s : f.getBlock().getStatements()) { boolean isRemoved = false; - if (s.getKind() == INode.Kind.ASSINGNMENT_EXPRESSION) { + if (s.getKind() == INode.Kind.ASSIGNMENT_EXPRESSION) { final AssignmentExpression assignmentExpression = (AssignmentExpression) s; if (assignmentExpression.getLeft().getKind() == INode.Kind.CALL_CHAIN) { for (Field fo : finalOrWithEmptyInitializer) { @@ -146,7 +146,7 @@ public class Converter { new Constructor( Identifier.EMPTY_IDENTIFIER, Collections.emptySet(), - new ClassType(name, false), + new ClassType(name), Collections.emptyList(), new ParameterList(createParametersFromFields(finalOrWithEmptyInitializer)), new Block(createInitStatementsFromFields(finalOrWithEmptyInitializer)), @@ -224,14 +224,14 @@ public class Converter { } @NotNull - private static List methodsToFunctionList(PsiMethod[] methods, boolean notEmpty) { + private static List methodsToFunctionList(PsiMethod[] methods) { List result = new LinkedList(); - for (PsiMethod t : methods) result.add(methodToFunction(t, notEmpty)); + for (PsiMethod t : methods) result.add(methodToFunction(t, true)); return result; } @Nullable - public static PsiMethod getPrimaryConstructorForThisCase(PsiClass psiClass) { + private static PsiMethod getPrimaryConstructorForThisCase(PsiClass psiClass) { ThisVisitor tv = new ThisVisitor(); psiClass.accept(tv); return tv.getPrimaryConstructor(); @@ -371,7 +371,7 @@ public class Converter { @NotNull private static List typesToNotNullableTypeList(PsiType[] types) { List result = new LinkedList(typesToTypeList(types)); - for (Type p : result) p.setNullable(false); + for (Type p : result) p.convertToNotNull(); return result; } diff --git a/src/org/jetbrains/jet/j2k/ast/AssignmentExpression.java b/src/org/jetbrains/jet/j2k/ast/AssignmentExpression.java index 98529c5637e..34d1fcb7b20 100644 --- a/src/org/jetbrains/jet/j2k/ast/AssignmentExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/AssignmentExpression.java @@ -33,6 +33,6 @@ public class AssignmentExpression extends Expression { @NotNull @Override public Kind getKind() { - return Kind.ASSINGNMENT_EXPRESSION; + return Kind.ASSIGNMENT_EXPRESSION; } } diff --git a/src/org/jetbrains/jet/j2k/ast/CallChainExpression.java b/src/org/jetbrains/jet/j2k/ast/CallChainExpression.java index 32a352e3349..d98463f24c1 100644 --- a/src/org/jetbrains/jet/j2k/ast/CallChainExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/CallChainExpression.java @@ -6,8 +6,8 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public class CallChainExpression extends Expression { - private Expression myExpression; - private Expression myIdentifier; + private final Expression myExpression; + private final Expression myIdentifier; public Expression getIdentifier() { return myIdentifier; diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java index a3b45d5bb70..f16e94522fd 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -103,7 +103,7 @@ public class Class extends Member { result.add(new Function( new IdentifierImpl("init"), modifiers, - new ClassType(myName, false), + new ClassType(myName), m.getTypeParameters(), m.getParams(), block diff --git a/src/org/jetbrains/jet/j2k/ast/ClassType.java b/src/org/jetbrains/jet/j2k/ast/ClassType.java index a6822eebba4..830c3a49e5d 100644 --- a/src/org/jetbrains/jet/j2k/ast/ClassType.java +++ b/src/org/jetbrains/jet/j2k/ast/ClassType.java @@ -18,10 +18,10 @@ public class ClassType extends Type { myParameters = parameters; } - public ClassType(Identifier type, boolean isNullable) { + public ClassType(Identifier type) { myType = type; - myNullable = isNullable; - myParameters = Collections.emptyList(); + myNullable = false; + myParameters = Collections.emptyList(); } @NotNull diff --git a/src/org/jetbrains/jet/j2k/ast/Constructor.java b/src/org/jetbrains/jet/j2k/ast/Constructor.java index c3231f7fafd..827daa99b53 100644 --- a/src/org/jetbrains/jet/j2k/ast/Constructor.java +++ b/src/org/jetbrains/jet/j2k/ast/Constructor.java @@ -9,7 +9,7 @@ import java.util.Set; * @author ignatov */ public class Constructor extends Function { - private boolean myIsPrimary; + private final boolean myIsPrimary; public Constructor(Identifier identifier, Set modifiers, Type type, List typeParameters, Element params, Block block, boolean isPrimary) { super(identifier, modifiers, type, typeParameters, params, block); diff --git a/src/org/jetbrains/jet/j2k/ast/DummyStringStatement.java b/src/org/jetbrains/jet/j2k/ast/DummyStringStatement.java index 161618aab16..f9084fc1c66 100644 --- a/src/org/jetbrains/jet/j2k/ast/DummyStringStatement.java +++ b/src/org/jetbrains/jet/j2k/ast/DummyStringStatement.java @@ -6,7 +6,7 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public class DummyStringStatement extends Statement { - private String myString; + private final String myString; public DummyStringStatement(String string) { myString = string; diff --git a/src/org/jetbrains/jet/j2k/ast/Element.java b/src/org/jetbrains/jet/j2k/ast/Element.java index 5675438b63b..0d2f640ea4d 100644 --- a/src/org/jetbrains/jet/j2k/ast/Element.java +++ b/src/org/jetbrains/jet/j2k/ast/Element.java @@ -6,7 +6,7 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public abstract class Element extends Node { - public static Element EMPTY_ELEMENT = new EmptyElement(); + public static final Element EMPTY_ELEMENT = new EmptyElement(); /** * @author ignatov diff --git a/src/org/jetbrains/jet/j2k/ast/Expression.java b/src/org/jetbrains/jet/j2k/ast/Expression.java index b557b85ad63..c5cc6f79413 100644 --- a/src/org/jetbrains/jet/j2k/ast/Expression.java +++ b/src/org/jetbrains/jet/j2k/ast/Expression.java @@ -24,7 +24,7 @@ public abstract class Expression extends Statement { } } - public boolean isNullable() { + boolean isNullable() { return false; } diff --git a/src/org/jetbrains/jet/j2k/ast/ExpressionList.java b/src/org/jetbrains/jet/j2k/ast/ExpressionList.java index dd9aaca0ce4..ae3c1358f58 100644 --- a/src/org/jetbrains/jet/j2k/ast/ExpressionList.java +++ b/src/org/jetbrains/jet/j2k/ast/ExpressionList.java @@ -13,7 +13,6 @@ public class ExpressionList extends Expression { public ExpressionList(List expressions, List types) { myExpressions = expressions; - List types1 = types; } public ExpressionList(List expressions) { diff --git a/src/org/jetbrains/jet/j2k/ast/INode.java b/src/org/jetbrains/jet/j2k/ast/INode.java index fb837412eb7..f3ea8ba8471 100644 --- a/src/org/jetbrains/jet/j2k/ast/INode.java +++ b/src/org/jetbrains/jet/j2k/ast/INode.java @@ -13,6 +13,6 @@ public interface INode { public Kind getKind(); public enum Kind { - UNDEFINED, TYPE, CONSTRUCTOR, BREAK, CONTINUE, VARARG, TRAIT, ASSINGNMENT_EXPRESSION, CALL_CHAIN, + UNDEFINED, TYPE, CONSTRUCTOR, BREAK, CONTINUE, VARARG, TRAIT, ASSIGNMENT_EXPRESSION, CALL_CHAIN, } } diff --git a/src/org/jetbrains/jet/j2k/ast/Identifier.java b/src/org/jetbrains/jet/j2k/ast/Identifier.java index 5f7be779b05..85b5ae1332f 100644 --- a/src/org/jetbrains/jet/j2k/ast/Identifier.java +++ b/src/org/jetbrains/jet/j2k/ast/Identifier.java @@ -6,7 +6,5 @@ package org.jetbrains.jet.j2k.ast; public interface Identifier extends INode { public static Identifier EMPTY_IDENTIFIER = new IdentifierImpl(""); - public String getName(); - public boolean isEmpty(); } diff --git a/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java b/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java index ea82c78f165..4fcfcd6ebb2 100644 --- a/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java +++ b/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java @@ -25,11 +25,6 @@ public class IdentifierImpl extends Expression implements Identifier { myIsNullable = isNullable; } - @Override - public String getName() { - return myName; - } - @Override public boolean isEmpty() { return myName.length() == 0; diff --git a/src/org/jetbrains/jet/j2k/ast/IsOperator.java b/src/org/jetbrains/jet/j2k/ast/IsOperator.java index 530cca26c1c..98c6c3abcac 100644 --- a/src/org/jetbrains/jet/j2k/ast/IsOperator.java +++ b/src/org/jetbrains/jet/j2k/ast/IsOperator.java @@ -6,8 +6,8 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public class IsOperator extends Expression { - private Expression myExpression; - private Element myTypeElement; + private final Expression myExpression; + private final Element myTypeElement; public IsOperator(Expression expression, Element typeElement) { myExpression = expression; diff --git a/src/org/jetbrains/jet/j2k/ast/LocalVariable.java b/src/org/jetbrains/jet/j2k/ast/LocalVariable.java index 69d3b23e17e..442930b66fd 100644 --- a/src/org/jetbrains/jet/j2k/ast/LocalVariable.java +++ b/src/org/jetbrains/jet/j2k/ast/LocalVariable.java @@ -9,7 +9,7 @@ import java.util.Set; */ public class LocalVariable extends Expression { private final Identifier myIdentifier; - private Set myModifiersSet; + private final Set myModifiersSet; private final Type myType; private final Expression myInitializer; diff --git a/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java b/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java index 78f65584a21..0a0aab62b7b 100644 --- a/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java @@ -8,7 +8,7 @@ import org.jetbrains.annotations.NotNull; public class MethodCallExpression extends Expression { private final Expression myMethodCall; private final Element myParamList; - private boolean myIsResultNullable; + private final boolean myIsResultNullable; public MethodCallExpression(Expression methodCall, Element paramList, boolean nullable) { myMethodCall = methodCall; diff --git a/src/org/jetbrains/jet/j2k/ast/PolyadicExpression.java b/src/org/jetbrains/jet/j2k/ast/PolyadicExpression.java index a1a8398af7c..f8d1abad90d 100644 --- a/src/org/jetbrains/jet/j2k/ast/PolyadicExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/PolyadicExpression.java @@ -9,8 +9,8 @@ import java.util.List; * @author ignatov */ public class PolyadicExpression extends Expression { - private List myExpressions; - private String myToken; + private final List myExpressions; + private final String myToken; public PolyadicExpression(List expressions, String token) { super(); diff --git a/src/org/jetbrains/jet/j2k/ast/SuperExpression.java b/src/org/jetbrains/jet/j2k/ast/SuperExpression.java index 556484f6f66..5793efb0e05 100644 --- a/src/org/jetbrains/jet/j2k/ast/SuperExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/SuperExpression.java @@ -6,7 +6,7 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public class SuperExpression extends Expression { - private Identifier myIdentifier; + private final Identifier myIdentifier; public SuperExpression(Identifier identifier) { myIdentifier = identifier; diff --git a/src/org/jetbrains/jet/j2k/ast/ThisExpression.java b/src/org/jetbrains/jet/j2k/ast/ThisExpression.java index 69e426ff602..e3bba0d5997 100644 --- a/src/org/jetbrains/jet/j2k/ast/ThisExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/ThisExpression.java @@ -6,7 +6,7 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public class ThisExpression extends Expression { - private Identifier myIdentifier; + private final Identifier myIdentifier; public ThisExpression(Identifier identifier) { myIdentifier = identifier; diff --git a/src/org/jetbrains/jet/j2k/ast/Type.java b/src/org/jetbrains/jet/j2k/ast/Type.java index ad16865772f..baf4c23f7ae 100644 --- a/src/org/jetbrains/jet/j2k/ast/Type.java +++ b/src/org/jetbrains/jet/j2k/ast/Type.java @@ -15,8 +15,8 @@ public abstract class Type extends Element { return Kind.TYPE; } - public void setNullable(boolean nullable) { - myNullable = nullable; + public void convertToNotNull() { + myNullable = false; } public boolean isNullable() { diff --git a/src/org/jetbrains/jet/j2k/ast/TypeElement.java b/src/org/jetbrains/jet/j2k/ast/TypeElement.java index 6e3cf2617ca..542b2781d2a 100644 --- a/src/org/jetbrains/jet/j2k/ast/TypeElement.java +++ b/src/org/jetbrains/jet/j2k/ast/TypeElement.java @@ -6,7 +6,7 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public class TypeElement extends Element { - private Type myType; + private final Type myType; public TypeElement(Type type) { myType = type; diff --git a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java index 0357cb802d1..47c3ad409b7 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java @@ -10,11 +10,10 @@ import static org.jetbrains.jet.j2k.Converter.*; /** * @author ignatov */ -public class ElementVisitor extends JavaElementVisitor implements Visitor { +public class ElementVisitor extends JavaElementVisitor { private Element myResult = Element.EMPTY_ELEMENT; @NotNull - @Override public Element getResult() { return myResult; } diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index c7a823f0849..71cc183c368 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -14,7 +14,7 @@ import static org.jetbrains.jet.j2k.Converter.*; /** * @author ignatov */ -public class ExpressionVisitor extends StatementVisitor implements Visitor { +public class ExpressionVisitor extends StatementVisitor { private Expression myResult = Expression.EMPTY_EXPRESSION; @NotNull diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index 07bee58c2c5..83ca3303634 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -13,7 +13,7 @@ import static org.jetbrains.jet.j2k.Converter.*; /** * @author ignatov */ -public class StatementVisitor extends ElementVisitor implements Visitor { +public class StatementVisitor extends ElementVisitor { private Statement myResult = Statement.EMPTY_STATEMENT; @NotNull diff --git a/src/org/jetbrains/jet/j2k/visitors/SuperVisitor.java b/src/org/jetbrains/jet/j2k/visitors/SuperVisitor.java index 27106702e96..16fcf409892 100644 --- a/src/org/jetbrains/jet/j2k/visitors/SuperVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/SuperVisitor.java @@ -9,7 +9,7 @@ import java.util.HashSet; * @author ignatov */ public class SuperVisitor extends JavaRecursiveElementVisitor { - private HashSet myResolvedSuperCallParameters; + private final HashSet myResolvedSuperCallParameters; public SuperVisitor() { myResolvedSuperCallParameters = new HashSet(); diff --git a/src/org/jetbrains/jet/j2k/visitors/ThisVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ThisVisitor.java index feea2f69e21..98fff4ecca2 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ThisVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ThisVisitor.java @@ -1,9 +1,6 @@ package org.jetbrains.jet.j2k.visitors; -import com.intellij.psi.JavaRecursiveElementVisitor; -import com.intellij.psi.PsiMethod; -import com.intellij.psi.PsiReference; -import com.intellij.psi.PsiReferenceExpression; +import com.intellij.psi.*; import org.jetbrains.annotations.Nullable; import java.util.HashSet; @@ -12,14 +9,16 @@ import java.util.HashSet; * @author ignatov */ public class ThisVisitor extends JavaRecursiveElementVisitor { - HashSet myResolvedConstructors = new HashSet(); + private final HashSet myResolvedConstructors = new HashSet(); @Override public void visitReferenceExpression(PsiReferenceExpression expression) { for (PsiReference r : expression.getReferences()) - if (r.getCanonicalText().equals("this")) - if (r.resolve() != null && r.resolve() instanceof PsiMethod && ((PsiMethod) r.resolve()).isConstructor()) - myResolvedConstructors.add((PsiMethod) r.resolve()); + if (r.getCanonicalText().equals("this")) { + final PsiElement res = r.resolve(); + if (res != null && res instanceof PsiMethod && ((PsiMethod) res).isConstructor()) + myResolvedConstructors.add((PsiMethod) res); + } } @Nullable diff --git a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java index b7878e33629..b930d833534 100644 --- a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java @@ -11,7 +11,7 @@ import static org.jetbrains.jet.j2k.Converter.typesToTypeList; /** * @author ignatov */ -public class TypeVisitor extends PsiTypeVisitor implements Visitor { +public class TypeVisitor extends PsiTypeVisitor { private Type myResult = Type.EMPTY_TYPE; @NotNull @@ -19,11 +19,6 @@ public class TypeVisitor extends PsiTypeVisitor implements Visitor { return myResult; } - @Override - public Type visitType(PsiType type) { - return super.visitType(type); - } - @Override public Type visitPrimitiveType(PsiPrimitiveType primitiveType) { final String name = primitiveType.getCanonicalText(); diff --git a/src/org/jetbrains/jet/j2k/visitors/Visitor.java b/src/org/jetbrains/jet/j2k/visitors/Visitor.java deleted file mode 100644 index 5888c1a4ca8..00000000000 --- a/src/org/jetbrains/jet/j2k/visitors/Visitor.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.jetbrains.jet.j2k.visitors; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.j2k.ast.Element; - -/** - * @author ignatov - */ -public interface Visitor { - @NotNull - Element getResult(); -} diff --git a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java index 51cb41ace6b..e391dc3bffc 100644 --- a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java +++ b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java @@ -20,8 +20,8 @@ import static org.jetbrains.jet.j2k.TestCaseBuilder.getTestDataPathBase; * @author ignatov */ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { - private String myDataPath; - private String myName; + private final String myDataPath; + private final String myName; public JavaToKotlinConverterTest(String dataPath, String name) { myDataPath = dataPath; @@ -51,18 +51,14 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { final File tmp = new File(kotlinPath + ".tmp"); if (!expected.equals(actual)) writeStringToFile(tmp, actual); - if (expected.equals(actual) && tmp.exists()) tmp.delete(); + if (expected.equals(actual) && tmp.exists()) //noinspection ResultOfMethodCallIgnored + tmp.delete(); Assert.assertEquals(expected, actual); } - @Override - protected void setUp() throws Exception { - super.setUp(); - } - @NotNull - protected String getTestFilePath() { + String getTestFilePath() { return myDataPath + File.separator + myName + ".jav"; } @@ -101,13 +97,13 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { } @NotNull - protected String fileToKotlin(String text) throws IOException { + String fileToKotlin(String text) throws IOException { configureFromText(text); return prettify(Converter.fileToFile((PsiJavaFile) myFile).toKotlin()); } @NotNull - protected String methodToKotlin(String text) throws IOException { + String methodToKotlin(String text) throws IOException { String result = fileToKotlin("final class C {" + text + "}") .replaceAll("class C\\(\\) \\{", ""); result = result.substring(0, result.lastIndexOf("}")); @@ -115,7 +111,7 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { } @NotNull - protected String statementToKotlin(String text) throws Exception { + String statementToKotlin(String text) throws Exception { String result = methodToKotlin("void main() {" + text + "}"); int pos = result.lastIndexOf("}"); result = result.substring(0, pos).replaceFirst("open fun main\\(\\) : Unit \\{", ""); @@ -123,7 +119,7 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { } @NotNull - protected String expressionToKotlin(String code) throws Exception { + String expressionToKotlin(String code) throws Exception { String result = statementToKotlin("Object o =" + code + "}"); result = result.replaceFirst("var o : Any\\? =", ""); return prettify(result); diff --git a/test/org/jetbrains/jet/j2k/TestCaseBuilder.java b/test/org/jetbrains/jet/j2k/TestCaseBuilder.java index ac4250359d0..9f8c012e29f 100644 --- a/test/org/jetbrains/jet/j2k/TestCaseBuilder.java +++ b/test/org/jetbrains/jet/j2k/TestCaseBuilder.java @@ -15,8 +15,8 @@ import java.util.List; /** * @author ignatov */ -public abstract class TestCaseBuilder { - private static FilenameFilter emptyFilter = new FilenameFilter() { +abstract class TestCaseBuilder { + private static final FilenameFilter emptyFilter = new FilenameFilter() { @Override public boolean accept(File file, String name) { return true; @@ -41,7 +41,7 @@ public abstract class TestCaseBuilder { } @NotNull - public static TestSuite suiteForDirectory(String baseDataDir, @NotNull final String dataPath, boolean recursive, final FilenameFilter filter, @NotNull NamedTestFactory factory) { + private static TestSuite suiteForDirectory(String baseDataDir, @NotNull final String dataPath, boolean recursive, final FilenameFilter filter, @NotNull NamedTestFactory factory) { TestSuite suite = new TestSuite(dataPath); final String extensionJava = ".jav"; From 9782fc700ff27da0d0ab73afdb383bce572fdeac Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 15 Nov 2011 16:40:06 +0400 Subject: [PATCH 098/206] AnyType.class expression supported --- .../j2k/ast/ClassObjectAccessExpression.java | 20 +++++++++++++++++++ .../jet/j2k/visitors/ExpressionVisitor.java | 1 + .../expression/objectClass.jav | 1 + .../classExpression/expression/objectClass.kt | 1 + .../expression/stringClass.jav | 1 + .../classExpression/expression/stringClass.kt | 1 + .../statement/complexExample.jav | 1 + .../statement/complexExample.kt | 1 + 8 files changed, 27 insertions(+) create mode 100644 src/org/jetbrains/jet/j2k/ast/ClassObjectAccessExpression.java create mode 100644 testData/ast/classExpression/expression/objectClass.jav create mode 100644 testData/ast/classExpression/expression/objectClass.kt create mode 100644 testData/ast/classExpression/expression/stringClass.jav create mode 100644 testData/ast/classExpression/expression/stringClass.kt create mode 100644 testData/ast/classExpression/statement/complexExample.jav create mode 100644 testData/ast/classExpression/statement/complexExample.kt diff --git a/src/org/jetbrains/jet/j2k/ast/ClassObjectAccessExpression.java b/src/org/jetbrains/jet/j2k/ast/ClassObjectAccessExpression.java new file mode 100644 index 00000000000..09cd85a5244 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/ClassObjectAccessExpression.java @@ -0,0 +1,20 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class ClassObjectAccessExpression extends Expression { + private Element myTypeElement; + + public ClassObjectAccessExpression(Element typeElement) { + myTypeElement = typeElement; + } + + @NotNull + @Override + public String toKotlin() { + return "getJavaClass" + "<" + myTypeElement.toKotlin() + ">"; + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 71cc183c368..695a427f1c8 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -123,6 +123,7 @@ public class ExpressionVisitor extends StatementVisitor { @Override public void visitClassObjectAccessExpression(PsiClassObjectAccessExpression expression) { super.visitClassObjectAccessExpression(expression); + myResult = new ClassObjectAccessExpression(elementToElement(expression.getOperand())); } @Override diff --git a/testData/ast/classExpression/expression/objectClass.jav b/testData/ast/classExpression/expression/objectClass.jav new file mode 100644 index 00000000000..b5c1a920fca --- /dev/null +++ b/testData/ast/classExpression/expression/objectClass.jav @@ -0,0 +1 @@ +Object.class \ No newline at end of file diff --git a/testData/ast/classExpression/expression/objectClass.kt b/testData/ast/classExpression/expression/objectClass.kt new file mode 100644 index 00000000000..4674988b0c1 --- /dev/null +++ b/testData/ast/classExpression/expression/objectClass.kt @@ -0,0 +1 @@ +getJavaClass \ No newline at end of file diff --git a/testData/ast/classExpression/expression/stringClass.jav b/testData/ast/classExpression/expression/stringClass.jav new file mode 100644 index 00000000000..025387a83e8 --- /dev/null +++ b/testData/ast/classExpression/expression/stringClass.jav @@ -0,0 +1 @@ +String.class \ No newline at end of file diff --git a/testData/ast/classExpression/expression/stringClass.kt b/testData/ast/classExpression/expression/stringClass.kt new file mode 100644 index 00000000000..894282ca52d --- /dev/null +++ b/testData/ast/classExpression/expression/stringClass.kt @@ -0,0 +1 @@ +getJavaClass \ No newline at end of file diff --git a/testData/ast/classExpression/statement/complexExample.jav b/testData/ast/classExpression/statement/complexExample.jav new file mode 100644 index 00000000000..a74d8698493 --- /dev/null +++ b/testData/ast/classExpression/statement/complexExample.jav @@ -0,0 +1 @@ +Class[] constrArgTypes = new Class[]{String[].class, String.class}; \ No newline at end of file diff --git a/testData/ast/classExpression/statement/complexExample.kt b/testData/ast/classExpression/statement/complexExample.kt new file mode 100644 index 00000000000..fcbc1c36ccd --- /dev/null +++ b/testData/ast/classExpression/statement/complexExample.kt @@ -0,0 +1 @@ +var constrArgTypes : Array?>? = array(getJavaClass?>, getJavaClass) \ No newline at end of file From d45e69b5386341932dfd8cd152f0278a1680f13c Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 15 Nov 2011 16:51:29 +0400 Subject: [PATCH 099/206] move isEmpty() from Expression to Element --- src/org/jetbrains/jet/j2k/ast/Element.java | 9 +++++++++ src/org/jetbrains/jet/j2k/ast/Expression.java | 4 ---- src/org/jetbrains/jet/j2k/ast/Field.java | 2 +- src/org/jetbrains/jet/j2k/ast/LocalVariable.java | 2 +- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/ast/Element.java b/src/org/jetbrains/jet/j2k/ast/Element.java index 0d2f640ea4d..16683fbdca3 100644 --- a/src/org/jetbrains/jet/j2k/ast/Element.java +++ b/src/org/jetbrains/jet/j2k/ast/Element.java @@ -8,6 +8,10 @@ import org.jetbrains.annotations.NotNull; public abstract class Element extends Node { public static final Element EMPTY_ELEMENT = new EmptyElement(); + public boolean isEmpty() { + return false; + } + /** * @author ignatov */ @@ -17,5 +21,10 @@ public abstract class Element extends Node { public String toKotlin() { return EMPTY; } + + @Override + public boolean isEmpty() { + return true; + } } } diff --git a/src/org/jetbrains/jet/j2k/ast/Expression.java b/src/org/jetbrains/jet/j2k/ast/Expression.java index c5cc6f79413..7b2528b6232 100644 --- a/src/org/jetbrains/jet/j2k/ast/Expression.java +++ b/src/org/jetbrains/jet/j2k/ast/Expression.java @@ -27,8 +27,4 @@ public abstract class Expression extends Statement { boolean isNullable() { return false; } - - public boolean isEmpty() { - return false; - } } diff --git a/src/org/jetbrains/jet/j2k/ast/Field.java b/src/org/jetbrains/jet/j2k/ast/Field.java index 02542a35ef9..897d25867e6 100644 --- a/src/org/jetbrains/jet/j2k/ast/Field.java +++ b/src/org/jetbrains/jet/j2k/ast/Field.java @@ -64,7 +64,7 @@ public class Field extends Member { public String toKotlin() { String modifier = modifiersToKotlin(); - if (myInitializer.toKotlin().isEmpty()) // TODO: remove + if (myInitializer.isEmpty()) return modifier + myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin(); return modifier + myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin() + SPACE + diff --git a/src/org/jetbrains/jet/j2k/ast/LocalVariable.java b/src/org/jetbrains/jet/j2k/ast/LocalVariable.java index 442930b66fd..0c561827a18 100644 --- a/src/org/jetbrains/jet/j2k/ast/LocalVariable.java +++ b/src/org/jetbrains/jet/j2k/ast/LocalVariable.java @@ -27,7 +27,7 @@ public class LocalVariable extends Expression { @NotNull @Override public String toKotlin() { - if (myInitializer.toKotlin().isEmpty()) // TODO: remove + if (myInitializer.isEmpty()) return myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin(); return myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin() + SPACE + From 58176f236125512bcad0c9cf8bbb68582e4a8d18 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 15 Nov 2011 16:51:43 +0400 Subject: [PATCH 100/206] remove TODO from ArrayType.toKotlin() --- src/org/jetbrains/jet/j2k/ast/ArrayType.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/ast/ArrayType.java b/src/org/jetbrains/jet/j2k/ast/ArrayType.java index 293d9037d6e..970535a327f 100644 --- a/src/org/jetbrains/jet/j2k/ast/ArrayType.java +++ b/src/org/jetbrains/jet/j2k/ast/ArrayType.java @@ -15,9 +15,8 @@ public class ArrayType extends Type { @NotNull @Override public String toKotlin() { - String nullable = isNullableStr(); if (PRIMITIVE_TYPES.contains(myType.toKotlin().toLowerCase())) - return myType.toKotlin() + "Array" + nullable; // TODO - return "Array" + "<" + myType.toKotlin() + ">" + nullable; + return myType.toKotlin() + "Array" + isNullableStr(); // returns IntArray, BooleanArray, etc. + return "Array" + "<" + myType.toKotlin() + ">" + isNullableStr(); } } From bbcf8be5bf34c73b493c9a8d956b4a23e07667d6 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 15 Nov 2011 18:13:25 +0400 Subject: [PATCH 101/206] working with package statement improved --- src/org/jetbrains/jet/j2k/Converter.java | 13 +++++++++---- .../packageStatement/file/orgJetbrainsJetJ2kIn.jav | 6 ++++++ .../packageStatement/file/orgJetbrainsJetJ2kIn.kt | 6 ++++++ 3 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.jav create mode 100644 testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.kt diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 807434d6055..1a3eff07c89 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -19,10 +19,15 @@ public class Converter { @NotNull public static File fileToFile(PsiJavaFile javaFile) { final PsiImportList importList = javaFile.getImportList(); - List imports = importList == null ? - new LinkedList() : - importsToImportList(importList.getAllImportStatements()); - return new File(javaFile.getPackageName(), imports, classesToClassList(javaFile.getClasses())); // TODO: use identifier + List imports = importList == null ? Collections.emptyList() : importsToImportList(importList.getAllImportStatements()); + return new File(getPackageName(javaFile.getPackageName()), imports, classesToClassList(javaFile.getClasses())); + } + + private static String getPackageName(String packageName) { + List result = new LinkedList(); + for (String part : packageName.split("\\.")) + result.add(new IdentifierImpl(part).toKotlin()); + return AstUtil.join(result, "."); } @NotNull diff --git a/testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.jav b/testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.jav new file mode 100644 index 00000000000..7b8f669aba1 --- /dev/null +++ b/testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.jav @@ -0,0 +1,6 @@ +package org.jetbrains.jet.j2k.in; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class Converter {} \ No newline at end of file diff --git a/testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.kt b/testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.kt new file mode 100644 index 00000000000..9700c7d464f --- /dev/null +++ b/testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.kt @@ -0,0 +1,6 @@ +namespace org.jetbrains.jet.j2k.`in` { +import org.jetbrains.annotations.NotNull +import org.jetbrains.annotations.Nullable +public open class Converter() { +} +} \ No newline at end of file From d0c8b104d56a37d071cc143cfa8836a98954695a Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 16 Nov 2011 12:57:13 +0400 Subject: [PATCH 102/206] working with import statements improved --- src/org/jetbrains/jet/j2k/Converter.java | 15 +++++---------- .../jet/j2k/visitors/StatementVisitor.java | 15 --------------- .../importStatement/file/importWithKeywords.jav | 5 +++++ .../importStatement/file/importWithKeywords.kt | 5 +++++ .../ast/importStatement/file/importWithStar.jav | 5 +++++ .../ast/importStatement/file/importWithStar.kt | 5 +++++ .../ast/importStatement/file/simpleImport.jav | 5 +++++ testData/ast/importStatement/file/simpleImport.kt | 5 +++++ 8 files changed, 35 insertions(+), 25 deletions(-) create mode 100644 testData/ast/importStatement/file/importWithKeywords.jav create mode 100644 testData/ast/importStatement/file/importWithKeywords.kt create mode 100644 testData/ast/importStatement/file/importWithStar.jav create mode 100644 testData/ast/importStatement/file/importWithStar.kt create mode 100644 testData/ast/importStatement/file/simpleImport.jav create mode 100644 testData/ast/importStatement/file/simpleImport.kt diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 1a3eff07c89..b90a54e969d 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -20,10 +20,10 @@ public class Converter { public static File fileToFile(PsiJavaFile javaFile) { final PsiImportList importList = javaFile.getImportList(); List imports = importList == null ? Collections.emptyList() : importsToImportList(importList.getAllImportStatements()); - return new File(getPackageName(javaFile.getPackageName()), imports, classesToClassList(javaFile.getClasses())); + return new File(quoteKeywords(javaFile.getPackageName()), imports, classesToClassList(javaFile.getClasses())); } - private static String getPackageName(String packageName) { + private static String quoteKeywords(String packageName) { List result = new LinkedList(); for (String part : packageName.split("\\.")) result.add(new IdentifierImpl(part).toKotlin()); @@ -388,14 +388,9 @@ public class Converter { } @NotNull - private static Import importToImport(PsiImportStatementBase t) { - if (t != null) { - final PsiJavaCodeReferenceElement reference = t.getImportReference(); - if (reference != null) { - return new Import(reference.getQualifiedName()); // TODO: use identifier - } - } - return new Import(""); + private static Import importToImport(PsiImportStatementBase i) { + final String text = i == null ? "" : quoteKeywords(i.getText().replace("import ", "").replace("static ", "").replace(";", "")); + return new Import(text); // TODO: import reference } @NotNull diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index 83ca3303634..a61f0fc7f37 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -116,11 +116,6 @@ public class StatementVisitor extends ElementVisitor { ); } - @Override - public void visitImportStatement(PsiImportStatement statement) { - super.visitImportStatement(statement); - } - @Override public void visitIfStatement(PsiIfStatement statement) { super.visitIfStatement(statement); @@ -131,11 +126,6 @@ public class StatementVisitor extends ElementVisitor { ); } - @Override - public void visitImportStaticStatement(PsiImportStaticStatement statement) { - super.visitImportStaticStatement(statement); - } - @Override public void visitLabeledStatement(PsiLabeledStatement statement) { super.visitLabeledStatement(statement); @@ -145,11 +135,6 @@ public class StatementVisitor extends ElementVisitor { ); } - @Override - public void visitPackageStatement(PsiPackageStatement statement) { - super.visitPackageStatement(statement); - } - @Override public void visitSwitchLabelStatement(PsiSwitchLabelStatement statement) { super.visitSwitchLabelStatement(statement); diff --git a/testData/ast/importStatement/file/importWithKeywords.jav b/testData/ast/importStatement/file/importWithKeywords.jav new file mode 100644 index 00000000000..f82ae0443b4 --- /dev/null +++ b/testData/ast/importStatement/file/importWithKeywords.jav @@ -0,0 +1,5 @@ +package test; + +import namespace.as.type.val.var.fun.is.in.object.when.trait.This; + +class Test {} diff --git a/testData/ast/importStatement/file/importWithKeywords.kt b/testData/ast/importStatement/file/importWithKeywords.kt new file mode 100644 index 00000000000..3720bbfeabc --- /dev/null +++ b/testData/ast/importStatement/file/importWithKeywords.kt @@ -0,0 +1,5 @@ +namespace test { +import `namespace`.`as`.`type`.`val`.`var`.`fun`.`is`.`in`.`object`.`when`.`trait`.`This` +open class Test() { +} +} \ No newline at end of file diff --git a/testData/ast/importStatement/file/importWithStar.jav b/testData/ast/importStatement/file/importWithStar.jav new file mode 100644 index 00000000000..abbec8d10d3 --- /dev/null +++ b/testData/ast/importStatement/file/importWithStar.jav @@ -0,0 +1,5 @@ +package org.jetbrains.jet.j2k; + +import org.jetbrains.annotations.*; + +public class Converter {} \ No newline at end of file diff --git a/testData/ast/importStatement/file/importWithStar.kt b/testData/ast/importStatement/file/importWithStar.kt new file mode 100644 index 00000000000..65cc2f10c67 --- /dev/null +++ b/testData/ast/importStatement/file/importWithStar.kt @@ -0,0 +1,5 @@ +namespace org.jetbrains.jet.j2k { +import org.jetbrains.annotations.* +public open class Converter() { +} +} \ No newline at end of file diff --git a/testData/ast/importStatement/file/simpleImport.jav b/testData/ast/importStatement/file/simpleImport.jav new file mode 100644 index 00000000000..a2daf0cd933 --- /dev/null +++ b/testData/ast/importStatement/file/simpleImport.jav @@ -0,0 +1,5 @@ +package org.jetbrains.jet.j2k; + +import org.jetbrains.annotations.NotNull; + +public class Converter {} \ No newline at end of file diff --git a/testData/ast/importStatement/file/simpleImport.kt b/testData/ast/importStatement/file/simpleImport.kt new file mode 100644 index 00000000000..0a97e34e764 --- /dev/null +++ b/testData/ast/importStatement/file/simpleImport.kt @@ -0,0 +1,5 @@ +namespace org.jetbrains.jet.j2k { +import org.jetbrains.annotations.NotNull +public open class Converter() { +} +} \ No newline at end of file From fb6ac8e4b6ea0df503405e23ae1cc3c8d058a34c Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 16 Nov 2011 13:19:43 +0400 Subject: [PATCH 103/206] Converter.isConstructorPrimary signature changed --- src/org/jetbrains/jet/j2k/Converter.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index b90a54e969d..b995b66a0d7 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -242,9 +242,7 @@ public class Converter { return tv.getPrimaryConstructor(); } - public static boolean isConstructorPrimary(@Nullable PsiMethod constructor) { - if (constructor == null) - return false; + public static boolean isConstructorPrimary(@NotNull PsiMethod constructor) { if (constructor.getParent() instanceof PsiClass) { final PsiClass parent = (PsiClass) constructor.getParent(); if (parent.getConstructors().length == 1) From 7d6513f49f3c527e92127805acb964d6a2562326 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 16 Nov 2011 13:23:18 +0400 Subject: [PATCH 104/206] added constructors for enums --- .../jetbrains/jet/j2k/ast/Constructor.java | 4 ---- src/org/jetbrains/jet/j2k/ast/Enum.java | 20 +++++-------------- .../enum/class/primaryPrivateConstructor.jav | 10 ++++++++++ .../enum/class/primaryPrivateConstructor.kt | 9 +++++++++ 4 files changed, 24 insertions(+), 19 deletions(-) create mode 100644 testData/ast/enum/class/primaryPrivateConstructor.jav create mode 100644 testData/ast/enum/class/primaryPrivateConstructor.kt diff --git a/src/org/jetbrains/jet/j2k/ast/Constructor.java b/src/org/jetbrains/jet/j2k/ast/Constructor.java index 827daa99b53..9fe6b498696 100644 --- a/src/org/jetbrains/jet/j2k/ast/Constructor.java +++ b/src/org/jetbrains/jet/j2k/ast/Constructor.java @@ -28,10 +28,6 @@ public class Constructor extends Function { return myIsPrimary; } - public String privatePrimaryToKotlin() { - return modifiersToKotlin() + "(" + myParams.toKotlin() + ")" + SPACE + myBlock.toKotlin(); - } - @NotNull @Override public Kind getKind() { diff --git a/src/org/jetbrains/jet/j2k/ast/Enum.java b/src/org/jetbrains/jet/j2k/ast/Enum.java index 1b16eda4613..f09b8a4a101 100644 --- a/src/org/jetbrains/jet/j2k/ast/Enum.java +++ b/src/org/jetbrains/jet/j2k/ast/Enum.java @@ -15,19 +15,9 @@ public class Enum extends Class { super(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, innerClasses, methods, fields); } - @Nullable - private Constructor getPrimaryConstructor() { - for (Function m : myMethods) - if (m.getKind() == Kind.CONSTRUCTOR) - return (Constructor) m; - return null; - } - - private String primaryConstructorToKotlin() { - Constructor maybeConstructor = getPrimaryConstructor(); - if (maybeConstructor != null) - return maybeConstructor.privatePrimaryToKotlin(); - return EMPTY; + String primaryConstructorSignatureToKotlin() { + String s = super.primaryConstructorSignatureToKotlin(); + return s.equals("()") ? EMPTY : s; } @Override @@ -38,11 +28,11 @@ public class Enum extends Class { @NotNull @Override public String toKotlin() { - return modifiersToKotlin() + "enum" + SPACE + myName.toKotlin() + typeParametersToKotlin() + implementTypesToKotlin() + SPACE + "{" + N + + return modifiersToKotlin() + "enum" + SPACE + myName.toKotlin() + primaryConstructorSignatureToKotlin() + typeParametersToKotlin() + implementTypesToKotlin() + SPACE + "{" + N + AstUtil.joinNodes(myFields, N) + N + - primaryConstructorToKotlin() + N + AstUtil.joinNodes(methodsExceptConstructors(), N) + N + AstUtil.joinNodes(myInnerClasses, N) + N + + primaryConstructorBodyToKotlin() + N + "}"; } } \ No newline at end of file diff --git a/testData/ast/enum/class/primaryPrivateConstructor.jav b/testData/ast/enum/class/primaryPrivateConstructor.jav new file mode 100644 index 00000000000..dee69b30e80 --- /dev/null +++ b/testData/ast/enum/class/primaryPrivateConstructor.jav @@ -0,0 +1,10 @@ +enum Color { + private int code; + + private Color(int c) { + code = c; + } + + public int getCode() { + return code; + } \ No newline at end of file diff --git a/testData/ast/enum/class/primaryPrivateConstructor.kt b/testData/ast/enum/class/primaryPrivateConstructor.kt new file mode 100644 index 00000000000..3fe8cd69ef3 --- /dev/null +++ b/testData/ast/enum/class/primaryPrivateConstructor.kt @@ -0,0 +1,9 @@ +enum Color(c : Int) { +private var code : Int +open public fun getCode() : Int { +return code +} +{ +$code = c +} +} \ No newline at end of file From 234f98b164097e1fb26fd16dae1a4d55642f6b4a Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 16 Nov 2011 13:24:15 +0400 Subject: [PATCH 105/206] private dictionary changed --- j2k.ipr | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/j2k.ipr b/j2k.ipr index 2a46e027d3d..52c8b1e6702 100644 --- a/j2k.ipr +++ b/j2k.ipr @@ -152,6 +152,14 @@ + + + + kotlin + nullable + + + From 532142d12a31386e5dbb34ebe68b237b558a8d2b Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 16 Nov 2011 17:14:43 +0400 Subject: [PATCH 106/206] now we trying to generify constructor only in case when we have two or more constructors in class --- src/org/jetbrains/jet/j2k/Converter.java | 2 +- .../ast/callChainExpression/file/libraryFieldCall.kt | 5 +---- .../callChainExpression/file/libraryStringFieldCall.kt | 5 +---- testData/ast/class/class/classWithMultiplyFields.kt | 6 +----- testData/ast/field/file/classChildExtendsBase.kt | 10 ++-------- testData/ast/field/file/internalField.kt | 5 +---- testData/ast/field/file/privateField.kt | 5 +---- testData/ast/field/file/protectedField.kt | 5 +---- testData/ast/field/file/publicField.kt | 5 +---- testData/ast/field/file/valWithInit.kt | 5 +---- testData/ast/field/file/varWithoutInit.kt | 5 +---- 11 files changed, 12 insertions(+), 46 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index b995b66a0d7..0b8c079de5f 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -101,7 +101,7 @@ public class Converter { ); // we create primary constructor from all non final fields and fields without initializers - if (!psiClass.isEnum() && !psiClass.isInterface() && getPrimaryConstructorForThisCase(psiClass) == null) { + if (!psiClass.isEnum() && !psiClass.isInterface() && psiClass.getConstructors().length > 1 && getPrimaryConstructorForThisCase(psiClass) == null) { final List finalOrWithEmptyInitializer = getFinalOrWithEmptyInitializer(fields); final Map initializers = new HashMap(); diff --git a/testData/ast/callChainExpression/file/libraryFieldCall.kt b/testData/ast/callChainExpression/file/libraryFieldCall.kt index e73fec3b331..868d83f109a 100644 --- a/testData/ast/callChainExpression/file/libraryFieldCall.kt +++ b/testData/ast/callChainExpression/file/libraryFieldCall.kt @@ -1,10 +1,7 @@ -open class Library(ourOut : PrintStream?) { +open class Library() { class object { val ourOut : PrintStream? } -{ -$ourOut = ourOut -} } open class User() { open fun main() : Unit { diff --git a/testData/ast/callChainExpression/file/libraryStringFieldCall.kt b/testData/ast/callChainExpression/file/libraryStringFieldCall.kt index f0b4a755514..bced464f750 100644 --- a/testData/ast/callChainExpression/file/libraryStringFieldCall.kt +++ b/testData/ast/callChainExpression/file/libraryStringFieldCall.kt @@ -1,8 +1,5 @@ -open class Library(myString : String?) { +open class Library() { public val myString : String? -{ -$myString = myString -} } open class User() { open fun main() : Unit { diff --git a/testData/ast/class/class/classWithMultiplyFields.kt b/testData/ast/class/class/classWithMultiplyFields.kt index 284615f1d67..03b2647a157 100644 --- a/testData/ast/class/class/classWithMultiplyFields.kt +++ b/testData/ast/class/class/classWithMultiplyFields.kt @@ -1,9 +1,5 @@ -class T(a : String?, b : String?) { +class T() { var a : String? var b : String? var c : String? = "abc" -{ -$a = a -$b = b -} } \ No newline at end of file diff --git a/testData/ast/field/file/classChildExtendsBase.kt b/testData/ast/field/file/classChildExtendsBase.kt index bbfb7fb7fb8..c262641b4ba 100644 --- a/testData/ast/field/file/classChildExtendsBase.kt +++ b/testData/ast/field/file/classChildExtendsBase.kt @@ -1,12 +1,6 @@ -open class Base(myFirst : String?) { +open class Base() { private var myFirst : String? -{ -$myFirst = myFirst } -} -open class Child(mySecond : String?) : Base() { +open class Child() : Base() { private var mySecond : String? -{ -$mySecond = mySecond -} } \ No newline at end of file diff --git a/testData/ast/field/file/internalField.kt b/testData/ast/field/file/internalField.kt index e1619fe519b..e09da17755a 100644 --- a/testData/ast/field/file/internalField.kt +++ b/testData/ast/field/file/internalField.kt @@ -1,6 +1,3 @@ -open class C(f : Foo?) { +open class C() { var f : Foo? -{ -$f = f -} } \ No newline at end of file diff --git a/testData/ast/field/file/privateField.kt b/testData/ast/field/file/privateField.kt index d86a453cada..2c742aff9e0 100644 --- a/testData/ast/field/file/privateField.kt +++ b/testData/ast/field/file/privateField.kt @@ -1,6 +1,3 @@ -open class C(f : Foo?) { +open class C() { private var f : Foo? -{ -$f = f -} } \ No newline at end of file diff --git a/testData/ast/field/file/protectedField.kt b/testData/ast/field/file/protectedField.kt index e874bfa3195..0e856b631cf 100644 --- a/testData/ast/field/file/protectedField.kt +++ b/testData/ast/field/file/protectedField.kt @@ -1,6 +1,3 @@ -open class C(f : Foo?) { +open class C() { protected var f : Foo? -{ -$f = f -} } \ No newline at end of file diff --git a/testData/ast/field/file/publicField.kt b/testData/ast/field/file/publicField.kt index 610d873990b..5767d6362dd 100644 --- a/testData/ast/field/file/publicField.kt +++ b/testData/ast/field/file/publicField.kt @@ -1,6 +1,3 @@ -open class C(f : Foo?) { +open class C() { public var f : Foo? -{ -$f = f -} } \ No newline at end of file diff --git a/testData/ast/field/file/valWithInit.kt b/testData/ast/field/file/valWithInit.kt index 94b58759762..f3c93b7ce6d 100644 --- a/testData/ast/field/file/valWithInit.kt +++ b/testData/ast/field/file/valWithInit.kt @@ -1,6 +1,3 @@ -open class C(f : Foo?) { +open class C() { val f : Foo? = Foo(1, 2) -{ -$f = f -} } \ No newline at end of file diff --git a/testData/ast/field/file/varWithoutInit.kt b/testData/ast/field/file/varWithoutInit.kt index e1619fe519b..e09da17755a 100644 --- a/testData/ast/field/file/varWithoutInit.kt +++ b/testData/ast/field/file/varWithoutInit.kt @@ -1,6 +1,3 @@ -open class C(f : Foo?) { +open class C() { var f : Foo? -{ -$f = f -} } \ No newline at end of file From 947a5bf5d876203dea08b6912548f2f1e0b3e6c9 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 16 Nov 2011 18:10:44 +0400 Subject: [PATCH 107/206] class initializers supported --- src/org/jetbrains/jet/j2k/Converter.java | 25 ++++++++++++++++--- .../jetbrains/jet/j2k/ast/AnonymousClass.java | 5 ++-- src/org/jetbrains/jet/j2k/ast/Class.java | 9 +++++-- src/org/jetbrains/jet/j2k/ast/Enum.java | 5 ++-- .../jetbrains/jet/j2k/ast/Initializer.java | 23 +++++++++++++++++ src/org/jetbrains/jet/j2k/ast/Trait.java | 4 +-- .../ast/anonymousBlock/file/oneAnonBlock.jav | 6 +++++ .../ast/anonymousBlock/file/oneAnonBlock.kt | 6 +++++ .../file/oneStaticAnonBlock.jav | 6 +++++ .../anonymousBlock/file/oneStaticAnonBlock.kt | 8 ++++++ 10 files changed, 84 insertions(+), 13 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/Initializer.java create mode 100644 testData/ast/anonymousBlock/file/oneAnonBlock.jav create mode 100644 testData/ast/anonymousBlock/file/oneAnonBlock.kt create mode 100644 testData/ast/anonymousBlock/file/oneStaticAnonBlock.jav create mode 100644 testData/ast/anonymousBlock/file/oneStaticAnonBlock.kt diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 0b8c079de5f..27bb01f3681 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -42,7 +42,8 @@ public class Converter { return new AnonymousClass( classesToClassList(anonymousClass.getAllInnerClasses()), methodsToFunctionList(anonymousClass.getMethods()), - fieldsToFieldList(anonymousClass.getAllFields()) + fieldsToFieldList(anonymousClass.getAllFields()), + initializersToInitializerList(anonymousClass.getInitializers()) ); } @@ -83,6 +84,7 @@ public class Converter { final List innerClasses = classesToClassList(psiClass.getAllInnerClasses()); final List methods = methodsToFunctionList(psiClass.getMethods()); final List fields = fieldsToFieldList(psiClass.getFields()); + final List anonymousInitializers = initializersToInitializerList(psiClass.getInitializers()); final List typeParameters = elementsToElementList(psiClass.getTypeParameters()); final List implementsTypes = typesToNotNullableTypeList(psiClass.getImplementsListTypes()); final List extendsTypes = typesToNotNullableTypeList(psiClass.getExtendsListTypes()); @@ -161,11 +163,26 @@ public class Converter { } if (psiClass.isInterface()) - return new Trait(name, modifiers, typeParameters, extendsTypes, Collections.emptyList(), implementsTypes, innerClasses, methods, fields); + return new Trait(name, modifiers, typeParameters, extendsTypes, Collections.emptyList(), implementsTypes, innerClasses, methods, fields, anonymousInitializers); if (psiClass.isEnum()) return new Enum(name, modifiers, typeParameters, Collections.emptyList(), Collections.emptyList(), implementsTypes, - innerClasses, methods, fieldsToFieldListForEnums(psiClass.getAllFields())); - return new Class(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, innerClasses, methods, fields); + innerClasses, methods, fieldsToFieldListForEnums(psiClass.getAllFields()), anonymousInitializers); + return new Class(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, innerClasses, methods, fields, anonymousInitializers); + } + + @NotNull + private static List initializersToInitializerList(PsiClassInitializer[] initializers) { + List result = new LinkedList(); + for (PsiClassInitializer i : initializers) result.add(initializerToInitializer(i)); + return result; + } + + @NotNull + private static Initializer initializerToInitializer(PsiClassInitializer i) { + return new Initializer( + blockToBlock(i.getBody(), true), + modifiersListToModifiersSet(i.getModifierList()) + ); } private static String getDefaultInitializer(Field f) { diff --git a/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java b/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java index 66bc42d0340..45fd78b622b 100644 --- a/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java +++ b/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java @@ -9,7 +9,7 @@ import java.util.List; * @author ignatov */ public class AnonymousClass extends Class { - public AnonymousClass(List innerClasses, List methods, List fields) { + public AnonymousClass(List innerClasses, List methods, List fields, List initializers) { super(new IdentifierImpl("anonClass"), Collections.emptySet(), Collections.emptyList(), @@ -18,7 +18,8 @@ public class AnonymousClass extends Class { Collections.emptyList(), innerClasses, methods, - fields); + fields, + initializers); } @NotNull diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java index f16e94522fd..519b20bdf80 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -18,6 +18,7 @@ public class Class extends Member { String TYPE = "class"; final Identifier myName; private final List myBaseClassParams; + private List myInitializers; private final List myTypeParameters; private final List myExtendsTypes; private final List myImplementsTypes; @@ -26,7 +27,7 @@ public class Class extends Member { final List myFields; public Class(Identifier name, Set modifiers, List typeParameters, List extendsTypes, - List baseClassParams, List implementsTypes, List innerClasses, List methods, List fields) { + List baseClassParams, List implementsTypes, List innerClasses, List methods, List fields, List initializers) { myName = name; myBaseClassParams = baseClassParams; myModifiers = modifiers; @@ -36,6 +37,7 @@ public class Class extends Member { myInnerClasses = innerClasses; myMethods = methods; myFields = fields; + myInitializers = initializers; } @Nullable @@ -163,6 +165,7 @@ public class Class extends Member { String bodyToKotlin() { return SPACE + "{" + N + AstUtil.joinNodes(getNonStatic(myFields), N) + N + + AstUtil.joinNodes(getNonStatic(myInitializers), N) + N + classObjectToKotlin() + N + AstUtil.joinNodes(getNonStatic(methodsExceptConstructors()), N) + N + AstUtil.joinNodes(getNonStatic(myInnerClasses), N) + N + @@ -190,10 +193,12 @@ public class Class extends Member { final List staticMethods = new LinkedList(secondaryConstructorsAsStaticInitFunction()); staticMethods.addAll(getStatic(methodsExceptConstructors())); final List staticFields = getStatic(myFields); + final List staticInitializers = getStatic(myInitializers); final List staticInnerClasses = getStatic(myInnerClasses); - if (staticFields.size() + staticMethods.size() + staticInnerClasses.size() > 0) { + if (staticFields.size() + staticMethods.size() + staticInnerClasses.size() + staticInitializers.size() > 0) { return "class" + SPACE + "object" + SPACE + "{" + N + AstUtil.joinNodes(staticFields, N) + N + + AstUtil.joinNodes(staticInitializers, N) + N + AstUtil.joinNodes(staticMethods, N) + N + AstUtil.joinNodes(staticInnerClasses, N) + N + "}"; diff --git a/src/org/jetbrains/jet/j2k/ast/Enum.java b/src/org/jetbrains/jet/j2k/ast/Enum.java index f09b8a4a101..d781e944196 100644 --- a/src/org/jetbrains/jet/j2k/ast/Enum.java +++ b/src/org/jetbrains/jet/j2k/ast/Enum.java @@ -1,7 +1,6 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.j2k.util.AstUtil; import java.util.List; @@ -11,8 +10,8 @@ import java.util.Set; * @author ignatov */ public class Enum extends Class { - public Enum(Identifier name, Set modifiers, List typeParameters, List extendsTypes, List baseClassParams, List implementsTypes, List innerClasses, List methods, List fields) { - super(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, innerClasses, methods, fields); + public Enum(Identifier name, Set modifiers, List typeParameters, List extendsTypes, List baseClassParams, List implementsTypes, List innerClasses, List methods, List fields, List initializers) { + super(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, innerClasses, methods, fields, initializers); } String primaryConstructorSignatureToKotlin() { diff --git a/src/org/jetbrains/jet/j2k/ast/Initializer.java b/src/org/jetbrains/jet/j2k/ast/Initializer.java new file mode 100644 index 00000000000..ef590c25f83 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/Initializer.java @@ -0,0 +1,23 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +import java.util.Set; + +/** + * @author ignatov + */ +public class Initializer extends Member { + private Block myBlock; + + public Initializer(Block block, Set modifiers) { + myBlock = block; + myModifiers = modifiers; + } + + @NotNull + @Override + public String toKotlin() { + return myBlock.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/Trait.java b/src/org/jetbrains/jet/j2k/ast/Trait.java index efc17f38466..8f39b8d9193 100644 --- a/src/org/jetbrains/jet/j2k/ast/Trait.java +++ b/src/org/jetbrains/jet/j2k/ast/Trait.java @@ -7,8 +7,8 @@ import java.util.Set; * @author ignatov */ public class Trait extends Class { - public Trait(Identifier name, Set modifiers, List typeParameters, List extendsTypes, List baseClassParams, List implementsTypes, List innerClasses, List methods, List fields) { - super(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, innerClasses, methods, fields); + public Trait(Identifier name, Set modifiers, List typeParameters, List extendsTypes, List baseClassParams, List implementsTypes, List innerClasses, List methods, List fields, List initializers) { + super(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, innerClasses, methods, fields, initializers); TYPE = "trait"; } diff --git a/testData/ast/anonymousBlock/file/oneAnonBlock.jav b/testData/ast/anonymousBlock/file/oneAnonBlock.jav new file mode 100644 index 00000000000..fba735a5ff0 --- /dev/null +++ b/testData/ast/anonymousBlock/file/oneAnonBlock.jav @@ -0,0 +1,6 @@ +class Test { + String str; + { + str = "Ola"; + } +} \ No newline at end of file diff --git a/testData/ast/anonymousBlock/file/oneAnonBlock.kt b/testData/ast/anonymousBlock/file/oneAnonBlock.kt new file mode 100644 index 00000000000..01212e6bfa9 --- /dev/null +++ b/testData/ast/anonymousBlock/file/oneAnonBlock.kt @@ -0,0 +1,6 @@ +open class Test() { +var str : String? +{ +str = "Ola" +} +} \ No newline at end of file diff --git a/testData/ast/anonymousBlock/file/oneStaticAnonBlock.jav b/testData/ast/anonymousBlock/file/oneStaticAnonBlock.jav new file mode 100644 index 00000000000..c86774f1642 --- /dev/null +++ b/testData/ast/anonymousBlock/file/oneStaticAnonBlock.jav @@ -0,0 +1,6 @@ +class Test { + String str; + static { + str = "Ola"; + } +} \ No newline at end of file diff --git a/testData/ast/anonymousBlock/file/oneStaticAnonBlock.kt b/testData/ast/anonymousBlock/file/oneStaticAnonBlock.kt new file mode 100644 index 00000000000..db002ff151b --- /dev/null +++ b/testData/ast/anonymousBlock/file/oneStaticAnonBlock.kt @@ -0,0 +1,8 @@ +open class Test() { +var str : String? +class object { +{ +str = "Ola" +} +} +} \ No newline at end of file From 60f7226bd5577a73621becaafa336d510650467c Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 16 Nov 2011 18:21:10 +0400 Subject: [PATCH 108/206] use PsiImportStatementBase.isOnDemand inside importToImport method --- src/org/jetbrains/jet/j2k/Converter.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 27bb01f3681..02ddc71a6f7 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -173,7 +173,7 @@ public class Converter { @NotNull private static List initializersToInitializerList(PsiClassInitializer[] initializers) { List result = new LinkedList(); - for (PsiClassInitializer i : initializers) result.add(initializerToInitializer(i)); + for (PsiClassInitializer i : initializers) result.add(initializerToInitializer(i)); return result; } @@ -403,9 +403,11 @@ public class Converter { } @NotNull - private static Import importToImport(PsiImportStatementBase i) { - final String text = i == null ? "" : quoteKeywords(i.getText().replace("import ", "").replace("static ", "").replace(";", "")); - return new Import(text); // TODO: import reference + private static Import importToImport(@NotNull PsiImportStatementBase i) { // TODO: import reference + final PsiJavaCodeReferenceElement reference = i.getImportReference(); + if (reference != null) + return new Import(quoteKeywords(reference.getQualifiedName()) + (i.isOnDemand() ? ".*" : "")); + return new Import(""); // TODO: remove } @NotNull From 773bc1ced2c53770fd8db93db0719841d1e4b037 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 16 Nov 2011 18:42:20 +0400 Subject: [PATCH 109/206] cleanup --- src/org/jetbrains/jet/j2k/Converter.java | 67 +++++++++++-------- src/org/jetbrains/jet/j2k/ast/Class.java | 4 +- .../j2k/ast/ClassObjectAccessExpression.java | 2 +- .../jetbrains/jet/j2k/ast/Initializer.java | 2 +- .../jet/j2k/visitors/ExpressionVisitor.java | 5 +- 5 files changed, 46 insertions(+), 34 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 02ddc71a6f7..36ea5c9313e 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -17,13 +17,14 @@ import java.util.*; */ public class Converter { @NotNull - public static File fileToFile(PsiJavaFile javaFile) { + public static File fileToFile(@NotNull PsiJavaFile javaFile) { final PsiImportList importList = javaFile.getImportList(); List imports = importList == null ? Collections.emptyList() : importsToImportList(importList.getAllImportStatements()); return new File(quoteKeywords(javaFile.getPackageName()), imports, classesToClassList(javaFile.getClasses())); } - private static String quoteKeywords(String packageName) { + @NotNull + private static String quoteKeywords(@NotNull String packageName) { List result = new LinkedList(); for (String part : packageName.split("\\.")) result.add(new IdentifierImpl(part).toKotlin()); @@ -31,13 +32,14 @@ public class Converter { } @NotNull - private static List classesToClassList(PsiClass[] classes) { + private static List classesToClassList(@NotNull PsiClass[] classes) { List result = new LinkedList(); for (PsiClass t : classes) result.add(classToClass(t)); return result; } - public static AnonymousClass anonymousClassToAnonymousClass(PsiAnonymousClass anonymousClass) { + @NotNull + public static AnonymousClass anonymousClassToAnonymousClass(@NotNull PsiAnonymousClass anonymousClass) { // TODO: replace by Block, use class.getChild() method return new AnonymousClass( classesToClassList(anonymousClass.getAllInnerClasses()), @@ -47,7 +49,8 @@ public class Converter { ); } - private static List getFinalOrWithEmptyInitializer(List fields) { + @NotNull + private static List getFinalOrWithEmptyInitializer(@NotNull List fields) { List result = new LinkedList(); for (Field f : fields) if (f.isFinal() || f.getInitializer().toKotlin().isEmpty()) @@ -55,13 +58,15 @@ public class Converter { return result; } - private static List createParametersFromFields(List fields) { + @NotNull + private static List createParametersFromFields(@NotNull List fields) { List result = new LinkedList(); for (Field f : fields) result.add(new Parameter(f.getIdentifier(), f.getType())); return result; } - private static List createInitStatementsFromFields(List fields) { + @NotNull + private static List createInitStatementsFromFields(@NotNull List fields) { List result = new LinkedList(); for (Field f : fields) { final String identifierToKotlin = f.getIdentifier().toKotlin(); @@ -70,7 +75,8 @@ public class Converter { return result; } - private static String createPrimaryConstructorInvocation(String s, List fields, Map initializers) { + @NotNull + private static String createPrimaryConstructorInvocation(@NotNull String s, @NotNull List fields, @NotNull Map initializers) { List result = new LinkedList(); for (Field f : fields) { final String id = f.getIdentifier().toKotlin(); @@ -79,7 +85,8 @@ public class Converter { return s + "(" + AstUtil.join(result, ", ") + ")"; } - private static Class classToClass(PsiClass psiClass) { + @NotNull + private static Class classToClass(@NotNull PsiClass psiClass) { final Set modifiers = modifiersListToModifiersSet(psiClass.getModifierList()); final List innerClasses = classesToClassList(psiClass.getAllInnerClasses()); final List methods = methodsToFunctionList(psiClass.getMethods()); @@ -171,7 +178,7 @@ public class Converter { } @NotNull - private static List initializersToInitializerList(PsiClassInitializer[] initializers) { + private static List initializersToInitializerList(@NotNull PsiClassInitializer[] initializers) { List result = new LinkedList(); for (PsiClassInitializer i : initializers) result.add(initializerToInitializer(i)); return result; @@ -185,7 +192,8 @@ public class Converter { ); } - private static String getDefaultInitializer(Field f) { + @NotNull + private static String getDefaultInitializer(@NotNull Field f) { if (f.getType().isNullable()) return "null"; else { @@ -202,7 +210,8 @@ public class Converter { // private int ordinal() { ... } // private String name() { ... } // those methods any enum class inherits from java.lang.Enum - private static List fieldsToFieldListForEnums(PsiField[] fields) { + @NotNull + private static List fieldsToFieldListForEnums(@NotNull PsiField[] fields) { List result = new LinkedList(); for (PsiField f : fields) { if ((f.getName().equals("ordinal") @@ -222,13 +231,15 @@ public class Converter { return result; } - private static List fieldsToFieldList(PsiField[] fields) { + @NotNull + private static List fieldsToFieldList(@NotNull PsiField[] fields) { List result = new LinkedList(); for (PsiField f : fields) result.add(fieldToField(f)); return result; } - private static Field fieldToField(PsiField field) { + @NotNull + private static Field fieldToField(@NotNull PsiField field) { Set modifiers = modifiersListToModifiersSet(field.getModifierList()); if (field instanceof PsiEnumConstant) // TODO: remove instanceof return new EnumConstant( @@ -246,14 +257,14 @@ public class Converter { } @NotNull - private static List methodsToFunctionList(PsiMethod[] methods) { + private static List methodsToFunctionList(@NotNull PsiMethod[] methods) { List result = new LinkedList(); for (PsiMethod t : methods) result.add(methodToFunction(t, true)); return result; } @Nullable - private static PsiMethod getPrimaryConstructorForThisCase(PsiClass psiClass) { + private static PsiMethod getPrimaryConstructorForThisCase(@NotNull PsiClass psiClass) { ThisVisitor tv = new ThisVisitor(); psiClass.accept(tv); return tv.getPrimaryConstructor(); @@ -273,7 +284,8 @@ public class Converter { return false; } - private static List removeEmpty(List statements) { + @NotNull + private static List removeEmpty(@NotNull List statements) { List result = new LinkedList(); for (Statement s : statements) if (s != Statement.EMPTY_STATEMENT && s != Expression.EMPTY_EXPRESSION) @@ -282,7 +294,7 @@ public class Converter { } @NotNull - private static Function methodToFunction(PsiMethod method, boolean notEmpty) { + private static Function methodToFunction(@NotNull PsiMethod method, boolean notEmpty) { final IdentifierImpl identifier = new IdentifierImpl(method.getName()); final Type type = typeToType(method.getReturnType()); final Block body = blockToBlock(method.getBody(), notEmpty); @@ -329,7 +341,7 @@ public class Converter { } @NotNull - public static List statementsToStatementList(PsiStatement[] statements) { + public static List statementsToStatementList(@NotNull PsiStatement[] statements) { List result = new LinkedList(); for (PsiStatement t : statements) result.add(statementToStatement(t)); return result; @@ -344,7 +356,7 @@ public class Converter { } @NotNull - public static List expressionsToExpressionList(PsiExpression[] expressions) { + public static List expressionsToExpressionList(@NotNull PsiExpression[] expressions) { List result = new LinkedList(); for (PsiExpression e : expressions) result.add(expressionToExpression(e)); return result; @@ -359,7 +371,7 @@ public class Converter { } @NotNull - public static Element elementToElement(PsiElement e) { + public static Element elementToElement(@Nullable PsiElement e) { if (e == null) return Element.EMPTY_ELEMENT; final ElementVisitor elementVisitor = new ElementVisitor(); e.accept(elementVisitor); @@ -367,7 +379,7 @@ public class Converter { } @NotNull - public static List elementsToElementList(PsiElement[] elements) { + public static List elementsToElementList(@NotNull PsiElement[] elements) { List result = new LinkedList(); for (PsiElement e : elements) result.add(elementToElement(e)); return result; @@ -382,21 +394,21 @@ public class Converter { } @NotNull - public static List typesToTypeList(PsiType[] types) { + public static List typesToTypeList(@NotNull PsiType[] types) { List result = new LinkedList(); for (PsiType t : types) result.add(typeToType(t)); return result; } @NotNull - private static List typesToNotNullableTypeList(PsiType[] types) { + private static List typesToNotNullableTypeList(@NotNull PsiType[] types) { List result = new LinkedList(typesToTypeList(types)); for (Type p : result) p.convertToNotNull(); return result; } @NotNull - private static List importsToImportList(PsiImportStatementBase[] imports) { + private static List importsToImportList(@NotNull PsiImportStatementBase[] imports) { List result = new LinkedList(); for (PsiImportStatementBase t : imports) result.add(importToImport(t)); return result; @@ -411,14 +423,14 @@ public class Converter { } @NotNull - public static List parametersToParameterList(PsiParameter[] parameters) { + public static List parametersToParameterList(@NotNull PsiParameter[] parameters) { List result = new LinkedList(); for (PsiParameter t : parameters) result.add(parameterToParameter(t)); return result; } @NotNull - public static Parameter parameterToParameter(PsiParameter parameter) { + public static Parameter parameterToParameter(@NotNull PsiParameter parameter) { return new Parameter( new IdentifierImpl(parameter.getName()), // TODO: remove typeToType(parameter.getType()) @@ -431,6 +443,7 @@ public class Converter { return new IdentifierImpl(identifier.getText()); } + @NotNull public static Set modifiersListToModifiersSet(PsiModifierList modifierList) { HashSet modifiersSet = new HashSet(); if (modifierList != null) { diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java index 519b20bdf80..37fa884aa57 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -18,12 +18,12 @@ public class Class extends Member { String TYPE = "class"; final Identifier myName; private final List myBaseClassParams; - private List myInitializers; + private final List myInitializers; private final List myTypeParameters; private final List myExtendsTypes; private final List myImplementsTypes; final List myInnerClasses; - final List myMethods; + private final List myMethods; final List myFields; public Class(Identifier name, Set modifiers, List typeParameters, List extendsTypes, diff --git a/src/org/jetbrains/jet/j2k/ast/ClassObjectAccessExpression.java b/src/org/jetbrains/jet/j2k/ast/ClassObjectAccessExpression.java index 09cd85a5244..b16fedbf19e 100644 --- a/src/org/jetbrains/jet/j2k/ast/ClassObjectAccessExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/ClassObjectAccessExpression.java @@ -6,7 +6,7 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public class ClassObjectAccessExpression extends Expression { - private Element myTypeElement; + private final Element myTypeElement; public ClassObjectAccessExpression(Element typeElement) { myTypeElement = typeElement; diff --git a/src/org/jetbrains/jet/j2k/ast/Initializer.java b/src/org/jetbrains/jet/j2k/ast/Initializer.java index ef590c25f83..d49dc13c1e2 100644 --- a/src/org/jetbrains/jet/j2k/ast/Initializer.java +++ b/src/org/jetbrains/jet/j2k/ast/Initializer.java @@ -8,7 +8,7 @@ import java.util.Set; * @author ignatov */ public class Initializer extends Member { - private Block myBlock; + private final Block myBlock; public Initializer(Block block, Set modifiers) { myBlock = block; diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 695a427f1c8..ce4aaa63c50 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -194,12 +194,11 @@ public class ExpressionVisitor extends StatementVisitor { new ExpressionList(callExpression) ); } else { // new Class(): common case + final PsiAnonymousClass anonymousClass = expression.getAnonymousClass(); myResult = new NewClassExpression( elementToElement(expression.getClassOrAnonymousClassReference()), elementToElement(expression.getArgumentList()), - expression.getAnonymousClass() != null ? - anonymousClassToAnonymousClass(expression.getAnonymousClass()) : - null + anonymousClass != null ? anonymousClassToAnonymousClass(anonymousClass) : null ); // is constructor secondary final PsiMethod constructor = expression.resolveMethod(); From 62bfb55973a159c92468e438a2c7f94053203229 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 17 Nov 2011 12:54:37 +0400 Subject: [PATCH 110/206] now we use members instead of bunch inner classes, fields and methods --- src/org/jetbrains/jet/j2k/Converter.java | 138 +++++++----------- .../jetbrains/jet/j2k/ast/AnonymousClass.java | 8 +- src/org/jetbrains/jet/j2k/ast/Class.java | 49 +++---- src/org/jetbrains/jet/j2k/ast/Enum.java | 14 +- src/org/jetbrains/jet/j2k/ast/Trait.java | 5 +- .../class/class/oneStaticFieldOneNonStatic.kt | 6 +- .../class/oneStaticMethodOneNonStatic.kt | 6 +- testData/ast/constructors/file/identifier.kt | 6 +- 8 files changed, 93 insertions(+), 139 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 36ea5c9313e..0cd3dbf7dcb 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -40,13 +40,19 @@ public class Converter { @NotNull public static AnonymousClass anonymousClassToAnonymousClass(@NotNull PsiAnonymousClass anonymousClass) { - // TODO: replace by Block, use class.getChild() method - return new AnonymousClass( - classesToClassList(anonymousClass.getAllInnerClasses()), - methodsToFunctionList(anonymousClass.getMethods()), - fieldsToFieldList(anonymousClass.getAllFields()), - initializersToInitializerList(anonymousClass.getInitializers()) - ); + return new AnonymousClass(getMembers(anonymousClass)); + } + + private static List getMembers(PsiClass psiClass) { + List members = new LinkedList(); + for (PsiElement e : psiClass.getChildren()) { + if (e instanceof PsiMethod) members.add(methodToFunction((PsiMethod) e, true)); + else if (e instanceof PsiField) members.add(fieldToField((PsiField) e)); + else if (e instanceof PsiClass) members.add(classToClass((PsiClass) e)); + else if (e instanceof PsiClassInitializer) members.add(initializerToInitializer((PsiClassInitializer) e)); + else if (e instanceof PsiMember) System.out.println(e.getClass() + " " + e.getText()); + } + return members; } @NotNull @@ -88,16 +94,15 @@ public class Converter { @NotNull private static Class classToClass(@NotNull PsiClass psiClass) { final Set modifiers = modifiersListToModifiersSet(psiClass.getModifierList()); - final List innerClasses = classesToClassList(psiClass.getAllInnerClasses()); - final List methods = methodsToFunctionList(psiClass.getMethods()); final List fields = fieldsToFieldList(psiClass.getFields()); - final List anonymousInitializers = initializersToInitializerList(psiClass.getInitializers()); final List typeParameters = elementsToElementList(psiClass.getTypeParameters()); final List implementsTypes = typesToNotNullableTypeList(psiClass.getImplementsListTypes()); final List extendsTypes = typesToNotNullableTypeList(psiClass.getExtendsListTypes()); final IdentifierImpl name = new IdentifierImpl(psiClass.getName()); final List baseClassParams = new LinkedList(); + List members = getMembers(psiClass); + // we try to find super() call and generate class declaration like that: class A(name: String, i : Int) : Base(name) final SuperVisitor visitor = new SuperVisitor(); psiClass.accept(visitor); @@ -114,49 +119,52 @@ public class Converter { final List finalOrWithEmptyInitializer = getFinalOrWithEmptyInitializer(fields); final Map initializers = new HashMap(); - for (final Function f : methods) { - for (Field fo : finalOrWithEmptyInitializer) { - String init = getDefaultInitializer(fo); - initializers.put(fo.getIdentifier().toKotlin(), init); - } - + for (final Member m : members) { // and modify secondaries - if (f.getKind() == INode.Kind.CONSTRUCTOR && !((Constructor) f).isPrimary()) { - final List newStatements = new LinkedList(); + if (m.getKind() == INode.Kind.CONSTRUCTOR) { + Function f = (Function)m; + if (!((Constructor) f).isPrimary()) { + for (Field fo : finalOrWithEmptyInitializer) { + String init = getDefaultInitializer(fo); + initializers.put(fo.getIdentifier().toKotlin(), init); + } - for (Statement s : f.getBlock().getStatements()) { - boolean isRemoved = false; + final List newStatements = new LinkedList(); - if (s.getKind() == INode.Kind.ASSIGNMENT_EXPRESSION) { - final AssignmentExpression assignmentExpression = (AssignmentExpression) s; - if (assignmentExpression.getLeft().getKind() == INode.Kind.CALL_CHAIN) { - for (Field fo : finalOrWithEmptyInitializer) { - final String id = fo.getIdentifier().toKotlin(); - if (((CallChainExpression) assignmentExpression.getLeft()).getIdentifier().toKotlin().endsWith("." + id)) { - initializers.put(id, assignmentExpression.getRight().toKotlin()); - isRemoved = true; + for (Statement s : f.getBlock().getStatements()) { + boolean isRemoved = false; + + if (s.getKind() == INode.Kind.ASSIGNMENT_EXPRESSION) { + final AssignmentExpression assignmentExpression = (AssignmentExpression) s; + if (assignmentExpression.getLeft().getKind() == INode.Kind.CALL_CHAIN) { + for (Field fo : finalOrWithEmptyInitializer) { + final String id = fo.getIdentifier().toKotlin(); + if (((CallChainExpression) assignmentExpression.getLeft()).getIdentifier().toKotlin().endsWith("." + id)) { + initializers.put(id, assignmentExpression.getRight().toKotlin()); + isRemoved = true; + } } } } + if (!isRemoved) { + newStatements.add(s); + } } - if (!isRemoved) { - newStatements.add(s); - } + + newStatements.add( + 0, + new DummyStringStatement( + "val __ = " + createPrimaryConstructorInvocation( + name.toKotlin(), + finalOrWithEmptyInitializer, + initializers))); + + f.setBlock(new Block(newStatements)); } - - newStatements.add( - 0, - new DummyStringStatement( - "val __ = " + createPrimaryConstructorInvocation( - name.toKotlin(), - finalOrWithEmptyInitializer, - initializers))); - - f.setBlock(new Block(newStatements)); } } - methods.add( + members.add( new Constructor( Identifier.EMPTY_IDENTIFIER, Collections.emptySet(), @@ -170,18 +178,10 @@ public class Converter { } if (psiClass.isInterface()) - return new Trait(name, modifiers, typeParameters, extendsTypes, Collections.emptyList(), implementsTypes, innerClasses, methods, fields, anonymousInitializers); + return new Trait(name, modifiers, typeParameters, extendsTypes, Collections.emptyList(), implementsTypes, members); if (psiClass.isEnum()) - return new Enum(name, modifiers, typeParameters, Collections.emptyList(), Collections.emptyList(), implementsTypes, - innerClasses, methods, fieldsToFieldListForEnums(psiClass.getAllFields()), anonymousInitializers); - return new Class(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, innerClasses, methods, fields, anonymousInitializers); - } - - @NotNull - private static List initializersToInitializerList(@NotNull PsiClassInitializer[] initializers) { - List result = new LinkedList(); - for (PsiClassInitializer i : initializers) result.add(initializerToInitializer(i)); - return result; + return new Enum(name, modifiers, typeParameters, Collections.emptyList(), Collections.emptyList(), implementsTypes, members); + return new Class(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, members); } @NotNull @@ -206,31 +206,6 @@ public class Converter { } } - // hack for enums, we remove methods: - // private int ordinal() { ... } - // private String name() { ... } - // those methods any enum class inherits from java.lang.Enum - @NotNull - private static List fieldsToFieldListForEnums(@NotNull PsiField[] fields) { - List result = new LinkedList(); - for (PsiField f : fields) { - if ((f.getName().equals("ordinal") - && f.getType().getCanonicalText().equals("int") - && f.hasModifierProperty(PsiModifier.PRIVATE) - && f.hasModifierProperty(PsiModifier.FINAL) - ) || - (f.getName().equals("name") - && f.getType().getCanonicalText().equals("java.lang.String") - && f.hasModifierProperty(PsiModifier.PRIVATE) - && f.hasModifierProperty(PsiModifier.FINAL) - )) - continue; - - result.add(fieldToField(f)); - } - return result; - } - @NotNull private static List fieldsToFieldList(@NotNull PsiField[] fields) { List result = new LinkedList(); @@ -256,13 +231,6 @@ public class Converter { ); } - @NotNull - private static List methodsToFunctionList(@NotNull PsiMethod[] methods) { - List result = new LinkedList(); - for (PsiMethod t : methods) result.add(methodToFunction(t, true)); - return result; - } - @Nullable private static PsiMethod getPrimaryConstructorForThisCase(@NotNull PsiClass psiClass) { ThisVisitor tv = new ThisVisitor(); diff --git a/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java b/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java index 45fd78b622b..e8a87d2b3f7 100644 --- a/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java +++ b/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java @@ -9,17 +9,15 @@ import java.util.List; * @author ignatov */ public class AnonymousClass extends Class { - public AnonymousClass(List innerClasses, List methods, List fields, List initializers) { + public AnonymousClass(List members) { super(new IdentifierImpl("anonClass"), Collections.emptySet(), Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), - innerClasses, - methods, - fields, - initializers); + members + ); } @NotNull diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java index 37fa884aa57..3a40d66a427 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -18,31 +18,26 @@ public class Class extends Member { String TYPE = "class"; final Identifier myName; private final List myBaseClassParams; - private final List myInitializers; + private List myMembers; private final List myTypeParameters; private final List myExtendsTypes; private final List myImplementsTypes; - final List myInnerClasses; - private final List myMethods; - final List myFields; public Class(Identifier name, Set modifiers, List typeParameters, List extendsTypes, - List baseClassParams, List implementsTypes, List innerClasses, List methods, List fields, List initializers) { + List baseClassParams, List implementsTypes, List members) { myName = name; myBaseClassParams = baseClassParams; myModifiers = modifiers; myTypeParameters = typeParameters; myExtendsTypes = extendsTypes; myImplementsTypes = implementsTypes; - myInnerClasses = innerClasses; - myMethods = methods; - myFields = fields; - myInitializers = initializers; + myMembers = members; } + @Nullable private Constructor getPrimaryConstructor() { - for (Function m : myMethods) + for (Member m : myMembers) if (m.getKind() == Kind.CONSTRUCTOR) if (((Constructor) m).isPrimary()) return (Constructor) m; @@ -82,9 +77,9 @@ public class Class extends Member { } @NotNull - List methodsExceptConstructors() { - final LinkedList result = new LinkedList(); - for (Function m : myMethods) + LinkedList membersExceptConstructors() { + final LinkedList result = new LinkedList(); + for (Member m : myMembers) if (m.getKind() != Kind.CONSTRUCTOR) result.add(m); return result; @@ -93,12 +88,13 @@ public class Class extends Member { @NotNull List secondaryConstructorsAsStaticInitFunction() { final LinkedList result = new LinkedList(); - for (Function m : myMethods) + for (Member m : myMembers) if (m.getKind() == Kind.CONSTRUCTOR && !((Constructor) m).isPrimary()) { + Function f = (Function) m; Set modifiers = new HashSet(m.myModifiers); modifiers.add(Modifier.STATIC); - final List statements = m.getBlock().getStatements(); + final List statements = f.getBlock().getStatements(); statements.add(new ReturnStatement(new IdentifierImpl("__"))); // TODO: move to one place, find other __ usages final Block block = new Block(statements); @@ -106,8 +102,8 @@ public class Class extends Member { new IdentifierImpl("init"), modifiers, new ClassType(myName), - m.getTypeParameters(), - m.getParams(), + f.getTypeParameters(), + f.getParams(), block )); } @@ -164,11 +160,8 @@ public class Class extends Member { String bodyToKotlin() { return SPACE + "{" + N + - AstUtil.joinNodes(getNonStatic(myFields), N) + N + - AstUtil.joinNodes(getNonStatic(myInitializers), N) + N + + AstUtil.joinNodes(getNonStatic(membersExceptConstructors()), N) + N + classObjectToKotlin() + N + - AstUtil.joinNodes(getNonStatic(methodsExceptConstructors()), N) + N + - AstUtil.joinNodes(getNonStatic(myInnerClasses), N) + N + primaryConstructorBodyToKotlin() + N + "}"; } @@ -190,17 +183,11 @@ public class Class extends Member { } private String classObjectToKotlin() { - final List staticMethods = new LinkedList(secondaryConstructorsAsStaticInitFunction()); - staticMethods.addAll(getStatic(methodsExceptConstructors())); - final List staticFields = getStatic(myFields); - final List staticInitializers = getStatic(myInitializers); - final List staticInnerClasses = getStatic(myInnerClasses); - if (staticFields.size() + staticMethods.size() + staticInnerClasses.size() + staticInitializers.size() > 0) { + final List staticMembers = new LinkedList(secondaryConstructorsAsStaticInitFunction()); + staticMembers.addAll(getStatic(membersExceptConstructors())); + if (staticMembers.size() > 0) { return "class" + SPACE + "object" + SPACE + "{" + N + - AstUtil.joinNodes(staticFields, N) + N + - AstUtil.joinNodes(staticInitializers, N) + N + - AstUtil.joinNodes(staticMethods, N) + N + - AstUtil.joinNodes(staticInnerClasses, N) + N + + AstUtil.joinNodes(staticMembers, N) + N + "}"; } return EMPTY; diff --git a/src/org/jetbrains/jet/j2k/ast/Enum.java b/src/org/jetbrains/jet/j2k/ast/Enum.java index d781e944196..9e9c1659e7f 100644 --- a/src/org/jetbrains/jet/j2k/ast/Enum.java +++ b/src/org/jetbrains/jet/j2k/ast/Enum.java @@ -10,11 +10,12 @@ import java.util.Set; * @author ignatov */ public class Enum extends Class { - public Enum(Identifier name, Set modifiers, List typeParameters, List extendsTypes, List baseClassParams, List implementsTypes, List innerClasses, List methods, List fields, List initializers) { - super(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, innerClasses, methods, fields, initializers); + public Enum(Identifier name, Set modifiers, List typeParameters, List extendsTypes, + List baseClassParams, List implementsTypes, List members) { + super(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, members); } - String primaryConstructorSignatureToKotlin() { + String primaryConstructorSignatureToKotlin() { String s = super.primaryConstructorSignatureToKotlin(); return s.equals("()") ? EMPTY : s; } @@ -27,10 +28,9 @@ public class Enum extends Class { @NotNull @Override public String toKotlin() { - return modifiersToKotlin() + "enum" + SPACE + myName.toKotlin() + primaryConstructorSignatureToKotlin() + typeParametersToKotlin() + implementTypesToKotlin() + SPACE + "{" + N + - AstUtil.joinNodes(myFields, N) + N + - AstUtil.joinNodes(methodsExceptConstructors(), N) + N + - AstUtil.joinNodes(myInnerClasses, N) + N + + return modifiersToKotlin() + "enum" + SPACE + myName.toKotlin() + primaryConstructorSignatureToKotlin() + + typeParametersToKotlin() + implementTypesToKotlin() + SPACE + "{" + N + + AstUtil.joinNodes(membersExceptConstructors(), N) + N + primaryConstructorBodyToKotlin() + N + "}"; } diff --git a/src/org/jetbrains/jet/j2k/ast/Trait.java b/src/org/jetbrains/jet/j2k/ast/Trait.java index 8f39b8d9193..60bcd122add 100644 --- a/src/org/jetbrains/jet/j2k/ast/Trait.java +++ b/src/org/jetbrains/jet/j2k/ast/Trait.java @@ -7,8 +7,9 @@ import java.util.Set; * @author ignatov */ public class Trait extends Class { - public Trait(Identifier name, Set modifiers, List typeParameters, List extendsTypes, List baseClassParams, List implementsTypes, List innerClasses, List methods, List fields, List initializers) { - super(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, innerClasses, methods, fields, initializers); + public Trait(Identifier name, Set modifiers, List typeParameters, List extendsTypes, + List baseClassParams, List implementsTypes, List members) { + super(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, members); TYPE = "trait"; } diff --git a/testData/ast/class/class/oneStaticFieldOneNonStatic.kt b/testData/ast/class/class/oneStaticFieldOneNonStatic.kt index ebff54572d4..fe55d4cafd3 100644 --- a/testData/ast/class/class/oneStaticFieldOneNonStatic.kt +++ b/testData/ast/class/class/oneStaticFieldOneNonStatic.kt @@ -1,8 +1,8 @@ class S() { -class object { -var myI : Int = 10 -} open fun sB() : Boolean { return true } +class object { +var myI : Int = 10 +} } \ No newline at end of file diff --git a/testData/ast/class/class/oneStaticMethodOneNonStatic.kt b/testData/ast/class/class/oneStaticMethodOneNonStatic.kt index a50ebaff602..382ea95f5b0 100644 --- a/testData/ast/class/class/oneStaticMethodOneNonStatic.kt +++ b/testData/ast/class/class/oneStaticMethodOneNonStatic.kt @@ -1,10 +1,10 @@ class S() { +open fun sB() : Boolean { +return true +} class object { open fun sI() : Int { return 1 } } -open fun sB() : Boolean { -return true -} } \ No newline at end of file diff --git a/testData/ast/constructors/file/identifier.kt b/testData/ast/constructors/file/identifier.kt index 71bfa01998e..384974d68f7 100644 --- a/testData/ast/constructors/file/identifier.kt +++ b/testData/ast/constructors/file/identifier.kt @@ -2,6 +2,9 @@ public open class Identifier(myName : String?, myHasDollar : Boolean) { private val myName : String? private var myHasDollar : Boolean private var myNullable : Boolean = true +open public fun getName() : String? { +return myName +} class object { open public fun init(name : String?) : Identifier { val __ = Identifier(name, false) @@ -18,9 +21,6 @@ __.myNullable = isNullable return __ } } -open public fun getName() : String? { -return myName -} { $myName = myName $myHasDollar = myHasDollar From c5c3e92b4e737f2b1946c578bfab7743fb60e22c Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 17 Nov 2011 16:06:49 +0400 Subject: [PATCH 111/206] 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 From aa976315d9f7f91602fd1fb2d93f86edf3cf42b1 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 17 Nov 2011 16:35:01 +0400 Subject: [PATCH 112/206] 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()) } } From 82fbc9875760d2c492bd066ae78b6b3c81ff82a8 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 17 Nov 2011 17:10:14 +0400 Subject: [PATCH 113/206] types for inner classes supported --- .../jet/j2k/visitors/TypeVisitor.java | 21 ++++++++++++++++++- .../newClassExpression/file/newInnerClass.jav | 2 ++ .../newClassExpression/file/newInnerClass.kt | 4 +++- .../file/newStaticInnerClass.kt | 2 +- 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java index 7f99693f1e1..340eb09240b 100644 --- a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java @@ -43,8 +43,27 @@ public class TypeVisitor extends PsiTypeVisitor { @Override public Type visitClassType(PsiClassType classType) { + String classTypeName = getClassTypeName(classType); + + if (classType instanceof PsiClassReferenceType) { // TODO: simplify + final PsiJavaCodeReferenceElement reference = ((PsiClassReferenceType) classType).getReference(); + PsiElement resolveClass = reference.resolve(); + if (resolveClass != null && resolveClass instanceof PsiClass) { + final PsiClass innerClass = (PsiClass) resolveClass; + PsiClass outerClass = innerClass.getContainingClass(); + if (outerClass != null) { + String result = new IdentifierImpl(innerClass.getName()).toKotlin(); + while (outerClass != null) { + result = new IdentifierImpl(outerClass.getName()).toKotlin() + "." + result; + outerClass = outerClass.getContainingClass(); + } + classTypeName = result; + } + } + } + myResult = new ClassType( - new IdentifierImpl(getClassTypeName(classType)), + new IdentifierImpl(classTypeName), typesToTypeList(classType.getParameters()) ); return super.visitClassType(classType); diff --git a/testData/ast/newClassExpression/file/newInnerClass.jav b/testData/ast/newClassExpression/file/newInnerClass.jav index a7343d1b5a4..1f4cdf9f589 100644 --- a/testData/ast/newClassExpression/file/newInnerClass.jav +++ b/testData/ast/newClassExpression/file/newInnerClass.jav @@ -1,3 +1,5 @@ +package org.test; + class OuterClass { class InnerClass { } diff --git a/testData/ast/newClassExpression/file/newInnerClass.kt b/testData/ast/newClassExpression/file/newInnerClass.kt index 2c49f35b125..497bc0514cd 100644 --- a/testData/ast/newClassExpression/file/newInnerClass.kt +++ b/testData/ast/newClassExpression/file/newInnerClass.kt @@ -1,3 +1,4 @@ +namespace org.test { open class OuterClass() { open class InnerClass() { } @@ -5,6 +6,7 @@ open class InnerClass() { open class User() { open fun main() : Unit { var outerObject : OuterClass? = OuterClass() -var innerObject : InnerClass? = outerObject?.InnerClass() +var innerObject : OuterClass.InnerClass? = outerObject?.InnerClass() +} } } \ No newline at end of file diff --git a/testData/ast/newClassExpression/file/newStaticInnerClass.kt b/testData/ast/newClassExpression/file/newStaticInnerClass.kt index e7f898003c3..8adc33c21a5 100644 --- a/testData/ast/newClassExpression/file/newStaticInnerClass.kt +++ b/testData/ast/newClassExpression/file/newStaticInnerClass.kt @@ -7,7 +7,7 @@ open class Bar() { } open class User() { open fun main() : Unit { -var boo : Bar? = Foo.Bar() +var boo : Foo.Bar? = Foo.Bar() } } } \ No newline at end of file From a08fb4fb0a3555de746bc23e83cc49fc417d4b35 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 17 Nov 2011 18:08:44 +0400 Subject: [PATCH 114/206] qualified types supported --- .../jet/j2k/visitors/TypeVisitor.java | 19 ++++++++----------- .../file/libraryFieldCall.kt | 2 +- .../file/fullQualifiedName2.jav | 7 +++++++ .../file/fullQualifiedName2.kt | 7 +++++++ 4 files changed, 23 insertions(+), 12 deletions(-) create mode 100644 testData/ast/newClassExpression/file/fullQualifiedName2.jav create mode 100644 testData/ast/newClassExpression/file/fullQualifiedName2.kt diff --git a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java index 340eb09240b..31a100edb0d 100644 --- a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java @@ -47,18 +47,15 @@ public class TypeVisitor extends PsiTypeVisitor { if (classType instanceof PsiClassReferenceType) { // TODO: simplify final PsiJavaCodeReferenceElement reference = ((PsiClassReferenceType) classType).getReference(); - PsiElement resolveClass = reference.resolve(); - if (resolveClass != null && resolveClass instanceof PsiClass) { - final PsiClass innerClass = (PsiClass) resolveClass; - PsiClass outerClass = innerClass.getContainingClass(); - if (outerClass != null) { - String result = new IdentifierImpl(innerClass.getName()).toKotlin(); - while (outerClass != null) { - result = new IdentifierImpl(outerClass.getName()).toKotlin() + "." + result; - outerClass = outerClass.getContainingClass(); - } - classTypeName = result; + if (reference.isQualified()) { + String result = new IdentifierImpl(reference.getReferenceName()).toKotlin(); + PsiElement qualifier = reference.getQualifier(); + while (qualifier != null) { + final PsiJavaCodeReferenceElement p = (PsiJavaCodeReferenceElement) qualifier; + result = new IdentifierImpl(p.getReferenceName()).toKotlin() + "." + result; // TODO: maybe need to replace by safe call? + qualifier = p.getQualifier(); } + classTypeName = result; } } diff --git a/testData/ast/callChainExpression/file/libraryFieldCall.kt b/testData/ast/callChainExpression/file/libraryFieldCall.kt index 868d83f109a..3de449db532 100644 --- a/testData/ast/callChainExpression/file/libraryFieldCall.kt +++ b/testData/ast/callChainExpression/file/libraryFieldCall.kt @@ -1,6 +1,6 @@ open class Library() { class object { -val ourOut : PrintStream? +val ourOut : java.io.PrintStream? } } open class User() { diff --git a/testData/ast/newClassExpression/file/fullQualifiedName2.jav b/testData/ast/newClassExpression/file/fullQualifiedName2.jav new file mode 100644 index 00000000000..e8ef97b8b9e --- /dev/null +++ b/testData/ast/newClassExpression/file/fullQualifiedName2.jav @@ -0,0 +1,7 @@ +package test; + +class User { + void main() { + java.util.List list = new java.util.LinkedList(); + } +} \ No newline at end of file diff --git a/testData/ast/newClassExpression/file/fullQualifiedName2.kt b/testData/ast/newClassExpression/file/fullQualifiedName2.kt new file mode 100644 index 00000000000..2196aa0fff2 --- /dev/null +++ b/testData/ast/newClassExpression/file/fullQualifiedName2.kt @@ -0,0 +1,7 @@ +namespace test { +open class User() { +open fun main() : Unit { +var list : java.util.List? = java.util.LinkedList() +} +} +} \ No newline at end of file From 09a489f9d4bda3b0aad5131d8f972cd04b314b42 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 17 Nov 2011 18:34:34 +0400 Subject: [PATCH 115/206] added generic params to method call expression --- .../jetbrains/jet/j2k/ast/MethodCallExpression.java | 10 ++++++++-- .../jet/j2k/visitors/ExpressionVisitor.java | 5 +++-- .../ast/methodCallExpression/file/genericMethod.jav | 12 ++++++++++++ .../ast/methodCallExpression/file/genericMethod.kt | 12 ++++++++++++ 4 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 testData/ast/methodCallExpression/file/genericMethod.jav create mode 100644 testData/ast/methodCallExpression/file/genericMethod.kt diff --git a/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java b/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java index 0a0aab62b7b..c190d546d9c 100644 --- a/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java @@ -1,6 +1,9 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.j2k.util.AstUtil; + +import java.util.List; /** * @author ignatov @@ -9,11 +12,13 @@ public class MethodCallExpression extends Expression { private final Expression myMethodCall; private final Element myParamList; private final boolean myIsResultNullable; + private List myTypeParameters; - public MethodCallExpression(Expression methodCall, Element paramList, boolean nullable) { + public MethodCallExpression(Expression methodCall, Element paramList, boolean nullable, List typeParameters) { myMethodCall = methodCall; myParamList = paramList; myIsResultNullable = nullable; + myTypeParameters = typeParameters; } @Override @@ -24,6 +29,7 @@ public class MethodCallExpression extends Expression { @NotNull @Override public String toKotlin() { - return myMethodCall.toKotlin() + "(" + myParamList.toKotlin() + ")"; + String typeParamsToKotlin = myTypeParameters.size() > 0 ? "<" + AstUtil.joinNodes(myTypeParameters, COMMA_WITH_SPACE) + ">" : EMPTY; + return myMethodCall.toKotlin() + typeParamsToKotlin + "(" + myParamList.toKotlin() + ")"; } } diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index ed3739adc52..f40f0dbe450 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -170,7 +170,8 @@ public class ExpressionVisitor extends StatementVisitor { new MethodCallExpression( expressionToExpression(expression.getMethodExpression()), elementToElement(expression.getArgumentList()), - typeToType(expression.getType()).isNullable() + typeToType(expression.getType()).isNullable(), + typesToTypeList(expression.getTypeArguments()) ); } @@ -206,7 +207,7 @@ public class ExpressionVisitor extends StatementVisitor { if (constructor != null && !isConstructorPrimary(constructor)) { myResult = new CallChainExpression( new IdentifierImpl(constructor.getName(), false), - new MethodCallExpression(new IdentifierImpl("init"), elementToElement(expression.getArgumentList()), false)); + new MethodCallExpression(new IdentifierImpl("init"), elementToElement(expression.getArgumentList()), false, typesToTypeList(expression.getTypeArguments()))); } } } diff --git a/testData/ast/methodCallExpression/file/genericMethod.jav b/testData/ast/methodCallExpression/file/genericMethod.jav new file mode 100644 index 00000000000..952645f5f09 --- /dev/null +++ b/testData/ast/methodCallExpression/file/genericMethod.jav @@ -0,0 +1,12 @@ +package demo; + +class Map { + void put(K k, V v) {} +} + +class U { + void test() { + Map m = new Map(); + m.put("10", 10); + } +} \ No newline at end of file diff --git a/testData/ast/methodCallExpression/file/genericMethod.kt b/testData/ast/methodCallExpression/file/genericMethod.kt new file mode 100644 index 00000000000..f965f4e78e5 --- /dev/null +++ b/testData/ast/methodCallExpression/file/genericMethod.kt @@ -0,0 +1,12 @@ +namespace demo { +open class Map() { +open fun put(k : K?, v : V?) : Unit { +} +} +open class U() { +open fun test() : Unit { +var m : Map? = Map() +m?.put("10", 10) +} +} +} \ No newline at end of file From 18e93658b26621410a6698ee10b27d18521ad25f Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Fri, 18 Nov 2011 13:36:53 +0400 Subject: [PATCH 116/206] IdeaSDK name changed --- j2k.ipr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/j2k.ipr b/j2k.ipr index 52c8b1e6702..0725715a2d7 100644 --- a/j2k.ipr +++ b/j2k.ipr @@ -168,7 +168,7 @@ http://www.w3.org/1999/xhtml - + From ccb3e63638da051363365835108cf2967a1f5789 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 21 Nov 2011 13:37:25 +0400 Subject: [PATCH 117/206] fixed raw generic types fir KT-540 --- .../jet/j2k/visitors/TypeVisitor.java | 42 +++++++++++++++---- .../file/fullQualifiedName.kt | 2 +- .../file/fullQualifiedName2.kt | 2 +- testData/ast/rawGenerics/file/kt-540.jav | 12 ++++++ testData/ast/rawGenerics/file/kt-540.kt | 11 +++++ 5 files changed, 60 insertions(+), 9 deletions(-) create mode 100644 testData/ast/rawGenerics/file/kt-540.jav create mode 100644 testData/ast/rawGenerics/file/kt-540.kt diff --git a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java index 31a100edb0d..d77ca625af0 100644 --- a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java @@ -6,6 +6,9 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.j2k.ast.*; import org.jetbrains.jet.j2k.util.AstUtil; +import java.util.LinkedList; +import java.util.List; + import static org.jetbrains.jet.j2k.Converter.typeToType; import static org.jetbrains.jet.j2k.Converter.typesToTypeList; @@ -43,9 +46,23 @@ public class TypeVisitor extends PsiTypeVisitor { @Override public Type visitClassType(PsiClassType classType) { - String classTypeName = getClassTypeName(classType); + String classTypeName = createQualifiedName(classType); + if (classTypeName.equals("")) + classTypeName = getClassTypeName(classType); + List resolvedClassTypeParams = createRawTypesForResolvedReference(classType); - if (classType instanceof PsiClassReferenceType) { // TODO: simplify + final IdentifierImpl identifier = new IdentifierImpl(classTypeName); + if (classType.getParameterCount() == 0 && resolvedClassTypeParams.size() > 0) + myResult = new ClassType(identifier, resolvedClassTypeParams); + else + myResult = new ClassType(identifier, typesToTypeList(classType.getParameters())); + return super.visitClassType(classType); + } + + @NotNull + private static String createQualifiedName(@NotNull PsiClassType classType) { + String classTypeName = ""; + if (classType instanceof PsiClassReferenceType) { final PsiJavaCodeReferenceElement reference = ((PsiClassReferenceType) classType).getReference(); if (reference.isQualified()) { String result = new IdentifierImpl(reference.getReferenceName()).toKotlin(); @@ -58,12 +75,23 @@ public class TypeVisitor extends PsiTypeVisitor { classTypeName = result; } } + return classTypeName; + } - myResult = new ClassType( - new IdentifierImpl(classTypeName), - typesToTypeList(classType.getParameters()) - ); - return super.visitClassType(classType); + @NotNull + private static List createRawTypesForResolvedReference(@NotNull PsiClassType classType) { + final List typeParams = new LinkedList(); + if (classType instanceof PsiClassReferenceType) { + final PsiJavaCodeReferenceElement reference = ((PsiClassReferenceType) classType).getReference(); + final PsiElement resolve = reference.resolve(); + if (resolve != null) { + if (resolve instanceof PsiClass) + //noinspection UnusedDeclaration + for (PsiTypeParameter p : ((PsiClass) resolve).getTypeParameters()) + typeParams.add(new StarProjectionType()); + } + } + return typeParams; } @NotNull diff --git a/testData/ast/newClassExpression/file/fullQualifiedName.kt b/testData/ast/newClassExpression/file/fullQualifiedName.kt index 4efc2e46426..18839b09afd 100644 --- a/testData/ast/newClassExpression/file/fullQualifiedName.kt +++ b/testData/ast/newClassExpression/file/fullQualifiedName.kt @@ -2,7 +2,7 @@ namespace test { import java.util.List open class User() { open fun main() : Unit { -var list : List? = java.util.LinkedList() +var list : List<*>? = java.util.LinkedList() } } } \ No newline at end of file diff --git a/testData/ast/newClassExpression/file/fullQualifiedName2.kt b/testData/ast/newClassExpression/file/fullQualifiedName2.kt index 2196aa0fff2..474fda2fcd5 100644 --- a/testData/ast/newClassExpression/file/fullQualifiedName2.kt +++ b/testData/ast/newClassExpression/file/fullQualifiedName2.kt @@ -1,7 +1,7 @@ namespace test { open class User() { open fun main() : Unit { -var list : java.util.List? = java.util.LinkedList() +var list : java.util.List<*>? = java.util.LinkedList() } } } \ No newline at end of file diff --git a/testData/ast/rawGenerics/file/kt-540.jav b/testData/ast/rawGenerics/file/kt-540.jav new file mode 100644 index 00000000000..6327874eab3 --- /dev/null +++ b/testData/ast/rawGenerics/file/kt-540.jav @@ -0,0 +1,12 @@ +package demo; + +import java.util.List; +import java.util.LinkedList; + +class Test { + void main() { + List common = new LinkedList(); + List raw = new LinkedList(); + List superRaw = new LinkedList(); + } +} \ No newline at end of file diff --git a/testData/ast/rawGenerics/file/kt-540.kt b/testData/ast/rawGenerics/file/kt-540.kt new file mode 100644 index 00000000000..7d2290afbf1 --- /dev/null +++ b/testData/ast/rawGenerics/file/kt-540.kt @@ -0,0 +1,11 @@ +namespace demo { +import java.util.List +import java.util.LinkedList +open class Test() { +open fun main() : Unit { +var common : List? = LinkedList() +var raw : List<*>? = LinkedList() +var superRaw : List<*>? = LinkedList() +} +} +} \ No newline at end of file From ef415f47485eba38bc418a6df27c5c69afc8b6c4 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 21 Nov 2011 16:09:23 +0400 Subject: [PATCH 118/206] supported some generics constrcutors and methods for KT-540 --- .../jet/j2k/visitors/ExpressionVisitor.java | 66 +++++++++++++------ .../file/kt-540-rawGenericClass.jav | 15 +++++ .../file/kt-540-rawGenericClass.kt | 14 ++++ .../ast/rawGenerics/file/rawGenericMethod.jav | 14 ++++ .../ast/rawGenerics/file/rawGenericMethod.kt | 14 ++++ 5 files changed, 103 insertions(+), 20 deletions(-) create mode 100644 testData/ast/rawGenerics/file/kt-540-rawGenericClass.jav create mode 100644 testData/ast/rawGenerics/file/kt-540-rawGenericClass.kt create mode 100644 testData/ast/rawGenerics/file/rawGenericMethod.jav create mode 100644 testData/ast/rawGenerics/file/rawGenericMethod.kt diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index f40f0dbe450..02cefe9b869 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.annotations.Nullable; import org.jetbrains.jet.j2k.Converter; import org.jetbrains.jet.j2k.ast.*; @@ -185,31 +186,45 @@ public class ExpressionVisitor extends StatementVisitor { super.visitNewExpression(expression); if (expression.getArrayInitializer() != null) // new Foo[] {} - myResult = expressionToExpression(expression.getArrayInitializer()); + myResult = createNewEmptyArray(expression); else if (expression.getArrayDimensions().length > 0) { // new Foo[5] - final List callExpression = expressionsToExpressionList(expression.getArrayDimensions()); - callExpression.add(new IdentifierImpl("{null}")); // TODO: remove - - myResult = new NewClassExpression( - typeToType(expression.getType()), // TODO: remove - new ExpressionList(callExpression) - ); + myResult = createNewNonEmptyArray(expression); } else { // new Class(): common case - final PsiAnonymousClass anonymousClass = expression.getAnonymousClass(); - myResult = new NewClassExpression( + myResult = createNewClassExpression(expression); + } + } + + @NotNull + private Expression createNewClassExpression(@NotNull PsiNewExpression expression) { + final PsiAnonymousClass anonymousClass = expression.getAnonymousClass(); + final PsiMethod constructor = expression.resolveMethod(); + if (constructor == null || isConstructorPrimary(constructor)) { + return new NewClassExpression( expressionToExpression(expression.getQualifier()), elementToElement(expression.getClassOrAnonymousClassReference()), elementToElement(expression.getArgumentList()), anonymousClass != null ? anonymousClassToAnonymousClass(anonymousClass) : null ); - // is constructor secondary - final PsiMethod constructor = expression.resolveMethod(); - if (constructor != null && !isConstructorPrimary(constructor)) { - myResult = new CallChainExpression( - new IdentifierImpl(constructor.getName(), false), - new MethodCallExpression(new IdentifierImpl("init"), elementToElement(expression.getArgumentList()), false, typesToTypeList(expression.getTypeArguments()))); - } } + // is constructor secondary + return new CallChainExpression( + new IdentifierImpl(constructor.getName(), false), + new MethodCallExpression(new IdentifierImpl("init"), elementToElement(expression.getArgumentList()), false, typesToTypeList(expression.getTypeArguments()))); + } + + @NotNull + private NewClassExpression createNewNonEmptyArray(@NotNull PsiNewExpression expression) { + final List callExpression = expressionsToExpressionList(expression.getArrayDimensions()); + callExpression.add(new IdentifierImpl("{null}")); // TODO: remove + return new NewClassExpression( + typeToType(expression.getType()), + new ExpressionList(callExpression) + ); + } + + @NotNull + private static Expression createNewEmptyArray(@NotNull PsiNewExpression expression) { + return expressionToExpression(expression.getArrayInitializer()); } @Override @@ -242,7 +257,7 @@ public class ExpressionVisitor extends StatementVisitor { public void visitReferenceExpression(PsiReferenceExpression expression) { super.visitReferenceExpression(expression); - final boolean isFieldReference = isFieldReference(expression); + final boolean isFieldReference = isFieldReference(expression, getContainingClass(expression)); final boolean hasDollar = isFieldReference && isInsidePrimaryConstructor(expression); final boolean insideSecondaryConstructor = isInsideSecondaryConstructor(expression); final boolean hasReceiver = isFieldReference && insideSecondaryConstructor; @@ -285,13 +300,13 @@ public class ExpressionVisitor extends StatementVisitor { return ""; } - private boolean isFieldReference(PsiReferenceExpression expression) { + private boolean isFieldReference(PsiReferenceExpression expression, PsiClass currentClass) { final PsiReference reference = expression.getReference(); if (reference != null) { final PsiElement resolvedReference = reference.resolve(); if (resolvedReference != null) { if (resolvedReference instanceof PsiField) { - return true; + return ((PsiField) resolvedReference).getContainingClass() == currentClass; } } } @@ -318,6 +333,17 @@ public class ExpressionVisitor extends StatementVisitor { return false; } + @Nullable + private PsiClass getContainingClass(@NotNull PsiExpression expression) { + PsiElement context = expression.getContext(); + while (context != null) { + if (context instanceof PsiMethod && ((PsiMethod) context).isConstructor()) + return ((PsiMethod) context).getContainingClass(); + context = context.getContext(); + } + return null; + } + private boolean isThisExpression(PsiReferenceExpression expression) { for (PsiReference r : expression.getReferences()) if (r.getCanonicalText().equals("this")) { diff --git a/testData/ast/rawGenerics/file/kt-540-rawGenericClass.jav b/testData/ast/rawGenerics/file/kt-540-rawGenericClass.jav new file mode 100644 index 00000000000..28e9ae350cc --- /dev/null +++ b/testData/ast/rawGenerics/file/kt-540-rawGenericClass.jav @@ -0,0 +1,15 @@ +package demo; + +class Collection { + Collection(E e) { + System.out.println(e); + } +} + +class Test { + void main() { + Collection raw1 = new Collection(1); + Collection raw2 = new Collection(1); + Collection raw3 = new Collection("1"); + } +} \ No newline at end of file diff --git a/testData/ast/rawGenerics/file/kt-540-rawGenericClass.kt b/testData/ast/rawGenerics/file/kt-540-rawGenericClass.kt new file mode 100644 index 00000000000..ebf7822a53e --- /dev/null +++ b/testData/ast/rawGenerics/file/kt-540-rawGenericClass.kt @@ -0,0 +1,14 @@ +namespace demo { +open class Collection(e : E?) { +{ +System.out?.println(e) +} +} +open class Test() { +open fun main() : Unit { +var raw1 : Collection<*>? = Collection(1) +var raw2 : Collection<*>? = Collection(1) +var raw3 : Collection<*>? = Collection("1") +} +} +} \ No newline at end of file diff --git a/testData/ast/rawGenerics/file/rawGenericMethod.jav b/testData/ast/rawGenerics/file/rawGenericMethod.jav new file mode 100644 index 00000000000..1303b4a305a --- /dev/null +++ b/testData/ast/rawGenerics/file/rawGenericMethod.jav @@ -0,0 +1,14 @@ +package demo; + +class TestT { + void getT() { } +} + +class U { + void main() { + TestT t = new TestT(); + t.getT(); + t.getT(); + t.getT(); + } +} \ No newline at end of file diff --git a/testData/ast/rawGenerics/file/rawGenericMethod.kt b/testData/ast/rawGenerics/file/rawGenericMethod.kt new file mode 100644 index 00000000000..7372f4e257d --- /dev/null +++ b/testData/ast/rawGenerics/file/rawGenericMethod.kt @@ -0,0 +1,14 @@ +namespace demo { +open class TestT() { +open fun getT() : Unit { +} +} +open class U() { +open fun main() : Unit { +var t : TestT? = TestT() +t?.getT() +t?.getT() +t?.getT() +} +} +} \ No newline at end of file From 357d1dab824a39fb3907bb15e146845cc1c5550f Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 21 Nov 2011 16:37:01 +0400 Subject: [PATCH 119/206] KT-544 fixed: "Create generic init functions for generic classes" --- src/org/jetbrains/jet/j2k/ast/Class.java | 10 ++++- .../jet/j2k/visitors/ExpressionVisitor.java | 8 +++- .../constructors/file/genericIdentifier.jav | 33 +++++++++++++++++ .../constructors/file/genericIdentifier.kt | 37 +++++++++++++++++++ 4 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 testData/ast/constructors/file/genericIdentifier.jav create mode 100644 testData/ast/constructors/file/genericIdentifier.kt diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java index 3a40d66a427..2e8daa79fa9 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -98,11 +98,19 @@ public class Class extends Member { statements.add(new ReturnStatement(new IdentifierImpl("__"))); // TODO: move to one place, find other __ usages final Block block = new Block(statements); + final List typeParameters = new LinkedList(); + if (f.getTypeParameters().size() == 0) + typeParameters.addAll(myTypeParameters); + else { + typeParameters.addAll(myTypeParameters); + typeParameters.addAll(f.getTypeParameters()); + } + result.add(new Function( new IdentifierImpl("init"), modifiers, new ClassType(myName), - f.getTypeParameters(), + typeParameters, f.getParams(), block )); diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 02cefe9b869..3928cf5aec9 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -8,6 +8,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.j2k.Converter; import org.jetbrains.jet.j2k.ast.*; +import java.util.Collections; import java.util.List; import static org.jetbrains.jet.j2k.Converter.*; @@ -207,9 +208,14 @@ public class ExpressionVisitor extends StatementVisitor { ); } // is constructor secondary + final List typeParameters = expression.getClassReference() != null ? typesToTypeList(expression.getClassReference().getTypeParameters()) : Collections.emptyList(); return new CallChainExpression( new IdentifierImpl(constructor.getName(), false), - new MethodCallExpression(new IdentifierImpl("init"), elementToElement(expression.getArgumentList()), false, typesToTypeList(expression.getTypeArguments()))); + new MethodCallExpression( + new IdentifierImpl("init"), + elementToElement(expression.getArgumentList()), + false, + typeParameters)); } @NotNull diff --git a/testData/ast/constructors/file/genericIdentifier.jav b/testData/ast/constructors/file/genericIdentifier.jav new file mode 100644 index 00000000000..c77f997a1c6 --- /dev/null +++ b/testData/ast/constructors/file/genericIdentifier.jav @@ -0,0 +1,33 @@ +public class Identifier { + private final T myName; + private boolean myHasDollar; + private boolean myNullable = true; + + public Identifier(T name) { + myName = name; + } + + public Identifier(T name, boolean isNullable) { + myName = name; + myNullable = isNullable; + } + + public Identifier(T name, boolean hasDollar, boolean isNullable) { + myName = name; + myHasDollar = hasDollar; + myNullable = isNullable; + } + + @Override + public T getName() { + return myName; + } +} + +public class User { + public static void main() { + Identifier i1 = new Identifier("name", false, true); + Identifier i2 = new Identifier("name", false); + Identifier i3 = new Identifier("name"); + } +} \ No newline at end of file diff --git a/testData/ast/constructors/file/genericIdentifier.kt b/testData/ast/constructors/file/genericIdentifier.kt new file mode 100644 index 00000000000..314b85e84f0 --- /dev/null +++ b/testData/ast/constructors/file/genericIdentifier.kt @@ -0,0 +1,37 @@ +public open class Identifier(myName : T?, myHasDollar : Boolean) { +private val myName : T? +private var myHasDollar : Boolean +private var myNullable : Boolean = true +open public fun getName() : T? { +return myName +} +class object { +open public fun init(name : T?) : Identifier { +val __ = Identifier(name, false) +return __ +} +open public fun init(name : T?, isNullable : Boolean) : Identifier { +val __ = Identifier(name, false) +__.myNullable = isNullable +return __ +} +open public fun init(name : T?, hasDollar : Boolean, isNullable : Boolean) : Identifier { +val __ = Identifier(name, hasDollar) +__.myNullable = isNullable +return __ +} +} +{ +$myName = myName +$myHasDollar = myHasDollar +} +} +public open class User() { +class object { +open public fun main() : Unit { +var i1 : Identifier<*>? = Identifier.init("name", false, true) +var i2 : Identifier<*>? = Identifier.init("name", false) +var i3 : Identifier<*>? = Identifier.init("name") +} +} +} \ No newline at end of file From fb0cf96488f4ec9f4d72257364a24fac9f71048e Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 22 Nov 2011 13:13:41 +0400 Subject: [PATCH 120/206] NPE fixed --- src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java index d77ca625af0..ac5555b3ec4 100644 --- a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java @@ -95,7 +95,7 @@ public class TypeVisitor extends PsiTypeVisitor { } @NotNull - private String getClassTypeName(@NotNull PsiClassType classType) { + private static String getClassTypeName(@NotNull PsiClassType classType) { String canonicalTypeStr = classType.getCanonicalText(); if (canonicalTypeStr.equals("java.lang.Object")) return "Any"; if (canonicalTypeStr.equals("java.lang.Byte")) return "Byte"; @@ -106,7 +106,7 @@ public class TypeVisitor extends PsiTypeVisitor { if (canonicalTypeStr.equals("java.lang.Long")) return "Long"; if (canonicalTypeStr.equals("java.lang.Short")) return "Short"; if (canonicalTypeStr.equals("java.lang.Boolean")) return "Boolean"; - return classType.getClassName(); + return classType.getClassName() != null ? classType.getClassName() : classType.getCanonicalText(); } @Override From 74e96f2cc29218c3e9228a3d7a1119b7a38d752d Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 22 Nov 2011 13:14:04 +0400 Subject: [PATCH 121/206] ! added --- src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 3928cf5aec9..325cbbdb61f 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -99,6 +99,7 @@ public class ExpressionVisitor extends StatementVisitor { if (tokenType == JavaTokenType.OROR) return "||"; if (tokenType == JavaTokenType.PLUSPLUS) return "++"; if (tokenType == JavaTokenType.MINUSMINUS) return "--"; + if (tokenType == JavaTokenType.EXCL) return "!"; System.out.println("UNSUPPORTED TOKEN TYPE: " + tokenType.toString()); return ""; From 4f14e3121dcff3b1b5db12a2462d3bbc8bf90e73 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 22 Nov 2011 13:14:28 +0400 Subject: [PATCH 122/206] object literal supported --- .../jet/j2k/ast/NewClassExpression.java | 2 +- testData/ast/objectLiteral/file/MyFrame.jav | 26 +++++++++++++++++++ testData/ast/objectLiteral/file/MyFrame.kt | 21 +++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 testData/ast/objectLiteral/file/MyFrame.jav create mode 100644 testData/ast/objectLiteral/file/MyFrame.kt diff --git a/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java b/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java index bddb19bfe16..30185d2bce7 100644 --- a/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java @@ -30,7 +30,7 @@ public class NewClassExpression extends Expression { final String callOperator = myQualifier.isNullable() ? QUESTDOT : DOT; final String qualifier = myQualifier.isEmpty() ? EMPTY : myQualifier.toKotlin() + callOperator; return myAnonymousClass != null ? - qualifier + myName.toKotlin() + "(" + myArguments.toKotlin() + ")" + myAnonymousClass.toKotlin() : + "object" + SPACE + ":" + SPACE + qualifier + myName.toKotlin() + "(" + myArguments.toKotlin() + ")" + myAnonymousClass.toKotlin() : qualifier + myName.toKotlin() + "(" + myArguments.toKotlin() + ")"; } } \ No newline at end of file diff --git a/testData/ast/objectLiteral/file/MyFrame.jav b/testData/ast/objectLiteral/file/MyFrame.jav new file mode 100644 index 00000000000..08b872f1f65 --- /dev/null +++ b/testData/ast/objectLiteral/file/MyFrame.jav @@ -0,0 +1,26 @@ +package demo; + +import java.awt.*; +import java.awt.event.*; +import java.io.*; +import java.net.*; + +public final class Client extends Frame { + Client() { + WindowAdapter a = new WindowAdapter() { + @Override + public void windowClosing (WindowEvent e) { + dispose(); + } + } + + addWindowListener(a); + + addWindowListener(new WindowAdapter() { + @Override + public void windowClosing (WindowEvent e) { + dispose(); + } + }); + } +} \ No newline at end of file diff --git a/testData/ast/objectLiteral/file/MyFrame.kt b/testData/ast/objectLiteral/file/MyFrame.kt new file mode 100644 index 00000000000..834758deae5 --- /dev/null +++ b/testData/ast/objectLiteral/file/MyFrame.kt @@ -0,0 +1,21 @@ +namespace demo { +import java.awt.* +import java.awt.event.* +import java.io.* +import java.net.* +public class Client() : Frame() { +{ +var a : WindowAdapter? = object : WindowAdapter() { +open public fun windowClosing(e : WindowEvent?) : Unit { +dispose() +} +} +addWindowListener(a) +addWindowListener(object : WindowAdapter() { +open public fun windowClosing(e : WindowEvent?) : Unit { +dispose() +} +}) +} +} +} \ No newline at end of file From 94f8b3581c2aee3ca9253b636e08d3f3730ed929 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 22 Nov 2011 13:16:43 +0400 Subject: [PATCH 123/206] test for new Runnable changed --- .../newClassExpression/expression/newClassWithAnonymousScope.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testData/ast/newClassExpression/expression/newClassWithAnonymousScope.kt b/testData/ast/newClassExpression/expression/newClassWithAnonymousScope.kt index 0dd76680c66..bfee0514886 100644 --- a/testData/ast/newClassExpression/expression/newClassWithAnonymousScope.kt +++ b/testData/ast/newClassExpression/expression/newClassWithAnonymousScope.kt @@ -1,4 +1,4 @@ -Runnable() { +object : Runnable() { override public fun run() : Unit { System.out?.println("Run") } From ddcf8d06a3798b20f85d2a44429e4d60807b799f Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 22 Nov 2011 13:26:38 +0400 Subject: [PATCH 124/206] now only test depends from common-io.jar --- j2k.iml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/j2k.iml b/j2k.iml index 26774724cb1..f7e0d92adb2 100644 --- a/j2k.iml +++ b/j2k.iml @@ -8,7 +8,7 @@ - + From 8a74f4fc3e473cce131e8935da62db5e4db06537 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 22 Nov 2011 13:49:48 +0400 Subject: [PATCH 125/206] str.equals("") replaced by str.isEmpty() --- src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java | 2 +- src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java | 2 +- test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 325cbbdb61f..dcf71736c8b 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -58,7 +58,7 @@ public class ExpressionVisitor extends StatementVisitor { if (tokenType == JavaTokenType.OREQ) secondOp = "or"; if (tokenType == JavaTokenType.GTGTGTEQ) secondOp = "cyclicShiftRight"; - if (!secondOp.equals("")) // if not Kotlin operators + if (!secondOp.isEmpty()) // if not Kotlin operators myResult = new AssignmentExpression( expressionToExpression(expression.getLExpression()), new BinaryExpression( diff --git a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java index ac5555b3ec4..26797cd9055 100644 --- a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java @@ -47,7 +47,7 @@ public class TypeVisitor extends PsiTypeVisitor { @Override public Type visitClassType(PsiClassType classType) { String classTypeName = createQualifiedName(classType); - if (classTypeName.equals("")) + if (classTypeName.isEmpty()) classTypeName = getClassTypeName(classType); List resolvedClassTypeParams = createRawTypesForResolvedReference(classType); diff --git a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java index e391dc3bffc..b67404fa11c 100644 --- a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java +++ b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java @@ -47,7 +47,7 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { else if (javaFile.getParent().endsWith("/class")) actual = fileToKotlin(javaCode); else if (javaFile.getParent().endsWith("/file")) actual = fileToKotlin(javaCode); - assert !actual.equals("") : "Specify what is it: file, class, method, statement or expression"; + assert !actual.isEmpty() : "Specify what is it: file, class, method, statement or expression"; final File tmp = new File(kotlinPath + ".tmp"); if (!expected.equals(actual)) writeStringToFile(tmp, actual); From 8f91bc3f5ea9fc34164ad674009bdd953261ee68 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 22 Nov 2011 14:17:37 +0400 Subject: [PATCH 126/206] namespace block removed --- src/org/jetbrains/jet/j2k/ast/File.java | 5 ++--- testData/ast/constructors/file/customerBuilder.kt | 3 +-- testData/ast/file/file/packageWithClass.kt | 3 +-- testData/ast/file/file/packageWithImports.kt | 5 ++--- testData/ast/file/file/packageWithMixedImports.kt | 5 ++--- testData/ast/file/file/packageWithOpenClass.kt | 3 +-- testData/ast/file/file/packageWithStaticImports.kt | 5 ++--- testData/ast/importStatement/file/importWithKeywords.kt | 3 +-- testData/ast/importStatement/file/importWithStar.kt | 3 +-- testData/ast/importStatement/file/simpleImport.kt | 3 +-- testData/ast/methodCallExpression/file/genericMethod.kt | 3 +-- testData/ast/newClassExpression/file/fullQualifiedName.kt | 3 +-- testData/ast/newClassExpression/file/fullQualifiedName2.kt | 3 +-- testData/ast/newClassExpression/file/newClassByFullName.kt | 3 +-- testData/ast/newClassExpression/file/newInnerClass.kt | 3 +-- testData/ast/newClassExpression/file/newListAndNewMember.kt | 3 +-- testData/ast/newClassExpression/file/newStaticInnerClass.kt | 3 +-- testData/ast/objectLiteral/file/MyFrame.kt | 3 +-- testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.kt | 3 +-- testData/ast/rawGenerics/file/kt-540-rawGenericClass.kt | 3 +-- testData/ast/rawGenerics/file/kt-540.kt | 3 +-- testData/ast/rawGenerics/file/rawGenericMethod.kt | 3 +-- 22 files changed, 26 insertions(+), 48 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/ast/File.java b/src/org/jetbrains/jet/j2k/ast/File.java index da873d9419b..d65a1605cbe 100644 --- a/src/org/jetbrains/jet/j2k/ast/File.java +++ b/src/org/jetbrains/jet/j2k/ast/File.java @@ -25,8 +25,7 @@ public class File extends Node { final String common = AstUtil.joinNodes(myImports, N) + N2 + AstUtil.joinNodes(myClasses, N) + N; if (myPackageName.isEmpty()) return common; - return "namespace" + SPACE + myPackageName + SPACE + "{" + N + - common + - "}"; + return "namespace" + SPACE + myPackageName + N + + common; } } diff --git a/testData/ast/constructors/file/customerBuilder.kt b/testData/ast/constructors/file/customerBuilder.kt index cf263799a68..7218a7f38bf 100644 --- a/testData/ast/constructors/file/customerBuilder.kt +++ b/testData/ast/constructors/file/customerBuilder.kt @@ -1,4 +1,4 @@ -namespace org.test.customer { +namespace org.test.customer open class Customer(first : String?, last : String?) { public val _firstName : String? public val _lastName : String? @@ -42,5 +42,4 @@ System.out?.println(customer?.getFirstName()) System.out?.println(customer?.getLastName()) } } -} } \ No newline at end of file diff --git a/testData/ast/file/file/packageWithClass.kt b/testData/ast/file/file/packageWithClass.kt index 48abf7a9bbf..8b169b30b42 100644 --- a/testData/ast/file/file/packageWithClass.kt +++ b/testData/ast/file/file/packageWithClass.kt @@ -1,4 +1,3 @@ -namespace test { +namespace test class C() { -} } \ No newline at end of file diff --git a/testData/ast/file/file/packageWithImports.kt b/testData/ast/file/file/packageWithImports.kt index 1cb4a91ba46..076ff7373a9 100644 --- a/testData/ast/file/file/packageWithImports.kt +++ b/testData/ast/file/file/packageWithImports.kt @@ -1,4 +1,3 @@ -namespace test { +namespace test import ast -import ast2 -} \ No newline at end of file +import ast2 \ No newline at end of file diff --git a/testData/ast/file/file/packageWithMixedImports.kt b/testData/ast/file/file/packageWithMixedImports.kt index 1cb4a91ba46..076ff7373a9 100644 --- a/testData/ast/file/file/packageWithMixedImports.kt +++ b/testData/ast/file/file/packageWithMixedImports.kt @@ -1,4 +1,3 @@ -namespace test { +namespace test import ast -import ast2 -} \ No newline at end of file +import ast2 \ No newline at end of file diff --git a/testData/ast/file/file/packageWithOpenClass.kt b/testData/ast/file/file/packageWithOpenClass.kt index e229fa8c6ee..37c1f1c767f 100644 --- a/testData/ast/file/file/packageWithOpenClass.kt +++ b/testData/ast/file/file/packageWithOpenClass.kt @@ -1,4 +1,3 @@ -namespace test { +namespace test open class C() { -} } \ No newline at end of file diff --git a/testData/ast/file/file/packageWithStaticImports.kt b/testData/ast/file/file/packageWithStaticImports.kt index 1cb4a91ba46..076ff7373a9 100644 --- a/testData/ast/file/file/packageWithStaticImports.kt +++ b/testData/ast/file/file/packageWithStaticImports.kt @@ -1,4 +1,3 @@ -namespace test { +namespace test import ast -import ast2 -} \ No newline at end of file +import ast2 \ No newline at end of file diff --git a/testData/ast/importStatement/file/importWithKeywords.kt b/testData/ast/importStatement/file/importWithKeywords.kt index 3720bbfeabc..f5babdc556c 100644 --- a/testData/ast/importStatement/file/importWithKeywords.kt +++ b/testData/ast/importStatement/file/importWithKeywords.kt @@ -1,5 +1,4 @@ -namespace test { +namespace test import `namespace`.`as`.`type`.`val`.`var`.`fun`.`is`.`in`.`object`.`when`.`trait`.`This` open class Test() { -} } \ No newline at end of file diff --git a/testData/ast/importStatement/file/importWithStar.kt b/testData/ast/importStatement/file/importWithStar.kt index 65cc2f10c67..ad30b8594cb 100644 --- a/testData/ast/importStatement/file/importWithStar.kt +++ b/testData/ast/importStatement/file/importWithStar.kt @@ -1,5 +1,4 @@ -namespace org.jetbrains.jet.j2k { +namespace org.jetbrains.jet.j2k import org.jetbrains.annotations.* public open class Converter() { -} } \ No newline at end of file diff --git a/testData/ast/importStatement/file/simpleImport.kt b/testData/ast/importStatement/file/simpleImport.kt index 0a97e34e764..dcead7d53b8 100644 --- a/testData/ast/importStatement/file/simpleImport.kt +++ b/testData/ast/importStatement/file/simpleImport.kt @@ -1,5 +1,4 @@ -namespace org.jetbrains.jet.j2k { +namespace org.jetbrains.jet.j2k import org.jetbrains.annotations.NotNull public open class Converter() { -} } \ No newline at end of file diff --git a/testData/ast/methodCallExpression/file/genericMethod.kt b/testData/ast/methodCallExpression/file/genericMethod.kt index f965f4e78e5..eb9f546267f 100644 --- a/testData/ast/methodCallExpression/file/genericMethod.kt +++ b/testData/ast/methodCallExpression/file/genericMethod.kt @@ -1,4 +1,4 @@ -namespace demo { +namespace demo open class Map() { open fun put(k : K?, v : V?) : Unit { } @@ -8,5 +8,4 @@ open fun test() : Unit { var m : Map? = Map() m?.put("10", 10) } -} } \ No newline at end of file diff --git a/testData/ast/newClassExpression/file/fullQualifiedName.kt b/testData/ast/newClassExpression/file/fullQualifiedName.kt index 18839b09afd..6f47648c18f 100644 --- a/testData/ast/newClassExpression/file/fullQualifiedName.kt +++ b/testData/ast/newClassExpression/file/fullQualifiedName.kt @@ -1,8 +1,7 @@ -namespace test { +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/fullQualifiedName2.kt b/testData/ast/newClassExpression/file/fullQualifiedName2.kt index 474fda2fcd5..694d09886dc 100644 --- a/testData/ast/newClassExpression/file/fullQualifiedName2.kt +++ b/testData/ast/newClassExpression/file/fullQualifiedName2.kt @@ -1,7 +1,6 @@ -namespace test { +namespace test open class User() { open fun main() : Unit { var list : java.util.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 26ff7b2cf9e..c60db08ecaa 100644 --- a/testData/ast/newClassExpression/file/newClassByFullName.kt +++ b/testData/ast/newClassExpression/file/newClassByFullName.kt @@ -1,9 +1,8 @@ -namespace org.test { +namespace org.test open class Library() { } open class User() { open fun main() : Unit { var lib : Library? = Library() } -} } \ No newline at end of file diff --git a/testData/ast/newClassExpression/file/newInnerClass.kt b/testData/ast/newClassExpression/file/newInnerClass.kt index 497bc0514cd..b3bbbdf8623 100644 --- a/testData/ast/newClassExpression/file/newInnerClass.kt +++ b/testData/ast/newClassExpression/file/newInnerClass.kt @@ -1,4 +1,4 @@ -namespace org.test { +namespace org.test open class OuterClass() { open class InnerClass() { } @@ -8,5 +8,4 @@ open fun main() : Unit { var outerObject : OuterClass? = OuterClass() var innerObject : OuterClass.InnerClass? = outerObject?.InnerClass() } -} } \ No newline at end of file diff --git a/testData/ast/newClassExpression/file/newListAndNewMember.kt b/testData/ast/newClassExpression/file/newListAndNewMember.kt index 0c6c5e4a59d..a13a2515a54 100644 --- a/testData/ast/newClassExpression/file/newListAndNewMember.kt +++ b/testData/ast/newClassExpression/file/newListAndNewMember.kt @@ -1,4 +1,4 @@ -namespace org.test { +namespace org.test import java.util.List import java.util.LinkedList open class Member() { @@ -8,5 +8,4 @@ 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.kt b/testData/ast/newClassExpression/file/newStaticInnerClass.kt index 8adc33c21a5..61338ae3cfc 100644 --- a/testData/ast/newClassExpression/file/newStaticInnerClass.kt +++ b/testData/ast/newClassExpression/file/newStaticInnerClass.kt @@ -1,4 +1,4 @@ -namespace demo { +namespace demo open class Foo() { class object { open class Bar() { @@ -9,5 +9,4 @@ open class User() { open fun main() : Unit { var boo : Foo.Bar? = Foo.Bar() } -} } \ No newline at end of file diff --git a/testData/ast/objectLiteral/file/MyFrame.kt b/testData/ast/objectLiteral/file/MyFrame.kt index 834758deae5..4c39ca14713 100644 --- a/testData/ast/objectLiteral/file/MyFrame.kt +++ b/testData/ast/objectLiteral/file/MyFrame.kt @@ -1,4 +1,4 @@ -namespace demo { +namespace demo import java.awt.* import java.awt.event.* import java.io.* @@ -17,5 +17,4 @@ dispose() } }) } -} } \ No newline at end of file diff --git a/testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.kt b/testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.kt index 9700c7d464f..d4534115df5 100644 --- a/testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.kt +++ b/testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.kt @@ -1,6 +1,5 @@ -namespace org.jetbrains.jet.j2k.`in` { +namespace org.jetbrains.jet.j2k.`in` import org.jetbrains.annotations.NotNull import org.jetbrains.annotations.Nullable public open class Converter() { -} } \ No newline at end of file diff --git a/testData/ast/rawGenerics/file/kt-540-rawGenericClass.kt b/testData/ast/rawGenerics/file/kt-540-rawGenericClass.kt index ebf7822a53e..3fd7726bfd0 100644 --- a/testData/ast/rawGenerics/file/kt-540-rawGenericClass.kt +++ b/testData/ast/rawGenerics/file/kt-540-rawGenericClass.kt @@ -1,4 +1,4 @@ -namespace demo { +namespace demo open class Collection(e : E?) { { System.out?.println(e) @@ -10,5 +10,4 @@ var raw1 : Collection<*>? = Collection(1) var raw2 : Collection<*>? = Collection(1) var raw3 : Collection<*>? = Collection("1") } -} } \ No newline at end of file diff --git a/testData/ast/rawGenerics/file/kt-540.kt b/testData/ast/rawGenerics/file/kt-540.kt index 7d2290afbf1..bf2f869cf42 100644 --- a/testData/ast/rawGenerics/file/kt-540.kt +++ b/testData/ast/rawGenerics/file/kt-540.kt @@ -1,4 +1,4 @@ -namespace demo { +namespace demo import java.util.List import java.util.LinkedList open class Test() { @@ -7,5 +7,4 @@ var common : List? = LinkedList() var raw : List<*>? = LinkedList() var superRaw : List<*>? = LinkedList() } -} } \ No newline at end of file diff --git a/testData/ast/rawGenerics/file/rawGenericMethod.kt b/testData/ast/rawGenerics/file/rawGenericMethod.kt index 7372f4e257d..bce70b24a11 100644 --- a/testData/ast/rawGenerics/file/rawGenericMethod.kt +++ b/testData/ast/rawGenerics/file/rawGenericMethod.kt @@ -1,4 +1,4 @@ -namespace demo { +namespace demo open class TestT() { open fun getT() : Unit { } @@ -10,5 +10,4 @@ t?.getT() t?.getT() t?.getT() } -} } \ No newline at end of file From d7e06aeb6a69a6130f0e799d1ffdafedc3457324 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 22 Nov 2011 14:25:28 +0400 Subject: [PATCH 127/206] cleanup --- src/org/jetbrains/jet/j2k/ast/Class.java | 6 +++--- .../jet/j2k/ast/DeclarationStatement.java | 2 +- .../jetbrains/jet/j2k/ast/IdentifierImpl.java | 2 +- .../jet/j2k/ast/MethodCallExpression.java | 2 +- .../jet/j2k/ast/ReferenceElement.java | 4 ++-- .../jet/j2k/visitors/ExpressionVisitor.java | 21 ++++++++++--------- 6 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java index 2e8daa79fa9..2bff21daaa7 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -18,7 +18,7 @@ public class Class extends Member { String TYPE = "class"; final Identifier myName; private final List myBaseClassParams; - private List myMembers; + private final List myMembers; private final List myTypeParameters; private final List myExtendsTypes; private final List myImplementsTypes; @@ -174,7 +174,7 @@ public class Class extends Member { "}"; } - private List getStatic(List members) { + private static List getStatic(List members) { List result = new LinkedList(); for (Member m : members) if (m.isStatic()) @@ -182,7 +182,7 @@ public class Class extends Member { return result; } - private List getNonStatic(List members) { + private static List getNonStatic(List members) { List result = new LinkedList(); for (Member m : members) if (!m.isStatic()) diff --git a/src/org/jetbrains/jet/j2k/ast/DeclarationStatement.java b/src/org/jetbrains/jet/j2k/ast/DeclarationStatement.java index d38956881da..756153ac13d 100644 --- a/src/org/jetbrains/jet/j2k/ast/DeclarationStatement.java +++ b/src/org/jetbrains/jet/j2k/ast/DeclarationStatement.java @@ -16,7 +16,7 @@ public class DeclarationStatement extends Statement { myElements = elements; } - private List toStringList(List elements) { + private static List toStringList(List elements) { List result = new LinkedList(); for (Element e : elements) { if (e instanceof LocalVariable) { diff --git a/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java b/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java index 4fcfcd6ebb2..c487cfb5fff 100644 --- a/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java +++ b/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java @@ -30,7 +30,7 @@ public class IdentifierImpl extends Expression implements Identifier { return myName.length() == 0; } - private String quote(String str) { + private static String quote(String str) { return BACKTICK + str + BACKTICK; } diff --git a/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java b/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java index c190d546d9c..0c8a1d21536 100644 --- a/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java @@ -12,7 +12,7 @@ public class MethodCallExpression extends Expression { private final Expression myMethodCall; private final Element myParamList; private final boolean myIsResultNullable; - private List myTypeParameters; + private final List myTypeParameters; public MethodCallExpression(Expression methodCall, Element paramList, boolean nullable, List typeParameters) { myMethodCall = methodCall; diff --git a/src/org/jetbrains/jet/j2k/ast/ReferenceElement.java b/src/org/jetbrains/jet/j2k/ast/ReferenceElement.java index 21210a994ea..c557edf4065 100644 --- a/src/org/jetbrains/jet/j2k/ast/ReferenceElement.java +++ b/src/org/jetbrains/jet/j2k/ast/ReferenceElement.java @@ -9,8 +9,8 @@ import java.util.List; * @author ignatov */ public class ReferenceElement extends Element { - private Identifier myReference; - private List myTypes; + private final Identifier myReference; + private final List myTypes; public ReferenceElement(@NotNull Identifier reference, @NotNull List types) { myReference = reference; diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index dcf71736c8b..126a1b1653c 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -77,7 +77,7 @@ public class ExpressionVisitor extends StatementVisitor { } @NotNull - private String getOperatorString(@NotNull IElementType tokenType) { + private static String getOperatorString(@NotNull IElementType tokenType) { if (tokenType == JavaTokenType.PLUS) return "+"; if (tokenType == JavaTokenType.MINUS) return "-"; if (tokenType == JavaTokenType.ASTERISK) return "*"; @@ -197,7 +197,7 @@ public class ExpressionVisitor extends StatementVisitor { } @NotNull - private Expression createNewClassExpression(@NotNull PsiNewExpression expression) { + private static Expression createNewClassExpression(@NotNull PsiNewExpression expression) { final PsiAnonymousClass anonymousClass = expression.getAnonymousClass(); final PsiMethod constructor = expression.resolveMethod(); if (constructor == null || isConstructorPrimary(constructor)) { @@ -209,7 +209,8 @@ public class ExpressionVisitor extends StatementVisitor { ); } // is constructor secondary - final List typeParameters = expression.getClassReference() != null ? typesToTypeList(expression.getClassReference().getTypeParameters()) : Collections.emptyList(); + final PsiJavaCodeReferenceElement reference = expression.getClassReference(); + final List typeParameters = reference != null ? typesToTypeList(reference.getTypeParameters()) : Collections.emptyList(); return new CallChainExpression( new IdentifierImpl(constructor.getName(), false), new MethodCallExpression( @@ -220,7 +221,7 @@ public class ExpressionVisitor extends StatementVisitor { } @NotNull - private NewClassExpression createNewNonEmptyArray(@NotNull PsiNewExpression expression) { + private static NewClassExpression createNewNonEmptyArray(@NotNull PsiNewExpression expression) { final List callExpression = expressionsToExpressionList(expression.getArrayDimensions()); callExpression.add(new IdentifierImpl("{null}")); // TODO: remove return new NewClassExpression( @@ -291,7 +292,7 @@ public class ExpressionVisitor extends StatementVisitor { } @NotNull - private String getClassName(PsiReferenceExpression expression) { + private static String getClassName(@NotNull PsiReferenceExpression expression) { PsiElement context = expression.getContext(); while (context != null) { if (context instanceof PsiMethod && ((PsiMethod) context).isConstructor()) { @@ -307,7 +308,7 @@ public class ExpressionVisitor extends StatementVisitor { return ""; } - private boolean isFieldReference(PsiReferenceExpression expression, PsiClass currentClass) { + private static boolean isFieldReference(@NotNull PsiReferenceExpression expression, PsiClass currentClass) { final PsiReference reference = expression.getReference(); if (reference != null) { final PsiElement resolvedReference = reference.resolve(); @@ -320,7 +321,7 @@ public class ExpressionVisitor extends StatementVisitor { return false; } - private boolean isInsideSecondaryConstructor(PsiReferenceExpression expression) { + private static boolean isInsideSecondaryConstructor(PsiReferenceExpression expression) { PsiElement context = expression.getContext(); while (context != null) { if (context instanceof PsiMethod && ((PsiMethod) context).isConstructor()) @@ -330,7 +331,7 @@ public class ExpressionVisitor extends StatementVisitor { return false; } - private boolean isInsidePrimaryConstructor(PsiExpression expression) { + private static boolean isInsidePrimaryConstructor(PsiExpression expression) { PsiElement context = expression.getContext(); while (context != null) { if (context instanceof PsiMethod && ((PsiMethod) context).isConstructor()) @@ -341,7 +342,7 @@ public class ExpressionVisitor extends StatementVisitor { } @Nullable - private PsiClass getContainingClass(@NotNull PsiExpression expression) { + private static PsiClass getContainingClass(@NotNull PsiExpression expression) { PsiElement context = expression.getContext(); while (context != null) { if (context instanceof PsiMethod && ((PsiMethod) context).isConstructor()) @@ -351,7 +352,7 @@ public class ExpressionVisitor extends StatementVisitor { return null; } - private boolean isThisExpression(PsiReferenceExpression expression) { + private static boolean isThisExpression(PsiReferenceExpression expression) { for (PsiReference r : expression.getReferences()) if (r.getCanonicalText().equals("this")) { final PsiElement res = r.resolve(); From 75a4d34da7b48fbfcd114307a5d0ad1718b4bf30 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 23 Nov 2011 13:22:33 +0400 Subject: [PATCH 128/206] KT-584 Convert C-style for statement more correctly --- .../j2k/ast/ForeachWithRangeStatement.java | 29 ++++++++ .../jet/j2k/visitors/StatementVisitor.java | 70 ++++++++++++++++--- testData/ast/for/statement/forRangeWithLE.jav | 2 + testData/ast/for/statement/forRangeWithLE.kt | 4 ++ testData/ast/for/statement/forRangeWithLT.jav | 2 + testData/ast/for/statement/forRangeWithLT.kt | 4 ++ testData/ast/for/statement/forWithBlock.jav | 3 +- testData/ast/for/statement/forWithBlock.kt | 15 +--- .../ast/for/statement/forWithExpression.kt | 11 +-- .../complicatedExampleFromJavaTutorial.kt | 11 +-- 10 files changed, 109 insertions(+), 42 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/ForeachWithRangeStatement.java create mode 100644 testData/ast/for/statement/forRangeWithLE.jav create mode 100644 testData/ast/for/statement/forRangeWithLE.kt create mode 100644 testData/ast/for/statement/forRangeWithLT.jav create mode 100644 testData/ast/for/statement/forRangeWithLT.kt diff --git a/src/org/jetbrains/jet/j2k/ast/ForeachWithRangeStatement.java b/src/org/jetbrains/jet/j2k/ast/ForeachWithRangeStatement.java new file mode 100644 index 00000000000..b5669d33a68 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/ForeachWithRangeStatement.java @@ -0,0 +1,29 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class ForeachWithRangeStatement extends Statement { + private Expression myStart; + private IdentifierImpl myIdentifier; + private Expression myEnd; + private Statement myBody; + + public ForeachWithRangeStatement(IdentifierImpl identifier, Expression start, Expression end, Statement body) { + myStart = start; + myIdentifier = identifier; + myEnd = end; + myBody = body; + } + + @NotNull + @Override + public String toKotlin() { + return "for" + SPACE + "(" + + myIdentifier.toKotlin() + SPACE + "in" + SPACE + myStart.toKotlin() + ".." + myEnd.toKotlin() + + ")" + SPACE + + myBody.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index a61f0fc7f37..cd26ad0f662 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -1,6 +1,9 @@ package org.jetbrains.jet.j2k.visitors; import com.intellij.psi.*; +import com.intellij.psi.search.searches.ReferencesSearch; +import com.intellij.psi.tree.IElementType; +import com.intellij.psi.util.PsiUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.j2k.ast.*; @@ -93,17 +96,66 @@ public class StatementVisitor extends ElementVisitor { } @Override - public void visitForStatement(PsiForStatement statement) { + public void visitForStatement(@NotNull PsiForStatement statement) { super.visitForStatement(statement); - List forStatements = new LinkedList(); - forStatements.add(statementToStatement(statement.getInitialization())); - forStatements.add(new WhileStatement( - expressionToExpression(statement.getCondition()), - new Block( - Arrays.asList(statementToStatement(statement.getBody()), - new Block(Arrays.asList(statementToStatement(statement.getUpdate()))))))); - myResult = new Block(forStatements); + final PsiStatement initialization = statement.getInitialization(); + final PsiStatement update = statement.getUpdate(); + final PsiExpression condition = statement.getCondition(); + final PsiLocalVariable firstChild = initialization != null && initialization.getFirstChild() instanceof PsiLocalVariable ? + (PsiLocalVariable) initialization.getFirstChild() : null; + + final IElementType operationTokenType = condition != null && condition instanceof PsiBinaryExpression ? + ((PsiBinaryExpression) condition).getOperationTokenType() : null; + if ( + initialization != null && + initialization instanceof PsiDeclarationStatement + && initialization.getFirstChild() == initialization.getLastChild() + && condition != null + && update != null + && update.getChildren().length == 1 + && update.getChildren()[0] instanceof PsiPostfixExpression + && ((PsiPostfixExpression) update.getChildren()[0]).getOperationTokenType() == JavaTokenType.PLUSPLUS + && operationTokenType != null + && (operationTokenType == JavaTokenType.LT || operationTokenType == JavaTokenType.LE) + && initialization.getFirstChild() != null + && initialization.getFirstChild() instanceof PsiLocalVariable + && firstChild != null + && firstChild.getNameIdentifier() != null + && isOnceWritableIterator(firstChild) + ) { + final Expression end = expressionToExpression(((PsiBinaryExpression) condition).getROperand()); + final Expression endExpression = operationTokenType == JavaTokenType.LT ? + new BinaryExpression(end, new IdentifierImpl("1"), "-"): + end; + myResult = new ForeachWithRangeStatement( + new IdentifierImpl(firstChild.getName()), + expressionToExpression(firstChild.getInitializer()), + endExpression, + statementToStatement(statement.getBody()) + ); + } else { // common case: while loop instead of for loop + List forStatements = new LinkedList(); + forStatements.add(statementToStatement(initialization)); + forStatements.add(new WhileStatement( + expressionToExpression(condition), + new Block( + Arrays.asList(statementToStatement(statement.getBody()), + new Block(Arrays.asList(statementToStatement(update))))))); + myResult = new Block(forStatements); + } + } + + private static boolean isOnceWritableIterator(PsiLocalVariable firstChild) { + int counter = 0; + if (firstChild != null) + for (PsiReference r : (ReferencesSearch.search(firstChild))) { + if (r instanceof PsiExpression) { + if (PsiUtil.isAccessedForWriting((PsiExpression) r)) + counter++; + } + } + return counter == 1; // only increment usage } @Override diff --git a/testData/ast/for/statement/forRangeWithLE.jav b/testData/ast/for/statement/forRangeWithLE.jav new file mode 100644 index 00000000000..a0069d48943 --- /dev/null +++ b/testData/ast/for/statement/forRangeWithLE.jav @@ -0,0 +1,2 @@ +int[] array = new int[10]; +for (int i = 0; i <= 10; i++) {array[i] = i;} \ No newline at end of file diff --git a/testData/ast/for/statement/forRangeWithLE.kt b/testData/ast/for/statement/forRangeWithLE.kt new file mode 100644 index 00000000000..125e3d65192 --- /dev/null +++ b/testData/ast/for/statement/forRangeWithLE.kt @@ -0,0 +1,4 @@ +var array : IntArray? = IntArray?(10, {null}) +for (i in 0..10) { +array[i] = i +} \ No newline at end of file diff --git a/testData/ast/for/statement/forRangeWithLT.jav b/testData/ast/for/statement/forRangeWithLT.jav new file mode 100644 index 00000000000..19b24cf03fb --- /dev/null +++ b/testData/ast/for/statement/forRangeWithLT.jav @@ -0,0 +1,2 @@ +int[] array = new int[10]; +for (int i = 0; i < 10; i++) {array[i] = i;} \ No newline at end of file diff --git a/testData/ast/for/statement/forRangeWithLT.kt b/testData/ast/for/statement/forRangeWithLT.kt new file mode 100644 index 00000000000..a5a4520c43a --- /dev/null +++ b/testData/ast/for/statement/forRangeWithLT.kt @@ -0,0 +1,4 @@ +var array : IntArray? = IntArray?(10, {null}) +for (i in 0..(10 - 1)) { +array[i] = i +} \ No newline at end of file diff --git a/testData/ast/for/statement/forWithBlock.jav b/testData/ast/for/statement/forWithBlock.jav index b470371f4a3..19b24cf03fb 100644 --- a/testData/ast/for/statement/forWithBlock.jav +++ b/testData/ast/for/statement/forWithBlock.jav @@ -1 +1,2 @@ -for (int i = 0; i < 0; i++) {int i = 1; i++;} \ No newline at end of file +int[] array = new int[10]; +for (int i = 0; i < 10; i++) {array[i] = i;} \ No newline at end of file diff --git a/testData/ast/for/statement/forWithBlock.kt b/testData/ast/for/statement/forWithBlock.kt index 2ed9ae1e9a0..a5a4520c43a 100644 --- a/testData/ast/for/statement/forWithBlock.kt +++ b/testData/ast/for/statement/forWithBlock.kt @@ -1,13 +1,4 @@ -{ -var i : Int = 0 -while ((i < 0)) -{ -{ -var i : Int = 1 -(i++) -} -{ -(i++) -} -} +var array : IntArray? = IntArray?(10, {null}) +for (i in 0..(10 - 1)) { +array[i] = i } \ No newline at end of file diff --git a/testData/ast/for/statement/forWithExpression.kt b/testData/ast/for/statement/forWithExpression.kt index 2fa4c89935e..6333d6a9828 100644 --- a/testData/ast/for/statement/forWithExpression.kt +++ b/testData/ast/for/statement/forWithExpression.kt @@ -1,10 +1 @@ -{ -var i : Int = 0 -while ((i < 0)) -{ -(t++) -{ -(i++) -} -} -} \ No newline at end of file +for (i in 0..(0 - 1)) (t++) \ No newline at end of file diff --git a/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.kt b/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.kt index fbdba6d9552..f636c05dd7f 100644 --- a/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.kt +++ b/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.kt @@ -1,8 +1,4 @@ -@test { -var i : Int = 0 -while ((i <= max)) -{ -{ +@test for (i in 0..max) { var n : Int = substring.length() var j : Int = i var k : Int = 0 @@ -16,11 +12,6 @@ continue@test foundIt = true break@test } -{ -(i++) -} -} -} System.out?.println((if (foundIt) "Found it" else From f8aa6c727b34a95f3aff3037553b7e334dd62752 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 23 Nov 2011 13:30:07 +0400 Subject: [PATCH 129/206] cleanup --- .../jetbrains/jet/j2k/JavaToKotlinConverterTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java index b67404fa11c..e33825f9fdd 100644 --- a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java +++ b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java @@ -92,18 +92,18 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { return suite; } - void configureFromText(String text) throws IOException { + static void configureFromText(String text) throws IOException { configureFromFileText("test.java", text); } @NotNull - String fileToKotlin(String text) throws IOException { + static String fileToKotlin(String text) throws IOException { configureFromText(text); return prettify(Converter.fileToFile((PsiJavaFile) myFile).toKotlin()); } @NotNull - String methodToKotlin(String text) throws IOException { + static String methodToKotlin(String text) throws IOException { String result = fileToKotlin("final class C {" + text + "}") .replaceAll("class C\\(\\) \\{", ""); result = result.substring(0, result.lastIndexOf("}")); @@ -111,7 +111,7 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { } @NotNull - String statementToKotlin(String text) throws Exception { + static String statementToKotlin(String text) throws Exception { String result = methodToKotlin("void main() {" + text + "}"); int pos = result.lastIndexOf("}"); result = result.substring(0, pos).replaceFirst("open fun main\\(\\) : Unit \\{", ""); @@ -119,7 +119,7 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { } @NotNull - String expressionToKotlin(String code) throws Exception { + static String expressionToKotlin(String code) throws Exception { String result = statementToKotlin("Object o =" + code + "}"); result = result.replaceFirst("var o : Any\\? =", ""); return prettify(result); From 428d6ecfaed08c8bf68fc76bc2d253305a89ebce Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 23 Nov 2011 13:52:46 +0400 Subject: [PATCH 130/206] test for object literal updated --- testData/ast/objectLiteral/file/MyFrame.jav | 14 ++++++-------- testData/ast/objectLiteral/file/MyFrame.kt | 14 ++++++-------- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/testData/ast/objectLiteral/file/MyFrame.jav b/testData/ast/objectLiteral/file/MyFrame.jav index 08b872f1f65..28e0dbef4de 100644 --- a/testData/ast/objectLiteral/file/MyFrame.jav +++ b/testData/ast/objectLiteral/file/MyFrame.jav @@ -1,16 +1,15 @@ package demo; -import java.awt.*; -import java.awt.event.*; -import java.io.*; -import java.net.*; +class WindowAdapter { + public void windowClosing () { + } +} public final class Client extends Frame { Client() { WindowAdapter a = new WindowAdapter() { @Override - public void windowClosing (WindowEvent e) { - dispose(); + public void windowClosing () { } } @@ -18,8 +17,7 @@ public final class Client extends Frame { addWindowListener(new WindowAdapter() { @Override - public void windowClosing (WindowEvent e) { - dispose(); + public void windowClosing () { } }); } diff --git a/testData/ast/objectLiteral/file/MyFrame.kt b/testData/ast/objectLiteral/file/MyFrame.kt index 4c39ca14713..1957f66f297 100644 --- a/testData/ast/objectLiteral/file/MyFrame.kt +++ b/testData/ast/objectLiteral/file/MyFrame.kt @@ -1,19 +1,17 @@ namespace demo -import java.awt.* -import java.awt.event.* -import java.io.* -import java.net.* +open class WindowAdapter() { +open public fun windowClosing() : Unit { +} +} public class Client() : Frame() { { var a : WindowAdapter? = object : WindowAdapter() { -open public fun windowClosing(e : WindowEvent?) : Unit { -dispose() +override public fun windowClosing() : Unit { } } addWindowListener(a) addWindowListener(object : WindowAdapter() { -open public fun windowClosing(e : WindowEvent?) : Unit { -dispose() +override public fun windowClosing() : Unit { } }) } From 242daa8e17775170152c007e417dbd2ddde0c2ff Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 23 Nov 2011 14:12:04 +0400 Subject: [PATCH 131/206] KT-595 Don't create open functions in open classes --- src/org/jetbrains/jet/j2k/Converter.java | 5 +++++ src/org/jetbrains/jet/j2k/ast/Function.java | 3 +++ src/org/jetbrains/jet/j2k/ast/Modifier.java | 1 + test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java | 2 +- testData/ast/arrayType/method/methodArrayArgs.kt | 2 +- testData/ast/class/class/classWithEmptyMethods.kt | 6 +++--- testData/ast/class/class/oneStaticFieldOneNonStatic.kt | 2 +- testData/ast/class/class/oneStaticMethod.kt | 2 +- testData/ast/class/class/oneStaticMethodOneNonStatic.kt | 4 ++-- testData/ast/class/class/twoStaticMethod.kt | 4 ++-- testData/ast/function/file/functionInFinalClass.jav | 5 +++++ testData/ast/function/file/functionInFinalClass.kt | 5 +++++ testData/ast/function/method/abstractMethod.kt | 2 +- testData/ast/function/method/classGenericParam.kt | 2 +- testData/ast/function/method/emptyVoidMethod.kt | 2 +- testData/ast/function/method/internal.kt | 2 +- testData/ast/function/method/main.kt | 2 +- testData/ast/function/method/methodClassType.kt | 2 +- testData/ast/function/method/methodPrimitiveType.kt | 2 +- testData/ast/function/method/methodPrimitiveType2.kt | 2 +- testData/ast/function/method/methodWithReturnStatement.kt | 2 +- testData/ast/function/method/open.kt | 2 +- testData/ast/function/method/ownGenericParam.kt | 2 +- testData/ast/function/method/ownSeveralGenericParams.kt | 2 +- testData/ast/function/method/private.kt | 2 +- testData/ast/function/method/protected.kt | 2 +- testData/ast/function/method/public.kt | 2 +- testData/ast/inProjectionType/method/methodParams.kt | 2 +- testData/ast/outProjectionType/method/methodParams.kt | 2 +- testData/ast/starProjectionType/method/methodParams.kt | 2 +- .../method/methodDoubleParametrizationWithTwoBounds.kt | 2 +- testData/ast/typeParameters/method/where.kt | 2 +- testData/ast/varArg/method/ellipsisTypeSeveralParams.kt | 2 +- testData/ast/varArg/method/ellipsisTypeSingleParams.kt | 2 +- 34 files changed, 52 insertions(+), 33 deletions(-) create mode 100644 testData/ast/function/file/functionInFinalClass.jav create mode 100644 testData/ast/function/file/functionInFinalClass.kt diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 0cd3dbf7dcb..bfbdb2cece4 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -274,6 +274,11 @@ public class Converter { modifiers.add(Modifier.OVERRIDE); if (method.getParent() instanceof PsiClass && ((PsiClass) method.getParent()).isInterface()) modifiers.remove(Modifier.ABSTRACT); + if (method.getParent() instanceof PsiClass) { + final PsiModifierList parentModifierList = ((PsiClass) method.getParent()).getModifierList(); + if (parentModifierList != null && parentModifierList.hasExplicitModifier(Modifier.FINAL)) + modifiers.add(Modifier.NOT_OPEN); + } if (method.isConstructor()) { // TODO: simplify boolean isPrimary = isConstructorPrimary(method); diff --git a/src/org/jetbrains/jet/j2k/ast/Function.java b/src/org/jetbrains/jet/j2k/ast/Function.java index 8bf2649aaa6..36545c0948b 100644 --- a/src/org/jetbrains/jet/j2k/ast/Function.java +++ b/src/org/jetbrains/jet/j2k/ast/Function.java @@ -78,6 +78,9 @@ public class Function extends Member { if (!myModifiers.contains(Modifier.OVERRIDE) && !myModifiers.contains(Modifier.FINAL)) modifierList.add(Modifier.OPEN); + if (myModifiers.contains(Modifier.NOT_OPEN)) + modifierList.remove(Modifier.OPEN); + modifierList.add(accessModifier()); if (modifierList.size() > 0) diff --git a/src/org/jetbrains/jet/j2k/ast/Modifier.java b/src/org/jetbrains/jet/j2k/ast/Modifier.java index 31a85df152a..92920946ae2 100644 --- a/src/org/jetbrains/jet/j2k/ast/Modifier.java +++ b/src/org/jetbrains/jet/j2k/ast/Modifier.java @@ -12,5 +12,6 @@ public abstract class Modifier { public static final String ABSTRACT = "abstract"; public static final String FINAL = "final"; public static final String OPEN = "open"; + public static final String NOT_OPEN = "not open"; public static final String OVERRIDE = "override"; } diff --git a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java index e33825f9fdd..2a205a86981 100644 --- a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java +++ b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java @@ -114,7 +114,7 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { static String statementToKotlin(String text) throws Exception { String result = methodToKotlin("void main() {" + text + "}"); int pos = result.lastIndexOf("}"); - result = result.substring(0, pos).replaceFirst("open fun main\\(\\) : Unit \\{", ""); + result = result.substring(0, pos).replaceFirst("fun main\\(\\) : Unit \\{", ""); return prettify(result); } diff --git a/testData/ast/arrayType/method/methodArrayArgs.kt b/testData/ast/arrayType/method/methodArrayArgs.kt index 0eadd674755..b095e2dd099 100644 --- a/testData/ast/arrayType/method/methodArrayArgs.kt +++ b/testData/ast/arrayType/method/methodArrayArgs.kt @@ -1,2 +1,2 @@ -open fun fromArrayToCollection(a : Array?) : Unit { +fun fromArrayToCollection(a : Array?) : Unit { } \ No newline at end of file diff --git a/testData/ast/class/class/classWithEmptyMethods.kt b/testData/ast/class/class/classWithEmptyMethods.kt index d92d545ffa0..18ced74776d 100644 --- a/testData/ast/class/class/classWithEmptyMethods.kt +++ b/testData/ast/class/class/classWithEmptyMethods.kt @@ -1,8 +1,8 @@ class T() { -open fun main() : Unit { +fun main() : Unit { } -open fun i() : Int { +fun i() : Int { } -open fun s() : String? { +fun s() : String? { } } \ No newline at end of file diff --git a/testData/ast/class/class/oneStaticFieldOneNonStatic.kt b/testData/ast/class/class/oneStaticFieldOneNonStatic.kt index fe55d4cafd3..7be6598f76a 100644 --- a/testData/ast/class/class/oneStaticFieldOneNonStatic.kt +++ b/testData/ast/class/class/oneStaticFieldOneNonStatic.kt @@ -1,5 +1,5 @@ class S() { -open fun sB() : Boolean { +fun sB() : Boolean { return true } class object { diff --git a/testData/ast/class/class/oneStaticMethod.kt b/testData/ast/class/class/oneStaticMethod.kt index 6906f476300..beb564521e3 100644 --- a/testData/ast/class/class/oneStaticMethod.kt +++ b/testData/ast/class/class/oneStaticMethod.kt @@ -1,6 +1,6 @@ class S() { class object { -open fun staticF() : Boolean { +fun staticF() : Boolean { return true } } diff --git a/testData/ast/class/class/oneStaticMethodOneNonStatic.kt b/testData/ast/class/class/oneStaticMethodOneNonStatic.kt index 382ea95f5b0..cb96091ed53 100644 --- a/testData/ast/class/class/oneStaticMethodOneNonStatic.kt +++ b/testData/ast/class/class/oneStaticMethodOneNonStatic.kt @@ -1,9 +1,9 @@ class S() { -open fun sB() : Boolean { +fun sB() : Boolean { return true } class object { -open fun sI() : Int { +fun sI() : Int { return 1 } } diff --git a/testData/ast/class/class/twoStaticMethod.kt b/testData/ast/class/class/twoStaticMethod.kt index 0500e4be576..87bd397e519 100644 --- a/testData/ast/class/class/twoStaticMethod.kt +++ b/testData/ast/class/class/twoStaticMethod.kt @@ -1,9 +1,9 @@ class S() { class object { -open fun sB() : Boolean { +fun sB() : Boolean { return true } -open fun sI() : Int { +fun sI() : Int { return 1 } } diff --git a/testData/ast/function/file/functionInFinalClass.jav b/testData/ast/function/file/functionInFinalClass.jav new file mode 100644 index 00000000000..e8417401a9a --- /dev/null +++ b/testData/ast/function/file/functionInFinalClass.jav @@ -0,0 +1,5 @@ +package demo; + +final class Final { + void test() {} +} \ No newline at end of file diff --git a/testData/ast/function/file/functionInFinalClass.kt b/testData/ast/function/file/functionInFinalClass.kt new file mode 100644 index 00000000000..507b84ba7d4 --- /dev/null +++ b/testData/ast/function/file/functionInFinalClass.kt @@ -0,0 +1,5 @@ +namespace demo +class Final() { +fun test() : Unit { +} +} \ No newline at end of file diff --git a/testData/ast/function/method/abstractMethod.kt b/testData/ast/function/method/abstractMethod.kt index f5e9004be67..8163dfad9bb 100644 --- a/testData/ast/function/method/abstractMethod.kt +++ b/testData/ast/function/method/abstractMethod.kt @@ -1 +1 @@ -abstract open fun getNoofGears() : Int \ No newline at end of file +abstract fun getNoofGears() : Int \ No newline at end of file diff --git a/testData/ast/function/method/classGenericParam.kt b/testData/ast/function/method/classGenericParam.kt index a232b7e30fe..b9ea1d49799 100644 --- a/testData/ast/function/method/classGenericParam.kt +++ b/testData/ast/function/method/classGenericParam.kt @@ -1,2 +1,2 @@ -open fun getT() : T? { +fun getT() : T? { } \ No newline at end of file diff --git a/testData/ast/function/method/emptyVoidMethod.kt b/testData/ast/function/method/emptyVoidMethod.kt index 25bd4ab1d8e..ae299eb173a 100644 --- a/testData/ast/function/method/emptyVoidMethod.kt +++ b/testData/ast/function/method/emptyVoidMethod.kt @@ -1,2 +1,2 @@ -open fun main() : Unit { +fun main() : Unit { } \ No newline at end of file diff --git a/testData/ast/function/method/internal.kt b/testData/ast/function/method/internal.kt index 86f2b8d992f..5b3e9634f3f 100644 --- a/testData/ast/function/method/internal.kt +++ b/testData/ast/function/method/internal.kt @@ -1,2 +1,2 @@ -open fun test() : Unit { +fun test() : Unit { } \ No newline at end of file diff --git a/testData/ast/function/method/main.kt b/testData/ast/function/method/main.kt index 8d173e36a09..164c099f986 100644 --- a/testData/ast/function/method/main.kt +++ b/testData/ast/function/method/main.kt @@ -1,4 +1,4 @@ class object { -open public fun main(args : Array?) : Unit { +public fun main(args : Array?) : Unit { } } \ No newline at end of file diff --git a/testData/ast/function/method/methodClassType.kt b/testData/ast/function/method/methodClassType.kt index ef426384d58..196c45b6bf8 100644 --- a/testData/ast/function/method/methodClassType.kt +++ b/testData/ast/function/method/methodClassType.kt @@ -1,2 +1,2 @@ -open fun main() : String? { +fun main() : String? { } \ No newline at end of file diff --git a/testData/ast/function/method/methodPrimitiveType.kt b/testData/ast/function/method/methodPrimitiveType.kt index 6f5f11b4c16..c6ef43f8a14 100644 --- a/testData/ast/function/method/methodPrimitiveType.kt +++ b/testData/ast/function/method/methodPrimitiveType.kt @@ -1,2 +1,2 @@ -open fun main() : Int { +fun main() : Int { } \ No newline at end of file diff --git a/testData/ast/function/method/methodPrimitiveType2.kt b/testData/ast/function/method/methodPrimitiveType2.kt index d40b67fb1a4..c978e93e7aa 100644 --- a/testData/ast/function/method/methodPrimitiveType2.kt +++ b/testData/ast/function/method/methodPrimitiveType2.kt @@ -1,2 +1,2 @@ -open fun main() : Boolean { +fun main() : Boolean { } \ No newline at end of file diff --git a/testData/ast/function/method/methodWithReturnStatement.kt b/testData/ast/function/method/methodWithReturnStatement.kt index c11bfd3dc43..acfbd1010d8 100644 --- a/testData/ast/function/method/methodWithReturnStatement.kt +++ b/testData/ast/function/method/methodWithReturnStatement.kt @@ -1,3 +1,3 @@ -open fun isTrue() : Boolean { +fun isTrue() : Boolean { return true } \ No newline at end of file diff --git a/testData/ast/function/method/open.kt b/testData/ast/function/method/open.kt index db906a336d7..e6cf12b2b3f 100644 --- a/testData/ast/function/method/open.kt +++ b/testData/ast/function/method/open.kt @@ -1,3 +1,3 @@ -open fun getString() : String? { +fun getString() : String? { return "" } \ No newline at end of file diff --git a/testData/ast/function/method/ownGenericParam.kt b/testData/ast/function/method/ownGenericParam.kt index d2ab8c63c57..e5533fdcb5f 100644 --- a/testData/ast/function/method/ownGenericParam.kt +++ b/testData/ast/function/method/ownGenericParam.kt @@ -1,2 +1,2 @@ -open fun putU(u : U?) : Unit { +fun putU(u : U?) : Unit { } \ No newline at end of file diff --git a/testData/ast/function/method/ownSeveralGenericParams.kt b/testData/ast/function/method/ownSeveralGenericParams.kt index 58e046f0576..19fb6188681 100644 --- a/testData/ast/function/method/ownSeveralGenericParams.kt +++ b/testData/ast/function/method/ownSeveralGenericParams.kt @@ -1,2 +1,2 @@ -open fun putUVW(u : U?, v : V?, w : W?) : Unit { +fun putUVW(u : U?, v : V?, w : W?) : Unit { } \ No newline at end of file diff --git a/testData/ast/function/method/private.kt b/testData/ast/function/method/private.kt index f40bc043813..45e5e8bab00 100644 --- a/testData/ast/function/method/private.kt +++ b/testData/ast/function/method/private.kt @@ -1,2 +1,2 @@ -open private fun test() : Unit { +private fun test() : Unit { } \ No newline at end of file diff --git a/testData/ast/function/method/protected.kt b/testData/ast/function/method/protected.kt index 597abfa9954..dbbc30b447b 100644 --- a/testData/ast/function/method/protected.kt +++ b/testData/ast/function/method/protected.kt @@ -1,2 +1,2 @@ -open protected fun test() : Unit { +protected fun test() : Unit { } \ No newline at end of file diff --git a/testData/ast/function/method/public.kt b/testData/ast/function/method/public.kt index 8f596ec1552..d835330ec86 100644 --- a/testData/ast/function/method/public.kt +++ b/testData/ast/function/method/public.kt @@ -1,2 +1,2 @@ -open public fun test() : Unit { +public fun test() : Unit { } \ No newline at end of file diff --git a/testData/ast/inProjectionType/method/methodParams.kt b/testData/ast/inProjectionType/method/methodParams.kt index 51fa30eb158..6888dcd5c36 100644 --- a/testData/ast/inProjectionType/method/methodParams.kt +++ b/testData/ast/inProjectionType/method/methodParams.kt @@ -1,2 +1,2 @@ -open fun popAll(dst : Collection?) : Unit { +fun popAll(dst : Collection?) : Unit { } \ No newline at end of file diff --git a/testData/ast/outProjectionType/method/methodParams.kt b/testData/ast/outProjectionType/method/methodParams.kt index 895538b7d7f..373c01e629f 100644 --- a/testData/ast/outProjectionType/method/methodParams.kt +++ b/testData/ast/outProjectionType/method/methodParams.kt @@ -1,2 +1,2 @@ -open fun pushAll(src : Collection?) : Unit { +fun pushAll(src : Collection?) : Unit { } \ No newline at end of file diff --git a/testData/ast/starProjectionType/method/methodParams.kt b/testData/ast/starProjectionType/method/methodParams.kt index 4e2b7104724..01ea4c15302 100644 --- a/testData/ast/starProjectionType/method/methodParams.kt +++ b/testData/ast/starProjectionType/method/methodParams.kt @@ -1,2 +1,2 @@ -open fun wtf(w : Collection<*>?) : Unit { +fun wtf(w : Collection<*>?) : Unit { } \ No newline at end of file diff --git a/testData/ast/typeParameters/method/methodDoubleParametrizationWithTwoBounds.kt b/testData/ast/typeParameters/method/methodDoubleParametrizationWithTwoBounds.kt index d29c4d690fb..21f892b7d8d 100644 --- a/testData/ast/typeParameters/method/methodDoubleParametrizationWithTwoBounds.kt +++ b/testData/ast/typeParameters/method/methodDoubleParametrizationWithTwoBounds.kt @@ -1,2 +1,2 @@ -open fun max(coll : Collection?) : T? where T : Comparable?, K : Collection? { +fun max(coll : Collection?) : T? where T : Comparable?, K : Collection? { } \ No newline at end of file diff --git a/testData/ast/typeParameters/method/where.kt b/testData/ast/typeParameters/method/where.kt index 732410c49ba..6a1ccaeeec6 100644 --- a/testData/ast/typeParameters/method/where.kt +++ b/testData/ast/typeParameters/method/where.kt @@ -1,2 +1,2 @@ -open fun max(coll : Collection?) : T? where T : Comparable? { +fun max(coll : Collection?) : T? where T : Comparable? { } \ No newline at end of file diff --git a/testData/ast/varArg/method/ellipsisTypeSeveralParams.kt b/testData/ast/varArg/method/ellipsisTypeSeveralParams.kt index b69052b794a..78207eee74b 100644 --- a/testData/ast/varArg/method/ellipsisTypeSeveralParams.kt +++ b/testData/ast/varArg/method/ellipsisTypeSeveralParams.kt @@ -1 +1 @@ -open fun format(pattern : String?, vararg arguments : Any?) : String? \ No newline at end of file +fun format(pattern : String?, vararg arguments : Any?) : String? \ No newline at end of file diff --git a/testData/ast/varArg/method/ellipsisTypeSingleParams.kt b/testData/ast/varArg/method/ellipsisTypeSingleParams.kt index 3dc3d147740..5219629e1e3 100644 --- a/testData/ast/varArg/method/ellipsisTypeSingleParams.kt +++ b/testData/ast/varArg/method/ellipsisTypeSingleParams.kt @@ -1,2 +1,2 @@ -open fun pushAll(vararg objs : Any?) : Unit { +fun pushAll(vararg objs : Any?) : Unit { } \ No newline at end of file From 01025a07c601decd84cd81f14e5e6745b09d2646 Mon Sep 17 00:00:00 2001 From: "Natalia.Ukhorskaya" Date: Wed, 23 Nov 2011 14:55:42 +0400 Subject: [PATCH 132/206] Help at rigth part --- j2k.iml | 2 +- j2k.ipr | 2 +- src/org/jetbrains/jet/j2k/Converter.java | 143 +++++++----------- .../jetbrains/jet/j2k/ast/AnonymousClass.java | 8 +- src/org/jetbrains/jet/j2k/ast/Class.java | 61 ++++---- .../jet/j2k/ast/DeclarationStatement.java | 2 +- src/org/jetbrains/jet/j2k/ast/Enum.java | 14 +- src/org/jetbrains/jet/j2k/ast/File.java | 5 +- .../j2k/ast/ForeachWithRangeStatement.java | 29 ++++ src/org/jetbrains/jet/j2k/ast/Function.java | 3 + .../jetbrains/jet/j2k/ast/IdentifierImpl.java | 2 +- .../jet/j2k/ast/MethodCallExpression.java | 10 +- src/org/jetbrains/jet/j2k/ast/Modifier.java | 1 + .../jet/j2k/ast/NewClassExpression.java | 11 +- .../jet/j2k/ast/ReferenceElement.java | 26 ++++ src/org/jetbrains/jet/j2k/ast/Trait.java | 5 +- .../jet/j2k/visitors/ElementVisitor.java | 23 ++- .../jet/j2k/visitors/ExpressionVisitor.java | 92 +++++++---- .../jet/j2k/visitors/StatementVisitor.java | 70 +++++++-- .../jet/j2k/visitors/TypeVisitor.java | 57 ++++++- .../jet/j2k/JavaToKotlinConverterTest.java | 14 +- .../ast/arrayType/method/methodArrayArgs.kt | 2 +- .../file/libraryFieldCall.kt | 2 +- .../ast/class/class/classWithEmptyMethods.kt | 6 +- .../class/class/oneStaticFieldOneNonStatic.kt | 6 +- testData/ast/class/class/oneStaticMethod.kt | 2 +- .../class/oneStaticMethodOneNonStatic.kt | 8 +- testData/ast/class/class/twoStaticMethod.kt | 4 +- .../ast/constructors/file/customerBuilder.kt | 7 +- .../constructors/file/genericIdentifier.jav | 33 ++++ .../constructors/file/genericIdentifier.kt | 37 +++++ testData/ast/constructors/file/identifier.kt | 6 +- testData/ast/file/file/packageWithClass.kt | 3 +- testData/ast/file/file/packageWithImports.kt | 5 +- .../ast/file/file/packageWithMixedImports.kt | 5 +- .../ast/file/file/packageWithOpenClass.kt | 3 +- .../ast/file/file/packageWithStaticImports.kt | 5 +- testData/ast/for/statement/forRangeWithLE.jav | 2 + testData/ast/for/statement/forRangeWithLE.kt | 4 + testData/ast/for/statement/forRangeWithLT.jav | 2 + testData/ast/for/statement/forRangeWithLT.kt | 4 + testData/ast/for/statement/forWithBlock.jav | 3 +- testData/ast/for/statement/forWithBlock.kt | 15 +- .../ast/for/statement/forWithExpression.kt | 11 +- .../function/file/functionInFinalClass.jav | 5 + .../ast/function/file/functionInFinalClass.kt | 5 + .../ast/function/method/abstractMethod.kt | 2 +- .../ast/function/method/classGenericParam.kt | 2 +- .../ast/function/method/emptyVoidMethod.kt | 2 +- testData/ast/function/method/internal.kt | 2 +- testData/ast/function/method/main.kt | 2 +- .../ast/function/method/methodClassType.kt | 2 +- .../function/method/methodPrimitiveType.kt | 2 +- .../function/method/methodPrimitiveType2.kt | 2 +- .../method/methodWithReturnStatement.kt | 2 +- testData/ast/function/method/open.kt | 2 +- .../ast/function/method/ownGenericParam.kt | 2 +- .../method/ownSeveralGenericParams.kt | 2 +- testData/ast/function/method/private.kt | 2 +- testData/ast/function/method/protected.kt | 2 +- testData/ast/function/method/public.kt | 2 +- .../file/importWithKeywords.kt | 3 +- .../importStatement/file/importWithStar.kt | 3 +- .../ast/importStatement/file/simpleImport.kt | 3 +- .../inProjectionType/method/methodParams.kt | 2 +- .../complicatedExampleFromJavaTutorial.kt | 11 +- .../file/genericMethod.jav | 12 ++ .../file/genericMethod.kt | 11 ++ .../expression/classWithoutBody2.jav | 1 - .../expression/classWithoutBody2.kt | 1 - .../expression/newClassWithAnonymousScope.kt | 2 +- .../file/fullQualifiedName.jav | 9 ++ .../file/fullQualifiedName.kt | 7 + .../file/fullQualifiedName2.jav | 7 + .../file/fullQualifiedName2.kt | 6 + .../file/genericClassInvocation.jav | 8 + .../file/genericClassInvocation.kt | 7 + .../file/newClassByFullName.kt | 5 +- .../newClassExpression/file/newInnerClass.jav | 13 ++ .../newClassExpression/file/newInnerClass.kt | 11 ++ .../file/newListAndNewMember.jav | 13 ++ .../file/newListAndNewMember.kt | 11 ++ .../file/newStaticInnerClass.jav | 11 ++ .../file/newStaticInnerClass.kt | 12 ++ testData/ast/objectLiteral/file/MyFrame.jav | 24 +++ testData/ast/objectLiteral/file/MyFrame.kt | 18 +++ .../outProjectionType/method/methodParams.kt | 2 +- .../file/orgJetbrainsJetJ2kIn.kt | 3 +- .../file/kt-540-rawGenericClass.jav | 15 ++ .../file/kt-540-rawGenericClass.kt | 13 ++ testData/ast/rawGenerics/file/kt-540.jav | 12 ++ testData/ast/rawGenerics/file/kt-540.kt | 10 ++ .../ast/rawGenerics/file/rawGenericMethod.jav | 14 ++ .../ast/rawGenerics/file/rawGenericMethod.kt | 13 ++ .../starProjectionType/method/methodParams.kt | 2 +- ...ethodDoubleParametrizationWithTwoBounds.kt | 2 +- testData/ast/typeParameters/method/where.kt | 2 +- .../method/ellipsisTypeSeveralParams.kt | 2 +- .../varArg/method/ellipsisTypeSingleParams.kt | 2 +- 99 files changed, 799 insertions(+), 299 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/ForeachWithRangeStatement.java create mode 100644 src/org/jetbrains/jet/j2k/ast/ReferenceElement.java create mode 100644 testData/ast/constructors/file/genericIdentifier.jav create mode 100644 testData/ast/constructors/file/genericIdentifier.kt create mode 100644 testData/ast/for/statement/forRangeWithLE.jav create mode 100644 testData/ast/for/statement/forRangeWithLE.kt create mode 100644 testData/ast/for/statement/forRangeWithLT.jav create mode 100644 testData/ast/for/statement/forRangeWithLT.kt create mode 100644 testData/ast/function/file/functionInFinalClass.jav create mode 100644 testData/ast/function/file/functionInFinalClass.kt create mode 100644 testData/ast/methodCallExpression/file/genericMethod.jav create mode 100644 testData/ast/methodCallExpression/file/genericMethod.kt 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/fullQualifiedName2.jav create mode 100644 testData/ast/newClassExpression/file/fullQualifiedName2.kt create mode 100644 testData/ast/newClassExpression/file/genericClassInvocation.jav create mode 100644 testData/ast/newClassExpression/file/genericClassInvocation.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 create mode 100644 testData/ast/objectLiteral/file/MyFrame.jav create mode 100644 testData/ast/objectLiteral/file/MyFrame.kt create mode 100644 testData/ast/rawGenerics/file/kt-540-rawGenericClass.jav create mode 100644 testData/ast/rawGenerics/file/kt-540-rawGenericClass.kt create mode 100644 testData/ast/rawGenerics/file/kt-540.jav create mode 100644 testData/ast/rawGenerics/file/kt-540.kt create mode 100644 testData/ast/rawGenerics/file/rawGenericMethod.jav create mode 100644 testData/ast/rawGenerics/file/rawGenericMethod.kt diff --git a/j2k.iml b/j2k.iml index 26774724cb1..f7e0d92adb2 100644 --- a/j2k.iml +++ b/j2k.iml @@ -8,7 +8,7 @@ - + diff --git a/j2k.ipr b/j2k.ipr index 52c8b1e6702..0725715a2d7 100644 --- a/j2k.ipr +++ b/j2k.ipr @@ -168,7 +168,7 @@ http://www.w3.org/1999/xhtml - + diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 36ea5c9313e..bfbdb2cece4 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -40,13 +40,19 @@ public class Converter { @NotNull public static AnonymousClass anonymousClassToAnonymousClass(@NotNull PsiAnonymousClass anonymousClass) { - // TODO: replace by Block, use class.getChild() method - return new AnonymousClass( - classesToClassList(anonymousClass.getAllInnerClasses()), - methodsToFunctionList(anonymousClass.getMethods()), - fieldsToFieldList(anonymousClass.getAllFields()), - initializersToInitializerList(anonymousClass.getInitializers()) - ); + return new AnonymousClass(getMembers(anonymousClass)); + } + + private static List getMembers(PsiClass psiClass) { + List members = new LinkedList(); + for (PsiElement e : psiClass.getChildren()) { + if (e instanceof PsiMethod) members.add(methodToFunction((PsiMethod) e, true)); + else if (e instanceof PsiField) members.add(fieldToField((PsiField) e)); + else if (e instanceof PsiClass) members.add(classToClass((PsiClass) e)); + else if (e instanceof PsiClassInitializer) members.add(initializerToInitializer((PsiClassInitializer) e)); + else if (e instanceof PsiMember) System.out.println(e.getClass() + " " + e.getText()); + } + return members; } @NotNull @@ -88,16 +94,15 @@ public class Converter { @NotNull private static Class classToClass(@NotNull PsiClass psiClass) { final Set modifiers = modifiersListToModifiersSet(psiClass.getModifierList()); - final List innerClasses = classesToClassList(psiClass.getAllInnerClasses()); - final List methods = methodsToFunctionList(psiClass.getMethods()); final List fields = fieldsToFieldList(psiClass.getFields()); - final List anonymousInitializers = initializersToInitializerList(psiClass.getInitializers()); final List typeParameters = elementsToElementList(psiClass.getTypeParameters()); final List implementsTypes = typesToNotNullableTypeList(psiClass.getImplementsListTypes()); final List extendsTypes = typesToNotNullableTypeList(psiClass.getExtendsListTypes()); final IdentifierImpl name = new IdentifierImpl(psiClass.getName()); final List baseClassParams = new LinkedList(); + List members = getMembers(psiClass); + // we try to find super() call and generate class declaration like that: class A(name: String, i : Int) : Base(name) final SuperVisitor visitor = new SuperVisitor(); psiClass.accept(visitor); @@ -114,49 +119,52 @@ public class Converter { final List finalOrWithEmptyInitializer = getFinalOrWithEmptyInitializer(fields); final Map initializers = new HashMap(); - for (final Function f : methods) { - for (Field fo : finalOrWithEmptyInitializer) { - String init = getDefaultInitializer(fo); - initializers.put(fo.getIdentifier().toKotlin(), init); - } - + for (final Member m : members) { // and modify secondaries - if (f.getKind() == INode.Kind.CONSTRUCTOR && !((Constructor) f).isPrimary()) { - final List newStatements = new LinkedList(); + if (m.getKind() == INode.Kind.CONSTRUCTOR) { + Function f = (Function)m; + if (!((Constructor) f).isPrimary()) { + for (Field fo : finalOrWithEmptyInitializer) { + String init = getDefaultInitializer(fo); + initializers.put(fo.getIdentifier().toKotlin(), init); + } - for (Statement s : f.getBlock().getStatements()) { - boolean isRemoved = false; + final List newStatements = new LinkedList(); - if (s.getKind() == INode.Kind.ASSIGNMENT_EXPRESSION) { - final AssignmentExpression assignmentExpression = (AssignmentExpression) s; - if (assignmentExpression.getLeft().getKind() == INode.Kind.CALL_CHAIN) { - for (Field fo : finalOrWithEmptyInitializer) { - final String id = fo.getIdentifier().toKotlin(); - if (((CallChainExpression) assignmentExpression.getLeft()).getIdentifier().toKotlin().endsWith("." + id)) { - initializers.put(id, assignmentExpression.getRight().toKotlin()); - isRemoved = true; + for (Statement s : f.getBlock().getStatements()) { + boolean isRemoved = false; + + if (s.getKind() == INode.Kind.ASSIGNMENT_EXPRESSION) { + final AssignmentExpression assignmentExpression = (AssignmentExpression) s; + if (assignmentExpression.getLeft().getKind() == INode.Kind.CALL_CHAIN) { + for (Field fo : finalOrWithEmptyInitializer) { + final String id = fo.getIdentifier().toKotlin(); + if (((CallChainExpression) assignmentExpression.getLeft()).getIdentifier().toKotlin().endsWith("." + id)) { + initializers.put(id, assignmentExpression.getRight().toKotlin()); + isRemoved = true; + } } } } + if (!isRemoved) { + newStatements.add(s); + } } - if (!isRemoved) { - newStatements.add(s); - } + + newStatements.add( + 0, + new DummyStringStatement( + "val __ = " + createPrimaryConstructorInvocation( + name.toKotlin(), + finalOrWithEmptyInitializer, + initializers))); + + f.setBlock(new Block(newStatements)); } - - newStatements.add( - 0, - new DummyStringStatement( - "val __ = " + createPrimaryConstructorInvocation( - name.toKotlin(), - finalOrWithEmptyInitializer, - initializers))); - - f.setBlock(new Block(newStatements)); } } - methods.add( + members.add( new Constructor( Identifier.EMPTY_IDENTIFIER, Collections.emptySet(), @@ -170,18 +178,10 @@ public class Converter { } if (psiClass.isInterface()) - return new Trait(name, modifiers, typeParameters, extendsTypes, Collections.emptyList(), implementsTypes, innerClasses, methods, fields, anonymousInitializers); + return new Trait(name, modifiers, typeParameters, extendsTypes, Collections.emptyList(), implementsTypes, members); if (psiClass.isEnum()) - return new Enum(name, modifiers, typeParameters, Collections.emptyList(), Collections.emptyList(), implementsTypes, - innerClasses, methods, fieldsToFieldListForEnums(psiClass.getAllFields()), anonymousInitializers); - return new Class(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, innerClasses, methods, fields, anonymousInitializers); - } - - @NotNull - private static List initializersToInitializerList(@NotNull PsiClassInitializer[] initializers) { - List result = new LinkedList(); - for (PsiClassInitializer i : initializers) result.add(initializerToInitializer(i)); - return result; + return new Enum(name, modifiers, typeParameters, Collections.emptyList(), Collections.emptyList(), implementsTypes, members); + return new Class(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, members); } @NotNull @@ -206,31 +206,6 @@ public class Converter { } } - // hack for enums, we remove methods: - // private int ordinal() { ... } - // private String name() { ... } - // those methods any enum class inherits from java.lang.Enum - @NotNull - private static List fieldsToFieldListForEnums(@NotNull PsiField[] fields) { - List result = new LinkedList(); - for (PsiField f : fields) { - if ((f.getName().equals("ordinal") - && f.getType().getCanonicalText().equals("int") - && f.hasModifierProperty(PsiModifier.PRIVATE) - && f.hasModifierProperty(PsiModifier.FINAL) - ) || - (f.getName().equals("name") - && f.getType().getCanonicalText().equals("java.lang.String") - && f.hasModifierProperty(PsiModifier.PRIVATE) - && f.hasModifierProperty(PsiModifier.FINAL) - )) - continue; - - result.add(fieldToField(f)); - } - return result; - } - @NotNull private static List fieldsToFieldList(@NotNull PsiField[] fields) { List result = new LinkedList(); @@ -256,13 +231,6 @@ public class Converter { ); } - @NotNull - private static List methodsToFunctionList(@NotNull PsiMethod[] methods) { - List result = new LinkedList(); - for (PsiMethod t : methods) result.add(methodToFunction(t, true)); - return result; - } - @Nullable private static PsiMethod getPrimaryConstructorForThisCase(@NotNull PsiClass psiClass) { ThisVisitor tv = new ThisVisitor(); @@ -306,6 +274,11 @@ public class Converter { modifiers.add(Modifier.OVERRIDE); if (method.getParent() instanceof PsiClass && ((PsiClass) method.getParent()).isInterface()) modifiers.remove(Modifier.ABSTRACT); + if (method.getParent() instanceof PsiClass) { + final PsiModifierList parentModifierList = ((PsiClass) method.getParent()).getModifierList(); + if (parentModifierList != null && parentModifierList.hasExplicitModifier(Modifier.FINAL)) + modifiers.add(Modifier.NOT_OPEN); + } if (method.isConstructor()) { // TODO: simplify boolean isPrimary = isConstructorPrimary(method); diff --git a/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java b/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java index 45fd78b622b..e8a87d2b3f7 100644 --- a/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java +++ b/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java @@ -9,17 +9,15 @@ import java.util.List; * @author ignatov */ public class AnonymousClass extends Class { - public AnonymousClass(List innerClasses, List methods, List fields, List initializers) { + public AnonymousClass(List members) { super(new IdentifierImpl("anonClass"), Collections.emptySet(), Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), - innerClasses, - methods, - fields, - initializers); + members + ); } @NotNull diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java index 37fa884aa57..2bff21daaa7 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -18,31 +18,26 @@ public class Class extends Member { String TYPE = "class"; final Identifier myName; private final List myBaseClassParams; - private final List myInitializers; + private final List myMembers; private final List myTypeParameters; private final List myExtendsTypes; private final List myImplementsTypes; - final List myInnerClasses; - private final List myMethods; - final List myFields; public Class(Identifier name, Set modifiers, List typeParameters, List extendsTypes, - List baseClassParams, List implementsTypes, List innerClasses, List methods, List fields, List initializers) { + List baseClassParams, List implementsTypes, List members) { myName = name; myBaseClassParams = baseClassParams; myModifiers = modifiers; myTypeParameters = typeParameters; myExtendsTypes = extendsTypes; myImplementsTypes = implementsTypes; - myInnerClasses = innerClasses; - myMethods = methods; - myFields = fields; - myInitializers = initializers; + myMembers = members; } + @Nullable private Constructor getPrimaryConstructor() { - for (Function m : myMethods) + for (Member m : myMembers) if (m.getKind() == Kind.CONSTRUCTOR) if (((Constructor) m).isPrimary()) return (Constructor) m; @@ -82,9 +77,9 @@ public class Class extends Member { } @NotNull - List methodsExceptConstructors() { - final LinkedList result = new LinkedList(); - for (Function m : myMethods) + LinkedList membersExceptConstructors() { + final LinkedList result = new LinkedList(); + for (Member m : myMembers) if (m.getKind() != Kind.CONSTRUCTOR) result.add(m); return result; @@ -93,21 +88,30 @@ public class Class extends Member { @NotNull List secondaryConstructorsAsStaticInitFunction() { final LinkedList result = new LinkedList(); - for (Function m : myMethods) + for (Member m : myMembers) if (m.getKind() == Kind.CONSTRUCTOR && !((Constructor) m).isPrimary()) { + Function f = (Function) m; Set modifiers = new HashSet(m.myModifiers); modifiers.add(Modifier.STATIC); - final List statements = m.getBlock().getStatements(); + final List statements = f.getBlock().getStatements(); statements.add(new ReturnStatement(new IdentifierImpl("__"))); // TODO: move to one place, find other __ usages final Block block = new Block(statements); + final List typeParameters = new LinkedList(); + if (f.getTypeParameters().size() == 0) + typeParameters.addAll(myTypeParameters); + else { + typeParameters.addAll(myTypeParameters); + typeParameters.addAll(f.getTypeParameters()); + } + result.add(new Function( new IdentifierImpl("init"), modifiers, new ClassType(myName), - m.getTypeParameters(), - m.getParams(), + typeParameters, + f.getParams(), block )); } @@ -164,16 +168,13 @@ public class Class extends Member { String bodyToKotlin() { return SPACE + "{" + N + - AstUtil.joinNodes(getNonStatic(myFields), N) + N + - AstUtil.joinNodes(getNonStatic(myInitializers), N) + N + + AstUtil.joinNodes(getNonStatic(membersExceptConstructors()), N) + N + classObjectToKotlin() + N + - AstUtil.joinNodes(getNonStatic(methodsExceptConstructors()), N) + N + - AstUtil.joinNodes(getNonStatic(myInnerClasses), N) + N + primaryConstructorBodyToKotlin() + N + "}"; } - private List getStatic(List members) { + private static List getStatic(List members) { List result = new LinkedList(); for (Member m : members) if (m.isStatic()) @@ -181,7 +182,7 @@ public class Class extends Member { return result; } - private List getNonStatic(List members) { + private static List getNonStatic(List members) { List result = new LinkedList(); for (Member m : members) if (!m.isStatic()) @@ -190,17 +191,11 @@ public class Class extends Member { } private String classObjectToKotlin() { - final List staticMethods = new LinkedList(secondaryConstructorsAsStaticInitFunction()); - staticMethods.addAll(getStatic(methodsExceptConstructors())); - final List staticFields = getStatic(myFields); - final List staticInitializers = getStatic(myInitializers); - final List staticInnerClasses = getStatic(myInnerClasses); - if (staticFields.size() + staticMethods.size() + staticInnerClasses.size() + staticInitializers.size() > 0) { + final List staticMembers = new LinkedList(secondaryConstructorsAsStaticInitFunction()); + staticMembers.addAll(getStatic(membersExceptConstructors())); + if (staticMembers.size() > 0) { return "class" + SPACE + "object" + SPACE + "{" + N + - AstUtil.joinNodes(staticFields, N) + N + - AstUtil.joinNodes(staticInitializers, N) + N + - AstUtil.joinNodes(staticMethods, N) + N + - AstUtil.joinNodes(staticInnerClasses, N) + N + + AstUtil.joinNodes(staticMembers, N) + N + "}"; } return EMPTY; diff --git a/src/org/jetbrains/jet/j2k/ast/DeclarationStatement.java b/src/org/jetbrains/jet/j2k/ast/DeclarationStatement.java index d38956881da..756153ac13d 100644 --- a/src/org/jetbrains/jet/j2k/ast/DeclarationStatement.java +++ b/src/org/jetbrains/jet/j2k/ast/DeclarationStatement.java @@ -16,7 +16,7 @@ public class DeclarationStatement extends Statement { myElements = elements; } - private List toStringList(List elements) { + private static List toStringList(List elements) { List result = new LinkedList(); for (Element e : elements) { if (e instanceof LocalVariable) { diff --git a/src/org/jetbrains/jet/j2k/ast/Enum.java b/src/org/jetbrains/jet/j2k/ast/Enum.java index d781e944196..9e9c1659e7f 100644 --- a/src/org/jetbrains/jet/j2k/ast/Enum.java +++ b/src/org/jetbrains/jet/j2k/ast/Enum.java @@ -10,11 +10,12 @@ import java.util.Set; * @author ignatov */ public class Enum extends Class { - public Enum(Identifier name, Set modifiers, List typeParameters, List extendsTypes, List baseClassParams, List implementsTypes, List innerClasses, List methods, List fields, List initializers) { - super(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, innerClasses, methods, fields, initializers); + public Enum(Identifier name, Set modifiers, List typeParameters, List extendsTypes, + List baseClassParams, List implementsTypes, List members) { + super(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, members); } - String primaryConstructorSignatureToKotlin() { + String primaryConstructorSignatureToKotlin() { String s = super.primaryConstructorSignatureToKotlin(); return s.equals("()") ? EMPTY : s; } @@ -27,10 +28,9 @@ public class Enum extends Class { @NotNull @Override public String toKotlin() { - return modifiersToKotlin() + "enum" + SPACE + myName.toKotlin() + primaryConstructorSignatureToKotlin() + typeParametersToKotlin() + implementTypesToKotlin() + SPACE + "{" + N + - AstUtil.joinNodes(myFields, N) + N + - AstUtil.joinNodes(methodsExceptConstructors(), N) + N + - AstUtil.joinNodes(myInnerClasses, N) + N + + return modifiersToKotlin() + "enum" + SPACE + myName.toKotlin() + primaryConstructorSignatureToKotlin() + + typeParametersToKotlin() + implementTypesToKotlin() + SPACE + "{" + N + + AstUtil.joinNodes(membersExceptConstructors(), N) + N + primaryConstructorBodyToKotlin() + N + "}"; } diff --git a/src/org/jetbrains/jet/j2k/ast/File.java b/src/org/jetbrains/jet/j2k/ast/File.java index da873d9419b..d65a1605cbe 100644 --- a/src/org/jetbrains/jet/j2k/ast/File.java +++ b/src/org/jetbrains/jet/j2k/ast/File.java @@ -25,8 +25,7 @@ public class File extends Node { final String common = AstUtil.joinNodes(myImports, N) + N2 + AstUtil.joinNodes(myClasses, N) + N; if (myPackageName.isEmpty()) return common; - return "namespace" + SPACE + myPackageName + SPACE + "{" + N + - common + - "}"; + return "namespace" + SPACE + myPackageName + N + + common; } } diff --git a/src/org/jetbrains/jet/j2k/ast/ForeachWithRangeStatement.java b/src/org/jetbrains/jet/j2k/ast/ForeachWithRangeStatement.java new file mode 100644 index 00000000000..b5669d33a68 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/ForeachWithRangeStatement.java @@ -0,0 +1,29 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class ForeachWithRangeStatement extends Statement { + private Expression myStart; + private IdentifierImpl myIdentifier; + private Expression myEnd; + private Statement myBody; + + public ForeachWithRangeStatement(IdentifierImpl identifier, Expression start, Expression end, Statement body) { + myStart = start; + myIdentifier = identifier; + myEnd = end; + myBody = body; + } + + @NotNull + @Override + public String toKotlin() { + return "for" + SPACE + "(" + + myIdentifier.toKotlin() + SPACE + "in" + SPACE + myStart.toKotlin() + ".." + myEnd.toKotlin() + + ")" + SPACE + + myBody.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/Function.java b/src/org/jetbrains/jet/j2k/ast/Function.java index 8bf2649aaa6..36545c0948b 100644 --- a/src/org/jetbrains/jet/j2k/ast/Function.java +++ b/src/org/jetbrains/jet/j2k/ast/Function.java @@ -78,6 +78,9 @@ public class Function extends Member { if (!myModifiers.contains(Modifier.OVERRIDE) && !myModifiers.contains(Modifier.FINAL)) modifierList.add(Modifier.OPEN); + if (myModifiers.contains(Modifier.NOT_OPEN)) + modifierList.remove(Modifier.OPEN); + modifierList.add(accessModifier()); if (modifierList.size() > 0) diff --git a/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java b/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java index 4fcfcd6ebb2..c487cfb5fff 100644 --- a/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java +++ b/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java @@ -30,7 +30,7 @@ public class IdentifierImpl extends Expression implements Identifier { return myName.length() == 0; } - private String quote(String str) { + private static String quote(String str) { return BACKTICK + str + BACKTICK; } diff --git a/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java b/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java index 0a0aab62b7b..0c8a1d21536 100644 --- a/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java @@ -1,6 +1,9 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.j2k.util.AstUtil; + +import java.util.List; /** * @author ignatov @@ -9,11 +12,13 @@ public class MethodCallExpression extends Expression { private final Expression myMethodCall; private final Element myParamList; private final boolean myIsResultNullable; + private final List myTypeParameters; - public MethodCallExpression(Expression methodCall, Element paramList, boolean nullable) { + public MethodCallExpression(Expression methodCall, Element paramList, boolean nullable, List typeParameters) { myMethodCall = methodCall; myParamList = paramList; myIsResultNullable = nullable; + myTypeParameters = typeParameters; } @Override @@ -24,6 +29,7 @@ public class MethodCallExpression extends Expression { @NotNull @Override public String toKotlin() { - return myMethodCall.toKotlin() + "(" + myParamList.toKotlin() + ")"; + String typeParamsToKotlin = myTypeParameters.size() > 0 ? "<" + AstUtil.joinNodes(myTypeParameters, COMMA_WITH_SPACE) + ">" : EMPTY; + return myMethodCall.toKotlin() + typeParamsToKotlin + "(" + myParamList.toKotlin() + ")"; } } diff --git a/src/org/jetbrains/jet/j2k/ast/Modifier.java b/src/org/jetbrains/jet/j2k/ast/Modifier.java index 31a85df152a..92920946ae2 100644 --- a/src/org/jetbrains/jet/j2k/ast/Modifier.java +++ b/src/org/jetbrains/jet/j2k/ast/Modifier.java @@ -12,5 +12,6 @@ public abstract class Modifier { public static final String ABSTRACT = "abstract"; public static final String FINAL = "final"; public static final String OPEN = "open"; + public static final String NOT_OPEN = "not open"; public static final String OVERRIDE = "override"; } diff --git a/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java b/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java index 8d4bd4549b6..30185d2bce7 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() + ")"; + "object" + SPACE + ":" + SPACE + 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/ast/ReferenceElement.java b/src/org/jetbrains/jet/j2k/ast/ReferenceElement.java new file mode 100644 index 00000000000..c557edf4065 --- /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 final Identifier myReference; + private final 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/ast/Trait.java b/src/org/jetbrains/jet/j2k/ast/Trait.java index 8f39b8d9193..60bcd122add 100644 --- a/src/org/jetbrains/jet/j2k/ast/Trait.java +++ b/src/org/jetbrains/jet/j2k/ast/Trait.java @@ -7,8 +7,9 @@ import java.util.Set; * @author ignatov */ public class Trait extends Class { - public Trait(Identifier name, Set modifiers, List typeParameters, List extendsTypes, List baseClassParams, List implementsTypes, List innerClasses, List methods, List fields, List initializers) { - super(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, innerClasses, methods, fields, initializers); + public Trait(Identifier name, Set modifiers, List typeParameters, List extendsTypes, + List baseClassParams, List implementsTypes, List members) { + super(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, members); TYPE = "trait"; } diff --git a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java index 47c3ad409b7..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.*; /** @@ -42,7 +44,26 @@ public class ElementVisitor extends JavaElementVisitor { @Override public void visitReferenceElement(PsiJavaCodeReferenceElement reference) { super.visitReferenceElement(reference); - myResult = new IdentifierImpl(reference.getQualifiedName()); // TODO + + 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) { + final PsiJavaCodeReferenceElement p = (PsiJavaCodeReferenceElement) qualifier; + result = new IdentifierImpl(p.getReferenceName()).toKotlin() + "." + result; // TODO: maybe need to replace by safe call? + qualifier = p.getQualifier(); + } + myResult = new ReferenceElement( + new IdentifierImpl(result), + types + ); + } } @Override diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index ce4aaa63c50..126a1b1653c 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -4,9 +4,11 @@ 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.annotations.Nullable; import org.jetbrains.jet.j2k.Converter; import org.jetbrains.jet.j2k.ast.*; +import java.util.Collections; import java.util.List; import static org.jetbrains.jet.j2k.Converter.*; @@ -56,7 +58,7 @@ public class ExpressionVisitor extends StatementVisitor { if (tokenType == JavaTokenType.OREQ) secondOp = "or"; if (tokenType == JavaTokenType.GTGTGTEQ) secondOp = "cyclicShiftRight"; - if (!secondOp.equals("")) // if not Kotlin operators + if (!secondOp.isEmpty()) // if not Kotlin operators myResult = new AssignmentExpression( expressionToExpression(expression.getLExpression()), new BinaryExpression( @@ -75,7 +77,7 @@ public class ExpressionVisitor extends StatementVisitor { } @NotNull - private String getOperatorString(@NotNull IElementType tokenType) { + private static String getOperatorString(@NotNull IElementType tokenType) { if (tokenType == JavaTokenType.PLUS) return "+"; if (tokenType == JavaTokenType.MINUS) return "-"; if (tokenType == JavaTokenType.ASTERISK) return "*"; @@ -97,6 +99,7 @@ public class ExpressionVisitor extends StatementVisitor { if (tokenType == JavaTokenType.OROR) return "||"; if (tokenType == JavaTokenType.PLUSPLUS) return "++"; if (tokenType == JavaTokenType.MINUSMINUS) return "--"; + if (tokenType == JavaTokenType.EXCL) return "!"; System.out.println("UNSUPPORTED TOKEN TYPE: " + tokenType.toString()); return ""; @@ -170,7 +173,8 @@ public class ExpressionVisitor extends StatementVisitor { new MethodCallExpression( expressionToExpression(expression.getMethodExpression()), elementToElement(expression.getArgumentList()), - typeToType(expression.getType()).isNullable() + typeToType(expression.getType()).isNullable(), + typesToTypeList(expression.getTypeArguments()) ); } @@ -184,30 +188,51 @@ public class ExpressionVisitor extends StatementVisitor { super.visitNewExpression(expression); if (expression.getArrayInitializer() != null) // new Foo[] {} - myResult = expressionToExpression(expression.getArrayInitializer()); + myResult = createNewEmptyArray(expression); else if (expression.getArrayDimensions().length > 0) { // new Foo[5] - final List callExpression = expressionsToExpressionList(expression.getArrayDimensions()); - callExpression.add(new IdentifierImpl("{null}")); // TODO: remove - - myResult = new NewClassExpression( - typeToType(expression.getType()), // TODO: remove - new ExpressionList(callExpression) - ); + myResult = createNewNonEmptyArray(expression); } else { // new Class(): common case - final PsiAnonymousClass anonymousClass = expression.getAnonymousClass(); - myResult = new NewClassExpression( + myResult = createNewClassExpression(expression); + } + } + + @NotNull + private static Expression createNewClassExpression(@NotNull PsiNewExpression expression) { + final PsiAnonymousClass anonymousClass = expression.getAnonymousClass(); + final PsiMethod constructor = expression.resolveMethod(); + if (constructor == null || isConstructorPrimary(constructor)) { + return new NewClassExpression( + expressionToExpression(expression.getQualifier()), elementToElement(expression.getClassOrAnonymousClassReference()), elementToElement(expression.getArgumentList()), anonymousClass != null ? anonymousClassToAnonymousClass(anonymousClass) : null ); - // is constructor secondary - final PsiMethod constructor = expression.resolveMethod(); - if (constructor != null && !isConstructorPrimary(constructor)) { - myResult = new CallChainExpression( - new IdentifierImpl(constructor.getName(), false), - new MethodCallExpression(new IdentifierImpl("init"), elementToElement(expression.getArgumentList()), false)); - } } + // is constructor secondary + final PsiJavaCodeReferenceElement reference = expression.getClassReference(); + final List typeParameters = reference != null ? typesToTypeList(reference.getTypeParameters()) : Collections.emptyList(); + return new CallChainExpression( + new IdentifierImpl(constructor.getName(), false), + new MethodCallExpression( + new IdentifierImpl("init"), + elementToElement(expression.getArgumentList()), + false, + typeParameters)); + } + + @NotNull + private static NewClassExpression createNewNonEmptyArray(@NotNull PsiNewExpression expression) { + final List callExpression = expressionsToExpressionList(expression.getArrayDimensions()); + callExpression.add(new IdentifierImpl("{null}")); // TODO: remove + return new NewClassExpression( + typeToType(expression.getType()), + new ExpressionList(callExpression) + ); + } + + @NotNull + private static Expression createNewEmptyArray(@NotNull PsiNewExpression expression) { + return expressionToExpression(expression.getArrayInitializer()); } @Override @@ -240,7 +265,7 @@ public class ExpressionVisitor extends StatementVisitor { public void visitReferenceExpression(PsiReferenceExpression expression) { super.visitReferenceExpression(expression); - final boolean isFieldReference = isFieldReference(expression); + final boolean isFieldReference = isFieldReference(expression, getContainingClass(expression)); final boolean hasDollar = isFieldReference && isInsidePrimaryConstructor(expression); final boolean insideSecondaryConstructor = isInsideSecondaryConstructor(expression); final boolean hasReceiver = isFieldReference && insideSecondaryConstructor; @@ -267,7 +292,7 @@ public class ExpressionVisitor extends StatementVisitor { } @NotNull - private String getClassName(PsiReferenceExpression expression) { + private static String getClassName(@NotNull PsiReferenceExpression expression) { PsiElement context = expression.getContext(); while (context != null) { if (context instanceof PsiMethod && ((PsiMethod) context).isConstructor()) { @@ -283,20 +308,20 @@ public class ExpressionVisitor extends StatementVisitor { return ""; } - private boolean isFieldReference(PsiReferenceExpression expression) { + private static boolean isFieldReference(@NotNull PsiReferenceExpression expression, PsiClass currentClass) { final PsiReference reference = expression.getReference(); if (reference != null) { final PsiElement resolvedReference = reference.resolve(); if (resolvedReference != null) { if (resolvedReference instanceof PsiField) { - return true; + return ((PsiField) resolvedReference).getContainingClass() == currentClass; } } } return false; } - private boolean isInsideSecondaryConstructor(PsiReferenceExpression expression) { + private static boolean isInsideSecondaryConstructor(PsiReferenceExpression expression) { PsiElement context = expression.getContext(); while (context != null) { if (context instanceof PsiMethod && ((PsiMethod) context).isConstructor()) @@ -306,7 +331,7 @@ public class ExpressionVisitor extends StatementVisitor { return false; } - private boolean isInsidePrimaryConstructor(PsiExpression expression) { + private static boolean isInsidePrimaryConstructor(PsiExpression expression) { PsiElement context = expression.getContext(); while (context != null) { if (context instanceof PsiMethod && ((PsiMethod) context).isConstructor()) @@ -316,7 +341,18 @@ public class ExpressionVisitor extends StatementVisitor { return false; } - private boolean isThisExpression(PsiReferenceExpression expression) { + @Nullable + private static PsiClass getContainingClass(@NotNull PsiExpression expression) { + PsiElement context = expression.getContext(); + while (context != null) { + if (context instanceof PsiMethod && ((PsiMethod) context).isConstructor()) + return ((PsiMethod) context).getContainingClass(); + context = context.getContext(); + } + return null; + } + + private static boolean isThisExpression(PsiReferenceExpression expression) { for (PsiReference r : expression.getReferences()) if (r.getCanonicalText().equals("this")) { final PsiElement res = r.resolve(); @@ -369,4 +405,4 @@ public class ExpressionVisitor extends StatementVisitor { getOperatorString(expression.getOperationTokenType()) ); } -} +} \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index a61f0fc7f37..cd26ad0f662 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -1,6 +1,9 @@ package org.jetbrains.jet.j2k.visitors; import com.intellij.psi.*; +import com.intellij.psi.search.searches.ReferencesSearch; +import com.intellij.psi.tree.IElementType; +import com.intellij.psi.util.PsiUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.j2k.ast.*; @@ -93,17 +96,66 @@ public class StatementVisitor extends ElementVisitor { } @Override - public void visitForStatement(PsiForStatement statement) { + public void visitForStatement(@NotNull PsiForStatement statement) { super.visitForStatement(statement); - List forStatements = new LinkedList(); - forStatements.add(statementToStatement(statement.getInitialization())); - forStatements.add(new WhileStatement( - expressionToExpression(statement.getCondition()), - new Block( - Arrays.asList(statementToStatement(statement.getBody()), - new Block(Arrays.asList(statementToStatement(statement.getUpdate()))))))); - myResult = new Block(forStatements); + final PsiStatement initialization = statement.getInitialization(); + final PsiStatement update = statement.getUpdate(); + final PsiExpression condition = statement.getCondition(); + final PsiLocalVariable firstChild = initialization != null && initialization.getFirstChild() instanceof PsiLocalVariable ? + (PsiLocalVariable) initialization.getFirstChild() : null; + + final IElementType operationTokenType = condition != null && condition instanceof PsiBinaryExpression ? + ((PsiBinaryExpression) condition).getOperationTokenType() : null; + if ( + initialization != null && + initialization instanceof PsiDeclarationStatement + && initialization.getFirstChild() == initialization.getLastChild() + && condition != null + && update != null + && update.getChildren().length == 1 + && update.getChildren()[0] instanceof PsiPostfixExpression + && ((PsiPostfixExpression) update.getChildren()[0]).getOperationTokenType() == JavaTokenType.PLUSPLUS + && operationTokenType != null + && (operationTokenType == JavaTokenType.LT || operationTokenType == JavaTokenType.LE) + && initialization.getFirstChild() != null + && initialization.getFirstChild() instanceof PsiLocalVariable + && firstChild != null + && firstChild.getNameIdentifier() != null + && isOnceWritableIterator(firstChild) + ) { + final Expression end = expressionToExpression(((PsiBinaryExpression) condition).getROperand()); + final Expression endExpression = operationTokenType == JavaTokenType.LT ? + new BinaryExpression(end, new IdentifierImpl("1"), "-"): + end; + myResult = new ForeachWithRangeStatement( + new IdentifierImpl(firstChild.getName()), + expressionToExpression(firstChild.getInitializer()), + endExpression, + statementToStatement(statement.getBody()) + ); + } else { // common case: while loop instead of for loop + List forStatements = new LinkedList(); + forStatements.add(statementToStatement(initialization)); + forStatements.add(new WhileStatement( + expressionToExpression(condition), + new Block( + Arrays.asList(statementToStatement(statement.getBody()), + new Block(Arrays.asList(statementToStatement(update))))))); + myResult = new Block(forStatements); + } + } + + private static boolean isOnceWritableIterator(PsiLocalVariable firstChild) { + int counter = 0; + if (firstChild != null) + for (PsiReference r : (ReferencesSearch.search(firstChild))) { + if (r instanceof PsiExpression) { + if (PsiUtil.isAccessedForWriting((PsiExpression) r)) + counter++; + } + } + return counter == 1; // only increment usage } @Override diff --git a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java index b930d833534..26797cd9055 100644 --- a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java @@ -1,10 +1,14 @@ 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; +import java.util.LinkedList; +import java.util.List; + import static org.jetbrains.jet.j2k.Converter.typeToType; import static org.jetbrains.jet.j2k.Converter.typesToTypeList; @@ -42,15 +46,56 @@ public class TypeVisitor extends PsiTypeVisitor { @Override public Type visitClassType(PsiClassType classType) { - myResult = new ClassType( - new IdentifierImpl(getClassTypeName(classType)), - typesToTypeList(classType.getParameters()) - ); + String classTypeName = createQualifiedName(classType); + if (classTypeName.isEmpty()) + classTypeName = getClassTypeName(classType); + List resolvedClassTypeParams = createRawTypesForResolvedReference(classType); + + final IdentifierImpl identifier = new IdentifierImpl(classTypeName); + if (classType.getParameterCount() == 0 && resolvedClassTypeParams.size() > 0) + myResult = new ClassType(identifier, resolvedClassTypeParams); + else + myResult = new ClassType(identifier, typesToTypeList(classType.getParameters())); return super.visitClassType(classType); } @NotNull - private String getClassTypeName(@NotNull PsiClassType classType) { + private static String createQualifiedName(@NotNull PsiClassType classType) { + String classTypeName = ""; + if (classType instanceof PsiClassReferenceType) { + final PsiJavaCodeReferenceElement reference = ((PsiClassReferenceType) classType).getReference(); + if (reference.isQualified()) { + String result = new IdentifierImpl(reference.getReferenceName()).toKotlin(); + PsiElement qualifier = reference.getQualifier(); + while (qualifier != null) { + final PsiJavaCodeReferenceElement p = (PsiJavaCodeReferenceElement) qualifier; + result = new IdentifierImpl(p.getReferenceName()).toKotlin() + "." + result; // TODO: maybe need to replace by safe call? + qualifier = p.getQualifier(); + } + classTypeName = result; + } + } + return classTypeName; + } + + @NotNull + private static List createRawTypesForResolvedReference(@NotNull PsiClassType classType) { + final List typeParams = new LinkedList(); + if (classType instanceof PsiClassReferenceType) { + final PsiJavaCodeReferenceElement reference = ((PsiClassReferenceType) classType).getReference(); + final PsiElement resolve = reference.resolve(); + if (resolve != null) { + if (resolve instanceof PsiClass) + //noinspection UnusedDeclaration + for (PsiTypeParameter p : ((PsiClass) resolve).getTypeParameters()) + typeParams.add(new StarProjectionType()); + } + } + return typeParams; + } + + @NotNull + private static String getClassTypeName(@NotNull PsiClassType classType) { String canonicalTypeStr = classType.getCanonicalText(); if (canonicalTypeStr.equals("java.lang.Object")) return "Any"; if (canonicalTypeStr.equals("java.lang.Byte")) return "Byte"; @@ -61,7 +106,7 @@ public class TypeVisitor extends PsiTypeVisitor { if (canonicalTypeStr.equals("java.lang.Long")) return "Long"; if (canonicalTypeStr.equals("java.lang.Short")) return "Short"; if (canonicalTypeStr.equals("java.lang.Boolean")) return "Boolean"; - return classType.getClassName(); + return classType.getClassName() != null ? classType.getClassName() : classType.getCanonicalText(); } @Override diff --git a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java index e391dc3bffc..2a205a86981 100644 --- a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java +++ b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java @@ -47,7 +47,7 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { else if (javaFile.getParent().endsWith("/class")) actual = fileToKotlin(javaCode); else if (javaFile.getParent().endsWith("/file")) actual = fileToKotlin(javaCode); - assert !actual.equals("") : "Specify what is it: file, class, method, statement or expression"; + assert !actual.isEmpty() : "Specify what is it: file, class, method, statement or expression"; final File tmp = new File(kotlinPath + ".tmp"); if (!expected.equals(actual)) writeStringToFile(tmp, actual); @@ -92,18 +92,18 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { return suite; } - void configureFromText(String text) throws IOException { + static void configureFromText(String text) throws IOException { configureFromFileText("test.java", text); } @NotNull - String fileToKotlin(String text) throws IOException { + static String fileToKotlin(String text) throws IOException { configureFromText(text); return prettify(Converter.fileToFile((PsiJavaFile) myFile).toKotlin()); } @NotNull - String methodToKotlin(String text) throws IOException { + static String methodToKotlin(String text) throws IOException { String result = fileToKotlin("final class C {" + text + "}") .replaceAll("class C\\(\\) \\{", ""); result = result.substring(0, result.lastIndexOf("}")); @@ -111,15 +111,15 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { } @NotNull - String statementToKotlin(String text) throws Exception { + static String statementToKotlin(String text) throws Exception { String result = methodToKotlin("void main() {" + text + "}"); int pos = result.lastIndexOf("}"); - result = result.substring(0, pos).replaceFirst("open fun main\\(\\) : Unit \\{", ""); + result = result.substring(0, pos).replaceFirst("fun main\\(\\) : Unit \\{", ""); return prettify(result); } @NotNull - String expressionToKotlin(String code) throws Exception { + static String expressionToKotlin(String code) throws Exception { String result = statementToKotlin("Object o =" + code + "}"); result = result.replaceFirst("var o : Any\\? =", ""); return prettify(result); diff --git a/testData/ast/arrayType/method/methodArrayArgs.kt b/testData/ast/arrayType/method/methodArrayArgs.kt index 0eadd674755..b095e2dd099 100644 --- a/testData/ast/arrayType/method/methodArrayArgs.kt +++ b/testData/ast/arrayType/method/methodArrayArgs.kt @@ -1,2 +1,2 @@ -open fun fromArrayToCollection(a : Array?) : Unit { +fun fromArrayToCollection(a : Array?) : Unit { } \ No newline at end of file diff --git a/testData/ast/callChainExpression/file/libraryFieldCall.kt b/testData/ast/callChainExpression/file/libraryFieldCall.kt index 868d83f109a..3de449db532 100644 --- a/testData/ast/callChainExpression/file/libraryFieldCall.kt +++ b/testData/ast/callChainExpression/file/libraryFieldCall.kt @@ -1,6 +1,6 @@ open class Library() { class object { -val ourOut : PrintStream? +val ourOut : java.io.PrintStream? } } open class User() { diff --git a/testData/ast/class/class/classWithEmptyMethods.kt b/testData/ast/class/class/classWithEmptyMethods.kt index d92d545ffa0..18ced74776d 100644 --- a/testData/ast/class/class/classWithEmptyMethods.kt +++ b/testData/ast/class/class/classWithEmptyMethods.kt @@ -1,8 +1,8 @@ class T() { -open fun main() : Unit { +fun main() : Unit { } -open fun i() : Int { +fun i() : Int { } -open fun s() : String? { +fun s() : String? { } } \ No newline at end of file diff --git a/testData/ast/class/class/oneStaticFieldOneNonStatic.kt b/testData/ast/class/class/oneStaticFieldOneNonStatic.kt index ebff54572d4..7be6598f76a 100644 --- a/testData/ast/class/class/oneStaticFieldOneNonStatic.kt +++ b/testData/ast/class/class/oneStaticFieldOneNonStatic.kt @@ -1,8 +1,8 @@ class S() { +fun sB() : Boolean { +return true +} class object { var myI : Int = 10 } -open fun sB() : Boolean { -return true -} } \ No newline at end of file diff --git a/testData/ast/class/class/oneStaticMethod.kt b/testData/ast/class/class/oneStaticMethod.kt index 6906f476300..beb564521e3 100644 --- a/testData/ast/class/class/oneStaticMethod.kt +++ b/testData/ast/class/class/oneStaticMethod.kt @@ -1,6 +1,6 @@ class S() { class object { -open fun staticF() : Boolean { +fun staticF() : Boolean { return true } } diff --git a/testData/ast/class/class/oneStaticMethodOneNonStatic.kt b/testData/ast/class/class/oneStaticMethodOneNonStatic.kt index a50ebaff602..cb96091ed53 100644 --- a/testData/ast/class/class/oneStaticMethodOneNonStatic.kt +++ b/testData/ast/class/class/oneStaticMethodOneNonStatic.kt @@ -1,10 +1,10 @@ class S() { +fun sB() : Boolean { +return true +} class object { -open fun sI() : Int { +fun sI() : Int { return 1 } } -open fun sB() : Boolean { -return true -} } \ No newline at end of file diff --git a/testData/ast/class/class/twoStaticMethod.kt b/testData/ast/class/class/twoStaticMethod.kt index 0500e4be576..87bd397e519 100644 --- a/testData/ast/class/class/twoStaticMethod.kt +++ b/testData/ast/class/class/twoStaticMethod.kt @@ -1,9 +1,9 @@ class S() { class object { -open fun sB() : Boolean { +fun sB() : Boolean { return true } -open fun sI() : Int { +fun sI() : Int { return 1 } } diff --git a/testData/ast/constructors/file/customerBuilder.kt b/testData/ast/constructors/file/customerBuilder.kt index 4940f8f8b50..7218a7f38bf 100644 --- a/testData/ast/constructors/file/customerBuilder.kt +++ b/testData/ast/constructors/file/customerBuilder.kt @@ -1,4 +1,4 @@ -namespace org.test.customer { +namespace org.test.customer open class Customer(first : String?, last : String?) { public val _firstName : String? public val _lastName : String? @@ -31,16 +31,15 @@ _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()) } } -} } \ No newline at end of file diff --git a/testData/ast/constructors/file/genericIdentifier.jav b/testData/ast/constructors/file/genericIdentifier.jav new file mode 100644 index 00000000000..c77f997a1c6 --- /dev/null +++ b/testData/ast/constructors/file/genericIdentifier.jav @@ -0,0 +1,33 @@ +public class Identifier { + private final T myName; + private boolean myHasDollar; + private boolean myNullable = true; + + public Identifier(T name) { + myName = name; + } + + public Identifier(T name, boolean isNullable) { + myName = name; + myNullable = isNullable; + } + + public Identifier(T name, boolean hasDollar, boolean isNullable) { + myName = name; + myHasDollar = hasDollar; + myNullable = isNullable; + } + + @Override + public T getName() { + return myName; + } +} + +public class User { + public static void main() { + Identifier i1 = new Identifier("name", false, true); + Identifier i2 = new Identifier("name", false); + Identifier i3 = new Identifier("name"); + } +} \ No newline at end of file diff --git a/testData/ast/constructors/file/genericIdentifier.kt b/testData/ast/constructors/file/genericIdentifier.kt new file mode 100644 index 00000000000..314b85e84f0 --- /dev/null +++ b/testData/ast/constructors/file/genericIdentifier.kt @@ -0,0 +1,37 @@ +public open class Identifier(myName : T?, myHasDollar : Boolean) { +private val myName : T? +private var myHasDollar : Boolean +private var myNullable : Boolean = true +open public fun getName() : T? { +return myName +} +class object { +open public fun init(name : T?) : Identifier { +val __ = Identifier(name, false) +return __ +} +open public fun init(name : T?, isNullable : Boolean) : Identifier { +val __ = Identifier(name, false) +__.myNullable = isNullable +return __ +} +open public fun init(name : T?, hasDollar : Boolean, isNullable : Boolean) : Identifier { +val __ = Identifier(name, hasDollar) +__.myNullable = isNullable +return __ +} +} +{ +$myName = myName +$myHasDollar = myHasDollar +} +} +public open class User() { +class object { +open public fun main() : Unit { +var i1 : Identifier<*>? = Identifier.init("name", false, true) +var i2 : Identifier<*>? = Identifier.init("name", false) +var i3 : Identifier<*>? = Identifier.init("name") +} +} +} \ No newline at end of file diff --git a/testData/ast/constructors/file/identifier.kt b/testData/ast/constructors/file/identifier.kt index 71bfa01998e..384974d68f7 100644 --- a/testData/ast/constructors/file/identifier.kt +++ b/testData/ast/constructors/file/identifier.kt @@ -2,6 +2,9 @@ public open class Identifier(myName : String?, myHasDollar : Boolean) { private val myName : String? private var myHasDollar : Boolean private var myNullable : Boolean = true +open public fun getName() : String? { +return myName +} class object { open public fun init(name : String?) : Identifier { val __ = Identifier(name, false) @@ -18,9 +21,6 @@ __.myNullable = isNullable return __ } } -open public fun getName() : String? { -return myName -} { $myName = myName $myHasDollar = myHasDollar diff --git a/testData/ast/file/file/packageWithClass.kt b/testData/ast/file/file/packageWithClass.kt index 48abf7a9bbf..8b169b30b42 100644 --- a/testData/ast/file/file/packageWithClass.kt +++ b/testData/ast/file/file/packageWithClass.kt @@ -1,4 +1,3 @@ -namespace test { +namespace test class C() { -} } \ No newline at end of file diff --git a/testData/ast/file/file/packageWithImports.kt b/testData/ast/file/file/packageWithImports.kt index 1cb4a91ba46..076ff7373a9 100644 --- a/testData/ast/file/file/packageWithImports.kt +++ b/testData/ast/file/file/packageWithImports.kt @@ -1,4 +1,3 @@ -namespace test { +namespace test import ast -import ast2 -} \ No newline at end of file +import ast2 \ No newline at end of file diff --git a/testData/ast/file/file/packageWithMixedImports.kt b/testData/ast/file/file/packageWithMixedImports.kt index 1cb4a91ba46..076ff7373a9 100644 --- a/testData/ast/file/file/packageWithMixedImports.kt +++ b/testData/ast/file/file/packageWithMixedImports.kt @@ -1,4 +1,3 @@ -namespace test { +namespace test import ast -import ast2 -} \ No newline at end of file +import ast2 \ No newline at end of file diff --git a/testData/ast/file/file/packageWithOpenClass.kt b/testData/ast/file/file/packageWithOpenClass.kt index e229fa8c6ee..37c1f1c767f 100644 --- a/testData/ast/file/file/packageWithOpenClass.kt +++ b/testData/ast/file/file/packageWithOpenClass.kt @@ -1,4 +1,3 @@ -namespace test { +namespace test open class C() { -} } \ No newline at end of file diff --git a/testData/ast/file/file/packageWithStaticImports.kt b/testData/ast/file/file/packageWithStaticImports.kt index 1cb4a91ba46..076ff7373a9 100644 --- a/testData/ast/file/file/packageWithStaticImports.kt +++ b/testData/ast/file/file/packageWithStaticImports.kt @@ -1,4 +1,3 @@ -namespace test { +namespace test import ast -import ast2 -} \ No newline at end of file +import ast2 \ No newline at end of file diff --git a/testData/ast/for/statement/forRangeWithLE.jav b/testData/ast/for/statement/forRangeWithLE.jav new file mode 100644 index 00000000000..a0069d48943 --- /dev/null +++ b/testData/ast/for/statement/forRangeWithLE.jav @@ -0,0 +1,2 @@ +int[] array = new int[10]; +for (int i = 0; i <= 10; i++) {array[i] = i;} \ No newline at end of file diff --git a/testData/ast/for/statement/forRangeWithLE.kt b/testData/ast/for/statement/forRangeWithLE.kt new file mode 100644 index 00000000000..125e3d65192 --- /dev/null +++ b/testData/ast/for/statement/forRangeWithLE.kt @@ -0,0 +1,4 @@ +var array : IntArray? = IntArray?(10, {null}) +for (i in 0..10) { +array[i] = i +} \ No newline at end of file diff --git a/testData/ast/for/statement/forRangeWithLT.jav b/testData/ast/for/statement/forRangeWithLT.jav new file mode 100644 index 00000000000..19b24cf03fb --- /dev/null +++ b/testData/ast/for/statement/forRangeWithLT.jav @@ -0,0 +1,2 @@ +int[] array = new int[10]; +for (int i = 0; i < 10; i++) {array[i] = i;} \ No newline at end of file diff --git a/testData/ast/for/statement/forRangeWithLT.kt b/testData/ast/for/statement/forRangeWithLT.kt new file mode 100644 index 00000000000..a5a4520c43a --- /dev/null +++ b/testData/ast/for/statement/forRangeWithLT.kt @@ -0,0 +1,4 @@ +var array : IntArray? = IntArray?(10, {null}) +for (i in 0..(10 - 1)) { +array[i] = i +} \ No newline at end of file diff --git a/testData/ast/for/statement/forWithBlock.jav b/testData/ast/for/statement/forWithBlock.jav index b470371f4a3..19b24cf03fb 100644 --- a/testData/ast/for/statement/forWithBlock.jav +++ b/testData/ast/for/statement/forWithBlock.jav @@ -1 +1,2 @@ -for (int i = 0; i < 0; i++) {int i = 1; i++;} \ No newline at end of file +int[] array = new int[10]; +for (int i = 0; i < 10; i++) {array[i] = i;} \ No newline at end of file diff --git a/testData/ast/for/statement/forWithBlock.kt b/testData/ast/for/statement/forWithBlock.kt index 2ed9ae1e9a0..a5a4520c43a 100644 --- a/testData/ast/for/statement/forWithBlock.kt +++ b/testData/ast/for/statement/forWithBlock.kt @@ -1,13 +1,4 @@ -{ -var i : Int = 0 -while ((i < 0)) -{ -{ -var i : Int = 1 -(i++) -} -{ -(i++) -} -} +var array : IntArray? = IntArray?(10, {null}) +for (i in 0..(10 - 1)) { +array[i] = i } \ No newline at end of file diff --git a/testData/ast/for/statement/forWithExpression.kt b/testData/ast/for/statement/forWithExpression.kt index 2fa4c89935e..6333d6a9828 100644 --- a/testData/ast/for/statement/forWithExpression.kt +++ b/testData/ast/for/statement/forWithExpression.kt @@ -1,10 +1 @@ -{ -var i : Int = 0 -while ((i < 0)) -{ -(t++) -{ -(i++) -} -} -} \ No newline at end of file +for (i in 0..(0 - 1)) (t++) \ No newline at end of file diff --git a/testData/ast/function/file/functionInFinalClass.jav b/testData/ast/function/file/functionInFinalClass.jav new file mode 100644 index 00000000000..e8417401a9a --- /dev/null +++ b/testData/ast/function/file/functionInFinalClass.jav @@ -0,0 +1,5 @@ +package demo; + +final class Final { + void test() {} +} \ No newline at end of file diff --git a/testData/ast/function/file/functionInFinalClass.kt b/testData/ast/function/file/functionInFinalClass.kt new file mode 100644 index 00000000000..507b84ba7d4 --- /dev/null +++ b/testData/ast/function/file/functionInFinalClass.kt @@ -0,0 +1,5 @@ +namespace demo +class Final() { +fun test() : Unit { +} +} \ No newline at end of file diff --git a/testData/ast/function/method/abstractMethod.kt b/testData/ast/function/method/abstractMethod.kt index f5e9004be67..8163dfad9bb 100644 --- a/testData/ast/function/method/abstractMethod.kt +++ b/testData/ast/function/method/abstractMethod.kt @@ -1 +1 @@ -abstract open fun getNoofGears() : Int \ No newline at end of file +abstract fun getNoofGears() : Int \ No newline at end of file diff --git a/testData/ast/function/method/classGenericParam.kt b/testData/ast/function/method/classGenericParam.kt index a232b7e30fe..b9ea1d49799 100644 --- a/testData/ast/function/method/classGenericParam.kt +++ b/testData/ast/function/method/classGenericParam.kt @@ -1,2 +1,2 @@ -open fun getT() : T? { +fun getT() : T? { } \ No newline at end of file diff --git a/testData/ast/function/method/emptyVoidMethod.kt b/testData/ast/function/method/emptyVoidMethod.kt index 25bd4ab1d8e..ae299eb173a 100644 --- a/testData/ast/function/method/emptyVoidMethod.kt +++ b/testData/ast/function/method/emptyVoidMethod.kt @@ -1,2 +1,2 @@ -open fun main() : Unit { +fun main() : Unit { } \ No newline at end of file diff --git a/testData/ast/function/method/internal.kt b/testData/ast/function/method/internal.kt index 86f2b8d992f..5b3e9634f3f 100644 --- a/testData/ast/function/method/internal.kt +++ b/testData/ast/function/method/internal.kt @@ -1,2 +1,2 @@ -open fun test() : Unit { +fun test() : Unit { } \ No newline at end of file diff --git a/testData/ast/function/method/main.kt b/testData/ast/function/method/main.kt index 8d173e36a09..164c099f986 100644 --- a/testData/ast/function/method/main.kt +++ b/testData/ast/function/method/main.kt @@ -1,4 +1,4 @@ class object { -open public fun main(args : Array?) : Unit { +public fun main(args : Array?) : Unit { } } \ No newline at end of file diff --git a/testData/ast/function/method/methodClassType.kt b/testData/ast/function/method/methodClassType.kt index ef426384d58..196c45b6bf8 100644 --- a/testData/ast/function/method/methodClassType.kt +++ b/testData/ast/function/method/methodClassType.kt @@ -1,2 +1,2 @@ -open fun main() : String? { +fun main() : String? { } \ No newline at end of file diff --git a/testData/ast/function/method/methodPrimitiveType.kt b/testData/ast/function/method/methodPrimitiveType.kt index 6f5f11b4c16..c6ef43f8a14 100644 --- a/testData/ast/function/method/methodPrimitiveType.kt +++ b/testData/ast/function/method/methodPrimitiveType.kt @@ -1,2 +1,2 @@ -open fun main() : Int { +fun main() : Int { } \ No newline at end of file diff --git a/testData/ast/function/method/methodPrimitiveType2.kt b/testData/ast/function/method/methodPrimitiveType2.kt index d40b67fb1a4..c978e93e7aa 100644 --- a/testData/ast/function/method/methodPrimitiveType2.kt +++ b/testData/ast/function/method/methodPrimitiveType2.kt @@ -1,2 +1,2 @@ -open fun main() : Boolean { +fun main() : Boolean { } \ No newline at end of file diff --git a/testData/ast/function/method/methodWithReturnStatement.kt b/testData/ast/function/method/methodWithReturnStatement.kt index c11bfd3dc43..acfbd1010d8 100644 --- a/testData/ast/function/method/methodWithReturnStatement.kt +++ b/testData/ast/function/method/methodWithReturnStatement.kt @@ -1,3 +1,3 @@ -open fun isTrue() : Boolean { +fun isTrue() : Boolean { return true } \ No newline at end of file diff --git a/testData/ast/function/method/open.kt b/testData/ast/function/method/open.kt index db906a336d7..e6cf12b2b3f 100644 --- a/testData/ast/function/method/open.kt +++ b/testData/ast/function/method/open.kt @@ -1,3 +1,3 @@ -open fun getString() : String? { +fun getString() : String? { return "" } \ No newline at end of file diff --git a/testData/ast/function/method/ownGenericParam.kt b/testData/ast/function/method/ownGenericParam.kt index d2ab8c63c57..e5533fdcb5f 100644 --- a/testData/ast/function/method/ownGenericParam.kt +++ b/testData/ast/function/method/ownGenericParam.kt @@ -1,2 +1,2 @@ -open fun putU(u : U?) : Unit { +fun putU(u : U?) : Unit { } \ No newline at end of file diff --git a/testData/ast/function/method/ownSeveralGenericParams.kt b/testData/ast/function/method/ownSeveralGenericParams.kt index 58e046f0576..19fb6188681 100644 --- a/testData/ast/function/method/ownSeveralGenericParams.kt +++ b/testData/ast/function/method/ownSeveralGenericParams.kt @@ -1,2 +1,2 @@ -open fun putUVW(u : U?, v : V?, w : W?) : Unit { +fun putUVW(u : U?, v : V?, w : W?) : Unit { } \ No newline at end of file diff --git a/testData/ast/function/method/private.kt b/testData/ast/function/method/private.kt index f40bc043813..45e5e8bab00 100644 --- a/testData/ast/function/method/private.kt +++ b/testData/ast/function/method/private.kt @@ -1,2 +1,2 @@ -open private fun test() : Unit { +private fun test() : Unit { } \ No newline at end of file diff --git a/testData/ast/function/method/protected.kt b/testData/ast/function/method/protected.kt index 597abfa9954..dbbc30b447b 100644 --- a/testData/ast/function/method/protected.kt +++ b/testData/ast/function/method/protected.kt @@ -1,2 +1,2 @@ -open protected fun test() : Unit { +protected fun test() : Unit { } \ No newline at end of file diff --git a/testData/ast/function/method/public.kt b/testData/ast/function/method/public.kt index 8f596ec1552..d835330ec86 100644 --- a/testData/ast/function/method/public.kt +++ b/testData/ast/function/method/public.kt @@ -1,2 +1,2 @@ -open public fun test() : Unit { +public fun test() : Unit { } \ No newline at end of file diff --git a/testData/ast/importStatement/file/importWithKeywords.kt b/testData/ast/importStatement/file/importWithKeywords.kt index 3720bbfeabc..f5babdc556c 100644 --- a/testData/ast/importStatement/file/importWithKeywords.kt +++ b/testData/ast/importStatement/file/importWithKeywords.kt @@ -1,5 +1,4 @@ -namespace test { +namespace test import `namespace`.`as`.`type`.`val`.`var`.`fun`.`is`.`in`.`object`.`when`.`trait`.`This` open class Test() { -} } \ No newline at end of file diff --git a/testData/ast/importStatement/file/importWithStar.kt b/testData/ast/importStatement/file/importWithStar.kt index 65cc2f10c67..ad30b8594cb 100644 --- a/testData/ast/importStatement/file/importWithStar.kt +++ b/testData/ast/importStatement/file/importWithStar.kt @@ -1,5 +1,4 @@ -namespace org.jetbrains.jet.j2k { +namespace org.jetbrains.jet.j2k import org.jetbrains.annotations.* public open class Converter() { -} } \ No newline at end of file diff --git a/testData/ast/importStatement/file/simpleImport.kt b/testData/ast/importStatement/file/simpleImport.kt index 0a97e34e764..dcead7d53b8 100644 --- a/testData/ast/importStatement/file/simpleImport.kt +++ b/testData/ast/importStatement/file/simpleImport.kt @@ -1,5 +1,4 @@ -namespace org.jetbrains.jet.j2k { +namespace org.jetbrains.jet.j2k import org.jetbrains.annotations.NotNull public open class Converter() { -} } \ No newline at end of file diff --git a/testData/ast/inProjectionType/method/methodParams.kt b/testData/ast/inProjectionType/method/methodParams.kt index 51fa30eb158..6888dcd5c36 100644 --- a/testData/ast/inProjectionType/method/methodParams.kt +++ b/testData/ast/inProjectionType/method/methodParams.kt @@ -1,2 +1,2 @@ -open fun popAll(dst : Collection?) : Unit { +fun popAll(dst : Collection?) : Unit { } \ No newline at end of file diff --git a/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.kt b/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.kt index fbdba6d9552..f636c05dd7f 100644 --- a/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.kt +++ b/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.kt @@ -1,8 +1,4 @@ -@test { -var i : Int = 0 -while ((i <= max)) -{ -{ +@test for (i in 0..max) { var n : Int = substring.length() var j : Int = i var k : Int = 0 @@ -16,11 +12,6 @@ continue@test foundIt = true break@test } -{ -(i++) -} -} -} System.out?.println((if (foundIt) "Found it" else diff --git a/testData/ast/methodCallExpression/file/genericMethod.jav b/testData/ast/methodCallExpression/file/genericMethod.jav new file mode 100644 index 00000000000..952645f5f09 --- /dev/null +++ b/testData/ast/methodCallExpression/file/genericMethod.jav @@ -0,0 +1,12 @@ +package demo; + +class Map { + void put(K k, V v) {} +} + +class U { + void test() { + Map m = new Map(); + m.put("10", 10); + } +} \ No newline at end of file diff --git a/testData/ast/methodCallExpression/file/genericMethod.kt b/testData/ast/methodCallExpression/file/genericMethod.kt new file mode 100644 index 00000000000..eb9f546267f --- /dev/null +++ b/testData/ast/methodCallExpression/file/genericMethod.kt @@ -0,0 +1,11 @@ +namespace demo +open class Map() { +open fun put(k : K?, v : V?) : Unit { +} +} +open class U() { +open fun test() : Unit { +var m : Map? = Map() +m?.put("10", 10) +} +} \ No newline at end of file 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..bfee0514886 100644 --- a/testData/ast/newClassExpression/expression/newClassWithAnonymousScope.kt +++ b/testData/ast/newClassExpression/expression/newClassWithAnonymousScope.kt @@ -1,4 +1,4 @@ -java.lang.Runnable() { +object : 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..6f47648c18f --- /dev/null +++ b/testData/ast/newClassExpression/file/fullQualifiedName.kt @@ -0,0 +1,7 @@ +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/fullQualifiedName2.jav b/testData/ast/newClassExpression/file/fullQualifiedName2.jav new file mode 100644 index 00000000000..e8ef97b8b9e --- /dev/null +++ b/testData/ast/newClassExpression/file/fullQualifiedName2.jav @@ -0,0 +1,7 @@ +package test; + +class User { + void main() { + java.util.List list = new java.util.LinkedList(); + } +} \ No newline at end of file diff --git a/testData/ast/newClassExpression/file/fullQualifiedName2.kt b/testData/ast/newClassExpression/file/fullQualifiedName2.kt new file mode 100644 index 00000000000..694d09886dc --- /dev/null +++ b/testData/ast/newClassExpression/file/fullQualifiedName2.kt @@ -0,0 +1,6 @@ +namespace test +open class User() { +open fun main() : Unit { +var list : java.util.List<*>? = java.util.LinkedList() +} +} \ No newline at end of file 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/newClassByFullName.kt b/testData/ast/newClassExpression/file/newClassByFullName.kt index 560846c9186..c60db08ecaa 100644 --- a/testData/ast/newClassExpression/file/newClassByFullName.kt +++ b/testData/ast/newClassExpression/file/newClassByFullName.kt @@ -1,9 +1,8 @@ -namespace org.test { +namespace org.test 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..1f4cdf9f589 --- /dev/null +++ b/testData/ast/newClassExpression/file/newInnerClass.jav @@ -0,0 +1,13 @@ +package org.test; + +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..b3bbbdf8623 --- /dev/null +++ b/testData/ast/newClassExpression/file/newInnerClass.kt @@ -0,0 +1,11 @@ +namespace org.test +open class OuterClass() { +open class InnerClass() { +} +} +open class User() { +open fun main() : Unit { +var outerObject : OuterClass? = OuterClass() +var innerObject : OuterClass.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..a13a2515a54 --- /dev/null +++ b/testData/ast/newClassExpression/file/newListAndNewMember.kt @@ -0,0 +1,11 @@ +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..61338ae3cfc --- /dev/null +++ b/testData/ast/newClassExpression/file/newStaticInnerClass.kt @@ -0,0 +1,12 @@ +namespace demo +open class Foo() { +class object { +open class Bar() { +} +} +} +open class User() { +open fun main() : Unit { +var boo : Foo.Bar? = Foo.Bar() +} +} \ No newline at end of file diff --git a/testData/ast/objectLiteral/file/MyFrame.jav b/testData/ast/objectLiteral/file/MyFrame.jav new file mode 100644 index 00000000000..28e0dbef4de --- /dev/null +++ b/testData/ast/objectLiteral/file/MyFrame.jav @@ -0,0 +1,24 @@ +package demo; + +class WindowAdapter { + public void windowClosing () { + } +} + +public final class Client extends Frame { + Client() { + WindowAdapter a = new WindowAdapter() { + @Override + public void windowClosing () { + } + } + + addWindowListener(a); + + addWindowListener(new WindowAdapter() { + @Override + public void windowClosing () { + } + }); + } +} \ No newline at end of file diff --git a/testData/ast/objectLiteral/file/MyFrame.kt b/testData/ast/objectLiteral/file/MyFrame.kt new file mode 100644 index 00000000000..1957f66f297 --- /dev/null +++ b/testData/ast/objectLiteral/file/MyFrame.kt @@ -0,0 +1,18 @@ +namespace demo +open class WindowAdapter() { +open public fun windowClosing() : Unit { +} +} +public class Client() : Frame() { +{ +var a : WindowAdapter? = object : WindowAdapter() { +override public fun windowClosing() : Unit { +} +} +addWindowListener(a) +addWindowListener(object : WindowAdapter() { +override public fun windowClosing() : Unit { +} +}) +} +} \ No newline at end of file diff --git a/testData/ast/outProjectionType/method/methodParams.kt b/testData/ast/outProjectionType/method/methodParams.kt index 895538b7d7f..373c01e629f 100644 --- a/testData/ast/outProjectionType/method/methodParams.kt +++ b/testData/ast/outProjectionType/method/methodParams.kt @@ -1,2 +1,2 @@ -open fun pushAll(src : Collection?) : Unit { +fun pushAll(src : Collection?) : Unit { } \ No newline at end of file diff --git a/testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.kt b/testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.kt index 9700c7d464f..d4534115df5 100644 --- a/testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.kt +++ b/testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.kt @@ -1,6 +1,5 @@ -namespace org.jetbrains.jet.j2k.`in` { +namespace org.jetbrains.jet.j2k.`in` import org.jetbrains.annotations.NotNull import org.jetbrains.annotations.Nullable public open class Converter() { -} } \ No newline at end of file diff --git a/testData/ast/rawGenerics/file/kt-540-rawGenericClass.jav b/testData/ast/rawGenerics/file/kt-540-rawGenericClass.jav new file mode 100644 index 00000000000..28e9ae350cc --- /dev/null +++ b/testData/ast/rawGenerics/file/kt-540-rawGenericClass.jav @@ -0,0 +1,15 @@ +package demo; + +class Collection { + Collection(E e) { + System.out.println(e); + } +} + +class Test { + void main() { + Collection raw1 = new Collection(1); + Collection raw2 = new Collection(1); + Collection raw3 = new Collection("1"); + } +} \ No newline at end of file diff --git a/testData/ast/rawGenerics/file/kt-540-rawGenericClass.kt b/testData/ast/rawGenerics/file/kt-540-rawGenericClass.kt new file mode 100644 index 00000000000..3fd7726bfd0 --- /dev/null +++ b/testData/ast/rawGenerics/file/kt-540-rawGenericClass.kt @@ -0,0 +1,13 @@ +namespace demo +open class Collection(e : E?) { +{ +System.out?.println(e) +} +} +open class Test() { +open fun main() : Unit { +var raw1 : Collection<*>? = Collection(1) +var raw2 : Collection<*>? = Collection(1) +var raw3 : Collection<*>? = Collection("1") +} +} \ No newline at end of file diff --git a/testData/ast/rawGenerics/file/kt-540.jav b/testData/ast/rawGenerics/file/kt-540.jav new file mode 100644 index 00000000000..6327874eab3 --- /dev/null +++ b/testData/ast/rawGenerics/file/kt-540.jav @@ -0,0 +1,12 @@ +package demo; + +import java.util.List; +import java.util.LinkedList; + +class Test { + void main() { + List common = new LinkedList(); + List raw = new LinkedList(); + List superRaw = new LinkedList(); + } +} \ No newline at end of file diff --git a/testData/ast/rawGenerics/file/kt-540.kt b/testData/ast/rawGenerics/file/kt-540.kt new file mode 100644 index 00000000000..bf2f869cf42 --- /dev/null +++ b/testData/ast/rawGenerics/file/kt-540.kt @@ -0,0 +1,10 @@ +namespace demo +import java.util.List +import java.util.LinkedList +open class Test() { +open fun main() : Unit { +var common : List? = LinkedList() +var raw : List<*>? = LinkedList() +var superRaw : List<*>? = LinkedList() +} +} \ No newline at end of file diff --git a/testData/ast/rawGenerics/file/rawGenericMethod.jav b/testData/ast/rawGenerics/file/rawGenericMethod.jav new file mode 100644 index 00000000000..1303b4a305a --- /dev/null +++ b/testData/ast/rawGenerics/file/rawGenericMethod.jav @@ -0,0 +1,14 @@ +package demo; + +class TestT { + void getT() { } +} + +class U { + void main() { + TestT t = new TestT(); + t.getT(); + t.getT(); + t.getT(); + } +} \ No newline at end of file diff --git a/testData/ast/rawGenerics/file/rawGenericMethod.kt b/testData/ast/rawGenerics/file/rawGenericMethod.kt new file mode 100644 index 00000000000..bce70b24a11 --- /dev/null +++ b/testData/ast/rawGenerics/file/rawGenericMethod.kt @@ -0,0 +1,13 @@ +namespace demo +open class TestT() { +open fun getT() : Unit { +} +} +open class U() { +open fun main() : Unit { +var t : TestT? = TestT() +t?.getT() +t?.getT() +t?.getT() +} +} \ No newline at end of file diff --git a/testData/ast/starProjectionType/method/methodParams.kt b/testData/ast/starProjectionType/method/methodParams.kt index 4e2b7104724..01ea4c15302 100644 --- a/testData/ast/starProjectionType/method/methodParams.kt +++ b/testData/ast/starProjectionType/method/methodParams.kt @@ -1,2 +1,2 @@ -open fun wtf(w : Collection<*>?) : Unit { +fun wtf(w : Collection<*>?) : Unit { } \ No newline at end of file diff --git a/testData/ast/typeParameters/method/methodDoubleParametrizationWithTwoBounds.kt b/testData/ast/typeParameters/method/methodDoubleParametrizationWithTwoBounds.kt index d29c4d690fb..21f892b7d8d 100644 --- a/testData/ast/typeParameters/method/methodDoubleParametrizationWithTwoBounds.kt +++ b/testData/ast/typeParameters/method/methodDoubleParametrizationWithTwoBounds.kt @@ -1,2 +1,2 @@ -open fun max(coll : Collection?) : T? where T : Comparable?, K : Collection? { +fun max(coll : Collection?) : T? where T : Comparable?, K : Collection? { } \ No newline at end of file diff --git a/testData/ast/typeParameters/method/where.kt b/testData/ast/typeParameters/method/where.kt index 732410c49ba..6a1ccaeeec6 100644 --- a/testData/ast/typeParameters/method/where.kt +++ b/testData/ast/typeParameters/method/where.kt @@ -1,2 +1,2 @@ -open fun max(coll : Collection?) : T? where T : Comparable? { +fun max(coll : Collection?) : T? where T : Comparable? { } \ No newline at end of file diff --git a/testData/ast/varArg/method/ellipsisTypeSeveralParams.kt b/testData/ast/varArg/method/ellipsisTypeSeveralParams.kt index b69052b794a..78207eee74b 100644 --- a/testData/ast/varArg/method/ellipsisTypeSeveralParams.kt +++ b/testData/ast/varArg/method/ellipsisTypeSeveralParams.kt @@ -1 +1 @@ -open fun format(pattern : String?, vararg arguments : Any?) : String? \ No newline at end of file +fun format(pattern : String?, vararg arguments : Any?) : String? \ No newline at end of file diff --git a/testData/ast/varArg/method/ellipsisTypeSingleParams.kt b/testData/ast/varArg/method/ellipsisTypeSingleParams.kt index 3dc3d147740..5219629e1e3 100644 --- a/testData/ast/varArg/method/ellipsisTypeSingleParams.kt +++ b/testData/ast/varArg/method/ellipsisTypeSingleParams.kt @@ -1,2 +1,2 @@ -open fun pushAll(vararg objs : Any?) : Unit { +fun pushAll(vararg objs : Any?) : Unit { } \ No newline at end of file From 811d732c1ebafc579aa77584bd0ed7fc83320276 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 24 Nov 2011 13:09:57 +0400 Subject: [PATCH 133/206] /s/cyclicShiftRight/ushr/g --- src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java | 6 +++--- .../assignmentExpression/expression/unsignedRightShift.kt | 2 +- .../ast/binaryExpression/expression/unsignedRightShift.kt | 2 +- .../polyadicExpression/expression/unassignedShiftRight.kt | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 126a1b1653c..1bee18ba7db 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -56,7 +56,7 @@ public class ExpressionVisitor extends StatementVisitor { if (tokenType == JavaTokenType.XOREQ) secondOp = "xor"; if (tokenType == JavaTokenType.ANDEQ) secondOp = "and"; if (tokenType == JavaTokenType.OREQ) secondOp = "or"; - if (tokenType == JavaTokenType.GTGTGTEQ) secondOp = "cyclicShiftRight"; + if (tokenType == JavaTokenType.GTGTGTEQ) secondOp = "ushr"; if (!secondOp.isEmpty()) // if not Kotlin operators myResult = new AssignmentExpression( @@ -88,7 +88,7 @@ public class ExpressionVisitor extends StatementVisitor { if (tokenType == JavaTokenType.XOR) return "xor"; if (tokenType == JavaTokenType.AND) return "and"; if (tokenType == JavaTokenType.OR) return "or"; - if (tokenType == JavaTokenType.GTGTGT) return "cyclicShiftRight"; + if (tokenType == JavaTokenType.GTGTGT) return "ushr"; if (tokenType == JavaTokenType.GT) return ">"; if (tokenType == JavaTokenType.LT) return "<"; if (tokenType == JavaTokenType.GE) return ">="; @@ -112,7 +112,7 @@ public class ExpressionVisitor extends StatementVisitor { if (expression.getOperationSign().getTokenType() == JavaTokenType.GTGTGT) myResult = new DummyMethodCallExpression( expressionToExpression(expression.getLOperand()), - "cyclicShiftRight", + "ushr", expressionToExpression(expression.getROperand())); else myResult = diff --git a/testData/ast/assignmentExpression/expression/unsignedRightShift.kt b/testData/ast/assignmentExpression/expression/unsignedRightShift.kt index bf15c8f56c5..484c3a6a13d 100644 --- a/testData/ast/assignmentExpression/expression/unsignedRightShift.kt +++ b/testData/ast/assignmentExpression/expression/unsignedRightShift.kt @@ -1 +1 @@ -x = (x cyclicShiftRight 2) \ No newline at end of file +x = (x ushr 2) \ No newline at end of file diff --git a/testData/ast/binaryExpression/expression/unsignedRightShift.kt b/testData/ast/binaryExpression/expression/unsignedRightShift.kt index cda6648c88e..8b8c1f89e58 100644 --- a/testData/ast/binaryExpression/expression/unsignedRightShift.kt +++ b/testData/ast/binaryExpression/expression/unsignedRightShift.kt @@ -1 +1 @@ -x.cyclicShiftRight(2) \ No newline at end of file +x.ushr(2) \ No newline at end of file diff --git a/testData/ast/polyadicExpression/expression/unassignedShiftRight.kt b/testData/ast/polyadicExpression/expression/unassignedShiftRight.kt index 789248920ea..cc8c414081e 100644 --- a/testData/ast/polyadicExpression/expression/unassignedShiftRight.kt +++ b/testData/ast/polyadicExpression/expression/unassignedShiftRight.kt @@ -1 +1 @@ -(1 cyclicShiftRight 2 cyclicShiftRight 3) \ No newline at end of file +(1 ushr 2 ushr 3) \ No newline at end of file From a3c91abd4df7f664ab9801c7f48438e84a516b0f Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 24 Nov 2011 13:10:14 +0400 Subject: [PATCH 134/206] inspections from jet project imported --- j2k.ipr | 419 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 419 insertions(+) diff --git a/j2k.ipr b/j2k.ipr index 0725715a2d7..0a37fa886cd 100644 --- a/j2k.ipr +++ b/j2k.ipr @@ -31,6 +31,425 @@ + + + + + + From 7d117471e9b3a1006afd36bf977698f51b6691fa Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 24 Nov 2011 13:15:27 +0400 Subject: [PATCH 135/206] cleanup --- .../jet/j2k/ast/ForeachWithRangeStatement.java | 8 ++++---- src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java | 2 +- src/org/jetbrains/jet/j2k/util/AstUtil.java | 5 ++++- .../jetbrains/jet/j2k/JavaToKotlinConverterTest.java | 10 +++++----- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/ast/ForeachWithRangeStatement.java b/src/org/jetbrains/jet/j2k/ast/ForeachWithRangeStatement.java index b5669d33a68..b6aa9e622e0 100644 --- a/src/org/jetbrains/jet/j2k/ast/ForeachWithRangeStatement.java +++ b/src/org/jetbrains/jet/j2k/ast/ForeachWithRangeStatement.java @@ -6,10 +6,10 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public class ForeachWithRangeStatement extends Statement { - private Expression myStart; - private IdentifierImpl myIdentifier; - private Expression myEnd; - private Statement myBody; + private final Expression myStart; + private final IdentifierImpl myIdentifier; + private final Expression myEnd; + private final Statement myBody; public ForeachWithRangeStatement(IdentifierImpl identifier, Expression start, Expression end, Statement body) { myStart = start; diff --git a/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java b/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java index c487cfb5fff..9a75669b02d 100644 --- a/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java +++ b/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java @@ -39,7 +39,7 @@ public class IdentifierImpl extends Expression implements Identifier { return myIsNullable; } - private String ifNeedQuote(String name) { + private static String ifNeedQuote(String name) { if (ONLY_KOTLIN_KEYWORDS.contains(name) || name.contains("$")) return quote(name); return name; diff --git a/src/org/jetbrains/jet/j2k/util/AstUtil.java b/src/org/jetbrains/jet/j2k/util/AstUtil.java index 7b2c391fe3c..d5715267101 100644 --- a/src/org/jetbrains/jet/j2k/util/AstUtil.java +++ b/src/org/jetbrains/jet/j2k/util/AstUtil.java @@ -9,7 +9,10 @@ import java.util.List; * @author ignatov */ public class AstUtil { - private static String join(final String array[], final String delimiter) { + private AstUtil() { + } + + private static String join(final String[] array, final String delimiter) { StringBuilder buffer = new StringBuilder(); boolean haveDelimiter = (delimiter != null); diff --git a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java index 2a205a86981..608c3997d5d 100644 --- a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java +++ b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java @@ -92,18 +92,18 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { return suite; } - static void configureFromText(String text) throws IOException { + private static void configureFromText(String text) throws IOException { configureFromFileText("test.java", text); } @NotNull - static String fileToKotlin(String text) throws IOException { + private static String fileToKotlin(String text) throws IOException { configureFromText(text); return prettify(Converter.fileToFile((PsiJavaFile) myFile).toKotlin()); } @NotNull - static String methodToKotlin(String text) throws IOException { + private static String methodToKotlin(String text) throws IOException { String result = fileToKotlin("final class C {" + text + "}") .replaceAll("class C\\(\\) \\{", ""); result = result.substring(0, result.lastIndexOf("}")); @@ -111,7 +111,7 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { } @NotNull - static String statementToKotlin(String text) throws Exception { + private static String statementToKotlin(String text) throws Exception { String result = methodToKotlin("void main() {" + text + "}"); int pos = result.lastIndexOf("}"); result = result.substring(0, pos).replaceFirst("fun main\\(\\) : Unit \\{", ""); @@ -119,7 +119,7 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { } @NotNull - static String expressionToKotlin(String code) throws Exception { + private static String expressionToKotlin(String code) throws Exception { String result = statementToKotlin("Object o =" + code + "}"); result = result.replaceFirst("var o : Any\\? =", ""); return prettify(result); From d6efe927bf9f3ed5d841bffcf3b0649c81fc5cf2 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 24 Nov 2011 13:59:32 +0400 Subject: [PATCH 136/206] literals supported more correctly --- .../jet/j2k/visitors/ExpressionVisitor.java | 30 +++++++++++++++---- testData/ast/literalExpression/file/char.jav | 6 ++++ testData/ast/literalExpression/file/char.kt | 6 ++++ .../literalExpression/file/endsWithDFL.jav | 21 +++++++++++++ .../ast/literalExpression/file/endsWithDFL.kt | 18 +++++++++++ testData/ast/literalExpression/file/hex.jav | 6 ++++ testData/ast/literalExpression/file/hex.kt | 6 ++++ testData/ast/literalExpression/file/octal.jav | 6 ++++ testData/ast/literalExpression/file/octal.kt | 6 ++++ .../literalExpression/file/trueOrFalse.jav | 9 ++++++ .../ast/literalExpression/file/trueOrFalse.kt | 8 +++++ 11 files changed, 116 insertions(+), 6 deletions(-) create mode 100644 testData/ast/literalExpression/file/char.jav create mode 100644 testData/ast/literalExpression/file/char.kt create mode 100644 testData/ast/literalExpression/file/endsWithDFL.jav create mode 100644 testData/ast/literalExpression/file/endsWithDFL.kt create mode 100644 testData/ast/literalExpression/file/hex.jav create mode 100644 testData/ast/literalExpression/file/hex.kt create mode 100644 testData/ast/literalExpression/file/octal.jav create mode 100644 testData/ast/literalExpression/file/octal.kt create mode 100644 testData/ast/literalExpression/file/trueOrFalse.jav create mode 100644 testData/ast/literalExpression/file/trueOrFalse.kt diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 1bee18ba7db..4b3bda246ad 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -1,7 +1,6 @@ package org.jetbrains.jet.j2k.visitors; 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.annotations.Nullable; @@ -158,11 +157,23 @@ public class ExpressionVisitor extends StatementVisitor { @Override public void visitLiteralExpression(PsiLiteralExpression expression) { super.visitLiteralExpression(expression); - myResult = new LiteralExpression( - new IdentifierImpl( - ((PsiLiteralExpressionImpl) expression).getCanonicalText() // TODO - ) - ); + + final Object value = expression.getValue(); + String text = expression.getText(); + + final PsiType type = expression.getType(); + if (type != null) { + String canonicalTypeStr = type.getCanonicalText(); + if (canonicalTypeStr.equals("double") || canonicalTypeStr.equals("java.lang.Double")) + text = text.replace("D", "").replace("d", ""); + if (canonicalTypeStr.equals("float") || canonicalTypeStr.equals("java.lang.Float")) + text = text.replace("F", "").replace("f", "") + "." + "flt"; + if (canonicalTypeStr.equals("long") || canonicalTypeStr.equals("java.lang.Long")) + text = text.replace("L", "").replace("l", ""); + if (canonicalTypeStr.equals("int") || canonicalTypeStr.equals("java.lang.Integer")) // need for hex support + text = value != null ? value.toString() : text; + } + myResult = new LiteralExpression(new IdentifierImpl(text)); } @Override @@ -405,4 +416,11 @@ public class ExpressionVisitor extends StatementVisitor { getOperatorString(expression.getOperationTokenType()) ); } +} + +class Test { + void test() { + char c1 = 'c'; + Character c2 = 'C'; + } } \ No newline at end of file diff --git a/testData/ast/literalExpression/file/char.jav b/testData/ast/literalExpression/file/char.jav new file mode 100644 index 00000000000..653706393b2 --- /dev/null +++ b/testData/ast/literalExpression/file/char.jav @@ -0,0 +1,6 @@ +class Test { + void test() { + char c1 = 'c'; + Character c2 = 'C'; + } +} \ No newline at end of file diff --git a/testData/ast/literalExpression/file/char.kt b/testData/ast/literalExpression/file/char.kt new file mode 100644 index 00000000000..d8749cea99d --- /dev/null +++ b/testData/ast/literalExpression/file/char.kt @@ -0,0 +1,6 @@ +open class Test() { +open fun test() : Unit { +var c1 : Char = 'c' +var c2 : Char? = 'C' +} +} \ No newline at end of file diff --git a/testData/ast/literalExpression/file/endsWithDFL.jav b/testData/ast/literalExpression/file/endsWithDFL.jav new file mode 100644 index 00000000000..4b4450d3303 --- /dev/null +++ b/testData/ast/literalExpression/file/endsWithDFL.jav @@ -0,0 +1,21 @@ +class Test { + void test() { + long l1 = 10L; + double d1 = 10.0D; + float f1 = 10.0F; + + long l2 = 10l; + double d2 = 10.0d; + float f2 = 10.0f; + } + + void testBoxed() { + Long l1 = 10L; + Double d1 = 10.0D; + Float f1 = 10.0F; + + Long l2 = 10l; + Double d2 = 10.0d; + Float f2 = 10.0f; + } +} \ No newline at end of file diff --git a/testData/ast/literalExpression/file/endsWithDFL.kt b/testData/ast/literalExpression/file/endsWithDFL.kt new file mode 100644 index 00000000000..48b88fd5ebc --- /dev/null +++ b/testData/ast/literalExpression/file/endsWithDFL.kt @@ -0,0 +1,18 @@ +open class Test() { +open fun test() : Unit { +var l1 : Long = 10 +var d1 : Double = 10.0 +var f1 : Float = 10.0.flt +var l2 : Long = 10 +var d2 : Double = 10.0 +var f2 : Float = 10.0.flt +} +open fun testBoxed() : Unit { +var l1 : Long? = 10 +var d1 : Double? = 10.0 +var f1 : Float? = 10.0.flt +var l2 : Long? = 10 +var d2 : Double? = 10.0 +var f2 : Float? = 10.0.flt +} +} \ No newline at end of file diff --git a/testData/ast/literalExpression/file/hex.jav b/testData/ast/literalExpression/file/hex.jav new file mode 100644 index 00000000000..285af379ea2 --- /dev/null +++ b/testData/ast/literalExpression/file/hex.jav @@ -0,0 +1,6 @@ +class Test { + void test() { + int i1 = 0x21; + Int i2 = 0x33; + } +} \ No newline at end of file diff --git a/testData/ast/literalExpression/file/hex.kt b/testData/ast/literalExpression/file/hex.kt new file mode 100644 index 00000000000..0bd6b37ae40 --- /dev/null +++ b/testData/ast/literalExpression/file/hex.kt @@ -0,0 +1,6 @@ +open class Test() { +open fun test() : Unit { +var i1 : Int = 33 +var i2 : Int? = 51 +} +} \ No newline at end of file diff --git a/testData/ast/literalExpression/file/octal.jav b/testData/ast/literalExpression/file/octal.jav new file mode 100644 index 00000000000..900549670fb --- /dev/null +++ b/testData/ast/literalExpression/file/octal.jav @@ -0,0 +1,6 @@ +class Test { + void test() { + int i1 = 045; + Int i2 = 032; + } +} \ No newline at end of file diff --git a/testData/ast/literalExpression/file/octal.kt b/testData/ast/literalExpression/file/octal.kt new file mode 100644 index 00000000000..83165bcc6fc --- /dev/null +++ b/testData/ast/literalExpression/file/octal.kt @@ -0,0 +1,6 @@ +open class Test() { +open fun test() : Unit { +var i1 : Int = 37 +var i2 : Int? = 26 +} +} \ No newline at end of file diff --git a/testData/ast/literalExpression/file/trueOrFalse.jav b/testData/ast/literalExpression/file/trueOrFalse.jav new file mode 100644 index 00000000000..2b6495e3427 --- /dev/null +++ b/testData/ast/literalExpression/file/trueOrFalse.jav @@ -0,0 +1,9 @@ +class Test { + void test() { + boolean t1 = true; + Boolean t2 = true; + + boolean f1 = false; + Boolean f2 = false; + } +} \ No newline at end of file diff --git a/testData/ast/literalExpression/file/trueOrFalse.kt b/testData/ast/literalExpression/file/trueOrFalse.kt new file mode 100644 index 00000000000..ad61883202e --- /dev/null +++ b/testData/ast/literalExpression/file/trueOrFalse.kt @@ -0,0 +1,8 @@ +open class Test() { +open fun test() : Unit { +var t1 : Boolean = true +var t2 : Boolean? = true +var f1 : Boolean = false +var f2 : Boolean? = false +} +} \ No newline at end of file From e17308479824dd555ca072de589a22b2f32e3fb3 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 28 Nov 2011 12:49:14 +0400 Subject: [PATCH 137/206] KT-564 Move "constructor body" to beginning of the class --- src/org/jetbrains/jet/j2k/ast/Class.java | 2 +- src/org/jetbrains/jet/j2k/ast/Enum.java | 2 +- .../ast/constructors/file/allCallsPrimary2.kt | 10 +++++----- .../ast/constructors/file/customerBuilder.kt | 12 +++++------ .../constructors/file/genericIdentifier.kt | 8 ++++---- testData/ast/constructors/file/identifier.kt | 8 ++++---- .../file/withManyDefaultParams.kt | 20 +++++++++---------- .../enum/class/primaryPrivateConstructor.kt | 6 +++--- .../identifier/file/finalFieldReference.kt | 6 +++--- .../file/classOneExtendsBaseGeneric.kt | 2 +- ...dsBaseWithZeroParamsNonEmptyConstructor.kt | 2 +- 11 files changed, 39 insertions(+), 39 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java index 2bff21daaa7..98c6680998f 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -168,9 +168,9 @@ public class Class extends Member { String bodyToKotlin() { return SPACE + "{" + N + + primaryConstructorBodyToKotlin() + N + AstUtil.joinNodes(getNonStatic(membersExceptConstructors()), N) + N + classObjectToKotlin() + N + - primaryConstructorBodyToKotlin() + N + "}"; } diff --git a/src/org/jetbrains/jet/j2k/ast/Enum.java b/src/org/jetbrains/jet/j2k/ast/Enum.java index 9e9c1659e7f..82bfeca2be4 100644 --- a/src/org/jetbrains/jet/j2k/ast/Enum.java +++ b/src/org/jetbrains/jet/j2k/ast/Enum.java @@ -30,8 +30,8 @@ public class Enum extends Class { public String toKotlin() { return modifiersToKotlin() + "enum" + SPACE + myName.toKotlin() + primaryConstructorSignatureToKotlin() + typeParametersToKotlin() + implementTypesToKotlin() + SPACE + "{" + N + - AstUtil.joinNodes(membersExceptConstructors(), N) + N + primaryConstructorBodyToKotlin() + N + + AstUtil.joinNodes(membersExceptConstructors(), N) + N + "}"; } } \ No newline at end of file diff --git a/testData/ast/constructors/file/allCallsPrimary2.kt b/testData/ast/constructors/file/allCallsPrimary2.kt index 01df1ce685e..37f361b89a9 100644 --- a/testData/ast/constructors/file/allCallsPrimary2.kt +++ b/testData/ast/constructors/file/allCallsPrimary2.kt @@ -1,4 +1,9 @@ open class C(arg1 : Int) { +{ +$myArg1 = arg1 +$myArg2 = 0 +$myArg3 = 0 +} val myArg1 : Int var myArg2 : Int var myArg3 : Int @@ -16,11 +21,6 @@ __.myArg3 = 0 return __ } } -{ -$myArg1 = arg1 -$myArg2 = 0 -$myArg3 = 0 -} } public open class User() { class object { diff --git a/testData/ast/constructors/file/customerBuilder.kt b/testData/ast/constructors/file/customerBuilder.kt index 7218a7f38bf..6b3e9db1448 100644 --- a/testData/ast/constructors/file/customerBuilder.kt +++ b/testData/ast/constructors/file/customerBuilder.kt @@ -1,5 +1,11 @@ namespace org.test.customer open class Customer(first : String?, last : String?) { +{ +doSmthBefore() +$_firstName = first +$_lastName = last +doSmthAfter() +} public val _firstName : String? public val _lastName : String? open public fun getFirstName() : String? { @@ -12,12 +18,6 @@ open private fun doSmthBefore() : Unit { } open private fun doSmthAfter() : Unit { } -{ -doSmthBefore() -$_firstName = first -$_lastName = last -doSmthAfter() -} } open class CustomerBuilder() { public var _firstName : String? = "Homer" diff --git a/testData/ast/constructors/file/genericIdentifier.kt b/testData/ast/constructors/file/genericIdentifier.kt index 314b85e84f0..1c7c9cc77db 100644 --- a/testData/ast/constructors/file/genericIdentifier.kt +++ b/testData/ast/constructors/file/genericIdentifier.kt @@ -1,4 +1,8 @@ public open class Identifier(myName : T?, myHasDollar : Boolean) { +{ +$myName = myName +$myHasDollar = myHasDollar +} private val myName : T? private var myHasDollar : Boolean private var myNullable : Boolean = true @@ -21,10 +25,6 @@ __.myNullable = isNullable return __ } } -{ -$myName = myName -$myHasDollar = myHasDollar -} } public open class User() { class object { diff --git a/testData/ast/constructors/file/identifier.kt b/testData/ast/constructors/file/identifier.kt index 384974d68f7..200f6bd4ed3 100644 --- a/testData/ast/constructors/file/identifier.kt +++ b/testData/ast/constructors/file/identifier.kt @@ -1,4 +1,8 @@ public open class Identifier(myName : String?, myHasDollar : Boolean) { +{ +$myName = myName +$myHasDollar = myHasDollar +} private val myName : String? private var myHasDollar : Boolean private var myNullable : Boolean = true @@ -21,10 +25,6 @@ __.myNullable = isNullable return __ } } -{ -$myName = myName -$myHasDollar = myHasDollar -} } public open class User() { class object { diff --git a/testData/ast/constructors/file/withManyDefaultParams.kt b/testData/ast/constructors/file/withManyDefaultParams.kt index 06b13888509..7817a15545b 100644 --- a/testData/ast/constructors/file/withManyDefaultParams.kt +++ b/testData/ast/constructors/file/withManyDefaultParams.kt @@ -1,4 +1,14 @@ public open class Test(myName : String?, a : Boolean, b : Double, c : Float, d : Long, e : Int, f : Short, g : Char) { +{ +$myName = myName +$a = a +$b = b +$c = c +$d = d +$e = e +$f = f +$g = g +} private val myName : String? private var a : Boolean private var b : Double @@ -20,16 +30,6 @@ open fun foo(n : String?) : String? { return "" } } -{ -$myName = myName -$a = a -$b = b -$c = c -$d = d -$e = e -$f = f -$g = g -} } public open class User() { class object { diff --git a/testData/ast/enum/class/primaryPrivateConstructor.kt b/testData/ast/enum/class/primaryPrivateConstructor.kt index 3fe8cd69ef3..6eb52b3fd81 100644 --- a/testData/ast/enum/class/primaryPrivateConstructor.kt +++ b/testData/ast/enum/class/primaryPrivateConstructor.kt @@ -1,9 +1,9 @@ enum Color(c : Int) { +{ +$code = c +} private var code : Int open public fun getCode() : Int { return code } -{ -$code = c -} } \ No newline at end of file diff --git a/testData/ast/identifier/file/finalFieldReference.kt b/testData/ast/identifier/file/finalFieldReference.kt index 215a03c5f83..6f3df706c90 100644 --- a/testData/ast/identifier/file/finalFieldReference.kt +++ b/testData/ast/identifier/file/finalFieldReference.kt @@ -3,11 +3,11 @@ open class `$$$$$`() { open class `$`() { } open class `$$`(`$$$$` : `$$$$$`?) : `$`() { +{ +$`$$$` = `$$$$` +} val `$$$` : `$$$$$`? open public fun `$$$$$$`() : `$$$$$`? { return `$$$` } -{ -$`$$$` = `$$$$` -} } \ No newline at end of file diff --git a/testData/ast/inheritance/file/classOneExtendsBaseGeneric.kt b/testData/ast/inheritance/file/classOneExtendsBaseGeneric.kt index 5f03b0858e4..b9acbfbc541 100644 --- a/testData/ast/inheritance/file/classOneExtendsBaseGeneric.kt +++ b/testData/ast/inheritance/file/classOneExtendsBaseGeneric.kt @@ -1,8 +1,8 @@ open class Base(name : T?) { } open class One(name : T?, second : K?) : Base(name) { -private var mySecond : K? { $mySecond = second } +private var mySecond : K? } \ No newline at end of file diff --git a/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.kt b/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.kt index c59aa0d172c..6381bc4f634 100644 --- a/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.kt +++ b/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.kt @@ -1,8 +1,8 @@ open class Base(name : String?) { } open class One(name : String?, second : String?) : Base(name) { -private var mySecond : String? { $mySecond = second } +private var mySecond : String? } \ No newline at end of file From 1ccdec706b899e114128fbfc42e66a453505ebab Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 28 Nov 2011 13:47:57 +0400 Subject: [PATCH 138/206] KT-639 Collect all classes for convertation and only for those classes use mechanism with static init functions invocation --- src/org/jetbrains/jet/j2k/Converter.java | 18 ++- .../jet/j2k/visitors/ClassVisitor.java | 28 ++++ .../jet/j2k/visitors/ElementVisitor.java | 3 +- .../jet/j2k/visitors/ExpressionVisitor.java | 17 +-- .../jet/j2k/visitors/StatementVisitor.java | 2 +- .../jet/j2k/JavaToKotlinConverterTest.java | 8 + .../jetbrains/jet/j2k/TestCaseBuilder.java | 138 +++++++++--------- testData/ast/class/file/kt-639.jav | 18 +++ testData/ast/class/file/kt-639.kt | 22 +++ .../fieldsWithPrimaryPrivateConstructor.java | 16 +- testData/ast/rawGenerics/file/kt-540-map.jav | 11 ++ testData/ast/rawGenerics/file/kt-540-map.kt | 9 ++ 12 files changed, 197 insertions(+), 93 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/visitors/ClassVisitor.java create mode 100644 testData/ast/class/file/kt-639.jav create mode 100644 testData/ast/class/file/kt-639.kt create mode 100644 testData/ast/rawGenerics/file/kt-540-map.jav create mode 100644 testData/ast/rawGenerics/file/kt-540-map.kt diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index bfbdb2cece4..e261e4421a4 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -16,6 +16,20 @@ import java.util.*; * @author ignatov */ public class Converter { + private static Set ourClassIdentifiers = new HashSet(); + + public static void setClassIdentifiers(Set identifiers) { + ourClassIdentifiers = identifiers; + } + + public static Set getClassIdentifiers() { + return new HashSet(ourClassIdentifiers); + } + + public static void clearClassIdentifiers() { + ourClassIdentifiers.clear(); + } + @NotNull public static File fileToFile(@NotNull PsiJavaFile javaFile) { final PsiImportList importList = javaFile.getImportList(); @@ -122,7 +136,7 @@ public class Converter { for (final Member m : members) { // and modify secondaries if (m.getKind() == INode.Kind.CONSTRUCTOR) { - Function f = (Function)m; + Function f = (Function) m; if (!((Constructor) f).isPrimary()) { for (Field fo : finalOrWithEmptyInitializer) { String init = getDefaultInitializer(fo); @@ -277,7 +291,7 @@ public class Converter { if (method.getParent() instanceof PsiClass) { final PsiModifierList parentModifierList = ((PsiClass) method.getParent()).getModifierList(); if (parentModifierList != null && parentModifierList.hasExplicitModifier(Modifier.FINAL)) - modifiers.add(Modifier.NOT_OPEN); + modifiers.add(Modifier.NOT_OPEN); } if (method.isConstructor()) { // TODO: simplify diff --git a/src/org/jetbrains/jet/j2k/visitors/ClassVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ClassVisitor.java new file mode 100644 index 00000000000..8cafaf36719 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/visitors/ClassVisitor.java @@ -0,0 +1,28 @@ +package org.jetbrains.jet.j2k.visitors; + +import com.intellij.psi.JavaRecursiveElementVisitor; +import com.intellij.psi.PsiClass; + +import java.util.HashSet; +import java.util.Set; + +/** + * @author ignatov + */ +public class ClassVisitor extends JavaRecursiveElementVisitor { + private Set myClassIdentifiers; + + public ClassVisitor() { + myClassIdentifiers = new HashSet(); + } + + public Set getClassIdentifiers() { + return new HashSet(myClassIdentifiers); + } + + @Override + public void visitClass(PsiClass aClass) { + myClassIdentifiers.add(aClass.getQualifiedName()); + super.visitClass(aClass); + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java index aa9aec69c22..4c92c1fa183 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java @@ -2,7 +2,6 @@ package org.jetbrains.jet.j2k.visitors; import com.intellij.psi.*; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.j2k.Converter; import org.jetbrains.jet.j2k.ast.*; import java.util.List; @@ -85,7 +84,7 @@ public class ElementVisitor extends JavaElementVisitor { public void visitParameterList(PsiParameterList list) { super.visitParameterList(list); myResult = new ParameterList( - Converter.parametersToParameterList(list.getParameters()) + parametersToParameterList(list.getParameters()) ); } } \ 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 4b3bda246ad..45faf494c5b 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -211,10 +211,12 @@ public class ExpressionVisitor extends StatementVisitor { private static Expression createNewClassExpression(@NotNull PsiNewExpression expression) { final PsiAnonymousClass anonymousClass = expression.getAnonymousClass(); final PsiMethod constructor = expression.resolveMethod(); - if (constructor == null || isConstructorPrimary(constructor)) { + PsiJavaCodeReferenceElement classReference = expression.getClassOrAnonymousClassReference(); + final boolean isNotConvertedClass = classReference != null && !Converter.getClassIdentifiers().contains(classReference.getQualifiedName()); + if (constructor == null || isConstructorPrimary(constructor) || isNotConvertedClass) { return new NewClassExpression( expressionToExpression(expression.getQualifier()), - elementToElement(expression.getClassOrAnonymousClassReference()), + elementToElement(classReference), elementToElement(expression.getArgumentList()), anonymousClass != null ? anonymousClassToAnonymousClass(anonymousClass) : null ); @@ -336,7 +338,7 @@ public class ExpressionVisitor extends StatementVisitor { PsiElement context = expression.getContext(); while (context != null) { if (context instanceof PsiMethod && ((PsiMethod) context).isConstructor()) - return !Converter.isConstructorPrimary((PsiMethod) context); + return !isConstructorPrimary((PsiMethod) context); context = context.getContext(); } return false; @@ -346,7 +348,7 @@ public class ExpressionVisitor extends StatementVisitor { PsiElement context = expression.getContext(); while (context != null) { if (context instanceof PsiMethod && ((PsiMethod) context).isConstructor()) - return Converter.isConstructorPrimary((PsiMethod) context); + return isConstructorPrimary((PsiMethod) context); context = context.getContext(); } return false; @@ -416,11 +418,4 @@ public class ExpressionVisitor extends StatementVisitor { getOperatorString(expression.getOperationTokenType()) ); } -} - -class Test { - void test() { - char c1 = 'c'; - Character c2 = 'C'; - } } \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index cd26ad0f662..e73cf6c7314 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -126,7 +126,7 @@ public class StatementVisitor extends ElementVisitor { ) { final Expression end = expressionToExpression(((PsiBinaryExpression) condition).getROperand()); final Expression endExpression = operationTokenType == JavaTokenType.LT ? - new BinaryExpression(end, new IdentifierImpl("1"), "-"): + new BinaryExpression(end, new IdentifierImpl("1"), "-") : end; myResult = new ForeachWithRangeStatement( new IdentifierImpl(firstChild.getName()), diff --git a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java index 608c3997d5d..9c1231e817f 100644 --- a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java +++ b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java @@ -8,6 +8,7 @@ import junit.framework.Assert; import junit.framework.Test; import junit.framework.TestSuite; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.j2k.visitors.ClassVisitor; import java.io.File; import java.io.IOException; @@ -96,9 +97,16 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { configureFromFileText("test.java", text); } + private static void setClassIdentifiers() { + ClassVisitor c = new ClassVisitor(); + myFile.accept(c); + Converter.setClassIdentifiers(c.getClassIdentifiers()); + } + @NotNull private static String fileToKotlin(String text) throws IOException { configureFromText(text); + setClassIdentifiers(); return prettify(Converter.fileToFile((PsiJavaFile) myFile).toKotlin()); } diff --git a/test/org/jetbrains/jet/j2k/TestCaseBuilder.java b/test/org/jetbrains/jet/j2k/TestCaseBuilder.java index 9f8c012e29f..458376db39e 100644 --- a/test/org/jetbrains/jet/j2k/TestCaseBuilder.java +++ b/test/org/jetbrains/jet/j2k/TestCaseBuilder.java @@ -16,76 +16,76 @@ import java.util.List; * @author ignatov */ abstract class TestCaseBuilder { - private static final FilenameFilter emptyFilter = new FilenameFilter() { - @Override - public boolean accept(File file, String name) { - return true; - } + private static final FilenameFilter emptyFilter = new FilenameFilter() { + @Override + public boolean accept(File file, String name) { + return true; + } + }; + + public static String getTestDataPathBase() { + return "testData"; + } + + public static String getHomeDirectory() { + return new File(PathManager.getResourceRoot(TestCaseBuilder.class, "/org/jetbrains/jet/TestCaseBuilder.class")).getParentFile().getParentFile().getParent(); + } + + public interface NamedTestFactory { + @NotNull + Test createTest(@NotNull String dataPath, @NotNull String name); + } + + @NotNull + public static TestSuite suiteForDirectory(String baseDataDir, @NotNull final String dataPath, boolean recursive, @NotNull NamedTestFactory factory) { + return suiteForDirectory(baseDataDir, dataPath, recursive, emptyFilter, factory); + } + + @NotNull + private static TestSuite suiteForDirectory(String baseDataDir, @NotNull final String dataPath, boolean recursive, final FilenameFilter filter, @NotNull NamedTestFactory factory) { + TestSuite suite = new TestSuite(dataPath); + final String extensionJava = ".jav"; + + final FilenameFilter extensionFilter = new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + return name.endsWith(extensionJava); + } }; - - public static String getTestDataPathBase() { - return "testData"; - } - - public static String getHomeDirectory() { - return new File(PathManager.getResourceRoot(TestCaseBuilder.class, "/org/jetbrains/jet/TestCaseBuilder.class")).getParentFile().getParentFile().getParent(); - } - - public interface NamedTestFactory { - @NotNull Test createTest(@NotNull String dataPath, @NotNull String name); - } - - @NotNull - public static TestSuite suiteForDirectory(String baseDataDir, @NotNull final String dataPath, boolean recursive, @NotNull NamedTestFactory factory) { - return suiteForDirectory(baseDataDir, dataPath, recursive, emptyFilter, factory); - } - - @NotNull - private static TestSuite suiteForDirectory(String baseDataDir, @NotNull final String dataPath, boolean recursive, final FilenameFilter filter, @NotNull NamedTestFactory factory) { - TestSuite suite = new TestSuite(dataPath); - final String extensionJava = ".jav"; - - final FilenameFilter extensionFilter = new FilenameFilter() { - @Override - public boolean accept(File dir, String name) { - return name.endsWith(extensionJava); - } - }; - FilenameFilter resultFilter; - if (filter != emptyFilter) { - resultFilter = new FilenameFilter() { - @Override - public boolean accept(File file, String s) { - return extensionFilter.accept(file, s) && filter.accept(file, s); - } - }; + FilenameFilter resultFilter; + if (filter != emptyFilter) { + resultFilter = new FilenameFilter() { + @Override + public boolean accept(File file, String s) { + return extensionFilter.accept(file, s) && filter.accept(file, s); } - else { - resultFilter = extensionFilter; - } - File dir = new File(baseDataDir + dataPath); - FileFilter dirFilter = new FileFilter() { - @Override - public boolean accept(File pathname) { - return pathname.isDirectory(); - } - }; - if (recursive) { - File[] files = dir.listFiles(dirFilter); - assert files != null : dir; - List subdirs = Arrays.asList(files); - Collections.sort(subdirs); - for (File subdir : subdirs) { - suite.addTest(suiteForDirectory(baseDataDir, dataPath + "/" + subdir.getName(), recursive, filter, factory)); - } - } - List files = Arrays.asList(dir.listFiles(resultFilter)); - Collections.sort(files); - for (File file : files) { - String fileName = file.getName(); - assert fileName != null; - suite.addTest(factory.createTest(dataPath, fileName.substring(0, fileName.length() - extensionJava.length()))); - } - return suite; + }; + } else { + resultFilter = extensionFilter; } + File dir = new File(baseDataDir + dataPath); + FileFilter dirFilter = new FileFilter() { + @Override + public boolean accept(File pathname) { + return pathname.isDirectory(); + } + }; + if (recursive) { + File[] files = dir.listFiles(dirFilter); + assert files != null : dir; + List subdirs = Arrays.asList(files); + Collections.sort(subdirs); + for (File subdir : subdirs) { + suite.addTest(suiteForDirectory(baseDataDir, dataPath + "/" + subdir.getName(), recursive, filter, factory)); + } + } + List files = Arrays.asList(dir.listFiles(resultFilter)); + Collections.sort(files); + for (File file : files) { + String fileName = file.getName(); + assert fileName != null; + suite.addTest(factory.createTest(dataPath, fileName.substring(0, fileName.length() - extensionJava.length()))); + } + return suite; + } } diff --git a/testData/ast/class/file/kt-639.jav b/testData/ast/class/file/kt-639.jav new file mode 100644 index 00000000000..102ae0c907b --- /dev/null +++ b/testData/ast/class/file/kt-639.jav @@ -0,0 +1,18 @@ +package demo; + +import java.util.HashMap; + +class Test { + Test() { } + Test(String s) { } +} + +class User { + void main() { + HashMap m = new HashMap(1); + HashMap m2 = new HashMap(10); + + Test t1 = new Test(); + Test t2 = new Test(""); + } +} \ No newline at end of file diff --git a/testData/ast/class/file/kt-639.kt b/testData/ast/class/file/kt-639.kt new file mode 100644 index 00000000000..3ec7dd90e23 --- /dev/null +++ b/testData/ast/class/file/kt-639.kt @@ -0,0 +1,22 @@ +namespace demo +import java.util.HashMap +open class Test() { +class object { +open fun init() : Test { +val __ = Test() +return __ +} +open fun init(s : String?) : Test { +val __ = Test() +return __ +} +} +} +open class User() { +open fun main() : Unit { +var m : HashMap<*, *>? = HashMap(1) +var m2 : HashMap<*, *>? = HashMap(10) +var t1 : Test? = Test.init() +var t2 : Test? = Test.init("") +} +} \ No newline at end of file diff --git a/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.java b/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.java index 416d02b7232..210e6919883 100644 --- a/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.java +++ b/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.java @@ -1,12 +1,12 @@ enum Color { - WHITE(21), BLACK(22), RED(23), YELLOW(24), BLUE(25); + WHITE(21), BLACK(22), RED(23), YELLOW(24), BLUE(25); - private int code; + private int code; - private Color(int c) { - code = c; - } + private Color(int c) { + code = c; + } - public int getCode() { - return code; - } \ No newline at end of file + public int getCode() { + return code; + } \ No newline at end of file diff --git a/testData/ast/rawGenerics/file/kt-540-map.jav b/testData/ast/rawGenerics/file/kt-540-map.jav new file mode 100644 index 00000000000..539c842981f --- /dev/null +++ b/testData/ast/rawGenerics/file/kt-540-map.jav @@ -0,0 +1,11 @@ +package demo; + +import java.util.HashMap; + +class Test { + void main() { + HashMap commonMap = new HashMap(); + HashMap rawMap = new HashMap(); + HashMap superRawMap = new HashMap(); + } +} diff --git a/testData/ast/rawGenerics/file/kt-540-map.kt b/testData/ast/rawGenerics/file/kt-540-map.kt new file mode 100644 index 00000000000..2184c3b7214 --- /dev/null +++ b/testData/ast/rawGenerics/file/kt-540-map.kt @@ -0,0 +1,9 @@ +namespace demo +import java.util.HashMap +open class Test() { +open fun main() : Unit { +var commonMap : HashMap? = HashMap() +var rawMap : HashMap<*, *>? = HashMap() +var superRawMap : HashMap<*, *>? = HashMap() +} +} \ No newline at end of file From d8aa18ab0f7e0cd1c09c80a1baf17c656c63e617 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 28 Nov 2011 16:56:10 +0400 Subject: [PATCH 139/206] KT-635 Import std.java.compatibility --- src/org/jetbrains/jet/j2k/Converter.java | 8 ++++++++ .../org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java | 9 +++++++++ testData/ast/file/comp/intNullability.jav | 9 +++++++++ testData/ast/file/comp/intNullability.kt | 9 +++++++++ 4 files changed, 35 insertions(+) create mode 100644 testData/ast/file/comp/intNullability.jav create mode 100644 testData/ast/file/comp/intNullability.kt diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index e261e4421a4..d0de988b550 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -37,6 +37,14 @@ public class Converter { return new File(quoteKeywords(javaFile.getPackageName()), imports, classesToClassList(javaFile.getClasses())); } + @NotNull + public static File fileToFileWithCompatibilityImport(@NotNull PsiJavaFile javaFile) { + final PsiImportList importList = javaFile.getImportList(); + List imports = importList == null ? Collections.emptyList() : importsToImportList(importList.getAllImportStatements()); + imports.add(new Import("std.java.compatibility.*")); + return new File(quoteKeywords(javaFile.getPackageName()), imports, classesToClassList(javaFile.getClasses())); + } + @NotNull private static String quoteKeywords(@NotNull String packageName) { List result = new LinkedList(); diff --git a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java index 9c1231e817f..6b7a168efb3 100644 --- a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java +++ b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java @@ -47,6 +47,7 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { else if (javaFile.getParent().endsWith("/method")) actual = methodToKotlin(javaCode); else if (javaFile.getParent().endsWith("/class")) actual = fileToKotlin(javaCode); else if (javaFile.getParent().endsWith("/file")) actual = fileToKotlin(javaCode); + else if (javaFile.getParent().endsWith("/comp")) actual = fileToFileWithCompatibilityImport(javaCode); assert !actual.isEmpty() : "Specify what is it: file, class, method, statement or expression"; @@ -100,9 +101,17 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { private static void setClassIdentifiers() { ClassVisitor c = new ClassVisitor(); myFile.accept(c); + Converter.clearClassIdentifiers(); Converter.setClassIdentifiers(c.getClassIdentifiers()); } + @NotNull + private static String fileToFileWithCompatibilityImport(String text) throws IOException { + configureFromText(text); + setClassIdentifiers(); + return prettify(Converter.fileToFileWithCompatibilityImport((PsiJavaFile) myFile).toKotlin()); + } + @NotNull private static String fileToKotlin(String text) throws IOException { configureFromText(text); diff --git a/testData/ast/file/comp/intNullability.jav b/testData/ast/file/comp/intNullability.jav new file mode 100644 index 00000000000..328d9cb6ee2 --- /dev/null +++ b/testData/ast/file/comp/intNullability.jav @@ -0,0 +1,9 @@ +package demo; + +class Test { + void test() { + Integer i = 10; + Integer j = 10; + System.out.println(i + j); + } +} \ No newline at end of file diff --git a/testData/ast/file/comp/intNullability.kt b/testData/ast/file/comp/intNullability.kt new file mode 100644 index 00000000000..01080101de7 --- /dev/null +++ b/testData/ast/file/comp/intNullability.kt @@ -0,0 +1,9 @@ +namespace demo +import std.java.compatibility.* +open class Test() { +open fun test() : Unit { +var i : Int? = 10 +var j : Int? = 10 +System.out?.println((i + j)) +} +} \ No newline at end of file From 9065a544623be0ab921829b3e3b22ebee7e9e8c4 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 28 Nov 2011 19:32:24 +0400 Subject: [PATCH 140/206] /s/std.java.compatibility/std.compatibility/g --- src/org/jetbrains/jet/j2k/Converter.java | 2 +- testData/ast/file/comp/intNullability.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index d0de988b550..945961f6171 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -41,7 +41,7 @@ public class Converter { public static File fileToFileWithCompatibilityImport(@NotNull PsiJavaFile javaFile) { final PsiImportList importList = javaFile.getImportList(); List imports = importList == null ? Collections.emptyList() : importsToImportList(importList.getAllImportStatements()); - imports.add(new Import("std.java.compatibility.*")); + imports.add(new Import("std.compatibility.*")); return new File(quoteKeywords(javaFile.getPackageName()), imports, classesToClassList(javaFile.getClasses())); } diff --git a/testData/ast/file/comp/intNullability.kt b/testData/ast/file/comp/intNullability.kt index 01080101de7..2c1243c55f6 100644 --- a/testData/ast/file/comp/intNullability.kt +++ b/testData/ast/file/comp/intNullability.kt @@ -1,5 +1,5 @@ namespace demo -import std.java.compatibility.* +import std.compatibility.* open class Test() { open fun test() : Unit { var i : Int? = 10 From 876ba8736bfc24e8fe7f1614bc70312bc0612466 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 29 Nov 2011 12:44:49 +0400 Subject: [PATCH 141/206] KT-652 Convert correctly statements with prohibited qualifiers inside --- .../jetbrains/jet/j2k/ast/IdentifierImpl.java | 18 ++++++++++++------ .../jet/j2k/visitors/ExpressionVisitor.java | 8 +++++++- .../file/dollarInsideString.jav | 14 ++++++++++++++ .../file/dollarInsideString.kt | 11 +++++++++++ 4 files changed, 44 insertions(+), 7 deletions(-) create mode 100644 testData/ast/literalExpression/file/dollarInsideString.jav create mode 100644 testData/ast/literalExpression/file/dollarInsideString.kt diff --git a/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java b/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java index 9a75669b02d..98e94522b1d 100644 --- a/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java +++ b/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java @@ -9,6 +9,7 @@ public class IdentifierImpl extends Expression implements Identifier { private final String myName; private boolean myHasDollar = false; private boolean myIsNullable = true; + private boolean myQuotingNeeded = true; public IdentifierImpl(String name) { myName = name; @@ -25,6 +26,11 @@ public class IdentifierImpl extends Expression implements Identifier { myIsNullable = isNullable; } + public IdentifierImpl(String name, boolean hasDollar, boolean isNullable, boolean quotingNeeded) { + this(name, hasDollar, isNullable); + myQuotingNeeded = quotingNeeded; + } + @Override public boolean isEmpty() { return myName.length() == 0; @@ -39,17 +45,17 @@ public class IdentifierImpl extends Expression implements Identifier { return myIsNullable; } - private static String ifNeedQuote(String name) { - if (ONLY_KOTLIN_KEYWORDS.contains(name) || name.contains("$")) - return quote(name); - return name; + private String ifNeedQuote() { + if (myQuotingNeeded && (ONLY_KOTLIN_KEYWORDS.contains(myName) || myName.contains("$"))) + return quote(myName); + return myName; } @NotNull @Override public String toKotlin() { if (myHasDollar) - return DOLLAR + ifNeedQuote(myName); - return ifNeedQuote(myName); + return DOLLAR + ifNeedQuote(); + return ifNeedQuote(); } } \ 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 45faf494c5b..ab9df6b8beb 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -160,6 +160,7 @@ public class ExpressionVisitor extends StatementVisitor { final Object value = expression.getValue(); String text = expression.getText(); + boolean isQuotingNeeded = true; final PsiType type = expression.getType(); if (type != null) { @@ -172,8 +173,13 @@ public class ExpressionVisitor extends StatementVisitor { text = text.replace("L", "").replace("l", ""); if (canonicalTypeStr.equals("int") || canonicalTypeStr.equals("java.lang.Integer")) // need for hex support text = value != null ? value.toString() : text; + + if (canonicalTypeStr.equals("java.lang.String")) + isQuotingNeeded = false; + if (canonicalTypeStr.equals("char") || canonicalTypeStr.equals("java.lang.Character")) + isQuotingNeeded = false; } - myResult = new LiteralExpression(new IdentifierImpl(text)); + myResult = new LiteralExpression(new IdentifierImpl(text, false, false, isQuotingNeeded)); } @Override diff --git a/testData/ast/literalExpression/file/dollarInsideString.jav b/testData/ast/literalExpression/file/dollarInsideString.jav new file mode 100644 index 00000000000..51039d40d25 --- /dev/null +++ b/testData/ast/literalExpression/file/dollarInsideString.jav @@ -0,0 +1,14 @@ +package demo; + +class Test { + void test() { + String name = "$$$$"; + name = name.replaceAll("\\$[0-9]+", "\\$") + + char c = '$'; + System.out.println(c); + + Character C = '$'; + System.out.println(C); + } +} \ No newline at end of file diff --git a/testData/ast/literalExpression/file/dollarInsideString.kt b/testData/ast/literalExpression/file/dollarInsideString.kt new file mode 100644 index 00000000000..fdc29f01466 --- /dev/null +++ b/testData/ast/literalExpression/file/dollarInsideString.kt @@ -0,0 +1,11 @@ +namespace demo +open class Test() { +open fun test() : Unit { +var name : String? = "$$$$" +name = name?.replaceAll("\\$[0-9]+", "\\$") +var c : Char = '$' +System.out?.println(c) +var C : Char? = '$' +System.out?.println(C) +} +} \ No newline at end of file From acc9d70dab9966946dd48ae378c8b3262ff47052 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 29 Nov 2011 13:41:07 +0400 Subject: [PATCH 142/206] KT-656 Convert java.lang.Iterable with full qualified name --- src/org/jetbrains/jet/j2k/Converter.java | 6 +-- .../jet/j2k/visitors/TypeVisitor.java | 40 ++++++++++++++++--- testData/ast/kotlinExclusion/file/kt-656.jav | 27 +++++++++++++ testData/ast/kotlinExclusion/file/kt-656.kt | 20 ++++++++++ 4 files changed, 85 insertions(+), 8 deletions(-) create mode 100644 testData/ast/kotlinExclusion/file/kt-656.jav create mode 100644 testData/ast/kotlinExclusion/file/kt-656.kt diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 945961f6171..6bd3d4b9c66 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -286,7 +286,7 @@ public class Converter { @NotNull private static Function methodToFunction(@NotNull PsiMethod method, boolean notEmpty) { final IdentifierImpl identifier = new IdentifierImpl(method.getName()); - final Type type = typeToType(method.getReturnType()); + final Type returnType = typeToType(method.getReturnType()); final Block body = blockToBlock(method.getBody(), notEmpty); final Element params = elementToElement(method.getParameterList()); final List typeParameters = elementsToElementList(method.getTypeParameters()); @@ -307,7 +307,7 @@ public class Converter { return new Constructor( identifier, modifiers, - type, + returnType, typeParameters, params, new Block(removeEmpty(body.getStatements()), false), @@ -317,7 +317,7 @@ public class Converter { return new Function( identifier, modifiers, - type, + returnType, typeParameters, params, body diff --git a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java index 26797cd9055..e04eda63173 100644 --- a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java @@ -6,6 +6,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.j2k.ast.*; import org.jetbrains.jet.j2k.util.AstUtil; +import java.util.Iterator; import java.util.LinkedList; import java.util.List; @@ -46,12 +47,9 @@ public class TypeVisitor extends PsiTypeVisitor { @Override public Type visitClassType(PsiClassType classType) { - String classTypeName = createQualifiedName(classType); - if (classTypeName.isEmpty()) - classTypeName = getClassTypeName(classType); - List resolvedClassTypeParams = createRawTypesForResolvedReference(classType); + final IdentifierImpl identifier = constructClassTypeIdentifier(classType); + final List resolvedClassTypeParams = createRawTypesForResolvedReference(classType); - final IdentifierImpl identifier = new IdentifierImpl(classTypeName); if (classType.getParameterCount() == 0 && resolvedClassTypeParams.size() > 0) myResult = new ClassType(identifier, resolvedClassTypeParams); else @@ -59,6 +57,26 @@ public class TypeVisitor extends PsiTypeVisitor { return super.visitClassType(classType); } + @NotNull + private static IdentifierImpl constructClassTypeIdentifier(@NotNull PsiClassType classType) { + final PsiClass psiClass = classType.resolve(); + if (psiClass != null) { + String qualifiedName = psiClass.getQualifiedName(); + if (qualifiedName != null) { + if (qualifiedName.equals("java.lang.Iterable")) + return new IdentifierImpl("java.lang.Iterable"); + if (qualifiedName.equals("java.util.Iterator")) + return new IdentifierImpl("java.util.Iterator"); + } + } + final String classTypeName = createQualifiedName(classType); + + if (classTypeName.isEmpty()) + return new IdentifierImpl(getClassTypeName(classType)); + + return new IdentifierImpl(classTypeName); + } + @NotNull private static String createQualifiedName(@NotNull PsiClassType classType) { String classTypeName = ""; @@ -136,3 +154,15 @@ public class TypeVisitor extends PsiTypeVisitor { return super.visitDisjunctionType(disjunctionType); } } + +class Test implements Iterable { + @Override + public Iterator iterator() { + return null; + } + + public Iterator push(Iterator i) { + Iterator j = i; + return j; + } +} \ No newline at end of file diff --git a/testData/ast/kotlinExclusion/file/kt-656.jav b/testData/ast/kotlinExclusion/file/kt-656.jav new file mode 100644 index 00000000000..1c05dc9b7be --- /dev/null +++ b/testData/ast/kotlinExclusion/file/kt-656.jav @@ -0,0 +1,27 @@ +package demo; + +import java.util.Iterator; + +class Test implements Iterable { + @Override + public Iterator iterator() { + return null; + } + + public Iterator push(Iterator i) { + Iterator j = i; + return j; + } +} + +class FullTest implements java.lang.Iterable { + @Override + public java.util.Iterator iterator() { + return null; + } + + public java.util.Iterator push(java.util.Iterator i) { + java.util.Iterator j = i; + return j; + } +} \ No newline at end of file diff --git a/testData/ast/kotlinExclusion/file/kt-656.kt b/testData/ast/kotlinExclusion/file/kt-656.kt new file mode 100644 index 00000000000..f0e88acf7f6 --- /dev/null +++ b/testData/ast/kotlinExclusion/file/kt-656.kt @@ -0,0 +1,20 @@ +namespace demo +import java.util.Iterator +open class Test() : java.lang.Iterable { +override public fun iterator() : java.util.Iterator? { +return null +} +open public fun push(i : java.util.Iterator?) : java.util.Iterator? { +var j : java.util.Iterator? = i +return j +} +} +open class FullTest() : java.lang.Iterable { +override public fun iterator() : java.util.Iterator? { +return null +} +open public fun push(i : java.util.Iterator?) : java.util.Iterator? { +var j : java.util.Iterator? = i +return j +} +} \ No newline at end of file From 69cad97689c8f16db1cc84d9d2e2e75269d3f511 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 29 Nov 2011 16:10:03 +0400 Subject: [PATCH 143/206] KT-667 UNSUPPORTED TOKEN TYPE: TILDE --- .../jet/j2k/visitors/ExpressionVisitor.java | 13 +++++++++---- testData/ast/prefixOperator/statement/kt-667.jav | 2 ++ testData/ast/prefixOperator/statement/kt-667.kt | 2 ++ 3 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 testData/ast/prefixOperator/statement/kt-667.jav create mode 100644 testData/ast/prefixOperator/statement/kt-667.kt diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index ab9df6b8beb..5e0fc77987b 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -274,10 +274,15 @@ public class ExpressionVisitor extends StatementVisitor { @Override public void visitPrefixExpression(PsiPrefixExpression expression) { super.visitPrefixExpression(expression); - myResult = new PrefixOperator( - getOperatorString(expression.getOperationSign().getTokenType()), - expressionToExpression(expression.getOperand()) - ); + if (expression.getOperationTokenType() == JavaTokenType.TILDE) + myResult = new DummyMethodCallExpression( + new ParenthesizedExpression(expressionToExpression(expression.getOperand())), "inv", Expression.EMPTY_EXPRESSION + ); + else + myResult = new PrefixOperator( + getOperatorString(expression.getOperationSign().getTokenType()), + expressionToExpression(expression.getOperand()) + ); } @Override diff --git a/testData/ast/prefixOperator/statement/kt-667.jav b/testData/ast/prefixOperator/statement/kt-667.jav new file mode 100644 index 00000000000..eb1dc5658a7 --- /dev/null +++ b/testData/ast/prefixOperator/statement/kt-667.jav @@ -0,0 +1,2 @@ +int i = ~10; +int j = ~(i * 100); \ No newline at end of file diff --git a/testData/ast/prefixOperator/statement/kt-667.kt b/testData/ast/prefixOperator/statement/kt-667.kt new file mode 100644 index 00000000000..80f8ac234ee --- /dev/null +++ b/testData/ast/prefixOperator/statement/kt-667.kt @@ -0,0 +1,2 @@ +var i : Int = (10).inv() +var j : Int = (((i * 100))).inv() \ No newline at end of file From 5ff82035ba496932d13beb0532f17e1520b188f0 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 29 Nov 2011 17:22:47 +0400 Subject: [PATCH 144/206] KT-599 Initialize fields without initializers --- src/org/jetbrains/jet/j2k/Converter.java | 2 +- src/org/jetbrains/jet/j2k/ast/Field.java | 4 +++- testData/ast/anonymousBlock/file/oneAnonBlock.kt | 2 +- .../anonymousBlock/file/oneStaticAnonBlock.kt | 2 +- .../callChainExpression/file/libraryFieldCall.kt | 2 +- .../file/libraryStringFieldCall.kt | 2 +- testData/ast/class/class/abstractClassShape.kt | 2 +- .../ast/class/class/classWithMultiplyFields.kt | 4 ++-- .../ast/constructors/file/allCallsPrimary2.kt | 6 +++--- .../ast/constructors/file/customerBuilder.kt | 4 ++-- .../ast/constructors/file/genericIdentifier.kt | 4 ++-- testData/ast/constructors/file/identifier.kt | 4 ++-- .../constructors/file/withManyDefaultParams.kt | 16 ++++++++-------- testData/ast/enum/class/enumWithNameField.kt | 2 +- .../ast/enum/class/primaryPrivateConstructor.kt | 2 +- testData/ast/field/file/classChildExtendsBase.kt | 4 ++-- testData/ast/field/file/internalField.kt | 2 +- testData/ast/field/file/privateField.kt | 2 +- testData/ast/field/file/protectedField.kt | 2 +- testData/ast/field/file/publicField.kt | 2 +- testData/ast/field/file/varWithoutInit.kt | 2 +- .../ast/identifier/file/finalFieldReference.kt | 2 +- .../file/classOneExtendsBaseGeneric.kt | 2 +- ...tendsBaseWithZeroParamsNonEmptyConstructor.kt | 2 +- 24 files changed, 40 insertions(+), 38 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 6bd3d4b9c66..9ac7fb2082f 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -215,7 +215,7 @@ public class Converter { } @NotNull - private static String getDefaultInitializer(@NotNull Field f) { + public static String getDefaultInitializer(@NotNull Field f) { if (f.getType().isNullable()) return "null"; else { diff --git a/src/org/jetbrains/jet/j2k/ast/Field.java b/src/org/jetbrains/jet/j2k/ast/Field.java index 897d25867e6..d7afea9cddb 100644 --- a/src/org/jetbrains/jet/j2k/ast/Field.java +++ b/src/org/jetbrains/jet/j2k/ast/Field.java @@ -7,6 +7,8 @@ import java.util.LinkedList; import java.util.List; import java.util.Set; +import static org.jetbrains.jet.j2k.Converter.getDefaultInitializer; + /** * @author ignatov */ @@ -65,7 +67,7 @@ public class Field extends Member { String modifier = modifiersToKotlin(); if (myInitializer.isEmpty()) - return modifier + myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin(); + return modifier + myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin() + SPACE + EQUAL + SPACE + getDefaultInitializer(this); return modifier + myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin() + SPACE + EQUAL + SPACE + myInitializer.toKotlin(); diff --git a/testData/ast/anonymousBlock/file/oneAnonBlock.kt b/testData/ast/anonymousBlock/file/oneAnonBlock.kt index 01212e6bfa9..bf84ae34578 100644 --- a/testData/ast/anonymousBlock/file/oneAnonBlock.kt +++ b/testData/ast/anonymousBlock/file/oneAnonBlock.kt @@ -1,5 +1,5 @@ open class Test() { -var str : String? +var str : String? = null { str = "Ola" } diff --git a/testData/ast/anonymousBlock/file/oneStaticAnonBlock.kt b/testData/ast/anonymousBlock/file/oneStaticAnonBlock.kt index db002ff151b..5c8649fbcf0 100644 --- a/testData/ast/anonymousBlock/file/oneStaticAnonBlock.kt +++ b/testData/ast/anonymousBlock/file/oneStaticAnonBlock.kt @@ -1,5 +1,5 @@ open class Test() { -var str : String? +var str : String? = null class object { { str = "Ola" diff --git a/testData/ast/callChainExpression/file/libraryFieldCall.kt b/testData/ast/callChainExpression/file/libraryFieldCall.kt index 3de449db532..48516916f25 100644 --- a/testData/ast/callChainExpression/file/libraryFieldCall.kt +++ b/testData/ast/callChainExpression/file/libraryFieldCall.kt @@ -1,6 +1,6 @@ open class Library() { class object { -val ourOut : java.io.PrintStream? +val ourOut : java.io.PrintStream? = null } } open class User() { diff --git a/testData/ast/callChainExpression/file/libraryStringFieldCall.kt b/testData/ast/callChainExpression/file/libraryStringFieldCall.kt index bced464f750..9e0de14ec3c 100644 --- a/testData/ast/callChainExpression/file/libraryStringFieldCall.kt +++ b/testData/ast/callChainExpression/file/libraryStringFieldCall.kt @@ -1,5 +1,5 @@ open class Library() { -public val myString : String? +public val myString : String? = null } open class User() { open fun main() : Unit { diff --git a/testData/ast/class/class/abstractClassShape.kt b/testData/ast/class/class/abstractClassShape.kt index fff165180c7..d04de778464 100644 --- a/testData/ast/class/class/abstractClassShape.kt +++ b/testData/ast/class/class/abstractClassShape.kt @@ -1,5 +1,5 @@ abstract open class Shape() { -public var color : String? +public var color : String? = null open public fun setColor(c : String?) : Unit { color = c } diff --git a/testData/ast/class/class/classWithMultiplyFields.kt b/testData/ast/class/class/classWithMultiplyFields.kt index 03b2647a157..7f77e2e0cbd 100644 --- a/testData/ast/class/class/classWithMultiplyFields.kt +++ b/testData/ast/class/class/classWithMultiplyFields.kt @@ -1,5 +1,5 @@ class T() { -var a : String? -var b : String? +var a : String? = null +var b : String? = null var c : String? = "abc" } \ No newline at end of file diff --git a/testData/ast/constructors/file/allCallsPrimary2.kt b/testData/ast/constructors/file/allCallsPrimary2.kt index 37f361b89a9..26c6110374f 100644 --- a/testData/ast/constructors/file/allCallsPrimary2.kt +++ b/testData/ast/constructors/file/allCallsPrimary2.kt @@ -4,9 +4,9 @@ $myArg1 = arg1 $myArg2 = 0 $myArg3 = 0 } -val myArg1 : Int -var myArg2 : Int -var myArg3 : Int +val myArg1 : Int = 0 +var myArg2 : Int = 0 +var myArg3 : Int = 0 class object { open fun init(arg1 : Int, arg2 : Int, arg3 : Int) : C { val __ = C(arg1) diff --git a/testData/ast/constructors/file/customerBuilder.kt b/testData/ast/constructors/file/customerBuilder.kt index 6b3e9db1448..e76788b5cbb 100644 --- a/testData/ast/constructors/file/customerBuilder.kt +++ b/testData/ast/constructors/file/customerBuilder.kt @@ -6,8 +6,8 @@ $_firstName = first $_lastName = last doSmthAfter() } -public val _firstName : String? -public val _lastName : String? +public val _firstName : String? = null +public val _lastName : String? = null open public fun getFirstName() : String? { return _firstName } diff --git a/testData/ast/constructors/file/genericIdentifier.kt b/testData/ast/constructors/file/genericIdentifier.kt index 1c7c9cc77db..1808639264c 100644 --- a/testData/ast/constructors/file/genericIdentifier.kt +++ b/testData/ast/constructors/file/genericIdentifier.kt @@ -3,8 +3,8 @@ public open class Identifier(myName : T?, myHasDollar : Boolean) { $myName = myName $myHasDollar = myHasDollar } -private val myName : T? -private var myHasDollar : Boolean +private val myName : T? = null +private var myHasDollar : Boolean = false private var myNullable : Boolean = true open public fun getName() : T? { return myName diff --git a/testData/ast/constructors/file/identifier.kt b/testData/ast/constructors/file/identifier.kt index 200f6bd4ed3..1abada8ea1a 100644 --- a/testData/ast/constructors/file/identifier.kt +++ b/testData/ast/constructors/file/identifier.kt @@ -3,8 +3,8 @@ public open class Identifier(myName : String?, myHasDollar : Boolean) { $myName = myName $myHasDollar = myHasDollar } -private val myName : String? -private var myHasDollar : Boolean +private val myName : String? = null +private var myHasDollar : Boolean = false private var myNullable : Boolean = true open public fun getName() : String? { return myName diff --git a/testData/ast/constructors/file/withManyDefaultParams.kt b/testData/ast/constructors/file/withManyDefaultParams.kt index 7817a15545b..60b8812a882 100644 --- a/testData/ast/constructors/file/withManyDefaultParams.kt +++ b/testData/ast/constructors/file/withManyDefaultParams.kt @@ -9,14 +9,14 @@ $e = e $f = f $g = g } -private val myName : String? -private var a : Boolean -private var b : Double -private var c : Float -private var d : Long -private var e : Int -private var f : Short -private var g : Char +private val myName : String? = null +private var a : Boolean = false +private var b : Double = 0.dbl +private var c : Float = 0.flt +private var d : Long = 0 +private var e : Int = 0 +private var f : Short = 0 +private var g : Char = ' ' class object { open public fun init() : Test { val __ = Test(null, false, 0.dbl, 0.flt, 0, 0, 0, ' ') diff --git a/testData/ast/enum/class/enumWithNameField.kt b/testData/ast/enum/class/enumWithNameField.kt index eed3f7116a9..e8ad7b4cbe8 100644 --- a/testData/ast/enum/class/enumWithNameField.kt +++ b/testData/ast/enum/class/enumWithNameField.kt @@ -1,4 +1,4 @@ enum E { I -private var name : String? +private var name : String? = null } \ No newline at end of file diff --git a/testData/ast/enum/class/primaryPrivateConstructor.kt b/testData/ast/enum/class/primaryPrivateConstructor.kt index 6eb52b3fd81..814e3b48e83 100644 --- a/testData/ast/enum/class/primaryPrivateConstructor.kt +++ b/testData/ast/enum/class/primaryPrivateConstructor.kt @@ -2,7 +2,7 @@ enum Color(c : Int) { { $code = c } -private var code : Int +private var code : Int = 0 open public fun getCode() : Int { return code } diff --git a/testData/ast/field/file/classChildExtendsBase.kt b/testData/ast/field/file/classChildExtendsBase.kt index c262641b4ba..17681369b0b 100644 --- a/testData/ast/field/file/classChildExtendsBase.kt +++ b/testData/ast/field/file/classChildExtendsBase.kt @@ -1,6 +1,6 @@ open class Base() { -private var myFirst : String? +private var myFirst : String? = null } open class Child() : Base() { -private var mySecond : String? +private var mySecond : String? = null } \ No newline at end of file diff --git a/testData/ast/field/file/internalField.kt b/testData/ast/field/file/internalField.kt index e09da17755a..5cd1a6ac9a9 100644 --- a/testData/ast/field/file/internalField.kt +++ b/testData/ast/field/file/internalField.kt @@ -1,3 +1,3 @@ open class C() { -var f : Foo? +var f : Foo? = null } \ No newline at end of file diff --git a/testData/ast/field/file/privateField.kt b/testData/ast/field/file/privateField.kt index 2c742aff9e0..b2441bf0c24 100644 --- a/testData/ast/field/file/privateField.kt +++ b/testData/ast/field/file/privateField.kt @@ -1,3 +1,3 @@ open class C() { -private var f : Foo? +private var f : Foo? = null } \ No newline at end of file diff --git a/testData/ast/field/file/protectedField.kt b/testData/ast/field/file/protectedField.kt index 0e856b631cf..cba6200d896 100644 --- a/testData/ast/field/file/protectedField.kt +++ b/testData/ast/field/file/protectedField.kt @@ -1,3 +1,3 @@ open class C() { -protected var f : Foo? +protected var f : Foo? = null } \ No newline at end of file diff --git a/testData/ast/field/file/publicField.kt b/testData/ast/field/file/publicField.kt index 5767d6362dd..c79b38d6c5c 100644 --- a/testData/ast/field/file/publicField.kt +++ b/testData/ast/field/file/publicField.kt @@ -1,3 +1,3 @@ open class C() { -public var f : Foo? +public var f : Foo? = null } \ No newline at end of file diff --git a/testData/ast/field/file/varWithoutInit.kt b/testData/ast/field/file/varWithoutInit.kt index e09da17755a..5cd1a6ac9a9 100644 --- a/testData/ast/field/file/varWithoutInit.kt +++ b/testData/ast/field/file/varWithoutInit.kt @@ -1,3 +1,3 @@ open class C() { -var f : Foo? +var f : Foo? = null } \ No newline at end of file diff --git a/testData/ast/identifier/file/finalFieldReference.kt b/testData/ast/identifier/file/finalFieldReference.kt index 6f3df706c90..fca7102759a 100644 --- a/testData/ast/identifier/file/finalFieldReference.kt +++ b/testData/ast/identifier/file/finalFieldReference.kt @@ -6,7 +6,7 @@ open class `$$`(`$$$$` : `$$$$$`?) : `$`() { { $`$$$` = `$$$$` } -val `$$$` : `$$$$$`? +val `$$$` : `$$$$$`? = null open public fun `$$$$$$`() : `$$$$$`? { return `$$$` } diff --git a/testData/ast/inheritance/file/classOneExtendsBaseGeneric.kt b/testData/ast/inheritance/file/classOneExtendsBaseGeneric.kt index b9acbfbc541..640e5926e8f 100644 --- a/testData/ast/inheritance/file/classOneExtendsBaseGeneric.kt +++ b/testData/ast/inheritance/file/classOneExtendsBaseGeneric.kt @@ -4,5 +4,5 @@ open class One(name : T?, second : K?) : Base(name) { { $mySecond = second } -private var mySecond : K? +private var mySecond : K? = null } \ No newline at end of file diff --git a/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.kt b/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.kt index 6381bc4f634..37882b3a963 100644 --- a/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.kt +++ b/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.kt @@ -4,5 +4,5 @@ open class One(name : String?, second : String?) : Base(name) { { $mySecond = second } -private var mySecond : String? +private var mySecond : String? = null } \ No newline at end of file From bcd0618fb45e8315c7cefbe842785266feac5965 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 30 Nov 2011 13:23:02 +0400 Subject: [PATCH 145/206] fun name() : String and fun order() : Int added to each enum class --- src/org/jetbrains/jet/j2k/ast/Enum.java | 4 +++- testData/ast/enum/class/emptyEnum.kt | 4 +++- testData/ast/enum/class/enumImplementsOneInterface.kt | 4 +++- testData/ast/enum/class/enumImplementsSeveralInterfaces.kt | 4 +++- testData/ast/enum/class/enumWithNameField.kt | 4 +++- testData/ast/enum/class/internalEnum.kt | 4 +++- testData/ast/enum/class/overrideToString.kt | 4 +++- testData/ast/enum/class/primaryPrivateConstructor.kt | 4 +++- testData/ast/enum/class/privateEnum.kt | 4 +++- testData/ast/enum/class/protectedEnum.kt | 4 +++- testData/ast/enum/class/publicEnum.kt | 4 +++- testData/ast/enum/class/runnableImplementation.jav | 6 +++--- testData/ast/enum/class/runnableImplementation.kt | 4 +++- testData/ast/enum/class/typeSafeEnum.kt | 4 +++- 14 files changed, 42 insertions(+), 16 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/ast/Enum.java b/src/org/jetbrains/jet/j2k/ast/Enum.java index 82bfeca2be4..7ac18cf480a 100644 --- a/src/org/jetbrains/jet/j2k/ast/Enum.java +++ b/src/org/jetbrains/jet/j2k/ast/Enum.java @@ -28,10 +28,12 @@ public class Enum extends Class { @NotNull @Override public String toKotlin() { - return modifiersToKotlin() + "enum" + SPACE + myName.toKotlin() + primaryConstructorSignatureToKotlin() + + return modifiersToKotlin() + "enum class" + SPACE + myName.toKotlin() + primaryConstructorSignatureToKotlin() + typeParametersToKotlin() + implementTypesToKotlin() + SPACE + "{" + N + primaryConstructorBodyToKotlin() + N + AstUtil.joinNodes(membersExceptConstructors(), N) + N + + "public fun name() : String { return \"\" }" + N + // TODO : remove hack + "public fun order() : Int { return 0 }" + N + "}"; } } \ No newline at end of file diff --git a/testData/ast/enum/class/emptyEnum.kt b/testData/ast/enum/class/emptyEnum.kt index 1af4d906515..5be09b23308 100644 --- a/testData/ast/enum/class/emptyEnum.kt +++ b/testData/ast/enum/class/emptyEnum.kt @@ -1,2 +1,4 @@ -enum A { +enum class A { +public fun name() : String { return "" } +public fun order() : Int { return 0 } } \ No newline at end of file diff --git a/testData/ast/enum/class/enumImplementsOneInterface.kt b/testData/ast/enum/class/enumImplementsOneInterface.kt index 057767b736e..28b251cbf82 100644 --- a/testData/ast/enum/class/enumImplementsOneInterface.kt +++ b/testData/ast/enum/class/enumImplementsOneInterface.kt @@ -1,2 +1,4 @@ -enum A : I { +enum class A : I { +public fun name() : String { return "" } +public fun order() : Int { return 0 } } \ No newline at end of file diff --git a/testData/ast/enum/class/enumImplementsSeveralInterfaces.kt b/testData/ast/enum/class/enumImplementsSeveralInterfaces.kt index 82b4ca0a510..0ac77787c77 100644 --- a/testData/ast/enum/class/enumImplementsSeveralInterfaces.kt +++ b/testData/ast/enum/class/enumImplementsSeveralInterfaces.kt @@ -1,2 +1,4 @@ -enum A : I0, I1, I2 { +enum class A : I0, I1, I2 { +public fun name() : String { return "" } +public fun order() : Int { return 0 } } \ No newline at end of file diff --git a/testData/ast/enum/class/enumWithNameField.kt b/testData/ast/enum/class/enumWithNameField.kt index e8ad7b4cbe8..e92d13cb8ce 100644 --- a/testData/ast/enum/class/enumWithNameField.kt +++ b/testData/ast/enum/class/enumWithNameField.kt @@ -1,4 +1,6 @@ -enum E { +enum class E { I private var name : String? = null +public fun name() : String { return "" } +public fun order() : Int { return 0 } } \ No newline at end of file diff --git a/testData/ast/enum/class/internalEnum.kt b/testData/ast/enum/class/internalEnum.kt index 9a04f7dee8d..baaffdb5561 100644 --- a/testData/ast/enum/class/internalEnum.kt +++ b/testData/ast/enum/class/internalEnum.kt @@ -1,2 +1,4 @@ -enum Test { +enum class Test { +public fun name() : String { return "" } +public fun order() : Int { return 0 } } \ No newline at end of file diff --git a/testData/ast/enum/class/overrideToString.kt b/testData/ast/enum/class/overrideToString.kt index 783dd0b2444..7faa11f73ec 100644 --- a/testData/ast/enum/class/overrideToString.kt +++ b/testData/ast/enum/class/overrideToString.kt @@ -1,4 +1,4 @@ -enum Color { +enum class Color { WHITE BLACK RED @@ -7,4 +7,6 @@ BLUE override fun toString() : String? { return "COLOR" } +public fun name() : String { return "" } +public fun order() : Int { return 0 } } \ No newline at end of file diff --git a/testData/ast/enum/class/primaryPrivateConstructor.kt b/testData/ast/enum/class/primaryPrivateConstructor.kt index 814e3b48e83..6b631b4a643 100644 --- a/testData/ast/enum/class/primaryPrivateConstructor.kt +++ b/testData/ast/enum/class/primaryPrivateConstructor.kt @@ -1,4 +1,4 @@ -enum Color(c : Int) { +enum class Color(c : Int) { { $code = c } @@ -6,4 +6,6 @@ private var code : Int = 0 open public fun getCode() : Int { return code } +public fun name() : String { return "" } +public fun order() : Int { return 0 } } \ No newline at end of file diff --git a/testData/ast/enum/class/privateEnum.kt b/testData/ast/enum/class/privateEnum.kt index 6d712e6d618..646c07af7fa 100644 --- a/testData/ast/enum/class/privateEnum.kt +++ b/testData/ast/enum/class/privateEnum.kt @@ -1,2 +1,4 @@ -private enum Test { +private enum class Test { +public fun name() : String { return "" } +public fun order() : Int { return 0 } } \ No newline at end of file diff --git a/testData/ast/enum/class/protectedEnum.kt b/testData/ast/enum/class/protectedEnum.kt index cee5a49cba3..6f2b364651a 100644 --- a/testData/ast/enum/class/protectedEnum.kt +++ b/testData/ast/enum/class/protectedEnum.kt @@ -1,2 +1,4 @@ -protected enum Test { +protected enum class Test { +public fun name() : String { return "" } +public fun order() : Int { return 0 } } \ No newline at end of file diff --git a/testData/ast/enum/class/publicEnum.kt b/testData/ast/enum/class/publicEnum.kt index 1f30de10d07..5e7e2c3cdd8 100644 --- a/testData/ast/enum/class/publicEnum.kt +++ b/testData/ast/enum/class/publicEnum.kt @@ -1,2 +1,4 @@ -public enum Test { +public enum class Test { +public fun name() : String { return "" } +public fun order() : Int { return 0 } } \ No newline at end of file diff --git a/testData/ast/enum/class/runnableImplementation.jav b/testData/ast/enum/class/runnableImplementation.jav index b5f21ba6318..5db856671ca 100644 --- a/testData/ast/enum/class/runnableImplementation.jav +++ b/testData/ast/enum/class/runnableImplementation.jav @@ -1,8 +1,8 @@ enum Color implements Runnable { - WHITE, BLACK, RED, YELLOW, BLUE; + WHITE, BLACK, RED, YELLOW, BLUE; - public void run() { + public void run() { System.out.println("name()=" + name() + ", toString()=" + toString()); - } + } } \ No newline at end of file diff --git a/testData/ast/enum/class/runnableImplementation.kt b/testData/ast/enum/class/runnableImplementation.kt index b1cb4065b22..11263ecd635 100644 --- a/testData/ast/enum/class/runnableImplementation.kt +++ b/testData/ast/enum/class/runnableImplementation.kt @@ -1,4 +1,4 @@ -enum Color : Runnable { +enum class Color : Runnable { WHITE BLACK RED @@ -7,4 +7,6 @@ BLUE override public fun run() : Unit { System.out?.println(("name()=" + name() + ", toString()=" + toString())) } +public fun name() : String { return "" } +public fun order() : Int { return 0 } } \ No newline at end of file diff --git a/testData/ast/enum/class/typeSafeEnum.kt b/testData/ast/enum/class/typeSafeEnum.kt index 74de5694118..a8b4e8b2a83 100644 --- a/testData/ast/enum/class/typeSafeEnum.kt +++ b/testData/ast/enum/class/typeSafeEnum.kt @@ -1,6 +1,8 @@ -enum Coin { +enum class Coin { PENNY NICKEL DIME QUARTER +public fun name() : String { return "" } +public fun order() : Int { return 0 } } \ No newline at end of file From 03d3ac350272f6f8680c60cf7006cdaacf18cc7e Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 30 Nov 2011 14:11:59 +0400 Subject: [PATCH 146/206] fix override modifier when method overrides method only from java.lang.Object --- src/org/jetbrains/jet/j2k/Converter.java | 13 ++++- .../file/extendsBaseWhichExtendsObject.jav | 55 +++++++++++++++++++ .../file/extendsBaseWhichExtendsObject.kt | 35 ++++++++++++ testData/ast/function/file/overrideObject.jav | 28 ++++++++++ testData/ast/function/file/overrideObject.kt | 18 ++++++ 5 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 testData/ast/function/file/extendsBaseWhichExtendsObject.jav create mode 100644 testData/ast/function/file/extendsBaseWhichExtendsObject.kt create mode 100644 testData/ast/function/file/overrideObject.jav create mode 100644 testData/ast/function/file/overrideObject.kt diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 9ac7fb2082f..e33682d8969 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -292,7 +292,7 @@ public class Converter { final List typeParameters = elementsToElementList(method.getTypeParameters()); final Set modifiers = modifiersListToModifiersSet(method.getModifierList()); - if (method.getHierarchicalMethodSignature().getSuperSignatures().size() > 0) + if (isOverrideAnyMethodExceptMethodsFromObject(method)) modifiers.add(Modifier.OVERRIDE); if (method.getParent() instanceof PsiClass && ((PsiClass) method.getParent()).isInterface()) modifiers.remove(Modifier.ABSTRACT); @@ -324,6 +324,17 @@ public class Converter { ); } + private static boolean isOverrideAnyMethodExceptMethodsFromObject(@NotNull PsiMethod method) { + int counter = 0; + for (HierarchicalMethodSignature s : method.getHierarchicalMethodSignature().getSuperSignatures()) { + PsiClass containingClass = s.getMethod().getContainingClass(); + String qualifiedName = containingClass != null ? containingClass.getQualifiedName() : ""; + if (qualifiedName != null && !qualifiedName.equals("java.lang.Object")) + counter++; + } + return counter > 0; + } + @NotNull public static Block blockToBlock(@Nullable PsiCodeBlock block, boolean notEmpty) { if (block == null) return Block.EMPTY_BLOCK; diff --git a/testData/ast/function/file/extendsBaseWhichExtendsObject.jav b/testData/ast/function/file/extendsBaseWhichExtendsObject.jav new file mode 100644 index 00000000000..b72fd76ec71 --- /dev/null +++ b/testData/ast/function/file/extendsBaseWhichExtendsObject.jav @@ -0,0 +1,55 @@ +package test; + +class Test extends Base { + @Override + public int hashCode() { + return super.hashCode(); + } + + @Override + public boolean equals(Object o) { + return super.equals(o); + } + + @Override + protected Object clone() throws CloneNotSupportedException { + return super.clone(); + } + + @Override + public String toString() { + return super.toString(); + } + + @Override + protected void finalize() throws Throwable { + super.finalize(); + } +} + +class Base { + @Override + public int hashCode() { + return super.hashCode(); + } + + @Override + public boolean equals(Object o) { + return super.equals(o); + } + + @Override + protected Object clone() throws CloneNotSupportedException { + return super.clone(); + } + + @Override + public String toString() { + return super.toString(); + } + + @Override + protected void finalize() throws Throwable { + super.finalize(); + } +} \ No newline at end of file diff --git a/testData/ast/function/file/extendsBaseWhichExtendsObject.kt b/testData/ast/function/file/extendsBaseWhichExtendsObject.kt new file mode 100644 index 00000000000..c5f6ebe3a49 --- /dev/null +++ b/testData/ast/function/file/extendsBaseWhichExtendsObject.kt @@ -0,0 +1,35 @@ +namespace test +open class Test() : Base() { +override public fun hashCode() : Int { +return super.hashCode() +} +override public fun equals(o : Any?) : Boolean { +return super.equals(o) +} +override protected fun clone() : Any? { +return super.clone() +} +override public fun toString() : String? { +return super.toString() +} +override protected fun finalize() : Unit { +super.finalize() +} +} +open class Base() { +open public fun hashCode() : Int { +return super.hashCode() +} +open public fun equals(o : Any?) : Boolean { +return super.equals(o) +} +open protected fun clone() : Any? { +return super.clone() +} +open public fun toString() : String? { +return super.toString() +} +open protected fun finalize() : Unit { +super.finalize() +} +} \ No newline at end of file diff --git a/testData/ast/function/file/overrideObject.jav b/testData/ast/function/file/overrideObject.jav new file mode 100644 index 00000000000..0538508c9b8 --- /dev/null +++ b/testData/ast/function/file/overrideObject.jav @@ -0,0 +1,28 @@ +package test; + +class Test { + @Override + public int hashCode() { + return super.hashCode(); + } + + @Override + public boolean equals(Object o) { + return super.equals(o); + } + + @Override + protected Object clone() throws CloneNotSupportedException { + return super.clone(); + } + + @Override + public String toString() { + return super.toString(); + } + + @Override + protected void finalize() throws Throwable { + super.finalize(); + } +} \ No newline at end of file diff --git a/testData/ast/function/file/overrideObject.kt b/testData/ast/function/file/overrideObject.kt new file mode 100644 index 00000000000..b60bac09b96 --- /dev/null +++ b/testData/ast/function/file/overrideObject.kt @@ -0,0 +1,18 @@ +namespace test +open class Test() { +open public fun hashCode() : Int { +return super.hashCode() +} +open public fun equals(o : Any?) : Boolean { +return super.equals(o) +} +open protected fun clone() : Any? { +return super.clone() +} +open public fun toString() : String? { +return super.toString() +} +open protected fun finalize() : Unit { +super.finalize() +} +} \ No newline at end of file From 9f8f34735d70a30d4492082286a5324347f92ef9 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 30 Nov 2011 14:53:30 +0400 Subject: [PATCH 147/206] KT-675 Translate accessible parameters as a var parameters --- src/org/jetbrains/jet/j2k/Converter.java | 14 +++++++++++++- src/org/jetbrains/jet/j2k/ast/Parameter.java | 10 +++++++++- testData/ast/function/file/varVararg.jav | 7 +++++++ testData/ast/function/file/varVararg.kt | 6 ++++++ testData/ast/function/file/writableParameter.jav | 8 ++++++++ testData/ast/function/file/writableParameter.kt | 7 +++++++ 6 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 testData/ast/function/file/varVararg.jav create mode 100644 testData/ast/function/file/varVararg.kt create mode 100644 testData/ast/function/file/writableParameter.jav create mode 100644 testData/ast/function/file/writableParameter.kt 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 From 9442dfd2a9e73bc3d81fdd746abe874880b5f6b4 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 30 Nov 2011 16:24:49 +0400 Subject: [PATCH 148/206] KT-641 Support @NotNull @Nullable annotations --- src/org/jetbrains/jet/j2k/Converter.java | 30 +++++++++++++++++-- .../jet/j2k/visitors/ElementVisitor.java | 3 +- .../ast/annotations/file/jetbrainsNotNull.jav | 29 ++++++++++++++++++ .../ast/annotations/file/jetbrainsNotNull.kt | 21 +++++++++++++ 4 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 testData/ast/annotations/file/jetbrainsNotNull.jav create mode 100644 testData/ast/annotations/file/jetbrainsNotNull.kt diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 6e50656bedd..42a2d844b1f 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -18,6 +18,13 @@ import java.util.*; * @author ignatov */ public class Converter { + private final static Set NOT_NULL_ANNOTATIONS = new HashSet() { + { + add("org.jetbrains.annotations.NotNull"); + add("com.sun.istack.internal.NotNull"); + add("javax.annotation.Nonnull"); + } + } ; private static Set ourClassIdentifiers = new HashSet(); public static void setClassIdentifiers(Set identifiers) { @@ -288,7 +295,7 @@ public class Converter { @NotNull private static Function methodToFunction(@NotNull PsiMethod method, boolean notEmpty) { final IdentifierImpl identifier = new IdentifierImpl(method.getName()); - final Type returnType = typeToType(method.getReturnType()); + final Type returnType = typeToType(method.getReturnType(), isNotNull(method.getModifierList())); final Block body = blockToBlock(method.getBody(), notEmpty); final Element params = elementToElement(method.getParameterList()); final List typeParameters = elementsToElementList(method.getTypeParameters()); @@ -408,6 +415,13 @@ public class Converter { return result; } + public static Type typeToType(PsiType type, boolean notNull) { + Type result = typeToType(type); + if (notNull) + result.convertToNotNull(); + return result; + } + @NotNull private static List typesToNotNullableTypeList(@NotNull PsiType[] types) { List result = new LinkedList(typesToTypeList(types)); @@ -441,11 +455,23 @@ 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(), isNotNull(parameter.getModifierList())), isReadOnly(parameter) ); } + public static boolean isNotNull(@Nullable PsiModifierList modifierList) { + if (modifierList != null) { + PsiAnnotation[] annotations = modifierList.getAnnotations(); + for (PsiAnnotation a : annotations) { + String qualifiedName = a.getQualifiedName(); + if (qualifiedName != null && NOT_NULL_ANNOTATIONS.contains(qualifiedName)) + return true; + } + } + return false; + } + private static boolean isReadOnly(PsiParameter parameter) { for (PsiReference r : (ReferencesSearch.search(parameter))) { if (r instanceof PsiExpression && PsiUtil.isAccessedForWriting((PsiExpression) r)) { diff --git a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java index 4c92c1fa183..f18a5f03d43 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java @@ -2,6 +2,7 @@ package org.jetbrains.jet.j2k.visitors; import com.intellij.psi.*; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.j2k.Converter; import org.jetbrains.jet.j2k.ast.*; import java.util.List; @@ -26,7 +27,7 @@ public class ElementVisitor extends JavaElementVisitor { myResult = new LocalVariable( new IdentifierImpl(variable.getName()), // TODO modifiersListToModifiersSet(variable.getModifierList()), - typeToType(variable.getType()), + typeToType(variable.getType(), Converter.isNotNull(variable.getModifierList())), expressionToExpression(variable.getInitializer()) ); } diff --git a/testData/ast/annotations/file/jetbrainsNotNull.jav b/testData/ast/annotations/file/jetbrainsNotNull.jav new file mode 100644 index 00000000000..92c511d88a0 --- /dev/null +++ b/testData/ast/annotations/file/jetbrainsNotNull.jav @@ -0,0 +1,29 @@ +package test; + +import org.jetbrains.annotations.NotNull; + +public class Test { + @NotNull String myStr = "String2"; + + public Test(@NotNull String str) { + myStr = str; + } + + public void sout(@NotNull String str) { + System.out.println(str); + } + + @NotNull + public String dummy(@NotNull String str) { + return str; + } + + public void test() { + sout("String"); + @NotNull String test = "String2"; + sout(test); + sout(dummy(test)); + + new Test(test); + } +} \ No newline at end of file diff --git a/testData/ast/annotations/file/jetbrainsNotNull.kt b/testData/ast/annotations/file/jetbrainsNotNull.kt new file mode 100644 index 00000000000..2b0b40a701f --- /dev/null +++ b/testData/ast/annotations/file/jetbrainsNotNull.kt @@ -0,0 +1,21 @@ +namespace test +import org.jetbrains.annotations.NotNull +public open class Test(str : String) { +{ +$myStr = str +} +var myStr : String? = "String2" +open public fun sout(str : String) : Unit { +System.out?.println(str) +} +open public fun dummy(str : String) : String { +return str +} +open public fun test() : Unit { +sout("String") +var test : String = "String2" +sout(test) +sout(dummy(test)) +Test(test) +} +} \ No newline at end of file From 82ff073a434034ce65d415fb0cd3a6cf3e7ad850 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 5 Dec 2011 15:39:33 +0400 Subject: [PATCH 149/206] KT-697 Remove unnecessary NotNull annotation import from Kotlin code --- src/org/jetbrains/jet/j2k/Converter.java | 4 +++- src/org/jetbrains/jet/j2k/ast/Import.java | 4 ++++ testData/ast/annotations/file/jetbrainsNotNull.kt | 1 - testData/ast/importStatement/file/simpleImport.kt | 1 - testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.kt | 1 - 5 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 42a2d844b1f..35b603df540 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -432,7 +432,9 @@ public class Converter { @NotNull private static List importsToImportList(@NotNull PsiImportStatementBase[] imports) { List result = new LinkedList(); - for (PsiImportStatementBase t : imports) result.add(importToImport(t)); + for (PsiImportStatementBase i : imports) + if (!NOT_NULL_ANNOTATIONS.contains(importToImport(i).getName())) + result.add(importToImport(i)); return result; } diff --git a/src/org/jetbrains/jet/j2k/ast/Import.java b/src/org/jetbrains/jet/j2k/ast/Import.java index 6cf6cca560a..854b2fa3534 100644 --- a/src/org/jetbrains/jet/j2k/ast/Import.java +++ b/src/org/jetbrains/jet/j2k/ast/Import.java @@ -8,6 +8,10 @@ import org.jetbrains.annotations.NotNull; public class Import extends Node { private final String myName; + public String getName() { + return myName; + } + public Import(String name) { myName = name; } diff --git a/testData/ast/annotations/file/jetbrainsNotNull.kt b/testData/ast/annotations/file/jetbrainsNotNull.kt index 2b0b40a701f..bd1969cabda 100644 --- a/testData/ast/annotations/file/jetbrainsNotNull.kt +++ b/testData/ast/annotations/file/jetbrainsNotNull.kt @@ -1,5 +1,4 @@ namespace test -import org.jetbrains.annotations.NotNull public open class Test(str : String) { { $myStr = str diff --git a/testData/ast/importStatement/file/simpleImport.kt b/testData/ast/importStatement/file/simpleImport.kt index dcead7d53b8..97e54209431 100644 --- a/testData/ast/importStatement/file/simpleImport.kt +++ b/testData/ast/importStatement/file/simpleImport.kt @@ -1,4 +1,3 @@ namespace org.jetbrains.jet.j2k -import org.jetbrains.annotations.NotNull public open class Converter() { } \ No newline at end of file diff --git a/testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.kt b/testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.kt index d4534115df5..51ebb27fea5 100644 --- a/testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.kt +++ b/testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.kt @@ -1,5 +1,4 @@ namespace org.jetbrains.jet.j2k.`in` -import org.jetbrains.annotations.NotNull import org.jetbrains.annotations.Nullable public open class Converter() { } \ No newline at end of file From d8eaf2977c4f60319572b3616c34f9d92bdcb321 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 5 Dec 2011 15:43:12 +0400 Subject: [PATCH 150/206] cleanup --- src/org/jetbrains/jet/j2k/Converter.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 35b603df540..4be21db1074 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -432,18 +432,21 @@ public class Converter { @NotNull private static List importsToImportList(@NotNull PsiImportStatementBase[] imports) { List result = new LinkedList(); - for (PsiImportStatementBase i : imports) - if (!NOT_NULL_ANNOTATIONS.contains(importToImport(i).getName())) - result.add(importToImport(i)); + for (PsiImportStatementBase i : imports) { + Import anImport = importToImport(i); + String name = anImport.getName(); + if (!name.isEmpty() && !NOT_NULL_ANNOTATIONS.contains(name)) + result.add(anImport); + } return result; } @NotNull - private static Import importToImport(@NotNull PsiImportStatementBase i) { // TODO: import reference + private static Import importToImport(@NotNull PsiImportStatementBase i) { final PsiJavaCodeReferenceElement reference = i.getImportReference(); if (reference != null) return new Import(quoteKeywords(reference.getQualifiedName()) + (i.isOnDemand() ? ".*" : "")); - return new Import(""); // TODO: remove + return new Import(""); } @NotNull @@ -456,7 +459,7 @@ public class Converter { @NotNull public static Parameter parameterToParameter(@NotNull PsiParameter parameter) { return new Parameter( - new IdentifierImpl(parameter.getName()), // TODO: remove + new IdentifierImpl(parameter.getName()), typeToType(parameter.getType(), isNotNull(parameter.getModifierList())), isReadOnly(parameter) ); From abaf31fba155f2f75767b35ce035806225d42b93 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 5 Dec 2011 16:15:52 +0400 Subject: [PATCH 151/206] added test for "KT-671 Support for Integer.valueOf()" --- .../jetbrains/jet/j2k/visitors/ExpressionVisitor.java | 2 +- src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java | 11 ----------- testData/ast/boxedType/file/kt-671.jav | 8 ++++++++ testData/ast/boxedType/file/kt-671.kt | 7 +++++++ 4 files changed, 16 insertions(+), 12 deletions(-) create mode 100644 testData/ast/boxedType/file/kt-671.jav create mode 100644 testData/ast/boxedType/file/kt-671.kt diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 5e0fc77987b..4020ba6480a 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -183,7 +183,7 @@ public class ExpressionVisitor extends StatementVisitor { } @Override - public void visitMethodCallExpression(PsiMethodCallExpression expression) { + public void visitMethodCallExpression(@NotNull PsiMethodCallExpression expression) { super.visitMethodCallExpression(expression); if (!SuperVisitor.isSuper(expression.getMethodExpression()) || !isInsidePrimaryConstructor(expression)) myResult = // TODO: not resolved diff --git a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java index e04eda63173..7be5bc4b804 100644 --- a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java @@ -155,14 +155,3 @@ public class TypeVisitor extends PsiTypeVisitor { } } -class Test implements Iterable { - @Override - public Iterator iterator() { - return null; - } - - public Iterator push(Iterator i) { - Iterator j = i; - return j; - } -} \ No newline at end of file diff --git a/testData/ast/boxedType/file/kt-671.jav b/testData/ast/boxedType/file/kt-671.jav new file mode 100644 index 00000000000..520765b7b08 --- /dev/null +++ b/testData/ast/boxedType/file/kt-671.jav @@ -0,0 +1,8 @@ +package demo; + +class Test { + void test() { + Integer i = Integer.valueOf(100); + Short s = Short.valueOf(100); + } +} \ No newline at end of file diff --git a/testData/ast/boxedType/file/kt-671.kt b/testData/ast/boxedType/file/kt-671.kt new file mode 100644 index 00000000000..a8da231e104 --- /dev/null +++ b/testData/ast/boxedType/file/kt-671.kt @@ -0,0 +1,7 @@ +namespace demo +open class Test() { +open fun test() : Unit { +var i : Int? = Integer.valueOf(100) +var s : Short? = Short.valueOf(100) +} +} \ No newline at end of file From 3be18e69e2bbabf5fe0d89ef1a2de595421e267d Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 6 Dec 2011 14:04:16 +0400 Subject: [PATCH 152/206] added tests for tilde and excl operators --- testData/ast/prefixOperator/statement/excl.jav | 2 ++ testData/ast/prefixOperator/statement/excl.kt | 2 ++ testData/ast/prefixOperator/statement/tilde.jav | 2 ++ testData/ast/prefixOperator/statement/tilde.kt | 2 ++ 4 files changed, 8 insertions(+) create mode 100644 testData/ast/prefixOperator/statement/excl.jav create mode 100644 testData/ast/prefixOperator/statement/excl.kt create mode 100644 testData/ast/prefixOperator/statement/tilde.jav create mode 100644 testData/ast/prefixOperator/statement/tilde.kt diff --git a/testData/ast/prefixOperator/statement/excl.jav b/testData/ast/prefixOperator/statement/excl.jav new file mode 100644 index 00000000000..93e541d4332 --- /dev/null +++ b/testData/ast/prefixOperator/statement/excl.jav @@ -0,0 +1,2 @@ +boolean i = true; +boolean j = !i; \ No newline at end of file diff --git a/testData/ast/prefixOperator/statement/excl.kt b/testData/ast/prefixOperator/statement/excl.kt new file mode 100644 index 00000000000..aaaf7a4cdbd --- /dev/null +++ b/testData/ast/prefixOperator/statement/excl.kt @@ -0,0 +1,2 @@ +var i : Boolean = true +var j : Boolean = (!i) \ No newline at end of file diff --git a/testData/ast/prefixOperator/statement/tilde.jav b/testData/ast/prefixOperator/statement/tilde.jav new file mode 100644 index 00000000000..354a6ddb01b --- /dev/null +++ b/testData/ast/prefixOperator/statement/tilde.jav @@ -0,0 +1,2 @@ +int i = 10; +int j = ~10; \ No newline at end of file diff --git a/testData/ast/prefixOperator/statement/tilde.kt b/testData/ast/prefixOperator/statement/tilde.kt new file mode 100644 index 00000000000..96d67f4d028 --- /dev/null +++ b/testData/ast/prefixOperator/statement/tilde.kt @@ -0,0 +1,2 @@ +var i : Int = 10 +var j : Int = (10).inv() \ No newline at end of file From 6cc8caa1ebbd199f1f6ef29610e9587233b8201c Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 6 Dec 2011 14:20:14 +0400 Subject: [PATCH 153/206] KT-546 Enum constructor invocations --- src/org/jetbrains/jet/j2k/Converter.java | 20 ++++++++++++------- .../jetbrains/jet/j2k/ast/EnumConstant.java | 4 ++-- src/org/jetbrains/jet/j2k/ast/Field.java | 2 +- src/org/jetbrains/jet/j2k/ast/Type.java | 3 ++- testData/ast/enum/class/colorEnum.jav | 16 +++++++++++++++ testData/ast/enum/class/colorEnum.kt | 14 +++++++++++++ ...> fieldsWithPrimaryPrivateConstructor.jav} | 0 .../fieldsWithPrimaryPrivateConstructor.kt | 14 +++++++------ .../enum/class/primaryPrivateConstructor.jav | 2 ++ .../enum/class/primaryPrivateConstructor.kt | 3 ++- 10 files changed, 60 insertions(+), 18 deletions(-) create mode 100644 testData/ast/enum/class/colorEnum.jav create mode 100644 testData/ast/enum/class/colorEnum.kt rename testData/ast/enum/class/{fieldsWithPrimaryPrivateConstructor.java => fieldsWithPrimaryPrivateConstructor.jav} (100%) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 4be21db1074..5abe58a6a52 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -305,11 +305,8 @@ public class Converter { modifiers.add(Modifier.OVERRIDE); if (method.getParent() instanceof PsiClass && ((PsiClass) method.getParent()).isInterface()) modifiers.remove(Modifier.ABSTRACT); - if (method.getParent() instanceof PsiClass) { - final PsiModifierList parentModifierList = ((PsiClass) method.getParent()).getModifierList(); - if (parentModifierList != null && parentModifierList.hasExplicitModifier(Modifier.FINAL)) - modifiers.add(Modifier.NOT_OPEN); - } + if (isNotOpenMethod(method)) + modifiers.add(Modifier.NOT_OPEN); if (method.isConstructor()) { // TODO: simplify boolean isPrimary = isConstructorPrimary(method); @@ -333,6 +330,15 @@ public class Converter { ); } + private static boolean isNotOpenMethod(final PsiMethod method) { + if (method.getParent() instanceof PsiClass) { + final PsiModifierList parentModifierList = ((PsiClass) method.getParent()).getModifierList(); + if ((parentModifierList != null && parentModifierList.hasExplicitModifier(Modifier.FINAL)) || ((PsiClass) method.getParent()).isEnum()) + return true; + } + return false; + } + private static boolean isOverrideAnyMethodExceptMethodsFromObject(@NotNull PsiMethod method) { int counter = 0; for (HierarchicalMethodSignature s : method.getHierarchicalMethodSignature().getSuperSignatures()) { @@ -418,14 +424,14 @@ public class Converter { public static Type typeToType(PsiType type, boolean notNull) { Type result = typeToType(type); if (notNull) - result.convertToNotNull(); + result.convertedToNotNull(); return result; } @NotNull private static List typesToNotNullableTypeList(@NotNull PsiType[] types) { List result = new LinkedList(typesToTypeList(types)); - for (Type p : result) p.convertToNotNull(); + for (Type p : result) p.convertedToNotNull(); return result; } diff --git a/src/org/jetbrains/jet/j2k/ast/EnumConstant.java b/src/org/jetbrains/jet/j2k/ast/EnumConstant.java index a55a1d09abe..d83b2e5c85b 100644 --- a/src/org/jetbrains/jet/j2k/ast/EnumConstant.java +++ b/src/org/jetbrains/jet/j2k/ast/EnumConstant.java @@ -9,7 +9,7 @@ import java.util.Set; */ public class EnumConstant extends Field { public EnumConstant(Identifier identifier, Set modifiers, Type type, Element params) { - super(identifier, modifiers, type, params); + super(identifier, modifiers, type.convertedToNotNull(), params); } @NotNull @@ -17,6 +17,6 @@ public class EnumConstant extends Field { public String toKotlin() { if (myInitializer.toKotlin().isEmpty()) return myIdentifier.toKotlin(); - return myIdentifier.toKotlin() + "(" + myInitializer.toKotlin() + ")"; + return myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin() + "(" + myInitializer.toKotlin() + ")"; } } diff --git a/src/org/jetbrains/jet/j2k/ast/Field.java b/src/org/jetbrains/jet/j2k/ast/Field.java index d7afea9cddb..94fa1596b56 100644 --- a/src/org/jetbrains/jet/j2k/ast/Field.java +++ b/src/org/jetbrains/jet/j2k/ast/Field.java @@ -14,7 +14,7 @@ import static org.jetbrains.jet.j2k.Converter.getDefaultInitializer; */ public class Field extends Member { final Identifier myIdentifier; - private final Type myType; + final Type myType; final Element myInitializer; public Field(Identifier identifier, Set modifiers, Type type, Element initializer) { diff --git a/src/org/jetbrains/jet/j2k/ast/Type.java b/src/org/jetbrains/jet/j2k/ast/Type.java index baf4c23f7ae..901a7b52fd5 100644 --- a/src/org/jetbrains/jet/j2k/ast/Type.java +++ b/src/org/jetbrains/jet/j2k/ast/Type.java @@ -15,8 +15,9 @@ public abstract class Type extends Element { return Kind.TYPE; } - public void convertToNotNull() { + public Type convertedToNotNull() { myNullable = false; + return this; } public boolean isNullable() { diff --git a/testData/ast/enum/class/colorEnum.jav b/testData/ast/enum/class/colorEnum.jav new file mode 100644 index 00000000000..d59c8198ccd --- /dev/null +++ b/testData/ast/enum/class/colorEnum.jav @@ -0,0 +1,16 @@ +package demo; + +enum MyEnum { + RED(10), + BLUE(20); + + private final int color; + + private MyEnum(int _color) { + color = _color; + } + + public int getColor() { + return color; + } +} \ No newline at end of file diff --git a/testData/ast/enum/class/colorEnum.kt b/testData/ast/enum/class/colorEnum.kt new file mode 100644 index 00000000000..15a5f6f6892 --- /dev/null +++ b/testData/ast/enum/class/colorEnum.kt @@ -0,0 +1,14 @@ +namespace demo +enum class MyEnum(_color : Int) { +{ +$color = _color +} +RED : MyEnum(10) +BLUE : MyEnum(20) +private val color : Int = 0 +public fun getColor() : Int { +return color +} +public fun name() : String { return "" } +public fun order() : Int { return 0 } +} \ No newline at end of file diff --git a/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.java b/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.jav similarity index 100% rename from testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.java rename to testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.jav diff --git a/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt b/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt index cc200c15751..91a687dd847 100644 --- a/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt +++ b/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt @@ -1,14 +1,16 @@ -enum Color(c: Int) { +enum class Color(c : Int) { +{ +$code = c +} WHITE : Color(21) BLACK : Color(22) RED : Color(23) YELLOW : Color(24) BLUE : Color(25) -private var code : Int -{ -$code = c -} -open public fun getCode() : Int { +private var code : Int = 0 +public fun getCode() : Int { return code } +public fun name() : String { return "" } +public fun order() : Int { return 0 } } \ No newline at end of file diff --git a/testData/ast/enum/class/primaryPrivateConstructor.jav b/testData/ast/enum/class/primaryPrivateConstructor.jav index dee69b30e80..7dad6bb265e 100644 --- a/testData/ast/enum/class/primaryPrivateConstructor.jav +++ b/testData/ast/enum/class/primaryPrivateConstructor.jav @@ -1,3 +1,5 @@ +package demo; + enum Color { private int code; diff --git a/testData/ast/enum/class/primaryPrivateConstructor.kt b/testData/ast/enum/class/primaryPrivateConstructor.kt index 6b631b4a643..37889843d8b 100644 --- a/testData/ast/enum/class/primaryPrivateConstructor.kt +++ b/testData/ast/enum/class/primaryPrivateConstructor.kt @@ -1,9 +1,10 @@ +namespace demo enum class Color(c : Int) { { $code = c } private var code : Int = 0 -open public fun getCode() : Int { +public fun getCode() : Int { return code } public fun name() : String { return "" } From 91689b59b0c678dae3ac0a757767a264b20c966c Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 6 Dec 2011 17:33:00 +0400 Subject: [PATCH 154/206] KT-696 Create a bunch of functions for java.lang.Object compatibility --- src/org/jetbrains/jet/j2k/Converter.java | 26 +++++++++-- .../j2k/ast/DummyMethodCallExpression.java | 6 +-- ...tement.java => DummyStringExpression.java} | 4 +- .../jet/j2k/visitors/Dispatcher.java | 20 +++++++++ .../jet/j2k/visitors/ExpressionVisitor.java | 26 +++++++++-- ...ssionVisitorForDirectObjectInheritors.java | 43 +++++++++++++++++++ .../file/extendsBaseWhichExtendsObject.kt | 6 +-- testData/ast/function/file/overrideObject.kt | 6 +-- testData/ast/issues/file/kt-696.jav | 35 +++++++++++++++ testData/ast/issues/file/kt-696.kt | 23 ++++++++++ 10 files changed, 178 insertions(+), 17 deletions(-) rename src/org/jetbrains/jet/j2k/ast/{DummyStringStatement.java => DummyStringExpression.java} (70%) create mode 100644 src/org/jetbrains/jet/j2k/visitors/Dispatcher.java create mode 100644 src/org/jetbrains/jet/j2k/visitors/ExpressionVisitorForDirectObjectInheritors.java create mode 100644 testData/ast/issues/file/kt-696.jav create mode 100644 testData/ast/issues/file/kt-696.kt diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 5abe58a6a52..567345265a2 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -26,6 +26,10 @@ public class Converter { } } ; private static Set ourClassIdentifiers = new HashSet(); + private static final Dispatcher ourDispatcher = new Dispatcher(); +// private static ExpressionVisitor ourExpressionVisitor = new ExpressionVisitor(); + + private static final java.lang.Class visitorClass = ExpressionVisitor.class; public static void setClassIdentifiers(Set identifiers) { ourClassIdentifiers = identifiers; @@ -107,7 +111,7 @@ public class Converter { List result = new LinkedList(); for (Field f : fields) { final String identifierToKotlin = f.getIdentifier().toKotlin(); - result.add(new DummyStringStatement("$" + identifierToKotlin + " = " + identifierToKotlin)); + result.add(new DummyStringExpression("$" + identifierToKotlin + " = " + identifierToKotlin)); } return result; } @@ -184,7 +188,7 @@ public class Converter { newStatements.add( 0, - new DummyStringStatement( + new DummyStringExpression( "val __ = " + createPrimaryConstructorInvocation( name.toKotlin(), finalOrWithEmptyInitializer, @@ -294,6 +298,11 @@ public class Converter { @NotNull private static Function methodToFunction(@NotNull PsiMethod method, boolean notEmpty) { + if (isOverrideObjectDirect(method)) + ourDispatcher.setExpressionVisitor(new ExpressionVisitorForDirectObjectInheritors()); + else + ourDispatcher.setExpressionVisitor(new ExpressionVisitor()); + final IdentifierImpl identifier = new IdentifierImpl(method.getName()); final Type returnType = typeToType(method.getReturnType(), isNotNull(method.getModifierList())); final Block body = blockToBlock(method.getBody(), notEmpty); @@ -350,6 +359,17 @@ public class Converter { return counter > 0; } + private static boolean isOverrideObjectDirect(@NotNull final PsiMethod method) { + List superSignatures = method.getHierarchicalMethodSignature().getSuperSignatures(); + if (superSignatures.size() == 1) { + final PsiClass containingClass = superSignatures.get(0).getMethod().getContainingClass(); + final String qualifiedName = containingClass != null ? containingClass.getQualifiedName() : ""; + if (qualifiedName != null && qualifiedName.equals("java.lang.Object")) + return true; + } + return false; + } + @NotNull public static Block blockToBlock(@Nullable PsiCodeBlock block, boolean notEmpty) { if (block == null) return Block.EMPTY_BLOCK; @@ -386,7 +406,7 @@ public class Converter { @NotNull public static Expression expressionToExpression(@Nullable PsiExpression e) { if (e == null) return Expression.EMPTY_EXPRESSION; - final ExpressionVisitor expressionVisitor = new ExpressionVisitor(); + final ExpressionVisitor expressionVisitor = ourDispatcher.getExpressionVisitor(); e.accept(expressionVisitor); return expressionVisitor.getResult(); } diff --git a/src/org/jetbrains/jet/j2k/ast/DummyMethodCallExpression.java b/src/org/jetbrains/jet/j2k/ast/DummyMethodCallExpression.java index fabb9d3d92f..e304161c987 100644 --- a/src/org/jetbrains/jet/j2k/ast/DummyMethodCallExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/DummyMethodCallExpression.java @@ -6,11 +6,11 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public class DummyMethodCallExpression extends Expression { - private final Expression myWho; + private final Element myWho; private final String myMethodName; - private final Expression myWhat; + private final Element myWhat; - public DummyMethodCallExpression(Expression who, String methodName, Expression what) { + public DummyMethodCallExpression(Element who, String methodName, Element what) { myWho = who; myMethodName = methodName; myWhat = what; diff --git a/src/org/jetbrains/jet/j2k/ast/DummyStringStatement.java b/src/org/jetbrains/jet/j2k/ast/DummyStringExpression.java similarity index 70% rename from src/org/jetbrains/jet/j2k/ast/DummyStringStatement.java rename to src/org/jetbrains/jet/j2k/ast/DummyStringExpression.java index f9084fc1c66..0c3eb6717db 100644 --- a/src/org/jetbrains/jet/j2k/ast/DummyStringStatement.java +++ b/src/org/jetbrains/jet/j2k/ast/DummyStringExpression.java @@ -5,10 +5,10 @@ import org.jetbrains.annotations.NotNull; /** * @author ignatov */ -public class DummyStringStatement extends Statement { +public class DummyStringExpression extends Expression { private final String myString; - public DummyStringStatement(String string) { + public DummyStringExpression(String string) { myString = string; } diff --git a/src/org/jetbrains/jet/j2k/visitors/Dispatcher.java b/src/org/jetbrains/jet/j2k/visitors/Dispatcher.java new file mode 100644 index 00000000000..1bab193181b --- /dev/null +++ b/src/org/jetbrains/jet/j2k/visitors/Dispatcher.java @@ -0,0 +1,20 @@ +package org.jetbrains.jet.j2k.visitors; + +/** + * @author ignatov + */ +public class Dispatcher { + private ExpressionVisitor myExpressionVisitor; + + public void setExpressionVisitor(final ExpressionVisitor expressionVisitor) { + this.myExpressionVisitor = expressionVisitor; + } + + public Dispatcher() { + myExpressionVisitor = new ExpressionVisitor(); + } + + public ExpressionVisitor getExpressionVisitor() { + return myExpressionVisitor; + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 4020ba6480a..7654d99f923 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -16,7 +16,12 @@ import static org.jetbrains.jet.j2k.Converter.*; * @author ignatov */ public class ExpressionVisitor extends StatementVisitor { - private Expression myResult = Expression.EMPTY_EXPRESSION; + Expression myResult = Expression.EMPTY_EXPRESSION; + + @Override + public void visitExpression(final PsiExpression expression) { + myResult = Expression.EMPTY_EXPRESSION; + } @NotNull @Override @@ -295,7 +300,7 @@ public class ExpressionVisitor extends StatementVisitor { final boolean hasReceiver = isFieldReference && insideSecondaryConstructor; final boolean isThis = isThisExpression(expression); final boolean isNullable = typeToType(expression.getType()).isNullable(); - final String className = getClassName(expression); + final String className = getClassNameWithConstructor(expression); Expression identifier = new IdentifierImpl(expression.getReferenceName(), isNullable); @@ -316,7 +321,7 @@ public class ExpressionVisitor extends StatementVisitor { } @NotNull - private static String getClassName(@NotNull PsiReferenceExpression expression) { + static String getClassNameWithConstructor(@NotNull PsiReferenceExpression expression) { PsiElement context = expression.getContext(); while (context != null) { if (context instanceof PsiMethod && ((PsiMethod) context).isConstructor()) { @@ -332,6 +337,21 @@ public class ExpressionVisitor extends StatementVisitor { return ""; } + @NotNull + static String getClassName(@NotNull PsiExpression expression) { + PsiElement context = expression.getContext(); + while (context != null) { + if (context instanceof PsiClass) { + final PsiClass containingClass = (PsiClass) context; + final PsiIdentifier identifier = containingClass.getNameIdentifier(); + if (identifier != null) + return identifier.getText(); + } + context = context.getContext(); + } + return ""; + } + private static boolean isFieldReference(@NotNull PsiReferenceExpression expression, PsiClass currentClass) { final PsiReference reference = expression.getReference(); if (reference != null) { diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitorForDirectObjectInheritors.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitorForDirectObjectInheritors.java new file mode 100644 index 00000000000..0af63b9f67f --- /dev/null +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitorForDirectObjectInheritors.java @@ -0,0 +1,43 @@ +package org.jetbrains.jet.j2k.visitors; + +import com.intellij.psi.*; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.j2k.Converter; +import org.jetbrains.jet.j2k.ast.DummyMethodCallExpression; +import org.jetbrains.jet.j2k.ast.DummyStringExpression; +import org.jetbrains.jet.j2k.ast.IdentifierImpl; + +/** + * @author ignatov + */ +public class ExpressionVisitorForDirectObjectInheritors extends ExpressionVisitor { + @Override + public void visitMethodCallExpression(@NotNull final PsiMethodCallExpression expression) { + if (superMethodInvocation(expression.getMethodExpression(), "hashCode")) + myResult = new DummyMethodCallExpression(new IdentifierImpl("System"), "identityHashCode", new IdentifierImpl("this")); + else if (superMethodInvocation(expression.getMethodExpression(), "equals")) + myResult = new DummyMethodCallExpression(new IdentifierImpl("this"), "identityEquals", Converter.elementToElement(expression.getArgumentList())); + else if (superMethodInvocation(expression.getMethodExpression(), "toString")) + myResult = new DummyStringExpression(String.format("getJavaClass<%s>.getName() + '@' + Integer.toHexString(hashCode())", getClassName(expression.getMethodExpression()))); + else + super.visitMethodCallExpression(expression); + } + + @Override + public void visitReferenceExpression(@NotNull final PsiReferenceExpression expression) { + super.visitReferenceExpression(expression); + } + + private static boolean superMethodInvocation(@NotNull final PsiReferenceExpression expression, final String methodName) { + String referenceName = expression.getReferenceName(); + PsiExpression qualifierExpression = expression.getQualifierExpression(); + if (referenceName != null && referenceName.equals(methodName)) { + if (qualifierExpression instanceof PsiSuperExpression) { + PsiType type = qualifierExpression.getType(); + if (type != null && type.getCanonicalText().equals("java.lang.Object")) + return true; + } + } + return false; + } +} diff --git a/testData/ast/function/file/extendsBaseWhichExtendsObject.kt b/testData/ast/function/file/extendsBaseWhichExtendsObject.kt index c5f6ebe3a49..f1893768f30 100644 --- a/testData/ast/function/file/extendsBaseWhichExtendsObject.kt +++ b/testData/ast/function/file/extendsBaseWhichExtendsObject.kt @@ -18,16 +18,16 @@ super.finalize() } open class Base() { open public fun hashCode() : Int { -return super.hashCode() +return System.identityHashCode(this) } open public fun equals(o : Any?) : Boolean { -return super.equals(o) +return this.identityEquals(o) } open protected fun clone() : Any? { return super.clone() } open public fun toString() : String? { -return super.toString() +return getJavaClass.getName() + '@' + Integer.toHexString(hashCode()) } open protected fun finalize() : Unit { super.finalize() diff --git a/testData/ast/function/file/overrideObject.kt b/testData/ast/function/file/overrideObject.kt index b60bac09b96..658174be178 100644 --- a/testData/ast/function/file/overrideObject.kt +++ b/testData/ast/function/file/overrideObject.kt @@ -1,16 +1,16 @@ namespace test open class Test() { open public fun hashCode() : Int { -return super.hashCode() +return System.identityHashCode(this) } open public fun equals(o : Any?) : Boolean { -return super.equals(o) +return this.identityEquals(o) } open protected fun clone() : Any? { return super.clone() } open public fun toString() : String? { -return super.toString() +return getJavaClass.getName() + '@' + Integer.toHexString(hashCode()) } open protected fun finalize() : Unit { super.finalize() diff --git a/testData/ast/issues/file/kt-696.jav b/testData/ast/issues/file/kt-696.jav new file mode 100644 index 00000000000..2a03b39aa53 --- /dev/null +++ b/testData/ast/issues/file/kt-696.jav @@ -0,0 +1,35 @@ +package test; + +class Base { + @Override + public int hashCode() { + return super.hashCode(); + } + + @Override + public boolean equals(Object o) { + return super.equals(o); + } + + @Override + public String toString() { + return super.toString(); + } +} + +class Child extends Base { + @Override + public int hashCode() { + return super.hashCode(); + } + + @Override + public boolean equals(Object o) { + return super.equals(o); + } + + @Override + public String toString() { + return super.toString(); + } +} diff --git a/testData/ast/issues/file/kt-696.kt b/testData/ast/issues/file/kt-696.kt new file mode 100644 index 00000000000..a238b6fa9fb --- /dev/null +++ b/testData/ast/issues/file/kt-696.kt @@ -0,0 +1,23 @@ +namespace test +open class Base() { +open public fun hashCode() : Int { +return System.identityHashCode(this) +} +open public fun equals(o : Any?) : Boolean { +return this.identityEquals(o) +} +open public fun toString() : String? { +return getJavaClass.getName() + '@' + Integer.toHexString(hashCode()) +} +} +open class Child() : Base() { +override public fun hashCode() : Int { +return super.hashCode() +} +override public fun equals(o : Any?) : Boolean { +return super.equals(o) +} +override public fun toString() : String? { +return super.toString() +} +} \ No newline at end of file From 0c358a9e94a1a919b433c6635ba3fabaac845271 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 6 Dec 2011 17:33:11 +0400 Subject: [PATCH 155/206] profile settings added --- j2k.ipr | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/j2k.ipr b/j2k.ipr index 0a37fa886cd..fcc01311ac1 100644 --- a/j2k.ipr +++ b/j2k.ipr @@ -571,6 +571,15 @@ + + + From 1287379398c22ae8579f130f3f2b05487d342501 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 7 Dec 2011 15:45:00 +0400 Subject: [PATCH 156/206] first implementation for switch conversion added --- .../jetbrains/jet/j2k/ast/CaseContainer.java | 29 +++++++++++ .../j2k/ast/DefaultSwitchLabelStatement.java | 14 +++++ .../jet/j2k/ast/SwitchContainer.java | 27 ++++++++++ .../jet/j2k/ast/SwitchLabelStatement.java | 20 ++++++++ .../jet/j2k/visitors/StatementVisitor.java | 48 +++++++++++++++++ testData/ast/switch/file/kt-539.jav | 25 +++++++++ testData/ast/switch/file/kt-539.kt | 51 +++++++++++++++++++ 7 files changed, 214 insertions(+) create mode 100644 src/org/jetbrains/jet/j2k/ast/CaseContainer.java create mode 100644 src/org/jetbrains/jet/j2k/ast/DefaultSwitchLabelStatement.java create mode 100644 src/org/jetbrains/jet/j2k/ast/SwitchContainer.java create mode 100644 src/org/jetbrains/jet/j2k/ast/SwitchLabelStatement.java create mode 100644 testData/ast/switch/file/kt-539.jav create mode 100644 testData/ast/switch/file/kt-539.kt diff --git a/src/org/jetbrains/jet/j2k/ast/CaseContainer.java b/src/org/jetbrains/jet/j2k/ast/CaseContainer.java new file mode 100644 index 00000000000..9d1bbfddb16 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/CaseContainer.java @@ -0,0 +1,29 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +import java.util.LinkedList; +import java.util.List; + +/** + * @author ignatov + */ +public class CaseContainer extends Statement { + private Statement myCaseStatement; + private Block myBlock; + + public CaseContainer(final Statement caseStatement, final List statements) { + myCaseStatement = caseStatement; + List newStatements = new LinkedList(); + for (Statement s : statements) + if (s.getKind() != Kind.BREAK && s.getKind() != Kind.CONTINUE ) + newStatements.add(s); + myBlock = new Block(newStatements); + } + + @NotNull + @Override + public String toKotlin() { + return myCaseStatement.toKotlin() + SPACE + "=>" + SPACE + myBlock.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/DefaultSwitchLabelStatement.java b/src/org/jetbrains/jet/j2k/ast/DefaultSwitchLabelStatement.java new file mode 100644 index 00000000000..a148197da77 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/DefaultSwitchLabelStatement.java @@ -0,0 +1,14 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class DefaultSwitchLabelStatement extends Statement { + @NotNull + @Override + public String toKotlin() { + return "else"; + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/SwitchContainer.java b/src/org/jetbrains/jet/j2k/ast/SwitchContainer.java new file mode 100644 index 00000000000..3df81ce44cd --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/SwitchContainer.java @@ -0,0 +1,27 @@ +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 SwitchContainer extends Statement { + private Expression myExpression; + private List myCaseContainers; + + public SwitchContainer(final Expression expression, final List caseContainers) { + myExpression = expression; + myCaseContainers = caseContainers; + } + + @NotNull + @Override + public String toKotlin() { + return "when" + SPACE + "(" + myExpression.toKotlin() + ")" + SPACE + "{" + N + + AstUtil.joinNodes(myCaseContainers, N) + N + + "}"; + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/SwitchLabelStatement.java b/src/org/jetbrains/jet/j2k/ast/SwitchLabelStatement.java new file mode 100644 index 00000000000..d0ccb83acad --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/SwitchLabelStatement.java @@ -0,0 +1,20 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class SwitchLabelStatement extends Statement { + private Expression myExpression; + + public SwitchLabelStatement(final Expression expression) { + myExpression = expression; + } + + @NotNull + @Override + public String toKotlin() { + return myExpression.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index e73cf6c7314..9f29877efe4 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -5,9 +5,11 @@ import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.PsiUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.j2k.ast.*; import java.util.Arrays; +import java.util.Collections; import java.util.LinkedList; import java.util.List; @@ -190,11 +192,57 @@ public class StatementVisitor extends ElementVisitor { @Override public void visitSwitchLabelStatement(PsiSwitchLabelStatement statement) { super.visitSwitchLabelStatement(statement); + myResult = statement.isDefaultCase() ? + new DefaultSwitchLabelStatement() : + new SwitchLabelStatement(expressionToExpression(statement.getCaseValue())); } @Override public void visitSwitchStatement(PsiSwitchStatement statement) { super.visitSwitchStatement(statement); + List caseContainers = listToCases(splitToCases(statement.getBody())); + myResult = new SwitchContainer( + expressionToExpression(statement.getExpression()), + caseContainers + ); + } + + @NotNull + private static List listToCases(@NotNull final List> cases) { + List result = new LinkedList(); + for (List ls : cases) { + assert ls.size() > 0; + PsiStatement label = ls.get(0); + assert label instanceof PsiSwitchLabelStatement; + result.add(new CaseContainer(statementToStatement(label), + ls.size() > 1 ? + statementsToStatementList(ls.subList(1, ls.size()).toArray(new PsiStatement[ls.size() - 1])) : + Collections.emptyList() + )); + } + return result; + } + + @NotNull + private static List> splitToCases(@Nullable final PsiCodeBlock body) { + List> cases = new LinkedList>(); + List currentCaseStatements = new LinkedList(); + boolean isFirst = true; + if (body != null) { + for (PsiStatement s : body.getStatements()) { + if (s instanceof PsiSwitchLabelStatement) { + if (isFirst) + isFirst = false; + else { + cases.add(currentCaseStatements); + currentCaseStatements = new LinkedList(); + } + } + currentCaseStatements.add(s); + } + cases.add(currentCaseStatements); + } + return cases; } @Override diff --git a/testData/ast/switch/file/kt-539.jav b/testData/ast/switch/file/kt-539.jav new file mode 100644 index 00000000000..890eaa836e2 --- /dev/null +++ b/testData/ast/switch/file/kt-539.jav @@ -0,0 +1,25 @@ +package switch_demo; + +public class SwitchDemo { + public static void main(String[] args) { + + int month = 8; + String monthString; + switch (month) { + case 1: monthString = "January"; break; + case 2: monthString = "February"; break; + case 3: monthString = "March"; break; + case 4: monthString = "April"; break; + case 5: monthString = "May"; break; + case 6: monthString = "June"; break; + case 7: monthString = "July"; break; + case 8: monthString = "August"; break; + case 9: monthString = "September"; break; + case 10: monthString = "October"; break; + case 11: monthString = "November"; break; + case 12: monthString = "December"; break; + default: monthString = "Invalid month"; break; + } + System.out.println(monthString); + } +} \ No newline at end of file diff --git a/testData/ast/switch/file/kt-539.kt b/testData/ast/switch/file/kt-539.kt new file mode 100644 index 00000000000..b716e66dd3d --- /dev/null +++ b/testData/ast/switch/file/kt-539.kt @@ -0,0 +1,51 @@ +namespace switch_demo +public open class SwitchDemo() { +class object { +open public fun main(args : Array?) : Unit { +var month : Int = 8 +var monthString : String? +when (month) { +1 => { +monthString = "January" +} +2 => { +monthString = "February" +} +3 => { +monthString = "March" +} +4 => { +monthString = "April" +} +5 => { +monthString = "May" +} +6 => { +monthString = "June" +} +7 => { +monthString = "July" +} +8 => { +monthString = "August" +} +9 => { +monthString = "September" +} +10 => { +monthString = "October" +} +11 => { +monthString = "November" +} +12 => { +monthString = "December" +} +else => { +monthString = "Invalid month" +} +} +System.out?.println(monthString) +} +} +} \ No newline at end of file From dafc51045038a133cf33775a4c2ed8c4bf822dcf Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 7 Dec 2011 16:00:21 +0400 Subject: [PATCH 157/206] throw down case for empty cases supported --- .../jetbrains/jet/j2k/ast/CaseContainer.java | 7 +++--- .../jet/j2k/visitors/StatementVisitor.java | 16 ++++++++----- testData/ast/switch/file/throwDown.jav | 24 +++++++++++++++++++ testData/ast/switch/file/throwDown.kt | 18 ++++++++++++++ 4 files changed, 56 insertions(+), 9 deletions(-) create mode 100644 testData/ast/switch/file/throwDown.jav create mode 100644 testData/ast/switch/file/throwDown.kt diff --git a/src/org/jetbrains/jet/j2k/ast/CaseContainer.java b/src/org/jetbrains/jet/j2k/ast/CaseContainer.java index 9d1bbfddb16..ceef2f43ce9 100644 --- a/src/org/jetbrains/jet/j2k/ast/CaseContainer.java +++ b/src/org/jetbrains/jet/j2k/ast/CaseContainer.java @@ -1,6 +1,7 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.j2k.util.AstUtil; import java.util.LinkedList; import java.util.List; @@ -9,10 +10,10 @@ import java.util.List; * @author ignatov */ public class CaseContainer extends Statement { - private Statement myCaseStatement; + private List myCaseStatement; private Block myBlock; - public CaseContainer(final Statement caseStatement, final List statements) { + public CaseContainer(final List caseStatement, final List statements) { myCaseStatement = caseStatement; List newStatements = new LinkedList(); for (Statement s : statements) @@ -24,6 +25,6 @@ public class CaseContainer extends Statement { @NotNull @Override public String toKotlin() { - return myCaseStatement.toKotlin() + SPACE + "=>" + SPACE + myBlock.toKotlin(); + return AstUtil.joinNodes(myCaseStatement, COMMA_WITH_SPACE) + SPACE + "=>" + SPACE + myBlock.toKotlin(); } } diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index 9f29877efe4..0307beac425 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -9,7 +9,6 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.j2k.ast.*; import java.util.Arrays; -import java.util.Collections; import java.util.LinkedList; import java.util.List; @@ -210,15 +209,20 @@ public class StatementVisitor extends ElementVisitor { @NotNull private static List listToCases(@NotNull final List> cases) { List result = new LinkedList(); + List pendingLabels = new LinkedList(); for (List ls : cases) { assert ls.size() > 0; PsiStatement label = ls.get(0); assert label instanceof PsiSwitchLabelStatement; - result.add(new CaseContainer(statementToStatement(label), - ls.size() > 1 ? - statementsToStatementList(ls.subList(1, ls.size()).toArray(new PsiStatement[ls.size() - 1])) : - Collections.emptyList() - )); + if (ls.size() > 1) { + pendingLabels.add(statementToStatement(label)); + result.add(new CaseContainer(pendingLabels, + statementsToStatementList(ls.subList(1, ls.size()).toArray(new PsiStatement[ls.size() - 1])) + )); + pendingLabels = new LinkedList(); + } + else // ls.size() == 1 + pendingLabels.add(statementToStatement(label)); } return result; } diff --git a/testData/ast/switch/file/throwDown.jav b/testData/ast/switch/file/throwDown.jav new file mode 100644 index 00000000000..a6e4c557a72 --- /dev/null +++ b/testData/ast/switch/file/throwDown.jav @@ -0,0 +1,24 @@ +package switch_demo; + +public class SwitchDemo { + public static void main(String[] args) { + int month = 8; + String monthString; + switch (month) { + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 10: + case 11: + case 12: monthString = "December"; break; + default: monthString = "Invalid month"; break; + } + System.out.println(monthString); + } +} \ No newline at end of file diff --git a/testData/ast/switch/file/throwDown.kt b/testData/ast/switch/file/throwDown.kt new file mode 100644 index 00000000000..54888aa2e40 --- /dev/null +++ b/testData/ast/switch/file/throwDown.kt @@ -0,0 +1,18 @@ +namespace switch_demo +public open class SwitchDemo() { +class object { +open public fun main(args : Array?) : Unit { +var month : Int = 8 +var monthString : String? +when (month) { +1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 => { +monthString = "December" +} +else => { +monthString = "Invalid month" +} +} +System.out?.println(monthString) +} +} +} \ No newline at end of file From 1c374e33820adfb39ee853b655990a95650e961e Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 7 Dec 2011 16:01:42 +0400 Subject: [PATCH 158/206] throw down case for empty cases supported --- src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index 0307beac425..8c3a9d25eb1 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -199,10 +199,9 @@ public class StatementVisitor extends ElementVisitor { @Override public void visitSwitchStatement(PsiSwitchStatement statement) { super.visitSwitchStatement(statement); - List caseContainers = listToCases(splitToCases(statement.getBody())); myResult = new SwitchContainer( expressionToExpression(statement.getExpression()), - caseContainers + listToCases(splitToCases(statement.getBody())) ); } From 374ebaafc863c06b7c127a62f88650bcf2b3b6e7 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 7 Dec 2011 17:44:32 +0400 Subject: [PATCH 159/206] KT-539 Switch support --- src/org/jetbrains/jet/j2k/Converter.java | 7 ++ .../jet/j2k/visitors/StatementVisitor.java | 52 +++++++++-- .../jet/j2k/JavaToKotlinConverterTest.java | 2 +- .../ast/switch/file/comlicatedFallDown.jav | 32 +++++++ .../ast/switch/file/comlicatedFallDown.kt | 87 +++++++++++++++++++ .../file/{throwDown.jav => fallDown.jav} | 0 .../switch/file/{throwDown.kt => fallDown.kt} | 0 7 files changed, 171 insertions(+), 9 deletions(-) create mode 100644 testData/ast/switch/file/comlicatedFallDown.jav create mode 100644 testData/ast/switch/file/comlicatedFallDown.kt rename testData/ast/switch/file/{throwDown.jav => fallDown.jav} (100%) rename testData/ast/switch/file/{throwDown.kt => fallDown.kt} (100%) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 567345265a2..509704cf4bc 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -388,6 +388,13 @@ public class Converter { return result; } + @NotNull + public static List statementsToStatementList(@NotNull List statements) { + List result = new LinkedList(); + for (PsiStatement t : statements) result.add(statementToStatement(t)); + return result; + } + @NotNull public static Statement statementToStatement(@Nullable PsiStatement s) { if (s == null) return Statement.EMPTY_STATEMENT; diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index 8c3a9d25eb1..0e3561722c9 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -9,6 +9,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.j2k.ast.*; import java.util.Arrays; +import java.util.Collections; import java.util.LinkedList; import java.util.List; @@ -201,27 +202,62 @@ public class StatementVisitor extends ElementVisitor { super.visitSwitchStatement(statement); myResult = new SwitchContainer( expressionToExpression(statement.getExpression()), - listToCases(splitToCases(statement.getBody())) + switchBodyToCases(statement.getBody()) ); } @NotNull - private static List listToCases(@NotNull final List> cases) { + private static List switchBodyToCases(@Nullable final PsiCodeBlock body) { + final List> cases = splitToCases(body); + final List allSwitchStatements = body != null ? Arrays.asList(body.getStatements()) : Collections.emptyList(); + List result = new LinkedList(); List pendingLabels = new LinkedList(); + int i = 0; for (List ls : cases) { assert ls.size() > 0; PsiStatement label = ls.get(0); assert label instanceof PsiSwitchLabelStatement; + + assert allSwitchStatements.get(i) == label : "not a right index"; + if (ls.size() > 1) { pendingLabels.add(statementToStatement(label)); - result.add(new CaseContainer(pendingLabels, - statementsToStatementList(ls.subList(1, ls.size()).toArray(new PsiStatement[ls.size() - 1])) - )); - pendingLabels = new LinkedList(); - } - else // ls.size() == 1 + List slice = ls.subList(1, ls.size()); + + if (!containsBreak(slice)) { + List statements = statementsToStatementList(slice); + statements.addAll( + statementsToStatementList(getAllToNextBreak(allSwitchStatements, i + ls.size())) + ); + result.add(new CaseContainer(pendingLabels, statements)); + pendingLabels = new LinkedList(); + } else { + result.add(new CaseContainer(pendingLabels, statementsToStatementList(slice))); + pendingLabels = new LinkedList(); + } + } else // ls.size() == 1 pendingLabels.add(statementToStatement(label)); + i += ls.size(); + } + return result; + } + + private static boolean containsBreak(@NotNull final List slice) { + for (PsiStatement s : slice) + if (s instanceof PsiBreakStatement) + return true; + return false; + } + + private static List getAllToNextBreak(@NotNull final List allStatements, final int start) { + List result = new LinkedList(); + for (int i = start; i < allStatements.size(); i++) { + PsiStatement s = allStatements.get(i); + if (s instanceof PsiBreakStatement) + return result; + if (!(s instanceof PsiSwitchLabelStatement)) + result.add(s); } return result; } diff --git a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java index 6b7a168efb3..73ed72b01c6 100644 --- a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java +++ b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java @@ -84,7 +84,7 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { public static Test suite() { TestSuite suite = new TestSuite(); - suite.addTest(TestCaseBuilder.suiteForDirectory(getTestDataPathBase(), "/ast", true, new TestCaseBuilder.NamedTestFactory() { + suite.addTest(TestCaseBuilder.suiteForDirectory(getTestDataPathBase(), "/ast/switch", true, new TestCaseBuilder.NamedTestFactory() { @NotNull @Override public Test createTest(@NotNull String dataPath, @NotNull String name) { diff --git a/testData/ast/switch/file/comlicatedFallDown.jav b/testData/ast/switch/file/comlicatedFallDown.jav new file mode 100644 index 00000000000..7bede23f75c --- /dev/null +++ b/testData/ast/switch/file/comlicatedFallDown.jav @@ -0,0 +1,32 @@ +package demo; + +public class SwitchDemo { + public static void print(Object o) { + System.out.println(o); + } + + public static void test(int i) { + String monthString = ""; + switch (i) { + case 1: print(1); + case 2: print(2); + case 3: print(3); + case 4: print(4); + case 5: print(5); break; + case 6: print(6); + case 7: print(7); + case 8: print(8); + case 9: print(9); + case 10: print(10); + case 11: print(11); + case 12: monthString = "December"; break; + default: monthString = "Invalid month"; break; + } + System.out.println(monthString); + } + + public static void main(String[] args) { + for (int i = 1; i <=12 ; i++) + test(i); + } +} \ No newline at end of file diff --git a/testData/ast/switch/file/comlicatedFallDown.kt b/testData/ast/switch/file/comlicatedFallDown.kt new file mode 100644 index 00000000000..54abfcf4618 --- /dev/null +++ b/testData/ast/switch/file/comlicatedFallDown.kt @@ -0,0 +1,87 @@ +namespace demo +public open class SwitchDemo() { +class object { +open public fun print(o : Any?) : Unit { +System.out?.println(o) +} +open public fun test(i : Int) : Unit { +var monthString : String? = "" +when (i) { +1 => { +print(1) +print(2) +print(3) +print(4) +print(5) +} +2 => { +print(2) +print(3) +print(4) +print(5) +} +3 => { +print(3) +print(4) +print(5) +} +4 => { +print(4) +print(5) +} +5 => { +print(5) +} +6 => { +print(6) +print(7) +print(8) +print(9) +print(10) +print(11) +monthString = "December" +} +7 => { +print(7) +print(8) +print(9) +print(10) +print(11) +monthString = "December" +} +8 => { +print(8) +print(9) +print(10) +print(11) +monthString = "December" +} +9 => { +print(9) +print(10) +print(11) +monthString = "December" +} +10 => { +print(10) +print(11) +monthString = "December" +} +11 => { +print(11) +monthString = "December" +} +12 => { +monthString = "December" +} +else => { +monthString = "Invalid month" +} +} +System.out?.println(monthString) +} +open public fun main(args : Array?) : Unit { +for (i in 1..12) test(i) +} +} +} \ No newline at end of file diff --git a/testData/ast/switch/file/throwDown.jav b/testData/ast/switch/file/fallDown.jav similarity index 100% rename from testData/ast/switch/file/throwDown.jav rename to testData/ast/switch/file/fallDown.jav diff --git a/testData/ast/switch/file/throwDown.kt b/testData/ast/switch/file/fallDown.kt similarity index 100% rename from testData/ast/switch/file/throwDown.kt rename to testData/ast/switch/file/fallDown.kt From 15f4d6d400842b9539b82d0cf5900f0b23378731 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 7 Dec 2011 17:48:21 +0400 Subject: [PATCH 160/206] tests fixed --- test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java index 73ed72b01c6..6b7a168efb3 100644 --- a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java +++ b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java @@ -84,7 +84,7 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { public static Test suite() { TestSuite suite = new TestSuite(); - suite.addTest(TestCaseBuilder.suiteForDirectory(getTestDataPathBase(), "/ast/switch", true, new TestCaseBuilder.NamedTestFactory() { + suite.addTest(TestCaseBuilder.suiteForDirectory(getTestDataPathBase(), "/ast", true, new TestCaseBuilder.NamedTestFactory() { @NotNull @Override public Test createTest(@NotNull String dataPath, @NotNull String name) { From d1d4a9bd0d3e5752de80534d844b02f5c20cdd51 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 12 Dec 2011 12:45:39 +0400 Subject: [PATCH 161/206] KT-543 Support autoboxing primitive types (for method calls) --- .../jet/j2k/ast/MethodCallExpression.java | 15 ++- src/org/jetbrains/jet/j2k/util/AstUtil.java | 20 ++++ .../jet/j2k/visitors/ExpressionVisitor.java | 92 +++++++++++++++++-- testData/ast/issues/file/kt-543-boxed.jav | 13 +++ testData/ast/issues/file/kt-543-boxed.kt | 11 +++ testData/ast/issues/file/kt-543-mixed.jav | 10 ++ testData/ast/issues/file/kt-543-mixed.kt | 9 ++ testData/ast/issues/file/kt-543.jav | 10 ++ testData/ast/issues/file/kt-543.kt | 9 ++ 9 files changed, 179 insertions(+), 10 deletions(-) create mode 100644 testData/ast/issues/file/kt-543-boxed.jav create mode 100644 testData/ast/issues/file/kt-543-boxed.kt create mode 100644 testData/ast/issues/file/kt-543-mixed.jav create mode 100644 testData/ast/issues/file/kt-543-mixed.kt create mode 100644 testData/ast/issues/file/kt-543.jav create mode 100644 testData/ast/issues/file/kt-543.kt diff --git a/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java b/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java index 0c8a1d21536..5bfc87b69f5 100644 --- a/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java @@ -10,13 +10,19 @@ import java.util.List; */ public class MethodCallExpression extends Expression { private final Expression myMethodCall; - private final Element myParamList; + private final List myArguments; + private List myConversions; private final boolean myIsResultNullable; private final List myTypeParameters; - public MethodCallExpression(Expression methodCall, Element paramList, boolean nullable, List typeParameters) { + public MethodCallExpression(Expression methodCall, List arguments, boolean nullable, List typeParameters) { + this(methodCall, arguments, AstUtil.createListWithEmptyString(arguments), nullable, typeParameters); + } + + public MethodCallExpression(Expression methodCall, List arguments, List conversions, boolean nullable, List typeParameters) { myMethodCall = methodCall; - myParamList = paramList; + myArguments = arguments; + myConversions = conversions; myIsResultNullable = nullable; myTypeParameters = typeParameters; } @@ -30,6 +36,7 @@ public class MethodCallExpression extends Expression { @Override public String toKotlin() { String typeParamsToKotlin = myTypeParameters.size() > 0 ? "<" + AstUtil.joinNodes(myTypeParameters, COMMA_WITH_SPACE) + ">" : EMPTY; - return myMethodCall.toKotlin() + typeParamsToKotlin + "(" + myParamList.toKotlin() + ")"; + List applyConversions = AstUtil.applyConversions(AstUtil.nodesToKotlin(myArguments), myConversions); + return myMethodCall.toKotlin() + typeParamsToKotlin + "(" + AstUtil.join(applyConversions, COMMA_WITH_SPACE) + ")"; } } diff --git a/src/org/jetbrains/jet/j2k/util/AstUtil.java b/src/org/jetbrains/jet/j2k/util/AstUtil.java index d5715267101..a814767880a 100644 --- a/src/org/jetbrains/jet/j2k/util/AstUtil.java +++ b/src/org/jetbrains/jet/j2k/util/AstUtil.java @@ -1,5 +1,6 @@ package org.jetbrains.jet.j2k.util; +import org.jetbrains.jet.j2k.ast.Expression; import org.jetbrains.jet.j2k.ast.INode; import java.util.LinkedList; @@ -44,4 +45,23 @@ public class AstUtil { public static String upperFirstCharacter(String string) { return string.substring(0, 1).toUpperCase() + string.substring(1); } + + public static List createListWithEmptyString(final List arguments) { + final List conversions = new LinkedList(); + //noinspection UnusedDeclaration + for (Expression argument : arguments) conversions.add(""); + return conversions; + } + + public static List applyConversions(List first, List second) { + List result = new LinkedList(); + assert first.size() == second.size() : "Lists must have the same size."; + for (int i = 0; i < first.size(); i++) { + if (second.get(i).isEmpty()) + result.add(first.get(i)); + else + result.add("(" + first.get(i) + ")" + second.get(i)); + } + return result; + } } diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 7654d99f923..9a587d8c4ad 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -7,8 +7,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.j2k.Converter; import org.jetbrains.jet.j2k.ast.*; -import java.util.Collections; -import java.util.List; +import java.util.*; import static org.jetbrains.jet.j2k.Converter.*; @@ -190,14 +189,93 @@ public class ExpressionVisitor extends StatementVisitor { @Override public void visitMethodCallExpression(@NotNull PsiMethodCallExpression expression) { super.visitMethodCallExpression(expression); - if (!SuperVisitor.isSuper(expression.getMethodExpression()) || !isInsidePrimaryConstructor(expression)) + if (!SuperVisitor.isSuper(expression.getMethodExpression()) || !isInsidePrimaryConstructor(expression)) { + List conversions = new LinkedList(); + PsiExpression[] arguments = expression.getArgumentList().getExpressions(); + //noinspection UnusedDeclaration + for (final PsiExpression a : arguments) { + conversions.add(""); + } + + PsiMethod resolve = expression.resolveMethod(); + if (resolve != null) { + List expectedTypes = new LinkedList(); + List actualTypes = new LinkedList(); + + for (PsiParameter p : resolve.getParameterList().getParameters()) + expectedTypes.add(p.getType()); + + for (PsiExpression e : arguments) + actualTypes.add(e.getType()); + + assert actualTypes.size() == expectedTypes.size() : "The type list must have the same length"; + + for (int i = 0; i < actualTypes.size(); i++) { + PsiType actual = actualTypes.get(i); + PsiType expected = expectedTypes.get(i); + + if (isConversionNeeded(actual, expected)) { + conversions.set(i, getPrimitiveTypeConversion(expected.getCanonicalText())); + } + } + } + myResult = // TODO: not resolved new MethodCallExpression( expressionToExpression(expression.getMethodExpression()), - elementToElement(expression.getArgumentList()), + expressionsToExpressionList(arguments), + conversions, typeToType(expression.getType()).isNullable(), typesToTypeList(expression.getTypeArguments()) ); + } + } + + private static boolean isConversionNeeded(final PsiType actual, final PsiType expected) { + Map typeMap = new HashMap(); + typeMap.put("java.lang.Byte", "byte"); + typeMap.put("java.lang.Short", "short"); + typeMap.put("java.lang.Integer", "int"); + typeMap.put("java.lang.Long", "long"); + typeMap.put("java.lang.Float", "float"); + typeMap.put("java.lang.Double", "double"); + typeMap.put("java.lang.Character", "char"); + String expectedStr = expected.getCanonicalText(); + String actualStr = actual.getCanonicalText(); + boolean o1 = getOrElse(typeMap, actualStr, "").equals(expectedStr); + boolean o2 = getOrElse(typeMap, expectedStr, "").equals(actualStr); + return !actualStr.equals(expectedStr) && (!(o1 ^ o2)); + } + + + + private static T getOrElse(Map map, T e, T orElse) { + if (map.containsKey(e)) + return map.get(e); + return orElse; + } + + private static String getPrimitiveTypeConversion(String type) { + Map conversions = new HashMap(); + conversions.put("byte", "byt"); + conversions.put("short", "sht"); + conversions.put("int", "int"); + conversions.put("long", "lng"); + conversions.put("float", "flt"); + conversions.put("double", "dbl"); + conversions.put("char", "chr"); + + conversions.put("java.lang.Byte", "byt"); + conversions.put("java.lang.Short", "sht"); + conversions.put("java.lang.Integer", "int"); + conversions.put("java.lang.Long", "lng"); + conversions.put("java.lang.Float", "flt"); + conversions.put("java.lang.Double", "dbl"); + conversions.put("java.lang.Character", "chr"); + + if (conversions.containsKey(type)) + return "." + conversions.get(type); + return ""; } @Override @@ -224,22 +302,24 @@ public class ExpressionVisitor extends StatementVisitor { final PsiMethod constructor = expression.resolveMethod(); PsiJavaCodeReferenceElement classReference = expression.getClassOrAnonymousClassReference(); final boolean isNotConvertedClass = classReference != null && !Converter.getClassIdentifiers().contains(classReference.getQualifiedName()); + PsiExpressionList argumentList = expression.getArgumentList(); if (constructor == null || isConstructorPrimary(constructor) || isNotConvertedClass) { return new NewClassExpression( expressionToExpression(expression.getQualifier()), elementToElement(classReference), - elementToElement(expression.getArgumentList()), + elementToElement(argumentList), anonymousClass != null ? anonymousClassToAnonymousClass(anonymousClass) : null ); } // is constructor secondary final PsiJavaCodeReferenceElement reference = expression.getClassReference(); final List typeParameters = reference != null ? typesToTypeList(reference.getTypeParameters()) : Collections.emptyList(); + PsiExpression[] expressions = argumentList != null ? argumentList.getExpressions() : new PsiExpression[]{}; return new CallChainExpression( new IdentifierImpl(constructor.getName(), false), new MethodCallExpression( new IdentifierImpl("init"), - elementToElement(expression.getArgumentList()), + expressionsToExpressionList(expressions), false, typeParameters)); } diff --git a/testData/ast/issues/file/kt-543-boxed.jav b/testData/ast/issues/file/kt-543-boxed.jav new file mode 100644 index 00000000000..e1f28f04faa --- /dev/null +++ b/testData/ast/issues/file/kt-543-boxed.jav @@ -0,0 +1,13 @@ +package demo; + +class Test { + void putInt(Integer i) {} + + void test() { + byte b = 10; + putInt(b); + + Byte b2 = 10; + putInt(b2); + } +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-543-boxed.kt b/testData/ast/issues/file/kt-543-boxed.kt new file mode 100644 index 00000000000..dafbd546c92 --- /dev/null +++ b/testData/ast/issues/file/kt-543-boxed.kt @@ -0,0 +1,11 @@ +namespace demo +open class Test() { +open fun putInt(i : Int?) : Unit { +} +open fun test() : Unit { +var b : Byte = 10 +putInt((b).int) +var b2 : Byte? = 10 +putInt((b2).int) +} +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-543-mixed.jav b/testData/ast/issues/file/kt-543-mixed.jav new file mode 100644 index 00000000000..1193a5403bb --- /dev/null +++ b/testData/ast/issues/file/kt-543-mixed.jav @@ -0,0 +1,10 @@ +package demo; + +class Test { + void putInt(Integer i) {} + + void test() { + int i = 10; + putInt(i); + } +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-543-mixed.kt b/testData/ast/issues/file/kt-543-mixed.kt new file mode 100644 index 00000000000..1fd99286342 --- /dev/null +++ b/testData/ast/issues/file/kt-543-mixed.kt @@ -0,0 +1,9 @@ +namespace demo +open class Test() { +open fun putInt(i : Int?) : Unit { +} +open fun test() : Unit { +var i : Int = 10 +putInt(i) +} +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-543.jav b/testData/ast/issues/file/kt-543.jav new file mode 100644 index 00000000000..c5e0e602076 --- /dev/null +++ b/testData/ast/issues/file/kt-543.jav @@ -0,0 +1,10 @@ +package demo; + +class Test { + void putInt(int i) {} + + void test() { + byte b = 10; + putInt(b); + } +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-543.kt b/testData/ast/issues/file/kt-543.kt new file mode 100644 index 00000000000..9e06bf3f48c --- /dev/null +++ b/testData/ast/issues/file/kt-543.kt @@ -0,0 +1,9 @@ +namespace demo +open class Test() { +open fun putInt(i : Int) : Unit { +} +open fun test() : Unit { +var b : Byte = 10 +putInt((b).int) +} +} \ No newline at end of file From a70b830e74c4082ec1c13a7557dc4ffc18bcae0b Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 12 Dec 2011 13:05:25 +0400 Subject: [PATCH 162/206] cleanup --- src/org/jetbrains/jet/j2k/Converter.java | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 509704cf4bc..05ff2772777 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -20,16 +20,13 @@ import java.util.*; public class Converter { private final static Set NOT_NULL_ANNOTATIONS = new HashSet() { { - add("org.jetbrains.annotations.NotNull"); - add("com.sun.istack.internal.NotNull"); - add("javax.annotation.Nonnull"); + add("org.jetbrains.annotations.NotNull"); + add("com.sun.istack.internal.NotNull"); + add("javax.annotation.Nonnull"); } - } ; + }; private static Set ourClassIdentifiers = new HashSet(); private static final Dispatcher ourDispatcher = new Dispatcher(); -// private static ExpressionVisitor ourExpressionVisitor = new ExpressionVisitor(); - - private static final java.lang.Class visitorClass = ExpressionVisitor.class; public static void setClassIdentifiers(Set identifiers) { ourClassIdentifiers = identifiers; @@ -512,10 +509,10 @@ public class Converter { private static boolean isReadOnly(PsiParameter parameter) { for (PsiReference r : (ReferencesSearch.search(parameter))) { - if (r instanceof PsiExpression && PsiUtil.isAccessedForWriting((PsiExpression) r)) { - return false; - } + if (r instanceof PsiExpression && PsiUtil.isAccessedForWriting((PsiExpression) r)) { + return false; } + } return true; } From aea06bf9803af3f74c043a469b70e0319869e7b9 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 12 Dec 2011 13:33:25 +0400 Subject: [PATCH 163/206] KT-794 Support autoboxing primitive return types --- src/org/jetbrains/jet/j2k/Converter.java | 12 ++++++++-- .../jet/j2k/ast/ReturnStatement.java | 9 ++++++- src/org/jetbrains/jet/j2k/util/AstUtil.java | 24 +++++++++++++++---- .../jet/j2k/visitors/ExpressionVisitor.java | 20 +++++++--------- .../jet/j2k/visitors/StatementVisitor.java | 13 +++++++++- testData/ast/issues/file/kt-794-mixed.jav | 11 +++++++++ testData/ast/issues/file/kt-794-mixed.kt | 9 +++++++ testData/ast/issues/file/kt-794.jav | 6 +++++ testData/ast/issues/file/kt-794.kt | 6 +++++ 9 files changed, 89 insertions(+), 21 deletions(-) create mode 100644 testData/ast/issues/file/kt-794-mixed.jav create mode 100644 testData/ast/issues/file/kt-794-mixed.kt create mode 100644 testData/ast/issues/file/kt-794.jav create mode 100644 testData/ast/issues/file/kt-794.kt diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 05ff2772777..8842561b6fd 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -25,8 +25,9 @@ public class Converter { add("javax.annotation.Nonnull"); } }; - private static Set ourClassIdentifiers = new HashSet(); - private static final Dispatcher ourDispatcher = new Dispatcher(); + @NotNull private static Set ourClassIdentifiers = new HashSet(); + @NotNull private static final Dispatcher ourDispatcher = new Dispatcher(); + @Nullable private static PsiType ourMethodReturnType = null; public static void setClassIdentifiers(Set identifiers) { ourClassIdentifiers = identifiers; @@ -36,6 +37,11 @@ public class Converter { return new HashSet(ourClassIdentifiers); } + @Nullable + public static PsiType getMethodReturnType() { + return ourMethodReturnType; + } + public static void clearClassIdentifiers() { ourClassIdentifiers.clear(); } @@ -300,6 +306,8 @@ public class Converter { else ourDispatcher.setExpressionVisitor(new ExpressionVisitor()); + ourMethodReturnType = method.getReturnType(); + final IdentifierImpl identifier = new IdentifierImpl(method.getName()); final Type returnType = typeToType(method.getReturnType(), isNotNull(method.getModifierList())); final Block body = blockToBlock(method.getBody(), notEmpty); diff --git a/src/org/jetbrains/jet/j2k/ast/ReturnStatement.java b/src/org/jetbrains/jet/j2k/ast/ReturnStatement.java index b4040c3d824..bf2e7ca6579 100644 --- a/src/org/jetbrains/jet/j2k/ast/ReturnStatement.java +++ b/src/org/jetbrains/jet/j2k/ast/ReturnStatement.java @@ -1,20 +1,27 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.j2k.util.AstUtil; /** * @author ignatov */ public class ReturnStatement extends Statement { private final Expression myExpression; + private String myConversion = EMPTY; public ReturnStatement(Expression expression) { myExpression = expression; } + public ReturnStatement(final Expression expression, final String conversion) { + this(expression); + myConversion = conversion; + } + @NotNull @Override public String toKotlin() { - return "return" + SPACE + myExpression.toKotlin(); + return "return" + SPACE + AstUtil.applyConversionForOneItem(myExpression.toKotlin(), myConversion); } } diff --git a/src/org/jetbrains/jet/j2k/util/AstUtil.java b/src/org/jetbrains/jet/j2k/util/AstUtil.java index a814767880a..3c96203ab94 100644 --- a/src/org/jetbrains/jet/j2k/util/AstUtil.java +++ b/src/org/jetbrains/jet/j2k/util/AstUtil.java @@ -1,10 +1,12 @@ package org.jetbrains.jet.j2k.util; +import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.j2k.ast.Expression; import org.jetbrains.jet.j2k.ast.INode; import java.util.LinkedList; import java.util.List; +import java.util.Map; /** * @author ignatov @@ -53,15 +55,27 @@ public class AstUtil { return conversions; } - public static List applyConversions(List first, List second) { + @NotNull + public static List applyConversions(@NotNull List first, @NotNull List second) { List result = new LinkedList(); assert first.size() == second.size() : "Lists must have the same size."; for (int i = 0; i < first.size(); i++) { - if (second.get(i).isEmpty()) - result.add(first.get(i)); - else - result.add("(" + first.get(i) + ")" + second.get(i)); + result.add(applyConversionForOneItem(first.get(i), second.get(i))); } return result; } + + @NotNull + public static String applyConversionForOneItem(@NotNull String f, @NotNull String s) { + if (s.isEmpty()) + return f; + else + return "(" + f + ")" + s; + } + + public static T getOrElse(Map map, T e, T orElse) { + if (map.containsKey(e)) + return map.get(e); + return orElse; + } } diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 9a587d8c4ad..73179a332c0 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -6,6 +6,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.j2k.Converter; import org.jetbrains.jet.j2k.ast.*; +import org.jetbrains.jet.j2k.util.AstUtil; import java.util.*; @@ -231,7 +232,9 @@ public class ExpressionVisitor extends StatementVisitor { } } - private static boolean isConversionNeeded(final PsiType actual, final PsiType expected) { + static boolean isConversionNeeded(@Nullable final PsiType actual,@Nullable final PsiType expected) { + if (actual == null || expected == null) + return false; Map typeMap = new HashMap(); typeMap.put("java.lang.Byte", "byte"); typeMap.put("java.lang.Short", "short"); @@ -242,20 +245,13 @@ public class ExpressionVisitor extends StatementVisitor { typeMap.put("java.lang.Character", "char"); String expectedStr = expected.getCanonicalText(); String actualStr = actual.getCanonicalText(); - boolean o1 = getOrElse(typeMap, actualStr, "").equals(expectedStr); - boolean o2 = getOrElse(typeMap, expectedStr, "").equals(actualStr); + boolean o1 = AstUtil.getOrElse(typeMap, actualStr, "").equals(expectedStr); + boolean o2 = AstUtil.getOrElse(typeMap, expectedStr, "").equals(actualStr); return !actualStr.equals(expectedStr) && (!(o1 ^ o2)); } - - - private static T getOrElse(Map map, T e, T orElse) { - if (map.containsKey(e)) - return map.get(e); - return orElse; - } - - private static String getPrimitiveTypeConversion(String type) { + @NotNull + static String getPrimitiveTypeConversion(@NotNull String type) { Map conversions = new HashMap(); conversions.put("byte", "byt"); conversions.put("short", "sht"); diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index 0e3561722c9..d97185146e8 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -6,6 +6,7 @@ import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.PsiUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.j2k.Converter; import org.jetbrains.jet.j2k.ast.*; import java.util.Arrays; @@ -14,6 +15,8 @@ import java.util.LinkedList; import java.util.List; import static org.jetbrains.jet.j2k.Converter.*; +import static org.jetbrains.jet.j2k.visitors.ExpressionVisitor.getPrimitiveTypeConversion; +import static org.jetbrains.jet.j2k.visitors.ExpressionVisitor.isConversionNeeded; /** * @author ignatov @@ -332,8 +335,16 @@ public class StatementVisitor extends ElementVisitor { @Override public void visitReturnStatement(PsiReturnStatement statement) { super.visitReturnStatement(statement); + PsiExpression returnValue = statement.getReturnValue(); + String conversion = ""; + + PsiType methodReturnType = Converter.getMethodReturnType(); + if (returnValue != null && methodReturnType != null && isConversionNeeded(returnValue.getType(), methodReturnType)) { + conversion = getPrimitiveTypeConversion(methodReturnType.getCanonicalText()); + } myResult = new ReturnStatement( - expressionToExpression(statement.getReturnValue()) + expressionToExpression(returnValue), + conversion ); } } diff --git a/testData/ast/issues/file/kt-794-mixed.jav b/testData/ast/issues/file/kt-794-mixed.jav new file mode 100644 index 00000000000..d64b41aa5a8 --- /dev/null +++ b/testData/ast/issues/file/kt-794-mixed.jav @@ -0,0 +1,11 @@ +package demo; + +class Test { + Integer getInteger(Integer i) { + return i; + } + + void test() { + int i = getInteger(10); + } +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-794-mixed.kt b/testData/ast/issues/file/kt-794-mixed.kt new file mode 100644 index 00000000000..5e6ec805f77 --- /dev/null +++ b/testData/ast/issues/file/kt-794-mixed.kt @@ -0,0 +1,9 @@ +namespace demo +open class Test() { +open fun getInteger(i : Int?) : Int? { +return i +} +open fun test() : Unit { +var i : Int = getInteger(10) +} +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-794.jav b/testData/ast/issues/file/kt-794.jav new file mode 100644 index 00000000000..5458bce32ca --- /dev/null +++ b/testData/ast/issues/file/kt-794.jav @@ -0,0 +1,6 @@ +class Test { + int getInt() { + byte b = 10; + return b; + } +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-794.kt b/testData/ast/issues/file/kt-794.kt new file mode 100644 index 00000000000..2cc75b06dc2 --- /dev/null +++ b/testData/ast/issues/file/kt-794.kt @@ -0,0 +1,6 @@ +open class Test() { +open fun getInt() : Int { +var b : Byte = 10 +return (b).int +} +} \ No newline at end of file From eca1f32a556733067a6493e2bd3183f7608d9f60 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 12 Dec 2011 14:09:10 +0400 Subject: [PATCH 164/206] KT-792 Support autoboxing primitive types (for constructor invocations) --- .../jet/j2k/ast/NewClassExpression.java | 19 +++-- .../jet/j2k/visitors/ExpressionVisitor.java | 78 ++++++++++--------- testData/ast/issues/file/kt-792-mixed.jav | 11 +++ testData/ast/issues/file/kt-792-mixed.kt | 7 ++ testData/ast/issues/file/kt-792.jav | 11 +++ testData/ast/issues/file/kt-792.kt | 7 ++ 6 files changed, 92 insertions(+), 41 deletions(-) create mode 100644 testData/ast/issues/file/kt-792-mixed.jav create mode 100644 testData/ast/issues/file/kt-792-mixed.kt create mode 100644 testData/ast/issues/file/kt-792.jav create mode 100644 testData/ast/issues/file/kt-792.kt diff --git a/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java b/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java index 30185d2bce7..87a5a512b27 100644 --- a/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java @@ -2,25 +2,32 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.j2k.util.AstUtil; + +import java.util.List; /** * @author ignatov */ public class NewClassExpression extends Expression { private final Element myName; - private final Element myArguments; + private final List myArguments; private Expression myQualifier; + private List myConversions; private AnonymousClass myAnonymousClass = null; - public NewClassExpression(Element name, Element arguments) { + public NewClassExpression(Element name, List arguments) { myName = name; myQualifier = EMPTY_EXPRESSION; myArguments = arguments; + myConversions = AstUtil.createListWithEmptyString(arguments); } - public NewClassExpression(Expression qualifier, Element name, Element arguments, @Nullable AnonymousClass anonymousClass) { + public NewClassExpression(@NotNull Expression qualifier, @NotNull Element name, @NotNull List arguments, + @NotNull List conversions, @Nullable AnonymousClass anonymousClass) { this(name, arguments); myQualifier = qualifier; + myConversions = conversions; myAnonymousClass = anonymousClass; } @@ -29,8 +36,10 @@ public class NewClassExpression extends Expression { public String toKotlin() { final String callOperator = myQualifier.isNullable() ? QUESTDOT : DOT; final String qualifier = myQualifier.isEmpty() ? EMPTY : myQualifier.toKotlin() + callOperator; + List applyConversions = AstUtil.applyConversions(AstUtil.nodesToKotlin(myArguments), myConversions); + String appliedArguments = AstUtil.join(applyConversions, COMMA_WITH_SPACE); return myAnonymousClass != null ? - "object" + SPACE + ":" + SPACE + qualifier + myName.toKotlin() + "(" + myArguments.toKotlin() + ")" + myAnonymousClass.toKotlin() : - qualifier + myName.toKotlin() + "(" + myArguments.toKotlin() + ")"; + "object" + SPACE + ":" + SPACE + qualifier + myName.toKotlin() + "(" + appliedArguments + ")" + myAnonymousClass.toKotlin() : + qualifier + myName.toKotlin() + "(" + appliedArguments + ")"; } } \ 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 73179a332c0..233e97f8c89 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -191,47 +191,52 @@ public class ExpressionVisitor extends StatementVisitor { public void visitMethodCallExpression(@NotNull PsiMethodCallExpression expression) { super.visitMethodCallExpression(expression); if (!SuperVisitor.isSuper(expression.getMethodExpression()) || !isInsidePrimaryConstructor(expression)) { - List conversions = new LinkedList(); - PsiExpression[] arguments = expression.getArgumentList().getExpressions(); - //noinspection UnusedDeclaration - for (final PsiExpression a : arguments) { - conversions.add(""); - } - - PsiMethod resolve = expression.resolveMethod(); - if (resolve != null) { - List expectedTypes = new LinkedList(); - List actualTypes = new LinkedList(); - - for (PsiParameter p : resolve.getParameterList().getParameters()) - expectedTypes.add(p.getType()); - - for (PsiExpression e : arguments) - actualTypes.add(e.getType()); - - assert actualTypes.size() == expectedTypes.size() : "The type list must have the same length"; - - for (int i = 0; i < actualTypes.size(); i++) { - PsiType actual = actualTypes.get(i); - PsiType expected = expectedTypes.get(i); - - if (isConversionNeeded(actual, expected)) { - conversions.set(i, getPrimitiveTypeConversion(expected.getCanonicalText())); - } - } - } - myResult = // TODO: not resolved new MethodCallExpression( expressionToExpression(expression.getMethodExpression()), - expressionsToExpressionList(arguments), - conversions, + expressionsToExpressionList(expression.getArgumentList().getExpressions()), + createConversions(expression), typeToType(expression.getType()).isNullable(), typesToTypeList(expression.getTypeArguments()) ); } } + @NotNull + private static List createConversions(@NotNull PsiCallExpression expression) { + List conversions = new LinkedList(); + PsiExpressionList argumentList = expression.getArgumentList(); + PsiExpression[] arguments = argumentList != null? argumentList.getExpressions() : new PsiExpression[]{}; + //noinspection UnusedDeclaration + for (final PsiExpression a : arguments) { + conversions.add(""); + } + + PsiMethod resolve = expression.resolveMethod(); + if (resolve != null) { + List expectedTypes = new LinkedList(); + List actualTypes = new LinkedList(); + + for (PsiParameter p : resolve.getParameterList().getParameters()) + expectedTypes.add(p.getType()); + + for (PsiExpression e : arguments) + actualTypes.add(e.getType()); + + assert actualTypes.size() == expectedTypes.size() : "The type list must have the same length"; + + for (int i = 0; i < actualTypes.size(); i++) { + PsiType actual = actualTypes.get(i); + PsiType expected = expectedTypes.get(i); + + if (isConversionNeeded(actual, expected)) { + conversions.set(i, getPrimitiveTypeConversion(expected.getCanonicalText())); + } + } + } + return conversions; + } + static boolean isConversionNeeded(@Nullable final PsiType actual,@Nullable final PsiType expected) { if (actual == null || expected == null) return false; @@ -299,23 +304,24 @@ public class ExpressionVisitor extends StatementVisitor { PsiJavaCodeReferenceElement classReference = expression.getClassOrAnonymousClassReference(); final boolean isNotConvertedClass = classReference != null && !Converter.getClassIdentifiers().contains(classReference.getQualifiedName()); PsiExpressionList argumentList = expression.getArgumentList(); + PsiExpression[] arguments = argumentList != null ? argumentList.getExpressions() : new PsiExpression[]{}; if (constructor == null || isConstructorPrimary(constructor) || isNotConvertedClass) { return new NewClassExpression( expressionToExpression(expression.getQualifier()), elementToElement(classReference), - elementToElement(argumentList), + expressionsToExpressionList(arguments), + createConversions(expression), anonymousClass != null ? anonymousClassToAnonymousClass(anonymousClass) : null ); } // is constructor secondary final PsiJavaCodeReferenceElement reference = expression.getClassReference(); final List typeParameters = reference != null ? typesToTypeList(reference.getTypeParameters()) : Collections.emptyList(); - PsiExpression[] expressions = argumentList != null ? argumentList.getExpressions() : new PsiExpression[]{}; return new CallChainExpression( new IdentifierImpl(constructor.getName(), false), new MethodCallExpression( new IdentifierImpl("init"), - expressionsToExpressionList(expressions), + expressionsToExpressionList(arguments), false, typeParameters)); } @@ -326,7 +332,7 @@ public class ExpressionVisitor extends StatementVisitor { callExpression.add(new IdentifierImpl("{null}")); // TODO: remove return new NewClassExpression( typeToType(expression.getType()), - new ExpressionList(callExpression) + callExpression ); } diff --git a/testData/ast/issues/file/kt-792-mixed.jav b/testData/ast/issues/file/kt-792-mixed.jav new file mode 100644 index 00000000000..95fdbca8c1c --- /dev/null +++ b/testData/ast/issues/file/kt-792-mixed.jav @@ -0,0 +1,11 @@ +package demo; + +class Test { + Test(Integer i) { + } + + void test() { + int i = 10; + new Test(i); + } +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-792-mixed.kt b/testData/ast/issues/file/kt-792-mixed.kt new file mode 100644 index 00000000000..69f9f3feb15 --- /dev/null +++ b/testData/ast/issues/file/kt-792-mixed.kt @@ -0,0 +1,7 @@ +namespace demo +open class Test(i : Int?) { +open fun test() : Unit { +var i : Int = 10 +Test(i) +} +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-792.jav b/testData/ast/issues/file/kt-792.jav new file mode 100644 index 00000000000..9c1d1cf00d9 --- /dev/null +++ b/testData/ast/issues/file/kt-792.jav @@ -0,0 +1,11 @@ +package demo; + +class Test { + Test(int i) { + } + + void test() { + byte b = 10; + new Test(b); + } +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-792.kt b/testData/ast/issues/file/kt-792.kt new file mode 100644 index 00000000000..cdba42971fc --- /dev/null +++ b/testData/ast/issues/file/kt-792.kt @@ -0,0 +1,7 @@ +namespace demo +open class Test(i : Int) { +open fun test() : Unit { +var b : Byte = 10 +Test((b).int) +} +} \ No newline at end of file From 886db2898f98e689eb185cdc27b94a3afd9fe1ce Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 12 Dec 2011 19:11:19 +0400 Subject: [PATCH 165/206] Makefile updated --- Makefile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 3b2e38e499f..b906e3b09f6 100644 --- a/Makefile +++ b/Makefile @@ -8,4 +8,7 @@ disable-sandbox: cd ~/.IdeaIC11/system/ && mv plugins-sandbox plugins-sandbox.tmp enable-sandbox: - cd ~/.IdeaIC11/system/ && rm -rf plugins-sandbox && mv plugins-sandbox.tmp ./plugins-sandbox \ No newline at end of file + cd ~/.IdeaIC11/system/ && rm -rf plugins-sandbox && mv plugins-sandbox.tmp ./plugins-sandbox + +release-patch: + cp ~/src/jet/.git/patches/master/j2k ~/src/jet-contrib/upstream-patches/ \ No newline at end of file From 3d8804a2469deac6b08a9db1ebe93978815891be Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 13 Dec 2011 13:42:10 +0400 Subject: [PATCH 166/206] also add "std.*" import --- src/org/jetbrains/jet/j2k/Converter.java | 1 + testData/ast/file/comp/intNullability.kt | 1 + 2 files changed, 2 insertions(+) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 8842561b6fd..2d714e28a7b 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -57,6 +57,7 @@ public class Converter { public static File fileToFileWithCompatibilityImport(@NotNull PsiJavaFile javaFile) { final PsiImportList importList = javaFile.getImportList(); List imports = importList == null ? Collections.emptyList() : importsToImportList(importList.getAllImportStatements()); + imports.add(new Import("std.*")); imports.add(new Import("std.compatibility.*")); return new File(quoteKeywords(javaFile.getPackageName()), imports, classesToClassList(javaFile.getClasses())); } diff --git a/testData/ast/file/comp/intNullability.kt b/testData/ast/file/comp/intNullability.kt index 2c1243c55f6..eb097e14e50 100644 --- a/testData/ast/file/comp/intNullability.kt +++ b/testData/ast/file/comp/intNullability.kt @@ -1,4 +1,5 @@ namespace demo +import std.* import std.compatibility.* open class Test() { open fun test() : Unit { From e6390dce8528274b2d5030cc9fbc7bbd8cd3c7ad Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 13 Dec 2011 15:03:55 +0400 Subject: [PATCH 167/206] KT-813 Convert arrays correctly --- .../jet/j2k/ast/ArrayInitializerExpression.java | 15 +++++++++++++-- src/org/jetbrains/jet/j2k/util/AstUtil.java | 4 ++++ .../jet/j2k/visitors/ExpressionVisitor.java | 1 + .../expression/newInt.kt | 2 +- .../expression/oneDim.jav | 1 - .../expression/oneDim.kt | 1 - .../expression/oneDimWithVariables.jav | 1 - .../expression/oneDimWithVariables.kt | 1 - .../expression/twoDim.jav | 1 - .../expression/twoDim.kt | 1 - .../statement/newByte.jav | 1 + .../statement/newByte.kt | 1 + .../statement/oneDim.jav | 1 + .../statement/oneDim.kt | 1 + .../statement/oneDimWithVariables.jav | 2 ++ .../statement/oneDimWithVariables.kt | 4 ++++ .../statement/twoDim.jav | 1 + .../statement/twoDim.kt | 1 + .../statement/arrayInitializationStatement.kt | 2 +- testData/ast/arrayType/statement/doubleArray.kt | 2 +- testData/ast/arrayType/statement/longArray.kt | 2 +- testData/ast/arrayType/statement/newIntArray.kt | 2 +- .../ast/arrayType/statement/newStringArray.kt | 2 +- .../classExpression/statement/complexExample.kt | 2 +- testData/ast/function/file/varVararg.kt | 2 +- 25 files changed, 38 insertions(+), 16 deletions(-) delete mode 100644 testData/ast/arrayInitializerExpression/expression/oneDim.jav delete mode 100644 testData/ast/arrayInitializerExpression/expression/oneDim.kt delete mode 100644 testData/ast/arrayInitializerExpression/expression/oneDimWithVariables.jav delete mode 100644 testData/ast/arrayInitializerExpression/expression/oneDimWithVariables.kt delete mode 100644 testData/ast/arrayInitializerExpression/expression/twoDim.jav delete mode 100644 testData/ast/arrayInitializerExpression/expression/twoDim.kt create mode 100644 testData/ast/arrayInitializerExpression/statement/newByte.jav create mode 100644 testData/ast/arrayInitializerExpression/statement/newByte.kt create mode 100644 testData/ast/arrayInitializerExpression/statement/oneDim.jav create mode 100644 testData/ast/arrayInitializerExpression/statement/oneDim.kt create mode 100644 testData/ast/arrayInitializerExpression/statement/oneDimWithVariables.jav create mode 100644 testData/ast/arrayInitializerExpression/statement/oneDimWithVariables.kt create mode 100644 testData/ast/arrayInitializerExpression/statement/twoDim.jav create mode 100644 testData/ast/arrayInitializerExpression/statement/twoDim.kt diff --git a/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java b/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java index 876dc90670f..f455e18d12f 100644 --- a/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java @@ -9,15 +9,26 @@ import java.util.List; * @author ignatov */ public class ArrayInitializerExpression extends Expression { + private Type myType; private final List myInitializers; - public ArrayInitializerExpression(List initializers) { + public ArrayInitializerExpression(final Type type, List initializers) { + myType = type; myInitializers = initializers; + + } + + @NotNull + private static String createArrayFunction(@NotNull final Type type) { + String sType = type.convertedToNotNull().toKotlin().replace("Array", "").toLowerCase(); + if (!sType.equals("any") && PRIMITIVE_TYPES.contains(sType)) + return sType + "Array"; + return AstUtil.lowerFirstCharacter(type.convertedToNotNull().toKotlin()); } @NotNull @Override public String toKotlin() { - return "array" + "(" + AstUtil.joinNodes(myInitializers, COMMA_WITH_SPACE) + ")"; + return createArrayFunction(myType) + "(" + AstUtil.joinNodes(myInitializers, COMMA_WITH_SPACE) + ")"; } } diff --git a/src/org/jetbrains/jet/j2k/util/AstUtil.java b/src/org/jetbrains/jet/j2k/util/AstUtil.java index 3c96203ab94..047c96ce8f9 100644 --- a/src/org/jetbrains/jet/j2k/util/AstUtil.java +++ b/src/org/jetbrains/jet/j2k/util/AstUtil.java @@ -48,6 +48,10 @@ public class AstUtil { return string.substring(0, 1).toUpperCase() + string.substring(1); } + public static String lowerFirstCharacter(String string) { + return string.substring(0, 1).toLowerCase() + string.substring(1); + } + public static List createListWithEmptyString(final List arguments) { final List conversions = new LinkedList(); //noinspection UnusedDeclaration diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 233e97f8c89..deffc512a96 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -42,6 +42,7 @@ public class ExpressionVisitor extends StatementVisitor { public void visitArrayInitializerExpression(PsiArrayInitializerExpression expression) { super.visitArrayInitializerExpression(expression); myResult = new ArrayInitializerExpression( + typeToType(expression.getType()), expressionsToExpressionList(expression.getInitializers()) ); } diff --git a/testData/ast/arrayInitializerExpression/expression/newInt.kt b/testData/ast/arrayInitializerExpression/expression/newInt.kt index 5bf3fb77d23..6cfae9942ea 100644 --- a/testData/ast/arrayInitializerExpression/expression/newInt.kt +++ b/testData/ast/arrayInitializerExpression/expression/newInt.kt @@ -1 +1 @@ -array(1, 2, 3) \ No newline at end of file +intArray(1, 2, 3) \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/expression/oneDim.jav b/testData/ast/arrayInitializerExpression/expression/oneDim.jav deleted file mode 100644 index bfea03892f9..00000000000 --- a/testData/ast/arrayInitializerExpression/expression/oneDim.jav +++ /dev/null @@ -1 +0,0 @@ -{1, 2, 3}; \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/expression/oneDim.kt b/testData/ast/arrayInitializerExpression/expression/oneDim.kt deleted file mode 100644 index 5bf3fb77d23..00000000000 --- a/testData/ast/arrayInitializerExpression/expression/oneDim.kt +++ /dev/null @@ -1 +0,0 @@ -array(1, 2, 3) \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/expression/oneDimWithVariables.jav b/testData/ast/arrayInitializerExpression/expression/oneDimWithVariables.jav deleted file mode 100644 index 6d0d48ea35d..00000000000 --- a/testData/ast/arrayInitializerExpression/expression/oneDimWithVariables.jav +++ /dev/null @@ -1 +0,0 @@ -{a, b, c}; \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/expression/oneDimWithVariables.kt b/testData/ast/arrayInitializerExpression/expression/oneDimWithVariables.kt deleted file mode 100644 index 61951103058..00000000000 --- a/testData/ast/arrayInitializerExpression/expression/oneDimWithVariables.kt +++ /dev/null @@ -1 +0,0 @@ -array(a, b, c) \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/expression/twoDim.jav b/testData/ast/arrayInitializerExpression/expression/twoDim.jav deleted file mode 100644 index 7892cebda83..00000000000 --- a/testData/ast/arrayInitializerExpression/expression/twoDim.jav +++ /dev/null @@ -1 +0,0 @@ -{ {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/expression/twoDim.kt b/testData/ast/arrayInitializerExpression/expression/twoDim.kt deleted file mode 100644 index 9474db259a3..00000000000 --- a/testData/ast/arrayInitializerExpression/expression/twoDim.kt +++ /dev/null @@ -1 +0,0 @@ -array(array(1, 2, 3), array(4, 5, 6), array(7, 8, 9)) \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/statement/newByte.jav b/testData/ast/arrayInitializerExpression/statement/newByte.jav new file mode 100644 index 00000000000..5a6e85cdfe1 --- /dev/null +++ b/testData/ast/arrayInitializerExpression/statement/newByte.jav @@ -0,0 +1 @@ +byte[] a = new byte[] {1, 2, 3}; \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/statement/newByte.kt b/testData/ast/arrayInitializerExpression/statement/newByte.kt new file mode 100644 index 00000000000..2f0ce90f341 --- /dev/null +++ b/testData/ast/arrayInitializerExpression/statement/newByte.kt @@ -0,0 +1 @@ +var a : ByteArray? = byteArray(1, 2, 3) \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/statement/oneDim.jav b/testData/ast/arrayInitializerExpression/statement/oneDim.jav new file mode 100644 index 00000000000..9e498af66a6 --- /dev/null +++ b/testData/ast/arrayInitializerExpression/statement/oneDim.jav @@ -0,0 +1 @@ +int[] a = {1, 2, 3}; \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/statement/oneDim.kt b/testData/ast/arrayInitializerExpression/statement/oneDim.kt new file mode 100644 index 00000000000..19b3af3f5c4 --- /dev/null +++ b/testData/ast/arrayInitializerExpression/statement/oneDim.kt @@ -0,0 +1 @@ +var a : IntArray? = intArray(1, 2, 3) \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/statement/oneDimWithVariables.jav b/testData/ast/arrayInitializerExpression/statement/oneDimWithVariables.jav new file mode 100644 index 00000000000..185a7d5aaf8 --- /dev/null +++ b/testData/ast/arrayInitializerExpression/statement/oneDimWithVariables.jav @@ -0,0 +1,2 @@ +int a = 0, b = 0, c = 0; +int is[] = {a, b, c}; \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/statement/oneDimWithVariables.kt b/testData/ast/arrayInitializerExpression/statement/oneDimWithVariables.kt new file mode 100644 index 00000000000..a1b91cfa3ab --- /dev/null +++ b/testData/ast/arrayInitializerExpression/statement/oneDimWithVariables.kt @@ -0,0 +1,4 @@ +var a : Int = 0 +var b : Int = 0 +var c : Int = 0 +var `is` : IntArray? = intArray(a, b, c) \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/statement/twoDim.jav b/testData/ast/arrayInitializerExpression/statement/twoDim.jav new file mode 100644 index 00000000000..f895393aad5 --- /dev/null +++ b/testData/ast/arrayInitializerExpression/statement/twoDim.jav @@ -0,0 +1 @@ +int[][] a = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/statement/twoDim.kt b/testData/ast/arrayInitializerExpression/statement/twoDim.kt new file mode 100644 index 00000000000..4ccc886bd71 --- /dev/null +++ b/testData/ast/arrayInitializerExpression/statement/twoDim.kt @@ -0,0 +1 @@ +var a : Array? = array(intArray(1, 2, 3), intArray(4, 5, 6), intArray(7, 8, 9)) \ No newline at end of file diff --git a/testData/ast/arrayType/statement/arrayInitializationStatement.kt b/testData/ast/arrayType/statement/arrayInitializationStatement.kt index 283e73ae8ae..146484f79d7 100644 --- a/testData/ast/arrayType/statement/arrayInitializationStatement.kt +++ b/testData/ast/arrayType/statement/arrayInitializationStatement.kt @@ -1 +1 @@ -var d2 : Array? = array() \ No newline at end of file +var d2 : Array? = array() \ No newline at end of file diff --git a/testData/ast/arrayType/statement/doubleArray.kt b/testData/ast/arrayType/statement/doubleArray.kt index 152845e23f9..c8147ce0a7f 100644 --- a/testData/ast/arrayType/statement/doubleArray.kt +++ b/testData/ast/arrayType/statement/doubleArray.kt @@ -1 +1 @@ -var a : DoubleArray? = array(1, 2, 3) \ No newline at end of file +var a : DoubleArray? = doubleArray(1, 2, 3) \ No newline at end of file diff --git a/testData/ast/arrayType/statement/longArray.kt b/testData/ast/arrayType/statement/longArray.kt index f4a9760f755..25e13c35f13 100644 --- a/testData/ast/arrayType/statement/longArray.kt +++ b/testData/ast/arrayType/statement/longArray.kt @@ -1 +1 @@ -var a : LongArray? = array(1, 2, 3) \ No newline at end of file +var a : LongArray? = longArray(1, 2, 3) \ No newline at end of file diff --git a/testData/ast/arrayType/statement/newIntArray.kt b/testData/ast/arrayType/statement/newIntArray.kt index 7b306f0e0fc..19b3af3f5c4 100644 --- a/testData/ast/arrayType/statement/newIntArray.kt +++ b/testData/ast/arrayType/statement/newIntArray.kt @@ -1 +1 @@ -var a : IntArray? = array(1, 2, 3) \ No newline at end of file +var a : IntArray? = intArray(1, 2, 3) \ No newline at end of file diff --git a/testData/ast/arrayType/statement/newStringArray.kt b/testData/ast/arrayType/statement/newStringArray.kt index 75bd5eaa610..8e2ed9e854c 100644 --- a/testData/ast/arrayType/statement/newStringArray.kt +++ b/testData/ast/arrayType/statement/newStringArray.kt @@ -1 +1 @@ -var a : Array? = array("abc") \ No newline at end of file +var a : Array? = array("abc") \ No newline at end of file diff --git a/testData/ast/classExpression/statement/complexExample.kt b/testData/ast/classExpression/statement/complexExample.kt index fcbc1c36ccd..d05f082bcc6 100644 --- a/testData/ast/classExpression/statement/complexExample.kt +++ b/testData/ast/classExpression/statement/complexExample.kt @@ -1 +1 @@ -var constrArgTypes : Array?>? = array(getJavaClass?>, getJavaClass) \ No newline at end of file +var constrArgTypes : Array?>? = array?>(getJavaClass?>, getJavaClass) \ No newline at end of file diff --git a/testData/ast/function/file/varVararg.kt b/testData/ast/function/file/varVararg.kt index ebd7393461c..a32417ad75b 100644 --- a/testData/ast/function/file/varVararg.kt +++ b/testData/ast/function/file/varVararg.kt @@ -1,6 +1,6 @@ namespace demo open class Test() { open fun test(vararg var args : Any?) : Unit { -args = array(1, 2, 3) +args = array(1, 2, 3) } } \ No newline at end of file From 440bd267249c538296bd70eadcc4ef94f68a06fe Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 13 Dec 2011 16:31:33 +0400 Subject: [PATCH 168/206] explicit conversion for arguments added in array function --- .../j2k/ast/ArrayInitializerExpression.java | 43 +++++++++++++++++-- src/org/jetbrains/jet/j2k/ast/INode.java | 2 +- .../jet/j2k/ast/LiteralExpression.java | 6 +++ src/org/jetbrains/jet/j2k/ast/Node.java | 1 + .../statement/doubleArray.jav | 1 + .../statement/doubleArray.kt | 1 + .../statement/doubleArrayWithVariables.jav | 2 + .../statement/doubleArrayWithVariables.kt | 4 ++ .../statement/floatArray.jav | 1 + .../statement/floatArray.kt | 1 + .../statement/javaLangDoubleArray.jav | 1 + .../statement/javaLangDoubleArray.kt | 1 + .../statement/javaLangFloatArray.jav | 1 + .../statement/javaLangFloatArray.kt | 1 + .../ast/arrayType/statement/doubleArray.jav | 1 - .../ast/arrayType/statement/doubleArray.kt | 1 - 16 files changed, 61 insertions(+), 7 deletions(-) create mode 100644 testData/ast/arrayInitializerExpression/statement/doubleArray.jav create mode 100644 testData/ast/arrayInitializerExpression/statement/doubleArray.kt create mode 100644 testData/ast/arrayInitializerExpression/statement/doubleArrayWithVariables.jav create mode 100644 testData/ast/arrayInitializerExpression/statement/doubleArrayWithVariables.kt create mode 100644 testData/ast/arrayInitializerExpression/statement/floatArray.jav create mode 100644 testData/ast/arrayInitializerExpression/statement/floatArray.kt create mode 100644 testData/ast/arrayInitializerExpression/statement/javaLangDoubleArray.jav create mode 100644 testData/ast/arrayInitializerExpression/statement/javaLangDoubleArray.kt create mode 100644 testData/ast/arrayInitializerExpression/statement/javaLangFloatArray.jav create mode 100644 testData/ast/arrayInitializerExpression/statement/javaLangFloatArray.kt delete mode 100644 testData/ast/arrayType/statement/doubleArray.jav delete mode 100644 testData/ast/arrayType/statement/doubleArray.kt diff --git a/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java b/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java index f455e18d12f..e3071dc87f1 100644 --- a/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java @@ -3,7 +3,7 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.j2k.util.AstUtil; -import java.util.List; +import java.util.*; /** * @author ignatov @@ -15,20 +15,55 @@ public class ArrayInitializerExpression extends Expression { public ArrayInitializerExpression(final Type type, List initializers) { myType = type; myInitializers = initializers; - } @NotNull private static String createArrayFunction(@NotNull final Type type) { - String sType = type.convertedToNotNull().toKotlin().replace("Array", "").toLowerCase(); + String sType = innerTypeStr(type); if (!sType.equals("any") && PRIMITIVE_TYPES.contains(sType)) return sType + "Array"; return AstUtil.lowerFirstCharacter(type.convertedToNotNull().toKotlin()); } + private static String innerTypeStr(final Type type) { + return type.convertedToNotNull().toKotlin().replace("Array", "").toLowerCase(); + } + + @NotNull + private static String createInitializers(@NotNull final Type type, @NotNull final List initializers) { + List arguments = new LinkedList(); + for (Expression i : initializers) + arguments.add(explicitConvertIfNeeded(type, i)); + return AstUtil.join(arguments, COMMA_WITH_SPACE); + } + + @NotNull + private static String explicitConvertIfNeeded(final Type type, @NotNull final Expression i) { + Set doubleOrFloatTypes = new HashSet( + Arrays.asList("double", "float", "java.lang.double", "java.lang.float") + ); + String afterReplace = innerTypeStr(type).replace(">", "").replace("<", "").replace("?", ""); + if (doubleOrFloatTypes.contains(afterReplace)) { + if (i.getKind() == Kind.LITERAL) { + if (i.toKotlin().contains(".")) + return i.toKotlin(); + return i.toKotlin() + DOT + ZERO; + } + return "(" + i.toKotlin() + ")" + getConversion(afterReplace); + } + return i.toKotlin(); + } + + @NotNull + private static String getConversion(@NotNull final String afterReplace) { + if (afterReplace.contains("double")) return DOT + "dbl"; + if (afterReplace.contains("float")) return DOT + "flt"; + return ""; + } + @NotNull @Override public String toKotlin() { - return createArrayFunction(myType) + "(" + AstUtil.joinNodes(myInitializers, COMMA_WITH_SPACE) + ")"; + return createArrayFunction(myType) + "(" + createInitializers(myType, myInitializers) + ")"; } } diff --git a/src/org/jetbrains/jet/j2k/ast/INode.java b/src/org/jetbrains/jet/j2k/ast/INode.java index f3ea8ba8471..d40f7b5080e 100644 --- a/src/org/jetbrains/jet/j2k/ast/INode.java +++ b/src/org/jetbrains/jet/j2k/ast/INode.java @@ -13,6 +13,6 @@ public interface INode { public Kind getKind(); public enum Kind { - UNDEFINED, TYPE, CONSTRUCTOR, BREAK, CONTINUE, VARARG, TRAIT, ASSIGNMENT_EXPRESSION, CALL_CHAIN, + UNDEFINED, TYPE, CONSTRUCTOR, BREAK, CONTINUE, VARARG, TRAIT, ASSIGNMENT_EXPRESSION, CALL_CHAIN, LITERAL, } } diff --git a/src/org/jetbrains/jet/j2k/ast/LiteralExpression.java b/src/org/jetbrains/jet/j2k/ast/LiteralExpression.java index 4737458e389..451f22757d0 100644 --- a/src/org/jetbrains/jet/j2k/ast/LiteralExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/LiteralExpression.java @@ -12,6 +12,12 @@ public class LiteralExpression extends Expression { myIdentifier = identifier; } + @NotNull + @Override + public Kind getKind() { + return Kind.LITERAL; + } + @NotNull @Override public String toKotlin() { diff --git a/src/org/jetbrains/jet/j2k/ast/Node.java b/src/org/jetbrains/jet/j2k/ast/Node.java index e29f53214c1..80a6b85b4a4 100644 --- a/src/org/jetbrains/jet/j2k/ast/Node.java +++ b/src/org/jetbrains/jet/j2k/ast/Node.java @@ -39,4 +39,5 @@ public abstract class Node implements INode { static final String QUEST = "?"; static final String COMMA_WITH_SPACE = "," + SPACE; static final String STAR = "*"; + public static final String ZERO = "0"; } \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/statement/doubleArray.jav b/testData/ast/arrayInitializerExpression/statement/doubleArray.jav new file mode 100644 index 00000000000..44f26cb4a79 --- /dev/null +++ b/testData/ast/arrayInitializerExpression/statement/doubleArray.jav @@ -0,0 +1 @@ +double[] a = new double[]{1.0, 2, 3} \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/statement/doubleArray.kt b/testData/ast/arrayInitializerExpression/statement/doubleArray.kt new file mode 100644 index 00000000000..c2d0ab03352 --- /dev/null +++ b/testData/ast/arrayInitializerExpression/statement/doubleArray.kt @@ -0,0 +1 @@ +var a : DoubleArray? = doubleArray(1.0, 2.0, 3.0) \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/statement/doubleArrayWithVariables.jav b/testData/ast/arrayInitializerExpression/statement/doubleArrayWithVariables.jav new file mode 100644 index 00000000000..58d0ca95d05 --- /dev/null +++ b/testData/ast/arrayInitializerExpression/statement/doubleArrayWithVariables.jav @@ -0,0 +1,2 @@ +double a = 0, b = 0, c = 0; +double ds[] = {a, b, c}; \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/statement/doubleArrayWithVariables.kt b/testData/ast/arrayInitializerExpression/statement/doubleArrayWithVariables.kt new file mode 100644 index 00000000000..3bbe02106ce --- /dev/null +++ b/testData/ast/arrayInitializerExpression/statement/doubleArrayWithVariables.kt @@ -0,0 +1,4 @@ +var a : Double = 0 +var b : Double = 0 +var c : Double = 0 +var ds : DoubleArray? = doubleArray((a).dbl, (b).dbl, (c).dbl) \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/statement/floatArray.jav b/testData/ast/arrayInitializerExpression/statement/floatArray.jav new file mode 100644 index 00000000000..36d2afa3425 --- /dev/null +++ b/testData/ast/arrayInitializerExpression/statement/floatArray.jav @@ -0,0 +1 @@ +float[] a = new float[]{1, 2, 3.0} \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/statement/floatArray.kt b/testData/ast/arrayInitializerExpression/statement/floatArray.kt new file mode 100644 index 00000000000..b824bd21e48 --- /dev/null +++ b/testData/ast/arrayInitializerExpression/statement/floatArray.kt @@ -0,0 +1 @@ +var a : FloatArray? = floatArray(1.0, 2.0, 3.0) \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/statement/javaLangDoubleArray.jav b/testData/ast/arrayInitializerExpression/statement/javaLangDoubleArray.jav new file mode 100644 index 00000000000..3ebd4af38bd --- /dev/null +++ b/testData/ast/arrayInitializerExpression/statement/javaLangDoubleArray.jav @@ -0,0 +1 @@ +java.lang.Double[] a = new java.lang.Double[]{1, 2, 3}; \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/statement/javaLangDoubleArray.kt b/testData/ast/arrayInitializerExpression/statement/javaLangDoubleArray.kt new file mode 100644 index 00000000000..c3a5bb91fd6 --- /dev/null +++ b/testData/ast/arrayInitializerExpression/statement/javaLangDoubleArray.kt @@ -0,0 +1 @@ +var a : Array? = array(1.0, 2.0, 3.0) \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/statement/javaLangFloatArray.jav b/testData/ast/arrayInitializerExpression/statement/javaLangFloatArray.jav new file mode 100644 index 00000000000..b53b4dc9aec --- /dev/null +++ b/testData/ast/arrayInitializerExpression/statement/javaLangFloatArray.jav @@ -0,0 +1 @@ +java.lang.Float[] a = new java.lang.Float[]{1, 2, 3}; \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/statement/javaLangFloatArray.kt b/testData/ast/arrayInitializerExpression/statement/javaLangFloatArray.kt new file mode 100644 index 00000000000..d31d26a7c74 --- /dev/null +++ b/testData/ast/arrayInitializerExpression/statement/javaLangFloatArray.kt @@ -0,0 +1 @@ +var a : Array? = array(1.0, 2.0, 3.0) \ No newline at end of file diff --git a/testData/ast/arrayType/statement/doubleArray.jav b/testData/ast/arrayType/statement/doubleArray.jav deleted file mode 100644 index ff57a8cb89d..00000000000 --- a/testData/ast/arrayType/statement/doubleArray.jav +++ /dev/null @@ -1 +0,0 @@ -double[] a = new double[]{1, 2, 3} \ No newline at end of file diff --git a/testData/ast/arrayType/statement/doubleArray.kt b/testData/ast/arrayType/statement/doubleArray.kt deleted file mode 100644 index c8147ce0a7f..00000000000 --- a/testData/ast/arrayType/statement/doubleArray.kt +++ /dev/null @@ -1 +0,0 @@ -var a : DoubleArray? = doubleArray(1, 2, 3) \ No newline at end of file From 1479baa86828229c7135df81e0140b525284a9f9 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 13 Dec 2011 17:02:52 +0400 Subject: [PATCH 169/206] infer nullity --- src/org/jetbrains/jet/j2k/Converter.java | 16 ++++--- .../j2k/ast/ArrayInitializerExpression.java | 5 ++- src/org/jetbrains/jet/j2k/ast/Block.java | 1 + .../jetbrains/jet/j2k/ast/CaseContainer.java | 2 +- src/org/jetbrains/jet/j2k/ast/Class.java | 13 +++++- .../jetbrains/jet/j2k/ast/Constructor.java | 2 + .../jet/j2k/ast/DeclarationStatement.java | 3 +- src/org/jetbrains/jet/j2k/ast/Element.java | 1 + .../jetbrains/jet/j2k/ast/EnumConstant.java | 2 +- src/org/jetbrains/jet/j2k/ast/Expression.java | 1 + src/org/jetbrains/jet/j2k/ast/Field.java | 1 + src/org/jetbrains/jet/j2k/ast/Function.java | 1 + src/org/jetbrains/jet/j2k/ast/Identifier.java | 3 ++ .../jetbrains/jet/j2k/ast/IdentifierImpl.java | 1 + src/org/jetbrains/jet/j2k/ast/Member.java | 3 ++ src/org/jetbrains/jet/j2k/ast/Modifier.java | 12 ++++++ .../jet/j2k/ast/NewClassExpression.java | 1 + src/org/jetbrains/jet/j2k/ast/Node.java | 17 ++++++++ .../jet/j2k/ast/ReferenceElement.java | 2 + src/org/jetbrains/jet/j2k/ast/Statement.java | 1 + src/org/jetbrains/jet/j2k/ast/Type.java | 2 + src/org/jetbrains/jet/j2k/util/AstUtil.java | 21 +++++---- .../jet/j2k/visitors/ClassVisitor.java | 4 +- .../jet/j2k/visitors/ElementVisitor.java | 14 +++--- .../jet/j2k/visitors/ExpressionVisitor.java | 43 ++++++++++--------- .../jet/j2k/visitors/StatementVisitor.java | 39 +++++++++-------- .../jet/j2k/visitors/SuperVisitor.java | 7 ++- .../jet/j2k/visitors/ThisVisitor.java | 4 +- .../jet/j2k/visitors/TypeVisitor.java | 10 ++--- .../jet/j2k/JavaToKotlinConverterTest.java | 6 ++- .../jetbrains/jet/j2k/TestCaseBuilder.java | 8 ++-- 31 files changed, 166 insertions(+), 80 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 2d714e28a7b..360c7cda192 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -18,6 +18,7 @@ import java.util.*; * @author ignatov */ public class Converter { + @NotNull private final static Set NOT_NULL_ANNOTATIONS = new HashSet() { { add("org.jetbrains.annotations.NotNull"); @@ -29,10 +30,11 @@ public class Converter { @NotNull private static final Dispatcher ourDispatcher = new Dispatcher(); @Nullable private static PsiType ourMethodReturnType = null; - public static void setClassIdentifiers(Set identifiers) { + public static void setClassIdentifiers(@NotNull Set identifiers) { ourClassIdentifiers = identifiers; } + @NotNull public static Set getClassIdentifiers() { return new HashSet(ourClassIdentifiers); } @@ -82,7 +84,8 @@ public class Converter { return new AnonymousClass(getMembers(anonymousClass)); } - private static List getMembers(PsiClass psiClass) { + @NotNull + private static List getMembers(@NotNull PsiClass psiClass) { List members = new LinkedList(); for (PsiElement e : psiClass.getChildren()) { if (e instanceof PsiMethod) members.add(methodToFunction((PsiMethod) e, true)); @@ -224,7 +227,7 @@ public class Converter { } @NotNull - private static Initializer initializerToInitializer(PsiClassInitializer i) { + private static Initializer initializerToInitializer(@NotNull PsiClassInitializer i) { return new Initializer( blockToBlock(i.getBody(), true), modifiersListToModifiersSet(i.getModifierList()) @@ -345,7 +348,7 @@ public class Converter { ); } - private static boolean isNotOpenMethod(final PsiMethod method) { + private static boolean isNotOpenMethod(@NotNull final PsiMethod method) { if (method.getParent() instanceof PsiClass) { final PsiModifierList parentModifierList = ((PsiClass) method.getParent()).getModifierList(); if ((parentModifierList != null && parentModifierList.hasExplicitModifier(Modifier.FINAL)) || ((PsiClass) method.getParent()).isEnum()) @@ -454,6 +457,7 @@ public class Converter { return result; } + @NotNull public static Type typeToType(PsiType type, boolean notNull) { Type result = typeToType(type); if (notNull) @@ -516,7 +520,7 @@ public class Converter { return false; } - private static boolean isReadOnly(PsiParameter parameter) { + private static boolean isReadOnly(@NotNull PsiParameter parameter) { for (PsiReference r : (ReferencesSearch.search(parameter))) { if (r instanceof PsiExpression && PsiUtil.isAccessedForWriting((PsiExpression) r)) { return false; @@ -532,7 +536,7 @@ public class Converter { } @NotNull - public static Set modifiersListToModifiersSet(PsiModifierList modifierList) { + public static Set modifiersListToModifiersSet(@Nullable PsiModifierList modifierList) { HashSet modifiersSet = new HashSet(); if (modifierList != null) { if (modifierList.hasExplicitModifier(PsiModifier.ABSTRACT)) modifiersSet.add(Modifier.ABSTRACT); diff --git a/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java b/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java index e3071dc87f1..a7ca9742535 100644 --- a/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java @@ -25,7 +25,8 @@ public class ArrayInitializerExpression extends Expression { return AstUtil.lowerFirstCharacter(type.convertedToNotNull().toKotlin()); } - private static String innerTypeStr(final Type type) { + @NotNull + private static String innerTypeStr(@NotNull final Type type) { return type.convertedToNotNull().toKotlin().replace("Array", "").toLowerCase(); } @@ -38,7 +39,7 @@ public class ArrayInitializerExpression extends Expression { } @NotNull - private static String explicitConvertIfNeeded(final Type type, @NotNull final Expression i) { + private static String explicitConvertIfNeeded(@NotNull final Type type, @NotNull final Expression i) { Set doubleOrFloatTypes = new HashSet( Arrays.asList("double", "float", "java.lang.double", "java.lang.float") ); diff --git a/src/org/jetbrains/jet/j2k/ast/Block.java b/src/org/jetbrains/jet/j2k/ast/Block.java index 8d185070527..3e22f8fb775 100644 --- a/src/org/jetbrains/jet/j2k/ast/Block.java +++ b/src/org/jetbrains/jet/j2k/ast/Block.java @@ -10,6 +10,7 @@ import java.util.List; * @author ignatov */ public class Block extends Statement { + @NotNull public final static Block EMPTY_BLOCK = new Block(); private List myStatements; diff --git a/src/org/jetbrains/jet/j2k/ast/CaseContainer.java b/src/org/jetbrains/jet/j2k/ast/CaseContainer.java index ceef2f43ce9..bd2f65ddc1a 100644 --- a/src/org/jetbrains/jet/j2k/ast/CaseContainer.java +++ b/src/org/jetbrains/jet/j2k/ast/CaseContainer.java @@ -13,7 +13,7 @@ public class CaseContainer extends Statement { private List myCaseStatement; private Block myBlock; - public CaseContainer(final List caseStatement, final List statements) { + public CaseContainer(final List caseStatement, @NotNull final List statements) { myCaseStatement = caseStatement; List newStatements = new LinkedList(); for (Statement s : statements) diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java index 98c6680998f..c00c63a32e3 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -15,6 +15,7 @@ import static org.jetbrains.jet.j2k.util.AstUtil.*; * @author ignatov */ public class Class extends Member { + @NotNull String TYPE = "class"; final Identifier myName; private final List myBaseClassParams; @@ -65,6 +66,7 @@ public class Class extends Member { return false; } + @NotNull String typeParameterWhereToKotlin() { if (hasWhere()) { List wheres = new LinkedList(); @@ -118,6 +120,7 @@ public class Class extends Member { return result; } + @NotNull String typeParametersToKotlin() { return myTypeParameters.size() > 0 ? "<" + AstUtil.joinNodes(myTypeParameters, COMMA_WITH_SPACE) + ">" : EMPTY; } @@ -131,6 +134,7 @@ public class Class extends Member { return nodesToKotlin(myExtendsTypes); } + @NotNull String implementTypesToKotlin() { List allTypes = new LinkedList() { { @@ -141,6 +145,7 @@ public class Class extends Member { return allTypes.size() == 0 ? EMPTY : SPACE + COLON + SPACE + join(allTypes, COMMA_WITH_SPACE); } + @NotNull String modifiersToKotlin() { List modifierList = new LinkedList(); @@ -166,6 +171,7 @@ public class Class extends Member { return isAbstract(); } + @NotNull String bodyToKotlin() { return SPACE + "{" + N + primaryConstructorBodyToKotlin() + N + @@ -174,7 +180,8 @@ public class Class extends Member { "}"; } - private static List getStatic(List members) { + @NotNull + private static List getStatic(@NotNull List members) { List result = new LinkedList(); for (Member m : members) if (m.isStatic()) @@ -182,7 +189,8 @@ public class Class extends Member { return result; } - private static List getNonStatic(List members) { + @NotNull + private static List getNonStatic(@NotNull List members) { List result = new LinkedList(); for (Member m : members) if (!m.isStatic()) @@ -190,6 +198,7 @@ public class Class extends Member { return result; } + @NotNull private String classObjectToKotlin() { final List staticMembers = new LinkedList(secondaryConstructorsAsStaticInitFunction()); staticMembers.addAll(getStatic(membersExceptConstructors())); diff --git a/src/org/jetbrains/jet/j2k/ast/Constructor.java b/src/org/jetbrains/jet/j2k/ast/Constructor.java index 9fe6b498696..758928b7295 100644 --- a/src/org/jetbrains/jet/j2k/ast/Constructor.java +++ b/src/org/jetbrains/jet/j2k/ast/Constructor.java @@ -16,10 +16,12 @@ public class Constructor extends Function { myIsPrimary = isPrimary; } + @NotNull public String primarySignatureToKotlin() { return "(" + myParams.toKotlin() + ")"; } + @NotNull public String primaryBodyToKotlin() { return myBlock.toKotlin(); } diff --git a/src/org/jetbrains/jet/j2k/ast/DeclarationStatement.java b/src/org/jetbrains/jet/j2k/ast/DeclarationStatement.java index 756153ac13d..d9bbcb5f7d8 100644 --- a/src/org/jetbrains/jet/j2k/ast/DeclarationStatement.java +++ b/src/org/jetbrains/jet/j2k/ast/DeclarationStatement.java @@ -16,7 +16,8 @@ public class DeclarationStatement extends Statement { myElements = elements; } - private static List toStringList(List elements) { + @NotNull + private static List toStringList(@NotNull List elements) { List result = new LinkedList(); for (Element e : elements) { if (e instanceof LocalVariable) { diff --git a/src/org/jetbrains/jet/j2k/ast/Element.java b/src/org/jetbrains/jet/j2k/ast/Element.java index 16683fbdca3..56bf2c4daa5 100644 --- a/src/org/jetbrains/jet/j2k/ast/Element.java +++ b/src/org/jetbrains/jet/j2k/ast/Element.java @@ -6,6 +6,7 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public abstract class Element extends Node { + @NotNull public static final Element EMPTY_ELEMENT = new EmptyElement(); public boolean isEmpty() { diff --git a/src/org/jetbrains/jet/j2k/ast/EnumConstant.java b/src/org/jetbrains/jet/j2k/ast/EnumConstant.java index d83b2e5c85b..d80ffd3b1eb 100644 --- a/src/org/jetbrains/jet/j2k/ast/EnumConstant.java +++ b/src/org/jetbrains/jet/j2k/ast/EnumConstant.java @@ -8,7 +8,7 @@ import java.util.Set; * @author ignatov */ public class EnumConstant extends Field { - public EnumConstant(Identifier identifier, Set modifiers, Type type, Element params) { + public EnumConstant(Identifier identifier, Set modifiers, @NotNull Type type, Element params) { super(identifier, modifiers, type.convertedToNotNull(), params); } diff --git a/src/org/jetbrains/jet/j2k/ast/Expression.java b/src/org/jetbrains/jet/j2k/ast/Expression.java index 7b2528b6232..d3a98436c8b 100644 --- a/src/org/jetbrains/jet/j2k/ast/Expression.java +++ b/src/org/jetbrains/jet/j2k/ast/Expression.java @@ -6,6 +6,7 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public abstract class Expression extends Statement { + @NotNull public static final Expression EMPTY_EXPRESSION = new EmptyExpression(); /** diff --git a/src/org/jetbrains/jet/j2k/ast/Field.java b/src/org/jetbrains/jet/j2k/ast/Field.java index 94fa1596b56..8c2bbde5b94 100644 --- a/src/org/jetbrains/jet/j2k/ast/Field.java +++ b/src/org/jetbrains/jet/j2k/ast/Field.java @@ -36,6 +36,7 @@ public class Field extends Member { return myType; } + @NotNull String modifiersToKotlin() { List modifierList = new LinkedList(); diff --git a/src/org/jetbrains/jet/j2k/ast/Function.java b/src/org/jetbrains/jet/j2k/ast/Function.java index 36545c0948b..91c1b9132a4 100644 --- a/src/org/jetbrains/jet/j2k/ast/Function.java +++ b/src/org/jetbrains/jet/j2k/ast/Function.java @@ -44,6 +44,7 @@ public class Function extends Member { return myBlock; } + @NotNull private String typeParametersToKotlin() { return myTypeParameters.size() > 0 ? "<" + AstUtil.joinNodes(myTypeParameters, COMMA_WITH_SPACE) + ">" : EMPTY; } diff --git a/src/org/jetbrains/jet/j2k/ast/Identifier.java b/src/org/jetbrains/jet/j2k/ast/Identifier.java index 85b5ae1332f..e1b095fb240 100644 --- a/src/org/jetbrains/jet/j2k/ast/Identifier.java +++ b/src/org/jetbrains/jet/j2k/ast/Identifier.java @@ -1,9 +1,12 @@ package org.jetbrains.jet.j2k.ast; +import org.jetbrains.annotations.NotNull; + /** * @author ignatov */ public interface Identifier extends INode { + @NotNull public static Identifier EMPTY_IDENTIFIER = new IdentifierImpl(""); public boolean isEmpty(); diff --git a/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java b/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java index 98e94522b1d..8d01bcdf8a7 100644 --- a/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java +++ b/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java @@ -36,6 +36,7 @@ public class IdentifierImpl extends Expression implements Identifier { return myName.length() == 0; } + @NotNull private static String quote(String str) { return BACKTICK + str + BACKTICK; } diff --git a/src/org/jetbrains/jet/j2k/ast/Member.java b/src/org/jetbrains/jet/j2k/ast/Member.java index e0fff02e4c3..ade895c672c 100644 --- a/src/org/jetbrains/jet/j2k/ast/Member.java +++ b/src/org/jetbrains/jet/j2k/ast/Member.java @@ -1,5 +1,7 @@ package org.jetbrains.jet.j2k.ast; +import org.jetbrains.annotations.NotNull; + import java.util.Set; /** @@ -8,6 +10,7 @@ import java.util.Set; public abstract class Member extends Node implements IMember { Set myModifiers; + @NotNull String accessModifier() { for (String m : myModifiers) if (m.equals(Modifier.PUBLIC) || m.equals(Modifier.PROTECTED) || m.equals(Modifier.PRIVATE)) diff --git a/src/org/jetbrains/jet/j2k/ast/Modifier.java b/src/org/jetbrains/jet/j2k/ast/Modifier.java index 92920946ae2..8329fcbc02a 100644 --- a/src/org/jetbrains/jet/j2k/ast/Modifier.java +++ b/src/org/jetbrains/jet/j2k/ast/Modifier.java @@ -1,17 +1,29 @@ package org.jetbrains.jet.j2k.ast; +import org.jetbrains.annotations.NotNull; + /** * @author ignatov */ public abstract class Modifier { + @NotNull public static final String PUBLIC = "public"; + @NotNull public static final String PROTECTED = "protected"; + @NotNull public static final String PRIVATE = "private"; + @NotNull public static final String INTERNAL = "internal"; + @NotNull public static final String STATIC = "static"; + @NotNull public static final String ABSTRACT = "abstract"; + @NotNull public static final String FINAL = "final"; + @NotNull public static final String OPEN = "open"; + @NotNull public static final String NOT_OPEN = "not open"; + @NotNull public static final String OVERRIDE = "override"; } diff --git a/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java b/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java index 87a5a512b27..24389f2401a 100644 --- a/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java @@ -14,6 +14,7 @@ public class NewClassExpression extends Expression { private final List myArguments; private Expression myQualifier; private List myConversions; + @Nullable private AnonymousClass myAnonymousClass = null; public NewClassExpression(Element name, List arguments) { diff --git a/src/org/jetbrains/jet/j2k/ast/Node.java b/src/org/jetbrains/jet/j2k/ast/Node.java index 80a6b85b4a4..3d3b934e603 100644 --- a/src/org/jetbrains/jet/j2k/ast/Node.java +++ b/src/org/jetbrains/jet/j2k/ast/Node.java @@ -16,28 +16,45 @@ public abstract class Node implements INode { return Kind.UNDEFINED; } + @NotNull final static Set ONLY_KOTLIN_KEYWORDS = new HashSet(Arrays.asList( "namespace", "as", "type", "val", "var", "fun", "is", "in", "object", "when", "trait", "This" )); + @NotNull public final static Set PRIMITIVE_TYPES = new HashSet(Arrays.asList( "double", "float", "long", "int", "short", "byte", "boolean", "char" )); static final String N = System.getProperty("line.separator"); + @NotNull static final String N2 = N + N; + @NotNull static final String SPACE = " "; + @NotNull static final String EQUAL = "="; + @NotNull static final String EMPTY = ""; + @NotNull static final String DOT = "."; + @NotNull static final String QUESTDOT = "?."; + @NotNull static final String COLON = ":"; + @NotNull static final String IN = "in"; + @NotNull static final String AT = "@"; + @NotNull static final String DOLLAR = "$"; + @NotNull static final String BACKTICK = "`"; + @NotNull static final String QUEST = "?"; + @NotNull static final String COMMA_WITH_SPACE = "," + SPACE; + @NotNull static final String STAR = "*"; + @NotNull public static final String ZERO = "0"; } \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/ast/ReferenceElement.java b/src/org/jetbrains/jet/j2k/ast/ReferenceElement.java index c557edf4065..4be89b2db69 100644 --- a/src/org/jetbrains/jet/j2k/ast/ReferenceElement.java +++ b/src/org/jetbrains/jet/j2k/ast/ReferenceElement.java @@ -9,7 +9,9 @@ import java.util.List; * @author ignatov */ public class ReferenceElement extends Element { + @NotNull private final Identifier myReference; + @NotNull private final List myTypes; public ReferenceElement(@NotNull Identifier reference, @NotNull List types) { diff --git a/src/org/jetbrains/jet/j2k/ast/Statement.java b/src/org/jetbrains/jet/j2k/ast/Statement.java index 1be7eaf810b..b96d026c086 100644 --- a/src/org/jetbrains/jet/j2k/ast/Statement.java +++ b/src/org/jetbrains/jet/j2k/ast/Statement.java @@ -6,6 +6,7 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public abstract class Statement extends Element { + @NotNull public static final Statement EMPTY_STATEMENT = new EmptyStatement(); /** diff --git a/src/org/jetbrains/jet/j2k/ast/Type.java b/src/org/jetbrains/jet/j2k/ast/Type.java index 901a7b52fd5..d0182cbb633 100644 --- a/src/org/jetbrains/jet/j2k/ast/Type.java +++ b/src/org/jetbrains/jet/j2k/ast/Type.java @@ -6,6 +6,7 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public abstract class Type extends Element { + @NotNull public static final Type EMPTY_TYPE = new EmptyType(); boolean myNullable = true; @@ -15,6 +16,7 @@ public abstract class Type extends Element { return Kind.TYPE; } + @NotNull public Type convertedToNotNull() { myNullable = false; return this; diff --git a/src/org/jetbrains/jet/j2k/util/AstUtil.java b/src/org/jetbrains/jet/j2k/util/AstUtil.java index 047c96ce8f9..21c991ad932 100644 --- a/src/org/jetbrains/jet/j2k/util/AstUtil.java +++ b/src/org/jetbrains/jet/j2k/util/AstUtil.java @@ -1,6 +1,7 @@ package org.jetbrains.jet.j2k.util; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.j2k.ast.Expression; import org.jetbrains.jet.j2k.ast.INode; @@ -15,7 +16,7 @@ public class AstUtil { private AstUtil() { } - private static String join(final String[] array, final String delimiter) { + private static String join(@NotNull final String[] array, @Nullable final String delimiter) { StringBuilder buffer = new StringBuilder(); boolean haveDelimiter = (delimiter != null); @@ -29,30 +30,34 @@ public class AstUtil { return buffer.toString(); } - public static String joinNodes(final List nodes, final String delimiter) { + public static String joinNodes(@NotNull final List nodes, final String delimiter) { return join(nodesToKotlin(nodes), delimiter); } - public static String join(final List array, final String delimiter) { + public static String join(@NotNull final List array, final String delimiter) { return join(array.toArray(new String[array.size()]), delimiter); } - public static List nodesToKotlin(List nodes) { + @NotNull + public static List nodesToKotlin(@NotNull List nodes) { List result = new LinkedList(); for (INode n : nodes) result.add(n.toKotlin()); return result; } - public static String upperFirstCharacter(String string) { + @NotNull + public static String upperFirstCharacter(@NotNull String string) { return string.substring(0, 1).toUpperCase() + string.substring(1); } - public static String lowerFirstCharacter(String string) { + @NotNull + public static String lowerFirstCharacter(@NotNull String string) { return string.substring(0, 1).toLowerCase() + string.substring(1); } - public static List createListWithEmptyString(final List arguments) { + @NotNull + public static List createListWithEmptyString(@NotNull final List arguments) { final List conversions = new LinkedList(); //noinspection UnusedDeclaration for (Expression argument : arguments) conversions.add(""); @@ -77,7 +82,7 @@ public class AstUtil { return "(" + f + ")" + s; } - public static T getOrElse(Map map, T e, T orElse) { + public static T getOrElse(@NotNull Map map, T e, T orElse) { if (map.containsKey(e)) return map.get(e); return orElse; diff --git a/src/org/jetbrains/jet/j2k/visitors/ClassVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ClassVisitor.java index 8cafaf36719..edd75c6e790 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ClassVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ClassVisitor.java @@ -2,6 +2,7 @@ package org.jetbrains.jet.j2k.visitors; import com.intellij.psi.JavaRecursiveElementVisitor; import com.intellij.psi.PsiClass; +import org.jetbrains.annotations.NotNull; import java.util.HashSet; import java.util.Set; @@ -16,12 +17,13 @@ public class ClassVisitor extends JavaRecursiveElementVisitor { myClassIdentifiers = new HashSet(); } + @NotNull public Set getClassIdentifiers() { return new HashSet(myClassIdentifiers); } @Override - public void visitClass(PsiClass aClass) { + public void visitClass(@NotNull PsiClass aClass) { myClassIdentifiers.add(aClass.getQualifiedName()); super.visitClass(aClass); } diff --git a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java index f18a5f03d43..4a39cf57ca5 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java @@ -2,6 +2,7 @@ package org.jetbrains.jet.j2k.visitors; import com.intellij.psi.*; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.j2k.Converter; import org.jetbrains.jet.j2k.ast.*; @@ -13,6 +14,7 @@ import static org.jetbrains.jet.j2k.Converter.*; * @author ignatov */ public class ElementVisitor extends JavaElementVisitor { + @Nullable private Element myResult = Element.EMPTY_ELEMENT; @NotNull @@ -21,7 +23,7 @@ public class ElementVisitor extends JavaElementVisitor { } @Override - public void visitLocalVariable(PsiLocalVariable variable) { + public void visitLocalVariable(@NotNull PsiLocalVariable variable) { super.visitLocalVariable(variable); myResult = new LocalVariable( @@ -33,7 +35,7 @@ public class ElementVisitor extends JavaElementVisitor { } @Override - public void visitExpressionList(PsiExpressionList list) { + public void visitExpressionList(@NotNull PsiExpressionList list) { super.visitExpressionList(list); myResult = new ExpressionList( expressionsToExpressionList(list.getExpressions()), @@ -42,7 +44,7 @@ public class ElementVisitor extends JavaElementVisitor { } @Override - public void visitReferenceElement(PsiJavaCodeReferenceElement reference) { + public void visitReferenceElement(@NotNull PsiJavaCodeReferenceElement reference) { super.visitReferenceElement(reference); final List types = typesToTypeList(reference.getTypeParameters()); @@ -67,13 +69,13 @@ public class ElementVisitor extends JavaElementVisitor { } @Override - public void visitTypeElement(PsiTypeElement type) { + public void visitTypeElement(@NotNull PsiTypeElement type) { super.visitTypeElement(type); myResult = new TypeElement(typeToType(type.getType())); } @Override - public void visitTypeParameter(PsiTypeParameter classParameter) { + public void visitTypeParameter(@NotNull PsiTypeParameter classParameter) { super.visitTypeParameter(classParameter); myResult = new TypeParameter( new IdentifierImpl(classParameter.getName()), // TODO @@ -82,7 +84,7 @@ public class ElementVisitor extends JavaElementVisitor { } @Override - public void visitParameterList(PsiParameterList list) { + public void visitParameterList(@NotNull PsiParameterList list) { super.visitParameterList(list); myResult = new ParameterList( parametersToParameterList(list.getParameters()) diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index deffc512a96..3cd110aa04c 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -16,6 +16,7 @@ import static org.jetbrains.jet.j2k.Converter.*; * @author ignatov */ public class ExpressionVisitor extends StatementVisitor { + @Nullable Expression myResult = Expression.EMPTY_EXPRESSION; @Override @@ -30,7 +31,7 @@ public class ExpressionVisitor extends StatementVisitor { } @Override - public void visitArrayAccessExpression(PsiArrayAccessExpression expression) { + public void visitArrayAccessExpression(@NotNull PsiArrayAccessExpression expression) { super.visitArrayAccessExpression(expression); myResult = new ArrayAccessExpression( expressionToExpression(expression.getArrayExpression()), @@ -39,7 +40,7 @@ public class ExpressionVisitor extends StatementVisitor { } @Override - public void visitArrayInitializerExpression(PsiArrayInitializerExpression expression) { + public void visitArrayInitializerExpression(@NotNull PsiArrayInitializerExpression expression) { super.visitArrayInitializerExpression(expression); myResult = new ArrayInitializerExpression( typeToType(expression.getType()), @@ -48,7 +49,7 @@ public class ExpressionVisitor extends StatementVisitor { } @Override - public void visitAssignmentExpression(PsiAssignmentExpression expression) { + public void visitAssignmentExpression(@NotNull PsiAssignmentExpression expression) { super.visitAssignmentExpression(expression); // TODO: simplify @@ -111,7 +112,7 @@ public class ExpressionVisitor extends StatementVisitor { } @Override - public void visitBinaryExpression(PsiBinaryExpression expression) { + public void visitBinaryExpression(@NotNull PsiBinaryExpression expression) { super.visitBinaryExpression(expression); if (expression.getOperationSign().getTokenType() == JavaTokenType.GTGTGT) @@ -129,13 +130,13 @@ public class ExpressionVisitor extends StatementVisitor { } @Override - public void visitClassObjectAccessExpression(PsiClassObjectAccessExpression expression) { + public void visitClassObjectAccessExpression(@NotNull PsiClassObjectAccessExpression expression) { super.visitClassObjectAccessExpression(expression); myResult = new ClassObjectAccessExpression(elementToElement(expression.getOperand())); } @Override - public void visitConditionalExpression(PsiConditionalExpression expression) { + public void visitConditionalExpression(@NotNull PsiConditionalExpression expression) { super.visitConditionalExpression(expression); myResult = new ParenthesizedExpression( new IfStatement( @@ -147,13 +148,13 @@ public class ExpressionVisitor extends StatementVisitor { } @Override - public void visitExpressionList(PsiExpressionList list) { + public void visitExpressionList(@NotNull PsiExpressionList list) { super.visitExpressionList(list); myResult = new ExpressionList(expressionsToExpressionList(list.getExpressions())); } @Override - public void visitInstanceOfExpression(PsiInstanceOfExpression expression) { + public void visitInstanceOfExpression(@NotNull PsiInstanceOfExpression expression) { super.visitInstanceOfExpression(expression); myResult = new IsOperator( expressionToExpression(expression.getOperand()), @@ -161,7 +162,7 @@ public class ExpressionVisitor extends StatementVisitor { } @Override - public void visitLiteralExpression(PsiLiteralExpression expression) { + public void visitLiteralExpression(@NotNull PsiLiteralExpression expression) { super.visitLiteralExpression(expression); final Object value = expression.getValue(); @@ -286,7 +287,7 @@ public class ExpressionVisitor extends StatementVisitor { } @Override - public void visitNewExpression(PsiNewExpression expression) { + public void visitNewExpression(@NotNull PsiNewExpression expression) { super.visitNewExpression(expression); if (expression.getArrayInitializer() != null) // new Foo[] {} @@ -343,7 +344,7 @@ public class ExpressionVisitor extends StatementVisitor { } @Override - public void visitParenthesizedExpression(PsiParenthesizedExpression expression) { + public void visitParenthesizedExpression(@NotNull PsiParenthesizedExpression expression) { super.visitParenthesizedExpression(expression); myResult = new ParenthesizedExpression( expressionToExpression(expression.getExpression()) @@ -351,7 +352,7 @@ public class ExpressionVisitor extends StatementVisitor { } @Override - public void visitPostfixExpression(PsiPostfixExpression expression) { + public void visitPostfixExpression(@NotNull PsiPostfixExpression expression) { super.visitPostfixExpression(expression); myResult = new PostfixOperator( getOperatorString(expression.getOperationSign().getTokenType()), @@ -360,7 +361,7 @@ public class ExpressionVisitor extends StatementVisitor { } @Override - public void visitPrefixExpression(PsiPrefixExpression expression) { + public void visitPrefixExpression(@NotNull PsiPrefixExpression expression) { super.visitPrefixExpression(expression); if (expression.getOperationTokenType() == JavaTokenType.TILDE) myResult = new DummyMethodCallExpression( @@ -374,7 +375,7 @@ public class ExpressionVisitor extends StatementVisitor { } @Override - public void visitReferenceExpression(PsiReferenceExpression expression) { + public void visitReferenceExpression(@NotNull PsiReferenceExpression expression) { super.visitReferenceExpression(expression); final boolean isFieldReference = isFieldReference(expression, getContainingClass(expression)); @@ -448,7 +449,7 @@ public class ExpressionVisitor extends StatementVisitor { return false; } - private static boolean isInsideSecondaryConstructor(PsiReferenceExpression expression) { + private static boolean isInsideSecondaryConstructor(@NotNull PsiReferenceExpression expression) { PsiElement context = expression.getContext(); while (context != null) { if (context instanceof PsiMethod && ((PsiMethod) context).isConstructor()) @@ -458,7 +459,7 @@ public class ExpressionVisitor extends StatementVisitor { return false; } - private static boolean isInsidePrimaryConstructor(PsiExpression expression) { + private static boolean isInsidePrimaryConstructor(@NotNull PsiExpression expression) { PsiElement context = expression.getContext(); while (context != null) { if (context instanceof PsiMethod && ((PsiMethod) context).isConstructor()) @@ -479,7 +480,7 @@ public class ExpressionVisitor extends StatementVisitor { return null; } - private static boolean isThisExpression(PsiReferenceExpression expression) { + private static boolean isThisExpression(@NotNull PsiReferenceExpression expression) { for (PsiReference r : expression.getReferences()) if (r.getCanonicalText().equals("this")) { final PsiElement res = r.resolve(); @@ -490,7 +491,7 @@ public class ExpressionVisitor extends StatementVisitor { } @Override - public void visitSuperExpression(PsiSuperExpression expression) { + public void visitSuperExpression(@NotNull PsiSuperExpression expression) { super.visitSuperExpression(expression); final PsiJavaCodeReferenceElement qualifier = expression.getQualifier(); myResult = new SuperExpression( @@ -501,7 +502,7 @@ public class ExpressionVisitor extends StatementVisitor { } @Override - public void visitThisExpression(PsiThisExpression expression) { + public void visitThisExpression(@NotNull PsiThisExpression expression) { super.visitThisExpression(expression); final PsiJavaCodeReferenceElement qualifier = expression.getQualifier(); myResult = new ThisExpression( @@ -512,7 +513,7 @@ public class ExpressionVisitor extends StatementVisitor { } @Override - public void visitTypeCastExpression(PsiTypeCastExpression expression) { + public void visitTypeCastExpression(@NotNull PsiTypeCastExpression expression) { super.visitTypeCastExpression(expression); final PsiTypeElement castType = expression.getCastType(); @@ -525,7 +526,7 @@ public class ExpressionVisitor extends StatementVisitor { } @Override - public void visitPolyadicExpression(PsiPolyadicExpression expression) { + public void visitPolyadicExpression(@NotNull PsiPolyadicExpression expression) { super.visitPolyadicExpression(expression); myResult = new PolyadicExpression( expressionsToExpressionList(expression.getOperands()), diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index d97185146e8..07b4689822c 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -31,7 +31,7 @@ public class StatementVisitor extends ElementVisitor { } @Override - public void visitAssertStatement(PsiAssertStatement statement) { + public void visitAssertStatement(@NotNull PsiAssertStatement statement) { super.visitAssertStatement(statement); myResult = new AssertStatement( expressionToExpression(statement.getAssertCondition()), @@ -40,7 +40,7 @@ public class StatementVisitor extends ElementVisitor { } @Override - public void visitBlockStatement(PsiBlockStatement statement) { + public void visitBlockStatement(@NotNull PsiBlockStatement statement) { super.visitBlockStatement(statement); myResult = new Block( statementsToStatementList(statement.getCodeBlock().getStatements()), @@ -49,7 +49,7 @@ public class StatementVisitor extends ElementVisitor { } @Override - public void visitBreakStatement(PsiBreakStatement statement) { + public void visitBreakStatement(@NotNull PsiBreakStatement statement) { super.visitBreakStatement(statement); if (statement.getLabelIdentifier() == null) myResult = new BreakStatement(); @@ -60,7 +60,7 @@ public class StatementVisitor extends ElementVisitor { } @Override - public void visitContinueStatement(PsiContinueStatement statement) { + public void visitContinueStatement(@NotNull PsiContinueStatement statement) { super.visitContinueStatement(statement); if (statement.getLabelIdentifier() == null) myResult = new ContinueStatement(); @@ -71,7 +71,7 @@ public class StatementVisitor extends ElementVisitor { } @Override - public void visitDeclarationStatement(PsiDeclarationStatement statement) { + public void visitDeclarationStatement(@NotNull PsiDeclarationStatement statement) { super.visitDeclarationStatement(statement); myResult = new DeclarationStatement( elementsToElementList(statement.getDeclaredElements()) @@ -79,7 +79,7 @@ public class StatementVisitor extends ElementVisitor { } @Override - public void visitDoWhileStatement(PsiDoWhileStatement statement) { + public void visitDoWhileStatement(@NotNull PsiDoWhileStatement statement) { super.visitDoWhileStatement(statement); myResult = new DoWhileStatement( expressionToExpression(statement.getCondition()), @@ -88,13 +88,13 @@ public class StatementVisitor extends ElementVisitor { } @Override - public void visitExpressionStatement(PsiExpressionStatement statement) { + public void visitExpressionStatement(@NotNull PsiExpressionStatement statement) { super.visitExpressionStatement(statement); myResult = expressionToExpression(statement.getExpression()); } @Override - public void visitExpressionListStatement(PsiExpressionListStatement statement) { + public void visitExpressionListStatement(@NotNull PsiExpressionListStatement statement) { super.visitExpressionListStatement(statement); myResult = new ExpressionListStatement(expressionsToExpressionList(statement.getExpressionList().getExpressions())); @@ -151,7 +151,7 @@ public class StatementVisitor extends ElementVisitor { } } - private static boolean isOnceWritableIterator(PsiLocalVariable firstChild) { + private static boolean isOnceWritableIterator(@Nullable PsiLocalVariable firstChild) { int counter = 0; if (firstChild != null) for (PsiReference r : (ReferencesSearch.search(firstChild))) { @@ -164,7 +164,7 @@ public class StatementVisitor extends ElementVisitor { } @Override - public void visitForeachStatement(PsiForeachStatement statement) { + public void visitForeachStatement(@NotNull PsiForeachStatement statement) { super.visitForeachStatement(statement); myResult = new ForeachStatement( parameterToParameter(statement.getIterationParameter()), @@ -174,7 +174,7 @@ public class StatementVisitor extends ElementVisitor { } @Override - public void visitIfStatement(PsiIfStatement statement) { + public void visitIfStatement(@NotNull PsiIfStatement statement) { super.visitIfStatement(statement); myResult = new IfStatement( expressionToExpression(statement.getCondition()), @@ -184,7 +184,7 @@ public class StatementVisitor extends ElementVisitor { } @Override - public void visitLabeledStatement(PsiLabeledStatement statement) { + public void visitLabeledStatement(@NotNull PsiLabeledStatement statement) { super.visitLabeledStatement(statement); myResult = new LabelStatement( identifierToIdentifier(statement.getLabelIdentifier()), @@ -193,7 +193,7 @@ public class StatementVisitor extends ElementVisitor { } @Override - public void visitSwitchLabelStatement(PsiSwitchLabelStatement statement) { + public void visitSwitchLabelStatement(@NotNull PsiSwitchLabelStatement statement) { super.visitSwitchLabelStatement(statement); myResult = statement.isDefaultCase() ? new DefaultSwitchLabelStatement() : @@ -201,7 +201,7 @@ public class StatementVisitor extends ElementVisitor { } @Override - public void visitSwitchStatement(PsiSwitchStatement statement) { + public void visitSwitchStatement(@NotNull PsiSwitchStatement statement) { super.visitSwitchStatement(statement); myResult = new SwitchContainer( expressionToExpression(statement.getExpression()), @@ -253,6 +253,7 @@ public class StatementVisitor extends ElementVisitor { return false; } + @NotNull private static List getAllToNextBreak(@NotNull final List allStatements, final int start) { List result = new LinkedList(); for (int i = start; i < allStatements.size(); i++) { @@ -288,7 +289,7 @@ public class StatementVisitor extends ElementVisitor { } @Override - public void visitSynchronizedStatement(PsiSynchronizedStatement statement) { + public void visitSynchronizedStatement(@NotNull PsiSynchronizedStatement statement) { super.visitSynchronizedStatement(statement); myResult = new SynchronizedStatement( expressionToExpression(statement.getLockExpression()), @@ -297,7 +298,7 @@ public class StatementVisitor extends ElementVisitor { } @Override - public void visitThrowStatement(PsiThrowStatement statement) { + public void visitThrowStatement(@NotNull PsiThrowStatement statement) { super.visitThrowStatement(statement); myResult = new ThrowStatement( expressionToExpression(statement.getException()) @@ -305,7 +306,7 @@ public class StatementVisitor extends ElementVisitor { } @Override - public void visitTryStatement(PsiTryStatement statement) { + public void visitTryStatement(@NotNull PsiTryStatement statement) { super.visitTryStatement(statement); List catches = new LinkedList(); @@ -324,7 +325,7 @@ public class StatementVisitor extends ElementVisitor { } @Override - public void visitWhileStatement(PsiWhileStatement statement) { + public void visitWhileStatement(@NotNull PsiWhileStatement statement) { super.visitWhileStatement(statement); myResult = new WhileStatement( expressionToExpression(statement.getCondition()), @@ -333,7 +334,7 @@ public class StatementVisitor extends ElementVisitor { } @Override - public void visitReturnStatement(PsiReturnStatement statement) { + public void visitReturnStatement(@NotNull PsiReturnStatement statement) { super.visitReturnStatement(statement); PsiExpression returnValue = statement.getReturnValue(); String conversion = ""; diff --git a/src/org/jetbrains/jet/j2k/visitors/SuperVisitor.java b/src/org/jetbrains/jet/j2k/visitors/SuperVisitor.java index 16fcf409892..c7a8e7bc42a 100644 --- a/src/org/jetbrains/jet/j2k/visitors/SuperVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/SuperVisitor.java @@ -1,6 +1,7 @@ package org.jetbrains.jet.j2k.visitors; import com.intellij.psi.*; +import org.jetbrains.annotations.NotNull; import java.util.HashSet; @@ -9,24 +10,26 @@ import java.util.HashSet; * @author ignatov */ public class SuperVisitor extends JavaRecursiveElementVisitor { + @NotNull private final HashSet myResolvedSuperCallParameters; public SuperVisitor() { myResolvedSuperCallParameters = new HashSet(); } + @NotNull public HashSet getResolvedSuperCallParameters() { return myResolvedSuperCallParameters; } @Override - public void visitMethodCallExpression(PsiMethodCallExpression expression) { + public void visitMethodCallExpression(@NotNull PsiMethodCallExpression expression) { super.visitMethodCallExpression(expression); if (isSuper(expression.getMethodExpression())) myResolvedSuperCallParameters.add(expression.getArgumentList()); } - static boolean isSuper(PsiReference r) { + static boolean isSuper(@NotNull PsiReference r) { if (r.getCanonicalText().equals("super")) { final PsiElement baseConstructor = r.resolve(); if (baseConstructor != null && baseConstructor instanceof PsiMethod && ((PsiMethod) baseConstructor).isConstructor()) { diff --git a/src/org/jetbrains/jet/j2k/visitors/ThisVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ThisVisitor.java index 98fff4ecca2..c077ced52b5 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ThisVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ThisVisitor.java @@ -1,6 +1,7 @@ package org.jetbrains.jet.j2k.visitors; import com.intellij.psi.*; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.HashSet; @@ -9,10 +10,11 @@ import java.util.HashSet; * @author ignatov */ public class ThisVisitor extends JavaRecursiveElementVisitor { + @NotNull private final HashSet myResolvedConstructors = new HashSet(); @Override - public void visitReferenceExpression(PsiReferenceExpression expression) { + public void visitReferenceExpression(@NotNull PsiReferenceExpression expression) { for (PsiReference r : expression.getReferences()) if (r.getCanonicalText().equals("this")) { final PsiElement res = r.resolve(); diff --git a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java index 7be5bc4b804..a24aa109cef 100644 --- a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java @@ -25,7 +25,7 @@ public class TypeVisitor extends PsiTypeVisitor { } @Override - public Type visitPrimitiveType(PsiPrimitiveType primitiveType) { + public Type visitPrimitiveType(@NotNull PsiPrimitiveType primitiveType) { final String name = primitiveType.getCanonicalText(); final IdentifierImpl identifier = new IdentifierImpl(name); @@ -39,14 +39,14 @@ public class TypeVisitor extends PsiTypeVisitor { } @Override - public Type visitArrayType(PsiArrayType arrayType) { + public Type visitArrayType(@NotNull PsiArrayType arrayType) { if (myResult == Type.EMPTY_TYPE) myResult = new ArrayType(typeToType(arrayType.getComponentType())); return super.visitArrayType(arrayType); } @Override - public Type visitClassType(PsiClassType classType) { + public Type visitClassType(@NotNull PsiClassType classType) { final IdentifierImpl identifier = constructClassTypeIdentifier(classType); final List resolvedClassTypeParams = createRawTypesForResolvedReference(classType); @@ -128,7 +128,7 @@ public class TypeVisitor extends PsiTypeVisitor { } @Override - public Type visitWildcardType(PsiWildcardType wildcardType) { + public Type visitWildcardType(@NotNull PsiWildcardType wildcardType) { if (wildcardType.isExtends()) myResult = new OutProjectionType(typeToType(wildcardType.getExtendsBound())); else if (wildcardType.isSuper()) @@ -139,7 +139,7 @@ public class TypeVisitor extends PsiTypeVisitor { } @Override - public Type visitEllipsisType(PsiEllipsisType ellipsisType) { + public Type visitEllipsisType(@NotNull PsiEllipsisType ellipsisType) { myResult = new VarArg(typeToType(ellipsisType.getComponentType())); return super.visitEllipsisType(ellipsisType); } diff --git a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java index 6b7a168efb3..28548a78d37 100644 --- a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java +++ b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java @@ -8,6 +8,7 @@ import junit.framework.Assert; import junit.framework.Test; import junit.framework.TestSuite; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.j2k.visitors.ClassVisitor; import java.io.File; @@ -64,6 +65,7 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { return myDataPath + File.separator + myName + ".jav"; } + @NotNull @Override protected String getTestDataPath() { return "testData"; @@ -77,11 +79,13 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { return jdkFromIdeaHome(); } + @NotNull @Override public String getName() { return "test_" + myName; } + @NotNull public static Test suite() { TestSuite suite = new TestSuite(); suite.addTest(TestCaseBuilder.suiteForDirectory(getTestDataPathBase(), "/ast", true, new TestCaseBuilder.NamedTestFactory() { @@ -143,7 +147,7 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { } @NotNull - private static String prettify(String code) { + private static String prettify(@Nullable String code) { if (code == null) return ""; return code diff --git a/test/org/jetbrains/jet/j2k/TestCaseBuilder.java b/test/org/jetbrains/jet/j2k/TestCaseBuilder.java index 458376db39e..f5337dfcb24 100644 --- a/test/org/jetbrains/jet/j2k/TestCaseBuilder.java +++ b/test/org/jetbrains/jet/j2k/TestCaseBuilder.java @@ -16,6 +16,7 @@ import java.util.List; * @author ignatov */ abstract class TestCaseBuilder { + @NotNull private static final FilenameFilter emptyFilter = new FilenameFilter() { @Override public boolean accept(File file, String name) { @@ -23,6 +24,7 @@ abstract class TestCaseBuilder { } }; + @NotNull public static String getTestDataPathBase() { return "testData"; } @@ -42,13 +44,13 @@ abstract class TestCaseBuilder { } @NotNull - private static TestSuite suiteForDirectory(String baseDataDir, @NotNull final String dataPath, boolean recursive, final FilenameFilter filter, @NotNull NamedTestFactory factory) { + private static TestSuite suiteForDirectory(String baseDataDir, @NotNull final String dataPath, boolean recursive, @NotNull final FilenameFilter filter, @NotNull NamedTestFactory factory) { TestSuite suite = new TestSuite(dataPath); final String extensionJava = ".jav"; final FilenameFilter extensionFilter = new FilenameFilter() { @Override - public boolean accept(File dir, String name) { + public boolean accept(File dir, @NotNull String name) { return name.endsWith(extensionJava); } }; @@ -66,7 +68,7 @@ abstract class TestCaseBuilder { File dir = new File(baseDataDir + dataPath); FileFilter dirFilter = new FileFilter() { @Override - public boolean accept(File pathname) { + public boolean accept(@NotNull File pathname) { return pathname.isDirectory(); } }; From ee2ade0b1094c4872201ffb44d9c7089999c326f Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 13 Dec 2011 17:32:54 +0400 Subject: [PATCH 170/206] KT-809 Add sure() for call invocation parameters --- .../jet/j2k/visitors/ExpressionVisitor.java | 19 ++++++++++++----- testData/ast/issues/file/kt-809-string.jav | 21 +++++++++++++++++++ testData/ast/issues/file/kt-809-string.kt | 19 +++++++++++++++++ testData/ast/issues/file/kt-809.jav | 21 +++++++++++++++++++ testData/ast/issues/file/kt-809.kt | 19 +++++++++++++++++ 5 files changed, 94 insertions(+), 5 deletions(-) create mode 100644 testData/ast/issues/file/kt-809-string.jav create mode 100644 testData/ast/issues/file/kt-809-string.kt create mode 100644 testData/ast/issues/file/kt-809.jav create mode 100644 testData/ast/issues/file/kt-809.kt diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 3cd110aa04c..ce61907a114 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -208,7 +208,7 @@ public class ExpressionVisitor extends StatementVisitor { private static List createConversions(@NotNull PsiCallExpression expression) { List conversions = new LinkedList(); PsiExpressionList argumentList = expression.getArgumentList(); - PsiExpression[] arguments = argumentList != null? argumentList.getExpressions() : new PsiExpression[]{}; + PsiExpression[] arguments = argumentList != null ? argumentList.getExpressions() : new PsiExpression[]{}; //noinspection UnusedDeclaration for (final PsiExpression a : arguments) { conversions.add(""); @@ -230,16 +230,25 @@ public class ExpressionVisitor extends StatementVisitor { for (int i = 0; i < actualTypes.size(); i++) { PsiType actual = actualTypes.get(i); PsiType expected = expectedTypes.get(i); + PsiExpression argument = arguments[i]; - if (isConversionNeeded(actual, expected)) { - conversions.set(i, getPrimitiveTypeConversion(expected.getCanonicalText())); - } + String conversion = ""; + if (isConversionNeeded(actual, expected)) + conversion += getPrimitiveTypeConversion(expected.getCanonicalText()); + + PsiType type = argument.getType(); + if (argument instanceof PsiReferenceExpression && + type != null && Node.PRIMITIVE_TYPES.contains(type.getCanonicalText()) && + ((PsiReferenceExpression) argument).isQualified()) + conversion += ".sure()"; + + conversions.set(i, conversion); } } return conversions; } - static boolean isConversionNeeded(@Nullable final PsiType actual,@Nullable final PsiType expected) { + static boolean isConversionNeeded(@Nullable final PsiType actual, @Nullable final PsiType expected) { if (actual == null || expected == null) return false; Map typeMap = new HashMap(); diff --git a/testData/ast/issues/file/kt-809-string.jav b/testData/ast/issues/file/kt-809-string.jav new file mode 100644 index 00000000000..71913e2dfab --- /dev/null +++ b/testData/ast/issues/file/kt-809-string.jav @@ -0,0 +1,21 @@ +package demo; + +class Container { + String myString = 1; +} + +class One { + static Container myContainer = new Container(); +} + +class StringContainer { + StringContainer(String s) {} +} + +class Test { + void putString(String s) { } + void test() { + putString(One.myContainer.myString); + new StringContainer(One.myContainer.myString); + } +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-809-string.kt b/testData/ast/issues/file/kt-809-string.kt new file mode 100644 index 00000000000..0e261443721 --- /dev/null +++ b/testData/ast/issues/file/kt-809-string.kt @@ -0,0 +1,19 @@ +namespace demo +open class Container() { +var myString : String? = 1 +} +open class One() { +class object { +var myContainer : Container? = Container() +} +} +open class StringContainer(s : String?) { +} +open class Test() { +open fun putString(s : String?) : Unit { +} +open fun test() : Unit { +putString(One.myContainer?.myString) +StringContainer(One.myContainer?.myString) +} +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-809.jav b/testData/ast/issues/file/kt-809.jav new file mode 100644 index 00000000000..b2cc8015ee9 --- /dev/null +++ b/testData/ast/issues/file/kt-809.jav @@ -0,0 +1,21 @@ +package demo; + +class Container { + int myInt = 1; +} + +class One { + static Container myContainer = new Container(); +} + +class IntContainer { + IntContainer(int i) {} +} + +class Test { + void putInt(int i) { } + void test() { + putInt(One.myContainer.myInt); + new IntContainer(One.myContainer.myInt); + } +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-809.kt b/testData/ast/issues/file/kt-809.kt new file mode 100644 index 00000000000..e9e43c99bf3 --- /dev/null +++ b/testData/ast/issues/file/kt-809.kt @@ -0,0 +1,19 @@ +namespace demo +open class Container() { +var myInt : Int = 1 +} +open class One() { +class object { +var myContainer : Container? = Container() +} +} +open class IntContainer(i : Int) { +} +open class Test() { +open fun putInt(i : Int) : Unit { +} +open fun test() : Unit { +putInt((One.myContainer?.myInt).sure()) +IntContainer((One.myContainer?.myInt).sure()) +} +} \ No newline at end of file From f552429fe1551a0038ee7590170687c72f5b1362 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 13 Dec 2011 19:21:08 +0400 Subject: [PATCH 171/206] KT-820 Add explicit conversion in assignment expression --- src/org/jetbrains/jet/j2k/Converter.java | 115 +++++++++++++++++- src/org/jetbrains/jet/j2k/ast/Field.java | 11 +- .../jetbrains/jet/j2k/ast/LocalVariable.java | 6 +- .../jet/j2k/visitors/ElementVisitor.java | 3 +- .../jet/j2k/visitors/ExpressionVisitor.java | 92 +------------- .../jet/j2k/visitors/StatementVisitor.java | 4 +- testData/ast/issues/file/kt-820-field.jav | 13 ++ testData/ast/issues/file/kt-820-field.kt | 12 ++ testData/ast/issues/file/kt-820.jav | 15 +++ testData/ast/issues/file/kt-820.kt | 14 +++ 10 files changed, 184 insertions(+), 101 deletions(-) create mode 100644 testData/ast/issues/file/kt-820-field.jav create mode 100644 testData/ast/issues/file/kt-820-field.kt create mode 100644 testData/ast/issues/file/kt-820.jav create mode 100644 testData/ast/issues/file/kt-820.kt diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 360c7cda192..c198eeb5688 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -26,9 +26,15 @@ public class Converter { add("javax.annotation.Nonnull"); } }; - @NotNull private static Set ourClassIdentifiers = new HashSet(); - @NotNull private static final Dispatcher ourDispatcher = new Dispatcher(); - @Nullable private static PsiType ourMethodReturnType = null; + @NotNull + private static Set ourClassIdentifiers = new HashSet(); + @NotNull + private static final Dispatcher ourDispatcher = new Dispatcher(); + @Nullable + private static PsiType ourMethodReturnType = null; + + private Converter() { + } public static void setClassIdentifiers(@NotNull Set identifiers) { ourClassIdentifiers = identifiers; @@ -269,7 +275,8 @@ public class Converter { new IdentifierImpl(field.getName()), // TODO modifiers, typeToType(field.getType()), - expressionToExpression(field.getInitializer()) // TODO: add modifiers + expressionToExpression(field.getInitializer()), // TODO: add modifiers + createConversionForCallChains(field.getInitializer(), field.getType()) ); } @@ -549,4 +556,104 @@ public class Converter { } return modifiersSet; } + + @NotNull + public static List createConversions(@NotNull PsiCallExpression expression) { + List conversions = new LinkedList(); + PsiExpressionList argumentList = expression.getArgumentList(); + PsiExpression[] arguments = argumentList != null ? argumentList.getExpressions() : new PsiExpression[]{}; + //noinspection UnusedDeclaration + for (final PsiExpression a : arguments) { + conversions.add(""); + } + + PsiMethod resolve = expression.resolveMethod(); + if (resolve != null) { + List expectedTypes = new LinkedList(); + List actualTypes = new LinkedList(); + + for (PsiParameter p : resolve.getParameterList().getParameters()) + expectedTypes.add(p.getType()); + + for (PsiExpression e : arguments) + actualTypes.add(e.getType()); + + assert actualTypes.size() == expectedTypes.size() : "The type list must have the same length"; + + for (int i = 0; i < actualTypes.size(); i++) + conversions.set(i, createConversionForExpression(arguments[i], expectedTypes.get(i))); + } + return conversions; + } + + @NotNull + public static String createConversionForExpression(@Nullable PsiExpression expression, @NotNull PsiType expectedType) { + String conversion = ""; + if (expression != null) { + PsiType actualType = expression.getType(); + if (actualType != null) { + if (isConversionNeeded(actualType, expectedType)) + conversion += getPrimitiveTypeConversion(expectedType.getCanonicalText()); + if (expression instanceof PsiReferenceExpression && Node.PRIMITIVE_TYPES.contains(actualType.getCanonicalText()) && ((PsiReferenceExpression) expression).isQualified()) + conversion += ".sure()"; + } + } + return conversion; + } + + public static boolean isConversionNeeded(@Nullable final PsiType actual, @Nullable final PsiType expected) { + if (actual == null || expected == null) + return false; + Map typeMap = new HashMap(); + typeMap.put("java.lang.Byte", "byte"); + typeMap.put("java.lang.Short", "short"); + typeMap.put("java.lang.Integer", "int"); + typeMap.put("java.lang.Long", "long"); + typeMap.put("java.lang.Float", "float"); + typeMap.put("java.lang.Double", "double"); + typeMap.put("java.lang.Character", "char"); + String expectedStr = expected.getCanonicalText(); + String actualStr = actual.getCanonicalText(); + boolean o1 = AstUtil.getOrElse(typeMap, actualStr, "").equals(expectedStr); + boolean o2 = AstUtil.getOrElse(typeMap, expectedStr, "").equals(actualStr); + return !actualStr.equals(expectedStr) && (!(o1 ^ o2)); + } + + @NotNull + public static String getPrimitiveTypeConversion(@NotNull String type) { + Map conversions = new HashMap(); + conversions.put("byte", "byt"); + conversions.put("short", "sht"); + conversions.put("int", "int"); + conversions.put("long", "lng"); + conversions.put("float", "flt"); + conversions.put("double", "dbl"); + conversions.put("char", "chr"); + + conversions.put("java.lang.Byte", "byt"); + conversions.put("java.lang.Short", "sht"); + conversions.put("java.lang.Integer", "int"); + conversions.put("java.lang.Long", "lng"); + conversions.put("java.lang.Float", "flt"); + conversions.put("java.lang.Double", "dbl"); + conversions.put("java.lang.Character", "chr"); + + if (conversions.containsKey(type)) + return "." + conversions.get(type); + return ""; + } + +// @NotNull +// private static String applyConversion(Expression expression, String conversion) { +// if (conversion.isEmpty()) +// return expression.toKotlin(); +// return "(" + expression.toKotlin() + ")" + conversion; +// } + + @NotNull + public static String createConversionForCallChains(PsiExpression initializer, PsiType type) { + if (initializer != null && initializer instanceof PsiReferenceExpression && ((PsiReferenceExpression) initializer).isQualified()) + return createConversionForExpression(initializer, type); + return ""; + } } \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/ast/Field.java b/src/org/jetbrains/jet/j2k/ast/Field.java index 8c2bbde5b94..c0593ffd9eb 100644 --- a/src/org/jetbrains/jet/j2k/ast/Field.java +++ b/src/org/jetbrains/jet/j2k/ast/Field.java @@ -14,16 +14,23 @@ import static org.jetbrains.jet.j2k.Converter.getDefaultInitializer; */ public class Field extends Member { final Identifier myIdentifier; + @NotNull + private final String myConversion; final Type myType; final Element myInitializer; - public Field(Identifier identifier, Set modifiers, Type type, Element initializer) { + public Field(Identifier identifier, Set modifiers, Type type, Element initializer, @NotNull String conversionForCallChains) { myIdentifier = identifier; + myConversion = conversionForCallChains; myModifiers = modifiers; myType = type; myInitializer = initializer; } + public Field(Identifier identifier, Set modifiers, Type type, Element initializer) { + this(identifier, modifiers, type, initializer, ""); + } + public Element getInitializer() { return myInitializer; } @@ -71,6 +78,6 @@ public class Field extends Member { return modifier + myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin() + SPACE + EQUAL + SPACE + getDefaultInitializer(this); return modifier + myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin() + SPACE + - EQUAL + SPACE + myInitializer.toKotlin(); + EQUAL + SPACE + myInitializer.toKotlin() + myConversion; } } \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/ast/LocalVariable.java b/src/org/jetbrains/jet/j2k/ast/LocalVariable.java index 0c561827a18..c377b9af56d 100644 --- a/src/org/jetbrains/jet/j2k/ast/LocalVariable.java +++ b/src/org/jetbrains/jet/j2k/ast/LocalVariable.java @@ -12,12 +12,14 @@ public class LocalVariable extends Expression { private final Set myModifiersSet; private final Type myType; private final Expression myInitializer; + private final String myConversion; - public LocalVariable(Identifier identifier, Set modifiersSet, Type type, Expression initializer) { + public LocalVariable(Identifier identifier, Set modifiersSet, Type type, Expression initializer, @NotNull String conversionForExpression) { myIdentifier = identifier; myModifiersSet = modifiersSet; myType = type; myInitializer = initializer; + myConversion = conversionForExpression; } public boolean hasModifier(String modifier) { @@ -31,6 +33,6 @@ public class LocalVariable extends Expression { return myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin(); return myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin() + SPACE + - EQUAL + SPACE + myInitializer.toKotlin(); + EQUAL + SPACE + myInitializer.toKotlin() + myConversion; } } diff --git a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java index 4a39cf57ca5..cda41ceba8b 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java @@ -30,7 +30,8 @@ public class ElementVisitor extends JavaElementVisitor { new IdentifierImpl(variable.getName()), // TODO modifiersListToModifiersSet(variable.getModifierList()), typeToType(variable.getType(), Converter.isNotNull(variable.getModifierList())), - expressionToExpression(variable.getInitializer()) + expressionToExpression(variable.getInitializer()), + createConversionForCallChains(variable.getInitializer(), variable.getType()) ); } diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index ce61907a114..6311bea2780 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -4,9 +4,7 @@ import com.intellij.psi.*; import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.j2k.Converter; import org.jetbrains.jet.j2k.ast.*; -import org.jetbrains.jet.j2k.util.AstUtil; import java.util.*; @@ -16,7 +14,7 @@ import static org.jetbrains.jet.j2k.Converter.*; * @author ignatov */ public class ExpressionVisitor extends StatementVisitor { - @Nullable + @NotNull Expression myResult = Expression.EMPTY_EXPRESSION; @Override @@ -204,92 +202,6 @@ public class ExpressionVisitor extends StatementVisitor { } } - @NotNull - private static List createConversions(@NotNull PsiCallExpression expression) { - List conversions = new LinkedList(); - PsiExpressionList argumentList = expression.getArgumentList(); - PsiExpression[] arguments = argumentList != null ? argumentList.getExpressions() : new PsiExpression[]{}; - //noinspection UnusedDeclaration - for (final PsiExpression a : arguments) { - conversions.add(""); - } - - PsiMethod resolve = expression.resolveMethod(); - if (resolve != null) { - List expectedTypes = new LinkedList(); - List actualTypes = new LinkedList(); - - for (PsiParameter p : resolve.getParameterList().getParameters()) - expectedTypes.add(p.getType()); - - for (PsiExpression e : arguments) - actualTypes.add(e.getType()); - - assert actualTypes.size() == expectedTypes.size() : "The type list must have the same length"; - - for (int i = 0; i < actualTypes.size(); i++) { - PsiType actual = actualTypes.get(i); - PsiType expected = expectedTypes.get(i); - PsiExpression argument = arguments[i]; - - String conversion = ""; - if (isConversionNeeded(actual, expected)) - conversion += getPrimitiveTypeConversion(expected.getCanonicalText()); - - PsiType type = argument.getType(); - if (argument instanceof PsiReferenceExpression && - type != null && Node.PRIMITIVE_TYPES.contains(type.getCanonicalText()) && - ((PsiReferenceExpression) argument).isQualified()) - conversion += ".sure()"; - - conversions.set(i, conversion); - } - } - return conversions; - } - - static boolean isConversionNeeded(@Nullable final PsiType actual, @Nullable final PsiType expected) { - if (actual == null || expected == null) - return false; - Map typeMap = new HashMap(); - typeMap.put("java.lang.Byte", "byte"); - typeMap.put("java.lang.Short", "short"); - typeMap.put("java.lang.Integer", "int"); - typeMap.put("java.lang.Long", "long"); - typeMap.put("java.lang.Float", "float"); - typeMap.put("java.lang.Double", "double"); - typeMap.put("java.lang.Character", "char"); - String expectedStr = expected.getCanonicalText(); - String actualStr = actual.getCanonicalText(); - boolean o1 = AstUtil.getOrElse(typeMap, actualStr, "").equals(expectedStr); - boolean o2 = AstUtil.getOrElse(typeMap, expectedStr, "").equals(actualStr); - return !actualStr.equals(expectedStr) && (!(o1 ^ o2)); - } - - @NotNull - static String getPrimitiveTypeConversion(@NotNull String type) { - Map conversions = new HashMap(); - conversions.put("byte", "byt"); - conversions.put("short", "sht"); - conversions.put("int", "int"); - conversions.put("long", "lng"); - conversions.put("float", "flt"); - conversions.put("double", "dbl"); - conversions.put("char", "chr"); - - conversions.put("java.lang.Byte", "byt"); - conversions.put("java.lang.Short", "sht"); - conversions.put("java.lang.Integer", "int"); - conversions.put("java.lang.Long", "lng"); - conversions.put("java.lang.Float", "flt"); - conversions.put("java.lang.Double", "dbl"); - conversions.put("java.lang.Character", "chr"); - - if (conversions.containsKey(type)) - return "." + conversions.get(type); - return ""; - } - @Override public void visitCallExpression(PsiCallExpression callExpression) { super.visitCallExpression(callExpression); @@ -313,7 +225,7 @@ public class ExpressionVisitor extends StatementVisitor { final PsiAnonymousClass anonymousClass = expression.getAnonymousClass(); final PsiMethod constructor = expression.resolveMethod(); PsiJavaCodeReferenceElement classReference = expression.getClassOrAnonymousClassReference(); - final boolean isNotConvertedClass = classReference != null && !Converter.getClassIdentifiers().contains(classReference.getQualifiedName()); + final boolean isNotConvertedClass = classReference != null && !getClassIdentifiers().contains(classReference.getQualifiedName()); PsiExpressionList argumentList = expression.getArgumentList(); PsiExpression[] arguments = argumentList != null ? argumentList.getExpressions() : new PsiExpression[]{}; if (constructor == null || isConstructorPrimary(constructor) || isNotConvertedClass) { diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index 07b4689822c..d7d1ea178aa 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -15,8 +15,8 @@ import java.util.LinkedList; import java.util.List; import static org.jetbrains.jet.j2k.Converter.*; -import static org.jetbrains.jet.j2k.visitors.ExpressionVisitor.getPrimitiveTypeConversion; -import static org.jetbrains.jet.j2k.visitors.ExpressionVisitor.isConversionNeeded; +import static org.jetbrains.jet.j2k.Converter.getPrimitiveTypeConversion; +import static org.jetbrains.jet.j2k.Converter.isConversionNeeded; /** * @author ignatov diff --git a/testData/ast/issues/file/kt-820-field.jav b/testData/ast/issues/file/kt-820-field.jav new file mode 100644 index 00000000000..ca2c1588ef7 --- /dev/null +++ b/testData/ast/issues/file/kt-820-field.jav @@ -0,0 +1,13 @@ +package demo; + +class Container { + int myInt = 1; +} + +class One { + static Container myContainer = new Container(); +} + +class Test { + byte b = One.myContainer.myInt; +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-820-field.kt b/testData/ast/issues/file/kt-820-field.kt new file mode 100644 index 00000000000..7326083fac8 --- /dev/null +++ b/testData/ast/issues/file/kt-820-field.kt @@ -0,0 +1,12 @@ +namespace demo +open class Container() { +var myInt : Int = 1 +} +open class One() { +class object { +var myContainer : Container? = Container() +} +} +open class Test() { +var b : Byte = One.myContainer?.myInt.byt.sure() +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-820.jav b/testData/ast/issues/file/kt-820.jav new file mode 100644 index 00000000000..20ac0acdb97 --- /dev/null +++ b/testData/ast/issues/file/kt-820.jav @@ -0,0 +1,15 @@ +package demo; + +class Container { + int myInt = 1; +} + +class One { + static Container myContainer = new Container(); +} + +class Test { + void test() { + byte b = One.myContainer.myInt; + } +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-820.kt b/testData/ast/issues/file/kt-820.kt new file mode 100644 index 00000000000..6fd43add913 --- /dev/null +++ b/testData/ast/issues/file/kt-820.kt @@ -0,0 +1,14 @@ +namespace demo +open class Container() { +var myInt : Int = 1 +} +open class One() { +class object { +var myContainer : Container? = Container() +} +} +open class Test() { +open fun test() : Unit { +var b : Byte = One.myContainer?.myInt.byt.sure() +} +} \ No newline at end of file From 96aced06ee88ad86897f6748c000da37e599d8a0 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 14 Dec 2011 12:33:41 +0400 Subject: [PATCH 172/206] KT-824 Add explicit conversion in conditions --- src/org/jetbrains/jet/j2k/Converter.java | 11 ++++---- src/org/jetbrains/jet/j2k/ast/Field.java | 11 ++------ .../jetbrains/jet/j2k/ast/LocalVariable.java | 6 ++--- .../jet/j2k/ast/SureCallChainExpression.java | 27 +++++++++++++++++++ .../jet/j2k/visitors/ElementVisitor.java | 3 +-- .../jet/j2k/visitors/ExpressionVisitor.java | 6 ++++- .../jet/j2k/visitors/StatementVisitor.java | 20 ++++++++++---- testData/ast/issues/file/kt-824.jav | 25 +++++++++++++++++ testData/ast/issues/file/kt-824.kt | 26 ++++++++++++++++++ 9 files changed, 108 insertions(+), 27 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/SureCallChainExpression.java create mode 100644 testData/ast/issues/file/kt-824.jav create mode 100644 testData/ast/issues/file/kt-824.kt diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index c198eeb5688..b5eb951ec58 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -275,8 +275,7 @@ public class Converter { new IdentifierImpl(field.getName()), // TODO modifiers, typeToType(field.getType()), - expressionToExpression(field.getInitializer()), // TODO: add modifiers - createConversionForCallChains(field.getInitializer(), field.getType()) + createSureCallOnlyForChain(field.getInitializer(), field.getType()) // TODO: add modifiers ); } @@ -651,9 +650,9 @@ public class Converter { // } @NotNull - public static String createConversionForCallChains(PsiExpression initializer, PsiType type) { - if (initializer != null && initializer instanceof PsiReferenceExpression && ((PsiReferenceExpression) initializer).isQualified()) - return createConversionForExpression(initializer, type); - return ""; + public static SureCallChainExpression createSureCallOnlyForChain(PsiExpression expression, PsiType type) { + String conversion = (expression != null && expression instanceof PsiReferenceExpression && ((PsiReferenceExpression) expression).isQualified()) ? + createConversionForExpression(expression, type) : ""; + return new SureCallChainExpression(expressionToExpression(expression), conversion); } } \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/ast/Field.java b/src/org/jetbrains/jet/j2k/ast/Field.java index c0593ffd9eb..8c2bbde5b94 100644 --- a/src/org/jetbrains/jet/j2k/ast/Field.java +++ b/src/org/jetbrains/jet/j2k/ast/Field.java @@ -14,23 +14,16 @@ import static org.jetbrains.jet.j2k.Converter.getDefaultInitializer; */ public class Field extends Member { final Identifier myIdentifier; - @NotNull - private final String myConversion; final Type myType; final Element myInitializer; - public Field(Identifier identifier, Set modifiers, Type type, Element initializer, @NotNull String conversionForCallChains) { + public Field(Identifier identifier, Set modifiers, Type type, Element initializer) { myIdentifier = identifier; - myConversion = conversionForCallChains; myModifiers = modifiers; myType = type; myInitializer = initializer; } - public Field(Identifier identifier, Set modifiers, Type type, Element initializer) { - this(identifier, modifiers, type, initializer, ""); - } - public Element getInitializer() { return myInitializer; } @@ -78,6 +71,6 @@ public class Field extends Member { return modifier + myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin() + SPACE + EQUAL + SPACE + getDefaultInitializer(this); return modifier + myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin() + SPACE + - EQUAL + SPACE + myInitializer.toKotlin() + myConversion; + EQUAL + SPACE + myInitializer.toKotlin(); } } \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/ast/LocalVariable.java b/src/org/jetbrains/jet/j2k/ast/LocalVariable.java index c377b9af56d..0c561827a18 100644 --- a/src/org/jetbrains/jet/j2k/ast/LocalVariable.java +++ b/src/org/jetbrains/jet/j2k/ast/LocalVariable.java @@ -12,14 +12,12 @@ public class LocalVariable extends Expression { private final Set myModifiersSet; private final Type myType; private final Expression myInitializer; - private final String myConversion; - public LocalVariable(Identifier identifier, Set modifiersSet, Type type, Expression initializer, @NotNull String conversionForExpression) { + public LocalVariable(Identifier identifier, Set modifiersSet, Type type, Expression initializer) { myIdentifier = identifier; myModifiersSet = modifiersSet; myType = type; myInitializer = initializer; - myConversion = conversionForExpression; } public boolean hasModifier(String modifier) { @@ -33,6 +31,6 @@ public class LocalVariable extends Expression { return myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin(); return myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin() + SPACE + - EQUAL + SPACE + myInitializer.toKotlin() + myConversion; + EQUAL + SPACE + myInitializer.toKotlin(); } } diff --git a/src/org/jetbrains/jet/j2k/ast/SureCallChainExpression.java b/src/org/jetbrains/jet/j2k/ast/SureCallChainExpression.java new file mode 100644 index 00000000000..f570fcce81c --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/SureCallChainExpression.java @@ -0,0 +1,27 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class SureCallChainExpression extends Expression { + private final Expression myExpression; + private final String myConversion; + + public SureCallChainExpression(Expression expression, String conversion) { + myExpression = expression; + myConversion = conversion; + } + + @Override + public boolean isEmpty() { + return myExpression.isEmpty(); + } + + @NotNull + @Override + public String toKotlin() { + return myExpression.toKotlin() + myConversion; + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java index cda41ceba8b..29d888bd2c4 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java @@ -30,8 +30,7 @@ public class ElementVisitor extends JavaElementVisitor { new IdentifierImpl(variable.getName()), // TODO modifiersListToModifiersSet(variable.getModifierList()), typeToType(variable.getType(), Converter.isNotNull(variable.getModifierList())), - expressionToExpression(variable.getInitializer()), - createConversionForCallChains(variable.getInitializer(), variable.getType()) + createSureCallOnlyForChain(variable.getInitializer(), variable.getType()) ); } diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 6311bea2780..eb9a541fbac 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -136,9 +136,13 @@ public class ExpressionVisitor extends StatementVisitor { @Override public void visitConditionalExpression(@NotNull PsiConditionalExpression expression) { super.visitConditionalExpression(expression); + PsiExpression condition = expression.getCondition(); + Expression e = condition.getType() != null ? + createSureCallOnlyForChain(condition, condition.getType()) : + expressionToExpression(condition); myResult = new ParenthesizedExpression( new IfStatement( - expressionToExpression(expression.getCondition()), + e, expressionToExpression(expression.getThenExpression()), expressionToExpression(expression.getElseExpression()) ) diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index d7d1ea178aa..53f34e4004a 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -15,8 +15,6 @@ import java.util.LinkedList; import java.util.List; import static org.jetbrains.jet.j2k.Converter.*; -import static org.jetbrains.jet.j2k.Converter.getPrimitiveTypeConversion; -import static org.jetbrains.jet.j2k.Converter.isConversionNeeded; /** * @author ignatov @@ -81,8 +79,12 @@ public class StatementVisitor extends ElementVisitor { @Override public void visitDoWhileStatement(@NotNull PsiDoWhileStatement statement) { super.visitDoWhileStatement(statement); + PsiExpression condition = statement.getCondition(); + Expression expression = condition != null && condition.getType() != null ? + createSureCallOnlyForChain(condition, condition.getType()) : + expressionToExpression(condition); myResult = new DoWhileStatement( - expressionToExpression(statement.getCondition()), + expression, statementToStatement(statement.getBody()) ); } @@ -176,8 +178,12 @@ public class StatementVisitor extends ElementVisitor { @Override public void visitIfStatement(@NotNull PsiIfStatement statement) { super.visitIfStatement(statement); + PsiExpression condition = statement.getCondition(); + Expression expression = condition != null && condition.getType() != null ? + createSureCallOnlyForChain(condition, condition.getType()) : + expressionToExpression(condition); myResult = new IfStatement( - expressionToExpression(statement.getCondition()), + expression, statementToStatement(statement.getThenBranch()), statementToStatement(statement.getElseBranch()) ); @@ -327,8 +333,12 @@ public class StatementVisitor extends ElementVisitor { @Override public void visitWhileStatement(@NotNull PsiWhileStatement statement) { super.visitWhileStatement(statement); + PsiExpression condition = statement.getCondition(); + Expression expression = condition != null && condition.getType() != null ? + createSureCallOnlyForChain(condition, condition.getType()) : + expressionToExpression(condition); myResult = new WhileStatement( - expressionToExpression(statement.getCondition()), + expression, statementToStatement(statement.getBody()) ); } diff --git a/testData/ast/issues/file/kt-824.jav b/testData/ast/issues/file/kt-824.jav new file mode 100644 index 00000000000..4e0a95754fd --- /dev/null +++ b/testData/ast/issues/file/kt-824.jav @@ -0,0 +1,25 @@ +package demo; + +class Container { + boolean myBoolean = true; +} + +class One { + static Container myContainer = new Container(); +} + +class Test { + void test() { + if (One.myContainer.myBoolean) + System.out.println("Ok"); + + String s = One.myContainer.myBoolean ? "YES" : "NO"; + + while (One.myContainer.myBoolean) + System.out.println("Ok"); + + do { + System.out.println("Ok"); + } while (One.myContainer.myBoolean) + } +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-824.kt b/testData/ast/issues/file/kt-824.kt new file mode 100644 index 00000000000..87e1d165317 --- /dev/null +++ b/testData/ast/issues/file/kt-824.kt @@ -0,0 +1,26 @@ +namespace demo +open class Container() { +var myBoolean : Boolean = true +} +open class One() { +class object { +var myContainer : Container? = Container() +} +} +open class Test() { +open fun test() : Unit { +if (One.myContainer?.myBoolean.sure()) +System.out?.println("Ok") +var s : String? = (if (One.myContainer?.myBoolean.sure()) +"YES" +else +"NO") +while (One.myContainer?.myBoolean.sure()) +System.out?.println("Ok") +do +{ +System.out?.println("Ok") +} +while (One.myContainer?.myBoolean.sure()) +} +} \ No newline at end of file From d621b73b041b81028083836bc5d88b8d1073f0ea Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 14 Dec 2011 14:06:22 +0400 Subject: [PATCH 173/206] KT-820 and KT-824 fixed --- src/org/jetbrains/jet/j2k/Converter.java | 5 +++-- testData/ast/issues/file/kt-820-string.jav | 6 ++++++ testData/ast/issues/file/kt-820-string.kt | 8 ++++++++ testData/ast/issues/file/kt-824-isDir.jav | 18 ++++++++++++++++++ testData/ast/issues/file/kt-824-isDir.kt | 19 +++++++++++++++++++ 5 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 testData/ast/issues/file/kt-820-string.jav create mode 100644 testData/ast/issues/file/kt-820-string.kt create mode 100644 testData/ast/issues/file/kt-824-isDir.jav create mode 100644 testData/ast/issues/file/kt-824-isDir.kt diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index b5eb951ec58..0f44eef8c30 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -593,7 +593,8 @@ public class Converter { if (actualType != null) { if (isConversionNeeded(actualType, expectedType)) conversion += getPrimitiveTypeConversion(expectedType.getCanonicalText()); - if (expression instanceof PsiReferenceExpression && Node.PRIMITIVE_TYPES.contains(actualType.getCanonicalText()) && ((PsiReferenceExpression) expression).isQualified()) + if (Node.PRIMITIVE_TYPES.contains(actualType.getCanonicalText()) && (expression instanceof PsiReferenceExpression && ((PsiReferenceExpression) expression).isQualified() || + expression instanceof PsiMethodCallExpression)) conversion += ".sure()"; } } @@ -651,7 +652,7 @@ public class Converter { @NotNull public static SureCallChainExpression createSureCallOnlyForChain(PsiExpression expression, PsiType type) { - String conversion = (expression != null && expression instanceof PsiReferenceExpression && ((PsiReferenceExpression) expression).isQualified()) ? + String conversion = (expression != null && (expression instanceof PsiReferenceExpression || expression instanceof PsiMethodCallExpression)) ? createConversionForExpression(expression, type) : ""; return new SureCallChainExpression(expressionToExpression(expression), conversion); } diff --git a/testData/ast/issues/file/kt-820-string.jav b/testData/ast/issues/file/kt-820-string.jav new file mode 100644 index 00000000000..9bc81004c38 --- /dev/null +++ b/testData/ast/issues/file/kt-820-string.jav @@ -0,0 +1,6 @@ +class Test { + public static String toFileSystemSafeName(String name) { + int size = name.length(); + return name; + } +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-820-string.kt b/testData/ast/issues/file/kt-820-string.kt new file mode 100644 index 00000000000..53c1ae343e2 --- /dev/null +++ b/testData/ast/issues/file/kt-820-string.kt @@ -0,0 +1,8 @@ +open class Test() { +class object { +open public fun toFileSystemSafeName(name : String?) : String? { +var size : Int = name?.length().sure() +return name +} +} +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-824-isDir.jav b/testData/ast/issues/file/kt-824-isDir.jav new file mode 100644 index 00000000000..3429c9be45f --- /dev/null +++ b/testData/ast/issues/file/kt-824-isDir.jav @@ -0,0 +1,18 @@ +package test; +import java.io.File; + +/** + * User: ignatov + */ +public class Test { + public static boolean isDir(File parent) { + if (parent == null || !parent.exists()) { + return false; + } + boolean result = true; + if (parent.isDirectory()) { + return true; + } else + return false; + } +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-824-isDir.kt b/testData/ast/issues/file/kt-824-isDir.kt new file mode 100644 index 00000000000..9bae2da71ea --- /dev/null +++ b/testData/ast/issues/file/kt-824-isDir.kt @@ -0,0 +1,19 @@ +namespace test +import java.io.File +public open class Test() { +class object { +open public fun isDir(parent : File?) : Boolean { +if (((parent == null) || (!parent?.exists()))) +{ +return false +} +var result : Boolean = true +if (parent?.isDirectory().sure()) +{ +return true +} +else +return false +} +} +} \ No newline at end of file From 2ee8e1c08728dfb624f34a760dabc8f1767e4a87 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 14 Dec 2011 14:52:30 +0400 Subject: [PATCH 174/206] test for KT-828 added --- testData/ast/issues/file/kt-828.jav | 15 +++++++++++++++ testData/ast/issues/file/kt-828.kt | 14 ++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 testData/ast/issues/file/kt-828.jav create mode 100644 testData/ast/issues/file/kt-828.kt diff --git a/testData/ast/issues/file/kt-828.jav b/testData/ast/issues/file/kt-828.jav new file mode 100644 index 00000000000..682975f22e0 --- /dev/null +++ b/testData/ast/issues/file/kt-828.jav @@ -0,0 +1,15 @@ +class Test { + void test() { + boolean res = true; + res &= false; + res |= false; + res ^= false; + System.out.println(true & false); + System.out.println(true | false); + System.out.println(true ^ false); + System.out.println(!true); + + System.out.println(true && false); + System.out.println(true || false); + } +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-828.kt b/testData/ast/issues/file/kt-828.kt new file mode 100644 index 00000000000..e88498d1039 --- /dev/null +++ b/testData/ast/issues/file/kt-828.kt @@ -0,0 +1,14 @@ +open class Test() { +open fun test() : Unit { +var res : Boolean = true +res = (res and false) +res = (res or false) +res = (res xor false) +System.out?.println((true and false)) +System.out?.println((true or false)) +System.out?.println((true xor false)) +System.out?.println((!true)) +System.out?.println((true && false)) +System.out?.println((true || false)) +} +} \ No newline at end of file From a234445cefb810e123a706140380b1a0215b3fbe Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 14 Dec 2011 20:09:03 +0400 Subject: [PATCH 175/206] arrays supported more correclty --- .../j2k/ast/ArrayInitializerExpression.java | 6 +-- src/org/jetbrains/jet/j2k/ast/ArrayType.java | 10 ++++ .../ArrayWithoutInitializationExpression.java | 52 +++++++++++++++++++ src/org/jetbrains/jet/j2k/ast/INode.java | 2 +- src/org/jetbrains/jet/j2k/util/AstUtil.java | 6 +++ .../jet/j2k/visitors/ExpressionVisitor.java | 15 +++--- ...rayInitializationStatementWithDimension.kt | 2 +- ...lizationStatementWithDimensionExplicit.jav | 1 + .../statement/d2StringEmptyArray.jav | 1 + testData/ast/for/statement/forRangeWithLE.kt | 2 +- testData/ast/for/statement/forRangeWithLT.kt | 2 +- testData/ast/for/statement/forWithBlock.kt | 2 +- 12 files changed, 84 insertions(+), 17 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/ArrayWithoutInitializationExpression.java create mode 100644 testData/ast/arrayType/statement/arrayInitializationStatementWithDimensionExplicit.jav create mode 100644 testData/ast/arrayType/statement/d2StringEmptyArray.jav diff --git a/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java b/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java index a7ca9742535..7eef1d9bed1 100644 --- a/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java @@ -20,9 +20,9 @@ public class ArrayInitializerExpression extends Expression { @NotNull private static String createArrayFunction(@NotNull final Type type) { String sType = innerTypeStr(type); - if (!sType.equals("any") && PRIMITIVE_TYPES.contains(sType)) - return sType + "Array"; - return AstUtil.lowerFirstCharacter(type.convertedToNotNull().toKotlin()); + if (PRIMITIVE_TYPES.contains(sType)) + return sType + "Array"; // intArray + return AstUtil.lowerFirstCharacter(type.convertedToNotNull().toKotlin()); // array } @NotNull diff --git a/src/org/jetbrains/jet/j2k/ast/ArrayType.java b/src/org/jetbrains/jet/j2k/ast/ArrayType.java index 970535a327f..d78994faf55 100644 --- a/src/org/jetbrains/jet/j2k/ast/ArrayType.java +++ b/src/org/jetbrains/jet/j2k/ast/ArrayType.java @@ -12,6 +12,16 @@ public class ArrayType extends Type { myType = type; } + public Type getInnerType() { + return myType; + } + + @NotNull + @Override + public Kind getKind() { + return Kind.ARRAY_TYPE; + } + @NotNull @Override public String toKotlin() { diff --git a/src/org/jetbrains/jet/j2k/ast/ArrayWithoutInitializationExpression.java b/src/org/jetbrains/jet/j2k/ast/ArrayWithoutInitializationExpression.java new file mode 100644 index 00000000000..c4ddf5ac24b --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/ArrayWithoutInitializationExpression.java @@ -0,0 +1,52 @@ +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 ArrayWithoutInitializationExpression extends Expression { + private final Type myType; + private final List myExpressions; + + public ArrayWithoutInitializationExpression(Type type, List expressions) { + myType = type; + myExpressions = expressions; + } + + @NotNull + @Override + public String toKotlin() { + if (myType.getKind() == Kind.ARRAY_TYPE) { + if (myExpressions.size() == 1) + return oneDim(myType, myExpressions.get(0)); + if (myExpressions.size() == 2) { + Type innerType = ((ArrayType) myType).getInnerType(); + return oneDim(myType, myExpressions.get(0), "{" + SPACE + + oneDim(innerType, myExpressions.get(1)) + SPACE + "}"); + } + } + return getConstructorName(myType); + } + + private static String oneDim(Type type, Expression size) { + return oneDim(type, size, EMPTY); + } + + private static String oneDim(Type type, Expression size, String init) { + String commaWithInit = init.isEmpty() ? EMPTY : COMMA_WITH_SPACE + init; + return getConstructorName(type) + "(" + size.toKotlin() + commaWithInit + ")"; + } + + public static String getConstructorName(Type type) { +// if (type instanceof ArrayType) { +// String innerTypeStr = ((ArrayType) type).getInnerType().toKotlin().toLowerCase(); +// if (PRIMITIVE_TYPES.contains(innerTypeStr)) +// return innerTypeStr + "Array"; +// } + return AstUtil.replaceLastQuest(type.toKotlin()); + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/INode.java b/src/org/jetbrains/jet/j2k/ast/INode.java index d40f7b5080e..a0ce67afaae 100644 --- a/src/org/jetbrains/jet/j2k/ast/INode.java +++ b/src/org/jetbrains/jet/j2k/ast/INode.java @@ -13,6 +13,6 @@ public interface INode { public Kind getKind(); public enum Kind { - UNDEFINED, TYPE, CONSTRUCTOR, BREAK, CONTINUE, VARARG, TRAIT, ASSIGNMENT_EXPRESSION, CALL_CHAIN, LITERAL, + UNDEFINED, TYPE, CONSTRUCTOR, BREAK, CONTINUE, VARARG, TRAIT, ASSIGNMENT_EXPRESSION, CALL_CHAIN, LITERAL, ARRAY_TYPE, } } diff --git a/src/org/jetbrains/jet/j2k/util/AstUtil.java b/src/org/jetbrains/jet/j2k/util/AstUtil.java index 21c991ad932..e9d114a7fd5 100644 --- a/src/org/jetbrains/jet/j2k/util/AstUtil.java +++ b/src/org/jetbrains/jet/j2k/util/AstUtil.java @@ -87,4 +87,10 @@ public class AstUtil { return map.get(e); return orElse; } + + public static String replaceLastQuest(String str) { + if (str.endsWith("?")) + return str.substring(0, str.length() - 1); + return str; + } } diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index eb9a541fbac..80ee20ce3c1 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -214,11 +214,10 @@ public class ExpressionVisitor extends StatementVisitor { @Override public void visitNewExpression(@NotNull PsiNewExpression expression) { super.visitNewExpression(expression); - - if (expression.getArrayInitializer() != null) // new Foo[] {} + if (expression.getArrayInitializer() != null) // new Foo[] {Foo(1), Foo(2)} myResult = createNewEmptyArray(expression); else if (expression.getArrayDimensions().length > 0) { // new Foo[5] - myResult = createNewNonEmptyArray(expression); + myResult = createNewEmptyArrayWithoutInitialization(expression); } else { // new Class(): common case myResult = createNewClassExpression(expression); } @@ -254,12 +253,10 @@ public class ExpressionVisitor extends StatementVisitor { } @NotNull - private static NewClassExpression createNewNonEmptyArray(@NotNull PsiNewExpression expression) { - final List callExpression = expressionsToExpressionList(expression.getArrayDimensions()); - callExpression.add(new IdentifierImpl("{null}")); // TODO: remove - return new NewClassExpression( - typeToType(expression.getType()), - callExpression + private static Expression createNewEmptyArrayWithoutInitialization(@NotNull PsiNewExpression expression) { + return new ArrayWithoutInitializationExpression( + typeToType(expression.getType(), true), + expressionsToExpressionList(expression.getArrayDimensions()) ); } diff --git a/testData/ast/arrayType/statement/arrayInitializationStatementWithDimension.kt b/testData/ast/arrayType/statement/arrayInitializationStatementWithDimension.kt index 3add329fe03..ea4fcc7e35e 100644 --- a/testData/ast/arrayType/statement/arrayInitializationStatementWithDimension.kt +++ b/testData/ast/arrayType/statement/arrayInitializationStatementWithDimension.kt @@ -1 +1 @@ -var d2 : Array? = Array?(5, {null}) \ No newline at end of file +var d2 : Array? = Array(5) \ No newline at end of file diff --git a/testData/ast/arrayType/statement/arrayInitializationStatementWithDimensionExplicit.jav b/testData/ast/arrayType/statement/arrayInitializationStatementWithDimensionExplicit.jav new file mode 100644 index 00000000000..fe4a268f124 --- /dev/null +++ b/testData/ast/arrayType/statement/arrayInitializationStatementWithDimensionExplicit.jav @@ -0,0 +1 @@ +int [][] d2 = new int[5][5]; \ No newline at end of file diff --git a/testData/ast/arrayType/statement/d2StringEmptyArray.jav b/testData/ast/arrayType/statement/d2StringEmptyArray.jav new file mode 100644 index 00000000000..d49028c3fe0 --- /dev/null +++ b/testData/ast/arrayType/statement/d2StringEmptyArray.jav @@ -0,0 +1 @@ +String [][] ss = new String[5][5]; \ No newline at end of file diff --git a/testData/ast/for/statement/forRangeWithLE.kt b/testData/ast/for/statement/forRangeWithLE.kt index 125e3d65192..79c11ab6288 100644 --- a/testData/ast/for/statement/forRangeWithLE.kt +++ b/testData/ast/for/statement/forRangeWithLE.kt @@ -1,4 +1,4 @@ -var array : IntArray? = IntArray?(10, {null}) +var array : IntArray? = IntArray(10) for (i in 0..10) { array[i] = i } \ No newline at end of file diff --git a/testData/ast/for/statement/forRangeWithLT.kt b/testData/ast/for/statement/forRangeWithLT.kt index a5a4520c43a..e1431c409fb 100644 --- a/testData/ast/for/statement/forRangeWithLT.kt +++ b/testData/ast/for/statement/forRangeWithLT.kt @@ -1,4 +1,4 @@ -var array : IntArray? = IntArray?(10, {null}) +var array : IntArray? = IntArray(10) for (i in 0..(10 - 1)) { array[i] = i } \ No newline at end of file diff --git a/testData/ast/for/statement/forWithBlock.kt b/testData/ast/for/statement/forWithBlock.kt index a5a4520c43a..e1431c409fb 100644 --- a/testData/ast/for/statement/forWithBlock.kt +++ b/testData/ast/for/statement/forWithBlock.kt @@ -1,4 +1,4 @@ -var array : IntArray? = IntArray?(10, {null}) +var array : IntArray? = IntArray(10) for (i in 0..(10 - 1)) { array[i] = i } \ No newline at end of file From a1ff304b934e40da9dcfb50a2e80b3b9815aba3e Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 15 Dec 2011 12:38:08 +0400 Subject: [PATCH 176/206] forgotted tests --- .../arrayInitializationStatementWithDimensionExplicit.kt | 1 + testData/ast/arrayType/statement/d2StringEmptyArray.kt | 1 + 2 files changed, 2 insertions(+) create mode 100644 testData/ast/arrayType/statement/arrayInitializationStatementWithDimensionExplicit.kt create mode 100644 testData/ast/arrayType/statement/d2StringEmptyArray.kt diff --git a/testData/ast/arrayType/statement/arrayInitializationStatementWithDimensionExplicit.kt b/testData/ast/arrayType/statement/arrayInitializationStatementWithDimensionExplicit.kt new file mode 100644 index 00000000000..bf59ae0d269 --- /dev/null +++ b/testData/ast/arrayType/statement/arrayInitializationStatementWithDimensionExplicit.kt @@ -0,0 +1 @@ +var d2 : Array? = Array(5, { IntArray(5) }) \ No newline at end of file diff --git a/testData/ast/arrayType/statement/d2StringEmptyArray.kt b/testData/ast/arrayType/statement/d2StringEmptyArray.kt new file mode 100644 index 00000000000..f534425f354 --- /dev/null +++ b/testData/ast/arrayType/statement/d2StringEmptyArray.kt @@ -0,0 +1 @@ +var ss : Array?>? = Array?>(5, { Array(5) }) \ No newline at end of file From 06e87927c245c8587c0c560af3ae31698e74bcc9 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 15 Dec 2011 12:48:06 +0400 Subject: [PATCH 177/206] arrays of any dimension are supported --- .../ArrayWithoutInitializationExpression.java | 35 ++++++++++--------- src/org/jetbrains/jet/j2k/util/AstUtil.java | 6 ++-- ...InitializationStatementWithDimension3d.jav | 1 + ...yInitializationStatementWithDimension3d.kt | 1 + ...alizationStatementWithDimensionExplicit.kt | 2 +- .../arrayType/statement/d2StringEmptyArray.kt | 2 +- .../statement/d3StringEmptyArray.jav | 1 + .../arrayType/statement/d3StringEmptyArray.kt | 1 + 8 files changed, 28 insertions(+), 21 deletions(-) create mode 100644 testData/ast/arrayType/statement/arrayInitializationStatementWithDimension3d.jav create mode 100644 testData/ast/arrayType/statement/arrayInitializationStatementWithDimension3d.kt create mode 100644 testData/ast/arrayType/statement/d3StringEmptyArray.jav create mode 100644 testData/ast/arrayType/statement/d3StringEmptyArray.kt diff --git a/src/org/jetbrains/jet/j2k/ast/ArrayWithoutInitializationExpression.java b/src/org/jetbrains/jet/j2k/ast/ArrayWithoutInitializationExpression.java index c4ddf5ac24b..045663abf7c 100644 --- a/src/org/jetbrains/jet/j2k/ast/ArrayWithoutInitializationExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/ArrayWithoutInitializationExpression.java @@ -20,33 +20,34 @@ public class ArrayWithoutInitializationExpression extends Expression { @NotNull @Override public String toKotlin() { - if (myType.getKind() == Kind.ARRAY_TYPE) { - if (myExpressions.size() == 1) - return oneDim(myType, myExpressions.get(0)); - if (myExpressions.size() == 2) { - Type innerType = ((ArrayType) myType).getInnerType(); - return oneDim(myType, myExpressions.get(0), "{" + SPACE + - oneDim(innerType, myExpressions.get(1)) + SPACE + "}"); - } - } + if (myType.getKind() == Kind.ARRAY_TYPE) + return constructInnerType((ArrayType) myType, myExpressions); return getConstructorName(myType); } - private static String oneDim(Type type, Expression size) { + @NotNull + private static String constructInnerType(@NotNull ArrayType hostType, @NotNull List expressions) { + if (expressions.size() == 1) + return oneDim(hostType, expressions.get(0)); + Type innerType = hostType.getInnerType(); + if (expressions.size() > 1 && innerType.getKind() == Kind.ARRAY_TYPE) + return oneDim(hostType, expressions.get(0), "{" + constructInnerType((ArrayType) innerType, expressions.subList(1, expressions.size())) + "}"); + return getConstructorName(hostType); + } + + @NotNull + private static String oneDim(@NotNull Type type, @NotNull Expression size) { return oneDim(type, size, EMPTY); } - private static String oneDim(Type type, Expression size, String init) { + @NotNull + private static String oneDim(@NotNull Type type, @NotNull Expression size, @NotNull String init) { String commaWithInit = init.isEmpty() ? EMPTY : COMMA_WITH_SPACE + init; return getConstructorName(type) + "(" + size.toKotlin() + commaWithInit + ")"; } - public static String getConstructorName(Type type) { -// if (type instanceof ArrayType) { -// String innerTypeStr = ((ArrayType) type).getInnerType().toKotlin().toLowerCase(); -// if (PRIMITIVE_TYPES.contains(innerTypeStr)) -// return innerTypeStr + "Array"; -// } + @NotNull + public static String getConstructorName(@NotNull Type type) { return AstUtil.replaceLastQuest(type.toKotlin()); } } diff --git a/src/org/jetbrains/jet/j2k/util/AstUtil.java b/src/org/jetbrains/jet/j2k/util/AstUtil.java index e9d114a7fd5..3f4718a8da5 100644 --- a/src/org/jetbrains/jet/j2k/util/AstUtil.java +++ b/src/org/jetbrains/jet/j2k/util/AstUtil.java @@ -82,13 +82,15 @@ public class AstUtil { return "(" + f + ")" + s; } - public static T getOrElse(@NotNull Map map, T e, T orElse) { + @NotNull + public static T getOrElse(@NotNull Map map, @NotNull T e, @NotNull T orElse) { if (map.containsKey(e)) return map.get(e); return orElse; } - public static String replaceLastQuest(String str) { + @NotNull + public static String replaceLastQuest(@NotNull String str) { if (str.endsWith("?")) return str.substring(0, str.length() - 1); return str; diff --git a/testData/ast/arrayType/statement/arrayInitializationStatementWithDimension3d.jav b/testData/ast/arrayType/statement/arrayInitializationStatementWithDimension3d.jav new file mode 100644 index 00000000000..abe20f1ec57 --- /dev/null +++ b/testData/ast/arrayType/statement/arrayInitializationStatementWithDimension3d.jav @@ -0,0 +1 @@ +int [][][] d3 = new int[5][5][]; \ No newline at end of file diff --git a/testData/ast/arrayType/statement/arrayInitializationStatementWithDimension3d.kt b/testData/ast/arrayType/statement/arrayInitializationStatementWithDimension3d.kt new file mode 100644 index 00000000000..95be479049e --- /dev/null +++ b/testData/ast/arrayType/statement/arrayInitializationStatementWithDimension3d.kt @@ -0,0 +1 @@ +var d3 : Array?>? = Array?>(5, {Array(5)}) \ No newline at end of file diff --git a/testData/ast/arrayType/statement/arrayInitializationStatementWithDimensionExplicit.kt b/testData/ast/arrayType/statement/arrayInitializationStatementWithDimensionExplicit.kt index bf59ae0d269..32ac4491c66 100644 --- a/testData/ast/arrayType/statement/arrayInitializationStatementWithDimensionExplicit.kt +++ b/testData/ast/arrayType/statement/arrayInitializationStatementWithDimensionExplicit.kt @@ -1 +1 @@ -var d2 : Array? = Array(5, { IntArray(5) }) \ No newline at end of file +var d2 : Array? = Array(5, {IntArray(5)}) \ No newline at end of file diff --git a/testData/ast/arrayType/statement/d2StringEmptyArray.kt b/testData/ast/arrayType/statement/d2StringEmptyArray.kt index f534425f354..a4786c4ecb1 100644 --- a/testData/ast/arrayType/statement/d2StringEmptyArray.kt +++ b/testData/ast/arrayType/statement/d2StringEmptyArray.kt @@ -1 +1 @@ -var ss : Array?>? = Array?>(5, { Array(5) }) \ No newline at end of file +var ss : Array?>? = Array?>(5, {Array(5)}) \ No newline at end of file diff --git a/testData/ast/arrayType/statement/d3StringEmptyArray.jav b/testData/ast/arrayType/statement/d3StringEmptyArray.jav new file mode 100644 index 00000000000..498743daff6 --- /dev/null +++ b/testData/ast/arrayType/statement/d3StringEmptyArray.jav @@ -0,0 +1 @@ +String [][][] sss = new String[5][5][5]; \ No newline at end of file diff --git a/testData/ast/arrayType/statement/d3StringEmptyArray.kt b/testData/ast/arrayType/statement/d3StringEmptyArray.kt new file mode 100644 index 00000000000..7e3bd1cb471 --- /dev/null +++ b/testData/ast/arrayType/statement/d3StringEmptyArray.kt @@ -0,0 +1 @@ +var sss : Array?>?>? = Array?>?>(5, {Array?>(5, {Array(5)})}) \ No newline at end of file From 4361dce2b0a4fce3162c3efb2a44d761145bc623 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 15 Dec 2011 13:30:23 +0400 Subject: [PATCH 178/206] KT-837 Problem with equals conversion --- src/org/jetbrains/jet/j2k/Converter.java | 7 ++++--- .../jet/j2k/visitors/StatementVisitor.java | 11 ++++------- testData/ast/issues/file/kt-794.kt | 2 +- testData/ast/issues/file/kt-820-field.kt | 2 +- testData/ast/issues/file/kt-820.kt | 2 +- testData/ast/issues/file/kt-837.jav | 19 +++++++++++++++++++ testData/ast/issues/file/kt-837.kt | 16 ++++++++++++++++ 7 files changed, 46 insertions(+), 13 deletions(-) create mode 100644 testData/ast/issues/file/kt-837.jav create mode 100644 testData/ast/issues/file/kt-837.kt diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 0f44eef8c30..a448b78d4a1 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -591,11 +591,12 @@ public class Converter { if (expression != null) { PsiType actualType = expression.getType(); if (actualType != null) { + if (Node.PRIMITIVE_TYPES.contains(actualType.getCanonicalText()) && (expression instanceof PsiReferenceExpression + && ((PsiReferenceExpression) expression).isQualified() || expression instanceof PsiMethodCallExpression) + && expressionToExpression(expression).toKotlin().contains("?.")) + conversion += ".sure()"; if (isConversionNeeded(actualType, expectedType)) conversion += getPrimitiveTypeConversion(expectedType.getCanonicalText()); - if (Node.PRIMITIVE_TYPES.contains(actualType.getCanonicalText()) && (expression instanceof PsiReferenceExpression && ((PsiReferenceExpression) expression).isQualified() || - expression instanceof PsiMethodCallExpression)) - conversion += ".sure()"; } } return conversion; diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index 53f34e4004a..d5bba48f06d 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -347,15 +347,12 @@ public class StatementVisitor extends ElementVisitor { public void visitReturnStatement(@NotNull PsiReturnStatement statement) { super.visitReturnStatement(statement); PsiExpression returnValue = statement.getReturnValue(); - String conversion = ""; - PsiType methodReturnType = Converter.getMethodReturnType(); - if (returnValue != null && methodReturnType != null && isConversionNeeded(returnValue.getType(), methodReturnType)) { - conversion = getPrimitiveTypeConversion(methodReturnType.getCanonicalText()); - } + Expression expression = returnValue != null && methodReturnType != null ? + createSureCallOnlyForChain(returnValue, methodReturnType) : + expressionToExpression(returnValue); myResult = new ReturnStatement( - expressionToExpression(returnValue), - conversion + expression ); } } diff --git a/testData/ast/issues/file/kt-794.kt b/testData/ast/issues/file/kt-794.kt index 2cc75b06dc2..11a2802bf74 100644 --- a/testData/ast/issues/file/kt-794.kt +++ b/testData/ast/issues/file/kt-794.kt @@ -1,6 +1,6 @@ open class Test() { open fun getInt() : Int { var b : Byte = 10 -return (b).int +return b.int } } \ No newline at end of file diff --git a/testData/ast/issues/file/kt-820-field.kt b/testData/ast/issues/file/kt-820-field.kt index 7326083fac8..77fb95f2c19 100644 --- a/testData/ast/issues/file/kt-820-field.kt +++ b/testData/ast/issues/file/kt-820-field.kt @@ -8,5 +8,5 @@ var myContainer : Container? = Container() } } open class Test() { -var b : Byte = One.myContainer?.myInt.byt.sure() +var b : Byte = One.myContainer?.myInt.sure().byt } \ No newline at end of file diff --git a/testData/ast/issues/file/kt-820.kt b/testData/ast/issues/file/kt-820.kt index 6fd43add913..56fb9bc0682 100644 --- a/testData/ast/issues/file/kt-820.kt +++ b/testData/ast/issues/file/kt-820.kt @@ -9,6 +9,6 @@ var myContainer : Container? = Container() } open class Test() { open fun test() : Unit { -var b : Byte = One.myContainer?.myInt.byt.sure() +var b : Byte = One.myContainer?.myInt.sure().byt } } \ No newline at end of file diff --git a/testData/ast/issues/file/kt-837.jav b/testData/ast/issues/file/kt-837.jav new file mode 100644 index 00000000000..c1f41afeccf --- /dev/null +++ b/testData/ast/issues/file/kt-837.jav @@ -0,0 +1,19 @@ +package com.voltvoodoo.saplo4j.model; + +import java.io.Serializable; + +public class Language implements Serializable { + public static Language ENGLISH = new Language("en"); + public static Language SWEDISH = new Language("sv"); + + protected String code; + private static final long serialVersionUID = -2442762969929206780L; + + public Language(String code) { + this.code = code; + } + + public boolean equals(Language other) { + return other.toString().equals(this.toString()); + } +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-837.kt b/testData/ast/issues/file/kt-837.kt new file mode 100644 index 00000000000..17e9e95c040 --- /dev/null +++ b/testData/ast/issues/file/kt-837.kt @@ -0,0 +1,16 @@ +namespace com.voltvoodoo.saplo4j.model +import java.io.Serializable +public open class Language(code : String?) : Serializable { +{ +this.$code = code +} +protected var code : String? = null +open public fun equals(other : Language?) : Boolean { +return other?.toString()?.equals(this.toString()).sure() +} +class object { +public var ENGLISH : Language? = Language("en") +public var SWEDISH : Language? = Language("sv") +private val serialVersionUID : Long = (-2442762969929206780) +} +} \ No newline at end of file From 115a170f5b4674b505f3321c60e8d517a73b3917 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 15 Dec 2011 15:49:51 +0400 Subject: [PATCH 179/206] KT-836 Override toString() more correctly --- src/org/jetbrains/jet/j2k/Converter.java | 35 +++++++++++++++++++++++- testData/ast/issues/file/kt-836.jav | 30 ++++++++++++++++++++ testData/ast/issues/file/kt-836.kt | 25 +++++++++++++++++ 3 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 testData/ast/issues/file/kt-836.jav create mode 100644 testData/ast/issues/file/kt-836.kt diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index a448b78d4a1..17159937e0c 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -364,6 +364,28 @@ public class Converter { } private static boolean isOverrideAnyMethodExceptMethodsFromObject(@NotNull PsiMethod method) { + boolean counter = normalCase(method); + if (counter) + return true; + if (isInheritFromObject(method)) + return caseForObject(method); + return false; + } + + private static boolean caseForObject(@NotNull PsiMethod method) { + PsiClass containing = method.getContainingClass(); + if (containing != null) { + for (PsiClassType s : containing.getSuperTypes()) { + String canonicalText = s.getCanonicalText(); + if (!canonicalText.equals("java.lang.Object") && !getClassIdentifiers().contains(canonicalText)) { + return true; + } + } + } + return false; + } + + private static boolean normalCase(@NotNull PsiMethod method) { int counter = 0; for (HierarchicalMethodSignature s : method.getHierarchicalMethodSignature().getSuperSignatures()) { PsiClass containingClass = s.getMethod().getContainingClass(); @@ -374,6 +396,17 @@ public class Converter { return counter > 0; } + private static boolean isInheritFromObject(@NotNull PsiMethod method) { + List superSignatures = method.getHierarchicalMethodSignature().getSuperSignatures(); + for (HierarchicalMethodSignature s : superSignatures) { + PsiClass containingClass = s.getMethod().getContainingClass(); + String qualifiedName = containingClass != null ? containingClass.getQualifiedName() : ""; + if (qualifiedName != null && qualifiedName.equals("java.lang.Object")) + return true; + } + return false; + } + private static boolean isOverrideObjectDirect(@NotNull final PsiMethod method) { List superSignatures = method.getHierarchicalMethodSignature().getSuperSignatures(); if (superSignatures.size() == 1) { @@ -652,7 +685,7 @@ public class Converter { // } @NotNull - public static SureCallChainExpression createSureCallOnlyForChain(PsiExpression expression, PsiType type) { + public static SureCallChainExpression createSureCallOnlyForChain(@Nullable PsiExpression expression, @NotNull PsiType type) { String conversion = (expression != null && (expression instanceof PsiReferenceExpression || expression instanceof PsiMethodCallExpression)) ? createConversionForExpression(expression, type) : ""; return new SureCallChainExpression(expressionToExpression(expression), conversion); diff --git a/testData/ast/issues/file/kt-836.jav b/testData/ast/issues/file/kt-836.jav new file mode 100644 index 00000000000..99d0b460e3a --- /dev/null +++ b/testData/ast/issues/file/kt-836.jav @@ -0,0 +1,30 @@ +package com.voltvoodoo.saplo4j.model; + +import java.io.Serializable; + +public class Language implements Serializable { + protected String code; + + public Language(String code) { + this.code = code; + } + + public String toString() { + return this.code; + } +} + + +class Base { + void test() {} + String toString() { + return "BASE"; + } +} + +class Child extends Base { + void test() {} + String toString() { + return "Child"; + } +} diff --git a/testData/ast/issues/file/kt-836.kt b/testData/ast/issues/file/kt-836.kt new file mode 100644 index 00000000000..3a73a7a4d52 --- /dev/null +++ b/testData/ast/issues/file/kt-836.kt @@ -0,0 +1,25 @@ +namespace com.voltvoodoo.saplo4j.model +import java.io.Serializable +public open class Language(code : String?) : Serializable { +{ +this.$code = code +} +protected var code : String? = null +override public fun toString() : String? { +return this.code +} +} +open class Base() { +open fun test() : Unit { +} +open fun toString() : String? { +return "BASE" +} +} +open class Child() : Base() { +override fun test() : Unit { +} +override fun toString() : String? { +return "Child" +} +} \ No newline at end of file From bb499697fc18a4d07f8dda8688c18fd3cbc1890b Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Fri, 16 Dec 2011 15:25:29 +0400 Subject: [PATCH 180/206] remove dollar usages from the whole project --- src/org/jetbrains/jet/j2k/Converter.java | 5 +++-- src/org/jetbrains/jet/j2k/ast/Identifier.java | 2 ++ .../jetbrains/jet/j2k/ast/IdentifierImpl.java | 15 ++++++--------- src/org/jetbrains/jet/j2k/ast/Node.java | 2 -- .../jet/j2k/visitors/ExpressionVisitor.java | 19 ++++++++----------- .../ast/annotations/file/jetbrainsNotNull.kt | 2 +- .../ast/constructors/file/allCallsPrimary2.kt | 6 +++--- .../ast/constructors/file/customerBuilder.kt | 4 ++-- .../constructors/file/genericIdentifier.kt | 6 +++--- testData/ast/constructors/file/identifier.kt | 6 +++--- .../file/withManyDefaultParams.kt | 18 +++++++++--------- testData/ast/enum/class/colorEnum.kt | 2 +- .../fieldsWithPrimaryPrivateConstructor.kt | 2 +- .../enum/class/primaryPrivateConstructor.kt | 2 +- .../identifier/file/finalFieldReference.kt | 2 +- .../file/classOneExtendsBaseGeneric.kt | 2 +- ...dsBaseWithZeroParamsNonEmptyConstructor.kt | 2 +- testData/ast/issues/file/kt-836.kt | 2 +- testData/ast/issues/file/kt-837.kt | 2 +- 19 files changed, 48 insertions(+), 53 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 17159937e0c..e9301575576 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -115,7 +115,8 @@ public class Converter { @NotNull private static List createParametersFromFields(@NotNull List fields) { List result = new LinkedList(); - for (Field f : fields) result.add(new Parameter(f.getIdentifier(), f.getType())); + for (Field f : fields) + result.add(new Parameter(new IdentifierImpl("_" + f.getIdentifier().getName()), f.getType())); return result; } @@ -124,7 +125,7 @@ public class Converter { List result = new LinkedList(); for (Field f : fields) { final String identifierToKotlin = f.getIdentifier().toKotlin(); - result.add(new DummyStringExpression("$" + identifierToKotlin + " = " + identifierToKotlin)); + result.add(new DummyStringExpression(identifierToKotlin + " = " + "_" + identifierToKotlin)); } return result; } diff --git a/src/org/jetbrains/jet/j2k/ast/Identifier.java b/src/org/jetbrains/jet/j2k/ast/Identifier.java index e1b095fb240..9ddbe91eb56 100644 --- a/src/org/jetbrains/jet/j2k/ast/Identifier.java +++ b/src/org/jetbrains/jet/j2k/ast/Identifier.java @@ -10,4 +10,6 @@ public interface Identifier extends INode { public static Identifier EMPTY_IDENTIFIER = new IdentifierImpl(""); public boolean isEmpty(); + + String getName(); } diff --git a/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java b/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java index 8d01bcdf8a7..6a1b4fbff11 100644 --- a/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java +++ b/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java @@ -7,7 +7,6 @@ import org.jetbrains.annotations.NotNull; */ public class IdentifierImpl extends Expression implements Identifier { private final String myName; - private boolean myHasDollar = false; private boolean myIsNullable = true; private boolean myQuotingNeeded = true; @@ -20,14 +19,9 @@ public class IdentifierImpl extends Expression implements Identifier { myIsNullable = isNullable; } - public IdentifierImpl(String name, boolean hasDollar, boolean isNullable) { + public IdentifierImpl(String name, boolean isNullable, boolean quotingNeeded) { myName = name; - myHasDollar = hasDollar; myIsNullable = isNullable; - } - - public IdentifierImpl(String name, boolean hasDollar, boolean isNullable, boolean quotingNeeded) { - this(name, hasDollar, isNullable); myQuotingNeeded = quotingNeeded; } @@ -36,6 +30,11 @@ public class IdentifierImpl extends Expression implements Identifier { return myName.length() == 0; } + @Override + public String getName() { + return myName; + } + @NotNull private static String quote(String str) { return BACKTICK + str + BACKTICK; @@ -55,8 +54,6 @@ public class IdentifierImpl extends Expression implements Identifier { @NotNull @Override public String toKotlin() { - if (myHasDollar) - return DOLLAR + ifNeedQuote(); return ifNeedQuote(); } } \ 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 3d3b934e603..d1df1727e18 100644 --- a/src/org/jetbrains/jet/j2k/ast/Node.java +++ b/src/org/jetbrains/jet/j2k/ast/Node.java @@ -46,8 +46,6 @@ public abstract class Node implements INode { @NotNull static final String AT = "@"; @NotNull - static final String DOLLAR = "$"; - @NotNull static final String BACKTICK = "`"; @NotNull static final String QUEST = "?"; diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 80ee20ce3c1..d61d6a4791b 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -6,7 +6,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.j2k.ast.*; -import java.util.*; +import java.util.Collections; +import java.util.List; import static org.jetbrains.jet.j2k.Converter.*; @@ -188,7 +189,7 @@ public class ExpressionVisitor extends StatementVisitor { if (canonicalTypeStr.equals("char") || canonicalTypeStr.equals("java.lang.Character")) isQuotingNeeded = false; } - myResult = new LiteralExpression(new IdentifierImpl(text, false, false, isQuotingNeeded)); + myResult = new LiteralExpression(new IdentifierImpl(text, false, isQuotingNeeded)); } @Override @@ -310,15 +311,11 @@ public class ExpressionVisitor extends StatementVisitor { Expression identifier = new IdentifierImpl(expression.getReferenceName(), isNullable); - if (hasDollar) - identifier = new IdentifierImpl(expression.getReferenceName(), hasDollar, isNullable); - else { - final String temporaryObject = "__"; - if (hasReceiver) - identifier = new CallChainExpression(new IdentifierImpl(temporaryObject, false), new IdentifierImpl(expression.getReferenceName(), isNullable)); - else if (insideSecondaryConstructor && isThis) - identifier = new IdentifierImpl("val " + temporaryObject + " = " + className); // TODO: hack - } + final String temporaryObject = "__"; + if (hasReceiver) + identifier = new CallChainExpression(new IdentifierImpl(temporaryObject, false), new IdentifierImpl(expression.getReferenceName(), isNullable)); + else if (insideSecondaryConstructor && isThis) + identifier = new IdentifierImpl("val " + temporaryObject + " = " + className); // TODO: hack myResult = new CallChainExpression( expressionToExpression(expression.getQualifierExpression()), diff --git a/testData/ast/annotations/file/jetbrainsNotNull.kt b/testData/ast/annotations/file/jetbrainsNotNull.kt index bd1969cabda..ebf15859e15 100644 --- a/testData/ast/annotations/file/jetbrainsNotNull.kt +++ b/testData/ast/annotations/file/jetbrainsNotNull.kt @@ -1,7 +1,7 @@ namespace test public open class Test(str : String) { { -$myStr = str +myStr = str } var myStr : String? = "String2" open public fun sout(str : String) : Unit { diff --git a/testData/ast/constructors/file/allCallsPrimary2.kt b/testData/ast/constructors/file/allCallsPrimary2.kt index 26c6110374f..31a0f698398 100644 --- a/testData/ast/constructors/file/allCallsPrimary2.kt +++ b/testData/ast/constructors/file/allCallsPrimary2.kt @@ -1,8 +1,8 @@ open class C(arg1 : Int) { { -$myArg1 = arg1 -$myArg2 = 0 -$myArg3 = 0 +myArg1 = arg1 +myArg2 = 0 +myArg3 = 0 } val myArg1 : Int = 0 var myArg2 : Int = 0 diff --git a/testData/ast/constructors/file/customerBuilder.kt b/testData/ast/constructors/file/customerBuilder.kt index e76788b5cbb..ab1461ed191 100644 --- a/testData/ast/constructors/file/customerBuilder.kt +++ b/testData/ast/constructors/file/customerBuilder.kt @@ -2,8 +2,8 @@ namespace org.test.customer open class Customer(first : String?, last : String?) { { doSmthBefore() -$_firstName = first -$_lastName = last +_firstName = first +_lastName = last doSmthAfter() } public val _firstName : String? = null diff --git a/testData/ast/constructors/file/genericIdentifier.kt b/testData/ast/constructors/file/genericIdentifier.kt index 1808639264c..249ba2f3b56 100644 --- a/testData/ast/constructors/file/genericIdentifier.kt +++ b/testData/ast/constructors/file/genericIdentifier.kt @@ -1,7 +1,7 @@ -public open class Identifier(myName : T?, myHasDollar : Boolean) { +public open class Identifier(_myName : T?, _myHasDollar : Boolean) { { -$myName = myName -$myHasDollar = myHasDollar +myName = _myName +myHasDollar = _myHasDollar } private val myName : T? = null private var myHasDollar : Boolean = false diff --git a/testData/ast/constructors/file/identifier.kt b/testData/ast/constructors/file/identifier.kt index 1abada8ea1a..4c296879705 100644 --- a/testData/ast/constructors/file/identifier.kt +++ b/testData/ast/constructors/file/identifier.kt @@ -1,7 +1,7 @@ -public open class Identifier(myName : String?, myHasDollar : Boolean) { +public open class Identifier(_myName : String?, _myHasDollar : Boolean) { { -$myName = myName -$myHasDollar = myHasDollar +myName = _myName +myHasDollar = _myHasDollar } private val myName : String? = null private var myHasDollar : Boolean = false diff --git a/testData/ast/constructors/file/withManyDefaultParams.kt b/testData/ast/constructors/file/withManyDefaultParams.kt index 60b8812a882..c18bb2aeeaf 100644 --- a/testData/ast/constructors/file/withManyDefaultParams.kt +++ b/testData/ast/constructors/file/withManyDefaultParams.kt @@ -1,13 +1,13 @@ -public open class Test(myName : String?, a : Boolean, b : Double, c : Float, d : Long, e : Int, f : Short, g : Char) { +public open class Test(_myName : String?, _a : Boolean, _b : Double, _c : Float, _d : Long, _e : Int, _f : Short, _g : Char) { { -$myName = myName -$a = a -$b = b -$c = c -$d = d -$e = e -$f = f -$g = g +myName = _myName +a = _a +b = _b +c = _c +d = _d +e = _e +f = _f +g = _g } private val myName : String? = null private var a : Boolean = false diff --git a/testData/ast/enum/class/colorEnum.kt b/testData/ast/enum/class/colorEnum.kt index 15a5f6f6892..694128a9518 100644 --- a/testData/ast/enum/class/colorEnum.kt +++ b/testData/ast/enum/class/colorEnum.kt @@ -1,7 +1,7 @@ namespace demo enum class MyEnum(_color : Int) { { -$color = _color +color = _color } RED : MyEnum(10) BLUE : MyEnum(20) diff --git a/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt b/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt index 91a687dd847..1795c0b93c4 100644 --- a/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt +++ b/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt @@ -1,6 +1,6 @@ enum class Color(c : Int) { { -$code = c +code = c } WHITE : Color(21) BLACK : Color(22) diff --git a/testData/ast/enum/class/primaryPrivateConstructor.kt b/testData/ast/enum/class/primaryPrivateConstructor.kt index 37889843d8b..d869ad519c1 100644 --- a/testData/ast/enum/class/primaryPrivateConstructor.kt +++ b/testData/ast/enum/class/primaryPrivateConstructor.kt @@ -1,7 +1,7 @@ namespace demo enum class Color(c : Int) { { -$code = c +code = c } private var code : Int = 0 public fun getCode() : Int { diff --git a/testData/ast/identifier/file/finalFieldReference.kt b/testData/ast/identifier/file/finalFieldReference.kt index fca7102759a..1d7011e3e3b 100644 --- a/testData/ast/identifier/file/finalFieldReference.kt +++ b/testData/ast/identifier/file/finalFieldReference.kt @@ -4,7 +4,7 @@ open class `$`() { } open class `$$`(`$$$$` : `$$$$$`?) : `$`() { { -$`$$$` = `$$$$` +`$$$` = `$$$$` } val `$$$` : `$$$$$`? = null open public fun `$$$$$$`() : `$$$$$`? { diff --git a/testData/ast/inheritance/file/classOneExtendsBaseGeneric.kt b/testData/ast/inheritance/file/classOneExtendsBaseGeneric.kt index 640e5926e8f..51aa2aaea5e 100644 --- a/testData/ast/inheritance/file/classOneExtendsBaseGeneric.kt +++ b/testData/ast/inheritance/file/classOneExtendsBaseGeneric.kt @@ -2,7 +2,7 @@ open class Base(name : T?) { } open class One(name : T?, second : K?) : Base(name) { { -$mySecond = second +mySecond = second } private var mySecond : K? = null } \ No newline at end of file diff --git a/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.kt b/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.kt index 37882b3a963..34975018246 100644 --- a/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.kt +++ b/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.kt @@ -2,7 +2,7 @@ open class Base(name : String?) { } open class One(name : String?, second : String?) : Base(name) { { -$mySecond = second +mySecond = second } private var mySecond : String? = null } \ No newline at end of file diff --git a/testData/ast/issues/file/kt-836.kt b/testData/ast/issues/file/kt-836.kt index 3a73a7a4d52..e80ed065e8a 100644 --- a/testData/ast/issues/file/kt-836.kt +++ b/testData/ast/issues/file/kt-836.kt @@ -2,7 +2,7 @@ namespace com.voltvoodoo.saplo4j.model import java.io.Serializable public open class Language(code : String?) : Serializable { { -this.$code = code +this.code = code } protected var code : String? = null override public fun toString() : String? { diff --git a/testData/ast/issues/file/kt-837.kt b/testData/ast/issues/file/kt-837.kt index 17e9e95c040..c2040e45d81 100644 --- a/testData/ast/issues/file/kt-837.kt +++ b/testData/ast/issues/file/kt-837.kt @@ -2,7 +2,7 @@ namespace com.voltvoodoo.saplo4j.model import java.io.Serializable public open class Language(code : String?) : Serializable { { -this.$code = code +this.code = code } protected var code : String? = null open public fun equals(other : Language?) : Boolean { From 5e6a4ce437a92de89ac14dd97da0fe659a000a14 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Fri, 16 Dec 2011 16:11:52 +0400 Subject: [PATCH 181/206] cleanup --- src/org/jetbrains/jet/j2k/Converter.java | 38 +++++++++--------- .../jet/j2k/visitors/ExpressionVisitor.java | 13 ++++--- ...ssionVisitorForDirectObjectInheritors.java | 4 +- .../jet/j2k/visitors/TypeVisitor.java | 39 ++++++++++++------- 4 files changed, 55 insertions(+), 39 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index e9301575576..2ace186d367 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -14,6 +14,8 @@ import org.jetbrains.jet.j2k.visitors.*; import java.util.*; +import static org.jetbrains.jet.j2k.visitors.TypeVisitor.*; + /** * @author ignatov */ @@ -378,7 +380,7 @@ public class Converter { if (containing != null) { for (PsiClassType s : containing.getSuperTypes()) { String canonicalText = s.getCanonicalText(); - if (!canonicalText.equals("java.lang.Object") && !getClassIdentifiers().contains(canonicalText)) { + if (!canonicalText.equals(JAVA_LANG_OBJECT) && !getClassIdentifiers().contains(canonicalText)) { return true; } } @@ -391,7 +393,7 @@ public class Converter { for (HierarchicalMethodSignature s : method.getHierarchicalMethodSignature().getSuperSignatures()) { PsiClass containingClass = s.getMethod().getContainingClass(); String qualifiedName = containingClass != null ? containingClass.getQualifiedName() : ""; - if (qualifiedName != null && !qualifiedName.equals("java.lang.Object")) + if (qualifiedName != null && !qualifiedName.equals(JAVA_LANG_OBJECT)) counter++; } return counter > 0; @@ -402,7 +404,7 @@ public class Converter { for (HierarchicalMethodSignature s : superSignatures) { PsiClass containingClass = s.getMethod().getContainingClass(); String qualifiedName = containingClass != null ? containingClass.getQualifiedName() : ""; - if (qualifiedName != null && qualifiedName.equals("java.lang.Object")) + if (qualifiedName != null && qualifiedName.equals(JAVA_LANG_OBJECT)) return true; } return false; @@ -413,7 +415,7 @@ public class Converter { if (superSignatures.size() == 1) { final PsiClass containingClass = superSignatures.get(0).getMethod().getContainingClass(); final String qualifiedName = containingClass != null ? containingClass.getQualifiedName() : ""; - if (qualifiedName != null && qualifiedName.equals("java.lang.Object")) + if (qualifiedName != null && qualifiedName.equals(JAVA_LANG_OBJECT)) return true; } return false; @@ -640,13 +642,13 @@ public class Converter { if (actual == null || expected == null) return false; Map typeMap = new HashMap(); - typeMap.put("java.lang.Byte", "byte"); - typeMap.put("java.lang.Short", "short"); - typeMap.put("java.lang.Integer", "int"); - typeMap.put("java.lang.Long", "long"); - typeMap.put("java.lang.Float", "float"); - typeMap.put("java.lang.Double", "double"); - typeMap.put("java.lang.Character", "char"); + typeMap.put(JAVA_LANG_BYTE, "byte"); + typeMap.put(JAVA_LANG_SHORT, "short"); + typeMap.put(JAVA_LANG_INTEGER, "int"); + typeMap.put(JAVA_LANG_LONG, "long"); + typeMap.put(JAVA_LANG_FLOAT, "float"); + typeMap.put(JAVA_LANG_DOUBLE, "double"); + typeMap.put(JAVA_LANG_CHARACTER, "char"); String expectedStr = expected.getCanonicalText(); String actualStr = actual.getCanonicalText(); boolean o1 = AstUtil.getOrElse(typeMap, actualStr, "").equals(expectedStr); @@ -665,13 +667,13 @@ public class Converter { conversions.put("double", "dbl"); conversions.put("char", "chr"); - conversions.put("java.lang.Byte", "byt"); - conversions.put("java.lang.Short", "sht"); - conversions.put("java.lang.Integer", "int"); - conversions.put("java.lang.Long", "lng"); - conversions.put("java.lang.Float", "flt"); - conversions.put("java.lang.Double", "dbl"); - conversions.put("java.lang.Character", "chr"); + conversions.put(JAVA_LANG_BYTE, "byt"); + conversions.put(JAVA_LANG_SHORT, "sht"); + conversions.put(JAVA_LANG_INTEGER, "int"); + conversions.put(JAVA_LANG_LONG, "lng"); + conversions.put(JAVA_LANG_FLOAT, "flt"); + conversions.put(JAVA_LANG_DOUBLE, "dbl"); + conversions.put(JAVA_LANG_CHARACTER, "chr"); if (conversions.containsKey(type)) return "." + conversions.get(type); diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index d61d6a4791b..3e71c5a0e60 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -10,6 +10,7 @@ import java.util.Collections; import java.util.List; import static org.jetbrains.jet.j2k.Converter.*; +import static org.jetbrains.jet.j2k.visitors.TypeVisitor.*; /** * @author ignatov @@ -175,18 +176,18 @@ public class ExpressionVisitor extends StatementVisitor { final PsiType type = expression.getType(); if (type != null) { String canonicalTypeStr = type.getCanonicalText(); - if (canonicalTypeStr.equals("double") || canonicalTypeStr.equals("java.lang.Double")) + if (canonicalTypeStr.equals("double") || canonicalTypeStr.equals(JAVA_LANG_DOUBLE)) text = text.replace("D", "").replace("d", ""); - if (canonicalTypeStr.equals("float") || canonicalTypeStr.equals("java.lang.Float")) + if (canonicalTypeStr.equals("float") || canonicalTypeStr.equals(JAVA_LANG_FLOAT)) text = text.replace("F", "").replace("f", "") + "." + "flt"; - if (canonicalTypeStr.equals("long") || canonicalTypeStr.equals("java.lang.Long")) + if (canonicalTypeStr.equals("long") || canonicalTypeStr.equals(JAVA_LANG_LONG)) text = text.replace("L", "").replace("l", ""); - if (canonicalTypeStr.equals("int") || canonicalTypeStr.equals("java.lang.Integer")) // need for hex support + if (canonicalTypeStr.equals("int") || canonicalTypeStr.equals(JAVA_LANG_INTEGER)) // need for hex support text = value != null ? value.toString() : text; - if (canonicalTypeStr.equals("java.lang.String")) + if (canonicalTypeStr.equals(JAVA_LANG_STRING)) isQuotingNeeded = false; - if (canonicalTypeStr.equals("char") || canonicalTypeStr.equals("java.lang.Character")) + if (canonicalTypeStr.equals("char") || canonicalTypeStr.equals(JAVA_LANG_CHARACTER)) isQuotingNeeded = false; } myResult = new LiteralExpression(new IdentifierImpl(text, false, isQuotingNeeded)); diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitorForDirectObjectInheritors.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitorForDirectObjectInheritors.java index 0af63b9f67f..1f184e161e2 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitorForDirectObjectInheritors.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitorForDirectObjectInheritors.java @@ -7,6 +7,8 @@ import org.jetbrains.jet.j2k.ast.DummyMethodCallExpression; import org.jetbrains.jet.j2k.ast.DummyStringExpression; import org.jetbrains.jet.j2k.ast.IdentifierImpl; +import static org.jetbrains.jet.j2k.visitors.TypeVisitor.JAVA_LANG_OBJECT; + /** * @author ignatov */ @@ -34,7 +36,7 @@ public class ExpressionVisitorForDirectObjectInheritors extends ExpressionVisito if (referenceName != null && referenceName.equals(methodName)) { if (qualifierExpression instanceof PsiSuperExpression) { PsiType type = qualifierExpression.getType(); - if (type != null && type.getCanonicalText().equals("java.lang.Object")) + if (type != null && type.getCanonicalText().equals(JAVA_LANG_OBJECT)) return true; } } diff --git a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java index a24aa109cef..85245920ca8 100644 --- a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java @@ -6,7 +6,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.j2k.ast.*; import org.jetbrains.jet.j2k.util.AstUtil; -import java.util.Iterator; import java.util.LinkedList; import java.util.List; @@ -17,6 +16,18 @@ import static org.jetbrains.jet.j2k.Converter.typesToTypeList; * @author ignatov */ public class TypeVisitor extends PsiTypeVisitor { + public static final String JAVA_LANG_BYTE = "java.lang.Byte"; + public static final String JAVA_LANG_CHARACTER = "java.lang.Character"; + public static final String JAVA_LANG_DOUBLE = "java.lang.Double"; + public static final String JAVA_LANG_FLOAT = "java.lang.Float"; + public static final String JAVA_LANG_INTEGER = "java.lang.Integer"; + public static final String JAVA_LANG_LONG = "java.lang.Long"; + public static final String JAVA_LANG_SHORT = "java.lang.Short"; + public static final String JAVA_LANG_BOOLEAN = "java.lang.Boolean"; + public static final String JAVA_LANG_OBJECT = "java.lang.Object"; + public static final String JAVA_LANG_STRING = "java.lang.String"; + public static final String JAVA_LANG_ITERABLE = "java.lang.Iterable"; + public static final String JAVA_UTIL_ITERATOR = "java.util.Iterator"; private Type myResult = Type.EMPTY_TYPE; @NotNull @@ -63,10 +74,10 @@ public class TypeVisitor extends PsiTypeVisitor { if (psiClass != null) { String qualifiedName = psiClass.getQualifiedName(); if (qualifiedName != null) { - if (qualifiedName.equals("java.lang.Iterable")) - return new IdentifierImpl("java.lang.Iterable"); - if (qualifiedName.equals("java.util.Iterator")) - return new IdentifierImpl("java.util.Iterator"); + if (qualifiedName.equals(JAVA_LANG_ITERABLE)) + return new IdentifierImpl(JAVA_LANG_ITERABLE); + if (qualifiedName.equals(JAVA_UTIL_ITERATOR)) + return new IdentifierImpl(JAVA_UTIL_ITERATOR); } } final String classTypeName = createQualifiedName(classType); @@ -115,15 +126,15 @@ public class TypeVisitor extends PsiTypeVisitor { @NotNull private static String getClassTypeName(@NotNull PsiClassType classType) { String canonicalTypeStr = classType.getCanonicalText(); - if (canonicalTypeStr.equals("java.lang.Object")) return "Any"; - if (canonicalTypeStr.equals("java.lang.Byte")) return "Byte"; - if (canonicalTypeStr.equals("java.lang.Character")) return "Char"; - if (canonicalTypeStr.equals("java.lang.Double")) return "Double"; - if (canonicalTypeStr.equals("java.lang.Float")) return "Float"; - if (canonicalTypeStr.equals("java.lang.Integer")) return "Int"; - if (canonicalTypeStr.equals("java.lang.Long")) return "Long"; - if (canonicalTypeStr.equals("java.lang.Short")) return "Short"; - if (canonicalTypeStr.equals("java.lang.Boolean")) return "Boolean"; + if (canonicalTypeStr.equals(JAVA_LANG_OBJECT)) return "Any"; + if (canonicalTypeStr.equals(JAVA_LANG_BYTE)) return "Byte"; + if (canonicalTypeStr.equals(JAVA_LANG_CHARACTER)) return "Char"; + if (canonicalTypeStr.equals(JAVA_LANG_DOUBLE)) return "Double"; + if (canonicalTypeStr.equals(JAVA_LANG_FLOAT)) return "Float"; + if (canonicalTypeStr.equals(JAVA_LANG_INTEGER)) return "Int"; + if (canonicalTypeStr.equals(JAVA_LANG_LONG)) return "Long"; + if (canonicalTypeStr.equals(JAVA_LANG_SHORT)) return "Short"; + if (canonicalTypeStr.equals(JAVA_LANG_BOOLEAN)) return "Boolean"; return classType.getClassName() != null ? classType.getClassName() : classType.getCanonicalText(); } From 512c811a68f2f0b064a0e69af3729e24a0330d7c Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Fri, 16 Dec 2011 16:22:20 +0400 Subject: [PATCH 182/206] cleanup --- j2k.ipr | 1 + src/org/jetbrains/jet/j2k/Converter.java | 6 +++--- .../jet/j2k/ast/ArrayInitializerExpression.java | 2 +- .../j2k/ast/ArrayWithoutInitializationExpression.java | 2 +- src/org/jetbrains/jet/j2k/ast/CaseContainer.java | 4 ++-- src/org/jetbrains/jet/j2k/ast/IMember.java | 2 +- src/org/jetbrains/jet/j2k/ast/INode.java | 6 +++--- src/org/jetbrains/jet/j2k/ast/Identifier.java | 4 ++-- src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java | 6 +++--- src/org/jetbrains/jet/j2k/ast/NewClassExpression.java | 2 +- src/org/jetbrains/jet/j2k/ast/Node.java | 2 +- src/org/jetbrains/jet/j2k/ast/SwitchContainer.java | 4 ++-- src/org/jetbrains/jet/j2k/ast/SwitchLabelStatement.java | 2 +- src/org/jetbrains/jet/j2k/visitors/ClassVisitor.java | 2 +- src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java | 2 +- .../jetbrains/jet/j2k/visitors/ExpressionVisitor.java | 9 ++++----- src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java | 3 +++ src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java | 6 +++--- .../org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java | 2 +- test/org/jetbrains/jet/j2k/TestCaseBuilder.java | 4 ++-- 20 files changed, 37 insertions(+), 34 deletions(-) diff --git a/j2k.ipr b/j2k.ipr index fcc01311ac1..f175e7ecb1a 100644 --- a/j2k.ipr +++ b/j2k.ipr @@ -585,6 +585,7 @@ kotlin nullable + ushr diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 2ace186d367..c2a032164fe 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -622,7 +622,7 @@ public class Converter { } @NotNull - public static String createConversionForExpression(@Nullable PsiExpression expression, @NotNull PsiType expectedType) { + private static String createConversionForExpression(@Nullable PsiExpression expression, @NotNull PsiType expectedType) { String conversion = ""; if (expression != null) { PsiType actualType = expression.getType(); @@ -638,7 +638,7 @@ public class Converter { return conversion; } - public static boolean isConversionNeeded(@Nullable final PsiType actual, @Nullable final PsiType expected) { + private static boolean isConversionNeeded(@Nullable final PsiType actual, @Nullable final PsiType expected) { if (actual == null || expected == null) return false; Map typeMap = new HashMap(); @@ -657,7 +657,7 @@ public class Converter { } @NotNull - public static String getPrimitiveTypeConversion(@NotNull String type) { + private static String getPrimitiveTypeConversion(@NotNull String type) { Map conversions = new HashMap(); conversions.put("byte", "byt"); conversions.put("short", "sht"); diff --git a/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java b/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java index 7eef1d9bed1..b08f1b7bf6b 100644 --- a/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java @@ -9,7 +9,7 @@ import java.util.*; * @author ignatov */ public class ArrayInitializerExpression extends Expression { - private Type myType; + private final Type myType; private final List myInitializers; public ArrayInitializerExpression(final Type type, List initializers) { diff --git a/src/org/jetbrains/jet/j2k/ast/ArrayWithoutInitializationExpression.java b/src/org/jetbrains/jet/j2k/ast/ArrayWithoutInitializationExpression.java index 045663abf7c..44169fca924 100644 --- a/src/org/jetbrains/jet/j2k/ast/ArrayWithoutInitializationExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/ArrayWithoutInitializationExpression.java @@ -47,7 +47,7 @@ public class ArrayWithoutInitializationExpression extends Expression { } @NotNull - public static String getConstructorName(@NotNull Type type) { + private static String getConstructorName(@NotNull Type type) { return AstUtil.replaceLastQuest(type.toKotlin()); } } diff --git a/src/org/jetbrains/jet/j2k/ast/CaseContainer.java b/src/org/jetbrains/jet/j2k/ast/CaseContainer.java index bd2f65ddc1a..47f197bf9bb 100644 --- a/src/org/jetbrains/jet/j2k/ast/CaseContainer.java +++ b/src/org/jetbrains/jet/j2k/ast/CaseContainer.java @@ -10,8 +10,8 @@ import java.util.List; * @author ignatov */ public class CaseContainer extends Statement { - private List myCaseStatement; - private Block myBlock; + private final List myCaseStatement; + private final Block myBlock; public CaseContainer(final List caseStatement, @NotNull final List statements) { myCaseStatement = caseStatement; diff --git a/src/org/jetbrains/jet/j2k/ast/IMember.java b/src/org/jetbrains/jet/j2k/ast/IMember.java index 9c3b406f3be..3ac5ac6c31b 100644 --- a/src/org/jetbrains/jet/j2k/ast/IMember.java +++ b/src/org/jetbrains/jet/j2k/ast/IMember.java @@ -4,7 +4,7 @@ package org.jetbrains.jet.j2k.ast; * @author ignatov */ public interface IMember extends INode { - public boolean isStatic(); + boolean isStatic(); boolean isAbstract(); } diff --git a/src/org/jetbrains/jet/j2k/ast/INode.java b/src/org/jetbrains/jet/j2k/ast/INode.java index a0ce67afaae..d4c23a7a484 100644 --- a/src/org/jetbrains/jet/j2k/ast/INode.java +++ b/src/org/jetbrains/jet/j2k/ast/INode.java @@ -7,12 +7,12 @@ import org.jetbrains.annotations.NotNull; */ public interface INode { @NotNull - public String toKotlin(); + String toKotlin(); @NotNull - public Kind getKind(); + Kind getKind(); - public enum Kind { + enum Kind { UNDEFINED, TYPE, CONSTRUCTOR, BREAK, CONTINUE, VARARG, TRAIT, ASSIGNMENT_EXPRESSION, CALL_CHAIN, LITERAL, ARRAY_TYPE, } } diff --git a/src/org/jetbrains/jet/j2k/ast/Identifier.java b/src/org/jetbrains/jet/j2k/ast/Identifier.java index 9ddbe91eb56..8191f63b0c2 100644 --- a/src/org/jetbrains/jet/j2k/ast/Identifier.java +++ b/src/org/jetbrains/jet/j2k/ast/Identifier.java @@ -7,9 +7,9 @@ import org.jetbrains.annotations.NotNull; */ public interface Identifier extends INode { @NotNull - public static Identifier EMPTY_IDENTIFIER = new IdentifierImpl(""); + Identifier EMPTY_IDENTIFIER = new IdentifierImpl(""); - public boolean isEmpty(); + boolean isEmpty(); String getName(); } diff --git a/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java b/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java index 5bfc87b69f5..c8e64c21e2e 100644 --- a/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java @@ -11,12 +11,12 @@ import java.util.List; public class MethodCallExpression extends Expression { private final Expression myMethodCall; private final List myArguments; - private List myConversions; + private final List myConversions; private final boolean myIsResultNullable; private final List myTypeParameters; - public MethodCallExpression(Expression methodCall, List arguments, boolean nullable, List typeParameters) { - this(methodCall, arguments, AstUtil.createListWithEmptyString(arguments), nullable, typeParameters); + public MethodCallExpression(Expression methodCall, List arguments, List typeParameters) { + this(methodCall, arguments, AstUtil.createListWithEmptyString(arguments), false, typeParameters); } public MethodCallExpression(Expression methodCall, List arguments, List conversions, boolean nullable, List typeParameters) { diff --git a/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java b/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java index 24389f2401a..35b4d0239cd 100644 --- a/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java @@ -17,7 +17,7 @@ public class NewClassExpression extends Expression { @Nullable private AnonymousClass myAnonymousClass = null; - public NewClassExpression(Element name, List arguments) { + private NewClassExpression(Element name, List arguments) { myName = name; myQualifier = EMPTY_EXPRESSION; myArguments = arguments; diff --git a/src/org/jetbrains/jet/j2k/ast/Node.java b/src/org/jetbrains/jet/j2k/ast/Node.java index d1df1727e18..7a6de0e5f2e 100644 --- a/src/org/jetbrains/jet/j2k/ast/Node.java +++ b/src/org/jetbrains/jet/j2k/ast/Node.java @@ -54,5 +54,5 @@ public abstract class Node implements INode { @NotNull static final String STAR = "*"; @NotNull - public static final String ZERO = "0"; + protected static final String ZERO = "0"; } \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/ast/SwitchContainer.java b/src/org/jetbrains/jet/j2k/ast/SwitchContainer.java index 3df81ce44cd..363a93b7bfc 100644 --- a/src/org/jetbrains/jet/j2k/ast/SwitchContainer.java +++ b/src/org/jetbrains/jet/j2k/ast/SwitchContainer.java @@ -9,8 +9,8 @@ import java.util.List; * @author ignatov */ public class SwitchContainer extends Statement { - private Expression myExpression; - private List myCaseContainers; + private final Expression myExpression; + private final List myCaseContainers; public SwitchContainer(final Expression expression, final List caseContainers) { myExpression = expression; diff --git a/src/org/jetbrains/jet/j2k/ast/SwitchLabelStatement.java b/src/org/jetbrains/jet/j2k/ast/SwitchLabelStatement.java index d0ccb83acad..78afed2d3e7 100644 --- a/src/org/jetbrains/jet/j2k/ast/SwitchLabelStatement.java +++ b/src/org/jetbrains/jet/j2k/ast/SwitchLabelStatement.java @@ -6,7 +6,7 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public class SwitchLabelStatement extends Statement { - private Expression myExpression; + private final Expression myExpression; public SwitchLabelStatement(final Expression expression) { myExpression = expression; diff --git a/src/org/jetbrains/jet/j2k/visitors/ClassVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ClassVisitor.java index edd75c6e790..f604447da89 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ClassVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ClassVisitor.java @@ -11,7 +11,7 @@ import java.util.Set; * @author ignatov */ public class ClassVisitor extends JavaRecursiveElementVisitor { - private Set myClassIdentifiers; + private final Set myClassIdentifiers; public ClassVisitor() { myClassIdentifiers = new HashSet(); diff --git a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java index 29d888bd2c4..c9fd52f1240 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java @@ -17,7 +17,7 @@ public class ElementVisitor extends JavaElementVisitor { @Nullable private Element myResult = Element.EMPTY_ELEMENT; - @NotNull + @Nullable public Element getResult() { return myResult; } diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 3e71c5a0e60..3178966d324 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -139,8 +139,9 @@ public class ExpressionVisitor extends StatementVisitor { public void visitConditionalExpression(@NotNull PsiConditionalExpression expression) { super.visitConditionalExpression(expression); PsiExpression condition = expression.getCondition(); - Expression e = condition.getType() != null ? - createSureCallOnlyForChain(condition, condition.getType()) : + PsiType type = condition.getType(); + Expression e = type != null ? + createSureCallOnlyForChain(condition, type) : expressionToExpression(condition); myResult = new ParenthesizedExpression( new IfStatement( @@ -250,7 +251,6 @@ public class ExpressionVisitor extends StatementVisitor { new MethodCallExpression( new IdentifierImpl("init"), expressionsToExpressionList(arguments), - false, typeParameters)); } @@ -303,7 +303,6 @@ public class ExpressionVisitor extends StatementVisitor { super.visitReferenceExpression(expression); final boolean isFieldReference = isFieldReference(expression, getContainingClass(expression)); - final boolean hasDollar = isFieldReference && isInsidePrimaryConstructor(expression); final boolean insideSecondaryConstructor = isInsideSecondaryConstructor(expression); final boolean hasReceiver = isFieldReference && insideSecondaryConstructor; final boolean isThis = isThisExpression(expression); @@ -325,7 +324,7 @@ public class ExpressionVisitor extends StatementVisitor { } @NotNull - static String getClassNameWithConstructor(@NotNull PsiReferenceExpression expression) { + private static String getClassNameWithConstructor(@NotNull PsiReferenceExpression expression) { PsiElement context = expression.getContext(); while (context != null) { if (context instanceof PsiMethod && ((PsiMethod) context).isConstructor()) { diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index d5bba48f06d..57d9069cf57 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -80,6 +80,7 @@ public class StatementVisitor extends ElementVisitor { public void visitDoWhileStatement(@NotNull PsiDoWhileStatement statement) { super.visitDoWhileStatement(statement); PsiExpression condition = statement.getCondition(); + @SuppressWarnings("ConstantConditions") Expression expression = condition != null && condition.getType() != null ? createSureCallOnlyForChain(condition, condition.getType()) : expressionToExpression(condition); @@ -179,6 +180,7 @@ public class StatementVisitor extends ElementVisitor { public void visitIfStatement(@NotNull PsiIfStatement statement) { super.visitIfStatement(statement); PsiExpression condition = statement.getCondition(); + @SuppressWarnings("ConstantConditions") Expression expression = condition != null && condition.getType() != null ? createSureCallOnlyForChain(condition, condition.getType()) : expressionToExpression(condition); @@ -334,6 +336,7 @@ public class StatementVisitor extends ElementVisitor { public void visitWhileStatement(@NotNull PsiWhileStatement statement) { super.visitWhileStatement(statement); PsiExpression condition = statement.getCondition(); + @SuppressWarnings("ConstantConditions") Expression expression = condition != null && condition.getType() != null ? createSureCallOnlyForChain(condition, condition.getType()) : expressionToExpression(condition); diff --git a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java index 85245920ca8..acaa8c6b9d6 100644 --- a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java @@ -23,11 +23,11 @@ public class TypeVisitor extends PsiTypeVisitor { public static final String JAVA_LANG_INTEGER = "java.lang.Integer"; public static final String JAVA_LANG_LONG = "java.lang.Long"; public static final String JAVA_LANG_SHORT = "java.lang.Short"; - public static final String JAVA_LANG_BOOLEAN = "java.lang.Boolean"; + private static final String JAVA_LANG_BOOLEAN = "java.lang.Boolean"; public static final String JAVA_LANG_OBJECT = "java.lang.Object"; public static final String JAVA_LANG_STRING = "java.lang.String"; - public static final String JAVA_LANG_ITERABLE = "java.lang.Iterable"; - public static final String JAVA_UTIL_ITERATOR = "java.util.Iterator"; + private static final String JAVA_LANG_ITERABLE = "java.lang.Iterable"; + private static final String JAVA_UTIL_ITERATOR = "java.util.Iterator"; private Type myResult = Type.EMPTY_TYPE; @NotNull diff --git a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java index 28548a78d37..a8249e8272e 100644 --- a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java +++ b/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java @@ -88,7 +88,7 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { @NotNull public static Test suite() { TestSuite suite = new TestSuite(); - suite.addTest(TestCaseBuilder.suiteForDirectory(getTestDataPathBase(), "/ast", true, new TestCaseBuilder.NamedTestFactory() { + suite.addTest(TestCaseBuilder.suiteForDirectory(getTestDataPathBase(), "/ast", new TestCaseBuilder.NamedTestFactory() { @NotNull @Override public Test createTest(@NotNull String dataPath, @NotNull String name) { diff --git a/test/org/jetbrains/jet/j2k/TestCaseBuilder.java b/test/org/jetbrains/jet/j2k/TestCaseBuilder.java index f5337dfcb24..275f70a012d 100644 --- a/test/org/jetbrains/jet/j2k/TestCaseBuilder.java +++ b/test/org/jetbrains/jet/j2k/TestCaseBuilder.java @@ -39,8 +39,8 @@ abstract class TestCaseBuilder { } @NotNull - public static TestSuite suiteForDirectory(String baseDataDir, @NotNull final String dataPath, boolean recursive, @NotNull NamedTestFactory factory) { - return suiteForDirectory(baseDataDir, dataPath, recursive, emptyFilter, factory); + public static TestSuite suiteForDirectory(String baseDataDir, @NotNull final String dataPath, @NotNull NamedTestFactory factory) { + return suiteForDirectory(baseDataDir, dataPath, true, emptyFilter, factory); } @NotNull From 232566ede65ea0c841155180330ea5295d97f069 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 21 Dec 2011 14:22:24 +0400 Subject: [PATCH 183/206] /s/=>/->/g --- .../jetbrains/jet/j2k/ast/CaseContainer.java | 2 +- .../ast/switch/file/comlicatedFallDown.kt | 26 +++++++++---------- testData/ast/switch/file/fallDown.kt | 4 +-- testData/ast/switch/file/kt-539.kt | 26 +++++++++---------- 4 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/ast/CaseContainer.java b/src/org/jetbrains/jet/j2k/ast/CaseContainer.java index 47f197bf9bb..73d2e122547 100644 --- a/src/org/jetbrains/jet/j2k/ast/CaseContainer.java +++ b/src/org/jetbrains/jet/j2k/ast/CaseContainer.java @@ -25,6 +25,6 @@ public class CaseContainer extends Statement { @NotNull @Override public String toKotlin() { - return AstUtil.joinNodes(myCaseStatement, COMMA_WITH_SPACE) + SPACE + "=>" + SPACE + myBlock.toKotlin(); + return AstUtil.joinNodes(myCaseStatement, COMMA_WITH_SPACE) + SPACE + "->" + SPACE + myBlock.toKotlin(); } } diff --git a/testData/ast/switch/file/comlicatedFallDown.kt b/testData/ast/switch/file/comlicatedFallDown.kt index 54abfcf4618..59e285684c2 100644 --- a/testData/ast/switch/file/comlicatedFallDown.kt +++ b/testData/ast/switch/file/comlicatedFallDown.kt @@ -7,32 +7,32 @@ System.out?.println(o) open public fun test(i : Int) : Unit { var monthString : String? = "" when (i) { -1 => { +1 -> { print(1) print(2) print(3) print(4) print(5) } -2 => { +2 -> { print(2) print(3) print(4) print(5) } -3 => { +3 -> { print(3) print(4) print(5) } -4 => { +4 -> { print(4) print(5) } -5 => { +5 -> { print(5) } -6 => { +6 -> { print(6) print(7) print(8) @@ -41,7 +41,7 @@ print(10) print(11) monthString = "December" } -7 => { +7 -> { print(7) print(8) print(9) @@ -49,32 +49,32 @@ print(10) print(11) monthString = "December" } -8 => { +8 -> { print(8) print(9) print(10) print(11) monthString = "December" } -9 => { +9 -> { print(9) print(10) print(11) monthString = "December" } -10 => { +10 -> { print(10) print(11) monthString = "December" } -11 => { +11 -> { print(11) monthString = "December" } -12 => { +12 -> { monthString = "December" } -else => { +else -> { monthString = "Invalid month" } } diff --git a/testData/ast/switch/file/fallDown.kt b/testData/ast/switch/file/fallDown.kt index 54888aa2e40..fd15f52af57 100644 --- a/testData/ast/switch/file/fallDown.kt +++ b/testData/ast/switch/file/fallDown.kt @@ -5,10 +5,10 @@ open public fun main(args : Array?) : Unit { var month : Int = 8 var monthString : String? when (month) { -1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 => { +1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 -> { monthString = "December" } -else => { +else -> { monthString = "Invalid month" } } diff --git a/testData/ast/switch/file/kt-539.kt b/testData/ast/switch/file/kt-539.kt index b716e66dd3d..1f2184937ae 100644 --- a/testData/ast/switch/file/kt-539.kt +++ b/testData/ast/switch/file/kt-539.kt @@ -5,43 +5,43 @@ open public fun main(args : Array?) : Unit { var month : Int = 8 var monthString : String? when (month) { -1 => { +1 -> { monthString = "January" } -2 => { +2 -> { monthString = "February" } -3 => { +3 -> { monthString = "March" } -4 => { +4 -> { monthString = "April" } -5 => { +5 -> { monthString = "May" } -6 => { +6 -> { monthString = "June" } -7 => { +7 -> { monthString = "July" } -8 => { +8 -> { monthString = "August" } -9 => { +9 -> { monthString = "September" } -10 => { +10 -> { monthString = "October" } -11 => { +11 -> { monthString = "November" } -12 => { +12 -> { monthString = "December" } -else => { +else -> { monthString = "Invalid month" } } From a44479f8b25cbeb9b4b013255b1bbe91b143bbbd Mon Sep 17 00:00:00 2001 From: ignatov Date: Mon, 26 Dec 2011 13:07:22 +0400 Subject: [PATCH 184/206] small cleanup --- src/org/jetbrains/jet/j2k/Converter.java | 9 ++++++--- .../jetbrains/jet/j2k/visitors/ExpressionVisitor.java | 6 +++--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index c2a032164fe..21733ddf7b9 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -563,10 +563,13 @@ public class Converter { } private static boolean isReadOnly(@NotNull PsiParameter parameter) { - for (PsiReference r : (ReferencesSearch.search(parameter))) { - if (r instanceof PsiExpression && PsiUtil.isAccessedForWriting((PsiExpression) r)) { - return false; + try { + for (PsiReference r : (ReferencesSearch.search(parameter))) { + if (r instanceof PsiExpression && PsiUtil.isAccessedForWriting((PsiExpression) r)) { + return false; + } } + } catch (IllegalArgumentException ignored) { } return true; } diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 3178966d324..5563e8a12b7 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -311,11 +311,11 @@ public class ExpressionVisitor extends StatementVisitor { Expression identifier = new IdentifierImpl(expression.getReferenceName(), isNullable); - final String temporaryObject = "__"; + final String __ = "__"; if (hasReceiver) - identifier = new CallChainExpression(new IdentifierImpl(temporaryObject, false), new IdentifierImpl(expression.getReferenceName(), isNullable)); + identifier = new CallChainExpression(new IdentifierImpl(__, false), new IdentifierImpl(expression.getReferenceName(), isNullable)); else if (insideSecondaryConstructor && isThis) - identifier = new IdentifierImpl("val " + temporaryObject + " = " + className); // TODO: hack + identifier = new IdentifierImpl("val __ = " + className); // TODO: hack myResult = new CallChainExpression( expressionToExpression(expression.getQualifierExpression()), From 2706eaef7d448b9a53f04c0dc923dda4becafe48 Mon Sep 17 00:00:00 2001 From: ignatov Date: Mon, 26 Dec 2011 13:10:33 +0400 Subject: [PATCH 185/206] /s/namespace/package/g --- src/org/jetbrains/jet/j2k/Converter.java | 1 - src/org/jetbrains/jet/j2k/ast/File.java | 2 +- testData/ast/annotations/file/jetbrainsNotNull.kt | 2 +- testData/ast/boxedType/file/kt-671.kt | 2 +- testData/ast/class/file/kt-639.kt | 2 +- testData/ast/constructors/file/customerBuilder.kt | 2 +- testData/ast/enum/class/colorEnum.kt | 2 +- testData/ast/enum/class/primaryPrivateConstructor.kt | 2 +- testData/ast/file/comp/intNullability.kt | 3 +-- testData/ast/file/file/packageWithClass.kt | 2 +- testData/ast/file/file/packageWithImports.kt | 2 +- testData/ast/file/file/packageWithMixedImports.kt | 2 +- testData/ast/file/file/packageWithOpenClass.kt | 2 +- testData/ast/file/file/packageWithStaticImports.kt | 2 +- testData/ast/function/file/extendsBaseWhichExtendsObject.kt | 2 +- testData/ast/function/file/functionInFinalClass.kt | 2 +- testData/ast/function/file/overrideObject.kt | 2 +- testData/ast/function/file/varVararg.kt | 2 +- testData/ast/function/file/writableParameter.kt | 2 +- testData/ast/importStatement/file/importWithKeywords.kt | 2 +- testData/ast/importStatement/file/importWithStar.kt | 2 +- testData/ast/importStatement/file/simpleImport.kt | 2 +- testData/ast/issues/file/kt-543-boxed.kt | 2 +- testData/ast/issues/file/kt-543-mixed.kt | 2 +- testData/ast/issues/file/kt-543.kt | 2 +- testData/ast/issues/file/kt-696.kt | 2 +- testData/ast/issues/file/kt-792-mixed.kt | 2 +- testData/ast/issues/file/kt-792.kt | 2 +- testData/ast/issues/file/kt-794-mixed.kt | 2 +- testData/ast/issues/file/kt-809-string.kt | 2 +- testData/ast/issues/file/kt-809.kt | 2 +- testData/ast/issues/file/kt-820-field.kt | 2 +- testData/ast/issues/file/kt-820.kt | 2 +- testData/ast/issues/file/kt-824-isDir.kt | 2 +- testData/ast/issues/file/kt-824.kt | 2 +- testData/ast/issues/file/kt-836.kt | 2 +- testData/ast/issues/file/kt-837.kt | 2 +- testData/ast/kotlinExclusion/file/kt-656.kt | 2 +- testData/ast/literalExpression/file/dollarInsideString.kt | 2 +- testData/ast/methodCallExpression/file/genericMethod.kt | 2 +- testData/ast/newClassExpression/file/fullQualifiedName.kt | 2 +- testData/ast/newClassExpression/file/fullQualifiedName2.kt | 2 +- testData/ast/newClassExpression/file/newClassByFullName.kt | 2 +- testData/ast/newClassExpression/file/newInnerClass.kt | 2 +- testData/ast/newClassExpression/file/newListAndNewMember.kt | 2 +- testData/ast/newClassExpression/file/newStaticInnerClass.kt | 2 +- testData/ast/objectLiteral/file/MyFrame.kt | 2 +- testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.kt | 2 +- testData/ast/rawGenerics/file/kt-540-map.kt | 2 +- testData/ast/rawGenerics/file/kt-540-rawGenericClass.kt | 2 +- testData/ast/rawGenerics/file/kt-540.kt | 2 +- testData/ast/rawGenerics/file/rawGenericMethod.kt | 2 +- testData/ast/switch/file/comlicatedFallDown.kt | 2 +- testData/ast/switch/file/fallDown.kt | 2 +- testData/ast/switch/file/kt-539.kt | 2 +- 55 files changed, 54 insertions(+), 56 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 21733ddf7b9..6dcb560d88c 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -67,7 +67,6 @@ public class Converter { public static File fileToFileWithCompatibilityImport(@NotNull PsiJavaFile javaFile) { final PsiImportList importList = javaFile.getImportList(); List imports = importList == null ? Collections.emptyList() : importsToImportList(importList.getAllImportStatements()); - imports.add(new Import("std.*")); imports.add(new Import("std.compatibility.*")); return new File(quoteKeywords(javaFile.getPackageName()), imports, classesToClassList(javaFile.getClasses())); } diff --git a/src/org/jetbrains/jet/j2k/ast/File.java b/src/org/jetbrains/jet/j2k/ast/File.java index d65a1605cbe..d599ec8ab4b 100644 --- a/src/org/jetbrains/jet/j2k/ast/File.java +++ b/src/org/jetbrains/jet/j2k/ast/File.java @@ -25,7 +25,7 @@ public class File extends Node { final String common = AstUtil.joinNodes(myImports, N) + N2 + AstUtil.joinNodes(myClasses, N) + N; if (myPackageName.isEmpty()) return common; - return "namespace" + SPACE + myPackageName + N + + return "package" + SPACE + myPackageName + N + common; } } diff --git a/testData/ast/annotations/file/jetbrainsNotNull.kt b/testData/ast/annotations/file/jetbrainsNotNull.kt index ebf15859e15..9213f5f8e4f 100644 --- a/testData/ast/annotations/file/jetbrainsNotNull.kt +++ b/testData/ast/annotations/file/jetbrainsNotNull.kt @@ -1,4 +1,4 @@ -namespace test +package test public open class Test(str : String) { { myStr = str diff --git a/testData/ast/boxedType/file/kt-671.kt b/testData/ast/boxedType/file/kt-671.kt index a8da231e104..11419363e4b 100644 --- a/testData/ast/boxedType/file/kt-671.kt +++ b/testData/ast/boxedType/file/kt-671.kt @@ -1,4 +1,4 @@ -namespace demo +package demo open class Test() { open fun test() : Unit { var i : Int? = Integer.valueOf(100) diff --git a/testData/ast/class/file/kt-639.kt b/testData/ast/class/file/kt-639.kt index 3ec7dd90e23..3164965fa1f 100644 --- a/testData/ast/class/file/kt-639.kt +++ b/testData/ast/class/file/kt-639.kt @@ -1,4 +1,4 @@ -namespace demo +package demo import java.util.HashMap open class Test() { class object { diff --git a/testData/ast/constructors/file/customerBuilder.kt b/testData/ast/constructors/file/customerBuilder.kt index ab1461ed191..efad343539a 100644 --- a/testData/ast/constructors/file/customerBuilder.kt +++ b/testData/ast/constructors/file/customerBuilder.kt @@ -1,4 +1,4 @@ -namespace org.test.customer +package org.test.customer open class Customer(first : String?, last : String?) { { doSmthBefore() diff --git a/testData/ast/enum/class/colorEnum.kt b/testData/ast/enum/class/colorEnum.kt index 694128a9518..af42b240e68 100644 --- a/testData/ast/enum/class/colorEnum.kt +++ b/testData/ast/enum/class/colorEnum.kt @@ -1,4 +1,4 @@ -namespace demo +package demo enum class MyEnum(_color : Int) { { color = _color diff --git a/testData/ast/enum/class/primaryPrivateConstructor.kt b/testData/ast/enum/class/primaryPrivateConstructor.kt index d869ad519c1..37be650dc19 100644 --- a/testData/ast/enum/class/primaryPrivateConstructor.kt +++ b/testData/ast/enum/class/primaryPrivateConstructor.kt @@ -1,4 +1,4 @@ -namespace demo +package demo enum class Color(c : Int) { { code = c diff --git a/testData/ast/file/comp/intNullability.kt b/testData/ast/file/comp/intNullability.kt index eb097e14e50..9b798908ee1 100644 --- a/testData/ast/file/comp/intNullability.kt +++ b/testData/ast/file/comp/intNullability.kt @@ -1,5 +1,4 @@ -namespace demo -import std.* +package demo import std.compatibility.* open class Test() { open fun test() : Unit { diff --git a/testData/ast/file/file/packageWithClass.kt b/testData/ast/file/file/packageWithClass.kt index 8b169b30b42..3f205654c0b 100644 --- a/testData/ast/file/file/packageWithClass.kt +++ b/testData/ast/file/file/packageWithClass.kt @@ -1,3 +1,3 @@ -namespace test +package test class C() { } \ No newline at end of file diff --git a/testData/ast/file/file/packageWithImports.kt b/testData/ast/file/file/packageWithImports.kt index 076ff7373a9..d646d02ccc0 100644 --- a/testData/ast/file/file/packageWithImports.kt +++ b/testData/ast/file/file/packageWithImports.kt @@ -1,3 +1,3 @@ -namespace test +package test import ast import ast2 \ No newline at end of file diff --git a/testData/ast/file/file/packageWithMixedImports.kt b/testData/ast/file/file/packageWithMixedImports.kt index 076ff7373a9..d646d02ccc0 100644 --- a/testData/ast/file/file/packageWithMixedImports.kt +++ b/testData/ast/file/file/packageWithMixedImports.kt @@ -1,3 +1,3 @@ -namespace test +package test import ast import ast2 \ No newline at end of file diff --git a/testData/ast/file/file/packageWithOpenClass.kt b/testData/ast/file/file/packageWithOpenClass.kt index 37c1f1c767f..d4336ffcc51 100644 --- a/testData/ast/file/file/packageWithOpenClass.kt +++ b/testData/ast/file/file/packageWithOpenClass.kt @@ -1,3 +1,3 @@ -namespace test +package test open class C() { } \ No newline at end of file diff --git a/testData/ast/file/file/packageWithStaticImports.kt b/testData/ast/file/file/packageWithStaticImports.kt index 076ff7373a9..d646d02ccc0 100644 --- a/testData/ast/file/file/packageWithStaticImports.kt +++ b/testData/ast/file/file/packageWithStaticImports.kt @@ -1,3 +1,3 @@ -namespace test +package test import ast import ast2 \ No newline at end of file diff --git a/testData/ast/function/file/extendsBaseWhichExtendsObject.kt b/testData/ast/function/file/extendsBaseWhichExtendsObject.kt index f1893768f30..eea76d734e4 100644 --- a/testData/ast/function/file/extendsBaseWhichExtendsObject.kt +++ b/testData/ast/function/file/extendsBaseWhichExtendsObject.kt @@ -1,4 +1,4 @@ -namespace test +package test open class Test() : Base() { override public fun hashCode() : Int { return super.hashCode() diff --git a/testData/ast/function/file/functionInFinalClass.kt b/testData/ast/function/file/functionInFinalClass.kt index 507b84ba7d4..def36e1f8de 100644 --- a/testData/ast/function/file/functionInFinalClass.kt +++ b/testData/ast/function/file/functionInFinalClass.kt @@ -1,4 +1,4 @@ -namespace demo +package demo class Final() { fun test() : Unit { } diff --git a/testData/ast/function/file/overrideObject.kt b/testData/ast/function/file/overrideObject.kt index 658174be178..cdbb7783005 100644 --- a/testData/ast/function/file/overrideObject.kt +++ b/testData/ast/function/file/overrideObject.kt @@ -1,4 +1,4 @@ -namespace test +package test open class Test() { open public fun hashCode() : Int { return System.identityHashCode(this) diff --git a/testData/ast/function/file/varVararg.kt b/testData/ast/function/file/varVararg.kt index a32417ad75b..6d364141a95 100644 --- a/testData/ast/function/file/varVararg.kt +++ b/testData/ast/function/file/varVararg.kt @@ -1,4 +1,4 @@ -namespace demo +package demo open class Test() { open fun test(vararg var args : Any?) : Unit { args = array(1, 2, 3) diff --git a/testData/ast/function/file/writableParameter.kt b/testData/ast/function/file/writableParameter.kt index 8dcff305936..645403e2035 100644 --- a/testData/ast/function/file/writableParameter.kt +++ b/testData/ast/function/file/writableParameter.kt @@ -1,4 +1,4 @@ -namespace demo +package demo open class Test() { open fun test(var i : Int) : Int { i = 10 diff --git a/testData/ast/importStatement/file/importWithKeywords.kt b/testData/ast/importStatement/file/importWithKeywords.kt index f5babdc556c..b9370c9adf9 100644 --- a/testData/ast/importStatement/file/importWithKeywords.kt +++ b/testData/ast/importStatement/file/importWithKeywords.kt @@ -1,4 +1,4 @@ -namespace test +package test import `namespace`.`as`.`type`.`val`.`var`.`fun`.`is`.`in`.`object`.`when`.`trait`.`This` open class Test() { } \ No newline at end of file diff --git a/testData/ast/importStatement/file/importWithStar.kt b/testData/ast/importStatement/file/importWithStar.kt index ad30b8594cb..c390c539acc 100644 --- a/testData/ast/importStatement/file/importWithStar.kt +++ b/testData/ast/importStatement/file/importWithStar.kt @@ -1,4 +1,4 @@ -namespace org.jetbrains.jet.j2k +package org.jetbrains.jet.j2k import org.jetbrains.annotations.* public open class Converter() { } \ No newline at end of file diff --git a/testData/ast/importStatement/file/simpleImport.kt b/testData/ast/importStatement/file/simpleImport.kt index 97e54209431..c35720004e5 100644 --- a/testData/ast/importStatement/file/simpleImport.kt +++ b/testData/ast/importStatement/file/simpleImport.kt @@ -1,3 +1,3 @@ -namespace org.jetbrains.jet.j2k +package org.jetbrains.jet.j2k public open class Converter() { } \ No newline at end of file diff --git a/testData/ast/issues/file/kt-543-boxed.kt b/testData/ast/issues/file/kt-543-boxed.kt index dafbd546c92..b63653b3d2e 100644 --- a/testData/ast/issues/file/kt-543-boxed.kt +++ b/testData/ast/issues/file/kt-543-boxed.kt @@ -1,4 +1,4 @@ -namespace demo +package demo open class Test() { open fun putInt(i : Int?) : Unit { } diff --git a/testData/ast/issues/file/kt-543-mixed.kt b/testData/ast/issues/file/kt-543-mixed.kt index 1fd99286342..566c7766284 100644 --- a/testData/ast/issues/file/kt-543-mixed.kt +++ b/testData/ast/issues/file/kt-543-mixed.kt @@ -1,4 +1,4 @@ -namespace demo +package demo open class Test() { open fun putInt(i : Int?) : Unit { } diff --git a/testData/ast/issues/file/kt-543.kt b/testData/ast/issues/file/kt-543.kt index 9e06bf3f48c..0e507c0d62f 100644 --- a/testData/ast/issues/file/kt-543.kt +++ b/testData/ast/issues/file/kt-543.kt @@ -1,4 +1,4 @@ -namespace demo +package demo open class Test() { open fun putInt(i : Int) : Unit { } diff --git a/testData/ast/issues/file/kt-696.kt b/testData/ast/issues/file/kt-696.kt index a238b6fa9fb..9369e8ec092 100644 --- a/testData/ast/issues/file/kt-696.kt +++ b/testData/ast/issues/file/kt-696.kt @@ -1,4 +1,4 @@ -namespace test +package test open class Base() { open public fun hashCode() : Int { return System.identityHashCode(this) diff --git a/testData/ast/issues/file/kt-792-mixed.kt b/testData/ast/issues/file/kt-792-mixed.kt index 69f9f3feb15..fa82740445e 100644 --- a/testData/ast/issues/file/kt-792-mixed.kt +++ b/testData/ast/issues/file/kt-792-mixed.kt @@ -1,4 +1,4 @@ -namespace demo +package demo open class Test(i : Int?) { open fun test() : Unit { var i : Int = 10 diff --git a/testData/ast/issues/file/kt-792.kt b/testData/ast/issues/file/kt-792.kt index cdba42971fc..e43490413d0 100644 --- a/testData/ast/issues/file/kt-792.kt +++ b/testData/ast/issues/file/kt-792.kt @@ -1,4 +1,4 @@ -namespace demo +package demo open class Test(i : Int) { open fun test() : Unit { var b : Byte = 10 diff --git a/testData/ast/issues/file/kt-794-mixed.kt b/testData/ast/issues/file/kt-794-mixed.kt index 5e6ec805f77..4ec128cbf11 100644 --- a/testData/ast/issues/file/kt-794-mixed.kt +++ b/testData/ast/issues/file/kt-794-mixed.kt @@ -1,4 +1,4 @@ -namespace demo +package demo open class Test() { open fun getInteger(i : Int?) : Int? { return i diff --git a/testData/ast/issues/file/kt-809-string.kt b/testData/ast/issues/file/kt-809-string.kt index 0e261443721..062a09acdb4 100644 --- a/testData/ast/issues/file/kt-809-string.kt +++ b/testData/ast/issues/file/kt-809-string.kt @@ -1,4 +1,4 @@ -namespace demo +package demo open class Container() { var myString : String? = 1 } diff --git a/testData/ast/issues/file/kt-809.kt b/testData/ast/issues/file/kt-809.kt index e9e43c99bf3..78932463e03 100644 --- a/testData/ast/issues/file/kt-809.kt +++ b/testData/ast/issues/file/kt-809.kt @@ -1,4 +1,4 @@ -namespace demo +package demo open class Container() { var myInt : Int = 1 } diff --git a/testData/ast/issues/file/kt-820-field.kt b/testData/ast/issues/file/kt-820-field.kt index 77fb95f2c19..72711267b5b 100644 --- a/testData/ast/issues/file/kt-820-field.kt +++ b/testData/ast/issues/file/kt-820-field.kt @@ -1,4 +1,4 @@ -namespace demo +package demo open class Container() { var myInt : Int = 1 } diff --git a/testData/ast/issues/file/kt-820.kt b/testData/ast/issues/file/kt-820.kt index 56fb9bc0682..abe8bfcb987 100644 --- a/testData/ast/issues/file/kt-820.kt +++ b/testData/ast/issues/file/kt-820.kt @@ -1,4 +1,4 @@ -namespace demo +package demo open class Container() { var myInt : Int = 1 } diff --git a/testData/ast/issues/file/kt-824-isDir.kt b/testData/ast/issues/file/kt-824-isDir.kt index 9bae2da71ea..f03d1382414 100644 --- a/testData/ast/issues/file/kt-824-isDir.kt +++ b/testData/ast/issues/file/kt-824-isDir.kt @@ -1,4 +1,4 @@ -namespace test +package test import java.io.File public open class Test() { class object { diff --git a/testData/ast/issues/file/kt-824.kt b/testData/ast/issues/file/kt-824.kt index 87e1d165317..5059669b42a 100644 --- a/testData/ast/issues/file/kt-824.kt +++ b/testData/ast/issues/file/kt-824.kt @@ -1,4 +1,4 @@ -namespace demo +package demo open class Container() { var myBoolean : Boolean = true } diff --git a/testData/ast/issues/file/kt-836.kt b/testData/ast/issues/file/kt-836.kt index e80ed065e8a..8b761878378 100644 --- a/testData/ast/issues/file/kt-836.kt +++ b/testData/ast/issues/file/kt-836.kt @@ -1,4 +1,4 @@ -namespace com.voltvoodoo.saplo4j.model +package com.voltvoodoo.saplo4j.model import java.io.Serializable public open class Language(code : String?) : Serializable { { diff --git a/testData/ast/issues/file/kt-837.kt b/testData/ast/issues/file/kt-837.kt index c2040e45d81..7f6e2e5c63b 100644 --- a/testData/ast/issues/file/kt-837.kt +++ b/testData/ast/issues/file/kt-837.kt @@ -1,4 +1,4 @@ -namespace com.voltvoodoo.saplo4j.model +package com.voltvoodoo.saplo4j.model import java.io.Serializable public open class Language(code : String?) : Serializable { { diff --git a/testData/ast/kotlinExclusion/file/kt-656.kt b/testData/ast/kotlinExclusion/file/kt-656.kt index f0e88acf7f6..4d8d3ac6e19 100644 --- a/testData/ast/kotlinExclusion/file/kt-656.kt +++ b/testData/ast/kotlinExclusion/file/kt-656.kt @@ -1,4 +1,4 @@ -namespace demo +package demo import java.util.Iterator open class Test() : java.lang.Iterable { override public fun iterator() : java.util.Iterator? { diff --git a/testData/ast/literalExpression/file/dollarInsideString.kt b/testData/ast/literalExpression/file/dollarInsideString.kt index fdc29f01466..6a42dcad2c9 100644 --- a/testData/ast/literalExpression/file/dollarInsideString.kt +++ b/testData/ast/literalExpression/file/dollarInsideString.kt @@ -1,4 +1,4 @@ -namespace demo +package demo open class Test() { open fun test() : Unit { var name : String? = "$$$$" diff --git a/testData/ast/methodCallExpression/file/genericMethod.kt b/testData/ast/methodCallExpression/file/genericMethod.kt index eb9f546267f..b130cbc9376 100644 --- a/testData/ast/methodCallExpression/file/genericMethod.kt +++ b/testData/ast/methodCallExpression/file/genericMethod.kt @@ -1,4 +1,4 @@ -namespace demo +package demo open class Map() { open fun put(k : K?, v : V?) : Unit { } diff --git a/testData/ast/newClassExpression/file/fullQualifiedName.kt b/testData/ast/newClassExpression/file/fullQualifiedName.kt index 6f47648c18f..e89453f3809 100644 --- a/testData/ast/newClassExpression/file/fullQualifiedName.kt +++ b/testData/ast/newClassExpression/file/fullQualifiedName.kt @@ -1,4 +1,4 @@ -namespace test +package test import java.util.List open class User() { open fun main() : Unit { diff --git a/testData/ast/newClassExpression/file/fullQualifiedName2.kt b/testData/ast/newClassExpression/file/fullQualifiedName2.kt index 694d09886dc..bdcb458a76f 100644 --- a/testData/ast/newClassExpression/file/fullQualifiedName2.kt +++ b/testData/ast/newClassExpression/file/fullQualifiedName2.kt @@ -1,4 +1,4 @@ -namespace test +package test open class User() { open fun main() : Unit { var list : java.util.List<*>? = java.util.LinkedList() diff --git a/testData/ast/newClassExpression/file/newClassByFullName.kt b/testData/ast/newClassExpression/file/newClassByFullName.kt index c60db08ecaa..adb7fce935a 100644 --- a/testData/ast/newClassExpression/file/newClassByFullName.kt +++ b/testData/ast/newClassExpression/file/newClassByFullName.kt @@ -1,4 +1,4 @@ -namespace org.test +package org.test open class Library() { } open class User() { diff --git a/testData/ast/newClassExpression/file/newInnerClass.kt b/testData/ast/newClassExpression/file/newInnerClass.kt index b3bbbdf8623..93c7fec3411 100644 --- a/testData/ast/newClassExpression/file/newInnerClass.kt +++ b/testData/ast/newClassExpression/file/newInnerClass.kt @@ -1,4 +1,4 @@ -namespace org.test +package org.test open class OuterClass() { open class InnerClass() { } diff --git a/testData/ast/newClassExpression/file/newListAndNewMember.kt b/testData/ast/newClassExpression/file/newListAndNewMember.kt index a13a2515a54..089a1acef21 100644 --- a/testData/ast/newClassExpression/file/newListAndNewMember.kt +++ b/testData/ast/newClassExpression/file/newListAndNewMember.kt @@ -1,4 +1,4 @@ -namespace org.test +package org.test import java.util.List import java.util.LinkedList open class Member() { diff --git a/testData/ast/newClassExpression/file/newStaticInnerClass.kt b/testData/ast/newClassExpression/file/newStaticInnerClass.kt index 61338ae3cfc..3a6a440f397 100644 --- a/testData/ast/newClassExpression/file/newStaticInnerClass.kt +++ b/testData/ast/newClassExpression/file/newStaticInnerClass.kt @@ -1,4 +1,4 @@ -namespace demo +package demo open class Foo() { class object { open class Bar() { diff --git a/testData/ast/objectLiteral/file/MyFrame.kt b/testData/ast/objectLiteral/file/MyFrame.kt index 1957f66f297..bb49c2e14d5 100644 --- a/testData/ast/objectLiteral/file/MyFrame.kt +++ b/testData/ast/objectLiteral/file/MyFrame.kt @@ -1,4 +1,4 @@ -namespace demo +package demo open class WindowAdapter() { open public fun windowClosing() : Unit { } diff --git a/testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.kt b/testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.kt index 51ebb27fea5..a673d540277 100644 --- a/testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.kt +++ b/testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.kt @@ -1,4 +1,4 @@ -namespace org.jetbrains.jet.j2k.`in` +package org.jetbrains.jet.j2k.`in` import org.jetbrains.annotations.Nullable public open class Converter() { } \ No newline at end of file diff --git a/testData/ast/rawGenerics/file/kt-540-map.kt b/testData/ast/rawGenerics/file/kt-540-map.kt index 2184c3b7214..42fb66b7c4e 100644 --- a/testData/ast/rawGenerics/file/kt-540-map.kt +++ b/testData/ast/rawGenerics/file/kt-540-map.kt @@ -1,4 +1,4 @@ -namespace demo +package demo import java.util.HashMap open class Test() { open fun main() : Unit { diff --git a/testData/ast/rawGenerics/file/kt-540-rawGenericClass.kt b/testData/ast/rawGenerics/file/kt-540-rawGenericClass.kt index 3fd7726bfd0..426b2190bc9 100644 --- a/testData/ast/rawGenerics/file/kt-540-rawGenericClass.kt +++ b/testData/ast/rawGenerics/file/kt-540-rawGenericClass.kt @@ -1,4 +1,4 @@ -namespace demo +package demo open class Collection(e : E?) { { System.out?.println(e) diff --git a/testData/ast/rawGenerics/file/kt-540.kt b/testData/ast/rawGenerics/file/kt-540.kt index bf2f869cf42..6db46c17105 100644 --- a/testData/ast/rawGenerics/file/kt-540.kt +++ b/testData/ast/rawGenerics/file/kt-540.kt @@ -1,4 +1,4 @@ -namespace demo +package demo import java.util.List import java.util.LinkedList open class Test() { diff --git a/testData/ast/rawGenerics/file/rawGenericMethod.kt b/testData/ast/rawGenerics/file/rawGenericMethod.kt index bce70b24a11..ea3e08d5bdb 100644 --- a/testData/ast/rawGenerics/file/rawGenericMethod.kt +++ b/testData/ast/rawGenerics/file/rawGenericMethod.kt @@ -1,4 +1,4 @@ -namespace demo +package demo open class TestT() { open fun getT() : Unit { } diff --git a/testData/ast/switch/file/comlicatedFallDown.kt b/testData/ast/switch/file/comlicatedFallDown.kt index 59e285684c2..b1af2ce6ffa 100644 --- a/testData/ast/switch/file/comlicatedFallDown.kt +++ b/testData/ast/switch/file/comlicatedFallDown.kt @@ -1,4 +1,4 @@ -namespace demo +package demo public open class SwitchDemo() { class object { open public fun print(o : Any?) : Unit { diff --git a/testData/ast/switch/file/fallDown.kt b/testData/ast/switch/file/fallDown.kt index fd15f52af57..a237a7ee535 100644 --- a/testData/ast/switch/file/fallDown.kt +++ b/testData/ast/switch/file/fallDown.kt @@ -1,4 +1,4 @@ -namespace switch_demo +package switch_demo public open class SwitchDemo() { class object { open public fun main(args : Array?) : Unit { diff --git a/testData/ast/switch/file/kt-539.kt b/testData/ast/switch/file/kt-539.kt index 1f2184937ae..63fd0eaf959 100644 --- a/testData/ast/switch/file/kt-539.kt +++ b/testData/ast/switch/file/kt-539.kt @@ -1,4 +1,4 @@ -namespace switch_demo +package switch_demo public open class SwitchDemo() { class object { open public fun main(args : Array?) : Unit { From 4f9011509cc4761a4576493a1c0755c8c48a53ad Mon Sep 17 00:00:00 2001 From: ignatov Date: Mon, 26 Dec 2011 14:05:46 +0400 Subject: [PATCH 186/206] KT-871 Add main function to generated code --- src/org/jetbrains/jet/j2k/Converter.java | 15 ++-- src/org/jetbrains/jet/j2k/ConverterUtil.java | 71 +++++++++++++++++++ src/org/jetbrains/jet/j2k/ast/File.java | 6 +- testData/ast/issues/file/kt-871.jav | 7 ++ testData/ast/issues/file/kt-871.kt | 9 +++ .../ast/switch/file/comlicatedFallDown.kt | 3 +- testData/ast/switch/file/fallDown.kt | 3 +- testData/ast/switch/file/kt-539.kt | 3 +- 8 files changed, 107 insertions(+), 10 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ConverterUtil.java create mode 100644 testData/ast/issues/file/kt-871.jav create mode 100644 testData/ast/issues/file/kt-871.kt diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 6dcb560d88c..f34f43f1fc3 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -14,6 +14,7 @@ import org.jetbrains.jet.j2k.visitors.*; import java.util.*; +import static org.jetbrains.jet.j2k.ConverterUtil.createMainFunction; import static org.jetbrains.jet.j2k.visitors.TypeVisitor.*; /** @@ -58,17 +59,21 @@ public class Converter { @NotNull public static File fileToFile(@NotNull PsiJavaFile javaFile) { - final PsiImportList importList = javaFile.getImportList(); - List imports = importList == null ? Collections.emptyList() : importsToImportList(importList.getAllImportStatements()); - return new File(quoteKeywords(javaFile.getPackageName()), imports, classesToClassList(javaFile.getClasses())); + return fileToFile(javaFile, Collections.emptyList()); } @NotNull public static File fileToFileWithCompatibilityImport(@NotNull PsiJavaFile javaFile) { + return fileToFile(javaFile, Collections.singletonList("std.compatibility.*")); + } + + @NotNull + private static File fileToFile(PsiJavaFile javaFile, List additionalImports) { final PsiImportList importList = javaFile.getImportList(); List imports = importList == null ? Collections.emptyList() : importsToImportList(importList.getAllImportStatements()); - imports.add(new Import("std.compatibility.*")); - return new File(quoteKeywords(javaFile.getPackageName()), imports, classesToClassList(javaFile.getClasses())); + for (String i : additionalImports) + imports.add(new Import(i)); + return new File(quoteKeywords(javaFile.getPackageName()), imports, classesToClassList(javaFile.getClasses()), createMainFunction(javaFile)); } @NotNull diff --git a/src/org/jetbrains/jet/j2k/ConverterUtil.java b/src/org/jetbrains/jet/j2k/ConverterUtil.java new file mode 100644 index 00000000000..eb04032aa7b --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ConverterUtil.java @@ -0,0 +1,71 @@ +package org.jetbrains.jet.j2k; + +import com.intellij.openapi.util.Pair; +import com.intellij.psi.*; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.text.MessageFormat; +import java.util.LinkedList; +import java.util.List; + +/** + * @author ignatov + */ +public class ConverterUtil { + private ConverterUtil() { + } + + @NotNull + public static String createMainFunction(@NotNull PsiFile file) { + List> classNamesWithMains = new LinkedList>(); + + for (PsiClass c : ((PsiJavaFile) file).getClasses()) { + PsiMethod main = findMainMethod(c); + if (main != null) { + classNamesWithMains.add(new Pair(c.getName(), main)); + } + } + if (classNamesWithMains.size() > 0) { + String className = classNamesWithMains.get(0).getFirst(); + return MessageFormat.format("fun main(args : Array?) = {0}.main(args)", className); + } + return ""; + } + + @Nullable + private static PsiMethod findMainMethod(@NotNull PsiClass aClass) { + if (isMainClass(aClass)) { + final PsiMethod[] mainMethods = aClass.findMethodsByName("main", false); + return findMainMethod(mainMethods); + } + return null; + } + + @Nullable + private static PsiMethod findMainMethod(@NotNull PsiMethod[] mainMethods) { + for (PsiMethod mainMethod : mainMethods) { + if (isMainMethod(mainMethod)) return mainMethod; + } + return null; + } + + private static boolean isMainClass(@NotNull PsiClass psiClass) { + if (psiClass instanceof PsiAnonymousClass) return false; + if (psiClass.isInterface()) return false; + return psiClass.getContainingClass() == null || psiClass.hasModifierProperty(PsiModifier.STATIC); + } + + public static boolean isMainMethod(@Nullable PsiMethod method) { + if (method == null || method.getContainingClass() == null) return false; + if (PsiType.VOID != method.getReturnType()) return false; + if (!method.hasModifierProperty(PsiModifier.STATIC)) return false; + if (!method.hasModifierProperty(PsiModifier.PUBLIC)) return false; + final PsiParameter[] parameters = method.getParameterList().getParameters(); + if (parameters.length != 1) return false; + final PsiType type = parameters[0].getType(); + if (!(type instanceof PsiArrayType)) return false; + final PsiType componentType = ((PsiArrayType) type).getComponentType(); + return componentType.equalsToText("java.lang.String"); + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/File.java b/src/org/jetbrains/jet/j2k/ast/File.java index d599ec8ab4b..0dd63fa4fd6 100644 --- a/src/org/jetbrains/jet/j2k/ast/File.java +++ b/src/org/jetbrains/jet/j2k/ast/File.java @@ -12,17 +12,19 @@ public class File extends Node { private final String myPackageName; private final List myImports; private final List myClasses; + private final String myMainFunction; - public File(String packageName, List imports, List classes) { + public File(String packageName, List imports, List classes, String mainFunction) { myPackageName = packageName; myImports = imports; myClasses = classes; + myMainFunction = mainFunction; } @NotNull @Override public String toKotlin() { - final String common = AstUtil.joinNodes(myImports, N) + N2 + AstUtil.joinNodes(myClasses, N) + N; + final String common = AstUtil.joinNodes(myImports, N) + N2 + AstUtil.joinNodes(myClasses, N) + N + myMainFunction; if (myPackageName.isEmpty()) return common; return "package" + SPACE + myPackageName + N + diff --git a/testData/ast/issues/file/kt-871.jav b/testData/ast/issues/file/kt-871.jav new file mode 100644 index 00000000000..b49b8041fc5 --- /dev/null +++ b/testData/ast/issues/file/kt-871.jav @@ -0,0 +1,7 @@ +package demo; + +class Program { + public static void main(String[] args) { + System.out.println("Halo!"); + } +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-871.kt b/testData/ast/issues/file/kt-871.kt new file mode 100644 index 00000000000..84fd489ca76 --- /dev/null +++ b/testData/ast/issues/file/kt-871.kt @@ -0,0 +1,9 @@ +package demo +open class Program() { +class object { +open public fun main(args : Array?) : Unit { +System.out?.println("Halo!") +} +} +} +fun main(args : Array?) = Program.main(args) \ No newline at end of file diff --git a/testData/ast/switch/file/comlicatedFallDown.kt b/testData/ast/switch/file/comlicatedFallDown.kt index b1af2ce6ffa..27edb9beab0 100644 --- a/testData/ast/switch/file/comlicatedFallDown.kt +++ b/testData/ast/switch/file/comlicatedFallDown.kt @@ -84,4 +84,5 @@ open public fun main(args : Array?) : Unit { for (i in 1..12) test(i) } } -} \ No newline at end of file +} +fun main(args : Array?) = SwitchDemo.main(args) \ No newline at end of file diff --git a/testData/ast/switch/file/fallDown.kt b/testData/ast/switch/file/fallDown.kt index a237a7ee535..29bc8f10c2b 100644 --- a/testData/ast/switch/file/fallDown.kt +++ b/testData/ast/switch/file/fallDown.kt @@ -15,4 +15,5 @@ monthString = "Invalid month" System.out?.println(monthString) } } -} \ No newline at end of file +} +fun main(args : Array?) = SwitchDemo.main(args) \ No newline at end of file diff --git a/testData/ast/switch/file/kt-539.kt b/testData/ast/switch/file/kt-539.kt index 63fd0eaf959..db23ffbaf04 100644 --- a/testData/ast/switch/file/kt-539.kt +++ b/testData/ast/switch/file/kt-539.kt @@ -48,4 +48,5 @@ monthString = "Invalid month" System.out?.println(monthString) } } -} \ No newline at end of file +} +fun main(args : Array?) = SwitchDemo.main(args) \ No newline at end of file From 95f8bbba5c942733d4165391c93a6ae686c2ee36 Mon Sep 17 00:00:00 2001 From: ignatov Date: Mon, 26 Dec 2011 15:56:32 +0400 Subject: [PATCH 187/206] KT-852 Apply sure() call for expressions inside polyadic expression --- src/org/jetbrains/jet/j2k/Converter.java | 36 +++++++++++++++---- .../jet/j2k/ast/BinaryExpression.java | 13 ++++++- .../jet/j2k/ast/PolyadicExpression.java | 7 ++-- src/org/jetbrains/jet/j2k/util/AstUtil.java | 5 ++- .../jet/j2k/visitors/ExpressionVisitor.java | 6 ++-- testData/ast/issues/file/kt-809-string.jav | 2 +- testData/ast/issues/file/kt-852.jav | 16 +++++++++ testData/ast/issues/file/kt-852.kt | 13 +++++++ 8 files changed, 82 insertions(+), 16 deletions(-) create mode 100644 testData/ast/issues/file/kt-852.jav create mode 100644 testData/ast/issues/file/kt-852.kt diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index f34f43f1fc3..a94f30c6cd2 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -601,9 +601,9 @@ public class Converter { @NotNull public static List createConversions(@NotNull PsiCallExpression expression) { - List conversions = new LinkedList(); PsiExpressionList argumentList = expression.getArgumentList(); PsiExpression[] arguments = argumentList != null ? argumentList.getExpressions() : new PsiExpression[]{}; + List conversions = new LinkedList(); //noinspection UnusedDeclaration for (final PsiExpression a : arguments) { conversions.add(""); @@ -628,19 +628,41 @@ public class Converter { return conversions; } + @NotNull + public static List createConversions(@NotNull PsiPolyadicExpression expression, PsiType expectedType) { + PsiExpression[] arguments = expression.getOperands(); + int length = arguments.length; + List conversions = new LinkedList(); + + List expectedTypes = Collections.nCopies(length, expectedType); + List actualTypes = new LinkedList(); + + for (PsiExpression e : arguments) + actualTypes.add(e.getType()); + + assert actualTypes.size() == expectedTypes.size() : "The type list must have the same length"; + + for (int i = 0; i < actualTypes.size(); i++) + conversions.add(i, createConversionForExpression(arguments[i], expectedTypes.get(i))); + + return conversions; + } + @NotNull private static String createConversionForExpression(@Nullable PsiExpression expression, @NotNull PsiType expectedType) { String conversion = ""; if (expression != null) { PsiType actualType = expression.getType(); - if (actualType != null) { - if (Node.PRIMITIVE_TYPES.contains(actualType.getCanonicalText()) && (expression instanceof PsiReferenceExpression - && ((PsiReferenceExpression) expression).isQualified() || expression instanceof PsiMethodCallExpression) - && expressionToExpression(expression).toKotlin().contains("?.")) - conversion += ".sure()"; + boolean isPrimitiveTypeOrNull = actualType == null || Node.PRIMITIVE_TYPES.contains(actualType.getCanonicalText()); + boolean isRef = (expression instanceof PsiReferenceExpression && ((PsiReferenceExpression) expression).isQualified() || expression instanceof PsiMethodCallExpression); + boolean containsQuestDot = expressionToExpression(expression).toKotlin().contains("?."); + + if (isPrimitiveTypeOrNull && isRef && containsQuestDot) + conversion += ".sure()"; + + if (actualType != null) if (isConversionNeeded(actualType, expectedType)) conversion += getPrimitiveTypeConversion(expectedType.getCanonicalText()); - } } return conversion; } diff --git a/src/org/jetbrains/jet/j2k/ast/BinaryExpression.java b/src/org/jetbrains/jet/j2k/ast/BinaryExpression.java index 5be8a82d2be..72baea6e515 100644 --- a/src/org/jetbrains/jet/j2k/ast/BinaryExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/BinaryExpression.java @@ -1,6 +1,10 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.j2k.util.AstUtil; + +import java.util.Arrays; +import java.util.List; /** * @author ignatov @@ -9,16 +13,23 @@ public class BinaryExpression extends Expression { private final Expression myLeft; private final Expression myRight; private final String myOp; + private final List myConversions; public BinaryExpression(Expression left, Expression right, String op) { + this(left, right, op, Arrays.asList("", "")); + } + + public BinaryExpression(Expression left, Expression right, String op, List conversions) { myLeft = left; myRight = right; myOp = op; + myConversions = conversions; } @NotNull @Override public String toKotlin() { - return "(" + myLeft.toKotlin() + SPACE + myOp + SPACE + myRight.toKotlin() + ")"; + List expressionsWithConversions = AstUtil.applyConversions(AstUtil.nodesToKotlin(Arrays.asList(myLeft, myRight)), myConversions); + return "(" + AstUtil.join(expressionsWithConversions, SPACE + myOp + SPACE) + ")"; } } diff --git a/src/org/jetbrains/jet/j2k/ast/PolyadicExpression.java b/src/org/jetbrains/jet/j2k/ast/PolyadicExpression.java index f8d1abad90d..f5872539874 100644 --- a/src/org/jetbrains/jet/j2k/ast/PolyadicExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/PolyadicExpression.java @@ -11,16 +11,19 @@ import java.util.List; public class PolyadicExpression extends Expression { private final List myExpressions; private final String myToken; + private final List myConversions; - public PolyadicExpression(List expressions, String token) { + public PolyadicExpression(List expressions, String token, List conversions) { super(); myExpressions = expressions; myToken = token; + myConversions = conversions; } @NotNull @Override public String toKotlin() { - return "(" + AstUtil.joinNodes(myExpressions, SPACE + myToken + SPACE) + ")"; + List expressionsWithConversions = AstUtil.applyConversions(AstUtil.nodesToKotlin(myExpressions), myConversions); + return "(" + AstUtil.join(expressionsWithConversions, SPACE + myToken + SPACE) + ")"; } } diff --git a/src/org/jetbrains/jet/j2k/util/AstUtil.java b/src/org/jetbrains/jet/j2k/util/AstUtil.java index 3f4718a8da5..fade672d1e9 100644 --- a/src/org/jetbrains/jet/j2k/util/AstUtil.java +++ b/src/org/jetbrains/jet/j2k/util/AstUtil.java @@ -2,7 +2,6 @@ package org.jetbrains.jet.j2k.util; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.j2k.ast.Expression; import org.jetbrains.jet.j2k.ast.INode; import java.util.LinkedList; @@ -57,10 +56,10 @@ public class AstUtil { } @NotNull - public static List createListWithEmptyString(@NotNull final List arguments) { + public static List createListWithEmptyString(@NotNull final List arguments) { final List conversions = new LinkedList(); //noinspection UnusedDeclaration - for (Expression argument : arguments) conversions.add(""); + for (T argument : arguments) conversions.add(""); return conversions; } diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 5563e8a12b7..ff754c17393 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -125,7 +125,8 @@ public class ExpressionVisitor extends StatementVisitor { new BinaryExpression( expressionToExpression(expression.getLOperand()), expressionToExpression(expression.getROperand()), - getOperatorString(expression.getOperationSign().getTokenType()) + getOperatorString(expression.getOperationSign().getTokenType()), + createConversions(expression, PsiType.BOOLEAN) ); } @@ -449,7 +450,8 @@ public class ExpressionVisitor extends StatementVisitor { super.visitPolyadicExpression(expression); myResult = new PolyadicExpression( expressionsToExpressionList(expression.getOperands()), - getOperatorString(expression.getOperationTokenType()) + getOperatorString(expression.getOperationTokenType()), + createConversions(expression, PsiType.BOOLEAN) ); } } \ No newline at end of file diff --git a/testData/ast/issues/file/kt-809-string.jav b/testData/ast/issues/file/kt-809-string.jav index 71913e2dfab..5e60a8c8552 100644 --- a/testData/ast/issues/file/kt-809-string.jav +++ b/testData/ast/issues/file/kt-809-string.jav @@ -1,7 +1,7 @@ package demo; class Container { - String myString = 1; + String myString = "1"; } class One { diff --git a/testData/ast/issues/file/kt-852.jav b/testData/ast/issues/file/kt-852.jav new file mode 100644 index 00000000000..b9abf40fe36 --- /dev/null +++ b/testData/ast/issues/file/kt-852.jav @@ -0,0 +1,16 @@ +package demo; + +class Test { + String test() { + String s1 = ""; + String s2 = ""; + String s3 = ""; + if (s1.isEmpty() && s2.isEmpty()) + return "OK"; + + if (s1.isEmpty() && s2.isEmpty() && s3.isEmpty()) + return "OOOK"; + + return ""; + } +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-852.kt b/testData/ast/issues/file/kt-852.kt new file mode 100644 index 00000000000..be058a4976f --- /dev/null +++ b/testData/ast/issues/file/kt-852.kt @@ -0,0 +1,13 @@ +package demo +open class Test() { +open fun test() : String? { +var s1 : String? = "" +var s2 : String? = "" +var s3 : String? = "" +if (((s1?.isEmpty()).sure() && (s2?.isEmpty()).sure())) +return "OK" +if (((s1?.isEmpty()).sure() && (s2?.isEmpty()).sure() && (s3?.isEmpty()).sure())) +return "OOOK" +return "" +} +} \ No newline at end of file From d03337dc0e5f047219da9ff5601284217c2e8d31 Mon Sep 17 00:00:00 2001 From: ignatov Date: Mon, 26 Dec 2011 16:37:30 +0400 Subject: [PATCH 188/206] fix --- testData/ast/issues/file/kt-809-string.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testData/ast/issues/file/kt-809-string.kt b/testData/ast/issues/file/kt-809-string.kt index 062a09acdb4..9dea26fc2eb 100644 --- a/testData/ast/issues/file/kt-809-string.kt +++ b/testData/ast/issues/file/kt-809-string.kt @@ -1,6 +1,6 @@ package demo open class Container() { -var myString : String? = 1 +var myString : String? = "1" } open class One() { class object { From 891f844fda1392469d23c7e6929f539aa6b57730 Mon Sep 17 00:00:00 2001 From: ignatov Date: Mon, 26 Dec 2011 16:54:04 +0400 Subject: [PATCH 189/206] KT-638 Add correctly support for generic init functions --- src/org/jetbrains/jet/j2k/ast/Class.java | 2 +- src/org/jetbrains/jet/j2k/ast/ClassType.java | 10 ++++- .../constructors/file/genericIdentifier.kt | 6 +-- testData/ast/issues/file/kt-638.jav | 33 ++++++++++++++++ testData/ast/issues/file/kt-638.kt | 38 +++++++++++++++++++ 5 files changed, 83 insertions(+), 6 deletions(-) create mode 100644 testData/ast/issues/file/kt-638.jav create mode 100644 testData/ast/issues/file/kt-638.kt diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java index c00c63a32e3..e1db54e456d 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -111,7 +111,7 @@ public class Class extends Member { result.add(new Function( new IdentifierImpl("init"), modifiers, - new ClassType(myName), + new ClassType(myName, typeParameters, false), typeParameters, f.getParams(), block diff --git a/src/org/jetbrains/jet/j2k/ast/ClassType.java b/src/org/jetbrains/jet/j2k/ast/ClassType.java index 830c3a49e5d..5e330877280 100644 --- a/src/org/jetbrains/jet/j2k/ast/ClassType.java +++ b/src/org/jetbrains/jet/j2k/ast/ClassType.java @@ -11,9 +11,15 @@ import java.util.List; */ public class ClassType extends Type { private final Identifier myType; - private final List myParameters; + private final List myParameters; - public ClassType(Identifier type, List parameters) { + public ClassType(Identifier type, List parameters, boolean nullable) { + myType = type; + myParameters = parameters; + myNullable = nullable; + } + + public ClassType(Identifier type, List parameters) { myType = type; myParameters = parameters; } diff --git a/testData/ast/constructors/file/genericIdentifier.kt b/testData/ast/constructors/file/genericIdentifier.kt index 249ba2f3b56..ed47317c8d5 100644 --- a/testData/ast/constructors/file/genericIdentifier.kt +++ b/testData/ast/constructors/file/genericIdentifier.kt @@ -10,16 +10,16 @@ open public fun getName() : T? { return myName } class object { -open public fun init(name : T?) : Identifier { +open public fun init(name : T?) : Identifier { val __ = Identifier(name, false) return __ } -open public fun init(name : T?, isNullable : Boolean) : Identifier { +open public fun init(name : T?, isNullable : Boolean) : Identifier { val __ = Identifier(name, false) __.myNullable = isNullable return __ } -open public fun init(name : T?, hasDollar : Boolean, isNullable : Boolean) : Identifier { +open public fun init(name : T?, hasDollar : Boolean, isNullable : Boolean) : Identifier { val __ = Identifier(name, hasDollar) __.myNullable = isNullable return __ diff --git a/testData/ast/issues/file/kt-638.jav b/testData/ast/issues/file/kt-638.jav new file mode 100644 index 00000000000..8a5b22477da --- /dev/null +++ b/testData/ast/issues/file/kt-638.jav @@ -0,0 +1,33 @@ +public class Identifier { + private final T myName; + private boolean myHasDollar; + private boolean myNullable = true; + + public Identifier(T name) { + myName = name; + } + + public Identifier(T name, boolean isNullable) { + myName = name; + myNullable = isNullable; + } + + public Identifier(T name, boolean hasDollar, boolean isNullable) { + myName = name; + myHasDollar = hasDollar; + myNullable = isNullable; + } + + @Override + public T getName() { + return myName; + } +} + +public class User { + public static void main(String[] args) { + Identifier i1 = new Identifier("name", false, true); + Identifier i2 = new Identifier("name", false); + Identifier i3 = new Identifier("name"); + } +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-638.kt b/testData/ast/issues/file/kt-638.kt new file mode 100644 index 00000000000..9b67dfd15bd --- /dev/null +++ b/testData/ast/issues/file/kt-638.kt @@ -0,0 +1,38 @@ +public open class Identifier(_myName : T?, _myHasDollar : Boolean) { +{ +myName = _myName +myHasDollar = _myHasDollar +} +private val myName : T? = null +private var myHasDollar : Boolean = false +private var myNullable : Boolean = true +open public fun getName() : T? { +return myName +} +class object { +open public fun init(name : T?) : Identifier { +val __ = Identifier(name, false) +return __ +} +open public fun init(name : T?, isNullable : Boolean) : Identifier { +val __ = Identifier(name, false) +__.myNullable = isNullable +return __ +} +open public fun init(name : T?, hasDollar : Boolean, isNullable : Boolean) : Identifier { +val __ = Identifier(name, hasDollar) +__.myNullable = isNullable +return __ +} +} +} +public open class User() { +class object { +open public fun main(args : Array?) : Unit { +var i1 : Identifier<*>? = Identifier.init("name", false, true) +var i2 : Identifier<*>? = Identifier.init("name", false) +var i3 : Identifier<*>? = Identifier.init("name") +} +} +} +fun main(args : Array?) = User.main(args) \ No newline at end of file From 9a808c10c9c51bfa4a38256d2e9cdbb97b1ed8b2 Mon Sep 17 00:00:00 2001 From: ignatov Date: Wed, 28 Dec 2011 21:34:52 +0400 Subject: [PATCH 190/206] standalone JavaToKotlinTranslator added --- src/org/jetbrains/jet/j2k/Converter.java | 49 ++---- src/org/jetbrains/jet/j2k/ConverterUtil.java | 45 +++++ .../jet/j2k/JavaToKotlinTranslator.java | 161 ++++++++++++++++++ .../SetupJavaCoreEnvironmentException.java | 9 + .../jet/j2k/visitors/ElementVisitor.java | 9 +- .../jet/j2k/visitors/StatementVisitor.java | 27 ++- 6 files changed, 248 insertions(+), 52 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/JavaToKotlinTranslator.java create mode 100644 src/org/jetbrains/jet/j2k/SetupJavaCoreEnvironmentException.java diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index a94f30c6cd2..2898e4ce555 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -1,8 +1,6 @@ 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.*; @@ -22,7 +20,7 @@ import static org.jetbrains.jet.j2k.visitors.TypeVisitor.*; */ public class Converter { @NotNull - private final static Set NOT_NULL_ANNOTATIONS = new HashSet() { + final static Set NOT_NULL_ANNOTATIONS = new HashSet() { { add("org.jetbrains.annotations.NotNull"); add("com.sun.istack.internal.NotNull"); @@ -326,9 +324,9 @@ public class Converter { ourMethodReturnType = method.getReturnType(); final IdentifierImpl identifier = new IdentifierImpl(method.getName()); - final Type returnType = typeToType(method.getReturnType(), isNotNull(method.getModifierList())); + final Type returnType = typeToType(method.getReturnType(), ConverterUtil.isAnnotatedAsNotNull(method.getModifierList())); final Block body = blockToBlock(method.getBody(), notEmpty); - final Element params = elementToElement(method.getParameterList()); + final Element params = createFunctionParameters(method); final List typeParameters = elementsToElementList(method.getTypeParameters()); final Set modifiers = modifiersListToModifiersSet(method.getModifierList()); @@ -361,6 +359,19 @@ public class Converter { ); } + @NotNull + private static ParameterList createFunctionParameters(@NotNull PsiMethod method) { + List result = new LinkedList(); + for (PsiParameter parameter : method.getParameterList().getParameters()) { + result.add(new Parameter( + new IdentifierImpl(parameter.getName()), + typeToType(parameter.getType(), ConverterUtil.isAnnotatedAsNotNull(parameter.getModifierList())), + ConverterUtil.isReadOnly(parameter, method.getBody()) + )); + } + return new ParameterList(result); + } + private static boolean isNotOpenMethod(@NotNull final PsiMethod method) { if (method.getParent() instanceof PsiClass) { final PsiModifierList parentModifierList = ((PsiClass) method.getParent()).getModifierList(); @@ -549,35 +560,10 @@ public class Converter { public static Parameter parameterToParameter(@NotNull PsiParameter parameter) { return new Parameter( new IdentifierImpl(parameter.getName()), - typeToType(parameter.getType(), isNotNull(parameter.getModifierList())), - isReadOnly(parameter) + typeToType(parameter.getType(), ConverterUtil.isAnnotatedAsNotNull(parameter.getModifierList())) ); } - public static boolean isNotNull(@Nullable PsiModifierList modifierList) { - if (modifierList != null) { - PsiAnnotation[] annotations = modifierList.getAnnotations(); - for (PsiAnnotation a : annotations) { - String qualifiedName = a.getQualifiedName(); - if (qualifiedName != null && NOT_NULL_ANNOTATIONS.contains(qualifiedName)) - return true; - } - } - return false; - } - - private static boolean isReadOnly(@NotNull PsiParameter parameter) { - try { - for (PsiReference r : (ReferencesSearch.search(parameter))) { - if (r instanceof PsiExpression && PsiUtil.isAccessedForWriting((PsiExpression) r)) { - return false; - } - } - } catch (IllegalArgumentException ignored) { - } - return true; - } - @NotNull public static Identifier identifierToIdentifier(@Nullable PsiIdentifier identifier) { if (identifier == null) return Identifier.EMPTY_IDENTIFIER; @@ -722,4 +708,5 @@ public class Converter { createConversionForExpression(expression, type) : ""; return new SureCallChainExpression(expressionToExpression(expression), conversion); } + } \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/ConverterUtil.java b/src/org/jetbrains/jet/j2k/ConverterUtil.java index eb04032aa7b..a979ff61be1 100644 --- a/src/org/jetbrains/jet/j2k/ConverterUtil.java +++ b/src/org/jetbrains/jet/j2k/ConverterUtil.java @@ -2,6 +2,7 @@ package org.jetbrains.jet.j2k; import com.intellij.openapi.util.Pair; import com.intellij.psi.*; +import com.intellij.psi.util.PsiUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -9,6 +10,8 @@ import java.text.MessageFormat; import java.util.LinkedList; import java.util.List; +import static org.jetbrains.jet.j2k.Converter.NOT_NULL_ANNOTATIONS; + /** * @author ignatov */ @@ -68,4 +71,46 @@ public class ConverterUtil { final PsiType componentType = ((PsiArrayType) type).getComponentType(); return componentType.equalsToText("java.lang.String"); } + + public static int countWritingAccesses(@Nullable PsiElement element, @Nullable PsiElement container) { + int counter = 0; + if (container != null) { + ReferenceCollector visitor = new ReferenceCollector(); + container.accept(visitor); + for (PsiReferenceExpression e : visitor.getCollectedReferences()) + if (e.isReferenceTo(element) && PsiUtil.isAccessedForWriting(e)) + counter++; + } + return counter; + } + + static boolean isReadOnly(PsiElement element, PsiElement container) { + return countWritingAccesses(element, container) == 0; + } + + public static boolean isAnnotatedAsNotNull(@Nullable PsiModifierList modifierList) { + if (modifierList != null) { + PsiAnnotation[] annotations = modifierList.getAnnotations(); + for (PsiAnnotation a : annotations) { + String qualifiedName = a.getQualifiedName(); + if (qualifiedName != null && NOT_NULL_ANNOTATIONS.contains(qualifiedName)) + return true; + } + } + return false; + } + + static class ReferenceCollector extends JavaRecursiveElementVisitor { + public List getCollectedReferences() { + return myCollectedReferences; + } + + private List myCollectedReferences = new LinkedList(); + + @Override + public void visitReferenceExpression(PsiReferenceExpression expression) { + super.visitReferenceExpression(expression); + myCollectedReferences.add(expression); + } + } } diff --git a/src/org/jetbrains/jet/j2k/JavaToKotlinTranslator.java b/src/org/jetbrains/jet/j2k/JavaToKotlinTranslator.java new file mode 100644 index 00000000000..7a7b224f62c --- /dev/null +++ b/src/org/jetbrains/jet/j2k/JavaToKotlinTranslator.java @@ -0,0 +1,161 @@ +/* + * Copyright 2000-2011 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.jet.j2k; + +import com.intellij.core.JavaCoreEnvironment; +import com.intellij.lang.java.JavaLanguage; +import com.intellij.openapi.Disposable; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiFileFactory; +import com.intellij.psi.PsiJavaFile; +import com.intellij.util.Function; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.j2k.visitors.ClassVisitor; + +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.net.URLClassLoader; + +/** + * @author ignatov + */ +public class JavaToKotlinTranslator { + private JavaToKotlinTranslator() { + } + + @Nullable + protected static PsiFile createFile(@NonNls String name, String text) { + JavaCoreEnvironment javaCoreEnvironment = new JavaCoreEnvironment(new Disposable() { + @Override + public void dispose() { + } + }); + + javaCoreEnvironment.addToClasspath(findRtJar(true)); + javaCoreEnvironment.addToClasspath(new File("jre/lib/annotations.jar")); + + return PsiFileFactory.getInstance(javaCoreEnvironment.getProject()).createFileFromText( + name, JavaLanguage.INSTANCE, text + ); + } + + @NotNull + private static String prettify(@Nullable String code) { + if (code == null) + return ""; + return code + .trim() + .replaceAll("\r\n", "\n") + .replaceAll(" \n", "\n") + .replaceAll("\n ", "\n") + .replaceAll("\n+", "\n") + .replaceAll(" +", " ") + .trim() + ; + } + + public static File findRtJar(boolean failOnError) { + String javaHome = System.getenv("JAVA_HOME"); + File rtJar; + if (javaHome == null) { + rtJar = findActiveRtJar(failOnError); + + if (rtJar == null && failOnError) { + throw new SetupJavaCoreEnvironmentException("JAVA_HOME environment variable needs to be defined"); + } + } else { + rtJar = findRtJar(javaHome); + } + + if ((rtJar == null || !rtJar.exists()) && failOnError) { + rtJar = findActiveRtJar(failOnError); + + if ((rtJar == null || !rtJar.exists())) { + throw new SetupJavaCoreEnvironmentException("No rt.jar found under JAVA_HOME=" + javaHome); + } + } + return rtJar; + } + + private static File findRtJar(String javaHome) { + File rtJar = new File(javaHome, "jre/lib/rt.jar"); + if (rtJar.exists()) { + return rtJar; + } + + File classesJar = new File(new File(javaHome).getParentFile().getAbsolutePath(), "Classes/classes.jar"); + if (classesJar.exists()) { + return classesJar; + } + return null; + } + + public static File findActiveRtJar(boolean failOnError) { + ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader(); + if (systemClassLoader instanceof URLClassLoader) { + URLClassLoader loader = (URLClassLoader) systemClassLoader; + for (URL url : loader.getURLs()) { + if ("file".equals(url.getProtocol())) { + if (url.getFile().endsWith("/lib/rt.jar")) { + return new File(url.getFile()); + } + if (url.getFile().endsWith("/Classes/classes.jar")) { + return new File(url.getFile()).getAbsoluteFile(); + } + } + } + if (failOnError) { + throw new SetupJavaCoreEnvironmentException("Could not find rt.jar in system class loader: " + StringUtil.join(loader.getURLs(), new Function() { + @Override + public String fun(URL url) { + return url.toString() + "\n"; + } + }, ", ")); + } + } else if (failOnError) { + throw new SetupJavaCoreEnvironmentException("System class loader is not an URLClassLoader: " + systemClassLoader); + } + return null; + } + + private static void setClassIdentifiers(PsiElement psiFile) { + ClassVisitor c = new ClassVisitor(); + psiFile.accept(c); + Converter.clearClassIdentifiers(); + Converter.setClassIdentifiers(c.getClassIdentifiers()); + } + + static String generateKotlinCode(String arg) { + PsiFile file = createFile("test.java", arg); + if (file != null && file instanceof PsiJavaFile) { + setClassIdentifiers(file); + return prettify(Converter.fileToFile((PsiJavaFile) file).toKotlin()); + } + return ""; + } + + public static void main(String[] args) throws IOException { + if (args.length > 0) { + //noinspection UseOfSystemOutOrSystemErr + System.out.println(generateKotlinCode(args[0])); + } + } +} diff --git a/src/org/jetbrains/jet/j2k/SetupJavaCoreEnvironmentException.java b/src/org/jetbrains/jet/j2k/SetupJavaCoreEnvironmentException.java new file mode 100644 index 00000000000..bbe7e064ac8 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/SetupJavaCoreEnvironmentException.java @@ -0,0 +1,9 @@ +package org.jetbrains.jet.j2k; + +/** + * @author ignatov + */ +public class SetupJavaCoreEnvironmentException extends RuntimeException { + public SetupJavaCoreEnvironmentException(String s) { + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java index c9fd52f1240..78cccb320bc 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java @@ -2,22 +2,21 @@ package org.jetbrains.jet.j2k.visitors; import com.intellij.psi.*; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.j2k.Converter; import org.jetbrains.jet.j2k.ast.*; import java.util.List; import static org.jetbrains.jet.j2k.Converter.*; +import static org.jetbrains.jet.j2k.ConverterUtil.*; /** * @author ignatov */ public class ElementVisitor extends JavaElementVisitor { - @Nullable + @NotNull private Element myResult = Element.EMPTY_ELEMENT; - @Nullable + @NotNull public Element getResult() { return myResult; } @@ -29,7 +28,7 @@ public class ElementVisitor extends JavaElementVisitor { myResult = new LocalVariable( new IdentifierImpl(variable.getName()), // TODO modifiersListToModifiersSet(variable.getModifierList()), - typeToType(variable.getType(), Converter.isNotNull(variable.getModifierList())), + typeToType(variable.getType(), isAnnotatedAsNotNull(variable.getModifierList())), createSureCallOnlyForChain(variable.getInitializer(), variable.getType()) ); } diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index 57d9069cf57..1d7e4d369d7 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -1,9 +1,7 @@ package org.jetbrains.jet.j2k.visitors; import com.intellij.psi.*; -import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.tree.IElementType; -import com.intellij.psi.util.PsiUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.j2k.Converter; @@ -15,6 +13,7 @@ import java.util.LinkedList; import java.util.List; import static org.jetbrains.jet.j2k.Converter.*; +import static org.jetbrains.jet.j2k.ConverterUtil.countWritingAccesses; /** * @author ignatov @@ -110,9 +109,16 @@ public class StatementVisitor extends ElementVisitor { final PsiStatement initialization = statement.getInitialization(); final PsiStatement update = statement.getUpdate(); final PsiExpression condition = statement.getCondition(); + final PsiStatement body = statement.getBody(); + final PsiLocalVariable firstChild = initialization != null && initialization.getFirstChild() instanceof PsiLocalVariable ? (PsiLocalVariable) initialization.getFirstChild() : null; + int bodyWriteCount = countWritingAccesses(firstChild, body); + int conditionWriteCount = countWritingAccesses(firstChild, condition); + int updateWriteCount = countWritingAccesses(firstChild, update); + boolean onceWritableIterator = updateWriteCount == 1 && bodyWriteCount + conditionWriteCount == 0; + final IElementType operationTokenType = condition != null && condition instanceof PsiBinaryExpression ? ((PsiBinaryExpression) condition).getOperationTokenType() : null; if ( @@ -130,7 +136,7 @@ public class StatementVisitor extends ElementVisitor { && initialization.getFirstChild() instanceof PsiLocalVariable && firstChild != null && firstChild.getNameIdentifier() != null - && isOnceWritableIterator(firstChild) + && onceWritableIterator ) { final Expression end = expressionToExpression(((PsiBinaryExpression) condition).getROperand()); final Expression endExpression = operationTokenType == JavaTokenType.LT ? @@ -140,7 +146,7 @@ public class StatementVisitor extends ElementVisitor { new IdentifierImpl(firstChild.getName()), expressionToExpression(firstChild.getInitializer()), endExpression, - statementToStatement(statement.getBody()) + statementToStatement(body) ); } else { // common case: while loop instead of for loop List forStatements = new LinkedList(); @@ -148,23 +154,12 @@ public class StatementVisitor extends ElementVisitor { forStatements.add(new WhileStatement( expressionToExpression(condition), new Block( - Arrays.asList(statementToStatement(statement.getBody()), + Arrays.asList(statementToStatement(body), new Block(Arrays.asList(statementToStatement(update))))))); myResult = new Block(forStatements); } } - private static boolean isOnceWritableIterator(@Nullable PsiLocalVariable firstChild) { - int counter = 0; - if (firstChild != null) - for (PsiReference r : (ReferencesSearch.search(firstChild))) { - if (r instanceof PsiExpression) { - if (PsiUtil.isAccessedForWriting((PsiExpression) r)) - counter++; - } - } - return counter == 1; // only increment usage - } @Override public void visitForeachStatement(@NotNull PsiForeachStatement statement) { From 14eea7bd17de6f7916595bbea8fbd31a6ccbebff Mon Sep 17 00:00:00 2001 From: ignatov Date: Thu, 29 Dec 2011 13:40:58 +0400 Subject: [PATCH 191/206] cli works --- j2k.ipr | 11 +++++++++++ jre/lib/annotations.jar | Bin 11632 -> 0 bytes src/META-INF/MANIFEST.MF | 3 +++ .../jet/j2k/JavaToKotlinTranslator.java | 18 ++++++++++++++++-- 4 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 src/META-INF/MANIFEST.MF diff --git a/j2k.ipr b/j2k.ipr index f175e7ecb1a..85640093dc3 100644 --- a/j2k.ipr +++ b/j2k.ipr @@ -3,6 +3,17 @@ + + + $PROJECT_DIR$/out/artifacts/j2k_jar + + + + + + + +

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

(ZRo)xNlO$EnT}ROd;m^Axr2XKLLq)VklO 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%0DaQBQytj9Q;`HrnT;S zJ?G@4@86*$RYtzGmpPC6xFD^hWSSsvTuMwz3GsI+Cw8h{(+)CJy|2cvRWsgx1~trV z|BXnDlP#aw&Tft9>HN#e2kBijY*Kp}byx*D^3GFT{->S$VMG1FHU7MyX9!oz6sTpC zGQmM$vgbw&lj_CeuekYhq}Rerna+TM)F)wdY63!|(6|%yeJ!Hr{F7;FQB29l;B+3$ z_c_<$YBfBOX*!u^*2qtvTE+mOv!=b3N}Kz)AI{v&Uv6wnLV!OxH5imWMCtso)g^w|<%y{bB9tyc%Z zAw^ZLJJE%sR92Tr3MFEINDVyK)L=c*2%uyofRzXW!A->xVtFFA#4yV%u`pwr`B$lD zGW$P8*xLx~FS=4~16dtTG-h5A;{VC0ZETdGJkNEEDV zDVi`rk96`G+eYFTIG@l08EtG~^Sgo|&;=w8NAK%#iAG0lKDlg9Mjv2sbH^yDeHune z>t5IdQWO_oT?C{LS-EbGuMDZQ�sKdTt@$x_j8aAdhSmd{{#U^bOhu8X1;QmtW-s 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ℜ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 t;>5() { + @NotNull @Override - public String fun(URL url) { + public String fun(@NotNull URL url) { return url.toString() + "\n"; } }, ", ")); @@ -151,15 +167,16 @@ public class JavaToKotlinTranslator { return null; } - private static void setClassIdentifiers(PsiElement psiFile) { + static void setClassIdentifiers(@NotNull PsiElement psiFile) { ClassVisitor c = new ClassVisitor(); psiFile.accept(c); Converter.clearClassIdentifiers(); Converter.setClassIdentifiers(c.getClassIdentifiers()); } - static String generateKotlinCode(String arg) { - PsiFile file = createFile("test.java", arg); + @NotNull + static String generateKotlinCode(@NotNull String arg) { + PsiFile file = createFile(arg); if (file != null && file instanceof PsiJavaFile) { setClassIdentifiers(file); return prettify(Converter.fileToFile((PsiJavaFile) file).toKotlin()); @@ -167,7 +184,17 @@ public class JavaToKotlinTranslator { return ""; } - public static void main(String[] args) throws IOException { + @NotNull + static String generateKotlinCodeWithCompatibilityImport(@NotNull String arg) { + PsiFile file = createFile(arg); + if (file != null && file instanceof PsiJavaFile) { + setClassIdentifiers(file); + return prettify(Converter.fileToFileWithCompatibilityImport((PsiJavaFile) file).toKotlin()); + } + return ""; + } + + public static void main(@NotNull String[] args) throws IOException { //noinspection UseOfSystemOutOrSystemErr final PrintStream out = System.out; if (args.length == 1) { diff --git a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java b/test/org/jetbrains/jet/j2k/StandaloneJavaToKotlinConverterTest.java similarity index 66% rename from test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java rename to test/org/jetbrains/jet/j2k/StandaloneJavaToKotlinConverterTest.java index a8249e8272e..1d3ef343bf6 100644 --- a/test/org/jetbrains/jet/j2k/JavaToKotlinConverterTest.java +++ b/test/org/jetbrains/jet/j2k/StandaloneJavaToKotlinConverterTest.java @@ -1,15 +1,14 @@ package org.jetbrains.jet.j2k; -import com.intellij.codeInsight.daemon.LightDaemonAnalyzerTestCase; -import com.intellij.openapi.projectRoots.Sdk; -import com.intellij.openapi.projectRoots.impl.JavaSdkImpl; +import com.intellij.core.JavaCoreEnvironment; +import com.intellij.psi.PsiFile; import com.intellij.psi.PsiJavaFile; import junit.framework.Assert; import junit.framework.Test; +import junit.framework.TestCase; import junit.framework.TestSuite; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.j2k.visitors.ClassVisitor; import java.io.File; import java.io.IOException; @@ -21,18 +20,21 @@ import static org.jetbrains.jet.j2k.TestCaseBuilder.getTestDataPathBase; /** * @author ignatov */ -public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { +public class StandaloneJavaToKotlinConverterTest extends TestCase { private final String myDataPath; private final String myName; + @NotNull + private final JavaCoreEnvironment myJavaCoreEnvironment; - public JavaToKotlinConverterTest(String dataPath, String name) { + public StandaloneJavaToKotlinConverterTest(String dataPath, String name) { myDataPath = dataPath; myName = name; + myJavaCoreEnvironment = JavaToKotlinTranslator.setUpJavaCoreEnvironment(); } @Override protected void runTest() throws Throwable { - String javaPath = getTestDataPath() + File.separator + getTestFilePath(); + String javaPath = "testData" + File.separator + getTestFilePath(); String kotlinPath = javaPath.replace(".jav", ".kt"); final File kotlinFile = new File(kotlinPath); @@ -65,19 +67,6 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { return myDataPath + File.separator + myName + ".jav"; } - @NotNull - @Override - protected String getTestDataPath() { - return "testData"; - } - - private static Sdk jdkFromIdeaHome() { - return new JavaSdkImpl().createJdk("JDK", "jre", true); - } - - protected Sdk getProjectJDK() { - return jdkFromIdeaHome(); - } @NotNull @Override @@ -92,39 +81,33 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { @NotNull @Override public Test createTest(@NotNull String dataPath, @NotNull String name) { - return new JavaToKotlinConverterTest(dataPath, name); + return new StandaloneJavaToKotlinConverterTest(dataPath, name); } })); return suite; } - private static void configureFromText(String text) throws IOException { - configureFromFileText("test.java", text); - } - - private static void setClassIdentifiers() { - ClassVisitor c = new ClassVisitor(); - myFile.accept(c); - Converter.clearClassIdentifiers(); - Converter.setClassIdentifiers(c.getClassIdentifiers()); + @NotNull + private static String fileToFileWithCompatibilityImport(@NotNull String text) { + return JavaToKotlinTranslator.generateKotlinCodeWithCompatibilityImport(text); } @NotNull - private static String fileToFileWithCompatibilityImport(String text) throws IOException { - configureFromText(text); - setClassIdentifiers(); - return prettify(Converter.fileToFileWithCompatibilityImport((PsiJavaFile) myFile).toKotlin()); + private String fileToKotlin(@NotNull String text) { + return generateKotlinCode(JavaToKotlinTranslator.createFile(myJavaCoreEnvironment, text)); } @NotNull - private static String fileToKotlin(String text) throws IOException { - configureFromText(text); - setClassIdentifiers(); - return prettify(Converter.fileToFile((PsiJavaFile) myFile).toKotlin()); + private static String generateKotlinCode(@Nullable PsiFile file) { + if (file != null && file instanceof PsiJavaFile) { + JavaToKotlinTranslator.setClassIdentifiers(file); + return prettify(Converter.fileToFile((PsiJavaFile) file).toKotlin()); + } + return ""; } @NotNull - private static String methodToKotlin(String text) throws IOException { + private String methodToKotlin(String text) throws IOException { String result = fileToKotlin("final class C {" + text + "}") .replaceAll("class C\\(\\) \\{", ""); result = result.substring(0, result.lastIndexOf("}")); @@ -132,7 +115,7 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { } @NotNull - private static String statementToKotlin(String text) throws Exception { + private String statementToKotlin(String text) throws Exception { String result = methodToKotlin("void main() {" + text + "}"); int pos = result.lastIndexOf("}"); result = result.substring(0, pos).replaceFirst("fun main\\(\\) : Unit \\{", ""); @@ -140,7 +123,7 @@ public class JavaToKotlinConverterTest extends LightDaemonAnalyzerTestCase { } @NotNull - private static String expressionToKotlin(String code) throws Exception { + private String expressionToKotlin(String code) throws Exception { String result = statementToKotlin("Object o =" + code + "}"); result = result.replaceFirst("var o : Any\\? =", ""); return prettify(result); From 0e37d92bc0f01e777f284d76cc1991fc72ffc02a Mon Sep 17 00:00:00 2001 From: ignatov Date: Fri, 30 Dec 2011 15:48:40 +0400 Subject: [PATCH 195/206] KT-893 Need to support another form of for loop --- src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java | 7 +++++-- testData/ast/issues/file/kt-893.jav | 9 +++++++++ testData/ast/issues/file/kt-893.kt | 8 ++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 testData/ast/issues/file/kt-893.jav create mode 100644 testData/ast/issues/file/kt-893.kt diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index be46b12fae8..48ef77f5e86 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -128,8 +128,7 @@ public class StatementVisitor extends ElementVisitor { && condition != null && update != null && update.getChildren().length == 1 - && update.getChildren()[0] instanceof PsiPostfixExpression - && ((PsiPostfixExpression) update.getChildren()[0]).getOperationTokenType() == JavaTokenType.PLUSPLUS + && isPlusPlusExpression(update.getChildren()[0]) && operationTokenType != null && (operationTokenType == JavaTokenType.LT || operationTokenType == JavaTokenType.LE) && initialization.getFirstChild() != null @@ -160,6 +159,10 @@ public class StatementVisitor extends ElementVisitor { } } + private static boolean isPlusPlusExpression(@NotNull PsiElement psiElement) { + return (psiElement instanceof PsiPostfixExpression && ((PsiPostfixExpression) psiElement).getOperationTokenType() == JavaTokenType.PLUSPLUS) + || (psiElement instanceof PsiPrefixExpression && ((PsiPrefixExpression) psiElement).getOperationTokenType() == JavaTokenType.PLUSPLUS); + } @Override public void visitForeachStatement(@NotNull PsiForeachStatement statement) { diff --git a/testData/ast/issues/file/kt-893.jav b/testData/ast/issues/file/kt-893.jav new file mode 100644 index 00000000000..8637f952b7e --- /dev/null +++ b/testData/ast/issues/file/kt-893.jav @@ -0,0 +1,9 @@ +package demo; + +class Test { + void test() { + for(int i = 0; i < 10; ++i) { + System.out.println(i) + } + } +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-893.kt b/testData/ast/issues/file/kt-893.kt new file mode 100644 index 00000000000..af7dceb91c2 --- /dev/null +++ b/testData/ast/issues/file/kt-893.kt @@ -0,0 +1,8 @@ +package demo +open class Test() { +open fun test() : Unit { +for (i in 0..(10 - 1)) { +System.out?.println(i) +} +} +} \ No newline at end of file From f2e6716c828b30d762d20aa2e7cd17b9785c8109 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 16 Jan 2012 12:44:58 +0400 Subject: [PATCH 196/206] KT-981 Update Kotlin keywords --- src/org/jetbrains/jet/j2k/ast/Node.java | 2 +- testData/ast/identifier/statement/keywords.jav | 2 +- testData/ast/identifier/statement/keywords.kt | 1 - testData/ast/importStatement/file/importWithKeywords.jav | 2 +- testData/ast/importStatement/file/importWithKeywords.kt | 2 +- 5 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/ast/Node.java b/src/org/jetbrains/jet/j2k/ast/Node.java index 7a6de0e5f2e..40798ea50a1 100644 --- a/src/org/jetbrains/jet/j2k/ast/Node.java +++ b/src/org/jetbrains/jet/j2k/ast/Node.java @@ -18,7 +18,7 @@ public abstract class Node implements INode { @NotNull final static Set ONLY_KOTLIN_KEYWORDS = new HashSet(Arrays.asList( - "namespace", "as", "type", "val", "var", "fun", "is", "in", "object", "when", "trait", "This" + "package", "as", "type", "val", "var", "fun", "is", "in", "object", "when", "trait", "This" )); @NotNull diff --git a/testData/ast/identifier/statement/keywords.jav b/testData/ast/identifier/statement/keywords.jav index 12cf781ef6d..02a6d77d21a 100644 --- a/testData/ast/identifier/statement/keywords.jav +++ b/testData/ast/identifier/statement/keywords.jav @@ -1 +1 @@ -int namespace, as, type, val, var, fun, is, in, object, when, trait, This; \ No newline at end of file +int as, type, val, var, fun, is, in, object, when, trait, This; \ No newline at end of file diff --git a/testData/ast/identifier/statement/keywords.kt b/testData/ast/identifier/statement/keywords.kt index 4458510a622..5395a402d72 100644 --- a/testData/ast/identifier/statement/keywords.kt +++ b/testData/ast/identifier/statement/keywords.kt @@ -1,4 +1,3 @@ -var `namespace` : Int var `as` : Int var `type` : Int var `val` : Int diff --git a/testData/ast/importStatement/file/importWithKeywords.jav b/testData/ast/importStatement/file/importWithKeywords.jav index f82ae0443b4..5b4e73fec5a 100644 --- a/testData/ast/importStatement/file/importWithKeywords.jav +++ b/testData/ast/importStatement/file/importWithKeywords.jav @@ -1,5 +1,5 @@ package test; -import namespace.as.type.val.var.fun.is.in.object.when.trait.This; +import as.type.val.var.fun.is.in.object.when.trait.This; class Test {} diff --git a/testData/ast/importStatement/file/importWithKeywords.kt b/testData/ast/importStatement/file/importWithKeywords.kt index b9370c9adf9..63b5935201f 100644 --- a/testData/ast/importStatement/file/importWithKeywords.kt +++ b/testData/ast/importStatement/file/importWithKeywords.kt @@ -1,4 +1,4 @@ package test -import `namespace`.`as`.`type`.`val`.`var`.`fun`.`is`.`in`.`object`.`when`.`trait`.`This` +import `as`.`type`.`val`.`var`.`fun`.`is`.`in`.`object`.`when`.`trait`.`This` open class Test() { } \ No newline at end of file From d9b7435559ea85b4806ae60b2c3858ab3498db07 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 16 Jan 2012 14:08:15 +0400 Subject: [PATCH 197/206] KT-963 Add "constructor" after the latest field --- src/org/jetbrains/jet/j2k/Converter.java | 2 +- src/org/jetbrains/jet/j2k/ast/Class.java | 2 +- src/org/jetbrains/jet/j2k/ast/Enum.java | 2 +- testData/ast/issues/file/kt-963.jav | 8 ++++++++ testData/ast/issues/file/kt-963.kt | 0 5 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 testData/ast/issues/file/kt-963.jav create mode 100644 testData/ast/issues/file/kt-963.kt diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 2898e4ce555..3e59e0f47df 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -111,7 +111,7 @@ public class Converter { private static List getFinalOrWithEmptyInitializer(@NotNull List fields) { List result = new LinkedList(); for (Field f : fields) - if (f.isFinal() || f.getInitializer().toKotlin().isEmpty()) + if (f.isVal() || f.getInitializer().toKotlin().isEmpty()) result.add(f); return result; } diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java index e1db54e456d..141a12699f0 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -174,8 +174,8 @@ public class Class extends Member { @NotNull String bodyToKotlin() { return SPACE + "{" + N + - primaryConstructorBodyToKotlin() + N + AstUtil.joinNodes(getNonStatic(membersExceptConstructors()), N) + N + + primaryConstructorBodyToKotlin() + N + classObjectToKotlin() + N + "}"; } diff --git a/src/org/jetbrains/jet/j2k/ast/Enum.java b/src/org/jetbrains/jet/j2k/ast/Enum.java index 7ac18cf480a..2fd28501176 100644 --- a/src/org/jetbrains/jet/j2k/ast/Enum.java +++ b/src/org/jetbrains/jet/j2k/ast/Enum.java @@ -30,8 +30,8 @@ public class Enum extends Class { public String toKotlin() { return modifiersToKotlin() + "enum class" + SPACE + myName.toKotlin() + primaryConstructorSignatureToKotlin() + typeParametersToKotlin() + implementTypesToKotlin() + SPACE + "{" + N + - primaryConstructorBodyToKotlin() + N + AstUtil.joinNodes(membersExceptConstructors(), N) + N + + primaryConstructorBodyToKotlin() + N + "public fun name() : String { return \"\" }" + N + // TODO : remove hack "public fun order() : Int { return 0 }" + N + "}"; diff --git a/testData/ast/issues/file/kt-963.jav b/testData/ast/issues/file/kt-963.jav new file mode 100644 index 00000000000..9e2cbb3e114 --- /dev/null +++ b/testData/ast/issues/file/kt-963.jav @@ -0,0 +1,8 @@ +package demo; + +class C { + public C(int a) { + abc = a * 2; + } + int abc = 0; +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-963.kt b/testData/ast/issues/file/kt-963.kt new file mode 100644 index 00000000000..e69de29bb2d From 3fa6882c8ce74e7b90acb628998eb49af47d7ad3 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 16 Jan 2012 15:05:31 +0400 Subject: [PATCH 198/206] KT-1016 Add initializers for fields more correctly --- src/org/jetbrains/jet/j2k/Converter.java | 14 +++++++------ .../jetbrains/jet/j2k/ast/EnumConstant.java | 2 +- src/org/jetbrains/jet/j2k/ast/Field.java | 21 ++++++++++--------- .../ast/annotations/file/jetbrainsNotNull.kt | 6 +++--- .../ast/constructors/file/allCallsPrimary2.kt | 6 +++--- .../ast/constructors/file/customerBuilder.kt | 16 +++++++------- .../constructors/file/genericIdentifier.kt | 8 +++---- testData/ast/constructors/file/identifier.kt | 8 +++---- .../file/withManyDefaultParams.kt | 16 +++++++------- testData/ast/enum/class/colorEnum.kt | 8 +++---- .../fieldsWithPrimaryPrivateConstructor.kt | 6 +++--- .../enum/class/primaryPrivateConstructor.kt | 6 +++--- .../identifier/file/finalFieldReference.kt | 8 +++---- .../file/classOneExtendsBaseGeneric.kt | 2 +- ...dsBaseWithZeroParamsNonEmptyConstructor.kt | 2 +- testData/ast/issues/file/kt-1016.jav | 8 +++++++ testData/ast/issues/file/kt-1016.kt | 7 +++++++ testData/ast/issues/file/kt-638.kt | 8 +++---- testData/ast/issues/file/kt-836.kt | 6 +++--- testData/ast/issues/file/kt-837.kt | 6 +++--- testData/ast/issues/file/kt-963.kt | 7 +++++++ 21 files changed, 98 insertions(+), 73 deletions(-) create mode 100644 testData/ast/issues/file/kt-1016.jav create mode 100644 testData/ast/issues/file/kt-1016.kt diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 3e59e0f47df..4ed80d216c5 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -12,6 +12,7 @@ import org.jetbrains.jet.j2k.visitors.*; import java.util.*; +import static org.jetbrains.jet.j2k.ConverterUtil.countWritingAccesses; import static org.jetbrains.jet.j2k.ConverterUtil.createMainFunction; import static org.jetbrains.jet.j2k.visitors.TypeVisitor.*; @@ -99,7 +100,7 @@ public class Converter { List members = new LinkedList(); for (PsiElement e : psiClass.getChildren()) { if (e instanceof PsiMethod) members.add(methodToFunction((PsiMethod) e, true)); - else if (e instanceof PsiField) members.add(fieldToField((PsiField) e)); + else if (e instanceof PsiField) members.add(fieldToField((PsiField) e, psiClass)); else if (e instanceof PsiClass) members.add(classToClass((PsiClass) e)); else if (e instanceof PsiClassInitializer) members.add(initializerToInitializer((PsiClassInitializer) e)); else if (e instanceof PsiMember) System.out.println(e.getClass() + " " + e.getText()); @@ -147,7 +148,7 @@ public class Converter { @NotNull private static Class classToClass(@NotNull PsiClass psiClass) { final Set modifiers = modifiersListToModifiersSet(psiClass.getModifierList()); - final List fields = fieldsToFieldList(psiClass.getFields()); + final List fields = fieldsToFieldList(psiClass.getFields(), psiClass); final List typeParameters = elementsToElementList(psiClass.getTypeParameters()); final List implementsTypes = typesToNotNullableTypeList(psiClass.getImplementsListTypes()); final List extendsTypes = typesToNotNullableTypeList(psiClass.getExtendsListTypes()); @@ -260,14 +261,14 @@ public class Converter { } @NotNull - private static List fieldsToFieldList(@NotNull PsiField[] fields) { + private static List fieldsToFieldList(@NotNull PsiField[] fields, PsiClass psiClass) { List result = new LinkedList(); - for (PsiField f : fields) result.add(fieldToField(f)); + for (PsiField f : fields) result.add(fieldToField(f, psiClass)); return result; } @NotNull - private static Field fieldToField(@NotNull PsiField field) { + private static Field fieldToField(@NotNull PsiField field, PsiClass psiClass) { Set modifiers = modifiersListToModifiersSet(field.getModifierList()); if (field instanceof PsiEnumConstant) // TODO: remove instanceof return new EnumConstant( @@ -280,7 +281,8 @@ public class Converter { new IdentifierImpl(field.getName()), // TODO modifiers, typeToType(field.getType()), - createSureCallOnlyForChain(field.getInitializer(), field.getType()) // TODO: add modifiers + createSureCallOnlyForChain(field.getInitializer(), field.getType()), // TODO: add modifiers + countWritingAccesses(field, psiClass) ); } diff --git a/src/org/jetbrains/jet/j2k/ast/EnumConstant.java b/src/org/jetbrains/jet/j2k/ast/EnumConstant.java index d80ffd3b1eb..d9aba8ef463 100644 --- a/src/org/jetbrains/jet/j2k/ast/EnumConstant.java +++ b/src/org/jetbrains/jet/j2k/ast/EnumConstant.java @@ -9,7 +9,7 @@ import java.util.Set; */ public class EnumConstant extends Field { public EnumConstant(Identifier identifier, Set modifiers, @NotNull Type type, Element params) { - super(identifier, modifiers, type.convertedToNotNull(), params); + super(identifier, modifiers, type.convertedToNotNull(), params, 0); } @NotNull diff --git a/src/org/jetbrains/jet/j2k/ast/Field.java b/src/org/jetbrains/jet/j2k/ast/Field.java index 8c2bbde5b94..35e364aa09f 100644 --- a/src/org/jetbrains/jet/j2k/ast/Field.java +++ b/src/org/jetbrains/jet/j2k/ast/Field.java @@ -14,11 +14,13 @@ import static org.jetbrains.jet.j2k.Converter.getDefaultInitializer; */ public class Field extends Member { final Identifier myIdentifier; + private final int myWritingAccesses; final Type myType; final Element myInitializer; - public Field(Identifier identifier, Set modifiers, Type type, Element initializer) { + public Field(Identifier identifier, Set modifiers, Type type, Element initializer, int writingAccesses) { myIdentifier = identifier; + myWritingAccesses = writingAccesses; myModifiers = modifiers; myType = type; myInitializer = initializer; @@ -45,7 +47,7 @@ public class Field extends Member { modifierList.add(accessModifier()); - modifierList.add(myModifiers.contains(Modifier.FINAL) ? "val" : "var"); + modifierList.add(isVal() ? "val" : "var"); if (modifierList.size() > 0) return AstUtil.join(modifierList, SPACE) + SPACE; @@ -53,24 +55,23 @@ public class Field extends Member { return EMPTY; } + public boolean isVal() { + return myModifiers.contains(Modifier.FINAL); + } + @Override public boolean isStatic() { return myModifiers.contains(Modifier.STATIC); } - public boolean isFinal() { - return myModifiers.contains(Modifier.FINAL); - } - @NotNull @Override public String toKotlin() { - String modifier = modifiersToKotlin(); + final String declaration = modifiersToKotlin() + myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin(); if (myInitializer.isEmpty()) - return modifier + myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin() + SPACE + EQUAL + SPACE + getDefaultInitializer(this); + return declaration + (isVal() && !isStatic() && myWritingAccesses == 1 ? EMPTY : SPACE + EQUAL + SPACE + getDefaultInitializer(this)); - return modifier + myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin() + SPACE + - EQUAL + SPACE + myInitializer.toKotlin(); + return declaration + SPACE + EQUAL + SPACE + myInitializer.toKotlin(); } } \ No newline at end of file diff --git a/testData/ast/annotations/file/jetbrainsNotNull.kt b/testData/ast/annotations/file/jetbrainsNotNull.kt index 9213f5f8e4f..0e30c303511 100644 --- a/testData/ast/annotations/file/jetbrainsNotNull.kt +++ b/testData/ast/annotations/file/jetbrainsNotNull.kt @@ -1,8 +1,5 @@ package test public open class Test(str : String) { -{ -myStr = str -} var myStr : String? = "String2" open public fun sout(str : String) : Unit { System.out?.println(str) @@ -17,4 +14,7 @@ sout(test) sout(dummy(test)) Test(test) } +{ +myStr = str +} } \ No newline at end of file diff --git a/testData/ast/constructors/file/allCallsPrimary2.kt b/testData/ast/constructors/file/allCallsPrimary2.kt index 31a0f698398..312f31d82f6 100644 --- a/testData/ast/constructors/file/allCallsPrimary2.kt +++ b/testData/ast/constructors/file/allCallsPrimary2.kt @@ -1,12 +1,12 @@ open class C(arg1 : Int) { +val myArg1 : Int +var myArg2 : Int = 0 +var myArg3 : Int = 0 { myArg1 = arg1 myArg2 = 0 myArg3 = 0 } -val myArg1 : Int = 0 -var myArg2 : Int = 0 -var myArg3 : Int = 0 class object { open fun init(arg1 : Int, arg2 : Int, arg3 : Int) : C { val __ = C(arg1) diff --git a/testData/ast/constructors/file/customerBuilder.kt b/testData/ast/constructors/file/customerBuilder.kt index efad343539a..1c0cd6a13e4 100644 --- a/testData/ast/constructors/file/customerBuilder.kt +++ b/testData/ast/constructors/file/customerBuilder.kt @@ -1,13 +1,7 @@ package org.test.customer open class Customer(first : String?, last : String?) { -{ -doSmthBefore() -_firstName = first -_lastName = last -doSmthAfter() -} -public val _firstName : String? = null -public val _lastName : String? = null +public val _firstName : String? +public val _lastName : String? open public fun getFirstName() : String? { return _firstName } @@ -18,6 +12,12 @@ open private fun doSmthBefore() : Unit { } open private fun doSmthAfter() : Unit { } +{ +doSmthBefore() +_firstName = first +_lastName = last +doSmthAfter() +} } open class CustomerBuilder() { public var _firstName : String? = "Homer" diff --git a/testData/ast/constructors/file/genericIdentifier.kt b/testData/ast/constructors/file/genericIdentifier.kt index ed47317c8d5..d4bbdd791bd 100644 --- a/testData/ast/constructors/file/genericIdentifier.kt +++ b/testData/ast/constructors/file/genericIdentifier.kt @@ -1,14 +1,14 @@ public open class Identifier(_myName : T?, _myHasDollar : Boolean) { -{ -myName = _myName -myHasDollar = _myHasDollar -} private val myName : T? = null private var myHasDollar : Boolean = false private var myNullable : Boolean = true open public fun getName() : T? { return myName } +{ +myName = _myName +myHasDollar = _myHasDollar +} class object { open public fun init(name : T?) : Identifier { val __ = Identifier(name, false) diff --git a/testData/ast/constructors/file/identifier.kt b/testData/ast/constructors/file/identifier.kt index 4c296879705..ba304bedf86 100644 --- a/testData/ast/constructors/file/identifier.kt +++ b/testData/ast/constructors/file/identifier.kt @@ -1,14 +1,14 @@ public open class Identifier(_myName : String?, _myHasDollar : Boolean) { -{ -myName = _myName -myHasDollar = _myHasDollar -} private val myName : String? = null private var myHasDollar : Boolean = false private var myNullable : Boolean = true open public fun getName() : String? { return myName } +{ +myName = _myName +myHasDollar = _myHasDollar +} class object { open public fun init(name : String?) : Identifier { val __ = Identifier(name, false) diff --git a/testData/ast/constructors/file/withManyDefaultParams.kt b/testData/ast/constructors/file/withManyDefaultParams.kt index c18bb2aeeaf..276b6d398b4 100644 --- a/testData/ast/constructors/file/withManyDefaultParams.kt +++ b/testData/ast/constructors/file/withManyDefaultParams.kt @@ -1,4 +1,12 @@ public open class Test(_myName : String?, _a : Boolean, _b : Double, _c : Float, _d : Long, _e : Int, _f : Short, _g : Char) { +private val myName : String? +private var a : Boolean = false +private var b : Double = 0.dbl +private var c : Float = 0.flt +private var d : Long = 0 +private var e : Int = 0 +private var f : Short = 0 +private var g : Char = ' ' { myName = _myName a = _a @@ -9,14 +17,6 @@ e = _e f = _f g = _g } -private val myName : String? = null -private var a : Boolean = false -private var b : Double = 0.dbl -private var c : Float = 0.flt -private var d : Long = 0 -private var e : Int = 0 -private var f : Short = 0 -private var g : Char = ' ' class object { open public fun init() : Test { val __ = Test(null, false, 0.dbl, 0.flt, 0, 0, 0, ' ') diff --git a/testData/ast/enum/class/colorEnum.kt b/testData/ast/enum/class/colorEnum.kt index af42b240e68..3f4198497a5 100644 --- a/testData/ast/enum/class/colorEnum.kt +++ b/testData/ast/enum/class/colorEnum.kt @@ -1,14 +1,14 @@ package demo enum class MyEnum(_color : Int) { -{ -color = _color -} RED : MyEnum(10) BLUE : MyEnum(20) -private val color : Int = 0 +private val color : Int public fun getColor() : Int { return color } +{ +color = _color +} public fun name() : String { return "" } public fun order() : Int { return 0 } } \ No newline at end of file diff --git a/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt b/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt index 1795c0b93c4..fa05a558601 100644 --- a/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt +++ b/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt @@ -1,7 +1,4 @@ enum class Color(c : Int) { -{ -code = c -} WHITE : Color(21) BLACK : Color(22) RED : Color(23) @@ -11,6 +8,9 @@ private var code : Int = 0 public fun getCode() : Int { return code } +{ +code = c +} public fun name() : String { return "" } public fun order() : Int { return 0 } } \ No newline at end of file diff --git a/testData/ast/enum/class/primaryPrivateConstructor.kt b/testData/ast/enum/class/primaryPrivateConstructor.kt index 37be650dc19..7d0338d9a78 100644 --- a/testData/ast/enum/class/primaryPrivateConstructor.kt +++ b/testData/ast/enum/class/primaryPrivateConstructor.kt @@ -1,12 +1,12 @@ package demo enum class Color(c : Int) { -{ -code = c -} private var code : Int = 0 public fun getCode() : Int { return code } +{ +code = c +} public fun name() : String { return "" } public fun order() : Int { return 0 } } \ No newline at end of file diff --git a/testData/ast/identifier/file/finalFieldReference.kt b/testData/ast/identifier/file/finalFieldReference.kt index 1d7011e3e3b..9eca4f6c449 100644 --- a/testData/ast/identifier/file/finalFieldReference.kt +++ b/testData/ast/identifier/file/finalFieldReference.kt @@ -3,11 +3,11 @@ open class `$$$$$`() { open class `$`() { } open class `$$`(`$$$$` : `$$$$$`?) : `$`() { -{ -`$$$` = `$$$$` -} -val `$$$` : `$$$$$`? = null +val `$$$` : `$$$$$`? open public fun `$$$$$$`() : `$$$$$`? { return `$$$` } +{ +`$$$` = `$$$$` +} } \ No newline at end of file diff --git a/testData/ast/inheritance/file/classOneExtendsBaseGeneric.kt b/testData/ast/inheritance/file/classOneExtendsBaseGeneric.kt index 51aa2aaea5e..a324e8503b5 100644 --- a/testData/ast/inheritance/file/classOneExtendsBaseGeneric.kt +++ b/testData/ast/inheritance/file/classOneExtendsBaseGeneric.kt @@ -1,8 +1,8 @@ open class Base(name : T?) { } open class One(name : T?, second : K?) : Base(name) { +private var mySecond : K? = null { mySecond = second } -private var mySecond : K? = null } \ No newline at end of file diff --git a/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.kt b/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.kt index 34975018246..cd9b7f3b8e9 100644 --- a/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.kt +++ b/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.kt @@ -1,8 +1,8 @@ open class Base(name : String?) { } open class One(name : String?, second : String?) : Base(name) { +private var mySecond : String? = null { mySecond = second } -private var mySecond : String? = null } \ No newline at end of file diff --git a/testData/ast/issues/file/kt-1016.jav b/testData/ast/issues/file/kt-1016.jav new file mode 100644 index 00000000000..2e7b3a85644 --- /dev/null +++ b/testData/ast/issues/file/kt-1016.jav @@ -0,0 +1,8 @@ +package demo; + +class C { + private final int i; + public C(int i) { + this.i = i; + } +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-1016.kt b/testData/ast/issues/file/kt-1016.kt new file mode 100644 index 00000000000..801abcf6e5a --- /dev/null +++ b/testData/ast/issues/file/kt-1016.kt @@ -0,0 +1,7 @@ +package demo +open class C(i : Int) { +private val i : Int +{ +this.i = i +} +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-638.kt b/testData/ast/issues/file/kt-638.kt index 9b67dfd15bd..bb436c18cb7 100644 --- a/testData/ast/issues/file/kt-638.kt +++ b/testData/ast/issues/file/kt-638.kt @@ -1,14 +1,14 @@ public open class Identifier(_myName : T?, _myHasDollar : Boolean) { -{ -myName = _myName -myHasDollar = _myHasDollar -} private val myName : T? = null private var myHasDollar : Boolean = false private var myNullable : Boolean = true open public fun getName() : T? { return myName } +{ +myName = _myName +myHasDollar = _myHasDollar +} class object { open public fun init(name : T?) : Identifier { val __ = Identifier(name, false) diff --git a/testData/ast/issues/file/kt-836.kt b/testData/ast/issues/file/kt-836.kt index 8b761878378..d7ab78c24fd 100644 --- a/testData/ast/issues/file/kt-836.kt +++ b/testData/ast/issues/file/kt-836.kt @@ -1,13 +1,13 @@ package com.voltvoodoo.saplo4j.model import java.io.Serializable public open class Language(code : String?) : Serializable { -{ -this.code = code -} protected var code : String? = null override public fun toString() : String? { return this.code } +{ +this.code = code +} } open class Base() { open fun test() : Unit { diff --git a/testData/ast/issues/file/kt-837.kt b/testData/ast/issues/file/kt-837.kt index 7f6e2e5c63b..7aabbfc9c55 100644 --- a/testData/ast/issues/file/kt-837.kt +++ b/testData/ast/issues/file/kt-837.kt @@ -1,13 +1,13 @@ package com.voltvoodoo.saplo4j.model import java.io.Serializable public open class Language(code : String?) : Serializable { -{ -this.code = code -} protected var code : String? = null open public fun equals(other : Language?) : Boolean { return other?.toString()?.equals(this.toString()).sure() } +{ +this.code = code +} class object { public var ENGLISH : Language? = Language("en") public var SWEDISH : Language? = Language("sv") diff --git a/testData/ast/issues/file/kt-963.kt b/testData/ast/issues/file/kt-963.kt index e69de29bb2d..3b22ff9d391 100644 --- a/testData/ast/issues/file/kt-963.kt +++ b/testData/ast/issues/file/kt-963.kt @@ -0,0 +1,7 @@ +package demo +open class C(a : Int) { +var abc : Int = 0 +{ +abc = (a * 2) +} +} \ No newline at end of file From 0ed16b5c9c716d2c0ab22d68c88725d273175b3a Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 16 Jan 2012 18:44:33 +0400 Subject: [PATCH 199/206] KT-1048 Need to replace missed generics parameters by theirs upper bounds --- .../jet/j2k/ast/StarProjectionType.java | 7 +++++++ .../jet/j2k/visitors/TypeVisitor.java | 9 +++++++-- testData/ast/class/file/kt-639.kt | 4 ++-- .../ast/constructors/file/genericIdentifier.kt | 4 ++-- testData/ast/issues/file/kt-1048.jav | 18 ++++++++++++++++++ testData/ast/issues/file/kt-1048.kt | 14 ++++++++++++++ testData/ast/issues/file/kt-638.kt | 4 ++-- .../file/fullQualifiedName.kt | 2 +- .../file/fullQualifiedName2.kt | 2 +- testData/ast/rawGenerics/file/kt-540-map.kt | 4 ++-- .../rawGenerics/file/kt-540-rawGenericClass.kt | 6 +++--- testData/ast/rawGenerics/file/kt-540.kt | 4 ++-- 12 files changed, 61 insertions(+), 17 deletions(-) create mode 100644 testData/ast/issues/file/kt-1048.jav create mode 100644 testData/ast/issues/file/kt-1048.kt diff --git a/src/org/jetbrains/jet/j2k/ast/StarProjectionType.java b/src/org/jetbrains/jet/j2k/ast/StarProjectionType.java index c409b98da49..145b322e2d3 100644 --- a/src/org/jetbrains/jet/j2k/ast/StarProjectionType.java +++ b/src/org/jetbrains/jet/j2k/ast/StarProjectionType.java @@ -9,6 +9,13 @@ public class StarProjectionType extends Type { @NotNull @Override public String toKotlin() { + G g = new G(""); + G g2 = new G(""); return STAR; } } + +class G { + public G(T t) { + } +} \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java index acaa8c6b9d6..dc7d1814e07 100644 --- a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java @@ -116,8 +116,13 @@ public class TypeVisitor extends PsiTypeVisitor { if (resolve != null) { if (resolve instanceof PsiClass) //noinspection UnusedDeclaration - for (PsiTypeParameter p : ((PsiClass) resolve).getTypeParameters()) - typeParams.add(new StarProjectionType()); + for (PsiTypeParameter p : ((PsiClass) resolve).getTypeParameters()) { + Type boundType = p.getSuperTypes().length > 0 ? + new ClassType(new IdentifierImpl(getClassTypeName(p.getSuperTypes()[0])), typesToTypeList(p.getSuperTypes()[0].getParameters()), true) : + new StarProjectionType(); + + typeParams.add(boundType); + } } } return typeParams; diff --git a/testData/ast/class/file/kt-639.kt b/testData/ast/class/file/kt-639.kt index 3164965fa1f..fe438a103ec 100644 --- a/testData/ast/class/file/kt-639.kt +++ b/testData/ast/class/file/kt-639.kt @@ -14,8 +14,8 @@ return __ } open class User() { open fun main() : Unit { -var m : HashMap<*, *>? = HashMap(1) -var m2 : HashMap<*, *>? = HashMap(10) +var m : HashMap? = HashMap(1) +var m2 : HashMap? = HashMap(10) var t1 : Test? = Test.init() var t2 : Test? = Test.init("") } diff --git a/testData/ast/constructors/file/genericIdentifier.kt b/testData/ast/constructors/file/genericIdentifier.kt index d4bbdd791bd..56c0cebadac 100644 --- a/testData/ast/constructors/file/genericIdentifier.kt +++ b/testData/ast/constructors/file/genericIdentifier.kt @@ -30,8 +30,8 @@ public open class User() { class object { open public fun main() : Unit { var i1 : Identifier<*>? = Identifier.init("name", false, true) -var i2 : Identifier<*>? = Identifier.init("name", false) -var i3 : Identifier<*>? = Identifier.init("name") +var i2 : Identifier? = Identifier.init("name", false) +var i3 : Identifier? = Identifier.init("name") } } } \ No newline at end of file diff --git a/testData/ast/issues/file/kt-1048.jav b/testData/ast/issues/file/kt-1048.jav new file mode 100644 index 00000000000..0b198292616 --- /dev/null +++ b/testData/ast/issues/file/kt-1048.jav @@ -0,0 +1,18 @@ +import java.util.HashMap; + +class G { + public G(T t) { + } +} + +public class Java { + void test() { + HashMap m = new HashMap(); + m.put(1, 1); + } + void test2() { + HashMap m = new HashMap(); + G g = new G(""); + G g2 = new G(""); + } +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-1048.kt b/testData/ast/issues/file/kt-1048.kt new file mode 100644 index 00000000000..69d30dfa1a3 --- /dev/null +++ b/testData/ast/issues/file/kt-1048.kt @@ -0,0 +1,14 @@ +import java.util.HashMap +open class G(t : T?) { +} +public open class Java() { +open fun test() : Unit { +var m : HashMap? = HashMap() +m?.put(1, 1) +} +open fun test2() : Unit { +var m : HashMap<*, *>? = HashMap() +var g : G? = G("") +var g2 : G? = G("") +} +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-638.kt b/testData/ast/issues/file/kt-638.kt index bb436c18cb7..3176bdd81f3 100644 --- a/testData/ast/issues/file/kt-638.kt +++ b/testData/ast/issues/file/kt-638.kt @@ -30,8 +30,8 @@ public open class User() { class object { open public fun main(args : Array?) : Unit { var i1 : Identifier<*>? = Identifier.init("name", false, true) -var i2 : Identifier<*>? = Identifier.init("name", false) -var i3 : Identifier<*>? = Identifier.init("name") +var i2 : Identifier? = Identifier.init("name", false) +var i3 : Identifier? = Identifier.init("name") } } } diff --git a/testData/ast/newClassExpression/file/fullQualifiedName.kt b/testData/ast/newClassExpression/file/fullQualifiedName.kt index e89453f3809..07d2dfb7204 100644 --- a/testData/ast/newClassExpression/file/fullQualifiedName.kt +++ b/testData/ast/newClassExpression/file/fullQualifiedName.kt @@ -2,6 +2,6 @@ package test import java.util.List open class User() { open fun main() : Unit { -var list : List<*>? = java.util.LinkedList() +var list : List? = java.util.LinkedList() } } \ No newline at end of file diff --git a/testData/ast/newClassExpression/file/fullQualifiedName2.kt b/testData/ast/newClassExpression/file/fullQualifiedName2.kt index bdcb458a76f..09e95bef826 100644 --- a/testData/ast/newClassExpression/file/fullQualifiedName2.kt +++ b/testData/ast/newClassExpression/file/fullQualifiedName2.kt @@ -1,6 +1,6 @@ package test open class User() { open fun main() : Unit { -var list : java.util.List<*>? = java.util.LinkedList() +var list : java.util.List? = java.util.LinkedList() } } \ No newline at end of file diff --git a/testData/ast/rawGenerics/file/kt-540-map.kt b/testData/ast/rawGenerics/file/kt-540-map.kt index 42fb66b7c4e..ce580f8680a 100644 --- a/testData/ast/rawGenerics/file/kt-540-map.kt +++ b/testData/ast/rawGenerics/file/kt-540-map.kt @@ -3,7 +3,7 @@ import java.util.HashMap open class Test() { open fun main() : Unit { var commonMap : HashMap? = HashMap() -var rawMap : HashMap<*, *>? = HashMap() -var superRawMap : HashMap<*, *>? = HashMap() +var rawMap : HashMap? = HashMap() +var superRawMap : HashMap? = HashMap() } } \ No newline at end of file diff --git a/testData/ast/rawGenerics/file/kt-540-rawGenericClass.kt b/testData/ast/rawGenerics/file/kt-540-rawGenericClass.kt index 426b2190bc9..976f317b913 100644 --- a/testData/ast/rawGenerics/file/kt-540-rawGenericClass.kt +++ b/testData/ast/rawGenerics/file/kt-540-rawGenericClass.kt @@ -6,8 +6,8 @@ System.out?.println(e) } open class Test() { open fun main() : Unit { -var raw1 : Collection<*>? = Collection(1) -var raw2 : Collection<*>? = Collection(1) -var raw3 : Collection<*>? = Collection("1") +var raw1 : Collection? = Collection(1) +var raw2 : Collection? = Collection(1) +var raw3 : Collection? = Collection("1") } } \ No newline at end of file diff --git a/testData/ast/rawGenerics/file/kt-540.kt b/testData/ast/rawGenerics/file/kt-540.kt index 6db46c17105..dd3f0d27c4c 100644 --- a/testData/ast/rawGenerics/file/kt-540.kt +++ b/testData/ast/rawGenerics/file/kt-540.kt @@ -4,7 +4,7 @@ import java.util.LinkedList open class Test() { open fun main() : Unit { var common : List? = LinkedList() -var raw : List<*>? = LinkedList() -var superRaw : List<*>? = LinkedList() +var raw : List? = LinkedList() +var superRaw : List? = LinkedList() } } \ No newline at end of file From b93b25d002d1f7e6593f97b01c75c79d2e4a199b Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 17 Jan 2012 16:42:32 +0400 Subject: [PATCH 200/206] JavaToKotlinCli added --- j2k.iml | 2 + j2k.ipr | 18 +++ lib/commons-cli-1.2.jar | Bin 0 -> 41123 bytes src/META-INF/MANIFEST.MF | 6 +- src/org/jetbrains/jet/j2k/Converter.java | 22 ++- .../jetbrains/jet/j2k/JavaToKotlinCli.java | 147 ++++++++++++++++++ .../jet/j2k/JavaToKotlinTranslator.java | 10 +- .../jetbrains/jet/j2k/ast/AnonymousClass.java | 2 +- src/org/jetbrains/jet/j2k/ast/Class.java | 21 ++- src/org/jetbrains/jet/j2k/ast/Enum.java | 2 +- src/org/jetbrains/jet/j2k/ast/Trait.java | 2 +- .../jet/j2k/visitors/TypeVisitor.java | 3 + 12 files changed, 215 insertions(+), 20 deletions(-) create mode 100644 lib/commons-cli-1.2.jar create mode 100644 src/org/jetbrains/jet/j2k/JavaToKotlinCli.java diff --git a/j2k.iml b/j2k.iml index f7e0d92adb2..2b7c256c235 100644 --- a/j2k.iml +++ b/j2k.iml @@ -9,6 +9,8 @@ + + diff --git a/j2k.ipr b/j2k.ipr index 85640093dc3..f91fa7f6738 100644 --- a/j2k.ipr +++ b/j2k.ipr @@ -13,6 +13,17 @@ + + $PROJECT_DIR$/out/artifacts/java2kotlin_jar + + + + + + + + + + + + + + + + diff --git a/lib/commons-cli-1.2.jar b/lib/commons-cli-1.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..ce4b9fffe40c41669797cd806ac989471b2acd84 GIT binary patch literal 41123 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%0D2u^7bcx|ezvBT@`6 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 CNzF?D literal 0 HcmV?d00001 diff --git a/src/META-INF/MANIFEST.MF b/src/META-INF/MANIFEST.MF index 558fbaba78d..e71f8509eeb 100644 --- a/src/META-INF/MANIFEST.MF +++ b/src/META-INF/MANIFEST.MF @@ -1,3 +1,3 @@ -Manifest-Version: 1.0 -Main-Class: org.jetbrains.jet.j2k.JavaToKotlinTranslator - +Manifest-Version: 1.0 +Main-Class: org.jetbrains.jet.j2k.JavaToKotlinCli + diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 4ed80d216c5..8d976288e52 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -6,7 +6,6 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.j2k.ast.*; import org.jetbrains.jet.j2k.ast.Class; import org.jetbrains.jet.j2k.ast.Enum; -import org.jetbrains.jet.j2k.ast.Modifier; import org.jetbrains.jet.j2k.util.AstUtil; import org.jetbrains.jet.j2k.visitors.*; @@ -35,9 +34,20 @@ public class Converter { @Nullable private static PsiType ourMethodReturnType = null; + @NotNull + private static Set settings = new HashSet(); + private Converter() { } + public static boolean addSetting(@NotNull String value) { + return settings.add(value); + } + + public static boolean hasSetting(@NotNull String value) { + return settings.contains(value); + } + public static void setClassIdentifiers(@NotNull Set identifiers) { ourClassIdentifiers = identifiers; } @@ -327,7 +337,7 @@ public class Converter { final IdentifierImpl identifier = new IdentifierImpl(method.getName()); final Type returnType = typeToType(method.getReturnType(), ConverterUtil.isAnnotatedAsNotNull(method.getModifierList())); - final Block body = blockToBlock(method.getBody(), notEmpty); + final Block body = hasSetting("declarations-only") ? Block.EMPTY_BLOCK : blockToBlock(method.getBody(), notEmpty); // #TODO final Element params = createFunctionParameters(method); final List typeParameters = elementsToElementList(method.getTypeParameters()); @@ -608,10 +618,10 @@ public class Converter { for (PsiExpression e : arguments) actualTypes.add(e.getType()); - assert actualTypes.size() == expectedTypes.size() : "The type list must have the same length"; - - for (int i = 0; i < actualTypes.size(); i++) - conversions.set(i, createConversionForExpression(arguments[i], expectedTypes.get(i))); + if (conversions.size() == actualTypes.size() && actualTypes.size() == expectedTypes.size()) { + for (int i = 0; i < actualTypes.size(); i++) + conversions.set(i, createConversionForExpression(arguments[i], expectedTypes.get(i))); + } } return conversions; } diff --git a/src/org/jetbrains/jet/j2k/JavaToKotlinCli.java b/src/org/jetbrains/jet/j2k/JavaToKotlinCli.java new file mode 100644 index 00000000000..1f322e030ee --- /dev/null +++ b/src/org/jetbrains/jet/j2k/JavaToKotlinCli.java @@ -0,0 +1,147 @@ +package org.jetbrains.jet.j2k; + +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiJavaFile; +import org.apache.commons.cli.*; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.logging.Logger; +import java.util.regex.Pattern; + +import static org.apache.commons.io.FileUtils.readFileToString; +import static org.apache.commons.io.FileUtils.writeStringToFile; + +/** + * @author ignatov + */ +@SuppressWarnings({"CallToPrintStackTrace", "UseOfSystemOutOrSystemErr"}) +public class JavaToKotlinCli { + private static final Logger myLogger = Logger.getAnonymousLogger(); + + private JavaToKotlinCli() { + } + + public static void main(String[] args) { + CommandLineParser parser = new BasicParser(); + Options options = new Options() + .addOption("h", "help", false, "Print usage information") + .addOption("f", "from", true, "Directory with Java sources") + .addOption("t", "to", true, "Directory with Kotlin sources") + .addOption("p", "public-only", false, "Only public and protected members") + .addOption("fqn", "fqn", false, "Full qualified names") + .addOption("d", "declarations-only", false, "Declarations only") + ; + + try { + CommandLine commandLine = parser.parse(options, args); + + if (commandLine.hasOption("help")) + showHelpAndExit(); + + if (commandLine.hasOption("from") && commandLine.hasOption("to")) { + String from = commandLine.getOptionValue("from"); + String to = commandLine.getOptionValue("to"); + + for (Option o : commandLine.getOptions()) { + Converter.addSetting(o.getLongOpt()); + } + + if (!from.isEmpty() && !to.isEmpty()) + convertSourceTree(from, to); + else + showHelpAndExit(); + } else + showHelpAndExit(); + } catch (ParseException e) { + e.printStackTrace(); + } + } + + @SuppressWarnings("ResultOfMethodCallIgnored") + private static void convertSourceTree(String javaPath, String kotlinPath) { + try { + File javaDir = new File(javaPath); + File kotlinDir = new File(kotlinPath); + + if (kotlinDir.exists()) + kotlinDir.delete(); + + if (!kotlinDir.exists() && !kotlinDir.mkdir()) + myLogger.warning("Creation failed: " + kotlinDir.getAbsolutePath()); + + for (File f : getJavaFiles(javaDir.getAbsolutePath())) { + String relative = javaDir.toURI().relativize(f.toURI()).getPath().replace(".java", ".kt"); + File file = new File(kotlinPath, relative); + + if (file.exists()) + file.delete(); + + if (f.isDirectory()) + if (!file.exists() && !file.mkdir()) + myLogger.warning("Creation failed: " + file.getAbsolutePath()); + + if (f.isFile()) { + writeStringToFile(file, fileToKotlin(f)); + } + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @NotNull + private static String fileToKotlin(File f) throws IOException { + final String javaCode = readJavaFileToString(f); + return generateKotlinCode(JavaToKotlinTranslator.createFile(JavaToKotlinTranslator.setUpJavaCoreEnvironment(), javaCode)); + } + + @NotNull + private static String generateKotlinCode(@Nullable PsiFile file) { + if (file != null && file instanceof PsiJavaFile) { + JavaToKotlinTranslator.setClassIdentifiers(file); + return JavaToKotlinTranslator.prettify(Converter.fileToFile((PsiJavaFile) file).toKotlin()); + } + return ""; + } + + @NotNull + private static String readJavaFileToString(@NotNull File javaFile) throws IOException { + return Pattern.compile("\\s*/\\*.*\\*/", Pattern.DOTALL).matcher(readFileToString(javaFile)).replaceAll(""); + } + + private static void showHelpAndExit() { + System.err.println("Usage: java -jar java2kotlin.jar -f -t "); + System.exit(1); + } + + static public List getJavaFiles(String startDirName) throws FileNotFoundException { + return getJavaFiles(new File(startDirName)); + } + + private static List getJavaFiles(File start) throws FileNotFoundException { + List result = new ArrayList(); + + if (start.isFile()) + return Arrays.asList(start); + + for (File file : Arrays.asList(start.listFiles())) { + if ((file.isFile() && file.getName().endsWith(".java")) || file.isDirectory()) + result.add(file); + + if (file.isDirectory()) { + List deeperList = getJavaFiles(file); + result.addAll(deeperList); + } + } + return result; + } +} \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/JavaToKotlinTranslator.java b/src/org/jetbrains/jet/j2k/JavaToKotlinTranslator.java index 7698eda8c5e..f87a8952a6e 100644 --- a/src/org/jetbrains/jet/j2k/JavaToKotlinTranslator.java +++ b/src/org/jetbrains/jet/j2k/JavaToKotlinTranslator.java @@ -73,7 +73,7 @@ public class JavaToKotlinTranslator { } @NotNull - private static String prettify(@Nullable String code) { + static String prettify(@Nullable String code) { if (code == null) return ""; return code @@ -175,8 +175,8 @@ public class JavaToKotlinTranslator { } @NotNull - static String generateKotlinCode(@NotNull String arg) { - PsiFile file = createFile(arg); + static String generateKotlinCode(@NotNull String javaCode) { + PsiFile file = createFile(javaCode); if (file != null && file instanceof PsiJavaFile) { setClassIdentifiers(file); return prettify(Converter.fileToFile((PsiJavaFile) file).toKotlin()); @@ -185,8 +185,8 @@ public class JavaToKotlinTranslator { } @NotNull - static String generateKotlinCodeWithCompatibilityImport(@NotNull String arg) { - PsiFile file = createFile(arg); + static String generateKotlinCodeWithCompatibilityImport(@NotNull String javaCode) { + PsiFile file = createFile(javaCode); if (file != null && file instanceof PsiJavaFile) { setClassIdentifiers(file); return prettify(Converter.fileToFileWithCompatibilityImport((PsiJavaFile) file).toKotlin()); diff --git a/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java b/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java index e8a87d2b3f7..c5524a0bb91 100644 --- a/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java +++ b/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java @@ -16,7 +16,7 @@ public class AnonymousClass extends Class { Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), - members + getMembers(members) ); } diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java index 141a12699f0..87667feb136 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -2,6 +2,7 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.j2k.Converter; import org.jetbrains.jet.j2k.util.AstUtil; import java.util.HashSet; @@ -19,20 +20,34 @@ public class Class extends Member { String TYPE = "class"; final Identifier myName; private final List myBaseClassParams; - private final List myMembers; + private final List myMembers; private final List myTypeParameters; private final List myExtendsTypes; private final List myImplementsTypes; public Class(Identifier name, Set modifiers, List typeParameters, List extendsTypes, - List baseClassParams, List implementsTypes, List members) { + List baseClassParams, List implementsTypes, List members) { myName = name; myBaseClassParams = baseClassParams; myModifiers = modifiers; myTypeParameters = typeParameters; myExtendsTypes = extendsTypes; myImplementsTypes = implementsTypes; - myMembers = members; + myMembers= getMembers(members); + } + + static List getMembers(List members) { + List withoutPrivate = new LinkedList(); + if (Converter.hasSetting("public-only")) { + for (Member m : members) { + if (m.accessModifier().equals("public") || m.accessModifier().equals("protected") || m.accessModifier().isEmpty()) { + withoutPrivate.add(m); + } + } + } else { + withoutPrivate = members; + } + return withoutPrivate; } diff --git a/src/org/jetbrains/jet/j2k/ast/Enum.java b/src/org/jetbrains/jet/j2k/ast/Enum.java index 2fd28501176..cbf2cc7872c 100644 --- a/src/org/jetbrains/jet/j2k/ast/Enum.java +++ b/src/org/jetbrains/jet/j2k/ast/Enum.java @@ -12,7 +12,7 @@ import java.util.Set; public class Enum extends Class { public Enum(Identifier name, Set modifiers, List typeParameters, List extendsTypes, List baseClassParams, List implementsTypes, List members) { - super(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, members); + super(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, getMembers(members)); } String primaryConstructorSignatureToKotlin() { diff --git a/src/org/jetbrains/jet/j2k/ast/Trait.java b/src/org/jetbrains/jet/j2k/ast/Trait.java index 60bcd122add..aed3f075e3d 100644 --- a/src/org/jetbrains/jet/j2k/ast/Trait.java +++ b/src/org/jetbrains/jet/j2k/ast/Trait.java @@ -9,7 +9,7 @@ import java.util.Set; public class Trait extends Class { public Trait(Identifier name, Set modifiers, List typeParameters, List extendsTypes, List baseClassParams, List implementsTypes, List members) { - super(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, members); + super(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, getMembers(members)); TYPE = "trait"; } diff --git a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java index dc7d1814e07..4d71752d174 100644 --- a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java @@ -3,6 +3,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.Converter; import org.jetbrains.jet.j2k.ast.*; import org.jetbrains.jet.j2k.util.AstUtil; @@ -74,6 +75,8 @@ public class TypeVisitor extends PsiTypeVisitor { if (psiClass != null) { String qualifiedName = psiClass.getQualifiedName(); if (qualifiedName != null) { + if (!qualifiedName.equals("java.lang.Object") && Converter.hasSetting("fqn")) + return new IdentifierImpl(qualifiedName); if (qualifiedName.equals(JAVA_LANG_ITERABLE)) return new IdentifierImpl(JAVA_LANG_ITERABLE); if (qualifiedName.equals(JAVA_UTIL_ITERATOR)) From 6818392cde19acdf863773803c763e18cbdbcec2 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 18 Jan 2012 13:30:11 +0400 Subject: [PATCH 201/206] don't show package local functions when "public" key is switch on --- src/org/jetbrains/jet/j2k/ast/Class.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java index 87667feb136..dbc9e9fa710 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -40,7 +40,7 @@ public class Class extends Member { List withoutPrivate = new LinkedList(); if (Converter.hasSetting("public-only")) { for (Member m : members) { - if (m.accessModifier().equals("public") || m.accessModifier().equals("protected") || m.accessModifier().isEmpty()) { + if (m.accessModifier().equals("public") || m.accessModifier().equals("protected")) { withoutPrivate.add(m); } } From d3fc3d36e9aa4dac71a514fe80b19a93d449016e Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 18 Jan 2012 13:46:11 +0400 Subject: [PATCH 202/206] Converter.elementToKotlin added --- src/org/jetbrains/jet/j2k/Converter.java | 30 +++++++++++++++++++ .../StandaloneJavaToKotlinConverterTest.java | 2 +- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 8d976288e52..3d7a86624bb 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -66,6 +66,31 @@ public class Converter { ourClassIdentifiers.clear(); } + @NotNull + public static String elementToKotlin(@NotNull PsiElement element) { + if (element instanceof PsiJavaFile) + return fileToFile((PsiJavaFile) element).toKotlin(); + + if (element instanceof PsiClass) + return classToClass((PsiClass) element).toKotlin(); + + if (element instanceof PsiMethod) + return methodToFunction((PsiMethod) element).toKotlin(); + + if (element instanceof PsiField) { + PsiField field = (PsiField) element; + return fieldToField(field, field.getContainingClass()).toKotlin(); + } + + if (element instanceof PsiStatement) + return statementToStatement((PsiStatement) element).toKotlin(); + + if (element instanceof PsiExpression) + return expressionToExpression((PsiExpression) element).toKotlin(); + + return ""; + } + @NotNull public static File fileToFile(@NotNull PsiJavaFile javaFile) { return fileToFile(javaFile, Collections.emptyList()); @@ -326,6 +351,11 @@ public class Converter { return result; } + @NotNull + private static Function methodToFunction(@NotNull PsiMethod method) { + return methodToFunction(method, true); + } + @NotNull private static Function methodToFunction(@NotNull PsiMethod method, boolean notEmpty) { if (isOverrideObjectDirect(method)) diff --git a/test/org/jetbrains/jet/j2k/StandaloneJavaToKotlinConverterTest.java b/test/org/jetbrains/jet/j2k/StandaloneJavaToKotlinConverterTest.java index 1d3ef343bf6..d901e64f04d 100644 --- a/test/org/jetbrains/jet/j2k/StandaloneJavaToKotlinConverterTest.java +++ b/test/org/jetbrains/jet/j2k/StandaloneJavaToKotlinConverterTest.java @@ -101,7 +101,7 @@ public class StandaloneJavaToKotlinConverterTest extends TestCase { private static String generateKotlinCode(@Nullable PsiFile file) { if (file != null && file instanceof PsiJavaFile) { JavaToKotlinTranslator.setClassIdentifiers(file); - return prettify(Converter.fileToFile((PsiJavaFile) file).toKotlin()); + return prettify(Converter.elementToKotlin(file)); } return ""; } From 47530f1c6202f95b41c666b2fc556bbd23700268 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 18 Jan 2012 19:41:07 +0400 Subject: [PATCH 203/206] double space fixed in some cases --- src/org/jetbrains/jet/j2k/ast/Function.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/org/jetbrains/jet/j2k/ast/Function.java b/src/org/jetbrains/jet/j2k/ast/Function.java index 91c1b9132a4..cf03d2de8a7 100644 --- a/src/org/jetbrains/jet/j2k/ast/Function.java +++ b/src/org/jetbrains/jet/j2k/ast/Function.java @@ -82,7 +82,9 @@ public class Function extends Member { if (myModifiers.contains(Modifier.NOT_OPEN)) modifierList.remove(Modifier.OPEN); - modifierList.add(accessModifier()); + String accessModifier = accessModifier(); + if (!accessModifier.isEmpty()) + modifierList.add(accessModifier); if (modifierList.size() > 0) return AstUtil.join(modifierList, SPACE) + SPACE; From e13b438a69543107358759d883fa62c31eeab4dd Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 19 Jan 2012 12:19:51 +0400 Subject: [PATCH 204/206] KT-1074 Need to avoid unnecessary parenthesis for converted code --- .../jet/j2k/ast/BinaryExpression.java | 2 +- .../jet/j2k/ast/PolyadicExpression.java | 2 +- .../jetbrains/jet/j2k/ast/PostfixOperator.java | 2 +- .../jetbrains/jet/j2k/ast/PrefixOperator.java | 2 +- .../ast/assignmentExpression/expression/and.kt | 2 +- .../ast/assignmentExpression/expression/or.kt | 2 +- .../expression/shiftLeft.kt | 2 +- .../expression/shiftRight.kt | 2 +- .../expression/unsignedRightShift.kt | 2 +- .../ast/assignmentExpression/expression/xor.kt | 2 +- .../ast/binaryExpression/expression/and.kt | 2 +- .../expression/conditionalAnd.kt | 2 +- .../expression/conditionalOr.kt | 2 +- .../ast/binaryExpression/expression/divide.kt | 2 +- .../binaryExpression/expression/greaterThan.kt | 2 +- .../expression/greaterThanEqual.kt | 2 +- .../binaryExpression/expression/lessThan.kt | 2 +- .../expression/lessThanEqual.kt | 2 +- .../ast/binaryExpression/expression/minus.kt | 2 +- .../binaryExpression/expression/multiply.kt | 2 +- testData/ast/binaryExpression/expression/or.kt | 2 +- .../ast/binaryExpression/expression/plus.kt | 2 +- .../binaryExpression/expression/remainder.kt | 2 +- .../binaryExpression/expression/shiftLeft.kt | 2 +- .../binaryExpression/expression/shiftRight.kt | 2 +- .../ast/binaryExpression/expression/xor.kt | 2 +- .../statement/whileWithBlock.kt | 4 ++-- .../statement/whileWithExpression.kt | 2 +- .../ast/enum/class/runnableImplementation.kt | 2 +- testData/ast/file/comp/intNullability.kt | 2 +- testData/ast/for/statement/forRangeWithLT.kt | 2 +- testData/ast/for/statement/forWithBlock.kt | 2 +- .../statement/forWithBlockAndDoubleUpdate.kt | 8 ++++---- .../ast/for/statement/forWithEmptyBlock.kt | 6 +++--- .../ast/for/statement/forWithExpression.kt | 2 +- testData/ast/for/statement/forWithReturn.kt | 6 +++--- .../statement/enhancedForWithBlock.kt | 2 +- .../statement/enhancedForWithExpression.kt | 2 +- .../ast/function/file/writableParameter.kt | 2 +- .../statement/ifStatementWithEmptyBlocks.kt | 2 +- .../ifStatementWithMultilineBlocks.kt | 2 +- .../statement/ifStatementWithoutElse.kt | 2 +- testData/ast/issues/file/kt-1074.jav | 13 +++++++++++++ testData/ast/issues/file/kt-1074.kt | 13 +++++++++++++ testData/ast/issues/file/kt-824-isDir.kt | 2 +- testData/ast/issues/file/kt-828.kt | 18 +++++++++--------- testData/ast/issues/file/kt-837.kt | 2 +- testData/ast/issues/file/kt-852.kt | 4 ++-- testData/ast/issues/file/kt-879.kt | 2 +- testData/ast/issues/file/kt-893.kt | 2 +- testData/ast/issues/file/kt-963.kt | 2 +- .../complicatedExampleFromJavaTutorial.kt | 4 ++-- .../expression/parenthesized.kt | 2 +- .../expression/parenthesized2.kt | 2 +- .../polyadicExpression/expression/divide.kt | 2 +- .../ast/polyadicExpression/expression/minus.kt | 2 +- .../polyadicExpression/expression/multiply.kt | 2 +- .../ast/polyadicExpression/expression/plus.kt | 2 +- .../polyadicExpression/expression/remainder.kt | 2 +- .../expression/unassignedShiftRight.kt | 2 +- .../ast/postfixOperator/statement/decrement.kt | 2 +- .../ast/postfixOperator/statement/increment.kt | 2 +- .../ast/prefixOperator/statement/decrement.kt | 2 +- testData/ast/prefixOperator/statement/excl.kt | 2 +- .../ast/prefixOperator/statement/increment.kt | 2 +- .../ast/prefixOperator/statement/kt-667.kt | 2 +- .../ast/trait/class/interfaceWithFields.kt | 2 +- .../trait/class/interfaceWithStaticFields.kt | 2 +- .../whileStatement/statement/whileWithBlock.kt | 4 ++-- .../statement/whileWithExpression.kt | 2 +- 70 files changed, 113 insertions(+), 87 deletions(-) create mode 100644 testData/ast/issues/file/kt-1074.jav create mode 100644 testData/ast/issues/file/kt-1074.kt diff --git a/src/org/jetbrains/jet/j2k/ast/BinaryExpression.java b/src/org/jetbrains/jet/j2k/ast/BinaryExpression.java index 72baea6e515..2df6bfd2dd6 100644 --- a/src/org/jetbrains/jet/j2k/ast/BinaryExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/BinaryExpression.java @@ -30,6 +30,6 @@ public class BinaryExpression extends Expression { @Override public String toKotlin() { List expressionsWithConversions = AstUtil.applyConversions(AstUtil.nodesToKotlin(Arrays.asList(myLeft, myRight)), myConversions); - return "(" + AstUtil.join(expressionsWithConversions, SPACE + myOp + SPACE) + ")"; + return AstUtil.join(expressionsWithConversions, SPACE + myOp + SPACE); } } diff --git a/src/org/jetbrains/jet/j2k/ast/PolyadicExpression.java b/src/org/jetbrains/jet/j2k/ast/PolyadicExpression.java index f5872539874..d99481c305d 100644 --- a/src/org/jetbrains/jet/j2k/ast/PolyadicExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/PolyadicExpression.java @@ -24,6 +24,6 @@ public class PolyadicExpression extends Expression { @Override public String toKotlin() { List expressionsWithConversions = AstUtil.applyConversions(AstUtil.nodesToKotlin(myExpressions), myConversions); - return "(" + AstUtil.join(expressionsWithConversions, SPACE + myToken + SPACE) + ")"; + return AstUtil.join(expressionsWithConversions, SPACE + myToken + SPACE); } } diff --git a/src/org/jetbrains/jet/j2k/ast/PostfixOperator.java b/src/org/jetbrains/jet/j2k/ast/PostfixOperator.java index 036e2618aa3..ffac99c0d93 100644 --- a/src/org/jetbrains/jet/j2k/ast/PostfixOperator.java +++ b/src/org/jetbrains/jet/j2k/ast/PostfixOperator.java @@ -17,6 +17,6 @@ public class PostfixOperator extends Expression { @NotNull @Override public String toKotlin() { - return "(" + myExpression.toKotlin() + myOp + ")"; + return myExpression.toKotlin() + myOp; } } \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/ast/PrefixOperator.java b/src/org/jetbrains/jet/j2k/ast/PrefixOperator.java index c94da13002f..f91f98bc837 100644 --- a/src/org/jetbrains/jet/j2k/ast/PrefixOperator.java +++ b/src/org/jetbrains/jet/j2k/ast/PrefixOperator.java @@ -17,6 +17,6 @@ public class PrefixOperator extends Expression { @NotNull @Override public String toKotlin() { - return "(" + myOp + myExpression.toKotlin() + ")"; + return myOp + myExpression.toKotlin(); } } \ No newline at end of file diff --git a/testData/ast/assignmentExpression/expression/and.kt b/testData/ast/assignmentExpression/expression/and.kt index 9d3b5a87264..dc3b47760da 100644 --- a/testData/ast/assignmentExpression/expression/and.kt +++ b/testData/ast/assignmentExpression/expression/and.kt @@ -1 +1 @@ -x = (x and 2) \ No newline at end of file +x = x and 2 \ No newline at end of file diff --git a/testData/ast/assignmentExpression/expression/or.kt b/testData/ast/assignmentExpression/expression/or.kt index 9ec6c02a731..776a84a8989 100644 --- a/testData/ast/assignmentExpression/expression/or.kt +++ b/testData/ast/assignmentExpression/expression/or.kt @@ -1 +1 @@ -x = (x or 2) \ No newline at end of file +x = x or 2 \ No newline at end of file diff --git a/testData/ast/assignmentExpression/expression/shiftLeft.kt b/testData/ast/assignmentExpression/expression/shiftLeft.kt index 9952d811313..bc26f965e4d 100644 --- a/testData/ast/assignmentExpression/expression/shiftLeft.kt +++ b/testData/ast/assignmentExpression/expression/shiftLeft.kt @@ -1 +1 @@ -x = (x shl 2) \ No newline at end of file +x = x shl 2 \ No newline at end of file diff --git a/testData/ast/assignmentExpression/expression/shiftRight.kt b/testData/ast/assignmentExpression/expression/shiftRight.kt index 05fb0966ed7..a731104d2f6 100644 --- a/testData/ast/assignmentExpression/expression/shiftRight.kt +++ b/testData/ast/assignmentExpression/expression/shiftRight.kt @@ -1 +1 @@ -x = (x shr 2) \ No newline at end of file +x = x shr 2 \ No newline at end of file diff --git a/testData/ast/assignmentExpression/expression/unsignedRightShift.kt b/testData/ast/assignmentExpression/expression/unsignedRightShift.kt index 484c3a6a13d..2450029bd56 100644 --- a/testData/ast/assignmentExpression/expression/unsignedRightShift.kt +++ b/testData/ast/assignmentExpression/expression/unsignedRightShift.kt @@ -1 +1 @@ -x = (x ushr 2) \ No newline at end of file +x = x ushr 2 \ No newline at end of file diff --git a/testData/ast/assignmentExpression/expression/xor.kt b/testData/ast/assignmentExpression/expression/xor.kt index e6cd6c7b628..381ed467f3d 100644 --- a/testData/ast/assignmentExpression/expression/xor.kt +++ b/testData/ast/assignmentExpression/expression/xor.kt @@ -1 +1 @@ -x = (x xor 2) \ No newline at end of file +x = x xor 2 \ No newline at end of file diff --git a/testData/ast/binaryExpression/expression/and.kt b/testData/ast/binaryExpression/expression/and.kt index cf06df2166f..cbf463b36ea 100644 --- a/testData/ast/binaryExpression/expression/and.kt +++ b/testData/ast/binaryExpression/expression/and.kt @@ -1 +1 @@ -(x and 2) \ No newline at end of file +x and 2 \ No newline at end of file diff --git a/testData/ast/binaryExpression/expression/conditionalAnd.kt b/testData/ast/binaryExpression/expression/conditionalAnd.kt index c15d239fc59..5aa60340840 100644 --- a/testData/ast/binaryExpression/expression/conditionalAnd.kt +++ b/testData/ast/binaryExpression/expression/conditionalAnd.kt @@ -1 +1 @@ -(true && false) \ No newline at end of file +true && false \ No newline at end of file diff --git a/testData/ast/binaryExpression/expression/conditionalOr.kt b/testData/ast/binaryExpression/expression/conditionalOr.kt index 468a7054c7e..64634c472bc 100644 --- a/testData/ast/binaryExpression/expression/conditionalOr.kt +++ b/testData/ast/binaryExpression/expression/conditionalOr.kt @@ -1 +1 @@ -(true || false) \ No newline at end of file +true || false \ No newline at end of file diff --git a/testData/ast/binaryExpression/expression/divide.kt b/testData/ast/binaryExpression/expression/divide.kt index 65ee04050be..0e0b5d58618 100644 --- a/testData/ast/binaryExpression/expression/divide.kt +++ b/testData/ast/binaryExpression/expression/divide.kt @@ -1 +1 @@ -(1 / 2) \ No newline at end of file +1 / 2 \ No newline at end of file diff --git a/testData/ast/binaryExpression/expression/greaterThan.kt b/testData/ast/binaryExpression/expression/greaterThan.kt index daff50ff64b..2774817e788 100644 --- a/testData/ast/binaryExpression/expression/greaterThan.kt +++ b/testData/ast/binaryExpression/expression/greaterThan.kt @@ -1 +1 @@ -(1 > 2) \ No newline at end of file +1 > 2 \ No newline at end of file diff --git a/testData/ast/binaryExpression/expression/greaterThanEqual.kt b/testData/ast/binaryExpression/expression/greaterThanEqual.kt index 3df78eab7e7..6993045c7a2 100644 --- a/testData/ast/binaryExpression/expression/greaterThanEqual.kt +++ b/testData/ast/binaryExpression/expression/greaterThanEqual.kt @@ -1 +1 @@ -(1 >= 2) \ No newline at end of file +1 >= 2 \ No newline at end of file diff --git a/testData/ast/binaryExpression/expression/lessThan.kt b/testData/ast/binaryExpression/expression/lessThan.kt index c82ddfbad9f..535e996ad9b 100644 --- a/testData/ast/binaryExpression/expression/lessThan.kt +++ b/testData/ast/binaryExpression/expression/lessThan.kt @@ -1 +1 @@ -(1 < 2) \ No newline at end of file +1 < 2 \ No newline at end of file diff --git a/testData/ast/binaryExpression/expression/lessThanEqual.kt b/testData/ast/binaryExpression/expression/lessThanEqual.kt index 46d80ee7ff7..5e9475f92bf 100644 --- a/testData/ast/binaryExpression/expression/lessThanEqual.kt +++ b/testData/ast/binaryExpression/expression/lessThanEqual.kt @@ -1 +1 @@ -(1 <= 2) \ No newline at end of file +1 <= 2 \ No newline at end of file diff --git a/testData/ast/binaryExpression/expression/minus.kt b/testData/ast/binaryExpression/expression/minus.kt index cf09bd8aa78..7ec0a893aef 100644 --- a/testData/ast/binaryExpression/expression/minus.kt +++ b/testData/ast/binaryExpression/expression/minus.kt @@ -1 +1 @@ -(1 - 2) \ No newline at end of file +1 - 2 \ No newline at end of file diff --git a/testData/ast/binaryExpression/expression/multiply.kt b/testData/ast/binaryExpression/expression/multiply.kt index aa007e342a1..a48dfec9fa5 100644 --- a/testData/ast/binaryExpression/expression/multiply.kt +++ b/testData/ast/binaryExpression/expression/multiply.kt @@ -1 +1 @@ -(1 * 2) \ No newline at end of file +1 * 2 \ No newline at end of file diff --git a/testData/ast/binaryExpression/expression/or.kt b/testData/ast/binaryExpression/expression/or.kt index 70cd0ea4f20..ccad705935d 100644 --- a/testData/ast/binaryExpression/expression/or.kt +++ b/testData/ast/binaryExpression/expression/or.kt @@ -1 +1 @@ -(x or 2) \ No newline at end of file +x or 2 \ No newline at end of file diff --git a/testData/ast/binaryExpression/expression/plus.kt b/testData/ast/binaryExpression/expression/plus.kt index 0a911375668..193df0b550b 100644 --- a/testData/ast/binaryExpression/expression/plus.kt +++ b/testData/ast/binaryExpression/expression/plus.kt @@ -1 +1 @@ -(1 + 2) \ No newline at end of file +1 + 2 \ No newline at end of file diff --git a/testData/ast/binaryExpression/expression/remainder.kt b/testData/ast/binaryExpression/expression/remainder.kt index 619e890f226..049211394d2 100644 --- a/testData/ast/binaryExpression/expression/remainder.kt +++ b/testData/ast/binaryExpression/expression/remainder.kt @@ -1 +1 @@ -(1 % 2) \ No newline at end of file +1 % 2 \ No newline at end of file diff --git a/testData/ast/binaryExpression/expression/shiftLeft.kt b/testData/ast/binaryExpression/expression/shiftLeft.kt index f9ea88f60e9..face9a53255 100644 --- a/testData/ast/binaryExpression/expression/shiftLeft.kt +++ b/testData/ast/binaryExpression/expression/shiftLeft.kt @@ -1 +1 @@ -(x shl 2) \ No newline at end of file +x shl 2 \ No newline at end of file diff --git a/testData/ast/binaryExpression/expression/shiftRight.kt b/testData/ast/binaryExpression/expression/shiftRight.kt index 43f26e93b84..771795abe88 100644 --- a/testData/ast/binaryExpression/expression/shiftRight.kt +++ b/testData/ast/binaryExpression/expression/shiftRight.kt @@ -1 +1 @@ -(x shr 2) \ No newline at end of file +x shr 2 \ No newline at end of file diff --git a/testData/ast/binaryExpression/expression/xor.kt b/testData/ast/binaryExpression/expression/xor.kt index 918f54e7c68..b8ad1650a31 100644 --- a/testData/ast/binaryExpression/expression/xor.kt +++ b/testData/ast/binaryExpression/expression/xor.kt @@ -1 +1 @@ -(x xor 2) \ No newline at end of file +x xor 2 \ No newline at end of file diff --git a/testData/ast/doWhileStatement/statement/whileWithBlock.kt b/testData/ast/doWhileStatement/statement/whileWithBlock.kt index 96ee36204cc..d86f9999196 100644 --- a/testData/ast/doWhileStatement/statement/whileWithBlock.kt +++ b/testData/ast/doWhileStatement/statement/whileWithBlock.kt @@ -1,6 +1,6 @@ do { var i : Int = 1 -i = (i + 1) +i = i + 1 } -while ((a > b)) \ No newline at end of file +while (a > b) \ No newline at end of file diff --git a/testData/ast/doWhileStatement/statement/whileWithExpression.kt b/testData/ast/doWhileStatement/statement/whileWithExpression.kt index c936946d560..a20c7c5d83d 100644 --- a/testData/ast/doWhileStatement/statement/whileWithExpression.kt +++ b/testData/ast/doWhileStatement/statement/whileWithExpression.kt @@ -1,3 +1,3 @@ do -i = (i + 1) +i = i + 1 while (true) \ No newline at end of file diff --git a/testData/ast/enum/class/runnableImplementation.kt b/testData/ast/enum/class/runnableImplementation.kt index 11263ecd635..dad0edf7366 100644 --- a/testData/ast/enum/class/runnableImplementation.kt +++ b/testData/ast/enum/class/runnableImplementation.kt @@ -5,7 +5,7 @@ RED YELLOW BLUE override public fun run() : Unit { -System.out?.println(("name()=" + name() + ", toString()=" + toString())) +System.out?.println("name()=" + name() + ", toString()=" + toString()) } public fun name() : String { return "" } public fun order() : Int { return 0 } diff --git a/testData/ast/file/comp/intNullability.kt b/testData/ast/file/comp/intNullability.kt index 9b798908ee1..e243159d8b6 100644 --- a/testData/ast/file/comp/intNullability.kt +++ b/testData/ast/file/comp/intNullability.kt @@ -4,6 +4,6 @@ open class Test() { open fun test() : Unit { var i : Int? = 10 var j : Int? = 10 -System.out?.println((i + j)) +System.out?.println(i + j) } } \ No newline at end of file diff --git a/testData/ast/for/statement/forRangeWithLT.kt b/testData/ast/for/statement/forRangeWithLT.kt index e1431c409fb..f31b904afa4 100644 --- a/testData/ast/for/statement/forRangeWithLT.kt +++ b/testData/ast/for/statement/forRangeWithLT.kt @@ -1,4 +1,4 @@ var array : IntArray? = IntArray(10) -for (i in 0..(10 - 1)) { +for (i in 0..10 - 1) { array[i] = i } \ No newline at end of file diff --git a/testData/ast/for/statement/forWithBlock.kt b/testData/ast/for/statement/forWithBlock.kt index e1431c409fb..f31b904afa4 100644 --- a/testData/ast/for/statement/forWithBlock.kt +++ b/testData/ast/for/statement/forWithBlock.kt @@ -1,4 +1,4 @@ var array : IntArray? = IntArray(10) -for (i in 0..(10 - 1)) { +for (i in 0..10 - 1) { array[i] = i } \ No newline at end of file diff --git a/testData/ast/for/statement/forWithBlockAndDoubleUpdate.kt b/testData/ast/for/statement/forWithBlockAndDoubleUpdate.kt index 5c7a0168951..4fd380f6ffe 100644 --- a/testData/ast/for/statement/forWithBlockAndDoubleUpdate.kt +++ b/testData/ast/for/statement/forWithBlockAndDoubleUpdate.kt @@ -1,14 +1,14 @@ { var i : Int = 0 -while ((i < 0)) +while (i < 0) { { var i : Int = 1 -(i++) +i++ } { -(j++) -(i++) +j++ +i++ } } } \ No newline at end of file diff --git a/testData/ast/for/statement/forWithEmptyBlock.kt b/testData/ast/for/statement/forWithEmptyBlock.kt index 8ec3c763bf8..a5743d94b32 100644 --- a/testData/ast/for/statement/forWithEmptyBlock.kt +++ b/testData/ast/for/statement/forWithEmptyBlock.kt @@ -1,12 +1,12 @@ { var i : Int = 0 -while ((i < 0)) +while (i < 0) { { } { -(j++) -(i++) +j++ +i++ } } } \ No newline at end of file diff --git a/testData/ast/for/statement/forWithExpression.kt b/testData/ast/for/statement/forWithExpression.kt index 6333d6a9828..be1826e8d8a 100644 --- a/testData/ast/for/statement/forWithExpression.kt +++ b/testData/ast/for/statement/forWithExpression.kt @@ -1 +1 @@ -for (i in 0..(0 - 1)) (t++) \ No newline at end of file +for (i in 0..0 - 1) t++ \ No newline at end of file diff --git a/testData/ast/for/statement/forWithReturn.kt b/testData/ast/for/statement/forWithReturn.kt index d7c34312768..1c9a6cb9016 100644 --- a/testData/ast/for/statement/forWithReturn.kt +++ b/testData/ast/for/statement/forWithReturn.kt @@ -1,11 +1,11 @@ { var i : Int = 0 -while ((i < 0)) +while (i < 0) { return i { -(j++) -(i++) +j++ +i++ } } } \ No newline at end of file diff --git a/testData/ast/foreachStatement/statement/enhancedForWithBlock.kt b/testData/ast/foreachStatement/statement/enhancedForWithBlock.kt index 06e9f5653fd..43cfc79c100 100644 --- a/testData/ast/foreachStatement/statement/enhancedForWithBlock.kt +++ b/testData/ast/foreachStatement/statement/enhancedForWithBlock.kt @@ -1,5 +1,5 @@ for (n : Node? in list) { var i : Int = 1 -(i++) +i++ } \ No newline at end of file diff --git a/testData/ast/foreachStatement/statement/enhancedForWithExpression.kt b/testData/ast/foreachStatement/statement/enhancedForWithExpression.kt index b2135910585..7affa022577 100644 --- a/testData/ast/foreachStatement/statement/enhancedForWithExpression.kt +++ b/testData/ast/foreachStatement/statement/enhancedForWithExpression.kt @@ -1,2 +1,2 @@ for (n : Node? in list) -(i++) \ No newline at end of file +i++ \ No newline at end of file diff --git a/testData/ast/function/file/writableParameter.kt b/testData/ast/function/file/writableParameter.kt index 645403e2035..b098e657066 100644 --- a/testData/ast/function/file/writableParameter.kt +++ b/testData/ast/function/file/writableParameter.kt @@ -2,6 +2,6 @@ package demo open class Test() { open fun test(var i : Int) : Int { i = 10 -return (i + 20) +return i + 20 } } \ No newline at end of file diff --git a/testData/ast/ifStatement/statement/ifStatementWithEmptyBlocks.kt b/testData/ast/ifStatement/statement/ifStatementWithEmptyBlocks.kt index 6cff12d424b..4587b89bf1e 100644 --- a/testData/ast/ifStatement/statement/ifStatementWithEmptyBlocks.kt +++ b/testData/ast/ifStatement/statement/ifStatementWithEmptyBlocks.kt @@ -1,4 +1,4 @@ -if ((1 > 0)) +if (1 > 0) { } else diff --git a/testData/ast/ifStatement/statement/ifStatementWithMultilineBlocks.kt b/testData/ast/ifStatement/statement/ifStatementWithMultilineBlocks.kt index 03496fee3ad..41cfc10ac2d 100644 --- a/testData/ast/ifStatement/statement/ifStatementWithMultilineBlocks.kt +++ b/testData/ast/ifStatement/statement/ifStatementWithMultilineBlocks.kt @@ -1,4 +1,4 @@ -if ((1 > 0)) +if (1 > 0) { var n : Int = 1 return n diff --git a/testData/ast/ifStatement/statement/ifStatementWithoutElse.kt b/testData/ast/ifStatement/statement/ifStatementWithoutElse.kt index a8e52d980ec..a63a714b79c 100644 --- a/testData/ast/ifStatement/statement/ifStatementWithoutElse.kt +++ b/testData/ast/ifStatement/statement/ifStatementWithoutElse.kt @@ -1,4 +1,4 @@ -if ((1 > 0)) +if (1 > 0) { var n : Int = 1 return n diff --git a/testData/ast/issues/file/kt-1074.jav b/testData/ast/issues/file/kt-1074.jav new file mode 100644 index 00000000000..4579da0addc --- /dev/null +++ b/testData/ast/issues/file/kt-1074.jav @@ -0,0 +1,13 @@ +package demo; + +class Test { + static void subListRangeCheck(int fromIndex, int toIndex, int size) { + if (fromIndex < 0) + throw new IndexOutOfBoundsException("fromIndex = " + fromIndex); + if (toIndex > size) + throw new IndexOutOfBoundsException("toIndex = " + toIndex); + if (fromIndex > toIndex) + throw new IllegalArgumentException("fromIndex(" + fromIndex + + ") > toIndex(" + toIndex + ")"); + } +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-1074.kt b/testData/ast/issues/file/kt-1074.kt new file mode 100644 index 00000000000..652697c03b5 --- /dev/null +++ b/testData/ast/issues/file/kt-1074.kt @@ -0,0 +1,13 @@ +package demo +open class Test() { +class object { +open fun subListRangeCheck(fromIndex : Int, toIndex : Int, size : Int) : Unit { +if (fromIndex < 0) +throw IndexOutOfBoundsException("fromIndex = " + fromIndex) +if (toIndex > size) +throw IndexOutOfBoundsException("toIndex = " + toIndex) +if (fromIndex > toIndex) +throw IllegalArgumentException("fromIndex(" + fromIndex + ") > toIndex(" + toIndex + ")") +} +} +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-824-isDir.kt b/testData/ast/issues/file/kt-824-isDir.kt index f03d1382414..8e899910fd4 100644 --- a/testData/ast/issues/file/kt-824-isDir.kt +++ b/testData/ast/issues/file/kt-824-isDir.kt @@ -3,7 +3,7 @@ import java.io.File public open class Test() { class object { open public fun isDir(parent : File?) : Boolean { -if (((parent == null) || (!parent?.exists()))) +if (parent == null || !parent?.exists()) { return false } diff --git a/testData/ast/issues/file/kt-828.kt b/testData/ast/issues/file/kt-828.kt index e88498d1039..3ed25233de4 100644 --- a/testData/ast/issues/file/kt-828.kt +++ b/testData/ast/issues/file/kt-828.kt @@ -1,14 +1,14 @@ open class Test() { open fun test() : Unit { var res : Boolean = true -res = (res and false) -res = (res or false) -res = (res xor false) -System.out?.println((true and false)) -System.out?.println((true or false)) -System.out?.println((true xor false)) -System.out?.println((!true)) -System.out?.println((true && false)) -System.out?.println((true || false)) +res = res and false +res = res or false +res = res xor false +System.out?.println(true and false) +System.out?.println(true or false) +System.out?.println(true xor false) +System.out?.println(!true) +System.out?.println(true && false) +System.out?.println(true || false) } } \ No newline at end of file diff --git a/testData/ast/issues/file/kt-837.kt b/testData/ast/issues/file/kt-837.kt index 7aabbfc9c55..79d431e87c6 100644 --- a/testData/ast/issues/file/kt-837.kt +++ b/testData/ast/issues/file/kt-837.kt @@ -11,6 +11,6 @@ this.code = code class object { public var ENGLISH : Language? = Language("en") public var SWEDISH : Language? = Language("sv") -private val serialVersionUID : Long = (-2442762969929206780) +private val serialVersionUID : Long = -2442762969929206780 } } \ No newline at end of file diff --git a/testData/ast/issues/file/kt-852.kt b/testData/ast/issues/file/kt-852.kt index be058a4976f..4e642d623ac 100644 --- a/testData/ast/issues/file/kt-852.kt +++ b/testData/ast/issues/file/kt-852.kt @@ -4,9 +4,9 @@ open fun test() : String? { var s1 : String? = "" var s2 : String? = "" var s3 : String? = "" -if (((s1?.isEmpty()).sure() && (s2?.isEmpty()).sure())) +if ((s1?.isEmpty()).sure() && (s2?.isEmpty()).sure()) return "OK" -if (((s1?.isEmpty()).sure() && (s2?.isEmpty()).sure() && (s3?.isEmpty()).sure())) +if ((s1?.isEmpty()).sure() && (s2?.isEmpty()).sure() && (s3?.isEmpty()).sure()) return "OOOK" return "" } diff --git a/testData/ast/issues/file/kt-879.kt b/testData/ast/issues/file/kt-879.kt index c017138ef1f..94d7f7761fb 100644 --- a/testData/ast/issues/file/kt-879.kt +++ b/testData/ast/issues/file/kt-879.kt @@ -15,7 +15,7 @@ return 2 return 3 } else -> { -return (-1) +return -1 } } } diff --git a/testData/ast/issues/file/kt-893.kt b/testData/ast/issues/file/kt-893.kt index af7dceb91c2..7e5d3bb6509 100644 --- a/testData/ast/issues/file/kt-893.kt +++ b/testData/ast/issues/file/kt-893.kt @@ -1,7 +1,7 @@ package demo open class Test() { open fun test() : Unit { -for (i in 0..(10 - 1)) { +for (i in 0..10 - 1) { System.out?.println(i) } } diff --git a/testData/ast/issues/file/kt-963.kt b/testData/ast/issues/file/kt-963.kt index 3b22ff9d391..2e024295a77 100644 --- a/testData/ast/issues/file/kt-963.kt +++ b/testData/ast/issues/file/kt-963.kt @@ -2,6 +2,6 @@ package demo open class C(a : Int) { var abc : Int = 0 { -abc = (a * 2) +abc = a * 2 } } \ No newline at end of file diff --git a/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.kt b/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.kt index f636c05dd7f..bb5b07c2f36 100644 --- a/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.kt +++ b/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.kt @@ -2,9 +2,9 @@ var n : Int = substring.length() var j : Int = i var k : Int = 0 -while (((n--) != 0)) +while (n-- != 0) { -if ((searchMe.charAt((j++)) != substring.charAt((k++)))) +if (searchMe.charAt(j++) != substring.charAt(k++)) { continue@test } diff --git a/testData/ast/parenthesizedExpression/expression/parenthesized.kt b/testData/ast/parenthesizedExpression/expression/parenthesized.kt index eb8f4ff5a21..0a911375668 100644 --- a/testData/ast/parenthesizedExpression/expression/parenthesized.kt +++ b/testData/ast/parenthesizedExpression/expression/parenthesized.kt @@ -1 +1 @@ -((1 + 2)) \ No newline at end of file +(1 + 2) \ No newline at end of file diff --git a/testData/ast/parenthesizedExpression/expression/parenthesized2.kt b/testData/ast/parenthesizedExpression/expression/parenthesized2.kt index 42a621de6bb..01d3d19b7d8 100644 --- a/testData/ast/parenthesizedExpression/expression/parenthesized2.kt +++ b/testData/ast/parenthesizedExpression/expression/parenthesized2.kt @@ -1 +1 @@ -((str.toString() + "abc")) \ No newline at end of file +(str.toString() + "abc") \ No newline at end of file diff --git a/testData/ast/polyadicExpression/expression/divide.kt b/testData/ast/polyadicExpression/expression/divide.kt index 8da2777c101..6005ff02b5d 100644 --- a/testData/ast/polyadicExpression/expression/divide.kt +++ b/testData/ast/polyadicExpression/expression/divide.kt @@ -1 +1 @@ -(1 / 2 / 3) \ No newline at end of file +1 / 2 / 3 \ No newline at end of file diff --git a/testData/ast/polyadicExpression/expression/minus.kt b/testData/ast/polyadicExpression/expression/minus.kt index 220aab2cfa6..35002f64d1e 100644 --- a/testData/ast/polyadicExpression/expression/minus.kt +++ b/testData/ast/polyadicExpression/expression/minus.kt @@ -1 +1 @@ -(1 - 2 - 3) \ No newline at end of file +1 - 2 - 3 \ No newline at end of file diff --git a/testData/ast/polyadicExpression/expression/multiply.kt b/testData/ast/polyadicExpression/expression/multiply.kt index 588078fc87e..89ddea79483 100644 --- a/testData/ast/polyadicExpression/expression/multiply.kt +++ b/testData/ast/polyadicExpression/expression/multiply.kt @@ -1 +1 @@ -(1 * 2 * 3) \ No newline at end of file +1 * 2 * 3 \ No newline at end of file diff --git a/testData/ast/polyadicExpression/expression/plus.kt b/testData/ast/polyadicExpression/expression/plus.kt index 5dcba15ae9a..8a2a3c5ef6f 100644 --- a/testData/ast/polyadicExpression/expression/plus.kt +++ b/testData/ast/polyadicExpression/expression/plus.kt @@ -1 +1 @@ -(1 + 2 + 3) \ No newline at end of file +1 + 2 + 3 \ No newline at end of file diff --git a/testData/ast/polyadicExpression/expression/remainder.kt b/testData/ast/polyadicExpression/expression/remainder.kt index 65b18900b56..2e120c0cd68 100644 --- a/testData/ast/polyadicExpression/expression/remainder.kt +++ b/testData/ast/polyadicExpression/expression/remainder.kt @@ -1 +1 @@ -(1 % 2 % 3) \ No newline at end of file +1 % 2 % 3 \ No newline at end of file diff --git a/testData/ast/polyadicExpression/expression/unassignedShiftRight.kt b/testData/ast/polyadicExpression/expression/unassignedShiftRight.kt index cc8c414081e..83d192a6a77 100644 --- a/testData/ast/polyadicExpression/expression/unassignedShiftRight.kt +++ b/testData/ast/polyadicExpression/expression/unassignedShiftRight.kt @@ -1 +1 @@ -(1 ushr 2 ushr 3) \ No newline at end of file +1 ushr 2 ushr 3 \ No newline at end of file diff --git a/testData/ast/postfixOperator/statement/decrement.kt b/testData/ast/postfixOperator/statement/decrement.kt index 1387099f5a4..b45bc7f1686 100644 --- a/testData/ast/postfixOperator/statement/decrement.kt +++ b/testData/ast/postfixOperator/statement/decrement.kt @@ -1 +1 @@ -(i--) \ No newline at end of file +i-- \ No newline at end of file diff --git a/testData/ast/postfixOperator/statement/increment.kt b/testData/ast/postfixOperator/statement/increment.kt index 568dc98d422..f47eebed94d 100644 --- a/testData/ast/postfixOperator/statement/increment.kt +++ b/testData/ast/postfixOperator/statement/increment.kt @@ -1 +1 @@ -(i++) \ No newline at end of file +i++ \ No newline at end of file diff --git a/testData/ast/prefixOperator/statement/decrement.kt b/testData/ast/prefixOperator/statement/decrement.kt index 93712ce027e..33b7049c8ba 100644 --- a/testData/ast/prefixOperator/statement/decrement.kt +++ b/testData/ast/prefixOperator/statement/decrement.kt @@ -1 +1 @@ -(--i) \ No newline at end of file +--i \ No newline at end of file diff --git a/testData/ast/prefixOperator/statement/excl.kt b/testData/ast/prefixOperator/statement/excl.kt index aaaf7a4cdbd..54a88090fcb 100644 --- a/testData/ast/prefixOperator/statement/excl.kt +++ b/testData/ast/prefixOperator/statement/excl.kt @@ -1,2 +1,2 @@ var i : Boolean = true -var j : Boolean = (!i) \ No newline at end of file +var j : Boolean = !i \ No newline at end of file diff --git a/testData/ast/prefixOperator/statement/increment.kt b/testData/ast/prefixOperator/statement/increment.kt index b981de4d9b3..de36816d982 100644 --- a/testData/ast/prefixOperator/statement/increment.kt +++ b/testData/ast/prefixOperator/statement/increment.kt @@ -1 +1 @@ -(++i) \ No newline at end of file +++i \ No newline at end of file diff --git a/testData/ast/prefixOperator/statement/kt-667.kt b/testData/ast/prefixOperator/statement/kt-667.kt index 80f8ac234ee..529e9a8b422 100644 --- a/testData/ast/prefixOperator/statement/kt-667.kt +++ b/testData/ast/prefixOperator/statement/kt-667.kt @@ -1,2 +1,2 @@ var i : Int = (10).inv() -var j : Int = (((i * 100))).inv() \ No newline at end of file +var j : Int = ((i * 100)).inv() \ No newline at end of file diff --git a/testData/ast/trait/class/interfaceWithFields.kt b/testData/ast/trait/class/interfaceWithFields.kt index 8e2b43d7e84..008928c5d7c 100644 --- a/testData/ast/trait/class/interfaceWithFields.kt +++ b/testData/ast/trait/class/interfaceWithFields.kt @@ -2,6 +2,6 @@ trait INode { class object { val IN : String? = "in" val AT : String? = "@" -val COMMA_WITH_SPACE : String? = (COMMA + SPACE) +val COMMA_WITH_SPACE : String? = COMMA + SPACE } } \ No newline at end of file diff --git a/testData/ast/trait/class/interfaceWithStaticFields.kt b/testData/ast/trait/class/interfaceWithStaticFields.kt index 22d47bf9a91..b7b74d0ed87 100644 --- a/testData/ast/trait/class/interfaceWithStaticFields.kt +++ b/testData/ast/trait/class/interfaceWithStaticFields.kt @@ -2,6 +2,6 @@ public trait INode { class object { public val IN : String? = "in" public val AT : String? = "@" -public val COMMA_WITH_SPACE : String? = (COMMA + SPACE) +public val COMMA_WITH_SPACE : String? = COMMA + SPACE } } \ No newline at end of file diff --git a/testData/ast/whileStatement/statement/whileWithBlock.kt b/testData/ast/whileStatement/statement/whileWithBlock.kt index fa368e489ee..88e9992f59a 100644 --- a/testData/ast/whileStatement/statement/whileWithBlock.kt +++ b/testData/ast/whileStatement/statement/whileWithBlock.kt @@ -1,5 +1,5 @@ -while ((a > b)) +while (a > b) { var i : Int = 1 -i = (i + 1) +i = i + 1 } \ No newline at end of file diff --git a/testData/ast/whileStatement/statement/whileWithExpression.kt b/testData/ast/whileStatement/statement/whileWithExpression.kt index af7baeada37..fd2a7536a52 100644 --- a/testData/ast/whileStatement/statement/whileWithExpression.kt +++ b/testData/ast/whileStatement/statement/whileWithExpression.kt @@ -1,2 +1,2 @@ while (true) -i = (i + 1) \ No newline at end of file +i = i + 1 \ No newline at end of file From 7673c87ecb5aba95c867d9faa0af796c2602dbce Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 19 Jan 2012 14:36:01 +0400 Subject: [PATCH 205/206] System.getProperty("line.separator")/"\n" --- src/org/jetbrains/jet/j2k/ast/Node.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/jetbrains/jet/j2k/ast/Node.java b/src/org/jetbrains/jet/j2k/ast/Node.java index 40798ea50a1..a42fb06cca0 100644 --- a/src/org/jetbrains/jet/j2k/ast/Node.java +++ b/src/org/jetbrains/jet/j2k/ast/Node.java @@ -26,7 +26,7 @@ public abstract class Node implements INode { "double", "float", "long", "int", "short", "byte", "boolean", "char" )); - static final String N = System.getProperty("line.separator"); + static final String N = "\n"; @NotNull static final String N2 = N + N; @NotNull From ae6479a765019b4a38dfbff38d093bec6a731c53 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Fri, 27 Jan 2012 17:15:30 +0400 Subject: [PATCH 206/206] Move to another repo --- Makefile => j2k/Makefile | 0 j2k.iml => j2k/j2k.iml | 0 j2k.ipr => j2k/j2k.ipr | 0 {lib => j2k/lib}/commons-cli-1.2.jar | Bin {lib => j2k/lib}/commons-io-2.1.jar | Bin {src => j2k/src}/META-INF/MANIFEST.MF | 0 .../src}/org/jetbrains/jet/j2k/Converter.java | 0 .../src}/org/jetbrains/jet/j2k/ConverterUtil.java | 0 .../src}/org/jetbrains/jet/j2k/JavaToKotlinCli.java | 0 .../jetbrains/jet/j2k/JavaToKotlinTranslator.java | 0 .../jet/j2k/SetupJavaCoreEnvironmentException.java | 0 .../org/jetbrains/jet/j2k/ast/AnonymousClass.java | 0 .../jet/j2k/ast/ArrayAccessExpression.java | 0 .../jet/j2k/ast/ArrayInitializerExpression.java | 0 .../src}/org/jetbrains/jet/j2k/ast/ArrayType.java | 0 .../ast/ArrayWithoutInitializationExpression.java | 0 .../org/jetbrains/jet/j2k/ast/AssertStatement.java | 0 .../jetbrains/jet/j2k/ast/AssignmentExpression.java | 0 .../org/jetbrains/jet/j2k/ast/BinaryExpression.java | 0 .../src}/org/jetbrains/jet/j2k/ast/Block.java | 0 .../org/jetbrains/jet/j2k/ast/BreakStatement.java | 0 .../jetbrains/jet/j2k/ast/CallChainExpression.java | 0 .../org/jetbrains/jet/j2k/ast/CaseContainer.java | 0 .../org/jetbrains/jet/j2k/ast/CatchStatement.java | 0 .../src}/org/jetbrains/jet/j2k/ast/Class.java | 0 .../jet/j2k/ast/ClassObjectAccessExpression.java | 0 .../src}/org/jetbrains/jet/j2k/ast/ClassType.java | 0 .../src}/org/jetbrains/jet/j2k/ast/Constructor.java | 0 .../jetbrains/jet/j2k/ast/ContinueStatement.java | 0 .../jetbrains/jet/j2k/ast/DeclarationStatement.java | 0 .../jet/j2k/ast/DefaultSwitchLabelStatement.java | 0 .../org/jetbrains/jet/j2k/ast/DoWhileStatement.java | 0 .../jet/j2k/ast/DummyMethodCallExpression.java | 0 .../jet/j2k/ast/DummyStringExpression.java | 0 .../src}/org/jetbrains/jet/j2k/ast/Element.java | 0 .../src}/org/jetbrains/jet/j2k/ast/Enum.java | 0 .../org/jetbrains/jet/j2k/ast/EnumConstant.java | 0 .../src}/org/jetbrains/jet/j2k/ast/Expression.java | 0 .../org/jetbrains/jet/j2k/ast/ExpressionList.java | 0 .../jet/j2k/ast/ExpressionListStatement.java | 0 .../src}/org/jetbrains/jet/j2k/ast/Field.java | 0 .../src}/org/jetbrains/jet/j2k/ast/File.java | 0 .../org/jetbrains/jet/j2k/ast/ForeachStatement.java | 0 .../jet/j2k/ast/ForeachWithRangeStatement.java | 0 .../src}/org/jetbrains/jet/j2k/ast/Function.java | 0 .../src}/org/jetbrains/jet/j2k/ast/IMember.java | 0 .../src}/org/jetbrains/jet/j2k/ast/INode.java | 0 .../src}/org/jetbrains/jet/j2k/ast/Identifier.java | 0 .../org/jetbrains/jet/j2k/ast/IdentifierImpl.java | 0 .../src}/org/jetbrains/jet/j2k/ast/IfStatement.java | 0 .../src}/org/jetbrains/jet/j2k/ast/Import.java | 0 .../org/jetbrains/jet/j2k/ast/InProjectionType.java | 0 .../src}/org/jetbrains/jet/j2k/ast/Initializer.java | 0 .../src}/org/jetbrains/jet/j2k/ast/IsOperator.java | 0 .../org/jetbrains/jet/j2k/ast/LabelStatement.java | 0 .../jetbrains/jet/j2k/ast/LiteralExpression.java | 0 .../org/jetbrains/jet/j2k/ast/LocalVariable.java | 0 .../src}/org/jetbrains/jet/j2k/ast/Member.java | 0 .../jetbrains/jet/j2k/ast/MethodCallExpression.java | 0 .../src}/org/jetbrains/jet/j2k/ast/Modifier.java | 0 .../jetbrains/jet/j2k/ast/NewClassExpression.java | 0 .../src}/org/jetbrains/jet/j2k/ast/Node.java | 0 .../jetbrains/jet/j2k/ast/OutProjectionType.java | 0 .../src}/org/jetbrains/jet/j2k/ast/Parameter.java | 0 .../org/jetbrains/jet/j2k/ast/ParameterList.java | 0 .../jet/j2k/ast/ParenthesizedExpression.java | 0 .../jetbrains/jet/j2k/ast/PolyadicExpression.java | 0 .../org/jetbrains/jet/j2k/ast/PostfixOperator.java | 0 .../org/jetbrains/jet/j2k/ast/PrefixOperator.java | 0 .../org/jetbrains/jet/j2k/ast/PrimitiveType.java | 0 .../org/jetbrains/jet/j2k/ast/ReferenceElement.java | 0 .../org/jetbrains/jet/j2k/ast/ReturnStatement.java | 0 .../jetbrains/jet/j2k/ast/StarProjectionType.java | 0 .../src}/org/jetbrains/jet/j2k/ast/Statement.java | 0 .../org/jetbrains/jet/j2k/ast/SuperExpression.java | 0 .../jet/j2k/ast/SureCallChainExpression.java | 0 .../org/jetbrains/jet/j2k/ast/SwitchContainer.java | 0 .../jetbrains/jet/j2k/ast/SwitchLabelStatement.java | 0 .../jet/j2k/ast/SynchronizedStatement.java | 0 .../org/jetbrains/jet/j2k/ast/ThisExpression.java | 0 .../org/jetbrains/jet/j2k/ast/ThrowStatement.java | 0 .../src}/org/jetbrains/jet/j2k/ast/Trait.java | 0 .../org/jetbrains/jet/j2k/ast/TryStatement.java | 0 .../src}/org/jetbrains/jet/j2k/ast/Type.java | 0 .../jetbrains/jet/j2k/ast/TypeCastExpression.java | 0 .../src}/org/jetbrains/jet/j2k/ast/TypeElement.java | 0 .../org/jetbrains/jet/j2k/ast/TypeParameter.java | 0 .../src}/org/jetbrains/jet/j2k/ast/VarArg.java | 0 .../org/jetbrains/jet/j2k/ast/WhileStatement.java | 0 .../src}/org/jetbrains/jet/j2k/util/AstUtil.java | 0 .../jetbrains/jet/j2k/visitors/ClassVisitor.java | 0 .../org/jetbrains/jet/j2k/visitors/Dispatcher.java | 0 .../jetbrains/jet/j2k/visitors/ElementVisitor.java | 0 .../jet/j2k/visitors/ExpressionVisitor.java | 0 .../ExpressionVisitorForDirectObjectInheritors.java | 0 .../jet/j2k/visitors/StatementVisitor.java | 0 .../jetbrains/jet/j2k/visitors/SuperVisitor.java | 0 .../org/jetbrains/jet/j2k/visitors/ThisVisitor.java | 0 .../org/jetbrains/jet/j2k/visitors/TypeVisitor.java | 0 .../j2k/StandaloneJavaToKotlinConverterTest.java | 0 .../org/jetbrains/jet/j2k/TestCaseBuilder.java | 0 .../ast/annotations/file/jetbrainsNotNull.jav | 0 .../ast/annotations/file/jetbrainsNotNull.kt | 0 .../ast/anonymousBlock/file/oneAnonBlock.jav | 0 .../ast/anonymousBlock/file/oneAnonBlock.kt | 0 .../ast/anonymousBlock/file/oneStaticAnonBlock.jav | 0 .../ast/anonymousBlock/file/oneStaticAnonBlock.kt | 0 .../expression/expressionIndex.jav | 0 .../expression/expressionIndex.kt | 0 .../arrayAccessExpression/expression/intIndex.jav | 0 .../arrayAccessExpression/expression/intIndex.kt | 0 .../expression/variableIndex.jav | 0 .../expression/variableIndex.kt | 0 .../expression/newInt.jav | 0 .../arrayInitializerExpression/expression/newInt.kt | 0 .../statement/doubleArray.jav | 0 .../statement/doubleArray.kt | 0 .../statement/doubleArrayWithVariables.jav | 0 .../statement/doubleArrayWithVariables.kt | 0 .../statement/floatArray.jav | 0 .../statement/floatArray.kt | 0 .../statement/javaLangDoubleArray.jav | 0 .../statement/javaLangDoubleArray.kt | 0 .../statement/javaLangFloatArray.jav | 0 .../statement/javaLangFloatArray.kt | 0 .../statement/newByte.jav | 0 .../arrayInitializerExpression/statement/newByte.kt | 0 .../arrayInitializerExpression/statement/oneDim.jav | 0 .../arrayInitializerExpression/statement/oneDim.kt | 0 .../statement/oneDimWithVariables.jav | 0 .../statement/oneDimWithVariables.kt | 0 .../arrayInitializerExpression/statement/twoDim.jav | 0 .../arrayInitializerExpression/statement/twoDim.kt | 0 .../ast/arrayType/method/methodArrayArgs.jav | 0 .../ast/arrayType/method/methodArrayArgs.kt | 0 .../statement/arrayInitializationStatement.jav | 0 .../statement/arrayInitializationStatement.kt | 0 .../arrayInitializationStatementWithDimension.jav | 0 .../arrayInitializationStatementWithDimension.kt | 0 .../arrayInitializationStatementWithDimension3d.jav | 0 .../arrayInitializationStatementWithDimension3d.kt | 0 ...InitializationStatementWithDimensionExplicit.jav | 0 ...yInitializationStatementWithDimensionExplicit.kt | 0 .../ast/arrayType/statement/d2StringEmptyArray.jav | 0 .../ast/arrayType/statement/d2StringEmptyArray.kt | 0 .../ast/arrayType/statement/d3StringEmptyArray.jav | 0 .../ast/arrayType/statement/d3StringEmptyArray.kt | 0 .../testData}/ast/arrayType/statement/longArray.jav | 0 .../testData}/ast/arrayType/statement/longArray.kt | 0 .../ast/arrayType/statement/newIntArray.jav | 0 .../ast/arrayType/statement/newIntArray.kt | 0 .../ast/arrayType/statement/newStringArray.jav | 0 .../ast/arrayType/statement/newStringArray.kt | 0 .../ast/assertStatement/statement/onlyCondition.jav | 0 .../ast/assertStatement/statement/onlyCondition.kt | 0 .../statement/onlyConditionWithBraces.jav | 0 .../statement/onlyConditionWithBraces.kt | 0 .../assertStatement/statement/withStringDetail.jav | 0 .../assertStatement/statement/withStringDetail.kt | 0 .../ast/assignmentExpression/expression/and.jav | 0 .../ast/assignmentExpression/expression/and.kt | 0 .../assignmentExpression/expression/assignment.jav | 0 .../assignmentExpression/expression/assignment.kt | 0 .../expression/divideAssign.jav | 0 .../assignmentExpression/expression/divideAssign.kt | 0 .../assignmentExpression/expression/minusAssign.jav | 0 .../assignmentExpression/expression/minusAssign.kt | 0 .../expression/multiplyAssign.jav | 0 .../expression/multiplyAssign.kt | 0 .../ast/assignmentExpression/expression/or.jav | 0 .../ast/assignmentExpression/expression/or.kt | 0 .../assignmentExpression/expression/plusAssign.jav | 0 .../assignmentExpression/expression/plusAssign.kt | 0 .../assignmentExpression/expression/reminder.jav | 0 .../ast/assignmentExpression/expression/reminder.kt | 0 .../assignmentExpression/expression/shiftLeft.jav | 0 .../assignmentExpression/expression/shiftLeft.kt | 0 .../assignmentExpression/expression/shiftRight.jav | 0 .../assignmentExpression/expression/shiftRight.kt | 0 .../expression/unsignedRightShift.jav | 0 .../expression/unsignedRightShift.kt | 0 .../ast/assignmentExpression/expression/xor.jav | 0 .../ast/assignmentExpression/expression/xor.kt | 0 .../statement/simpleAssignment.jav | 0 .../statement/simpleAssignment.kt | 0 .../ast/binaryExpression/expression/and.jav | 0 .../ast/binaryExpression/expression/and.kt | 0 .../binaryExpression/expression/conditionalAnd.jav | 0 .../binaryExpression/expression/conditionalAnd.kt | 0 .../binaryExpression/expression/conditionalOr.jav | 0 .../binaryExpression/expression/conditionalOr.kt | 0 .../ast/binaryExpression/expression/divide.jav | 0 .../ast/binaryExpression/expression/divide.kt | 0 .../ast/binaryExpression/expression/greaterThan.jav | 0 .../ast/binaryExpression/expression/greaterThan.kt | 0 .../expression/greaterThanEqual.jav | 0 .../binaryExpression/expression/greaterThanEqual.kt | 0 .../ast/binaryExpression/expression/lessThan.jav | 0 .../ast/binaryExpression/expression/lessThan.kt | 0 .../binaryExpression/expression/lessThanEqual.jav | 0 .../binaryExpression/expression/lessThanEqual.kt | 0 .../ast/binaryExpression/expression/minus.jav | 0 .../ast/binaryExpression/expression/minus.kt | 0 .../ast/binaryExpression/expression/multiply.jav | 0 .../ast/binaryExpression/expression/multiply.kt | 0 .../ast/binaryExpression/expression/or.jav | 0 .../testData}/ast/binaryExpression/expression/or.kt | 0 .../ast/binaryExpression/expression/plus.jav | 0 .../ast/binaryExpression/expression/plus.kt | 0 .../ast/binaryExpression/expression/remainder.jav | 0 .../ast/binaryExpression/expression/remainder.kt | 0 .../ast/binaryExpression/expression/shiftLeft.jav | 0 .../ast/binaryExpression/expression/shiftLeft.kt | 0 .../ast/binaryExpression/expression/shiftRight.jav | 0 .../ast/binaryExpression/expression/shiftRight.kt | 0 .../expression/unsignedRightShift.jav | 0 .../expression/unsignedRightShift.kt | 0 .../ast/binaryExpression/expression/xor.jav | 0 .../ast/binaryExpression/expression/xor.kt | 0 .../testData}/ast/boxedType/file/kt-671.jav | 0 .../testData}/ast/boxedType/file/kt-671.kt | 0 .../testData}/ast/boxedType/statement/boolean.jav | 0 .../testData}/ast/boxedType/statement/boolean.kt | 0 .../testData}/ast/boxedType/statement/byte.jav | 0 .../testData}/ast/boxedType/statement/byte.kt | 0 .../testData}/ast/boxedType/statement/character.jav | 0 .../testData}/ast/boxedType/statement/character.kt | 0 .../testData}/ast/boxedType/statement/double.jav | 0 .../testData}/ast/boxedType/statement/double.kt | 0 .../testData}/ast/boxedType/statement/float.jav | 0 .../testData}/ast/boxedType/statement/float.kt | 0 .../testData}/ast/boxedType/statement/integer.jav | 0 .../testData}/ast/boxedType/statement/integer.kt | 0 .../testData}/ast/boxedType/statement/long.jav | 0 .../testData}/ast/boxedType/statement/long.kt | 0 .../testData}/ast/boxedType/statement/object.jav | 0 .../testData}/ast/boxedType/statement/object.kt | 0 .../testData}/ast/boxedType/statement/short.jav | 0 .../testData}/ast/boxedType/statement/short.kt | 0 .../ast/breakStatement/statement/breakWithLabel.jav | 0 .../ast/breakStatement/statement/breakWithLabel.kt | 0 .../breakStatement/statement/breakWithoutLabel.jav | 0 .../breakStatement/statement/breakWithoutLabel.kt | 0 .../callChainExpression/file/libraryFieldCall.jav | 0 .../callChainExpression/file/libraryFieldCall.kt | 0 .../callChainExpression/file/libraryMethodCall.jav | 0 .../callChainExpression/file/libraryMethodCall.kt | 0 .../file/libraryMethodCallFromInstance.jav | 0 .../file/libraryMethodCallFromInstance.kt | 0 .../file/libraryStringFieldCall.jav | 0 .../file/libraryStringFieldCall.kt | 0 .../ast/callChainExpression/statement/sout.jav | 0 .../ast/callChainExpression/statement/sout.kt | 0 .../testData}/ast/class/class/abstractClass.jav | 0 .../testData}/ast/class/class/abstractClass.kt | 0 .../ast/class/class/abstractClassShape.jav | 0 .../testData}/ast/class/class/abstractClassShape.kt | 0 .../testData}/ast/class/class/class.jav | 0 {testData => j2k/testData}/ast/class/class/class.kt | 0 .../ast/class/class/classWithEmptyMethods.jav | 0 .../ast/class/class/classWithEmptyMethods.kt | 0 .../testData}/ast/class/class/classWithFields.jav | 0 .../testData}/ast/class/class/classWithFields.kt | 0 .../ast/class/class/classWithMultiplyFields.jav | 0 .../ast/class/class/classWithMultiplyFields.kt | 0 .../testData}/ast/class/class/emptyClass.jav | 0 .../testData}/ast/class/class/emptyClass.kt | 0 .../extendsOneClassAndImplementsOneInterface.jav | 0 .../extendsOneClassAndImplementsOneInterface.kt | 0 ...xtendsOneClassAndImplementsSeveralInterfaces.jav | 0 ...extendsOneClassAndImplementsSeveralInterfaces.kt | 0 .../testData}/ast/class/class/finalClass.jav | 0 .../testData}/ast/class/class/finalClass.kt | 0 .../testData}/ast/class/class/genericClass.jav | 0 .../testData}/ast/class/class/genericClass.kt | 0 .../testData}/ast/class/class/innerEmptyClass.jav | 0 .../testData}/ast/class/class/innerEmptyClass.kt | 0 .../testData}/ast/class/class/innerStaticClass.jav | 0 .../testData}/ast/class/class/innerStaticClass.kt | 0 .../testData}/ast/class/class/internalClass.jav | 0 .../testData}/ast/class/class/internalClass.kt | 0 .../ast/class/class/oneStaticFieldOneNonStatic.jav | 0 .../ast/class/class/oneStaticFieldOneNonStatic.kt | 0 .../testData}/ast/class/class/oneStaticMethod.jav | 0 .../testData}/ast/class/class/oneStaticMethod.kt | 0 .../ast/class/class/oneStaticMethodOneNonStatic.jav | 0 .../ast/class/class/oneStaticMethodOneNonStatic.kt | 0 .../testData}/ast/class/class/pivateClass.jav | 0 .../testData}/ast/class/class/pivateClass.kt | 0 .../testData}/ast/class/class/protectedClass.jav | 0 .../testData}/ast/class/class/protectedClass.kt | 0 .../testData}/ast/class/class/publicClass.jav | 0 .../testData}/ast/class/class/publicClass.kt | 0 .../testData}/ast/class/class/simpleInheritance.jav | 0 .../testData}/ast/class/class/simpleInheritance.kt | 0 .../testData}/ast/class/class/twoStaticMethod.jav | 0 .../testData}/ast/class/class/twoStaticMethod.kt | 0 .../testData}/ast/class/file/kt-639.jav | 0 {testData => j2k/testData}/ast/class/file/kt-639.kt | 0 .../testData}/ast/class/file/privateInit.jav | 0 .../testData}/ast/class/file/privateInit.kt | 0 .../ast/classExpression/expression/objectClass.jav | 0 .../ast/classExpression/expression/objectClass.kt | 0 .../ast/classExpression/expression/stringClass.jav | 0 .../ast/classExpression/expression/stringClass.kt | 0 .../classExpression/statement/complexExample.jav | 0 .../ast/classExpression/statement/complexExample.kt | 0 .../expression/simpleConditionalExpression.jav | 0 .../expression/simpleConditionalExpression.kt | 0 .../ast/constructors/file/allCallsPrimary.jav | 0 .../ast/constructors/file/allCallsPrimary.kt | 0 .../ast/constructors/file/allCallsPrimary2.jav | 0 .../ast/constructors/file/allCallsPrimary2.kt | 0 .../ast/constructors/file/customerBuilder.jav | 0 .../ast/constructors/file/customerBuilder.kt | 0 .../ast/constructors/file/genericIdentifier.jav | 0 .../ast/constructors/file/genericIdentifier.kt | 0 .../testData}/ast/constructors/file/identifier.jav | 0 .../testData}/ast/constructors/file/identifier.kt | 0 .../ast/constructors/file/withManyDefaultParams.jav | 0 .../ast/constructors/file/withManyDefaultParams.kt | 0 .../statement/continueWithLabel.jav | 0 .../statement/continueWithLabel.kt | 0 .../statement/continueWithoutLabel.jav | 0 .../statement/continueWithoutLabel.kt | 0 .../statement/multiplyFinalIntDeclaration.jav | 0 .../statement/multiplyFinalIntDeclaration.kt | 0 .../statement/multiplyIntDeclaration.jav | 0 .../statement/multiplyIntDeclaration.kt | 0 .../statement/singleFinalIntDeclaration.jav | 0 .../statement/singleFinalIntDeclaration.kt | 0 .../statement/singleFinalStringDeclaration.jav | 0 .../statement/singleFinalStringDeclaration.kt | 0 .../statement/singleIntDeclaration.jav | 0 .../statement/singleIntDeclaration.kt | 0 .../statement/singleStringDeclaration.jav | 0 .../statement/singleStringDeclaration.kt | 0 .../doWhileStatement/statement/whileWithBlock.jav | 0 .../doWhileStatement/statement/whileWithBlock.kt | 0 .../statement/whileWithEmptyBlock.jav | 0 .../statement/whileWithEmptyBlock.kt | 0 .../statement/whileWithExpression.jav | 0 .../statement/whileWithExpression.kt | 0 .../doWhileStatement/statement/whileWithReturn.jav | 0 .../doWhileStatement/statement/whileWithReturn.kt | 0 .../testData}/ast/enum/class/colorEnum.jav | 0 .../testData}/ast/enum/class/colorEnum.kt | 0 .../testData}/ast/enum/class/emptyEnum.jav | 0 .../testData}/ast/enum/class/emptyEnum.kt | 0 .../ast/enum/class/enumImplementsOneInterface.jav | 0 .../ast/enum/class/enumImplementsOneInterface.kt | 0 .../enum/class/enumImplementsSeveralInterfaces.jav | 0 .../enum/class/enumImplementsSeveralInterfaces.kt | 0 .../testData}/ast/enum/class/enumWithNameField.jav | 0 .../testData}/ast/enum/class/enumWithNameField.kt | 0 .../class/fieldsWithPrimaryPrivateConstructor.jav | 0 .../class/fieldsWithPrimaryPrivateConstructor.kt | 0 .../testData}/ast/enum/class/internalEnum.jav | 0 .../testData}/ast/enum/class/internalEnum.kt | 0 .../testData}/ast/enum/class/overrideToString.jav | 0 .../testData}/ast/enum/class/overrideToString.kt | 0 .../ast/enum/class/primaryPrivateConstructor.jav | 0 .../ast/enum/class/primaryPrivateConstructor.kt | 0 .../testData}/ast/enum/class/privateEnum.jav | 0 .../testData}/ast/enum/class/privateEnum.kt | 0 .../testData}/ast/enum/class/protectedEnum.jav | 0 .../testData}/ast/enum/class/protectedEnum.kt | 0 .../testData}/ast/enum/class/publicEnum.jav | 0 .../testData}/ast/enum/class/publicEnum.kt | 0 .../ast/enum/class/runnableImplementation.jav | 0 .../ast/enum/class/runnableImplementation.kt | 0 .../testData}/ast/enum/class/typeSafeEnum.jav | 0 .../testData}/ast/enum/class/typeSafeEnum.kt | 0 .../ast/field/file/classChildExtendsBase.jav | 0 .../ast/field/file/classChildExtendsBase.kt | 0 .../testData}/ast/field/file/internalField.jav | 0 .../testData}/ast/field/file/internalField.kt | 0 .../testData}/ast/field/file/privateField.jav | 0 .../testData}/ast/field/file/privateField.kt | 0 .../testData}/ast/field/file/protectedField.jav | 0 .../testData}/ast/field/file/protectedField.kt | 0 .../testData}/ast/field/file/publicField.jav | 0 .../testData}/ast/field/file/publicField.kt | 0 .../testData}/ast/field/file/valWithInit.jav | 0 .../testData}/ast/field/file/valWithInit.kt | 0 .../testData}/ast/field/file/varWithInit.jav | 0 .../testData}/ast/field/file/varWithInit.kt | 0 .../testData}/ast/field/file/varWithoutInit.jav | 0 .../testData}/ast/field/file/varWithoutInit.kt | 0 .../testData}/ast/file/comp/intNullability.jav | 0 .../testData}/ast/file/comp/intNullability.kt | 0 .../testData}/ast/file/file/packageWithClass.jav | 0 .../testData}/ast/file/file/packageWithClass.kt | 0 .../testData}/ast/file/file/packageWithClasses.jav | 0 .../testData}/ast/file/file/packageWithClasses.kt | 0 .../testData}/ast/file/file/packageWithImports.jav | 0 .../testData}/ast/file/file/packageWithImports.kt | 0 .../ast/file/file/packageWithMixedImports.jav | 0 .../ast/file/file/packageWithMixedImports.kt | 0 .../ast/file/file/packageWithOpenClass.jav | 0 .../testData}/ast/file/file/packageWithOpenClass.kt | 0 .../ast/file/file/packageWithStaticImports.jav | 0 .../ast/file/file/packageWithStaticImports.kt | 0 .../ast/for/statement/commonCaseForTest.jav | 0 .../ast/for/statement/commonCaseForTest.kt | 0 .../testData}/ast/for/statement/forRangeWithLE.jav | 0 .../testData}/ast/for/statement/forRangeWithLE.kt | 0 .../testData}/ast/for/statement/forRangeWithLT.jav | 0 .../testData}/ast/for/statement/forRangeWithLT.kt | 0 .../testData}/ast/for/statement/forWithBlock.jav | 0 .../testData}/ast/for/statement/forWithBlock.kt | 0 .../for/statement/forWithBlockAndDoubleUpdate.jav | 0 .../for/statement/forWithBlockAndDoubleUpdate.kt | 0 .../ast/for/statement/forWithEmptyBlock.jav | 0 .../ast/for/statement/forWithEmptyBlock.kt | 0 .../ast/for/statement/forWithExpression.jav | 0 .../ast/for/statement/forWithExpression.kt | 0 .../testData}/ast/for/statement/forWithReturn.jav | 0 .../testData}/ast/for/statement/forWithReturn.kt | 0 .../statement/enhancedForWithBlock.jav | 0 .../statement/enhancedForWithBlock.kt | 0 .../statement/enhancedForWithEmptyBlock.jav | 0 .../statement/enhancedForWithEmptyBlock.kt | 0 .../statement/enhancedForWithExpression.jav | 0 .../statement/enhancedForWithExpression.kt | 0 .../statement/enhancedForWithReturn.jav | 0 .../statement/enhancedForWithReturn.kt | 0 .../function/file/extendsBaseWhichExtendsObject.jav | 0 .../function/file/extendsBaseWhichExtendsObject.kt | 0 .../ast/function/file/functionInFinalClass.jav | 0 .../ast/function/file/functionInFinalClass.kt | 0 .../testData}/ast/function/file/override.jav | 0 .../testData}/ast/function/file/override.kt | 0 .../testData}/ast/function/file/overrideAndOpen.jav | 0 .../testData}/ast/function/file/overrideAndOpen.kt | 0 .../testData}/ast/function/file/overrideObject.jav | 0 .../testData}/ast/function/file/overrideObject.kt | 0 .../testData}/ast/function/file/varVararg.jav | 0 .../testData}/ast/function/file/varVararg.kt | 0 .../ast/function/file/writableParameter.jav | 0 .../ast/function/file/writableParameter.kt | 0 .../ast/function/method/abstractMethod.jav | 0 .../testData}/ast/function/method/abstractMethod.kt | 0 .../ast/function/method/classGenericParam.jav | 0 .../ast/function/method/classGenericParam.kt | 0 .../ast/function/method/emptyVoidMethod.jav | 0 .../ast/function/method/emptyVoidMethod.kt | 0 .../testData}/ast/function/method/final.jav | 0 .../testData}/ast/function/method/final.kt | 0 .../testData}/ast/function/method/internal.jav | 0 .../testData}/ast/function/method/internal.kt | 0 .../testData}/ast/function/method/main.jav | 0 .../testData}/ast/function/method/main.kt | 0 .../ast/function/method/methodClassType.jav | 0 .../ast/function/method/methodClassType.kt | 0 .../ast/function/method/methodPrimitiveType.jav | 0 .../ast/function/method/methodPrimitiveType.kt | 0 .../ast/function/method/methodPrimitiveType2.jav | 0 .../ast/function/method/methodPrimitiveType2.kt | 0 .../function/method/methodWithReturnStatement.jav | 0 .../function/method/methodWithReturnStatement.kt | 0 .../testData}/ast/function/method/open.jav | 0 .../testData}/ast/function/method/open.kt | 0 .../ast/function/method/ownGenericParam.jav | 0 .../ast/function/method/ownGenericParam.kt | 0 .../ast/function/method/ownSeveralGenericParams.jav | 0 .../ast/function/method/ownSeveralGenericParams.kt | 0 .../testData}/ast/function/method/private.jav | 0 .../testData}/ast/function/method/private.kt | 0 .../testData}/ast/function/method/protected.jav | 0 .../testData}/ast/function/method/protected.kt | 0 .../testData}/ast/function/method/public.jav | 0 .../testData}/ast/function/method/public.kt | 0 .../ast/identifier/expression/withDollar.jav | 0 .../ast/identifier/expression/withDollar.kt | 0 .../ast/identifier/file/finalFieldReference.jav | 0 .../ast/identifier/file/finalFieldReference.kt | 0 .../testData}/ast/identifier/statement/keywords.jav | 0 .../testData}/ast/identifier/statement/keywords.kt | 0 .../statement/ifStatementWithEmptyBlocks.jav | 0 .../statement/ifStatementWithEmptyBlocks.kt | 0 .../statement/ifStatementWithMultilineBlocks.jav | 0 .../statement/ifStatementWithMultilineBlocks.kt | 0 .../statement/ifStatementWithOneLineBlocks.jav | 0 .../statement/ifStatementWithOneLineBlocks.kt | 0 .../statement/ifStatementWithoutElse.jav | 0 .../ifStatement/statement/ifStatementWithoutElse.kt | 0 .../ast/importStatement/file/importWithKeywords.jav | 0 .../ast/importStatement/file/importWithKeywords.kt | 0 .../ast/importStatement/file/importWithStar.jav | 0 .../ast/importStatement/file/importWithStar.kt | 0 .../ast/importStatement/file/simpleImport.jav | 0 .../ast/importStatement/file/simpleImport.kt | 0 .../ast/inProjectionType/method/methodParams.jav | 0 .../ast/inProjectionType/method/methodParams.kt | 0 .../inheritance/file/classOneExtendsBaseGeneric.jav | 0 .../inheritance/file/classOneExtendsBaseGeneric.kt | 0 .../file/classOneExtendsBaseWithOneParam.jav | 0 .../file/classOneExtendsBaseWithOneParam.kt | 0 .../file/classOneExtendsBaseWithZeroParams.jav | 0 .../file/classOneExtendsBaseWithZeroParams.kt | 0 ...ExtendsBaseWithZeroParamsNonEmptyConstructor.jav | 0 ...eExtendsBaseWithZeroParamsNonEmptyConstructor.kt | 0 .../isOperator/expression/complicatedExpression.jav | 0 .../isOperator/expression/complicatedExpression.kt | 0 .../ast/isOperator/expression/simpleReference.jav | 0 .../ast/isOperator/expression/simpleReference.kt | 0 .../testData}/ast/issues/file/kt-1016.jav | 0 .../testData}/ast/issues/file/kt-1016.kt | 0 .../testData}/ast/issues/file/kt-1048.jav | 0 .../testData}/ast/issues/file/kt-1048.kt | 0 .../testData}/ast/issues/file/kt-1074.jav | 0 .../testData}/ast/issues/file/kt-1074.kt | 0 .../testData}/ast/issues/file/kt-543-boxed.jav | 0 .../testData}/ast/issues/file/kt-543-boxed.kt | 0 .../testData}/ast/issues/file/kt-543-mixed.jav | 0 .../testData}/ast/issues/file/kt-543-mixed.kt | 0 .../testData}/ast/issues/file/kt-543.jav | 0 .../testData}/ast/issues/file/kt-543.kt | 0 .../testData}/ast/issues/file/kt-638.jav | 0 .../testData}/ast/issues/file/kt-638.kt | 0 .../testData}/ast/issues/file/kt-696.jav | 0 .../testData}/ast/issues/file/kt-696.kt | 0 .../testData}/ast/issues/file/kt-792-mixed.jav | 0 .../testData}/ast/issues/file/kt-792-mixed.kt | 0 .../testData}/ast/issues/file/kt-792.jav | 0 .../testData}/ast/issues/file/kt-792.kt | 0 .../testData}/ast/issues/file/kt-794-mixed.jav | 0 .../testData}/ast/issues/file/kt-794-mixed.kt | 0 .../testData}/ast/issues/file/kt-794.jav | 0 .../testData}/ast/issues/file/kt-794.kt | 0 .../testData}/ast/issues/file/kt-809-string.jav | 0 .../testData}/ast/issues/file/kt-809-string.kt | 0 .../testData}/ast/issues/file/kt-809.jav | 0 .../testData}/ast/issues/file/kt-809.kt | 0 .../testData}/ast/issues/file/kt-820-field.jav | 0 .../testData}/ast/issues/file/kt-820-field.kt | 0 .../testData}/ast/issues/file/kt-820-string.jav | 0 .../testData}/ast/issues/file/kt-820-string.kt | 0 .../testData}/ast/issues/file/kt-820.jav | 0 .../testData}/ast/issues/file/kt-820.kt | 0 .../testData}/ast/issues/file/kt-824-isDir.jav | 0 .../testData}/ast/issues/file/kt-824-isDir.kt | 0 .../testData}/ast/issues/file/kt-824.jav | 0 .../testData}/ast/issues/file/kt-824.kt | 0 .../testData}/ast/issues/file/kt-828.jav | 0 .../testData}/ast/issues/file/kt-828.kt | 0 .../testData}/ast/issues/file/kt-836.jav | 0 .../testData}/ast/issues/file/kt-836.kt | 0 .../testData}/ast/issues/file/kt-837.jav | 0 .../testData}/ast/issues/file/kt-837.kt | 0 .../testData}/ast/issues/file/kt-852.jav | 0 .../testData}/ast/issues/file/kt-852.kt | 0 .../testData}/ast/issues/file/kt-871.jav | 0 .../testData}/ast/issues/file/kt-871.kt | 0 .../testData}/ast/issues/file/kt-879.jav | 0 .../testData}/ast/issues/file/kt-879.kt | 0 .../testData}/ast/issues/file/kt-893.jav | 0 .../testData}/ast/issues/file/kt-893.kt | 0 .../testData}/ast/issues/file/kt-963.jav | 0 .../testData}/ast/issues/file/kt-963.kt | 0 .../testData}/ast/kotlinExclusion/file/kt-656.jav | 0 .../testData}/ast/kotlinExclusion/file/kt-656.kt | 0 .../complicatedExampleFromJavaTutorial.jav | 0 .../statement/complicatedExampleFromJavaTutorial.kt | 0 .../testData}/ast/literalExpression/file/char.jav | 0 .../testData}/ast/literalExpression/file/char.kt | 0 .../literalExpression/file/dollarInsideString.jav | 0 .../literalExpression/file/dollarInsideString.kt | 0 .../ast/literalExpression/file/endsWithDFL.jav | 0 .../ast/literalExpression/file/endsWithDFL.kt | 0 .../testData}/ast/literalExpression/file/hex.jav | 0 .../testData}/ast/literalExpression/file/hex.kt | 0 .../testData}/ast/literalExpression/file/octal.jav | 0 .../testData}/ast/literalExpression/file/octal.kt | 0 .../ast/literalExpression/file/trueOrFalse.jav | 0 .../ast/literalExpression/file/trueOrFalse.kt | 0 .../ast/localVariable/statement/object.jav | 0 .../testData}/ast/localVariable/statement/object.kt | 0 .../ast/methodCallExpression/file/genericMethod.jav | 0 .../ast/methodCallExpression/file/genericMethod.kt | 0 .../statement/callWithKeywords.jav | 0 .../statement/callWithKeywords.kt | 0 .../methodCallExpression/statement/emptyCall.jav | 0 .../ast/methodCallExpression/statement/emptyCall.kt | 0 .../methodCallExpression/statement/simpleCall.jav | 0 .../methodCallExpression/statement/simpleCall.kt | 0 .../expression/classWithParam.jav | 0 .../newClassExpression/expression/classWithParam.kt | 0 .../expression/classWithParams.jav | 0 .../expression/classWithParams.kt | 0 .../expression/classWithoutBody.jav | 0 .../expression/classWithoutBody.kt | 0 .../expression/newClassWithAnonymousScope.jav | 0 .../expression/newClassWithAnonymousScope.kt | 0 .../newClassExpression/file/fullQualifiedName.jav | 0 .../newClassExpression/file/fullQualifiedName.kt | 0 .../newClassExpression/file/fullQualifiedName2.jav | 0 .../newClassExpression/file/fullQualifiedName2.kt | 0 .../file/genericClassInvocation.jav | 0 .../file/genericClassInvocation.kt | 0 .../newClassExpression/file/newClassByFullName.jav | 0 .../newClassExpression/file/newClassByFullName.kt | 0 .../ast/newClassExpression/file/newInnerClass.jav | 0 .../ast/newClassExpression/file/newInnerClass.kt | 0 .../newClassExpression/file/newListAndNewMember.jav | 0 .../newClassExpression/file/newListAndNewMember.kt | 0 .../newClassExpression/file/newStaticInnerClass.jav | 0 .../newClassExpression/file/newStaticInnerClass.kt | 0 .../testData}/ast/objectLiteral/file/MyFrame.jav | 0 .../testData}/ast/objectLiteral/file/MyFrame.kt | 0 .../ast/outProjectionType/method/methodParams.jav | 0 .../ast/outProjectionType/method/methodParams.kt | 0 .../packageStatement/file/orgJetbrainsJetJ2kIn.jav | 0 .../packageStatement/file/orgJetbrainsJetJ2kIn.kt | 0 .../expression/parenthesized.jav | 0 .../expression/parenthesized.kt | 0 .../expression/parenthesized2.jav | 0 .../expression/parenthesized2.kt | 0 .../ast/polyadicExpression/expression/divide.jav | 0 .../ast/polyadicExpression/expression/divide.kt | 0 .../ast/polyadicExpression/expression/minus.jav | 0 .../ast/polyadicExpression/expression/minus.kt | 0 .../ast/polyadicExpression/expression/multiply.jav | 0 .../ast/polyadicExpression/expression/multiply.kt | 0 .../ast/polyadicExpression/expression/plus.jav | 0 .../ast/polyadicExpression/expression/plus.kt | 0 .../ast/polyadicExpression/expression/remainder.jav | 0 .../ast/polyadicExpression/expression/remainder.kt | 0 .../expression/unassignedShiftRight.jav | 0 .../expression/unassignedShiftRight.kt | 0 .../ast/postfixOperator/statement/decrement.jav | 0 .../ast/postfixOperator/statement/decrement.kt | 0 .../ast/postfixOperator/statement/increment.jav | 0 .../ast/postfixOperator/statement/increment.kt | 0 .../ast/prefixOperator/statement/decrement.jav | 0 .../ast/prefixOperator/statement/decrement.kt | 0 .../testData}/ast/prefixOperator/statement/excl.jav | 0 .../testData}/ast/prefixOperator/statement/excl.kt | 0 .../ast/prefixOperator/statement/increment.jav | 0 .../ast/prefixOperator/statement/increment.kt | 0 .../ast/prefixOperator/statement/kt-667.jav | 0 .../ast/prefixOperator/statement/kt-667.kt | 0 .../ast/prefixOperator/statement/tilde.jav | 0 .../testData}/ast/prefixOperator/statement/tilde.kt | 0 .../testData}/ast/rawGenerics/file/kt-540-map.jav | 0 .../testData}/ast/rawGenerics/file/kt-540-map.kt | 0 .../ast/rawGenerics/file/kt-540-rawGenericClass.jav | 0 .../ast/rawGenerics/file/kt-540-rawGenericClass.kt | 0 .../testData}/ast/rawGenerics/file/kt-540.jav | 0 .../testData}/ast/rawGenerics/file/kt-540.kt | 0 .../ast/rawGenerics/file/rawGenericMethod.jav | 0 .../ast/rawGenerics/file/rawGenericMethod.kt | 0 .../ast/returnStatement/statement/returnChar.jav | 0 .../ast/returnStatement/statement/returnChar.kt | 0 .../ast/returnStatement/statement/returnLiteral.jav | 0 .../ast/returnStatement/statement/returnLiteral.kt | 0 .../ast/returnStatement/statement/returnNumber.jav | 0 .../ast/returnStatement/statement/returnNumber.kt | 0 .../ast/returnStatement/statement/returnString.jav | 0 .../ast/returnStatement/statement/returnString.kt | 0 .../ast/starProjectionType/method/methodParams.jav | 0 .../ast/starProjectionType/method/methodParams.kt | 0 .../ast/superExpression/class/classAextendsB.jav | 0 .../ast/superExpression/class/classAextendsB.kt | 0 .../ast/superExpression/file/classAdotSuperFoo.jav | 0 .../ast/superExpression/file/classAdotSuperFoo.kt | 0 .../superExpression/statement/superStatement.jav | 0 .../ast/superExpression/statement/superStatement.kt | 0 .../ast/switch/file/comlicatedFallDown.jav | 0 .../testData}/ast/switch/file/comlicatedFallDown.kt | 0 .../testData}/ast/switch/file/fallDown.jav | 0 .../testData}/ast/switch/file/fallDown.kt | 0 .../testData}/ast/switch/file/kt-539.jav | 0 .../testData}/ast/switch/file/kt-539.kt | 0 .../statement/singleLineExample.jav | 0 .../statement/singleLineExample.kt | 0 .../ast/thisExpression/file/classAdotThisFoo.jav | 0 .../ast/thisExpression/file/classAdotThisFoo.kt | 0 .../ast/thisExpression/statement/thisStatement.jav | 0 .../ast/thisExpression/statement/thisStatement.kt | 0 .../statement/simpleThrowStatement.jav | 0 .../statement/simpleThrowStatement.kt | 0 .../testData}/ast/trait/class/abstactInterface.jav | 0 .../testData}/ast/trait/class/abstactInterface.kt | 0 .../testData}/ast/trait/class/emptyInterface.jav | 0 .../testData}/ast/trait/class/emptyInterface.kt | 0 ...xtendsOneClassAndImplementsSeveralInterfaces.jav | 0 ...extendsOneClassAndImplementsSeveralInterfaces.kt | 0 .../ast/trait/class/extendsOneInterface.jav | 0 .../ast/trait/class/extendsOneInterface.kt | 0 .../ast/trait/class/interfaceWithFields.jav | 0 .../ast/trait/class/interfaceWithFields.kt | 0 .../trait/class/interfaceWithMethodDeclaration.jav | 0 .../trait/class/interfaceWithMethodDeclaration.kt | 0 .../ast/trait/class/interfaceWithStaticFields.jav | 0 .../ast/trait/class/interfaceWithStaticFields.kt | 0 .../testData}/ast/trait/class/internalInterface.jav | 0 .../testData}/ast/trait/class/internalInterface.kt | 0 .../testData}/ast/trait/class/privateInterface.jav | 0 .../testData}/ast/trait/class/privateInterface.kt | 0 .../ast/trait/class/protectedInterface.jav | 0 .../testData}/ast/trait/class/protectedInterface.kt | 0 .../testData}/ast/trait/class/publicInterface.jav | 0 .../testData}/ast/trait/class/publicInterface.kt | 0 .../statement/commonCaseForTryStatement.jav | 0 .../statement/commonCaseForTryStatement.kt | 0 .../emptyTryWithTwoCatchesWithEmptyFinally.jav | 0 .../emptyTryWithTwoCatchesWithEmptyFinally.kt | 0 .../statement/emptyTryWithTwoCatchesWithFinally.jav | 0 .../statement/emptyTryWithTwoCatchesWithFinally.kt | 0 .../emptyTryWithTwoCatchesWithoutFinally.jav | 0 .../emptyTryWithTwoCatchesWithoutFinally.kt | 0 .../expression/extendsWildcardCast.jav | 0 .../expression/extendsWildcardCast.kt | 0 .../ast/typeCastExpression/expression/fooCast.jav | 0 .../ast/typeCastExpression/expression/fooCast.kt | 0 .../ast/typeCastExpression/expression/intCast.jav | 0 .../ast/typeCastExpression/expression/intCast.kt | 0 .../typeCastExpression/expression/primitiveType.jav | 0 .../typeCastExpression/expression/primitiveType.kt | 0 .../expression/simpleGenericCast.jav | 0 .../expression/simpleGenericCast.kt | 0 .../typeCastExpression/expression/stringCast.jav | 0 .../ast/typeCastExpression/expression/stringCast.kt | 0 .../expression/superWildcardCast.jav | 0 .../expression/superWildcardCast.kt | 0 .../typeCastExpression/expression/wildcardCast.jav | 0 .../typeCastExpression/expression/wildcardCast.kt | 0 ...bleParametrizationWithTwoBoundsWithExtending.jav | 0 ...ubleParametrizationWithTwoBoundsWithExtending.kt | 0 .../class/classParametrizationWithTwoBounds.jav | 0 .../class/classParametrizationWithTwoBounds.kt | 0 ...assParametrizationWithTwoBoundsWithExtending.jav | 0 ...lassParametrizationWithTwoBoundsWithExtending.kt | 0 .../class/complexExampleWithClassExtending.jav | 0 .../class/complexExampleWithClassExtending.kt | 0 .../complexExampleWithClassMultiplyExtending.jav | 0 .../complexExampleWithClassMultiplyExtending.kt | 0 .../ast/typeParameters/class/genericClass.jav | 0 .../ast/typeParameters/class/genericClass.kt | 0 ...bleParametrizationWithTwoBoundsWithExtending.jav | 0 ...ubleParametrizationWithTwoBoundsWithExtending.kt | 0 .../methodDoubleParametrizationWithTwoBounds.jav | 0 .../methodDoubleParametrizationWithTwoBounds.kt | 0 .../testData}/ast/typeParameters/method/where.jav | 0 .../testData}/ast/typeParameters/method/where.kt | 0 .../ast/typeParameters/statement/genericParam.jav | 0 .../ast/typeParameters/statement/genericParam.kt | 0 .../typeParameters/statement/manyGenericParams.jav | 0 .../typeParameters/statement/manyGenericParams.kt | 0 .../ast/varArg/method/ellipsisTypeSeveralParams.jav | 0 .../ast/varArg/method/ellipsisTypeSeveralParams.kt | 0 .../ast/varArg/method/ellipsisTypeSingleParams.jav | 0 .../ast/varArg/method/ellipsisTypeSingleParams.kt | 0 .../ast/whileStatement/statement/whileWithBlock.jav | 0 .../ast/whileStatement/statement/whileWithBlock.kt | 0 .../statement/whileWithEmptyBlock.jav | 0 .../whileStatement/statement/whileWithEmptyBlock.kt | 0 .../statement/whileWithExpression.jav | 0 .../whileStatement/statement/whileWithExpression.kt | 0 .../whileStatement/statement/whileWithReturn.jav | 0 .../ast/whileStatement/statement/whileWithReturn.kt | 0 763 files changed, 0 insertions(+), 0 deletions(-) rename Makefile => j2k/Makefile (100%) rename j2k.iml => j2k/j2k.iml (100%) rename j2k.ipr => j2k/j2k.ipr (100%) rename {lib => j2k/lib}/commons-cli-1.2.jar (100%) rename {lib => j2k/lib}/commons-io-2.1.jar (100%) rename {src => j2k/src}/META-INF/MANIFEST.MF (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/Converter.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ConverterUtil.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/JavaToKotlinCli.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/JavaToKotlinTranslator.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/SetupJavaCoreEnvironmentException.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/AnonymousClass.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/ArrayAccessExpression.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/ArrayType.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/ArrayWithoutInitializationExpression.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/AssertStatement.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/AssignmentExpression.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/BinaryExpression.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/Block.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/BreakStatement.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/CallChainExpression.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/CaseContainer.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/CatchStatement.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/Class.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/ClassObjectAccessExpression.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/ClassType.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/Constructor.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/ContinueStatement.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/DeclarationStatement.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/DefaultSwitchLabelStatement.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/DoWhileStatement.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/DummyMethodCallExpression.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/DummyStringExpression.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/Element.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/Enum.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/EnumConstant.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/Expression.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/ExpressionList.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/ExpressionListStatement.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/Field.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/File.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/ForeachStatement.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/ForeachWithRangeStatement.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/Function.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/IMember.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/INode.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/Identifier.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/IdentifierImpl.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/IfStatement.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/Import.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/InProjectionType.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/Initializer.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/IsOperator.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/LabelStatement.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/LiteralExpression.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/LocalVariable.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/Member.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/MethodCallExpression.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/Modifier.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/NewClassExpression.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/Node.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/OutProjectionType.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/Parameter.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/ParameterList.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/ParenthesizedExpression.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/PolyadicExpression.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/PostfixOperator.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/PrefixOperator.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/PrimitiveType.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/ReferenceElement.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/ReturnStatement.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/StarProjectionType.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/Statement.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/SuperExpression.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/SureCallChainExpression.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/SwitchContainer.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/SwitchLabelStatement.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/SynchronizedStatement.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/ThisExpression.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/ThrowStatement.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/Trait.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/TryStatement.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/Type.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/TypeCastExpression.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/TypeElement.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/TypeParameter.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/VarArg.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/ast/WhileStatement.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/util/AstUtil.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/visitors/ClassVisitor.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/visitors/Dispatcher.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/visitors/ElementVisitor.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/visitors/ExpressionVisitorForDirectObjectInheritors.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/visitors/StatementVisitor.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/visitors/SuperVisitor.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/visitors/ThisVisitor.java (100%) rename {src => j2k/src}/org/jetbrains/jet/j2k/visitors/TypeVisitor.java (100%) rename {test => j2k/test}/org/jetbrains/jet/j2k/StandaloneJavaToKotlinConverterTest.java (100%) rename {test => j2k/test}/org/jetbrains/jet/j2k/TestCaseBuilder.java (100%) rename {testData => j2k/testData}/ast/annotations/file/jetbrainsNotNull.jav (100%) rename {testData => j2k/testData}/ast/annotations/file/jetbrainsNotNull.kt (100%) rename {testData => j2k/testData}/ast/anonymousBlock/file/oneAnonBlock.jav (100%) rename {testData => j2k/testData}/ast/anonymousBlock/file/oneAnonBlock.kt (100%) rename {testData => j2k/testData}/ast/anonymousBlock/file/oneStaticAnonBlock.jav (100%) rename {testData => j2k/testData}/ast/anonymousBlock/file/oneStaticAnonBlock.kt (100%) rename {testData => j2k/testData}/ast/arrayAccessExpression/expression/expressionIndex.jav (100%) rename {testData => j2k/testData}/ast/arrayAccessExpression/expression/expressionIndex.kt (100%) rename {testData => j2k/testData}/ast/arrayAccessExpression/expression/intIndex.jav (100%) rename {testData => j2k/testData}/ast/arrayAccessExpression/expression/intIndex.kt (100%) rename {testData => j2k/testData}/ast/arrayAccessExpression/expression/variableIndex.jav (100%) rename {testData => j2k/testData}/ast/arrayAccessExpression/expression/variableIndex.kt (100%) rename {testData => j2k/testData}/ast/arrayInitializerExpression/expression/newInt.jav (100%) rename {testData => j2k/testData}/ast/arrayInitializerExpression/expression/newInt.kt (100%) rename {testData => j2k/testData}/ast/arrayInitializerExpression/statement/doubleArray.jav (100%) rename {testData => j2k/testData}/ast/arrayInitializerExpression/statement/doubleArray.kt (100%) rename {testData => j2k/testData}/ast/arrayInitializerExpression/statement/doubleArrayWithVariables.jav (100%) rename {testData => j2k/testData}/ast/arrayInitializerExpression/statement/doubleArrayWithVariables.kt (100%) rename {testData => j2k/testData}/ast/arrayInitializerExpression/statement/floatArray.jav (100%) rename {testData => j2k/testData}/ast/arrayInitializerExpression/statement/floatArray.kt (100%) rename {testData => j2k/testData}/ast/arrayInitializerExpression/statement/javaLangDoubleArray.jav (100%) rename {testData => j2k/testData}/ast/arrayInitializerExpression/statement/javaLangDoubleArray.kt (100%) rename {testData => j2k/testData}/ast/arrayInitializerExpression/statement/javaLangFloatArray.jav (100%) rename {testData => j2k/testData}/ast/arrayInitializerExpression/statement/javaLangFloatArray.kt (100%) rename {testData => j2k/testData}/ast/arrayInitializerExpression/statement/newByte.jav (100%) rename {testData => j2k/testData}/ast/arrayInitializerExpression/statement/newByte.kt (100%) rename {testData => j2k/testData}/ast/arrayInitializerExpression/statement/oneDim.jav (100%) rename {testData => j2k/testData}/ast/arrayInitializerExpression/statement/oneDim.kt (100%) rename {testData => j2k/testData}/ast/arrayInitializerExpression/statement/oneDimWithVariables.jav (100%) rename {testData => j2k/testData}/ast/arrayInitializerExpression/statement/oneDimWithVariables.kt (100%) rename {testData => j2k/testData}/ast/arrayInitializerExpression/statement/twoDim.jav (100%) rename {testData => j2k/testData}/ast/arrayInitializerExpression/statement/twoDim.kt (100%) rename {testData => j2k/testData}/ast/arrayType/method/methodArrayArgs.jav (100%) rename {testData => j2k/testData}/ast/arrayType/method/methodArrayArgs.kt (100%) rename {testData => j2k/testData}/ast/arrayType/statement/arrayInitializationStatement.jav (100%) rename {testData => j2k/testData}/ast/arrayType/statement/arrayInitializationStatement.kt (100%) rename {testData => j2k/testData}/ast/arrayType/statement/arrayInitializationStatementWithDimension.jav (100%) rename {testData => j2k/testData}/ast/arrayType/statement/arrayInitializationStatementWithDimension.kt (100%) rename {testData => j2k/testData}/ast/arrayType/statement/arrayInitializationStatementWithDimension3d.jav (100%) rename {testData => j2k/testData}/ast/arrayType/statement/arrayInitializationStatementWithDimension3d.kt (100%) rename {testData => j2k/testData}/ast/arrayType/statement/arrayInitializationStatementWithDimensionExplicit.jav (100%) rename {testData => j2k/testData}/ast/arrayType/statement/arrayInitializationStatementWithDimensionExplicit.kt (100%) rename {testData => j2k/testData}/ast/arrayType/statement/d2StringEmptyArray.jav (100%) rename {testData => j2k/testData}/ast/arrayType/statement/d2StringEmptyArray.kt (100%) rename {testData => j2k/testData}/ast/arrayType/statement/d3StringEmptyArray.jav (100%) rename {testData => j2k/testData}/ast/arrayType/statement/d3StringEmptyArray.kt (100%) rename {testData => j2k/testData}/ast/arrayType/statement/longArray.jav (100%) rename {testData => j2k/testData}/ast/arrayType/statement/longArray.kt (100%) rename {testData => j2k/testData}/ast/arrayType/statement/newIntArray.jav (100%) rename {testData => j2k/testData}/ast/arrayType/statement/newIntArray.kt (100%) rename {testData => j2k/testData}/ast/arrayType/statement/newStringArray.jav (100%) rename {testData => j2k/testData}/ast/arrayType/statement/newStringArray.kt (100%) rename {testData => j2k/testData}/ast/assertStatement/statement/onlyCondition.jav (100%) rename {testData => j2k/testData}/ast/assertStatement/statement/onlyCondition.kt (100%) rename {testData => j2k/testData}/ast/assertStatement/statement/onlyConditionWithBraces.jav (100%) rename {testData => j2k/testData}/ast/assertStatement/statement/onlyConditionWithBraces.kt (100%) rename {testData => j2k/testData}/ast/assertStatement/statement/withStringDetail.jav (100%) rename {testData => j2k/testData}/ast/assertStatement/statement/withStringDetail.kt (100%) rename {testData => j2k/testData}/ast/assignmentExpression/expression/and.jav (100%) rename {testData => j2k/testData}/ast/assignmentExpression/expression/and.kt (100%) rename {testData => j2k/testData}/ast/assignmentExpression/expression/assignment.jav (100%) rename {testData => j2k/testData}/ast/assignmentExpression/expression/assignment.kt (100%) rename {testData => j2k/testData}/ast/assignmentExpression/expression/divideAssign.jav (100%) rename {testData => j2k/testData}/ast/assignmentExpression/expression/divideAssign.kt (100%) rename {testData => j2k/testData}/ast/assignmentExpression/expression/minusAssign.jav (100%) rename {testData => j2k/testData}/ast/assignmentExpression/expression/minusAssign.kt (100%) rename {testData => j2k/testData}/ast/assignmentExpression/expression/multiplyAssign.jav (100%) rename {testData => j2k/testData}/ast/assignmentExpression/expression/multiplyAssign.kt (100%) rename {testData => j2k/testData}/ast/assignmentExpression/expression/or.jav (100%) rename {testData => j2k/testData}/ast/assignmentExpression/expression/or.kt (100%) rename {testData => j2k/testData}/ast/assignmentExpression/expression/plusAssign.jav (100%) rename {testData => j2k/testData}/ast/assignmentExpression/expression/plusAssign.kt (100%) rename {testData => j2k/testData}/ast/assignmentExpression/expression/reminder.jav (100%) rename {testData => j2k/testData}/ast/assignmentExpression/expression/reminder.kt (100%) rename {testData => j2k/testData}/ast/assignmentExpression/expression/shiftLeft.jav (100%) rename {testData => j2k/testData}/ast/assignmentExpression/expression/shiftLeft.kt (100%) rename {testData => j2k/testData}/ast/assignmentExpression/expression/shiftRight.jav (100%) rename {testData => j2k/testData}/ast/assignmentExpression/expression/shiftRight.kt (100%) rename {testData => j2k/testData}/ast/assignmentExpression/expression/unsignedRightShift.jav (100%) rename {testData => j2k/testData}/ast/assignmentExpression/expression/unsignedRightShift.kt (100%) rename {testData => j2k/testData}/ast/assignmentExpression/expression/xor.jav (100%) rename {testData => j2k/testData}/ast/assignmentExpression/expression/xor.kt (100%) rename {testData => j2k/testData}/ast/assignmentExpression/statement/simpleAssignment.jav (100%) rename {testData => j2k/testData}/ast/assignmentExpression/statement/simpleAssignment.kt (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/and.jav (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/and.kt (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/conditionalAnd.jav (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/conditionalAnd.kt (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/conditionalOr.jav (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/conditionalOr.kt (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/divide.jav (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/divide.kt (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/greaterThan.jav (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/greaterThan.kt (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/greaterThanEqual.jav (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/greaterThanEqual.kt (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/lessThan.jav (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/lessThan.kt (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/lessThanEqual.jav (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/lessThanEqual.kt (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/minus.jav (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/minus.kt (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/multiply.jav (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/multiply.kt (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/or.jav (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/or.kt (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/plus.jav (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/plus.kt (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/remainder.jav (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/remainder.kt (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/shiftLeft.jav (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/shiftLeft.kt (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/shiftRight.jav (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/shiftRight.kt (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/unsignedRightShift.jav (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/unsignedRightShift.kt (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/xor.jav (100%) rename {testData => j2k/testData}/ast/binaryExpression/expression/xor.kt (100%) rename {testData => j2k/testData}/ast/boxedType/file/kt-671.jav (100%) rename {testData => j2k/testData}/ast/boxedType/file/kt-671.kt (100%) rename {testData => j2k/testData}/ast/boxedType/statement/boolean.jav (100%) rename {testData => j2k/testData}/ast/boxedType/statement/boolean.kt (100%) rename {testData => j2k/testData}/ast/boxedType/statement/byte.jav (100%) rename {testData => j2k/testData}/ast/boxedType/statement/byte.kt (100%) rename {testData => j2k/testData}/ast/boxedType/statement/character.jav (100%) rename {testData => j2k/testData}/ast/boxedType/statement/character.kt (100%) rename {testData => j2k/testData}/ast/boxedType/statement/double.jav (100%) rename {testData => j2k/testData}/ast/boxedType/statement/double.kt (100%) rename {testData => j2k/testData}/ast/boxedType/statement/float.jav (100%) rename {testData => j2k/testData}/ast/boxedType/statement/float.kt (100%) rename {testData => j2k/testData}/ast/boxedType/statement/integer.jav (100%) rename {testData => j2k/testData}/ast/boxedType/statement/integer.kt (100%) rename {testData => j2k/testData}/ast/boxedType/statement/long.jav (100%) rename {testData => j2k/testData}/ast/boxedType/statement/long.kt (100%) rename {testData => j2k/testData}/ast/boxedType/statement/object.jav (100%) rename {testData => j2k/testData}/ast/boxedType/statement/object.kt (100%) rename {testData => j2k/testData}/ast/boxedType/statement/short.jav (100%) rename {testData => j2k/testData}/ast/boxedType/statement/short.kt (100%) rename {testData => j2k/testData}/ast/breakStatement/statement/breakWithLabel.jav (100%) rename {testData => j2k/testData}/ast/breakStatement/statement/breakWithLabel.kt (100%) rename {testData => j2k/testData}/ast/breakStatement/statement/breakWithoutLabel.jav (100%) rename {testData => j2k/testData}/ast/breakStatement/statement/breakWithoutLabel.kt (100%) rename {testData => j2k/testData}/ast/callChainExpression/file/libraryFieldCall.jav (100%) rename {testData => j2k/testData}/ast/callChainExpression/file/libraryFieldCall.kt (100%) rename {testData => j2k/testData}/ast/callChainExpression/file/libraryMethodCall.jav (100%) rename {testData => j2k/testData}/ast/callChainExpression/file/libraryMethodCall.kt (100%) rename {testData => j2k/testData}/ast/callChainExpression/file/libraryMethodCallFromInstance.jav (100%) rename {testData => j2k/testData}/ast/callChainExpression/file/libraryMethodCallFromInstance.kt (100%) rename {testData => j2k/testData}/ast/callChainExpression/file/libraryStringFieldCall.jav (100%) rename {testData => j2k/testData}/ast/callChainExpression/file/libraryStringFieldCall.kt (100%) rename {testData => j2k/testData}/ast/callChainExpression/statement/sout.jav (100%) rename {testData => j2k/testData}/ast/callChainExpression/statement/sout.kt (100%) rename {testData => j2k/testData}/ast/class/class/abstractClass.jav (100%) rename {testData => j2k/testData}/ast/class/class/abstractClass.kt (100%) rename {testData => j2k/testData}/ast/class/class/abstractClassShape.jav (100%) rename {testData => j2k/testData}/ast/class/class/abstractClassShape.kt (100%) rename {testData => j2k/testData}/ast/class/class/class.jav (100%) rename {testData => j2k/testData}/ast/class/class/class.kt (100%) rename {testData => j2k/testData}/ast/class/class/classWithEmptyMethods.jav (100%) rename {testData => j2k/testData}/ast/class/class/classWithEmptyMethods.kt (100%) rename {testData => j2k/testData}/ast/class/class/classWithFields.jav (100%) rename {testData => j2k/testData}/ast/class/class/classWithFields.kt (100%) rename {testData => j2k/testData}/ast/class/class/classWithMultiplyFields.jav (100%) rename {testData => j2k/testData}/ast/class/class/classWithMultiplyFields.kt (100%) rename {testData => j2k/testData}/ast/class/class/emptyClass.jav (100%) rename {testData => j2k/testData}/ast/class/class/emptyClass.kt (100%) rename {testData => j2k/testData}/ast/class/class/extendsOneClassAndImplementsOneInterface.jav (100%) rename {testData => j2k/testData}/ast/class/class/extendsOneClassAndImplementsOneInterface.kt (100%) rename {testData => j2k/testData}/ast/class/class/extendsOneClassAndImplementsSeveralInterfaces.jav (100%) rename {testData => j2k/testData}/ast/class/class/extendsOneClassAndImplementsSeveralInterfaces.kt (100%) rename {testData => j2k/testData}/ast/class/class/finalClass.jav (100%) rename {testData => j2k/testData}/ast/class/class/finalClass.kt (100%) rename {testData => j2k/testData}/ast/class/class/genericClass.jav (100%) rename {testData => j2k/testData}/ast/class/class/genericClass.kt (100%) rename {testData => j2k/testData}/ast/class/class/innerEmptyClass.jav (100%) rename {testData => j2k/testData}/ast/class/class/innerEmptyClass.kt (100%) rename {testData => j2k/testData}/ast/class/class/innerStaticClass.jav (100%) rename {testData => j2k/testData}/ast/class/class/innerStaticClass.kt (100%) rename {testData => j2k/testData}/ast/class/class/internalClass.jav (100%) rename {testData => j2k/testData}/ast/class/class/internalClass.kt (100%) rename {testData => j2k/testData}/ast/class/class/oneStaticFieldOneNonStatic.jav (100%) rename {testData => j2k/testData}/ast/class/class/oneStaticFieldOneNonStatic.kt (100%) rename {testData => j2k/testData}/ast/class/class/oneStaticMethod.jav (100%) rename {testData => j2k/testData}/ast/class/class/oneStaticMethod.kt (100%) rename {testData => j2k/testData}/ast/class/class/oneStaticMethodOneNonStatic.jav (100%) rename {testData => j2k/testData}/ast/class/class/oneStaticMethodOneNonStatic.kt (100%) rename {testData => j2k/testData}/ast/class/class/pivateClass.jav (100%) rename {testData => j2k/testData}/ast/class/class/pivateClass.kt (100%) rename {testData => j2k/testData}/ast/class/class/protectedClass.jav (100%) rename {testData => j2k/testData}/ast/class/class/protectedClass.kt (100%) rename {testData => j2k/testData}/ast/class/class/publicClass.jav (100%) rename {testData => j2k/testData}/ast/class/class/publicClass.kt (100%) rename {testData => j2k/testData}/ast/class/class/simpleInheritance.jav (100%) rename {testData => j2k/testData}/ast/class/class/simpleInheritance.kt (100%) rename {testData => j2k/testData}/ast/class/class/twoStaticMethod.jav (100%) rename {testData => j2k/testData}/ast/class/class/twoStaticMethod.kt (100%) rename {testData => j2k/testData}/ast/class/file/kt-639.jav (100%) rename {testData => j2k/testData}/ast/class/file/kt-639.kt (100%) rename {testData => j2k/testData}/ast/class/file/privateInit.jav (100%) rename {testData => j2k/testData}/ast/class/file/privateInit.kt (100%) rename {testData => j2k/testData}/ast/classExpression/expression/objectClass.jav (100%) rename {testData => j2k/testData}/ast/classExpression/expression/objectClass.kt (100%) rename {testData => j2k/testData}/ast/classExpression/expression/stringClass.jav (100%) rename {testData => j2k/testData}/ast/classExpression/expression/stringClass.kt (100%) rename {testData => j2k/testData}/ast/classExpression/statement/complexExample.jav (100%) rename {testData => j2k/testData}/ast/classExpression/statement/complexExample.kt (100%) rename {testData => j2k/testData}/ast/conditionalExpression/expression/simpleConditionalExpression.jav (100%) rename {testData => j2k/testData}/ast/conditionalExpression/expression/simpleConditionalExpression.kt (100%) rename {testData => j2k/testData}/ast/constructors/file/allCallsPrimary.jav (100%) rename {testData => j2k/testData}/ast/constructors/file/allCallsPrimary.kt (100%) rename {testData => j2k/testData}/ast/constructors/file/allCallsPrimary2.jav (100%) rename {testData => j2k/testData}/ast/constructors/file/allCallsPrimary2.kt (100%) rename {testData => j2k/testData}/ast/constructors/file/customerBuilder.jav (100%) rename {testData => j2k/testData}/ast/constructors/file/customerBuilder.kt (100%) rename {testData => j2k/testData}/ast/constructors/file/genericIdentifier.jav (100%) rename {testData => j2k/testData}/ast/constructors/file/genericIdentifier.kt (100%) rename {testData => j2k/testData}/ast/constructors/file/identifier.jav (100%) rename {testData => j2k/testData}/ast/constructors/file/identifier.kt (100%) rename {testData => j2k/testData}/ast/constructors/file/withManyDefaultParams.jav (100%) rename {testData => j2k/testData}/ast/constructors/file/withManyDefaultParams.kt (100%) rename {testData => j2k/testData}/ast/continueStatement/statement/continueWithLabel.jav (100%) rename {testData => j2k/testData}/ast/continueStatement/statement/continueWithLabel.kt (100%) rename {testData => j2k/testData}/ast/continueStatement/statement/continueWithoutLabel.jav (100%) rename {testData => j2k/testData}/ast/continueStatement/statement/continueWithoutLabel.kt (100%) rename {testData => j2k/testData}/ast/declarationStatement/statement/multiplyFinalIntDeclaration.jav (100%) rename {testData => j2k/testData}/ast/declarationStatement/statement/multiplyFinalIntDeclaration.kt (100%) rename {testData => j2k/testData}/ast/declarationStatement/statement/multiplyIntDeclaration.jav (100%) rename {testData => j2k/testData}/ast/declarationStatement/statement/multiplyIntDeclaration.kt (100%) rename {testData => j2k/testData}/ast/declarationStatement/statement/singleFinalIntDeclaration.jav (100%) rename {testData => j2k/testData}/ast/declarationStatement/statement/singleFinalIntDeclaration.kt (100%) rename {testData => j2k/testData}/ast/declarationStatement/statement/singleFinalStringDeclaration.jav (100%) rename {testData => j2k/testData}/ast/declarationStatement/statement/singleFinalStringDeclaration.kt (100%) rename {testData => j2k/testData}/ast/declarationStatement/statement/singleIntDeclaration.jav (100%) rename {testData => j2k/testData}/ast/declarationStatement/statement/singleIntDeclaration.kt (100%) rename {testData => j2k/testData}/ast/declarationStatement/statement/singleStringDeclaration.jav (100%) rename {testData => j2k/testData}/ast/declarationStatement/statement/singleStringDeclaration.kt (100%) rename {testData => j2k/testData}/ast/doWhileStatement/statement/whileWithBlock.jav (100%) rename {testData => j2k/testData}/ast/doWhileStatement/statement/whileWithBlock.kt (100%) rename {testData => j2k/testData}/ast/doWhileStatement/statement/whileWithEmptyBlock.jav (100%) rename {testData => j2k/testData}/ast/doWhileStatement/statement/whileWithEmptyBlock.kt (100%) rename {testData => j2k/testData}/ast/doWhileStatement/statement/whileWithExpression.jav (100%) rename {testData => j2k/testData}/ast/doWhileStatement/statement/whileWithExpression.kt (100%) rename {testData => j2k/testData}/ast/doWhileStatement/statement/whileWithReturn.jav (100%) rename {testData => j2k/testData}/ast/doWhileStatement/statement/whileWithReturn.kt (100%) rename {testData => j2k/testData}/ast/enum/class/colorEnum.jav (100%) rename {testData => j2k/testData}/ast/enum/class/colorEnum.kt (100%) rename {testData => j2k/testData}/ast/enum/class/emptyEnum.jav (100%) rename {testData => j2k/testData}/ast/enum/class/emptyEnum.kt (100%) rename {testData => j2k/testData}/ast/enum/class/enumImplementsOneInterface.jav (100%) rename {testData => j2k/testData}/ast/enum/class/enumImplementsOneInterface.kt (100%) rename {testData => j2k/testData}/ast/enum/class/enumImplementsSeveralInterfaces.jav (100%) rename {testData => j2k/testData}/ast/enum/class/enumImplementsSeveralInterfaces.kt (100%) rename {testData => j2k/testData}/ast/enum/class/enumWithNameField.jav (100%) rename {testData => j2k/testData}/ast/enum/class/enumWithNameField.kt (100%) rename {testData => j2k/testData}/ast/enum/class/fieldsWithPrimaryPrivateConstructor.jav (100%) rename {testData => j2k/testData}/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt (100%) rename {testData => j2k/testData}/ast/enum/class/internalEnum.jav (100%) rename {testData => j2k/testData}/ast/enum/class/internalEnum.kt (100%) rename {testData => j2k/testData}/ast/enum/class/overrideToString.jav (100%) rename {testData => j2k/testData}/ast/enum/class/overrideToString.kt (100%) rename {testData => j2k/testData}/ast/enum/class/primaryPrivateConstructor.jav (100%) rename {testData => j2k/testData}/ast/enum/class/primaryPrivateConstructor.kt (100%) rename {testData => j2k/testData}/ast/enum/class/privateEnum.jav (100%) rename {testData => j2k/testData}/ast/enum/class/privateEnum.kt (100%) rename {testData => j2k/testData}/ast/enum/class/protectedEnum.jav (100%) rename {testData => j2k/testData}/ast/enum/class/protectedEnum.kt (100%) rename {testData => j2k/testData}/ast/enum/class/publicEnum.jav (100%) rename {testData => j2k/testData}/ast/enum/class/publicEnum.kt (100%) rename {testData => j2k/testData}/ast/enum/class/runnableImplementation.jav (100%) rename {testData => j2k/testData}/ast/enum/class/runnableImplementation.kt (100%) rename {testData => j2k/testData}/ast/enum/class/typeSafeEnum.jav (100%) rename {testData => j2k/testData}/ast/enum/class/typeSafeEnum.kt (100%) rename {testData => j2k/testData}/ast/field/file/classChildExtendsBase.jav (100%) rename {testData => j2k/testData}/ast/field/file/classChildExtendsBase.kt (100%) rename {testData => j2k/testData}/ast/field/file/internalField.jav (100%) rename {testData => j2k/testData}/ast/field/file/internalField.kt (100%) rename {testData => j2k/testData}/ast/field/file/privateField.jav (100%) rename {testData => j2k/testData}/ast/field/file/privateField.kt (100%) rename {testData => j2k/testData}/ast/field/file/protectedField.jav (100%) rename {testData => j2k/testData}/ast/field/file/protectedField.kt (100%) rename {testData => j2k/testData}/ast/field/file/publicField.jav (100%) rename {testData => j2k/testData}/ast/field/file/publicField.kt (100%) rename {testData => j2k/testData}/ast/field/file/valWithInit.jav (100%) rename {testData => j2k/testData}/ast/field/file/valWithInit.kt (100%) rename {testData => j2k/testData}/ast/field/file/varWithInit.jav (100%) rename {testData => j2k/testData}/ast/field/file/varWithInit.kt (100%) rename {testData => j2k/testData}/ast/field/file/varWithoutInit.jav (100%) rename {testData => j2k/testData}/ast/field/file/varWithoutInit.kt (100%) rename {testData => j2k/testData}/ast/file/comp/intNullability.jav (100%) rename {testData => j2k/testData}/ast/file/comp/intNullability.kt (100%) rename {testData => j2k/testData}/ast/file/file/packageWithClass.jav (100%) rename {testData => j2k/testData}/ast/file/file/packageWithClass.kt (100%) rename {testData => j2k/testData}/ast/file/file/packageWithClasses.jav (100%) rename {testData => j2k/testData}/ast/file/file/packageWithClasses.kt (100%) rename {testData => j2k/testData}/ast/file/file/packageWithImports.jav (100%) rename {testData => j2k/testData}/ast/file/file/packageWithImports.kt (100%) rename {testData => j2k/testData}/ast/file/file/packageWithMixedImports.jav (100%) rename {testData => j2k/testData}/ast/file/file/packageWithMixedImports.kt (100%) rename {testData => j2k/testData}/ast/file/file/packageWithOpenClass.jav (100%) rename {testData => j2k/testData}/ast/file/file/packageWithOpenClass.kt (100%) rename {testData => j2k/testData}/ast/file/file/packageWithStaticImports.jav (100%) rename {testData => j2k/testData}/ast/file/file/packageWithStaticImports.kt (100%) rename {testData => j2k/testData}/ast/for/statement/commonCaseForTest.jav (100%) rename {testData => j2k/testData}/ast/for/statement/commonCaseForTest.kt (100%) rename {testData => j2k/testData}/ast/for/statement/forRangeWithLE.jav (100%) rename {testData => j2k/testData}/ast/for/statement/forRangeWithLE.kt (100%) rename {testData => j2k/testData}/ast/for/statement/forRangeWithLT.jav (100%) rename {testData => j2k/testData}/ast/for/statement/forRangeWithLT.kt (100%) rename {testData => j2k/testData}/ast/for/statement/forWithBlock.jav (100%) rename {testData => j2k/testData}/ast/for/statement/forWithBlock.kt (100%) rename {testData => j2k/testData}/ast/for/statement/forWithBlockAndDoubleUpdate.jav (100%) rename {testData => j2k/testData}/ast/for/statement/forWithBlockAndDoubleUpdate.kt (100%) rename {testData => j2k/testData}/ast/for/statement/forWithEmptyBlock.jav (100%) rename {testData => j2k/testData}/ast/for/statement/forWithEmptyBlock.kt (100%) rename {testData => j2k/testData}/ast/for/statement/forWithExpression.jav (100%) rename {testData => j2k/testData}/ast/for/statement/forWithExpression.kt (100%) rename {testData => j2k/testData}/ast/for/statement/forWithReturn.jav (100%) rename {testData => j2k/testData}/ast/for/statement/forWithReturn.kt (100%) rename {testData => j2k/testData}/ast/foreachStatement/statement/enhancedForWithBlock.jav (100%) rename {testData => j2k/testData}/ast/foreachStatement/statement/enhancedForWithBlock.kt (100%) rename {testData => j2k/testData}/ast/foreachStatement/statement/enhancedForWithEmptyBlock.jav (100%) rename {testData => j2k/testData}/ast/foreachStatement/statement/enhancedForWithEmptyBlock.kt (100%) rename {testData => j2k/testData}/ast/foreachStatement/statement/enhancedForWithExpression.jav (100%) rename {testData => j2k/testData}/ast/foreachStatement/statement/enhancedForWithExpression.kt (100%) rename {testData => j2k/testData}/ast/foreachStatement/statement/enhancedForWithReturn.jav (100%) rename {testData => j2k/testData}/ast/foreachStatement/statement/enhancedForWithReturn.kt (100%) rename {testData => j2k/testData}/ast/function/file/extendsBaseWhichExtendsObject.jav (100%) rename {testData => j2k/testData}/ast/function/file/extendsBaseWhichExtendsObject.kt (100%) rename {testData => j2k/testData}/ast/function/file/functionInFinalClass.jav (100%) rename {testData => j2k/testData}/ast/function/file/functionInFinalClass.kt (100%) rename {testData => j2k/testData}/ast/function/file/override.jav (100%) rename {testData => j2k/testData}/ast/function/file/override.kt (100%) rename {testData => j2k/testData}/ast/function/file/overrideAndOpen.jav (100%) rename {testData => j2k/testData}/ast/function/file/overrideAndOpen.kt (100%) rename {testData => j2k/testData}/ast/function/file/overrideObject.jav (100%) rename {testData => j2k/testData}/ast/function/file/overrideObject.kt (100%) rename {testData => j2k/testData}/ast/function/file/varVararg.jav (100%) rename {testData => j2k/testData}/ast/function/file/varVararg.kt (100%) rename {testData => j2k/testData}/ast/function/file/writableParameter.jav (100%) rename {testData => j2k/testData}/ast/function/file/writableParameter.kt (100%) rename {testData => j2k/testData}/ast/function/method/abstractMethod.jav (100%) rename {testData => j2k/testData}/ast/function/method/abstractMethod.kt (100%) rename {testData => j2k/testData}/ast/function/method/classGenericParam.jav (100%) rename {testData => j2k/testData}/ast/function/method/classGenericParam.kt (100%) rename {testData => j2k/testData}/ast/function/method/emptyVoidMethod.jav (100%) rename {testData => j2k/testData}/ast/function/method/emptyVoidMethod.kt (100%) rename {testData => j2k/testData}/ast/function/method/final.jav (100%) rename {testData => j2k/testData}/ast/function/method/final.kt (100%) rename {testData => j2k/testData}/ast/function/method/internal.jav (100%) rename {testData => j2k/testData}/ast/function/method/internal.kt (100%) rename {testData => j2k/testData}/ast/function/method/main.jav (100%) rename {testData => j2k/testData}/ast/function/method/main.kt (100%) rename {testData => j2k/testData}/ast/function/method/methodClassType.jav (100%) rename {testData => j2k/testData}/ast/function/method/methodClassType.kt (100%) rename {testData => j2k/testData}/ast/function/method/methodPrimitiveType.jav (100%) rename {testData => j2k/testData}/ast/function/method/methodPrimitiveType.kt (100%) rename {testData => j2k/testData}/ast/function/method/methodPrimitiveType2.jav (100%) rename {testData => j2k/testData}/ast/function/method/methodPrimitiveType2.kt (100%) rename {testData => j2k/testData}/ast/function/method/methodWithReturnStatement.jav (100%) rename {testData => j2k/testData}/ast/function/method/methodWithReturnStatement.kt (100%) rename {testData => j2k/testData}/ast/function/method/open.jav (100%) rename {testData => j2k/testData}/ast/function/method/open.kt (100%) rename {testData => j2k/testData}/ast/function/method/ownGenericParam.jav (100%) rename {testData => j2k/testData}/ast/function/method/ownGenericParam.kt (100%) rename {testData => j2k/testData}/ast/function/method/ownSeveralGenericParams.jav (100%) rename {testData => j2k/testData}/ast/function/method/ownSeveralGenericParams.kt (100%) rename {testData => j2k/testData}/ast/function/method/private.jav (100%) rename {testData => j2k/testData}/ast/function/method/private.kt (100%) rename {testData => j2k/testData}/ast/function/method/protected.jav (100%) rename {testData => j2k/testData}/ast/function/method/protected.kt (100%) rename {testData => j2k/testData}/ast/function/method/public.jav (100%) rename {testData => j2k/testData}/ast/function/method/public.kt (100%) rename {testData => j2k/testData}/ast/identifier/expression/withDollar.jav (100%) rename {testData => j2k/testData}/ast/identifier/expression/withDollar.kt (100%) rename {testData => j2k/testData}/ast/identifier/file/finalFieldReference.jav (100%) rename {testData => j2k/testData}/ast/identifier/file/finalFieldReference.kt (100%) rename {testData => j2k/testData}/ast/identifier/statement/keywords.jav (100%) rename {testData => j2k/testData}/ast/identifier/statement/keywords.kt (100%) rename {testData => j2k/testData}/ast/ifStatement/statement/ifStatementWithEmptyBlocks.jav (100%) rename {testData => j2k/testData}/ast/ifStatement/statement/ifStatementWithEmptyBlocks.kt (100%) rename {testData => j2k/testData}/ast/ifStatement/statement/ifStatementWithMultilineBlocks.jav (100%) rename {testData => j2k/testData}/ast/ifStatement/statement/ifStatementWithMultilineBlocks.kt (100%) rename {testData => j2k/testData}/ast/ifStatement/statement/ifStatementWithOneLineBlocks.jav (100%) rename {testData => j2k/testData}/ast/ifStatement/statement/ifStatementWithOneLineBlocks.kt (100%) rename {testData => j2k/testData}/ast/ifStatement/statement/ifStatementWithoutElse.jav (100%) rename {testData => j2k/testData}/ast/ifStatement/statement/ifStatementWithoutElse.kt (100%) rename {testData => j2k/testData}/ast/importStatement/file/importWithKeywords.jav (100%) rename {testData => j2k/testData}/ast/importStatement/file/importWithKeywords.kt (100%) rename {testData => j2k/testData}/ast/importStatement/file/importWithStar.jav (100%) rename {testData => j2k/testData}/ast/importStatement/file/importWithStar.kt (100%) rename {testData => j2k/testData}/ast/importStatement/file/simpleImport.jav (100%) rename {testData => j2k/testData}/ast/importStatement/file/simpleImport.kt (100%) rename {testData => j2k/testData}/ast/inProjectionType/method/methodParams.jav (100%) rename {testData => j2k/testData}/ast/inProjectionType/method/methodParams.kt (100%) rename {testData => j2k/testData}/ast/inheritance/file/classOneExtendsBaseGeneric.jav (100%) rename {testData => j2k/testData}/ast/inheritance/file/classOneExtendsBaseGeneric.kt (100%) rename {testData => j2k/testData}/ast/inheritance/file/classOneExtendsBaseWithOneParam.jav (100%) rename {testData => j2k/testData}/ast/inheritance/file/classOneExtendsBaseWithOneParam.kt (100%) rename {testData => j2k/testData}/ast/inheritance/file/classOneExtendsBaseWithZeroParams.jav (100%) rename {testData => j2k/testData}/ast/inheritance/file/classOneExtendsBaseWithZeroParams.kt (100%) rename {testData => j2k/testData}/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.jav (100%) rename {testData => j2k/testData}/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.kt (100%) rename {testData => j2k/testData}/ast/isOperator/expression/complicatedExpression.jav (100%) rename {testData => j2k/testData}/ast/isOperator/expression/complicatedExpression.kt (100%) rename {testData => j2k/testData}/ast/isOperator/expression/simpleReference.jav (100%) rename {testData => j2k/testData}/ast/isOperator/expression/simpleReference.kt (100%) rename {testData => j2k/testData}/ast/issues/file/kt-1016.jav (100%) rename {testData => j2k/testData}/ast/issues/file/kt-1016.kt (100%) rename {testData => j2k/testData}/ast/issues/file/kt-1048.jav (100%) rename {testData => j2k/testData}/ast/issues/file/kt-1048.kt (100%) rename {testData => j2k/testData}/ast/issues/file/kt-1074.jav (100%) rename {testData => j2k/testData}/ast/issues/file/kt-1074.kt (100%) rename {testData => j2k/testData}/ast/issues/file/kt-543-boxed.jav (100%) rename {testData => j2k/testData}/ast/issues/file/kt-543-boxed.kt (100%) rename {testData => j2k/testData}/ast/issues/file/kt-543-mixed.jav (100%) rename {testData => j2k/testData}/ast/issues/file/kt-543-mixed.kt (100%) rename {testData => j2k/testData}/ast/issues/file/kt-543.jav (100%) rename {testData => j2k/testData}/ast/issues/file/kt-543.kt (100%) rename {testData => j2k/testData}/ast/issues/file/kt-638.jav (100%) rename {testData => j2k/testData}/ast/issues/file/kt-638.kt (100%) rename {testData => j2k/testData}/ast/issues/file/kt-696.jav (100%) rename {testData => j2k/testData}/ast/issues/file/kt-696.kt (100%) rename {testData => j2k/testData}/ast/issues/file/kt-792-mixed.jav (100%) rename {testData => j2k/testData}/ast/issues/file/kt-792-mixed.kt (100%) rename {testData => j2k/testData}/ast/issues/file/kt-792.jav (100%) rename {testData => j2k/testData}/ast/issues/file/kt-792.kt (100%) rename {testData => j2k/testData}/ast/issues/file/kt-794-mixed.jav (100%) rename {testData => j2k/testData}/ast/issues/file/kt-794-mixed.kt (100%) rename {testData => j2k/testData}/ast/issues/file/kt-794.jav (100%) rename {testData => j2k/testData}/ast/issues/file/kt-794.kt (100%) rename {testData => j2k/testData}/ast/issues/file/kt-809-string.jav (100%) rename {testData => j2k/testData}/ast/issues/file/kt-809-string.kt (100%) rename {testData => j2k/testData}/ast/issues/file/kt-809.jav (100%) rename {testData => j2k/testData}/ast/issues/file/kt-809.kt (100%) rename {testData => j2k/testData}/ast/issues/file/kt-820-field.jav (100%) rename {testData => j2k/testData}/ast/issues/file/kt-820-field.kt (100%) rename {testData => j2k/testData}/ast/issues/file/kt-820-string.jav (100%) rename {testData => j2k/testData}/ast/issues/file/kt-820-string.kt (100%) rename {testData => j2k/testData}/ast/issues/file/kt-820.jav (100%) rename {testData => j2k/testData}/ast/issues/file/kt-820.kt (100%) rename {testData => j2k/testData}/ast/issues/file/kt-824-isDir.jav (100%) rename {testData => j2k/testData}/ast/issues/file/kt-824-isDir.kt (100%) rename {testData => j2k/testData}/ast/issues/file/kt-824.jav (100%) rename {testData => j2k/testData}/ast/issues/file/kt-824.kt (100%) rename {testData => j2k/testData}/ast/issues/file/kt-828.jav (100%) rename {testData => j2k/testData}/ast/issues/file/kt-828.kt (100%) rename {testData => j2k/testData}/ast/issues/file/kt-836.jav (100%) rename {testData => j2k/testData}/ast/issues/file/kt-836.kt (100%) rename {testData => j2k/testData}/ast/issues/file/kt-837.jav (100%) rename {testData => j2k/testData}/ast/issues/file/kt-837.kt (100%) rename {testData => j2k/testData}/ast/issues/file/kt-852.jav (100%) rename {testData => j2k/testData}/ast/issues/file/kt-852.kt (100%) rename {testData => j2k/testData}/ast/issues/file/kt-871.jav (100%) rename {testData => j2k/testData}/ast/issues/file/kt-871.kt (100%) rename {testData => j2k/testData}/ast/issues/file/kt-879.jav (100%) rename {testData => j2k/testData}/ast/issues/file/kt-879.kt (100%) rename {testData => j2k/testData}/ast/issues/file/kt-893.jav (100%) rename {testData => j2k/testData}/ast/issues/file/kt-893.kt (100%) rename {testData => j2k/testData}/ast/issues/file/kt-963.jav (100%) rename {testData => j2k/testData}/ast/issues/file/kt-963.kt (100%) rename {testData => j2k/testData}/ast/kotlinExclusion/file/kt-656.jav (100%) rename {testData => j2k/testData}/ast/kotlinExclusion/file/kt-656.kt (100%) rename {testData => j2k/testData}/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.jav (100%) rename {testData => j2k/testData}/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.kt (100%) rename {testData => j2k/testData}/ast/literalExpression/file/char.jav (100%) rename {testData => j2k/testData}/ast/literalExpression/file/char.kt (100%) rename {testData => j2k/testData}/ast/literalExpression/file/dollarInsideString.jav (100%) rename {testData => j2k/testData}/ast/literalExpression/file/dollarInsideString.kt (100%) rename {testData => j2k/testData}/ast/literalExpression/file/endsWithDFL.jav (100%) rename {testData => j2k/testData}/ast/literalExpression/file/endsWithDFL.kt (100%) rename {testData => j2k/testData}/ast/literalExpression/file/hex.jav (100%) rename {testData => j2k/testData}/ast/literalExpression/file/hex.kt (100%) rename {testData => j2k/testData}/ast/literalExpression/file/octal.jav (100%) rename {testData => j2k/testData}/ast/literalExpression/file/octal.kt (100%) rename {testData => j2k/testData}/ast/literalExpression/file/trueOrFalse.jav (100%) rename {testData => j2k/testData}/ast/literalExpression/file/trueOrFalse.kt (100%) rename {testData => j2k/testData}/ast/localVariable/statement/object.jav (100%) rename {testData => j2k/testData}/ast/localVariable/statement/object.kt (100%) rename {testData => j2k/testData}/ast/methodCallExpression/file/genericMethod.jav (100%) rename {testData => j2k/testData}/ast/methodCallExpression/file/genericMethod.kt (100%) rename {testData => j2k/testData}/ast/methodCallExpression/statement/callWithKeywords.jav (100%) rename {testData => j2k/testData}/ast/methodCallExpression/statement/callWithKeywords.kt (100%) rename {testData => j2k/testData}/ast/methodCallExpression/statement/emptyCall.jav (100%) rename {testData => j2k/testData}/ast/methodCallExpression/statement/emptyCall.kt (100%) rename {testData => j2k/testData}/ast/methodCallExpression/statement/simpleCall.jav (100%) rename {testData => j2k/testData}/ast/methodCallExpression/statement/simpleCall.kt (100%) rename {testData => j2k/testData}/ast/newClassExpression/expression/classWithParam.jav (100%) rename {testData => j2k/testData}/ast/newClassExpression/expression/classWithParam.kt (100%) rename {testData => j2k/testData}/ast/newClassExpression/expression/classWithParams.jav (100%) rename {testData => j2k/testData}/ast/newClassExpression/expression/classWithParams.kt (100%) rename {testData => j2k/testData}/ast/newClassExpression/expression/classWithoutBody.jav (100%) rename {testData => j2k/testData}/ast/newClassExpression/expression/classWithoutBody.kt (100%) rename {testData => j2k/testData}/ast/newClassExpression/expression/newClassWithAnonymousScope.jav (100%) rename {testData => j2k/testData}/ast/newClassExpression/expression/newClassWithAnonymousScope.kt (100%) rename {testData => j2k/testData}/ast/newClassExpression/file/fullQualifiedName.jav (100%) rename {testData => j2k/testData}/ast/newClassExpression/file/fullQualifiedName.kt (100%) rename {testData => j2k/testData}/ast/newClassExpression/file/fullQualifiedName2.jav (100%) rename {testData => j2k/testData}/ast/newClassExpression/file/fullQualifiedName2.kt (100%) rename {testData => j2k/testData}/ast/newClassExpression/file/genericClassInvocation.jav (100%) rename {testData => j2k/testData}/ast/newClassExpression/file/genericClassInvocation.kt (100%) rename {testData => j2k/testData}/ast/newClassExpression/file/newClassByFullName.jav (100%) rename {testData => j2k/testData}/ast/newClassExpression/file/newClassByFullName.kt (100%) rename {testData => j2k/testData}/ast/newClassExpression/file/newInnerClass.jav (100%) rename {testData => j2k/testData}/ast/newClassExpression/file/newInnerClass.kt (100%) rename {testData => j2k/testData}/ast/newClassExpression/file/newListAndNewMember.jav (100%) rename {testData => j2k/testData}/ast/newClassExpression/file/newListAndNewMember.kt (100%) rename {testData => j2k/testData}/ast/newClassExpression/file/newStaticInnerClass.jav (100%) rename {testData => j2k/testData}/ast/newClassExpression/file/newStaticInnerClass.kt (100%) rename {testData => j2k/testData}/ast/objectLiteral/file/MyFrame.jav (100%) rename {testData => j2k/testData}/ast/objectLiteral/file/MyFrame.kt (100%) rename {testData => j2k/testData}/ast/outProjectionType/method/methodParams.jav (100%) rename {testData => j2k/testData}/ast/outProjectionType/method/methodParams.kt (100%) rename {testData => j2k/testData}/ast/packageStatement/file/orgJetbrainsJetJ2kIn.jav (100%) rename {testData => j2k/testData}/ast/packageStatement/file/orgJetbrainsJetJ2kIn.kt (100%) rename {testData => j2k/testData}/ast/parenthesizedExpression/expression/parenthesized.jav (100%) rename {testData => j2k/testData}/ast/parenthesizedExpression/expression/parenthesized.kt (100%) rename {testData => j2k/testData}/ast/parenthesizedExpression/expression/parenthesized2.jav (100%) rename {testData => j2k/testData}/ast/parenthesizedExpression/expression/parenthesized2.kt (100%) rename {testData => j2k/testData}/ast/polyadicExpression/expression/divide.jav (100%) rename {testData => j2k/testData}/ast/polyadicExpression/expression/divide.kt (100%) rename {testData => j2k/testData}/ast/polyadicExpression/expression/minus.jav (100%) rename {testData => j2k/testData}/ast/polyadicExpression/expression/minus.kt (100%) rename {testData => j2k/testData}/ast/polyadicExpression/expression/multiply.jav (100%) rename {testData => j2k/testData}/ast/polyadicExpression/expression/multiply.kt (100%) rename {testData => j2k/testData}/ast/polyadicExpression/expression/plus.jav (100%) rename {testData => j2k/testData}/ast/polyadicExpression/expression/plus.kt (100%) rename {testData => j2k/testData}/ast/polyadicExpression/expression/remainder.jav (100%) rename {testData => j2k/testData}/ast/polyadicExpression/expression/remainder.kt (100%) rename {testData => j2k/testData}/ast/polyadicExpression/expression/unassignedShiftRight.jav (100%) rename {testData => j2k/testData}/ast/polyadicExpression/expression/unassignedShiftRight.kt (100%) rename {testData => j2k/testData}/ast/postfixOperator/statement/decrement.jav (100%) rename {testData => j2k/testData}/ast/postfixOperator/statement/decrement.kt (100%) rename {testData => j2k/testData}/ast/postfixOperator/statement/increment.jav (100%) rename {testData => j2k/testData}/ast/postfixOperator/statement/increment.kt (100%) rename {testData => j2k/testData}/ast/prefixOperator/statement/decrement.jav (100%) rename {testData => j2k/testData}/ast/prefixOperator/statement/decrement.kt (100%) rename {testData => j2k/testData}/ast/prefixOperator/statement/excl.jav (100%) rename {testData => j2k/testData}/ast/prefixOperator/statement/excl.kt (100%) rename {testData => j2k/testData}/ast/prefixOperator/statement/increment.jav (100%) rename {testData => j2k/testData}/ast/prefixOperator/statement/increment.kt (100%) rename {testData => j2k/testData}/ast/prefixOperator/statement/kt-667.jav (100%) rename {testData => j2k/testData}/ast/prefixOperator/statement/kt-667.kt (100%) rename {testData => j2k/testData}/ast/prefixOperator/statement/tilde.jav (100%) rename {testData => j2k/testData}/ast/prefixOperator/statement/tilde.kt (100%) rename {testData => j2k/testData}/ast/rawGenerics/file/kt-540-map.jav (100%) rename {testData => j2k/testData}/ast/rawGenerics/file/kt-540-map.kt (100%) rename {testData => j2k/testData}/ast/rawGenerics/file/kt-540-rawGenericClass.jav (100%) rename {testData => j2k/testData}/ast/rawGenerics/file/kt-540-rawGenericClass.kt (100%) rename {testData => j2k/testData}/ast/rawGenerics/file/kt-540.jav (100%) rename {testData => j2k/testData}/ast/rawGenerics/file/kt-540.kt (100%) rename {testData => j2k/testData}/ast/rawGenerics/file/rawGenericMethod.jav (100%) rename {testData => j2k/testData}/ast/rawGenerics/file/rawGenericMethod.kt (100%) rename {testData => j2k/testData}/ast/returnStatement/statement/returnChar.jav (100%) rename {testData => j2k/testData}/ast/returnStatement/statement/returnChar.kt (100%) rename {testData => j2k/testData}/ast/returnStatement/statement/returnLiteral.jav (100%) rename {testData => j2k/testData}/ast/returnStatement/statement/returnLiteral.kt (100%) rename {testData => j2k/testData}/ast/returnStatement/statement/returnNumber.jav (100%) rename {testData => j2k/testData}/ast/returnStatement/statement/returnNumber.kt (100%) rename {testData => j2k/testData}/ast/returnStatement/statement/returnString.jav (100%) rename {testData => j2k/testData}/ast/returnStatement/statement/returnString.kt (100%) rename {testData => j2k/testData}/ast/starProjectionType/method/methodParams.jav (100%) rename {testData => j2k/testData}/ast/starProjectionType/method/methodParams.kt (100%) rename {testData => j2k/testData}/ast/superExpression/class/classAextendsB.jav (100%) rename {testData => j2k/testData}/ast/superExpression/class/classAextendsB.kt (100%) rename {testData => j2k/testData}/ast/superExpression/file/classAdotSuperFoo.jav (100%) rename {testData => j2k/testData}/ast/superExpression/file/classAdotSuperFoo.kt (100%) rename {testData => j2k/testData}/ast/superExpression/statement/superStatement.jav (100%) rename {testData => j2k/testData}/ast/superExpression/statement/superStatement.kt (100%) rename {testData => j2k/testData}/ast/switch/file/comlicatedFallDown.jav (100%) rename {testData => j2k/testData}/ast/switch/file/comlicatedFallDown.kt (100%) rename {testData => j2k/testData}/ast/switch/file/fallDown.jav (100%) rename {testData => j2k/testData}/ast/switch/file/fallDown.kt (100%) rename {testData => j2k/testData}/ast/switch/file/kt-539.jav (100%) rename {testData => j2k/testData}/ast/switch/file/kt-539.kt (100%) rename {testData => j2k/testData}/ast/synchronizedStatement/statement/singleLineExample.jav (100%) rename {testData => j2k/testData}/ast/synchronizedStatement/statement/singleLineExample.kt (100%) rename {testData => j2k/testData}/ast/thisExpression/file/classAdotThisFoo.jav (100%) rename {testData => j2k/testData}/ast/thisExpression/file/classAdotThisFoo.kt (100%) rename {testData => j2k/testData}/ast/thisExpression/statement/thisStatement.jav (100%) rename {testData => j2k/testData}/ast/thisExpression/statement/thisStatement.kt (100%) rename {testData => j2k/testData}/ast/throwStatement/statement/simpleThrowStatement.jav (100%) rename {testData => j2k/testData}/ast/throwStatement/statement/simpleThrowStatement.kt (100%) rename {testData => j2k/testData}/ast/trait/class/abstactInterface.jav (100%) rename {testData => j2k/testData}/ast/trait/class/abstactInterface.kt (100%) rename {testData => j2k/testData}/ast/trait/class/emptyInterface.jav (100%) rename {testData => j2k/testData}/ast/trait/class/emptyInterface.kt (100%) rename {testData => j2k/testData}/ast/trait/class/extendsOneClassAndImplementsSeveralInterfaces.jav (100%) rename {testData => j2k/testData}/ast/trait/class/extendsOneClassAndImplementsSeveralInterfaces.kt (100%) rename {testData => j2k/testData}/ast/trait/class/extendsOneInterface.jav (100%) rename {testData => j2k/testData}/ast/trait/class/extendsOneInterface.kt (100%) rename {testData => j2k/testData}/ast/trait/class/interfaceWithFields.jav (100%) rename {testData => j2k/testData}/ast/trait/class/interfaceWithFields.kt (100%) rename {testData => j2k/testData}/ast/trait/class/interfaceWithMethodDeclaration.jav (100%) rename {testData => j2k/testData}/ast/trait/class/interfaceWithMethodDeclaration.kt (100%) rename {testData => j2k/testData}/ast/trait/class/interfaceWithStaticFields.jav (100%) rename {testData => j2k/testData}/ast/trait/class/interfaceWithStaticFields.kt (100%) rename {testData => j2k/testData}/ast/trait/class/internalInterface.jav (100%) rename {testData => j2k/testData}/ast/trait/class/internalInterface.kt (100%) rename {testData => j2k/testData}/ast/trait/class/privateInterface.jav (100%) rename {testData => j2k/testData}/ast/trait/class/privateInterface.kt (100%) rename {testData => j2k/testData}/ast/trait/class/protectedInterface.jav (100%) rename {testData => j2k/testData}/ast/trait/class/protectedInterface.kt (100%) rename {testData => j2k/testData}/ast/trait/class/publicInterface.jav (100%) rename {testData => j2k/testData}/ast/trait/class/publicInterface.kt (100%) rename {testData => j2k/testData}/ast/tryStatement/statement/commonCaseForTryStatement.jav (100%) rename {testData => j2k/testData}/ast/tryStatement/statement/commonCaseForTryStatement.kt (100%) rename {testData => j2k/testData}/ast/tryStatement/statement/emptyTryWithTwoCatchesWithEmptyFinally.jav (100%) rename {testData => j2k/testData}/ast/tryStatement/statement/emptyTryWithTwoCatchesWithEmptyFinally.kt (100%) rename {testData => j2k/testData}/ast/tryStatement/statement/emptyTryWithTwoCatchesWithFinally.jav (100%) rename {testData => j2k/testData}/ast/tryStatement/statement/emptyTryWithTwoCatchesWithFinally.kt (100%) rename {testData => j2k/testData}/ast/tryStatement/statement/emptyTryWithTwoCatchesWithoutFinally.jav (100%) rename {testData => j2k/testData}/ast/tryStatement/statement/emptyTryWithTwoCatchesWithoutFinally.kt (100%) rename {testData => j2k/testData}/ast/typeCastExpression/expression/extendsWildcardCast.jav (100%) rename {testData => j2k/testData}/ast/typeCastExpression/expression/extendsWildcardCast.kt (100%) rename {testData => j2k/testData}/ast/typeCastExpression/expression/fooCast.jav (100%) rename {testData => j2k/testData}/ast/typeCastExpression/expression/fooCast.kt (100%) rename {testData => j2k/testData}/ast/typeCastExpression/expression/intCast.jav (100%) rename {testData => j2k/testData}/ast/typeCastExpression/expression/intCast.kt (100%) rename {testData => j2k/testData}/ast/typeCastExpression/expression/primitiveType.jav (100%) rename {testData => j2k/testData}/ast/typeCastExpression/expression/primitiveType.kt (100%) rename {testData => j2k/testData}/ast/typeCastExpression/expression/simpleGenericCast.jav (100%) rename {testData => j2k/testData}/ast/typeCastExpression/expression/simpleGenericCast.kt (100%) rename {testData => j2k/testData}/ast/typeCastExpression/expression/stringCast.jav (100%) rename {testData => j2k/testData}/ast/typeCastExpression/expression/stringCast.kt (100%) rename {testData => j2k/testData}/ast/typeCastExpression/expression/superWildcardCast.jav (100%) rename {testData => j2k/testData}/ast/typeCastExpression/expression/superWildcardCast.kt (100%) rename {testData => j2k/testData}/ast/typeCastExpression/expression/wildcardCast.jav (100%) rename {testData => j2k/testData}/ast/typeCastExpression/expression/wildcardCast.kt (100%) rename {testData => j2k/testData}/ast/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.jav (100%) rename {testData => j2k/testData}/ast/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.kt (100%) rename {testData => j2k/testData}/ast/typeParameters/class/classParametrizationWithTwoBounds.jav (100%) rename {testData => j2k/testData}/ast/typeParameters/class/classParametrizationWithTwoBounds.kt (100%) rename {testData => j2k/testData}/ast/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.jav (100%) rename {testData => j2k/testData}/ast/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.kt (100%) rename {testData => j2k/testData}/ast/typeParameters/class/complexExampleWithClassExtending.jav (100%) rename {testData => j2k/testData}/ast/typeParameters/class/complexExampleWithClassExtending.kt (100%) rename {testData => j2k/testData}/ast/typeParameters/class/complexExampleWithClassMultiplyExtending.jav (100%) rename {testData => j2k/testData}/ast/typeParameters/class/complexExampleWithClassMultiplyExtending.kt (100%) rename {testData => j2k/testData}/ast/typeParameters/class/genericClass.jav (100%) rename {testData => j2k/testData}/ast/typeParameters/class/genericClass.kt (100%) rename {testData => j2k/testData}/ast/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.jav (100%) rename {testData => j2k/testData}/ast/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.kt (100%) rename {testData => j2k/testData}/ast/typeParameters/method/methodDoubleParametrizationWithTwoBounds.jav (100%) rename {testData => j2k/testData}/ast/typeParameters/method/methodDoubleParametrizationWithTwoBounds.kt (100%) rename {testData => j2k/testData}/ast/typeParameters/method/where.jav (100%) rename {testData => j2k/testData}/ast/typeParameters/method/where.kt (100%) rename {testData => j2k/testData}/ast/typeParameters/statement/genericParam.jav (100%) rename {testData => j2k/testData}/ast/typeParameters/statement/genericParam.kt (100%) rename {testData => j2k/testData}/ast/typeParameters/statement/manyGenericParams.jav (100%) rename {testData => j2k/testData}/ast/typeParameters/statement/manyGenericParams.kt (100%) rename {testData => j2k/testData}/ast/varArg/method/ellipsisTypeSeveralParams.jav (100%) rename {testData => j2k/testData}/ast/varArg/method/ellipsisTypeSeveralParams.kt (100%) rename {testData => j2k/testData}/ast/varArg/method/ellipsisTypeSingleParams.jav (100%) rename {testData => j2k/testData}/ast/varArg/method/ellipsisTypeSingleParams.kt (100%) rename {testData => j2k/testData}/ast/whileStatement/statement/whileWithBlock.jav (100%) rename {testData => j2k/testData}/ast/whileStatement/statement/whileWithBlock.kt (100%) rename {testData => j2k/testData}/ast/whileStatement/statement/whileWithEmptyBlock.jav (100%) rename {testData => j2k/testData}/ast/whileStatement/statement/whileWithEmptyBlock.kt (100%) rename {testData => j2k/testData}/ast/whileStatement/statement/whileWithExpression.jav (100%) rename {testData => j2k/testData}/ast/whileStatement/statement/whileWithExpression.kt (100%) rename {testData => j2k/testData}/ast/whileStatement/statement/whileWithReturn.jav (100%) rename {testData => j2k/testData}/ast/whileStatement/statement/whileWithReturn.kt (100%) diff --git a/Makefile b/j2k/Makefile similarity index 100% rename from Makefile rename to j2k/Makefile diff --git a/j2k.iml b/j2k/j2k.iml similarity index 100% rename from j2k.iml rename to j2k/j2k.iml diff --git a/j2k.ipr b/j2k/j2k.ipr similarity index 100% rename from j2k.ipr rename to j2k/j2k.ipr diff --git a/lib/commons-cli-1.2.jar b/j2k/lib/commons-cli-1.2.jar similarity index 100% rename from lib/commons-cli-1.2.jar rename to j2k/lib/commons-cli-1.2.jar diff --git a/lib/commons-io-2.1.jar b/j2k/lib/commons-io-2.1.jar similarity index 100% rename from lib/commons-io-2.1.jar rename to j2k/lib/commons-io-2.1.jar diff --git a/src/META-INF/MANIFEST.MF b/j2k/src/META-INF/MANIFEST.MF similarity index 100% rename from src/META-INF/MANIFEST.MF rename to j2k/src/META-INF/MANIFEST.MF diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/j2k/src/org/jetbrains/jet/j2k/Converter.java similarity index 100% rename from src/org/jetbrains/jet/j2k/Converter.java rename to j2k/src/org/jetbrains/jet/j2k/Converter.java diff --git a/src/org/jetbrains/jet/j2k/ConverterUtil.java b/j2k/src/org/jetbrains/jet/j2k/ConverterUtil.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ConverterUtil.java rename to j2k/src/org/jetbrains/jet/j2k/ConverterUtil.java diff --git a/src/org/jetbrains/jet/j2k/JavaToKotlinCli.java b/j2k/src/org/jetbrains/jet/j2k/JavaToKotlinCli.java similarity index 100% rename from src/org/jetbrains/jet/j2k/JavaToKotlinCli.java rename to j2k/src/org/jetbrains/jet/j2k/JavaToKotlinCli.java diff --git a/src/org/jetbrains/jet/j2k/JavaToKotlinTranslator.java b/j2k/src/org/jetbrains/jet/j2k/JavaToKotlinTranslator.java similarity index 100% rename from src/org/jetbrains/jet/j2k/JavaToKotlinTranslator.java rename to j2k/src/org/jetbrains/jet/j2k/JavaToKotlinTranslator.java diff --git a/src/org/jetbrains/jet/j2k/SetupJavaCoreEnvironmentException.java b/j2k/src/org/jetbrains/jet/j2k/SetupJavaCoreEnvironmentException.java similarity index 100% rename from src/org/jetbrains/jet/j2k/SetupJavaCoreEnvironmentException.java rename to j2k/src/org/jetbrains/jet/j2k/SetupJavaCoreEnvironmentException.java diff --git a/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java b/j2k/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/AnonymousClass.java rename to j2k/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java diff --git a/src/org/jetbrains/jet/j2k/ast/ArrayAccessExpression.java b/j2k/src/org/jetbrains/jet/j2k/ast/ArrayAccessExpression.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/ArrayAccessExpression.java rename to j2k/src/org/jetbrains/jet/j2k/ast/ArrayAccessExpression.java diff --git a/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java b/j2k/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java rename to j2k/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java diff --git a/src/org/jetbrains/jet/j2k/ast/ArrayType.java b/j2k/src/org/jetbrains/jet/j2k/ast/ArrayType.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/ArrayType.java rename to j2k/src/org/jetbrains/jet/j2k/ast/ArrayType.java diff --git a/src/org/jetbrains/jet/j2k/ast/ArrayWithoutInitializationExpression.java b/j2k/src/org/jetbrains/jet/j2k/ast/ArrayWithoutInitializationExpression.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/ArrayWithoutInitializationExpression.java rename to j2k/src/org/jetbrains/jet/j2k/ast/ArrayWithoutInitializationExpression.java diff --git a/src/org/jetbrains/jet/j2k/ast/AssertStatement.java b/j2k/src/org/jetbrains/jet/j2k/ast/AssertStatement.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/AssertStatement.java rename to j2k/src/org/jetbrains/jet/j2k/ast/AssertStatement.java diff --git a/src/org/jetbrains/jet/j2k/ast/AssignmentExpression.java b/j2k/src/org/jetbrains/jet/j2k/ast/AssignmentExpression.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/AssignmentExpression.java rename to j2k/src/org/jetbrains/jet/j2k/ast/AssignmentExpression.java diff --git a/src/org/jetbrains/jet/j2k/ast/BinaryExpression.java b/j2k/src/org/jetbrains/jet/j2k/ast/BinaryExpression.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/BinaryExpression.java rename to j2k/src/org/jetbrains/jet/j2k/ast/BinaryExpression.java diff --git a/src/org/jetbrains/jet/j2k/ast/Block.java b/j2k/src/org/jetbrains/jet/j2k/ast/Block.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/Block.java rename to j2k/src/org/jetbrains/jet/j2k/ast/Block.java diff --git a/src/org/jetbrains/jet/j2k/ast/BreakStatement.java b/j2k/src/org/jetbrains/jet/j2k/ast/BreakStatement.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/BreakStatement.java rename to j2k/src/org/jetbrains/jet/j2k/ast/BreakStatement.java diff --git a/src/org/jetbrains/jet/j2k/ast/CallChainExpression.java b/j2k/src/org/jetbrains/jet/j2k/ast/CallChainExpression.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/CallChainExpression.java rename to j2k/src/org/jetbrains/jet/j2k/ast/CallChainExpression.java diff --git a/src/org/jetbrains/jet/j2k/ast/CaseContainer.java b/j2k/src/org/jetbrains/jet/j2k/ast/CaseContainer.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/CaseContainer.java rename to j2k/src/org/jetbrains/jet/j2k/ast/CaseContainer.java diff --git a/src/org/jetbrains/jet/j2k/ast/CatchStatement.java b/j2k/src/org/jetbrains/jet/j2k/ast/CatchStatement.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/CatchStatement.java rename to j2k/src/org/jetbrains/jet/j2k/ast/CatchStatement.java diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/j2k/src/org/jetbrains/jet/j2k/ast/Class.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/Class.java rename to j2k/src/org/jetbrains/jet/j2k/ast/Class.java diff --git a/src/org/jetbrains/jet/j2k/ast/ClassObjectAccessExpression.java b/j2k/src/org/jetbrains/jet/j2k/ast/ClassObjectAccessExpression.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/ClassObjectAccessExpression.java rename to j2k/src/org/jetbrains/jet/j2k/ast/ClassObjectAccessExpression.java diff --git a/src/org/jetbrains/jet/j2k/ast/ClassType.java b/j2k/src/org/jetbrains/jet/j2k/ast/ClassType.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/ClassType.java rename to j2k/src/org/jetbrains/jet/j2k/ast/ClassType.java diff --git a/src/org/jetbrains/jet/j2k/ast/Constructor.java b/j2k/src/org/jetbrains/jet/j2k/ast/Constructor.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/Constructor.java rename to j2k/src/org/jetbrains/jet/j2k/ast/Constructor.java diff --git a/src/org/jetbrains/jet/j2k/ast/ContinueStatement.java b/j2k/src/org/jetbrains/jet/j2k/ast/ContinueStatement.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/ContinueStatement.java rename to j2k/src/org/jetbrains/jet/j2k/ast/ContinueStatement.java diff --git a/src/org/jetbrains/jet/j2k/ast/DeclarationStatement.java b/j2k/src/org/jetbrains/jet/j2k/ast/DeclarationStatement.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/DeclarationStatement.java rename to j2k/src/org/jetbrains/jet/j2k/ast/DeclarationStatement.java diff --git a/src/org/jetbrains/jet/j2k/ast/DefaultSwitchLabelStatement.java b/j2k/src/org/jetbrains/jet/j2k/ast/DefaultSwitchLabelStatement.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/DefaultSwitchLabelStatement.java rename to j2k/src/org/jetbrains/jet/j2k/ast/DefaultSwitchLabelStatement.java diff --git a/src/org/jetbrains/jet/j2k/ast/DoWhileStatement.java b/j2k/src/org/jetbrains/jet/j2k/ast/DoWhileStatement.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/DoWhileStatement.java rename to j2k/src/org/jetbrains/jet/j2k/ast/DoWhileStatement.java diff --git a/src/org/jetbrains/jet/j2k/ast/DummyMethodCallExpression.java b/j2k/src/org/jetbrains/jet/j2k/ast/DummyMethodCallExpression.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/DummyMethodCallExpression.java rename to j2k/src/org/jetbrains/jet/j2k/ast/DummyMethodCallExpression.java diff --git a/src/org/jetbrains/jet/j2k/ast/DummyStringExpression.java b/j2k/src/org/jetbrains/jet/j2k/ast/DummyStringExpression.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/DummyStringExpression.java rename to j2k/src/org/jetbrains/jet/j2k/ast/DummyStringExpression.java diff --git a/src/org/jetbrains/jet/j2k/ast/Element.java b/j2k/src/org/jetbrains/jet/j2k/ast/Element.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/Element.java rename to j2k/src/org/jetbrains/jet/j2k/ast/Element.java diff --git a/src/org/jetbrains/jet/j2k/ast/Enum.java b/j2k/src/org/jetbrains/jet/j2k/ast/Enum.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/Enum.java rename to j2k/src/org/jetbrains/jet/j2k/ast/Enum.java diff --git a/src/org/jetbrains/jet/j2k/ast/EnumConstant.java b/j2k/src/org/jetbrains/jet/j2k/ast/EnumConstant.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/EnumConstant.java rename to j2k/src/org/jetbrains/jet/j2k/ast/EnumConstant.java diff --git a/src/org/jetbrains/jet/j2k/ast/Expression.java b/j2k/src/org/jetbrains/jet/j2k/ast/Expression.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/Expression.java rename to j2k/src/org/jetbrains/jet/j2k/ast/Expression.java diff --git a/src/org/jetbrains/jet/j2k/ast/ExpressionList.java b/j2k/src/org/jetbrains/jet/j2k/ast/ExpressionList.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/ExpressionList.java rename to j2k/src/org/jetbrains/jet/j2k/ast/ExpressionList.java diff --git a/src/org/jetbrains/jet/j2k/ast/ExpressionListStatement.java b/j2k/src/org/jetbrains/jet/j2k/ast/ExpressionListStatement.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/ExpressionListStatement.java rename to j2k/src/org/jetbrains/jet/j2k/ast/ExpressionListStatement.java diff --git a/src/org/jetbrains/jet/j2k/ast/Field.java b/j2k/src/org/jetbrains/jet/j2k/ast/Field.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/Field.java rename to j2k/src/org/jetbrains/jet/j2k/ast/Field.java diff --git a/src/org/jetbrains/jet/j2k/ast/File.java b/j2k/src/org/jetbrains/jet/j2k/ast/File.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/File.java rename to j2k/src/org/jetbrains/jet/j2k/ast/File.java diff --git a/src/org/jetbrains/jet/j2k/ast/ForeachStatement.java b/j2k/src/org/jetbrains/jet/j2k/ast/ForeachStatement.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/ForeachStatement.java rename to j2k/src/org/jetbrains/jet/j2k/ast/ForeachStatement.java diff --git a/src/org/jetbrains/jet/j2k/ast/ForeachWithRangeStatement.java b/j2k/src/org/jetbrains/jet/j2k/ast/ForeachWithRangeStatement.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/ForeachWithRangeStatement.java rename to j2k/src/org/jetbrains/jet/j2k/ast/ForeachWithRangeStatement.java diff --git a/src/org/jetbrains/jet/j2k/ast/Function.java b/j2k/src/org/jetbrains/jet/j2k/ast/Function.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/Function.java rename to j2k/src/org/jetbrains/jet/j2k/ast/Function.java diff --git a/src/org/jetbrains/jet/j2k/ast/IMember.java b/j2k/src/org/jetbrains/jet/j2k/ast/IMember.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/IMember.java rename to j2k/src/org/jetbrains/jet/j2k/ast/IMember.java diff --git a/src/org/jetbrains/jet/j2k/ast/INode.java b/j2k/src/org/jetbrains/jet/j2k/ast/INode.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/INode.java rename to j2k/src/org/jetbrains/jet/j2k/ast/INode.java diff --git a/src/org/jetbrains/jet/j2k/ast/Identifier.java b/j2k/src/org/jetbrains/jet/j2k/ast/Identifier.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/Identifier.java rename to j2k/src/org/jetbrains/jet/j2k/ast/Identifier.java diff --git a/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java b/j2k/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java rename to j2k/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java diff --git a/src/org/jetbrains/jet/j2k/ast/IfStatement.java b/j2k/src/org/jetbrains/jet/j2k/ast/IfStatement.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/IfStatement.java rename to j2k/src/org/jetbrains/jet/j2k/ast/IfStatement.java diff --git a/src/org/jetbrains/jet/j2k/ast/Import.java b/j2k/src/org/jetbrains/jet/j2k/ast/Import.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/Import.java rename to j2k/src/org/jetbrains/jet/j2k/ast/Import.java diff --git a/src/org/jetbrains/jet/j2k/ast/InProjectionType.java b/j2k/src/org/jetbrains/jet/j2k/ast/InProjectionType.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/InProjectionType.java rename to j2k/src/org/jetbrains/jet/j2k/ast/InProjectionType.java diff --git a/src/org/jetbrains/jet/j2k/ast/Initializer.java b/j2k/src/org/jetbrains/jet/j2k/ast/Initializer.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/Initializer.java rename to j2k/src/org/jetbrains/jet/j2k/ast/Initializer.java diff --git a/src/org/jetbrains/jet/j2k/ast/IsOperator.java b/j2k/src/org/jetbrains/jet/j2k/ast/IsOperator.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/IsOperator.java rename to j2k/src/org/jetbrains/jet/j2k/ast/IsOperator.java diff --git a/src/org/jetbrains/jet/j2k/ast/LabelStatement.java b/j2k/src/org/jetbrains/jet/j2k/ast/LabelStatement.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/LabelStatement.java rename to j2k/src/org/jetbrains/jet/j2k/ast/LabelStatement.java diff --git a/src/org/jetbrains/jet/j2k/ast/LiteralExpression.java b/j2k/src/org/jetbrains/jet/j2k/ast/LiteralExpression.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/LiteralExpression.java rename to j2k/src/org/jetbrains/jet/j2k/ast/LiteralExpression.java diff --git a/src/org/jetbrains/jet/j2k/ast/LocalVariable.java b/j2k/src/org/jetbrains/jet/j2k/ast/LocalVariable.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/LocalVariable.java rename to j2k/src/org/jetbrains/jet/j2k/ast/LocalVariable.java diff --git a/src/org/jetbrains/jet/j2k/ast/Member.java b/j2k/src/org/jetbrains/jet/j2k/ast/Member.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/Member.java rename to j2k/src/org/jetbrains/jet/j2k/ast/Member.java diff --git a/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java b/j2k/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java rename to j2k/src/org/jetbrains/jet/j2k/ast/MethodCallExpression.java diff --git a/src/org/jetbrains/jet/j2k/ast/Modifier.java b/j2k/src/org/jetbrains/jet/j2k/ast/Modifier.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/Modifier.java rename to j2k/src/org/jetbrains/jet/j2k/ast/Modifier.java diff --git a/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java b/j2k/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/NewClassExpression.java rename to j2k/src/org/jetbrains/jet/j2k/ast/NewClassExpression.java diff --git a/src/org/jetbrains/jet/j2k/ast/Node.java b/j2k/src/org/jetbrains/jet/j2k/ast/Node.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/Node.java rename to j2k/src/org/jetbrains/jet/j2k/ast/Node.java diff --git a/src/org/jetbrains/jet/j2k/ast/OutProjectionType.java b/j2k/src/org/jetbrains/jet/j2k/ast/OutProjectionType.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/OutProjectionType.java rename to j2k/src/org/jetbrains/jet/j2k/ast/OutProjectionType.java diff --git a/src/org/jetbrains/jet/j2k/ast/Parameter.java b/j2k/src/org/jetbrains/jet/j2k/ast/Parameter.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/Parameter.java rename to j2k/src/org/jetbrains/jet/j2k/ast/Parameter.java diff --git a/src/org/jetbrains/jet/j2k/ast/ParameterList.java b/j2k/src/org/jetbrains/jet/j2k/ast/ParameterList.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/ParameterList.java rename to j2k/src/org/jetbrains/jet/j2k/ast/ParameterList.java diff --git a/src/org/jetbrains/jet/j2k/ast/ParenthesizedExpression.java b/j2k/src/org/jetbrains/jet/j2k/ast/ParenthesizedExpression.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/ParenthesizedExpression.java rename to j2k/src/org/jetbrains/jet/j2k/ast/ParenthesizedExpression.java diff --git a/src/org/jetbrains/jet/j2k/ast/PolyadicExpression.java b/j2k/src/org/jetbrains/jet/j2k/ast/PolyadicExpression.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/PolyadicExpression.java rename to j2k/src/org/jetbrains/jet/j2k/ast/PolyadicExpression.java diff --git a/src/org/jetbrains/jet/j2k/ast/PostfixOperator.java b/j2k/src/org/jetbrains/jet/j2k/ast/PostfixOperator.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/PostfixOperator.java rename to j2k/src/org/jetbrains/jet/j2k/ast/PostfixOperator.java diff --git a/src/org/jetbrains/jet/j2k/ast/PrefixOperator.java b/j2k/src/org/jetbrains/jet/j2k/ast/PrefixOperator.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/PrefixOperator.java rename to j2k/src/org/jetbrains/jet/j2k/ast/PrefixOperator.java diff --git a/src/org/jetbrains/jet/j2k/ast/PrimitiveType.java b/j2k/src/org/jetbrains/jet/j2k/ast/PrimitiveType.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/PrimitiveType.java rename to j2k/src/org/jetbrains/jet/j2k/ast/PrimitiveType.java diff --git a/src/org/jetbrains/jet/j2k/ast/ReferenceElement.java b/j2k/src/org/jetbrains/jet/j2k/ast/ReferenceElement.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/ReferenceElement.java rename to j2k/src/org/jetbrains/jet/j2k/ast/ReferenceElement.java diff --git a/src/org/jetbrains/jet/j2k/ast/ReturnStatement.java b/j2k/src/org/jetbrains/jet/j2k/ast/ReturnStatement.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/ReturnStatement.java rename to j2k/src/org/jetbrains/jet/j2k/ast/ReturnStatement.java diff --git a/src/org/jetbrains/jet/j2k/ast/StarProjectionType.java b/j2k/src/org/jetbrains/jet/j2k/ast/StarProjectionType.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/StarProjectionType.java rename to j2k/src/org/jetbrains/jet/j2k/ast/StarProjectionType.java diff --git a/src/org/jetbrains/jet/j2k/ast/Statement.java b/j2k/src/org/jetbrains/jet/j2k/ast/Statement.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/Statement.java rename to j2k/src/org/jetbrains/jet/j2k/ast/Statement.java diff --git a/src/org/jetbrains/jet/j2k/ast/SuperExpression.java b/j2k/src/org/jetbrains/jet/j2k/ast/SuperExpression.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/SuperExpression.java rename to j2k/src/org/jetbrains/jet/j2k/ast/SuperExpression.java diff --git a/src/org/jetbrains/jet/j2k/ast/SureCallChainExpression.java b/j2k/src/org/jetbrains/jet/j2k/ast/SureCallChainExpression.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/SureCallChainExpression.java rename to j2k/src/org/jetbrains/jet/j2k/ast/SureCallChainExpression.java diff --git a/src/org/jetbrains/jet/j2k/ast/SwitchContainer.java b/j2k/src/org/jetbrains/jet/j2k/ast/SwitchContainer.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/SwitchContainer.java rename to j2k/src/org/jetbrains/jet/j2k/ast/SwitchContainer.java diff --git a/src/org/jetbrains/jet/j2k/ast/SwitchLabelStatement.java b/j2k/src/org/jetbrains/jet/j2k/ast/SwitchLabelStatement.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/SwitchLabelStatement.java rename to j2k/src/org/jetbrains/jet/j2k/ast/SwitchLabelStatement.java diff --git a/src/org/jetbrains/jet/j2k/ast/SynchronizedStatement.java b/j2k/src/org/jetbrains/jet/j2k/ast/SynchronizedStatement.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/SynchronizedStatement.java rename to j2k/src/org/jetbrains/jet/j2k/ast/SynchronizedStatement.java diff --git a/src/org/jetbrains/jet/j2k/ast/ThisExpression.java b/j2k/src/org/jetbrains/jet/j2k/ast/ThisExpression.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/ThisExpression.java rename to j2k/src/org/jetbrains/jet/j2k/ast/ThisExpression.java diff --git a/src/org/jetbrains/jet/j2k/ast/ThrowStatement.java b/j2k/src/org/jetbrains/jet/j2k/ast/ThrowStatement.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/ThrowStatement.java rename to j2k/src/org/jetbrains/jet/j2k/ast/ThrowStatement.java diff --git a/src/org/jetbrains/jet/j2k/ast/Trait.java b/j2k/src/org/jetbrains/jet/j2k/ast/Trait.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/Trait.java rename to j2k/src/org/jetbrains/jet/j2k/ast/Trait.java diff --git a/src/org/jetbrains/jet/j2k/ast/TryStatement.java b/j2k/src/org/jetbrains/jet/j2k/ast/TryStatement.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/TryStatement.java rename to j2k/src/org/jetbrains/jet/j2k/ast/TryStatement.java diff --git a/src/org/jetbrains/jet/j2k/ast/Type.java b/j2k/src/org/jetbrains/jet/j2k/ast/Type.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/Type.java rename to j2k/src/org/jetbrains/jet/j2k/ast/Type.java diff --git a/src/org/jetbrains/jet/j2k/ast/TypeCastExpression.java b/j2k/src/org/jetbrains/jet/j2k/ast/TypeCastExpression.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/TypeCastExpression.java rename to j2k/src/org/jetbrains/jet/j2k/ast/TypeCastExpression.java diff --git a/src/org/jetbrains/jet/j2k/ast/TypeElement.java b/j2k/src/org/jetbrains/jet/j2k/ast/TypeElement.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/TypeElement.java rename to j2k/src/org/jetbrains/jet/j2k/ast/TypeElement.java diff --git a/src/org/jetbrains/jet/j2k/ast/TypeParameter.java b/j2k/src/org/jetbrains/jet/j2k/ast/TypeParameter.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/TypeParameter.java rename to j2k/src/org/jetbrains/jet/j2k/ast/TypeParameter.java diff --git a/src/org/jetbrains/jet/j2k/ast/VarArg.java b/j2k/src/org/jetbrains/jet/j2k/ast/VarArg.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/VarArg.java rename to j2k/src/org/jetbrains/jet/j2k/ast/VarArg.java diff --git a/src/org/jetbrains/jet/j2k/ast/WhileStatement.java b/j2k/src/org/jetbrains/jet/j2k/ast/WhileStatement.java similarity index 100% rename from src/org/jetbrains/jet/j2k/ast/WhileStatement.java rename to j2k/src/org/jetbrains/jet/j2k/ast/WhileStatement.java diff --git a/src/org/jetbrains/jet/j2k/util/AstUtil.java b/j2k/src/org/jetbrains/jet/j2k/util/AstUtil.java similarity index 100% rename from src/org/jetbrains/jet/j2k/util/AstUtil.java rename to j2k/src/org/jetbrains/jet/j2k/util/AstUtil.java diff --git a/src/org/jetbrains/jet/j2k/visitors/ClassVisitor.java b/j2k/src/org/jetbrains/jet/j2k/visitors/ClassVisitor.java similarity index 100% rename from src/org/jetbrains/jet/j2k/visitors/ClassVisitor.java rename to j2k/src/org/jetbrains/jet/j2k/visitors/ClassVisitor.java diff --git a/src/org/jetbrains/jet/j2k/visitors/Dispatcher.java b/j2k/src/org/jetbrains/jet/j2k/visitors/Dispatcher.java similarity index 100% rename from src/org/jetbrains/jet/j2k/visitors/Dispatcher.java rename to j2k/src/org/jetbrains/jet/j2k/visitors/Dispatcher.java diff --git a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java b/j2k/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java similarity index 100% rename from src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java rename to j2k/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java similarity index 100% rename from src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java rename to j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitorForDirectObjectInheritors.java b/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitorForDirectObjectInheritors.java similarity index 100% rename from src/org/jetbrains/jet/j2k/visitors/ExpressionVisitorForDirectObjectInheritors.java rename to j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitorForDirectObjectInheritors.java diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/j2k/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java similarity index 100% rename from src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java rename to j2k/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java diff --git a/src/org/jetbrains/jet/j2k/visitors/SuperVisitor.java b/j2k/src/org/jetbrains/jet/j2k/visitors/SuperVisitor.java similarity index 100% rename from src/org/jetbrains/jet/j2k/visitors/SuperVisitor.java rename to j2k/src/org/jetbrains/jet/j2k/visitors/SuperVisitor.java diff --git a/src/org/jetbrains/jet/j2k/visitors/ThisVisitor.java b/j2k/src/org/jetbrains/jet/j2k/visitors/ThisVisitor.java similarity index 100% rename from src/org/jetbrains/jet/j2k/visitors/ThisVisitor.java rename to j2k/src/org/jetbrains/jet/j2k/visitors/ThisVisitor.java diff --git a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java b/j2k/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java similarity index 100% rename from src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java rename to j2k/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java diff --git a/test/org/jetbrains/jet/j2k/StandaloneJavaToKotlinConverterTest.java b/j2k/test/org/jetbrains/jet/j2k/StandaloneJavaToKotlinConverterTest.java similarity index 100% rename from test/org/jetbrains/jet/j2k/StandaloneJavaToKotlinConverterTest.java rename to j2k/test/org/jetbrains/jet/j2k/StandaloneJavaToKotlinConverterTest.java diff --git a/test/org/jetbrains/jet/j2k/TestCaseBuilder.java b/j2k/test/org/jetbrains/jet/j2k/TestCaseBuilder.java similarity index 100% rename from test/org/jetbrains/jet/j2k/TestCaseBuilder.java rename to j2k/test/org/jetbrains/jet/j2k/TestCaseBuilder.java diff --git a/testData/ast/annotations/file/jetbrainsNotNull.jav b/j2k/testData/ast/annotations/file/jetbrainsNotNull.jav similarity index 100% rename from testData/ast/annotations/file/jetbrainsNotNull.jav rename to j2k/testData/ast/annotations/file/jetbrainsNotNull.jav diff --git a/testData/ast/annotations/file/jetbrainsNotNull.kt b/j2k/testData/ast/annotations/file/jetbrainsNotNull.kt similarity index 100% rename from testData/ast/annotations/file/jetbrainsNotNull.kt rename to j2k/testData/ast/annotations/file/jetbrainsNotNull.kt diff --git a/testData/ast/anonymousBlock/file/oneAnonBlock.jav b/j2k/testData/ast/anonymousBlock/file/oneAnonBlock.jav similarity index 100% rename from testData/ast/anonymousBlock/file/oneAnonBlock.jav rename to j2k/testData/ast/anonymousBlock/file/oneAnonBlock.jav diff --git a/testData/ast/anonymousBlock/file/oneAnonBlock.kt b/j2k/testData/ast/anonymousBlock/file/oneAnonBlock.kt similarity index 100% rename from testData/ast/anonymousBlock/file/oneAnonBlock.kt rename to j2k/testData/ast/anonymousBlock/file/oneAnonBlock.kt diff --git a/testData/ast/anonymousBlock/file/oneStaticAnonBlock.jav b/j2k/testData/ast/anonymousBlock/file/oneStaticAnonBlock.jav similarity index 100% rename from testData/ast/anonymousBlock/file/oneStaticAnonBlock.jav rename to j2k/testData/ast/anonymousBlock/file/oneStaticAnonBlock.jav diff --git a/testData/ast/anonymousBlock/file/oneStaticAnonBlock.kt b/j2k/testData/ast/anonymousBlock/file/oneStaticAnonBlock.kt similarity index 100% rename from testData/ast/anonymousBlock/file/oneStaticAnonBlock.kt rename to j2k/testData/ast/anonymousBlock/file/oneStaticAnonBlock.kt diff --git a/testData/ast/arrayAccessExpression/expression/expressionIndex.jav b/j2k/testData/ast/arrayAccessExpression/expression/expressionIndex.jav similarity index 100% rename from testData/ast/arrayAccessExpression/expression/expressionIndex.jav rename to j2k/testData/ast/arrayAccessExpression/expression/expressionIndex.jav diff --git a/testData/ast/arrayAccessExpression/expression/expressionIndex.kt b/j2k/testData/ast/arrayAccessExpression/expression/expressionIndex.kt similarity index 100% rename from testData/ast/arrayAccessExpression/expression/expressionIndex.kt rename to j2k/testData/ast/arrayAccessExpression/expression/expressionIndex.kt diff --git a/testData/ast/arrayAccessExpression/expression/intIndex.jav b/j2k/testData/ast/arrayAccessExpression/expression/intIndex.jav similarity index 100% rename from testData/ast/arrayAccessExpression/expression/intIndex.jav rename to j2k/testData/ast/arrayAccessExpression/expression/intIndex.jav diff --git a/testData/ast/arrayAccessExpression/expression/intIndex.kt b/j2k/testData/ast/arrayAccessExpression/expression/intIndex.kt similarity index 100% rename from testData/ast/arrayAccessExpression/expression/intIndex.kt rename to j2k/testData/ast/arrayAccessExpression/expression/intIndex.kt diff --git a/testData/ast/arrayAccessExpression/expression/variableIndex.jav b/j2k/testData/ast/arrayAccessExpression/expression/variableIndex.jav similarity index 100% rename from testData/ast/arrayAccessExpression/expression/variableIndex.jav rename to j2k/testData/ast/arrayAccessExpression/expression/variableIndex.jav diff --git a/testData/ast/arrayAccessExpression/expression/variableIndex.kt b/j2k/testData/ast/arrayAccessExpression/expression/variableIndex.kt similarity index 100% rename from testData/ast/arrayAccessExpression/expression/variableIndex.kt rename to j2k/testData/ast/arrayAccessExpression/expression/variableIndex.kt diff --git a/testData/ast/arrayInitializerExpression/expression/newInt.jav b/j2k/testData/ast/arrayInitializerExpression/expression/newInt.jav similarity index 100% rename from testData/ast/arrayInitializerExpression/expression/newInt.jav rename to j2k/testData/ast/arrayInitializerExpression/expression/newInt.jav diff --git a/testData/ast/arrayInitializerExpression/expression/newInt.kt b/j2k/testData/ast/arrayInitializerExpression/expression/newInt.kt similarity index 100% rename from testData/ast/arrayInitializerExpression/expression/newInt.kt rename to j2k/testData/ast/arrayInitializerExpression/expression/newInt.kt diff --git a/testData/ast/arrayInitializerExpression/statement/doubleArray.jav b/j2k/testData/ast/arrayInitializerExpression/statement/doubleArray.jav similarity index 100% rename from testData/ast/arrayInitializerExpression/statement/doubleArray.jav rename to j2k/testData/ast/arrayInitializerExpression/statement/doubleArray.jav diff --git a/testData/ast/arrayInitializerExpression/statement/doubleArray.kt b/j2k/testData/ast/arrayInitializerExpression/statement/doubleArray.kt similarity index 100% rename from testData/ast/arrayInitializerExpression/statement/doubleArray.kt rename to j2k/testData/ast/arrayInitializerExpression/statement/doubleArray.kt diff --git a/testData/ast/arrayInitializerExpression/statement/doubleArrayWithVariables.jav b/j2k/testData/ast/arrayInitializerExpression/statement/doubleArrayWithVariables.jav similarity index 100% rename from testData/ast/arrayInitializerExpression/statement/doubleArrayWithVariables.jav rename to j2k/testData/ast/arrayInitializerExpression/statement/doubleArrayWithVariables.jav diff --git a/testData/ast/arrayInitializerExpression/statement/doubleArrayWithVariables.kt b/j2k/testData/ast/arrayInitializerExpression/statement/doubleArrayWithVariables.kt similarity index 100% rename from testData/ast/arrayInitializerExpression/statement/doubleArrayWithVariables.kt rename to j2k/testData/ast/arrayInitializerExpression/statement/doubleArrayWithVariables.kt diff --git a/testData/ast/arrayInitializerExpression/statement/floatArray.jav b/j2k/testData/ast/arrayInitializerExpression/statement/floatArray.jav similarity index 100% rename from testData/ast/arrayInitializerExpression/statement/floatArray.jav rename to j2k/testData/ast/arrayInitializerExpression/statement/floatArray.jav diff --git a/testData/ast/arrayInitializerExpression/statement/floatArray.kt b/j2k/testData/ast/arrayInitializerExpression/statement/floatArray.kt similarity index 100% rename from testData/ast/arrayInitializerExpression/statement/floatArray.kt rename to j2k/testData/ast/arrayInitializerExpression/statement/floatArray.kt diff --git a/testData/ast/arrayInitializerExpression/statement/javaLangDoubleArray.jav b/j2k/testData/ast/arrayInitializerExpression/statement/javaLangDoubleArray.jav similarity index 100% rename from testData/ast/arrayInitializerExpression/statement/javaLangDoubleArray.jav rename to j2k/testData/ast/arrayInitializerExpression/statement/javaLangDoubleArray.jav diff --git a/testData/ast/arrayInitializerExpression/statement/javaLangDoubleArray.kt b/j2k/testData/ast/arrayInitializerExpression/statement/javaLangDoubleArray.kt similarity index 100% rename from testData/ast/arrayInitializerExpression/statement/javaLangDoubleArray.kt rename to j2k/testData/ast/arrayInitializerExpression/statement/javaLangDoubleArray.kt diff --git a/testData/ast/arrayInitializerExpression/statement/javaLangFloatArray.jav b/j2k/testData/ast/arrayInitializerExpression/statement/javaLangFloatArray.jav similarity index 100% rename from testData/ast/arrayInitializerExpression/statement/javaLangFloatArray.jav rename to j2k/testData/ast/arrayInitializerExpression/statement/javaLangFloatArray.jav diff --git a/testData/ast/arrayInitializerExpression/statement/javaLangFloatArray.kt b/j2k/testData/ast/arrayInitializerExpression/statement/javaLangFloatArray.kt similarity index 100% rename from testData/ast/arrayInitializerExpression/statement/javaLangFloatArray.kt rename to j2k/testData/ast/arrayInitializerExpression/statement/javaLangFloatArray.kt diff --git a/testData/ast/arrayInitializerExpression/statement/newByte.jav b/j2k/testData/ast/arrayInitializerExpression/statement/newByte.jav similarity index 100% rename from testData/ast/arrayInitializerExpression/statement/newByte.jav rename to j2k/testData/ast/arrayInitializerExpression/statement/newByte.jav diff --git a/testData/ast/arrayInitializerExpression/statement/newByte.kt b/j2k/testData/ast/arrayInitializerExpression/statement/newByte.kt similarity index 100% rename from testData/ast/arrayInitializerExpression/statement/newByte.kt rename to j2k/testData/ast/arrayInitializerExpression/statement/newByte.kt diff --git a/testData/ast/arrayInitializerExpression/statement/oneDim.jav b/j2k/testData/ast/arrayInitializerExpression/statement/oneDim.jav similarity index 100% rename from testData/ast/arrayInitializerExpression/statement/oneDim.jav rename to j2k/testData/ast/arrayInitializerExpression/statement/oneDim.jav diff --git a/testData/ast/arrayInitializerExpression/statement/oneDim.kt b/j2k/testData/ast/arrayInitializerExpression/statement/oneDim.kt similarity index 100% rename from testData/ast/arrayInitializerExpression/statement/oneDim.kt rename to j2k/testData/ast/arrayInitializerExpression/statement/oneDim.kt diff --git a/testData/ast/arrayInitializerExpression/statement/oneDimWithVariables.jav b/j2k/testData/ast/arrayInitializerExpression/statement/oneDimWithVariables.jav similarity index 100% rename from testData/ast/arrayInitializerExpression/statement/oneDimWithVariables.jav rename to j2k/testData/ast/arrayInitializerExpression/statement/oneDimWithVariables.jav diff --git a/testData/ast/arrayInitializerExpression/statement/oneDimWithVariables.kt b/j2k/testData/ast/arrayInitializerExpression/statement/oneDimWithVariables.kt similarity index 100% rename from testData/ast/arrayInitializerExpression/statement/oneDimWithVariables.kt rename to j2k/testData/ast/arrayInitializerExpression/statement/oneDimWithVariables.kt diff --git a/testData/ast/arrayInitializerExpression/statement/twoDim.jav b/j2k/testData/ast/arrayInitializerExpression/statement/twoDim.jav similarity index 100% rename from testData/ast/arrayInitializerExpression/statement/twoDim.jav rename to j2k/testData/ast/arrayInitializerExpression/statement/twoDim.jav diff --git a/testData/ast/arrayInitializerExpression/statement/twoDim.kt b/j2k/testData/ast/arrayInitializerExpression/statement/twoDim.kt similarity index 100% rename from testData/ast/arrayInitializerExpression/statement/twoDim.kt rename to j2k/testData/ast/arrayInitializerExpression/statement/twoDim.kt diff --git a/testData/ast/arrayType/method/methodArrayArgs.jav b/j2k/testData/ast/arrayType/method/methodArrayArgs.jav similarity index 100% rename from testData/ast/arrayType/method/methodArrayArgs.jav rename to j2k/testData/ast/arrayType/method/methodArrayArgs.jav diff --git a/testData/ast/arrayType/method/methodArrayArgs.kt b/j2k/testData/ast/arrayType/method/methodArrayArgs.kt similarity index 100% rename from testData/ast/arrayType/method/methodArrayArgs.kt rename to j2k/testData/ast/arrayType/method/methodArrayArgs.kt diff --git a/testData/ast/arrayType/statement/arrayInitializationStatement.jav b/j2k/testData/ast/arrayType/statement/arrayInitializationStatement.jav similarity index 100% rename from testData/ast/arrayType/statement/arrayInitializationStatement.jav rename to j2k/testData/ast/arrayType/statement/arrayInitializationStatement.jav diff --git a/testData/ast/arrayType/statement/arrayInitializationStatement.kt b/j2k/testData/ast/arrayType/statement/arrayInitializationStatement.kt similarity index 100% rename from testData/ast/arrayType/statement/arrayInitializationStatement.kt rename to j2k/testData/ast/arrayType/statement/arrayInitializationStatement.kt diff --git a/testData/ast/arrayType/statement/arrayInitializationStatementWithDimension.jav b/j2k/testData/ast/arrayType/statement/arrayInitializationStatementWithDimension.jav similarity index 100% rename from testData/ast/arrayType/statement/arrayInitializationStatementWithDimension.jav rename to j2k/testData/ast/arrayType/statement/arrayInitializationStatementWithDimension.jav diff --git a/testData/ast/arrayType/statement/arrayInitializationStatementWithDimension.kt b/j2k/testData/ast/arrayType/statement/arrayInitializationStatementWithDimension.kt similarity index 100% rename from testData/ast/arrayType/statement/arrayInitializationStatementWithDimension.kt rename to j2k/testData/ast/arrayType/statement/arrayInitializationStatementWithDimension.kt diff --git a/testData/ast/arrayType/statement/arrayInitializationStatementWithDimension3d.jav b/j2k/testData/ast/arrayType/statement/arrayInitializationStatementWithDimension3d.jav similarity index 100% rename from testData/ast/arrayType/statement/arrayInitializationStatementWithDimension3d.jav rename to j2k/testData/ast/arrayType/statement/arrayInitializationStatementWithDimension3d.jav diff --git a/testData/ast/arrayType/statement/arrayInitializationStatementWithDimension3d.kt b/j2k/testData/ast/arrayType/statement/arrayInitializationStatementWithDimension3d.kt similarity index 100% rename from testData/ast/arrayType/statement/arrayInitializationStatementWithDimension3d.kt rename to j2k/testData/ast/arrayType/statement/arrayInitializationStatementWithDimension3d.kt diff --git a/testData/ast/arrayType/statement/arrayInitializationStatementWithDimensionExplicit.jav b/j2k/testData/ast/arrayType/statement/arrayInitializationStatementWithDimensionExplicit.jav similarity index 100% rename from testData/ast/arrayType/statement/arrayInitializationStatementWithDimensionExplicit.jav rename to j2k/testData/ast/arrayType/statement/arrayInitializationStatementWithDimensionExplicit.jav diff --git a/testData/ast/arrayType/statement/arrayInitializationStatementWithDimensionExplicit.kt b/j2k/testData/ast/arrayType/statement/arrayInitializationStatementWithDimensionExplicit.kt similarity index 100% rename from testData/ast/arrayType/statement/arrayInitializationStatementWithDimensionExplicit.kt rename to j2k/testData/ast/arrayType/statement/arrayInitializationStatementWithDimensionExplicit.kt diff --git a/testData/ast/arrayType/statement/d2StringEmptyArray.jav b/j2k/testData/ast/arrayType/statement/d2StringEmptyArray.jav similarity index 100% rename from testData/ast/arrayType/statement/d2StringEmptyArray.jav rename to j2k/testData/ast/arrayType/statement/d2StringEmptyArray.jav diff --git a/testData/ast/arrayType/statement/d2StringEmptyArray.kt b/j2k/testData/ast/arrayType/statement/d2StringEmptyArray.kt similarity index 100% rename from testData/ast/arrayType/statement/d2StringEmptyArray.kt rename to j2k/testData/ast/arrayType/statement/d2StringEmptyArray.kt diff --git a/testData/ast/arrayType/statement/d3StringEmptyArray.jav b/j2k/testData/ast/arrayType/statement/d3StringEmptyArray.jav similarity index 100% rename from testData/ast/arrayType/statement/d3StringEmptyArray.jav rename to j2k/testData/ast/arrayType/statement/d3StringEmptyArray.jav diff --git a/testData/ast/arrayType/statement/d3StringEmptyArray.kt b/j2k/testData/ast/arrayType/statement/d3StringEmptyArray.kt similarity index 100% rename from testData/ast/arrayType/statement/d3StringEmptyArray.kt rename to j2k/testData/ast/arrayType/statement/d3StringEmptyArray.kt diff --git a/testData/ast/arrayType/statement/longArray.jav b/j2k/testData/ast/arrayType/statement/longArray.jav similarity index 100% rename from testData/ast/arrayType/statement/longArray.jav rename to j2k/testData/ast/arrayType/statement/longArray.jav diff --git a/testData/ast/arrayType/statement/longArray.kt b/j2k/testData/ast/arrayType/statement/longArray.kt similarity index 100% rename from testData/ast/arrayType/statement/longArray.kt rename to j2k/testData/ast/arrayType/statement/longArray.kt diff --git a/testData/ast/arrayType/statement/newIntArray.jav b/j2k/testData/ast/arrayType/statement/newIntArray.jav similarity index 100% rename from testData/ast/arrayType/statement/newIntArray.jav rename to j2k/testData/ast/arrayType/statement/newIntArray.jav diff --git a/testData/ast/arrayType/statement/newIntArray.kt b/j2k/testData/ast/arrayType/statement/newIntArray.kt similarity index 100% rename from testData/ast/arrayType/statement/newIntArray.kt rename to j2k/testData/ast/arrayType/statement/newIntArray.kt diff --git a/testData/ast/arrayType/statement/newStringArray.jav b/j2k/testData/ast/arrayType/statement/newStringArray.jav similarity index 100% rename from testData/ast/arrayType/statement/newStringArray.jav rename to j2k/testData/ast/arrayType/statement/newStringArray.jav diff --git a/testData/ast/arrayType/statement/newStringArray.kt b/j2k/testData/ast/arrayType/statement/newStringArray.kt similarity index 100% rename from testData/ast/arrayType/statement/newStringArray.kt rename to j2k/testData/ast/arrayType/statement/newStringArray.kt diff --git a/testData/ast/assertStatement/statement/onlyCondition.jav b/j2k/testData/ast/assertStatement/statement/onlyCondition.jav similarity index 100% rename from testData/ast/assertStatement/statement/onlyCondition.jav rename to j2k/testData/ast/assertStatement/statement/onlyCondition.jav diff --git a/testData/ast/assertStatement/statement/onlyCondition.kt b/j2k/testData/ast/assertStatement/statement/onlyCondition.kt similarity index 100% rename from testData/ast/assertStatement/statement/onlyCondition.kt rename to j2k/testData/ast/assertStatement/statement/onlyCondition.kt diff --git a/testData/ast/assertStatement/statement/onlyConditionWithBraces.jav b/j2k/testData/ast/assertStatement/statement/onlyConditionWithBraces.jav similarity index 100% rename from testData/ast/assertStatement/statement/onlyConditionWithBraces.jav rename to j2k/testData/ast/assertStatement/statement/onlyConditionWithBraces.jav diff --git a/testData/ast/assertStatement/statement/onlyConditionWithBraces.kt b/j2k/testData/ast/assertStatement/statement/onlyConditionWithBraces.kt similarity index 100% rename from testData/ast/assertStatement/statement/onlyConditionWithBraces.kt rename to j2k/testData/ast/assertStatement/statement/onlyConditionWithBraces.kt diff --git a/testData/ast/assertStatement/statement/withStringDetail.jav b/j2k/testData/ast/assertStatement/statement/withStringDetail.jav similarity index 100% rename from testData/ast/assertStatement/statement/withStringDetail.jav rename to j2k/testData/ast/assertStatement/statement/withStringDetail.jav diff --git a/testData/ast/assertStatement/statement/withStringDetail.kt b/j2k/testData/ast/assertStatement/statement/withStringDetail.kt similarity index 100% rename from testData/ast/assertStatement/statement/withStringDetail.kt rename to j2k/testData/ast/assertStatement/statement/withStringDetail.kt diff --git a/testData/ast/assignmentExpression/expression/and.jav b/j2k/testData/ast/assignmentExpression/expression/and.jav similarity index 100% rename from testData/ast/assignmentExpression/expression/and.jav rename to j2k/testData/ast/assignmentExpression/expression/and.jav diff --git a/testData/ast/assignmentExpression/expression/and.kt b/j2k/testData/ast/assignmentExpression/expression/and.kt similarity index 100% rename from testData/ast/assignmentExpression/expression/and.kt rename to j2k/testData/ast/assignmentExpression/expression/and.kt diff --git a/testData/ast/assignmentExpression/expression/assignment.jav b/j2k/testData/ast/assignmentExpression/expression/assignment.jav similarity index 100% rename from testData/ast/assignmentExpression/expression/assignment.jav rename to j2k/testData/ast/assignmentExpression/expression/assignment.jav diff --git a/testData/ast/assignmentExpression/expression/assignment.kt b/j2k/testData/ast/assignmentExpression/expression/assignment.kt similarity index 100% rename from testData/ast/assignmentExpression/expression/assignment.kt rename to j2k/testData/ast/assignmentExpression/expression/assignment.kt diff --git a/testData/ast/assignmentExpression/expression/divideAssign.jav b/j2k/testData/ast/assignmentExpression/expression/divideAssign.jav similarity index 100% rename from testData/ast/assignmentExpression/expression/divideAssign.jav rename to j2k/testData/ast/assignmentExpression/expression/divideAssign.jav diff --git a/testData/ast/assignmentExpression/expression/divideAssign.kt b/j2k/testData/ast/assignmentExpression/expression/divideAssign.kt similarity index 100% rename from testData/ast/assignmentExpression/expression/divideAssign.kt rename to j2k/testData/ast/assignmentExpression/expression/divideAssign.kt diff --git a/testData/ast/assignmentExpression/expression/minusAssign.jav b/j2k/testData/ast/assignmentExpression/expression/minusAssign.jav similarity index 100% rename from testData/ast/assignmentExpression/expression/minusAssign.jav rename to j2k/testData/ast/assignmentExpression/expression/minusAssign.jav diff --git a/testData/ast/assignmentExpression/expression/minusAssign.kt b/j2k/testData/ast/assignmentExpression/expression/minusAssign.kt similarity index 100% rename from testData/ast/assignmentExpression/expression/minusAssign.kt rename to j2k/testData/ast/assignmentExpression/expression/minusAssign.kt diff --git a/testData/ast/assignmentExpression/expression/multiplyAssign.jav b/j2k/testData/ast/assignmentExpression/expression/multiplyAssign.jav similarity index 100% rename from testData/ast/assignmentExpression/expression/multiplyAssign.jav rename to j2k/testData/ast/assignmentExpression/expression/multiplyAssign.jav diff --git a/testData/ast/assignmentExpression/expression/multiplyAssign.kt b/j2k/testData/ast/assignmentExpression/expression/multiplyAssign.kt similarity index 100% rename from testData/ast/assignmentExpression/expression/multiplyAssign.kt rename to j2k/testData/ast/assignmentExpression/expression/multiplyAssign.kt diff --git a/testData/ast/assignmentExpression/expression/or.jav b/j2k/testData/ast/assignmentExpression/expression/or.jav similarity index 100% rename from testData/ast/assignmentExpression/expression/or.jav rename to j2k/testData/ast/assignmentExpression/expression/or.jav diff --git a/testData/ast/assignmentExpression/expression/or.kt b/j2k/testData/ast/assignmentExpression/expression/or.kt similarity index 100% rename from testData/ast/assignmentExpression/expression/or.kt rename to j2k/testData/ast/assignmentExpression/expression/or.kt diff --git a/testData/ast/assignmentExpression/expression/plusAssign.jav b/j2k/testData/ast/assignmentExpression/expression/plusAssign.jav similarity index 100% rename from testData/ast/assignmentExpression/expression/plusAssign.jav rename to j2k/testData/ast/assignmentExpression/expression/plusAssign.jav diff --git a/testData/ast/assignmentExpression/expression/plusAssign.kt b/j2k/testData/ast/assignmentExpression/expression/plusAssign.kt similarity index 100% rename from testData/ast/assignmentExpression/expression/plusAssign.kt rename to j2k/testData/ast/assignmentExpression/expression/plusAssign.kt diff --git a/testData/ast/assignmentExpression/expression/reminder.jav b/j2k/testData/ast/assignmentExpression/expression/reminder.jav similarity index 100% rename from testData/ast/assignmentExpression/expression/reminder.jav rename to j2k/testData/ast/assignmentExpression/expression/reminder.jav diff --git a/testData/ast/assignmentExpression/expression/reminder.kt b/j2k/testData/ast/assignmentExpression/expression/reminder.kt similarity index 100% rename from testData/ast/assignmentExpression/expression/reminder.kt rename to j2k/testData/ast/assignmentExpression/expression/reminder.kt diff --git a/testData/ast/assignmentExpression/expression/shiftLeft.jav b/j2k/testData/ast/assignmentExpression/expression/shiftLeft.jav similarity index 100% rename from testData/ast/assignmentExpression/expression/shiftLeft.jav rename to j2k/testData/ast/assignmentExpression/expression/shiftLeft.jav diff --git a/testData/ast/assignmentExpression/expression/shiftLeft.kt b/j2k/testData/ast/assignmentExpression/expression/shiftLeft.kt similarity index 100% rename from testData/ast/assignmentExpression/expression/shiftLeft.kt rename to j2k/testData/ast/assignmentExpression/expression/shiftLeft.kt diff --git a/testData/ast/assignmentExpression/expression/shiftRight.jav b/j2k/testData/ast/assignmentExpression/expression/shiftRight.jav similarity index 100% rename from testData/ast/assignmentExpression/expression/shiftRight.jav rename to j2k/testData/ast/assignmentExpression/expression/shiftRight.jav diff --git a/testData/ast/assignmentExpression/expression/shiftRight.kt b/j2k/testData/ast/assignmentExpression/expression/shiftRight.kt similarity index 100% rename from testData/ast/assignmentExpression/expression/shiftRight.kt rename to j2k/testData/ast/assignmentExpression/expression/shiftRight.kt diff --git a/testData/ast/assignmentExpression/expression/unsignedRightShift.jav b/j2k/testData/ast/assignmentExpression/expression/unsignedRightShift.jav similarity index 100% rename from testData/ast/assignmentExpression/expression/unsignedRightShift.jav rename to j2k/testData/ast/assignmentExpression/expression/unsignedRightShift.jav diff --git a/testData/ast/assignmentExpression/expression/unsignedRightShift.kt b/j2k/testData/ast/assignmentExpression/expression/unsignedRightShift.kt similarity index 100% rename from testData/ast/assignmentExpression/expression/unsignedRightShift.kt rename to j2k/testData/ast/assignmentExpression/expression/unsignedRightShift.kt diff --git a/testData/ast/assignmentExpression/expression/xor.jav b/j2k/testData/ast/assignmentExpression/expression/xor.jav similarity index 100% rename from testData/ast/assignmentExpression/expression/xor.jav rename to j2k/testData/ast/assignmentExpression/expression/xor.jav diff --git a/testData/ast/assignmentExpression/expression/xor.kt b/j2k/testData/ast/assignmentExpression/expression/xor.kt similarity index 100% rename from testData/ast/assignmentExpression/expression/xor.kt rename to j2k/testData/ast/assignmentExpression/expression/xor.kt diff --git a/testData/ast/assignmentExpression/statement/simpleAssignment.jav b/j2k/testData/ast/assignmentExpression/statement/simpleAssignment.jav similarity index 100% rename from testData/ast/assignmentExpression/statement/simpleAssignment.jav rename to j2k/testData/ast/assignmentExpression/statement/simpleAssignment.jav diff --git a/testData/ast/assignmentExpression/statement/simpleAssignment.kt b/j2k/testData/ast/assignmentExpression/statement/simpleAssignment.kt similarity index 100% rename from testData/ast/assignmentExpression/statement/simpleAssignment.kt rename to j2k/testData/ast/assignmentExpression/statement/simpleAssignment.kt diff --git a/testData/ast/binaryExpression/expression/and.jav b/j2k/testData/ast/binaryExpression/expression/and.jav similarity index 100% rename from testData/ast/binaryExpression/expression/and.jav rename to j2k/testData/ast/binaryExpression/expression/and.jav diff --git a/testData/ast/binaryExpression/expression/and.kt b/j2k/testData/ast/binaryExpression/expression/and.kt similarity index 100% rename from testData/ast/binaryExpression/expression/and.kt rename to j2k/testData/ast/binaryExpression/expression/and.kt diff --git a/testData/ast/binaryExpression/expression/conditionalAnd.jav b/j2k/testData/ast/binaryExpression/expression/conditionalAnd.jav similarity index 100% rename from testData/ast/binaryExpression/expression/conditionalAnd.jav rename to j2k/testData/ast/binaryExpression/expression/conditionalAnd.jav diff --git a/testData/ast/binaryExpression/expression/conditionalAnd.kt b/j2k/testData/ast/binaryExpression/expression/conditionalAnd.kt similarity index 100% rename from testData/ast/binaryExpression/expression/conditionalAnd.kt rename to j2k/testData/ast/binaryExpression/expression/conditionalAnd.kt diff --git a/testData/ast/binaryExpression/expression/conditionalOr.jav b/j2k/testData/ast/binaryExpression/expression/conditionalOr.jav similarity index 100% rename from testData/ast/binaryExpression/expression/conditionalOr.jav rename to j2k/testData/ast/binaryExpression/expression/conditionalOr.jav diff --git a/testData/ast/binaryExpression/expression/conditionalOr.kt b/j2k/testData/ast/binaryExpression/expression/conditionalOr.kt similarity index 100% rename from testData/ast/binaryExpression/expression/conditionalOr.kt rename to j2k/testData/ast/binaryExpression/expression/conditionalOr.kt diff --git a/testData/ast/binaryExpression/expression/divide.jav b/j2k/testData/ast/binaryExpression/expression/divide.jav similarity index 100% rename from testData/ast/binaryExpression/expression/divide.jav rename to j2k/testData/ast/binaryExpression/expression/divide.jav diff --git a/testData/ast/binaryExpression/expression/divide.kt b/j2k/testData/ast/binaryExpression/expression/divide.kt similarity index 100% rename from testData/ast/binaryExpression/expression/divide.kt rename to j2k/testData/ast/binaryExpression/expression/divide.kt diff --git a/testData/ast/binaryExpression/expression/greaterThan.jav b/j2k/testData/ast/binaryExpression/expression/greaterThan.jav similarity index 100% rename from testData/ast/binaryExpression/expression/greaterThan.jav rename to j2k/testData/ast/binaryExpression/expression/greaterThan.jav diff --git a/testData/ast/binaryExpression/expression/greaterThan.kt b/j2k/testData/ast/binaryExpression/expression/greaterThan.kt similarity index 100% rename from testData/ast/binaryExpression/expression/greaterThan.kt rename to j2k/testData/ast/binaryExpression/expression/greaterThan.kt diff --git a/testData/ast/binaryExpression/expression/greaterThanEqual.jav b/j2k/testData/ast/binaryExpression/expression/greaterThanEqual.jav similarity index 100% rename from testData/ast/binaryExpression/expression/greaterThanEqual.jav rename to j2k/testData/ast/binaryExpression/expression/greaterThanEqual.jav diff --git a/testData/ast/binaryExpression/expression/greaterThanEqual.kt b/j2k/testData/ast/binaryExpression/expression/greaterThanEqual.kt similarity index 100% rename from testData/ast/binaryExpression/expression/greaterThanEqual.kt rename to j2k/testData/ast/binaryExpression/expression/greaterThanEqual.kt diff --git a/testData/ast/binaryExpression/expression/lessThan.jav b/j2k/testData/ast/binaryExpression/expression/lessThan.jav similarity index 100% rename from testData/ast/binaryExpression/expression/lessThan.jav rename to j2k/testData/ast/binaryExpression/expression/lessThan.jav diff --git a/testData/ast/binaryExpression/expression/lessThan.kt b/j2k/testData/ast/binaryExpression/expression/lessThan.kt similarity index 100% rename from testData/ast/binaryExpression/expression/lessThan.kt rename to j2k/testData/ast/binaryExpression/expression/lessThan.kt diff --git a/testData/ast/binaryExpression/expression/lessThanEqual.jav b/j2k/testData/ast/binaryExpression/expression/lessThanEqual.jav similarity index 100% rename from testData/ast/binaryExpression/expression/lessThanEqual.jav rename to j2k/testData/ast/binaryExpression/expression/lessThanEqual.jav diff --git a/testData/ast/binaryExpression/expression/lessThanEqual.kt b/j2k/testData/ast/binaryExpression/expression/lessThanEqual.kt similarity index 100% rename from testData/ast/binaryExpression/expression/lessThanEqual.kt rename to j2k/testData/ast/binaryExpression/expression/lessThanEqual.kt diff --git a/testData/ast/binaryExpression/expression/minus.jav b/j2k/testData/ast/binaryExpression/expression/minus.jav similarity index 100% rename from testData/ast/binaryExpression/expression/minus.jav rename to j2k/testData/ast/binaryExpression/expression/minus.jav diff --git a/testData/ast/binaryExpression/expression/minus.kt b/j2k/testData/ast/binaryExpression/expression/minus.kt similarity index 100% rename from testData/ast/binaryExpression/expression/minus.kt rename to j2k/testData/ast/binaryExpression/expression/minus.kt diff --git a/testData/ast/binaryExpression/expression/multiply.jav b/j2k/testData/ast/binaryExpression/expression/multiply.jav similarity index 100% rename from testData/ast/binaryExpression/expression/multiply.jav rename to j2k/testData/ast/binaryExpression/expression/multiply.jav diff --git a/testData/ast/binaryExpression/expression/multiply.kt b/j2k/testData/ast/binaryExpression/expression/multiply.kt similarity index 100% rename from testData/ast/binaryExpression/expression/multiply.kt rename to j2k/testData/ast/binaryExpression/expression/multiply.kt diff --git a/testData/ast/binaryExpression/expression/or.jav b/j2k/testData/ast/binaryExpression/expression/or.jav similarity index 100% rename from testData/ast/binaryExpression/expression/or.jav rename to j2k/testData/ast/binaryExpression/expression/or.jav diff --git a/testData/ast/binaryExpression/expression/or.kt b/j2k/testData/ast/binaryExpression/expression/or.kt similarity index 100% rename from testData/ast/binaryExpression/expression/or.kt rename to j2k/testData/ast/binaryExpression/expression/or.kt diff --git a/testData/ast/binaryExpression/expression/plus.jav b/j2k/testData/ast/binaryExpression/expression/plus.jav similarity index 100% rename from testData/ast/binaryExpression/expression/plus.jav rename to j2k/testData/ast/binaryExpression/expression/plus.jav diff --git a/testData/ast/binaryExpression/expression/plus.kt b/j2k/testData/ast/binaryExpression/expression/plus.kt similarity index 100% rename from testData/ast/binaryExpression/expression/plus.kt rename to j2k/testData/ast/binaryExpression/expression/plus.kt diff --git a/testData/ast/binaryExpression/expression/remainder.jav b/j2k/testData/ast/binaryExpression/expression/remainder.jav similarity index 100% rename from testData/ast/binaryExpression/expression/remainder.jav rename to j2k/testData/ast/binaryExpression/expression/remainder.jav diff --git a/testData/ast/binaryExpression/expression/remainder.kt b/j2k/testData/ast/binaryExpression/expression/remainder.kt similarity index 100% rename from testData/ast/binaryExpression/expression/remainder.kt rename to j2k/testData/ast/binaryExpression/expression/remainder.kt diff --git a/testData/ast/binaryExpression/expression/shiftLeft.jav b/j2k/testData/ast/binaryExpression/expression/shiftLeft.jav similarity index 100% rename from testData/ast/binaryExpression/expression/shiftLeft.jav rename to j2k/testData/ast/binaryExpression/expression/shiftLeft.jav diff --git a/testData/ast/binaryExpression/expression/shiftLeft.kt b/j2k/testData/ast/binaryExpression/expression/shiftLeft.kt similarity index 100% rename from testData/ast/binaryExpression/expression/shiftLeft.kt rename to j2k/testData/ast/binaryExpression/expression/shiftLeft.kt diff --git a/testData/ast/binaryExpression/expression/shiftRight.jav b/j2k/testData/ast/binaryExpression/expression/shiftRight.jav similarity index 100% rename from testData/ast/binaryExpression/expression/shiftRight.jav rename to j2k/testData/ast/binaryExpression/expression/shiftRight.jav diff --git a/testData/ast/binaryExpression/expression/shiftRight.kt b/j2k/testData/ast/binaryExpression/expression/shiftRight.kt similarity index 100% rename from testData/ast/binaryExpression/expression/shiftRight.kt rename to j2k/testData/ast/binaryExpression/expression/shiftRight.kt diff --git a/testData/ast/binaryExpression/expression/unsignedRightShift.jav b/j2k/testData/ast/binaryExpression/expression/unsignedRightShift.jav similarity index 100% rename from testData/ast/binaryExpression/expression/unsignedRightShift.jav rename to j2k/testData/ast/binaryExpression/expression/unsignedRightShift.jav diff --git a/testData/ast/binaryExpression/expression/unsignedRightShift.kt b/j2k/testData/ast/binaryExpression/expression/unsignedRightShift.kt similarity index 100% rename from testData/ast/binaryExpression/expression/unsignedRightShift.kt rename to j2k/testData/ast/binaryExpression/expression/unsignedRightShift.kt diff --git a/testData/ast/binaryExpression/expression/xor.jav b/j2k/testData/ast/binaryExpression/expression/xor.jav similarity index 100% rename from testData/ast/binaryExpression/expression/xor.jav rename to j2k/testData/ast/binaryExpression/expression/xor.jav diff --git a/testData/ast/binaryExpression/expression/xor.kt b/j2k/testData/ast/binaryExpression/expression/xor.kt similarity index 100% rename from testData/ast/binaryExpression/expression/xor.kt rename to j2k/testData/ast/binaryExpression/expression/xor.kt diff --git a/testData/ast/boxedType/file/kt-671.jav b/j2k/testData/ast/boxedType/file/kt-671.jav similarity index 100% rename from testData/ast/boxedType/file/kt-671.jav rename to j2k/testData/ast/boxedType/file/kt-671.jav diff --git a/testData/ast/boxedType/file/kt-671.kt b/j2k/testData/ast/boxedType/file/kt-671.kt similarity index 100% rename from testData/ast/boxedType/file/kt-671.kt rename to j2k/testData/ast/boxedType/file/kt-671.kt diff --git a/testData/ast/boxedType/statement/boolean.jav b/j2k/testData/ast/boxedType/statement/boolean.jav similarity index 100% rename from testData/ast/boxedType/statement/boolean.jav rename to j2k/testData/ast/boxedType/statement/boolean.jav diff --git a/testData/ast/boxedType/statement/boolean.kt b/j2k/testData/ast/boxedType/statement/boolean.kt similarity index 100% rename from testData/ast/boxedType/statement/boolean.kt rename to j2k/testData/ast/boxedType/statement/boolean.kt diff --git a/testData/ast/boxedType/statement/byte.jav b/j2k/testData/ast/boxedType/statement/byte.jav similarity index 100% rename from testData/ast/boxedType/statement/byte.jav rename to j2k/testData/ast/boxedType/statement/byte.jav diff --git a/testData/ast/boxedType/statement/byte.kt b/j2k/testData/ast/boxedType/statement/byte.kt similarity index 100% rename from testData/ast/boxedType/statement/byte.kt rename to j2k/testData/ast/boxedType/statement/byte.kt diff --git a/testData/ast/boxedType/statement/character.jav b/j2k/testData/ast/boxedType/statement/character.jav similarity index 100% rename from testData/ast/boxedType/statement/character.jav rename to j2k/testData/ast/boxedType/statement/character.jav diff --git a/testData/ast/boxedType/statement/character.kt b/j2k/testData/ast/boxedType/statement/character.kt similarity index 100% rename from testData/ast/boxedType/statement/character.kt rename to j2k/testData/ast/boxedType/statement/character.kt diff --git a/testData/ast/boxedType/statement/double.jav b/j2k/testData/ast/boxedType/statement/double.jav similarity index 100% rename from testData/ast/boxedType/statement/double.jav rename to j2k/testData/ast/boxedType/statement/double.jav diff --git a/testData/ast/boxedType/statement/double.kt b/j2k/testData/ast/boxedType/statement/double.kt similarity index 100% rename from testData/ast/boxedType/statement/double.kt rename to j2k/testData/ast/boxedType/statement/double.kt diff --git a/testData/ast/boxedType/statement/float.jav b/j2k/testData/ast/boxedType/statement/float.jav similarity index 100% rename from testData/ast/boxedType/statement/float.jav rename to j2k/testData/ast/boxedType/statement/float.jav diff --git a/testData/ast/boxedType/statement/float.kt b/j2k/testData/ast/boxedType/statement/float.kt similarity index 100% rename from testData/ast/boxedType/statement/float.kt rename to j2k/testData/ast/boxedType/statement/float.kt diff --git a/testData/ast/boxedType/statement/integer.jav b/j2k/testData/ast/boxedType/statement/integer.jav similarity index 100% rename from testData/ast/boxedType/statement/integer.jav rename to j2k/testData/ast/boxedType/statement/integer.jav diff --git a/testData/ast/boxedType/statement/integer.kt b/j2k/testData/ast/boxedType/statement/integer.kt similarity index 100% rename from testData/ast/boxedType/statement/integer.kt rename to j2k/testData/ast/boxedType/statement/integer.kt diff --git a/testData/ast/boxedType/statement/long.jav b/j2k/testData/ast/boxedType/statement/long.jav similarity index 100% rename from testData/ast/boxedType/statement/long.jav rename to j2k/testData/ast/boxedType/statement/long.jav diff --git a/testData/ast/boxedType/statement/long.kt b/j2k/testData/ast/boxedType/statement/long.kt similarity index 100% rename from testData/ast/boxedType/statement/long.kt rename to j2k/testData/ast/boxedType/statement/long.kt diff --git a/testData/ast/boxedType/statement/object.jav b/j2k/testData/ast/boxedType/statement/object.jav similarity index 100% rename from testData/ast/boxedType/statement/object.jav rename to j2k/testData/ast/boxedType/statement/object.jav diff --git a/testData/ast/boxedType/statement/object.kt b/j2k/testData/ast/boxedType/statement/object.kt similarity index 100% rename from testData/ast/boxedType/statement/object.kt rename to j2k/testData/ast/boxedType/statement/object.kt diff --git a/testData/ast/boxedType/statement/short.jav b/j2k/testData/ast/boxedType/statement/short.jav similarity index 100% rename from testData/ast/boxedType/statement/short.jav rename to j2k/testData/ast/boxedType/statement/short.jav diff --git a/testData/ast/boxedType/statement/short.kt b/j2k/testData/ast/boxedType/statement/short.kt similarity index 100% rename from testData/ast/boxedType/statement/short.kt rename to j2k/testData/ast/boxedType/statement/short.kt diff --git a/testData/ast/breakStatement/statement/breakWithLabel.jav b/j2k/testData/ast/breakStatement/statement/breakWithLabel.jav similarity index 100% rename from testData/ast/breakStatement/statement/breakWithLabel.jav rename to j2k/testData/ast/breakStatement/statement/breakWithLabel.jav diff --git a/testData/ast/breakStatement/statement/breakWithLabel.kt b/j2k/testData/ast/breakStatement/statement/breakWithLabel.kt similarity index 100% rename from testData/ast/breakStatement/statement/breakWithLabel.kt rename to j2k/testData/ast/breakStatement/statement/breakWithLabel.kt diff --git a/testData/ast/breakStatement/statement/breakWithoutLabel.jav b/j2k/testData/ast/breakStatement/statement/breakWithoutLabel.jav similarity index 100% rename from testData/ast/breakStatement/statement/breakWithoutLabel.jav rename to j2k/testData/ast/breakStatement/statement/breakWithoutLabel.jav diff --git a/testData/ast/breakStatement/statement/breakWithoutLabel.kt b/j2k/testData/ast/breakStatement/statement/breakWithoutLabel.kt similarity index 100% rename from testData/ast/breakStatement/statement/breakWithoutLabel.kt rename to j2k/testData/ast/breakStatement/statement/breakWithoutLabel.kt diff --git a/testData/ast/callChainExpression/file/libraryFieldCall.jav b/j2k/testData/ast/callChainExpression/file/libraryFieldCall.jav similarity index 100% rename from testData/ast/callChainExpression/file/libraryFieldCall.jav rename to j2k/testData/ast/callChainExpression/file/libraryFieldCall.jav diff --git a/testData/ast/callChainExpression/file/libraryFieldCall.kt b/j2k/testData/ast/callChainExpression/file/libraryFieldCall.kt similarity index 100% rename from testData/ast/callChainExpression/file/libraryFieldCall.kt rename to j2k/testData/ast/callChainExpression/file/libraryFieldCall.kt diff --git a/testData/ast/callChainExpression/file/libraryMethodCall.jav b/j2k/testData/ast/callChainExpression/file/libraryMethodCall.jav similarity index 100% rename from testData/ast/callChainExpression/file/libraryMethodCall.jav rename to j2k/testData/ast/callChainExpression/file/libraryMethodCall.jav diff --git a/testData/ast/callChainExpression/file/libraryMethodCall.kt b/j2k/testData/ast/callChainExpression/file/libraryMethodCall.kt similarity index 100% rename from testData/ast/callChainExpression/file/libraryMethodCall.kt rename to j2k/testData/ast/callChainExpression/file/libraryMethodCall.kt diff --git a/testData/ast/callChainExpression/file/libraryMethodCallFromInstance.jav b/j2k/testData/ast/callChainExpression/file/libraryMethodCallFromInstance.jav similarity index 100% rename from testData/ast/callChainExpression/file/libraryMethodCallFromInstance.jav rename to j2k/testData/ast/callChainExpression/file/libraryMethodCallFromInstance.jav diff --git a/testData/ast/callChainExpression/file/libraryMethodCallFromInstance.kt b/j2k/testData/ast/callChainExpression/file/libraryMethodCallFromInstance.kt similarity index 100% rename from testData/ast/callChainExpression/file/libraryMethodCallFromInstance.kt rename to j2k/testData/ast/callChainExpression/file/libraryMethodCallFromInstance.kt diff --git a/testData/ast/callChainExpression/file/libraryStringFieldCall.jav b/j2k/testData/ast/callChainExpression/file/libraryStringFieldCall.jav similarity index 100% rename from testData/ast/callChainExpression/file/libraryStringFieldCall.jav rename to j2k/testData/ast/callChainExpression/file/libraryStringFieldCall.jav diff --git a/testData/ast/callChainExpression/file/libraryStringFieldCall.kt b/j2k/testData/ast/callChainExpression/file/libraryStringFieldCall.kt similarity index 100% rename from testData/ast/callChainExpression/file/libraryStringFieldCall.kt rename to j2k/testData/ast/callChainExpression/file/libraryStringFieldCall.kt diff --git a/testData/ast/callChainExpression/statement/sout.jav b/j2k/testData/ast/callChainExpression/statement/sout.jav similarity index 100% rename from testData/ast/callChainExpression/statement/sout.jav rename to j2k/testData/ast/callChainExpression/statement/sout.jav diff --git a/testData/ast/callChainExpression/statement/sout.kt b/j2k/testData/ast/callChainExpression/statement/sout.kt similarity index 100% rename from testData/ast/callChainExpression/statement/sout.kt rename to j2k/testData/ast/callChainExpression/statement/sout.kt diff --git a/testData/ast/class/class/abstractClass.jav b/j2k/testData/ast/class/class/abstractClass.jav similarity index 100% rename from testData/ast/class/class/abstractClass.jav rename to j2k/testData/ast/class/class/abstractClass.jav diff --git a/testData/ast/class/class/abstractClass.kt b/j2k/testData/ast/class/class/abstractClass.kt similarity index 100% rename from testData/ast/class/class/abstractClass.kt rename to j2k/testData/ast/class/class/abstractClass.kt diff --git a/testData/ast/class/class/abstractClassShape.jav b/j2k/testData/ast/class/class/abstractClassShape.jav similarity index 100% rename from testData/ast/class/class/abstractClassShape.jav rename to j2k/testData/ast/class/class/abstractClassShape.jav diff --git a/testData/ast/class/class/abstractClassShape.kt b/j2k/testData/ast/class/class/abstractClassShape.kt similarity index 100% rename from testData/ast/class/class/abstractClassShape.kt rename to j2k/testData/ast/class/class/abstractClassShape.kt diff --git a/testData/ast/class/class/class.jav b/j2k/testData/ast/class/class/class.jav similarity index 100% rename from testData/ast/class/class/class.jav rename to j2k/testData/ast/class/class/class.jav diff --git a/testData/ast/class/class/class.kt b/j2k/testData/ast/class/class/class.kt similarity index 100% rename from testData/ast/class/class/class.kt rename to j2k/testData/ast/class/class/class.kt diff --git a/testData/ast/class/class/classWithEmptyMethods.jav b/j2k/testData/ast/class/class/classWithEmptyMethods.jav similarity index 100% rename from testData/ast/class/class/classWithEmptyMethods.jav rename to j2k/testData/ast/class/class/classWithEmptyMethods.jav diff --git a/testData/ast/class/class/classWithEmptyMethods.kt b/j2k/testData/ast/class/class/classWithEmptyMethods.kt similarity index 100% rename from testData/ast/class/class/classWithEmptyMethods.kt rename to j2k/testData/ast/class/class/classWithEmptyMethods.kt diff --git a/testData/ast/class/class/classWithFields.jav b/j2k/testData/ast/class/class/classWithFields.jav similarity index 100% rename from testData/ast/class/class/classWithFields.jav rename to j2k/testData/ast/class/class/classWithFields.jav diff --git a/testData/ast/class/class/classWithFields.kt b/j2k/testData/ast/class/class/classWithFields.kt similarity index 100% rename from testData/ast/class/class/classWithFields.kt rename to j2k/testData/ast/class/class/classWithFields.kt diff --git a/testData/ast/class/class/classWithMultiplyFields.jav b/j2k/testData/ast/class/class/classWithMultiplyFields.jav similarity index 100% rename from testData/ast/class/class/classWithMultiplyFields.jav rename to j2k/testData/ast/class/class/classWithMultiplyFields.jav diff --git a/testData/ast/class/class/classWithMultiplyFields.kt b/j2k/testData/ast/class/class/classWithMultiplyFields.kt similarity index 100% rename from testData/ast/class/class/classWithMultiplyFields.kt rename to j2k/testData/ast/class/class/classWithMultiplyFields.kt diff --git a/testData/ast/class/class/emptyClass.jav b/j2k/testData/ast/class/class/emptyClass.jav similarity index 100% rename from testData/ast/class/class/emptyClass.jav rename to j2k/testData/ast/class/class/emptyClass.jav diff --git a/testData/ast/class/class/emptyClass.kt b/j2k/testData/ast/class/class/emptyClass.kt similarity index 100% rename from testData/ast/class/class/emptyClass.kt rename to j2k/testData/ast/class/class/emptyClass.kt diff --git a/testData/ast/class/class/extendsOneClassAndImplementsOneInterface.jav b/j2k/testData/ast/class/class/extendsOneClassAndImplementsOneInterface.jav similarity index 100% rename from testData/ast/class/class/extendsOneClassAndImplementsOneInterface.jav rename to j2k/testData/ast/class/class/extendsOneClassAndImplementsOneInterface.jav diff --git a/testData/ast/class/class/extendsOneClassAndImplementsOneInterface.kt b/j2k/testData/ast/class/class/extendsOneClassAndImplementsOneInterface.kt similarity index 100% rename from testData/ast/class/class/extendsOneClassAndImplementsOneInterface.kt rename to j2k/testData/ast/class/class/extendsOneClassAndImplementsOneInterface.kt diff --git a/testData/ast/class/class/extendsOneClassAndImplementsSeveralInterfaces.jav b/j2k/testData/ast/class/class/extendsOneClassAndImplementsSeveralInterfaces.jav similarity index 100% rename from testData/ast/class/class/extendsOneClassAndImplementsSeveralInterfaces.jav rename to j2k/testData/ast/class/class/extendsOneClassAndImplementsSeveralInterfaces.jav diff --git a/testData/ast/class/class/extendsOneClassAndImplementsSeveralInterfaces.kt b/j2k/testData/ast/class/class/extendsOneClassAndImplementsSeveralInterfaces.kt similarity index 100% rename from testData/ast/class/class/extendsOneClassAndImplementsSeveralInterfaces.kt rename to j2k/testData/ast/class/class/extendsOneClassAndImplementsSeveralInterfaces.kt diff --git a/testData/ast/class/class/finalClass.jav b/j2k/testData/ast/class/class/finalClass.jav similarity index 100% rename from testData/ast/class/class/finalClass.jav rename to j2k/testData/ast/class/class/finalClass.jav diff --git a/testData/ast/class/class/finalClass.kt b/j2k/testData/ast/class/class/finalClass.kt similarity index 100% rename from testData/ast/class/class/finalClass.kt rename to j2k/testData/ast/class/class/finalClass.kt diff --git a/testData/ast/class/class/genericClass.jav b/j2k/testData/ast/class/class/genericClass.jav similarity index 100% rename from testData/ast/class/class/genericClass.jav rename to j2k/testData/ast/class/class/genericClass.jav diff --git a/testData/ast/class/class/genericClass.kt b/j2k/testData/ast/class/class/genericClass.kt similarity index 100% rename from testData/ast/class/class/genericClass.kt rename to j2k/testData/ast/class/class/genericClass.kt diff --git a/testData/ast/class/class/innerEmptyClass.jav b/j2k/testData/ast/class/class/innerEmptyClass.jav similarity index 100% rename from testData/ast/class/class/innerEmptyClass.jav rename to j2k/testData/ast/class/class/innerEmptyClass.jav diff --git a/testData/ast/class/class/innerEmptyClass.kt b/j2k/testData/ast/class/class/innerEmptyClass.kt similarity index 100% rename from testData/ast/class/class/innerEmptyClass.kt rename to j2k/testData/ast/class/class/innerEmptyClass.kt diff --git a/testData/ast/class/class/innerStaticClass.jav b/j2k/testData/ast/class/class/innerStaticClass.jav similarity index 100% rename from testData/ast/class/class/innerStaticClass.jav rename to j2k/testData/ast/class/class/innerStaticClass.jav diff --git a/testData/ast/class/class/innerStaticClass.kt b/j2k/testData/ast/class/class/innerStaticClass.kt similarity index 100% rename from testData/ast/class/class/innerStaticClass.kt rename to j2k/testData/ast/class/class/innerStaticClass.kt diff --git a/testData/ast/class/class/internalClass.jav b/j2k/testData/ast/class/class/internalClass.jav similarity index 100% rename from testData/ast/class/class/internalClass.jav rename to j2k/testData/ast/class/class/internalClass.jav diff --git a/testData/ast/class/class/internalClass.kt b/j2k/testData/ast/class/class/internalClass.kt similarity index 100% rename from testData/ast/class/class/internalClass.kt rename to j2k/testData/ast/class/class/internalClass.kt diff --git a/testData/ast/class/class/oneStaticFieldOneNonStatic.jav b/j2k/testData/ast/class/class/oneStaticFieldOneNonStatic.jav similarity index 100% rename from testData/ast/class/class/oneStaticFieldOneNonStatic.jav rename to j2k/testData/ast/class/class/oneStaticFieldOneNonStatic.jav diff --git a/testData/ast/class/class/oneStaticFieldOneNonStatic.kt b/j2k/testData/ast/class/class/oneStaticFieldOneNonStatic.kt similarity index 100% rename from testData/ast/class/class/oneStaticFieldOneNonStatic.kt rename to j2k/testData/ast/class/class/oneStaticFieldOneNonStatic.kt diff --git a/testData/ast/class/class/oneStaticMethod.jav b/j2k/testData/ast/class/class/oneStaticMethod.jav similarity index 100% rename from testData/ast/class/class/oneStaticMethod.jav rename to j2k/testData/ast/class/class/oneStaticMethod.jav diff --git a/testData/ast/class/class/oneStaticMethod.kt b/j2k/testData/ast/class/class/oneStaticMethod.kt similarity index 100% rename from testData/ast/class/class/oneStaticMethod.kt rename to j2k/testData/ast/class/class/oneStaticMethod.kt diff --git a/testData/ast/class/class/oneStaticMethodOneNonStatic.jav b/j2k/testData/ast/class/class/oneStaticMethodOneNonStatic.jav similarity index 100% rename from testData/ast/class/class/oneStaticMethodOneNonStatic.jav rename to j2k/testData/ast/class/class/oneStaticMethodOneNonStatic.jav diff --git a/testData/ast/class/class/oneStaticMethodOneNonStatic.kt b/j2k/testData/ast/class/class/oneStaticMethodOneNonStatic.kt similarity index 100% rename from testData/ast/class/class/oneStaticMethodOneNonStatic.kt rename to j2k/testData/ast/class/class/oneStaticMethodOneNonStatic.kt diff --git a/testData/ast/class/class/pivateClass.jav b/j2k/testData/ast/class/class/pivateClass.jav similarity index 100% rename from testData/ast/class/class/pivateClass.jav rename to j2k/testData/ast/class/class/pivateClass.jav diff --git a/testData/ast/class/class/pivateClass.kt b/j2k/testData/ast/class/class/pivateClass.kt similarity index 100% rename from testData/ast/class/class/pivateClass.kt rename to j2k/testData/ast/class/class/pivateClass.kt diff --git a/testData/ast/class/class/protectedClass.jav b/j2k/testData/ast/class/class/protectedClass.jav similarity index 100% rename from testData/ast/class/class/protectedClass.jav rename to j2k/testData/ast/class/class/protectedClass.jav diff --git a/testData/ast/class/class/protectedClass.kt b/j2k/testData/ast/class/class/protectedClass.kt similarity index 100% rename from testData/ast/class/class/protectedClass.kt rename to j2k/testData/ast/class/class/protectedClass.kt diff --git a/testData/ast/class/class/publicClass.jav b/j2k/testData/ast/class/class/publicClass.jav similarity index 100% rename from testData/ast/class/class/publicClass.jav rename to j2k/testData/ast/class/class/publicClass.jav diff --git a/testData/ast/class/class/publicClass.kt b/j2k/testData/ast/class/class/publicClass.kt similarity index 100% rename from testData/ast/class/class/publicClass.kt rename to j2k/testData/ast/class/class/publicClass.kt diff --git a/testData/ast/class/class/simpleInheritance.jav b/j2k/testData/ast/class/class/simpleInheritance.jav similarity index 100% rename from testData/ast/class/class/simpleInheritance.jav rename to j2k/testData/ast/class/class/simpleInheritance.jav diff --git a/testData/ast/class/class/simpleInheritance.kt b/j2k/testData/ast/class/class/simpleInheritance.kt similarity index 100% rename from testData/ast/class/class/simpleInheritance.kt rename to j2k/testData/ast/class/class/simpleInheritance.kt diff --git a/testData/ast/class/class/twoStaticMethod.jav b/j2k/testData/ast/class/class/twoStaticMethod.jav similarity index 100% rename from testData/ast/class/class/twoStaticMethod.jav rename to j2k/testData/ast/class/class/twoStaticMethod.jav diff --git a/testData/ast/class/class/twoStaticMethod.kt b/j2k/testData/ast/class/class/twoStaticMethod.kt similarity index 100% rename from testData/ast/class/class/twoStaticMethod.kt rename to j2k/testData/ast/class/class/twoStaticMethod.kt diff --git a/testData/ast/class/file/kt-639.jav b/j2k/testData/ast/class/file/kt-639.jav similarity index 100% rename from testData/ast/class/file/kt-639.jav rename to j2k/testData/ast/class/file/kt-639.jav diff --git a/testData/ast/class/file/kt-639.kt b/j2k/testData/ast/class/file/kt-639.kt similarity index 100% rename from testData/ast/class/file/kt-639.kt rename to j2k/testData/ast/class/file/kt-639.kt diff --git a/testData/ast/class/file/privateInit.jav b/j2k/testData/ast/class/file/privateInit.jav similarity index 100% rename from testData/ast/class/file/privateInit.jav rename to j2k/testData/ast/class/file/privateInit.jav diff --git a/testData/ast/class/file/privateInit.kt b/j2k/testData/ast/class/file/privateInit.kt similarity index 100% rename from testData/ast/class/file/privateInit.kt rename to j2k/testData/ast/class/file/privateInit.kt diff --git a/testData/ast/classExpression/expression/objectClass.jav b/j2k/testData/ast/classExpression/expression/objectClass.jav similarity index 100% rename from testData/ast/classExpression/expression/objectClass.jav rename to j2k/testData/ast/classExpression/expression/objectClass.jav diff --git a/testData/ast/classExpression/expression/objectClass.kt b/j2k/testData/ast/classExpression/expression/objectClass.kt similarity index 100% rename from testData/ast/classExpression/expression/objectClass.kt rename to j2k/testData/ast/classExpression/expression/objectClass.kt diff --git a/testData/ast/classExpression/expression/stringClass.jav b/j2k/testData/ast/classExpression/expression/stringClass.jav similarity index 100% rename from testData/ast/classExpression/expression/stringClass.jav rename to j2k/testData/ast/classExpression/expression/stringClass.jav diff --git a/testData/ast/classExpression/expression/stringClass.kt b/j2k/testData/ast/classExpression/expression/stringClass.kt similarity index 100% rename from testData/ast/classExpression/expression/stringClass.kt rename to j2k/testData/ast/classExpression/expression/stringClass.kt diff --git a/testData/ast/classExpression/statement/complexExample.jav b/j2k/testData/ast/classExpression/statement/complexExample.jav similarity index 100% rename from testData/ast/classExpression/statement/complexExample.jav rename to j2k/testData/ast/classExpression/statement/complexExample.jav diff --git a/testData/ast/classExpression/statement/complexExample.kt b/j2k/testData/ast/classExpression/statement/complexExample.kt similarity index 100% rename from testData/ast/classExpression/statement/complexExample.kt rename to j2k/testData/ast/classExpression/statement/complexExample.kt diff --git a/testData/ast/conditionalExpression/expression/simpleConditionalExpression.jav b/j2k/testData/ast/conditionalExpression/expression/simpleConditionalExpression.jav similarity index 100% rename from testData/ast/conditionalExpression/expression/simpleConditionalExpression.jav rename to j2k/testData/ast/conditionalExpression/expression/simpleConditionalExpression.jav diff --git a/testData/ast/conditionalExpression/expression/simpleConditionalExpression.kt b/j2k/testData/ast/conditionalExpression/expression/simpleConditionalExpression.kt similarity index 100% rename from testData/ast/conditionalExpression/expression/simpleConditionalExpression.kt rename to j2k/testData/ast/conditionalExpression/expression/simpleConditionalExpression.kt diff --git a/testData/ast/constructors/file/allCallsPrimary.jav b/j2k/testData/ast/constructors/file/allCallsPrimary.jav similarity index 100% rename from testData/ast/constructors/file/allCallsPrimary.jav rename to j2k/testData/ast/constructors/file/allCallsPrimary.jav diff --git a/testData/ast/constructors/file/allCallsPrimary.kt b/j2k/testData/ast/constructors/file/allCallsPrimary.kt similarity index 100% rename from testData/ast/constructors/file/allCallsPrimary.kt rename to j2k/testData/ast/constructors/file/allCallsPrimary.kt diff --git a/testData/ast/constructors/file/allCallsPrimary2.jav b/j2k/testData/ast/constructors/file/allCallsPrimary2.jav similarity index 100% rename from testData/ast/constructors/file/allCallsPrimary2.jav rename to j2k/testData/ast/constructors/file/allCallsPrimary2.jav diff --git a/testData/ast/constructors/file/allCallsPrimary2.kt b/j2k/testData/ast/constructors/file/allCallsPrimary2.kt similarity index 100% rename from testData/ast/constructors/file/allCallsPrimary2.kt rename to j2k/testData/ast/constructors/file/allCallsPrimary2.kt diff --git a/testData/ast/constructors/file/customerBuilder.jav b/j2k/testData/ast/constructors/file/customerBuilder.jav similarity index 100% rename from testData/ast/constructors/file/customerBuilder.jav rename to j2k/testData/ast/constructors/file/customerBuilder.jav diff --git a/testData/ast/constructors/file/customerBuilder.kt b/j2k/testData/ast/constructors/file/customerBuilder.kt similarity index 100% rename from testData/ast/constructors/file/customerBuilder.kt rename to j2k/testData/ast/constructors/file/customerBuilder.kt diff --git a/testData/ast/constructors/file/genericIdentifier.jav b/j2k/testData/ast/constructors/file/genericIdentifier.jav similarity index 100% rename from testData/ast/constructors/file/genericIdentifier.jav rename to j2k/testData/ast/constructors/file/genericIdentifier.jav diff --git a/testData/ast/constructors/file/genericIdentifier.kt b/j2k/testData/ast/constructors/file/genericIdentifier.kt similarity index 100% rename from testData/ast/constructors/file/genericIdentifier.kt rename to j2k/testData/ast/constructors/file/genericIdentifier.kt diff --git a/testData/ast/constructors/file/identifier.jav b/j2k/testData/ast/constructors/file/identifier.jav similarity index 100% rename from testData/ast/constructors/file/identifier.jav rename to j2k/testData/ast/constructors/file/identifier.jav diff --git a/testData/ast/constructors/file/identifier.kt b/j2k/testData/ast/constructors/file/identifier.kt similarity index 100% rename from testData/ast/constructors/file/identifier.kt rename to j2k/testData/ast/constructors/file/identifier.kt diff --git a/testData/ast/constructors/file/withManyDefaultParams.jav b/j2k/testData/ast/constructors/file/withManyDefaultParams.jav similarity index 100% rename from testData/ast/constructors/file/withManyDefaultParams.jav rename to j2k/testData/ast/constructors/file/withManyDefaultParams.jav diff --git a/testData/ast/constructors/file/withManyDefaultParams.kt b/j2k/testData/ast/constructors/file/withManyDefaultParams.kt similarity index 100% rename from testData/ast/constructors/file/withManyDefaultParams.kt rename to j2k/testData/ast/constructors/file/withManyDefaultParams.kt diff --git a/testData/ast/continueStatement/statement/continueWithLabel.jav b/j2k/testData/ast/continueStatement/statement/continueWithLabel.jav similarity index 100% rename from testData/ast/continueStatement/statement/continueWithLabel.jav rename to j2k/testData/ast/continueStatement/statement/continueWithLabel.jav diff --git a/testData/ast/continueStatement/statement/continueWithLabel.kt b/j2k/testData/ast/continueStatement/statement/continueWithLabel.kt similarity index 100% rename from testData/ast/continueStatement/statement/continueWithLabel.kt rename to j2k/testData/ast/continueStatement/statement/continueWithLabel.kt diff --git a/testData/ast/continueStatement/statement/continueWithoutLabel.jav b/j2k/testData/ast/continueStatement/statement/continueWithoutLabel.jav similarity index 100% rename from testData/ast/continueStatement/statement/continueWithoutLabel.jav rename to j2k/testData/ast/continueStatement/statement/continueWithoutLabel.jav diff --git a/testData/ast/continueStatement/statement/continueWithoutLabel.kt b/j2k/testData/ast/continueStatement/statement/continueWithoutLabel.kt similarity index 100% rename from testData/ast/continueStatement/statement/continueWithoutLabel.kt rename to j2k/testData/ast/continueStatement/statement/continueWithoutLabel.kt diff --git a/testData/ast/declarationStatement/statement/multiplyFinalIntDeclaration.jav b/j2k/testData/ast/declarationStatement/statement/multiplyFinalIntDeclaration.jav similarity index 100% rename from testData/ast/declarationStatement/statement/multiplyFinalIntDeclaration.jav rename to j2k/testData/ast/declarationStatement/statement/multiplyFinalIntDeclaration.jav diff --git a/testData/ast/declarationStatement/statement/multiplyFinalIntDeclaration.kt b/j2k/testData/ast/declarationStatement/statement/multiplyFinalIntDeclaration.kt similarity index 100% rename from testData/ast/declarationStatement/statement/multiplyFinalIntDeclaration.kt rename to j2k/testData/ast/declarationStatement/statement/multiplyFinalIntDeclaration.kt diff --git a/testData/ast/declarationStatement/statement/multiplyIntDeclaration.jav b/j2k/testData/ast/declarationStatement/statement/multiplyIntDeclaration.jav similarity index 100% rename from testData/ast/declarationStatement/statement/multiplyIntDeclaration.jav rename to j2k/testData/ast/declarationStatement/statement/multiplyIntDeclaration.jav diff --git a/testData/ast/declarationStatement/statement/multiplyIntDeclaration.kt b/j2k/testData/ast/declarationStatement/statement/multiplyIntDeclaration.kt similarity index 100% rename from testData/ast/declarationStatement/statement/multiplyIntDeclaration.kt rename to j2k/testData/ast/declarationStatement/statement/multiplyIntDeclaration.kt diff --git a/testData/ast/declarationStatement/statement/singleFinalIntDeclaration.jav b/j2k/testData/ast/declarationStatement/statement/singleFinalIntDeclaration.jav similarity index 100% rename from testData/ast/declarationStatement/statement/singleFinalIntDeclaration.jav rename to j2k/testData/ast/declarationStatement/statement/singleFinalIntDeclaration.jav diff --git a/testData/ast/declarationStatement/statement/singleFinalIntDeclaration.kt b/j2k/testData/ast/declarationStatement/statement/singleFinalIntDeclaration.kt similarity index 100% rename from testData/ast/declarationStatement/statement/singleFinalIntDeclaration.kt rename to j2k/testData/ast/declarationStatement/statement/singleFinalIntDeclaration.kt diff --git a/testData/ast/declarationStatement/statement/singleFinalStringDeclaration.jav b/j2k/testData/ast/declarationStatement/statement/singleFinalStringDeclaration.jav similarity index 100% rename from testData/ast/declarationStatement/statement/singleFinalStringDeclaration.jav rename to j2k/testData/ast/declarationStatement/statement/singleFinalStringDeclaration.jav diff --git a/testData/ast/declarationStatement/statement/singleFinalStringDeclaration.kt b/j2k/testData/ast/declarationStatement/statement/singleFinalStringDeclaration.kt similarity index 100% rename from testData/ast/declarationStatement/statement/singleFinalStringDeclaration.kt rename to j2k/testData/ast/declarationStatement/statement/singleFinalStringDeclaration.kt diff --git a/testData/ast/declarationStatement/statement/singleIntDeclaration.jav b/j2k/testData/ast/declarationStatement/statement/singleIntDeclaration.jav similarity index 100% rename from testData/ast/declarationStatement/statement/singleIntDeclaration.jav rename to j2k/testData/ast/declarationStatement/statement/singleIntDeclaration.jav diff --git a/testData/ast/declarationStatement/statement/singleIntDeclaration.kt b/j2k/testData/ast/declarationStatement/statement/singleIntDeclaration.kt similarity index 100% rename from testData/ast/declarationStatement/statement/singleIntDeclaration.kt rename to j2k/testData/ast/declarationStatement/statement/singleIntDeclaration.kt diff --git a/testData/ast/declarationStatement/statement/singleStringDeclaration.jav b/j2k/testData/ast/declarationStatement/statement/singleStringDeclaration.jav similarity index 100% rename from testData/ast/declarationStatement/statement/singleStringDeclaration.jav rename to j2k/testData/ast/declarationStatement/statement/singleStringDeclaration.jav diff --git a/testData/ast/declarationStatement/statement/singleStringDeclaration.kt b/j2k/testData/ast/declarationStatement/statement/singleStringDeclaration.kt similarity index 100% rename from testData/ast/declarationStatement/statement/singleStringDeclaration.kt rename to j2k/testData/ast/declarationStatement/statement/singleStringDeclaration.kt diff --git a/testData/ast/doWhileStatement/statement/whileWithBlock.jav b/j2k/testData/ast/doWhileStatement/statement/whileWithBlock.jav similarity index 100% rename from testData/ast/doWhileStatement/statement/whileWithBlock.jav rename to j2k/testData/ast/doWhileStatement/statement/whileWithBlock.jav diff --git a/testData/ast/doWhileStatement/statement/whileWithBlock.kt b/j2k/testData/ast/doWhileStatement/statement/whileWithBlock.kt similarity index 100% rename from testData/ast/doWhileStatement/statement/whileWithBlock.kt rename to j2k/testData/ast/doWhileStatement/statement/whileWithBlock.kt diff --git a/testData/ast/doWhileStatement/statement/whileWithEmptyBlock.jav b/j2k/testData/ast/doWhileStatement/statement/whileWithEmptyBlock.jav similarity index 100% rename from testData/ast/doWhileStatement/statement/whileWithEmptyBlock.jav rename to j2k/testData/ast/doWhileStatement/statement/whileWithEmptyBlock.jav diff --git a/testData/ast/doWhileStatement/statement/whileWithEmptyBlock.kt b/j2k/testData/ast/doWhileStatement/statement/whileWithEmptyBlock.kt similarity index 100% rename from testData/ast/doWhileStatement/statement/whileWithEmptyBlock.kt rename to j2k/testData/ast/doWhileStatement/statement/whileWithEmptyBlock.kt diff --git a/testData/ast/doWhileStatement/statement/whileWithExpression.jav b/j2k/testData/ast/doWhileStatement/statement/whileWithExpression.jav similarity index 100% rename from testData/ast/doWhileStatement/statement/whileWithExpression.jav rename to j2k/testData/ast/doWhileStatement/statement/whileWithExpression.jav diff --git a/testData/ast/doWhileStatement/statement/whileWithExpression.kt b/j2k/testData/ast/doWhileStatement/statement/whileWithExpression.kt similarity index 100% rename from testData/ast/doWhileStatement/statement/whileWithExpression.kt rename to j2k/testData/ast/doWhileStatement/statement/whileWithExpression.kt diff --git a/testData/ast/doWhileStatement/statement/whileWithReturn.jav b/j2k/testData/ast/doWhileStatement/statement/whileWithReturn.jav similarity index 100% rename from testData/ast/doWhileStatement/statement/whileWithReturn.jav rename to j2k/testData/ast/doWhileStatement/statement/whileWithReturn.jav diff --git a/testData/ast/doWhileStatement/statement/whileWithReturn.kt b/j2k/testData/ast/doWhileStatement/statement/whileWithReturn.kt similarity index 100% rename from testData/ast/doWhileStatement/statement/whileWithReturn.kt rename to j2k/testData/ast/doWhileStatement/statement/whileWithReturn.kt diff --git a/testData/ast/enum/class/colorEnum.jav b/j2k/testData/ast/enum/class/colorEnum.jav similarity index 100% rename from testData/ast/enum/class/colorEnum.jav rename to j2k/testData/ast/enum/class/colorEnum.jav diff --git a/testData/ast/enum/class/colorEnum.kt b/j2k/testData/ast/enum/class/colorEnum.kt similarity index 100% rename from testData/ast/enum/class/colorEnum.kt rename to j2k/testData/ast/enum/class/colorEnum.kt diff --git a/testData/ast/enum/class/emptyEnum.jav b/j2k/testData/ast/enum/class/emptyEnum.jav similarity index 100% rename from testData/ast/enum/class/emptyEnum.jav rename to j2k/testData/ast/enum/class/emptyEnum.jav diff --git a/testData/ast/enum/class/emptyEnum.kt b/j2k/testData/ast/enum/class/emptyEnum.kt similarity index 100% rename from testData/ast/enum/class/emptyEnum.kt rename to j2k/testData/ast/enum/class/emptyEnum.kt diff --git a/testData/ast/enum/class/enumImplementsOneInterface.jav b/j2k/testData/ast/enum/class/enumImplementsOneInterface.jav similarity index 100% rename from testData/ast/enum/class/enumImplementsOneInterface.jav rename to j2k/testData/ast/enum/class/enumImplementsOneInterface.jav diff --git a/testData/ast/enum/class/enumImplementsOneInterface.kt b/j2k/testData/ast/enum/class/enumImplementsOneInterface.kt similarity index 100% rename from testData/ast/enum/class/enumImplementsOneInterface.kt rename to j2k/testData/ast/enum/class/enumImplementsOneInterface.kt diff --git a/testData/ast/enum/class/enumImplementsSeveralInterfaces.jav b/j2k/testData/ast/enum/class/enumImplementsSeveralInterfaces.jav similarity index 100% rename from testData/ast/enum/class/enumImplementsSeveralInterfaces.jav rename to j2k/testData/ast/enum/class/enumImplementsSeveralInterfaces.jav diff --git a/testData/ast/enum/class/enumImplementsSeveralInterfaces.kt b/j2k/testData/ast/enum/class/enumImplementsSeveralInterfaces.kt similarity index 100% rename from testData/ast/enum/class/enumImplementsSeveralInterfaces.kt rename to j2k/testData/ast/enum/class/enumImplementsSeveralInterfaces.kt diff --git a/testData/ast/enum/class/enumWithNameField.jav b/j2k/testData/ast/enum/class/enumWithNameField.jav similarity index 100% rename from testData/ast/enum/class/enumWithNameField.jav rename to j2k/testData/ast/enum/class/enumWithNameField.jav diff --git a/testData/ast/enum/class/enumWithNameField.kt b/j2k/testData/ast/enum/class/enumWithNameField.kt similarity index 100% rename from testData/ast/enum/class/enumWithNameField.kt rename to j2k/testData/ast/enum/class/enumWithNameField.kt diff --git a/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.jav b/j2k/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.jav similarity index 100% rename from testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.jav rename to j2k/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.jav diff --git a/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt b/j2k/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt similarity index 100% rename from testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt rename to j2k/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt diff --git a/testData/ast/enum/class/internalEnum.jav b/j2k/testData/ast/enum/class/internalEnum.jav similarity index 100% rename from testData/ast/enum/class/internalEnum.jav rename to j2k/testData/ast/enum/class/internalEnum.jav diff --git a/testData/ast/enum/class/internalEnum.kt b/j2k/testData/ast/enum/class/internalEnum.kt similarity index 100% rename from testData/ast/enum/class/internalEnum.kt rename to j2k/testData/ast/enum/class/internalEnum.kt diff --git a/testData/ast/enum/class/overrideToString.jav b/j2k/testData/ast/enum/class/overrideToString.jav similarity index 100% rename from testData/ast/enum/class/overrideToString.jav rename to j2k/testData/ast/enum/class/overrideToString.jav diff --git a/testData/ast/enum/class/overrideToString.kt b/j2k/testData/ast/enum/class/overrideToString.kt similarity index 100% rename from testData/ast/enum/class/overrideToString.kt rename to j2k/testData/ast/enum/class/overrideToString.kt diff --git a/testData/ast/enum/class/primaryPrivateConstructor.jav b/j2k/testData/ast/enum/class/primaryPrivateConstructor.jav similarity index 100% rename from testData/ast/enum/class/primaryPrivateConstructor.jav rename to j2k/testData/ast/enum/class/primaryPrivateConstructor.jav diff --git a/testData/ast/enum/class/primaryPrivateConstructor.kt b/j2k/testData/ast/enum/class/primaryPrivateConstructor.kt similarity index 100% rename from testData/ast/enum/class/primaryPrivateConstructor.kt rename to j2k/testData/ast/enum/class/primaryPrivateConstructor.kt diff --git a/testData/ast/enum/class/privateEnum.jav b/j2k/testData/ast/enum/class/privateEnum.jav similarity index 100% rename from testData/ast/enum/class/privateEnum.jav rename to j2k/testData/ast/enum/class/privateEnum.jav diff --git a/testData/ast/enum/class/privateEnum.kt b/j2k/testData/ast/enum/class/privateEnum.kt similarity index 100% rename from testData/ast/enum/class/privateEnum.kt rename to j2k/testData/ast/enum/class/privateEnum.kt diff --git a/testData/ast/enum/class/protectedEnum.jav b/j2k/testData/ast/enum/class/protectedEnum.jav similarity index 100% rename from testData/ast/enum/class/protectedEnum.jav rename to j2k/testData/ast/enum/class/protectedEnum.jav diff --git a/testData/ast/enum/class/protectedEnum.kt b/j2k/testData/ast/enum/class/protectedEnum.kt similarity index 100% rename from testData/ast/enum/class/protectedEnum.kt rename to j2k/testData/ast/enum/class/protectedEnum.kt diff --git a/testData/ast/enum/class/publicEnum.jav b/j2k/testData/ast/enum/class/publicEnum.jav similarity index 100% rename from testData/ast/enum/class/publicEnum.jav rename to j2k/testData/ast/enum/class/publicEnum.jav diff --git a/testData/ast/enum/class/publicEnum.kt b/j2k/testData/ast/enum/class/publicEnum.kt similarity index 100% rename from testData/ast/enum/class/publicEnum.kt rename to j2k/testData/ast/enum/class/publicEnum.kt diff --git a/testData/ast/enum/class/runnableImplementation.jav b/j2k/testData/ast/enum/class/runnableImplementation.jav similarity index 100% rename from testData/ast/enum/class/runnableImplementation.jav rename to j2k/testData/ast/enum/class/runnableImplementation.jav diff --git a/testData/ast/enum/class/runnableImplementation.kt b/j2k/testData/ast/enum/class/runnableImplementation.kt similarity index 100% rename from testData/ast/enum/class/runnableImplementation.kt rename to j2k/testData/ast/enum/class/runnableImplementation.kt diff --git a/testData/ast/enum/class/typeSafeEnum.jav b/j2k/testData/ast/enum/class/typeSafeEnum.jav similarity index 100% rename from testData/ast/enum/class/typeSafeEnum.jav rename to j2k/testData/ast/enum/class/typeSafeEnum.jav diff --git a/testData/ast/enum/class/typeSafeEnum.kt b/j2k/testData/ast/enum/class/typeSafeEnum.kt similarity index 100% rename from testData/ast/enum/class/typeSafeEnum.kt rename to j2k/testData/ast/enum/class/typeSafeEnum.kt diff --git a/testData/ast/field/file/classChildExtendsBase.jav b/j2k/testData/ast/field/file/classChildExtendsBase.jav similarity index 100% rename from testData/ast/field/file/classChildExtendsBase.jav rename to j2k/testData/ast/field/file/classChildExtendsBase.jav diff --git a/testData/ast/field/file/classChildExtendsBase.kt b/j2k/testData/ast/field/file/classChildExtendsBase.kt similarity index 100% rename from testData/ast/field/file/classChildExtendsBase.kt rename to j2k/testData/ast/field/file/classChildExtendsBase.kt diff --git a/testData/ast/field/file/internalField.jav b/j2k/testData/ast/field/file/internalField.jav similarity index 100% rename from testData/ast/field/file/internalField.jav rename to j2k/testData/ast/field/file/internalField.jav diff --git a/testData/ast/field/file/internalField.kt b/j2k/testData/ast/field/file/internalField.kt similarity index 100% rename from testData/ast/field/file/internalField.kt rename to j2k/testData/ast/field/file/internalField.kt diff --git a/testData/ast/field/file/privateField.jav b/j2k/testData/ast/field/file/privateField.jav similarity index 100% rename from testData/ast/field/file/privateField.jav rename to j2k/testData/ast/field/file/privateField.jav diff --git a/testData/ast/field/file/privateField.kt b/j2k/testData/ast/field/file/privateField.kt similarity index 100% rename from testData/ast/field/file/privateField.kt rename to j2k/testData/ast/field/file/privateField.kt diff --git a/testData/ast/field/file/protectedField.jav b/j2k/testData/ast/field/file/protectedField.jav similarity index 100% rename from testData/ast/field/file/protectedField.jav rename to j2k/testData/ast/field/file/protectedField.jav diff --git a/testData/ast/field/file/protectedField.kt b/j2k/testData/ast/field/file/protectedField.kt similarity index 100% rename from testData/ast/field/file/protectedField.kt rename to j2k/testData/ast/field/file/protectedField.kt diff --git a/testData/ast/field/file/publicField.jav b/j2k/testData/ast/field/file/publicField.jav similarity index 100% rename from testData/ast/field/file/publicField.jav rename to j2k/testData/ast/field/file/publicField.jav diff --git a/testData/ast/field/file/publicField.kt b/j2k/testData/ast/field/file/publicField.kt similarity index 100% rename from testData/ast/field/file/publicField.kt rename to j2k/testData/ast/field/file/publicField.kt diff --git a/testData/ast/field/file/valWithInit.jav b/j2k/testData/ast/field/file/valWithInit.jav similarity index 100% rename from testData/ast/field/file/valWithInit.jav rename to j2k/testData/ast/field/file/valWithInit.jav diff --git a/testData/ast/field/file/valWithInit.kt b/j2k/testData/ast/field/file/valWithInit.kt similarity index 100% rename from testData/ast/field/file/valWithInit.kt rename to j2k/testData/ast/field/file/valWithInit.kt diff --git a/testData/ast/field/file/varWithInit.jav b/j2k/testData/ast/field/file/varWithInit.jav similarity index 100% rename from testData/ast/field/file/varWithInit.jav rename to j2k/testData/ast/field/file/varWithInit.jav diff --git a/testData/ast/field/file/varWithInit.kt b/j2k/testData/ast/field/file/varWithInit.kt similarity index 100% rename from testData/ast/field/file/varWithInit.kt rename to j2k/testData/ast/field/file/varWithInit.kt diff --git a/testData/ast/field/file/varWithoutInit.jav b/j2k/testData/ast/field/file/varWithoutInit.jav similarity index 100% rename from testData/ast/field/file/varWithoutInit.jav rename to j2k/testData/ast/field/file/varWithoutInit.jav diff --git a/testData/ast/field/file/varWithoutInit.kt b/j2k/testData/ast/field/file/varWithoutInit.kt similarity index 100% rename from testData/ast/field/file/varWithoutInit.kt rename to j2k/testData/ast/field/file/varWithoutInit.kt diff --git a/testData/ast/file/comp/intNullability.jav b/j2k/testData/ast/file/comp/intNullability.jav similarity index 100% rename from testData/ast/file/comp/intNullability.jav rename to j2k/testData/ast/file/comp/intNullability.jav diff --git a/testData/ast/file/comp/intNullability.kt b/j2k/testData/ast/file/comp/intNullability.kt similarity index 100% rename from testData/ast/file/comp/intNullability.kt rename to j2k/testData/ast/file/comp/intNullability.kt diff --git a/testData/ast/file/file/packageWithClass.jav b/j2k/testData/ast/file/file/packageWithClass.jav similarity index 100% rename from testData/ast/file/file/packageWithClass.jav rename to j2k/testData/ast/file/file/packageWithClass.jav diff --git a/testData/ast/file/file/packageWithClass.kt b/j2k/testData/ast/file/file/packageWithClass.kt similarity index 100% rename from testData/ast/file/file/packageWithClass.kt rename to j2k/testData/ast/file/file/packageWithClass.kt diff --git a/testData/ast/file/file/packageWithClasses.jav b/j2k/testData/ast/file/file/packageWithClasses.jav similarity index 100% rename from testData/ast/file/file/packageWithClasses.jav rename to j2k/testData/ast/file/file/packageWithClasses.jav diff --git a/testData/ast/file/file/packageWithClasses.kt b/j2k/testData/ast/file/file/packageWithClasses.kt similarity index 100% rename from testData/ast/file/file/packageWithClasses.kt rename to j2k/testData/ast/file/file/packageWithClasses.kt diff --git a/testData/ast/file/file/packageWithImports.jav b/j2k/testData/ast/file/file/packageWithImports.jav similarity index 100% rename from testData/ast/file/file/packageWithImports.jav rename to j2k/testData/ast/file/file/packageWithImports.jav diff --git a/testData/ast/file/file/packageWithImports.kt b/j2k/testData/ast/file/file/packageWithImports.kt similarity index 100% rename from testData/ast/file/file/packageWithImports.kt rename to j2k/testData/ast/file/file/packageWithImports.kt diff --git a/testData/ast/file/file/packageWithMixedImports.jav b/j2k/testData/ast/file/file/packageWithMixedImports.jav similarity index 100% rename from testData/ast/file/file/packageWithMixedImports.jav rename to j2k/testData/ast/file/file/packageWithMixedImports.jav diff --git a/testData/ast/file/file/packageWithMixedImports.kt b/j2k/testData/ast/file/file/packageWithMixedImports.kt similarity index 100% rename from testData/ast/file/file/packageWithMixedImports.kt rename to j2k/testData/ast/file/file/packageWithMixedImports.kt diff --git a/testData/ast/file/file/packageWithOpenClass.jav b/j2k/testData/ast/file/file/packageWithOpenClass.jav similarity index 100% rename from testData/ast/file/file/packageWithOpenClass.jav rename to j2k/testData/ast/file/file/packageWithOpenClass.jav diff --git a/testData/ast/file/file/packageWithOpenClass.kt b/j2k/testData/ast/file/file/packageWithOpenClass.kt similarity index 100% rename from testData/ast/file/file/packageWithOpenClass.kt rename to j2k/testData/ast/file/file/packageWithOpenClass.kt diff --git a/testData/ast/file/file/packageWithStaticImports.jav b/j2k/testData/ast/file/file/packageWithStaticImports.jav similarity index 100% rename from testData/ast/file/file/packageWithStaticImports.jav rename to j2k/testData/ast/file/file/packageWithStaticImports.jav diff --git a/testData/ast/file/file/packageWithStaticImports.kt b/j2k/testData/ast/file/file/packageWithStaticImports.kt similarity index 100% rename from testData/ast/file/file/packageWithStaticImports.kt rename to j2k/testData/ast/file/file/packageWithStaticImports.kt diff --git a/testData/ast/for/statement/commonCaseForTest.jav b/j2k/testData/ast/for/statement/commonCaseForTest.jav similarity index 100% rename from testData/ast/for/statement/commonCaseForTest.jav rename to j2k/testData/ast/for/statement/commonCaseForTest.jav diff --git a/testData/ast/for/statement/commonCaseForTest.kt b/j2k/testData/ast/for/statement/commonCaseForTest.kt similarity index 100% rename from testData/ast/for/statement/commonCaseForTest.kt rename to j2k/testData/ast/for/statement/commonCaseForTest.kt diff --git a/testData/ast/for/statement/forRangeWithLE.jav b/j2k/testData/ast/for/statement/forRangeWithLE.jav similarity index 100% rename from testData/ast/for/statement/forRangeWithLE.jav rename to j2k/testData/ast/for/statement/forRangeWithLE.jav diff --git a/testData/ast/for/statement/forRangeWithLE.kt b/j2k/testData/ast/for/statement/forRangeWithLE.kt similarity index 100% rename from testData/ast/for/statement/forRangeWithLE.kt rename to j2k/testData/ast/for/statement/forRangeWithLE.kt diff --git a/testData/ast/for/statement/forRangeWithLT.jav b/j2k/testData/ast/for/statement/forRangeWithLT.jav similarity index 100% rename from testData/ast/for/statement/forRangeWithLT.jav rename to j2k/testData/ast/for/statement/forRangeWithLT.jav diff --git a/testData/ast/for/statement/forRangeWithLT.kt b/j2k/testData/ast/for/statement/forRangeWithLT.kt similarity index 100% rename from testData/ast/for/statement/forRangeWithLT.kt rename to j2k/testData/ast/for/statement/forRangeWithLT.kt diff --git a/testData/ast/for/statement/forWithBlock.jav b/j2k/testData/ast/for/statement/forWithBlock.jav similarity index 100% rename from testData/ast/for/statement/forWithBlock.jav rename to j2k/testData/ast/for/statement/forWithBlock.jav diff --git a/testData/ast/for/statement/forWithBlock.kt b/j2k/testData/ast/for/statement/forWithBlock.kt similarity index 100% rename from testData/ast/for/statement/forWithBlock.kt rename to j2k/testData/ast/for/statement/forWithBlock.kt diff --git a/testData/ast/for/statement/forWithBlockAndDoubleUpdate.jav b/j2k/testData/ast/for/statement/forWithBlockAndDoubleUpdate.jav similarity index 100% rename from testData/ast/for/statement/forWithBlockAndDoubleUpdate.jav rename to j2k/testData/ast/for/statement/forWithBlockAndDoubleUpdate.jav diff --git a/testData/ast/for/statement/forWithBlockAndDoubleUpdate.kt b/j2k/testData/ast/for/statement/forWithBlockAndDoubleUpdate.kt similarity index 100% rename from testData/ast/for/statement/forWithBlockAndDoubleUpdate.kt rename to j2k/testData/ast/for/statement/forWithBlockAndDoubleUpdate.kt diff --git a/testData/ast/for/statement/forWithEmptyBlock.jav b/j2k/testData/ast/for/statement/forWithEmptyBlock.jav similarity index 100% rename from testData/ast/for/statement/forWithEmptyBlock.jav rename to j2k/testData/ast/for/statement/forWithEmptyBlock.jav diff --git a/testData/ast/for/statement/forWithEmptyBlock.kt b/j2k/testData/ast/for/statement/forWithEmptyBlock.kt similarity index 100% rename from testData/ast/for/statement/forWithEmptyBlock.kt rename to j2k/testData/ast/for/statement/forWithEmptyBlock.kt diff --git a/testData/ast/for/statement/forWithExpression.jav b/j2k/testData/ast/for/statement/forWithExpression.jav similarity index 100% rename from testData/ast/for/statement/forWithExpression.jav rename to j2k/testData/ast/for/statement/forWithExpression.jav diff --git a/testData/ast/for/statement/forWithExpression.kt b/j2k/testData/ast/for/statement/forWithExpression.kt similarity index 100% rename from testData/ast/for/statement/forWithExpression.kt rename to j2k/testData/ast/for/statement/forWithExpression.kt diff --git a/testData/ast/for/statement/forWithReturn.jav b/j2k/testData/ast/for/statement/forWithReturn.jav similarity index 100% rename from testData/ast/for/statement/forWithReturn.jav rename to j2k/testData/ast/for/statement/forWithReturn.jav diff --git a/testData/ast/for/statement/forWithReturn.kt b/j2k/testData/ast/for/statement/forWithReturn.kt similarity index 100% rename from testData/ast/for/statement/forWithReturn.kt rename to j2k/testData/ast/for/statement/forWithReturn.kt diff --git a/testData/ast/foreachStatement/statement/enhancedForWithBlock.jav b/j2k/testData/ast/foreachStatement/statement/enhancedForWithBlock.jav similarity index 100% rename from testData/ast/foreachStatement/statement/enhancedForWithBlock.jav rename to j2k/testData/ast/foreachStatement/statement/enhancedForWithBlock.jav diff --git a/testData/ast/foreachStatement/statement/enhancedForWithBlock.kt b/j2k/testData/ast/foreachStatement/statement/enhancedForWithBlock.kt similarity index 100% rename from testData/ast/foreachStatement/statement/enhancedForWithBlock.kt rename to j2k/testData/ast/foreachStatement/statement/enhancedForWithBlock.kt diff --git a/testData/ast/foreachStatement/statement/enhancedForWithEmptyBlock.jav b/j2k/testData/ast/foreachStatement/statement/enhancedForWithEmptyBlock.jav similarity index 100% rename from testData/ast/foreachStatement/statement/enhancedForWithEmptyBlock.jav rename to j2k/testData/ast/foreachStatement/statement/enhancedForWithEmptyBlock.jav diff --git a/testData/ast/foreachStatement/statement/enhancedForWithEmptyBlock.kt b/j2k/testData/ast/foreachStatement/statement/enhancedForWithEmptyBlock.kt similarity index 100% rename from testData/ast/foreachStatement/statement/enhancedForWithEmptyBlock.kt rename to j2k/testData/ast/foreachStatement/statement/enhancedForWithEmptyBlock.kt diff --git a/testData/ast/foreachStatement/statement/enhancedForWithExpression.jav b/j2k/testData/ast/foreachStatement/statement/enhancedForWithExpression.jav similarity index 100% rename from testData/ast/foreachStatement/statement/enhancedForWithExpression.jav rename to j2k/testData/ast/foreachStatement/statement/enhancedForWithExpression.jav diff --git a/testData/ast/foreachStatement/statement/enhancedForWithExpression.kt b/j2k/testData/ast/foreachStatement/statement/enhancedForWithExpression.kt similarity index 100% rename from testData/ast/foreachStatement/statement/enhancedForWithExpression.kt rename to j2k/testData/ast/foreachStatement/statement/enhancedForWithExpression.kt diff --git a/testData/ast/foreachStatement/statement/enhancedForWithReturn.jav b/j2k/testData/ast/foreachStatement/statement/enhancedForWithReturn.jav similarity index 100% rename from testData/ast/foreachStatement/statement/enhancedForWithReturn.jav rename to j2k/testData/ast/foreachStatement/statement/enhancedForWithReturn.jav diff --git a/testData/ast/foreachStatement/statement/enhancedForWithReturn.kt b/j2k/testData/ast/foreachStatement/statement/enhancedForWithReturn.kt similarity index 100% rename from testData/ast/foreachStatement/statement/enhancedForWithReturn.kt rename to j2k/testData/ast/foreachStatement/statement/enhancedForWithReturn.kt diff --git a/testData/ast/function/file/extendsBaseWhichExtendsObject.jav b/j2k/testData/ast/function/file/extendsBaseWhichExtendsObject.jav similarity index 100% rename from testData/ast/function/file/extendsBaseWhichExtendsObject.jav rename to j2k/testData/ast/function/file/extendsBaseWhichExtendsObject.jav diff --git a/testData/ast/function/file/extendsBaseWhichExtendsObject.kt b/j2k/testData/ast/function/file/extendsBaseWhichExtendsObject.kt similarity index 100% rename from testData/ast/function/file/extendsBaseWhichExtendsObject.kt rename to j2k/testData/ast/function/file/extendsBaseWhichExtendsObject.kt diff --git a/testData/ast/function/file/functionInFinalClass.jav b/j2k/testData/ast/function/file/functionInFinalClass.jav similarity index 100% rename from testData/ast/function/file/functionInFinalClass.jav rename to j2k/testData/ast/function/file/functionInFinalClass.jav diff --git a/testData/ast/function/file/functionInFinalClass.kt b/j2k/testData/ast/function/file/functionInFinalClass.kt similarity index 100% rename from testData/ast/function/file/functionInFinalClass.kt rename to j2k/testData/ast/function/file/functionInFinalClass.kt diff --git a/testData/ast/function/file/override.jav b/j2k/testData/ast/function/file/override.jav similarity index 100% rename from testData/ast/function/file/override.jav rename to j2k/testData/ast/function/file/override.jav diff --git a/testData/ast/function/file/override.kt b/j2k/testData/ast/function/file/override.kt similarity index 100% rename from testData/ast/function/file/override.kt rename to j2k/testData/ast/function/file/override.kt diff --git a/testData/ast/function/file/overrideAndOpen.jav b/j2k/testData/ast/function/file/overrideAndOpen.jav similarity index 100% rename from testData/ast/function/file/overrideAndOpen.jav rename to j2k/testData/ast/function/file/overrideAndOpen.jav diff --git a/testData/ast/function/file/overrideAndOpen.kt b/j2k/testData/ast/function/file/overrideAndOpen.kt similarity index 100% rename from testData/ast/function/file/overrideAndOpen.kt rename to j2k/testData/ast/function/file/overrideAndOpen.kt diff --git a/testData/ast/function/file/overrideObject.jav b/j2k/testData/ast/function/file/overrideObject.jav similarity index 100% rename from testData/ast/function/file/overrideObject.jav rename to j2k/testData/ast/function/file/overrideObject.jav diff --git a/testData/ast/function/file/overrideObject.kt b/j2k/testData/ast/function/file/overrideObject.kt similarity index 100% rename from testData/ast/function/file/overrideObject.kt rename to j2k/testData/ast/function/file/overrideObject.kt diff --git a/testData/ast/function/file/varVararg.jav b/j2k/testData/ast/function/file/varVararg.jav similarity index 100% rename from testData/ast/function/file/varVararg.jav rename to j2k/testData/ast/function/file/varVararg.jav diff --git a/testData/ast/function/file/varVararg.kt b/j2k/testData/ast/function/file/varVararg.kt similarity index 100% rename from testData/ast/function/file/varVararg.kt rename to j2k/testData/ast/function/file/varVararg.kt diff --git a/testData/ast/function/file/writableParameter.jav b/j2k/testData/ast/function/file/writableParameter.jav similarity index 100% rename from testData/ast/function/file/writableParameter.jav rename to j2k/testData/ast/function/file/writableParameter.jav diff --git a/testData/ast/function/file/writableParameter.kt b/j2k/testData/ast/function/file/writableParameter.kt similarity index 100% rename from testData/ast/function/file/writableParameter.kt rename to j2k/testData/ast/function/file/writableParameter.kt diff --git a/testData/ast/function/method/abstractMethod.jav b/j2k/testData/ast/function/method/abstractMethod.jav similarity index 100% rename from testData/ast/function/method/abstractMethod.jav rename to j2k/testData/ast/function/method/abstractMethod.jav diff --git a/testData/ast/function/method/abstractMethod.kt b/j2k/testData/ast/function/method/abstractMethod.kt similarity index 100% rename from testData/ast/function/method/abstractMethod.kt rename to j2k/testData/ast/function/method/abstractMethod.kt diff --git a/testData/ast/function/method/classGenericParam.jav b/j2k/testData/ast/function/method/classGenericParam.jav similarity index 100% rename from testData/ast/function/method/classGenericParam.jav rename to j2k/testData/ast/function/method/classGenericParam.jav diff --git a/testData/ast/function/method/classGenericParam.kt b/j2k/testData/ast/function/method/classGenericParam.kt similarity index 100% rename from testData/ast/function/method/classGenericParam.kt rename to j2k/testData/ast/function/method/classGenericParam.kt diff --git a/testData/ast/function/method/emptyVoidMethod.jav b/j2k/testData/ast/function/method/emptyVoidMethod.jav similarity index 100% rename from testData/ast/function/method/emptyVoidMethod.jav rename to j2k/testData/ast/function/method/emptyVoidMethod.jav diff --git a/testData/ast/function/method/emptyVoidMethod.kt b/j2k/testData/ast/function/method/emptyVoidMethod.kt similarity index 100% rename from testData/ast/function/method/emptyVoidMethod.kt rename to j2k/testData/ast/function/method/emptyVoidMethod.kt diff --git a/testData/ast/function/method/final.jav b/j2k/testData/ast/function/method/final.jav similarity index 100% rename from testData/ast/function/method/final.jav rename to j2k/testData/ast/function/method/final.jav diff --git a/testData/ast/function/method/final.kt b/j2k/testData/ast/function/method/final.kt similarity index 100% rename from testData/ast/function/method/final.kt rename to j2k/testData/ast/function/method/final.kt diff --git a/testData/ast/function/method/internal.jav b/j2k/testData/ast/function/method/internal.jav similarity index 100% rename from testData/ast/function/method/internal.jav rename to j2k/testData/ast/function/method/internal.jav diff --git a/testData/ast/function/method/internal.kt b/j2k/testData/ast/function/method/internal.kt similarity index 100% rename from testData/ast/function/method/internal.kt rename to j2k/testData/ast/function/method/internal.kt diff --git a/testData/ast/function/method/main.jav b/j2k/testData/ast/function/method/main.jav similarity index 100% rename from testData/ast/function/method/main.jav rename to j2k/testData/ast/function/method/main.jav diff --git a/testData/ast/function/method/main.kt b/j2k/testData/ast/function/method/main.kt similarity index 100% rename from testData/ast/function/method/main.kt rename to j2k/testData/ast/function/method/main.kt diff --git a/testData/ast/function/method/methodClassType.jav b/j2k/testData/ast/function/method/methodClassType.jav similarity index 100% rename from testData/ast/function/method/methodClassType.jav rename to j2k/testData/ast/function/method/methodClassType.jav diff --git a/testData/ast/function/method/methodClassType.kt b/j2k/testData/ast/function/method/methodClassType.kt similarity index 100% rename from testData/ast/function/method/methodClassType.kt rename to j2k/testData/ast/function/method/methodClassType.kt diff --git a/testData/ast/function/method/methodPrimitiveType.jav b/j2k/testData/ast/function/method/methodPrimitiveType.jav similarity index 100% rename from testData/ast/function/method/methodPrimitiveType.jav rename to j2k/testData/ast/function/method/methodPrimitiveType.jav diff --git a/testData/ast/function/method/methodPrimitiveType.kt b/j2k/testData/ast/function/method/methodPrimitiveType.kt similarity index 100% rename from testData/ast/function/method/methodPrimitiveType.kt rename to j2k/testData/ast/function/method/methodPrimitiveType.kt diff --git a/testData/ast/function/method/methodPrimitiveType2.jav b/j2k/testData/ast/function/method/methodPrimitiveType2.jav similarity index 100% rename from testData/ast/function/method/methodPrimitiveType2.jav rename to j2k/testData/ast/function/method/methodPrimitiveType2.jav diff --git a/testData/ast/function/method/methodPrimitiveType2.kt b/j2k/testData/ast/function/method/methodPrimitiveType2.kt similarity index 100% rename from testData/ast/function/method/methodPrimitiveType2.kt rename to j2k/testData/ast/function/method/methodPrimitiveType2.kt diff --git a/testData/ast/function/method/methodWithReturnStatement.jav b/j2k/testData/ast/function/method/methodWithReturnStatement.jav similarity index 100% rename from testData/ast/function/method/methodWithReturnStatement.jav rename to j2k/testData/ast/function/method/methodWithReturnStatement.jav diff --git a/testData/ast/function/method/methodWithReturnStatement.kt b/j2k/testData/ast/function/method/methodWithReturnStatement.kt similarity index 100% rename from testData/ast/function/method/methodWithReturnStatement.kt rename to j2k/testData/ast/function/method/methodWithReturnStatement.kt diff --git a/testData/ast/function/method/open.jav b/j2k/testData/ast/function/method/open.jav similarity index 100% rename from testData/ast/function/method/open.jav rename to j2k/testData/ast/function/method/open.jav diff --git a/testData/ast/function/method/open.kt b/j2k/testData/ast/function/method/open.kt similarity index 100% rename from testData/ast/function/method/open.kt rename to j2k/testData/ast/function/method/open.kt diff --git a/testData/ast/function/method/ownGenericParam.jav b/j2k/testData/ast/function/method/ownGenericParam.jav similarity index 100% rename from testData/ast/function/method/ownGenericParam.jav rename to j2k/testData/ast/function/method/ownGenericParam.jav diff --git a/testData/ast/function/method/ownGenericParam.kt b/j2k/testData/ast/function/method/ownGenericParam.kt similarity index 100% rename from testData/ast/function/method/ownGenericParam.kt rename to j2k/testData/ast/function/method/ownGenericParam.kt diff --git a/testData/ast/function/method/ownSeveralGenericParams.jav b/j2k/testData/ast/function/method/ownSeveralGenericParams.jav similarity index 100% rename from testData/ast/function/method/ownSeveralGenericParams.jav rename to j2k/testData/ast/function/method/ownSeveralGenericParams.jav diff --git a/testData/ast/function/method/ownSeveralGenericParams.kt b/j2k/testData/ast/function/method/ownSeveralGenericParams.kt similarity index 100% rename from testData/ast/function/method/ownSeveralGenericParams.kt rename to j2k/testData/ast/function/method/ownSeveralGenericParams.kt diff --git a/testData/ast/function/method/private.jav b/j2k/testData/ast/function/method/private.jav similarity index 100% rename from testData/ast/function/method/private.jav rename to j2k/testData/ast/function/method/private.jav diff --git a/testData/ast/function/method/private.kt b/j2k/testData/ast/function/method/private.kt similarity index 100% rename from testData/ast/function/method/private.kt rename to j2k/testData/ast/function/method/private.kt diff --git a/testData/ast/function/method/protected.jav b/j2k/testData/ast/function/method/protected.jav similarity index 100% rename from testData/ast/function/method/protected.jav rename to j2k/testData/ast/function/method/protected.jav diff --git a/testData/ast/function/method/protected.kt b/j2k/testData/ast/function/method/protected.kt similarity index 100% rename from testData/ast/function/method/protected.kt rename to j2k/testData/ast/function/method/protected.kt diff --git a/testData/ast/function/method/public.jav b/j2k/testData/ast/function/method/public.jav similarity index 100% rename from testData/ast/function/method/public.jav rename to j2k/testData/ast/function/method/public.jav diff --git a/testData/ast/function/method/public.kt b/j2k/testData/ast/function/method/public.kt similarity index 100% rename from testData/ast/function/method/public.kt rename to j2k/testData/ast/function/method/public.kt diff --git a/testData/ast/identifier/expression/withDollar.jav b/j2k/testData/ast/identifier/expression/withDollar.jav similarity index 100% rename from testData/ast/identifier/expression/withDollar.jav rename to j2k/testData/ast/identifier/expression/withDollar.jav diff --git a/testData/ast/identifier/expression/withDollar.kt b/j2k/testData/ast/identifier/expression/withDollar.kt similarity index 100% rename from testData/ast/identifier/expression/withDollar.kt rename to j2k/testData/ast/identifier/expression/withDollar.kt diff --git a/testData/ast/identifier/file/finalFieldReference.jav b/j2k/testData/ast/identifier/file/finalFieldReference.jav similarity index 100% rename from testData/ast/identifier/file/finalFieldReference.jav rename to j2k/testData/ast/identifier/file/finalFieldReference.jav diff --git a/testData/ast/identifier/file/finalFieldReference.kt b/j2k/testData/ast/identifier/file/finalFieldReference.kt similarity index 100% rename from testData/ast/identifier/file/finalFieldReference.kt rename to j2k/testData/ast/identifier/file/finalFieldReference.kt diff --git a/testData/ast/identifier/statement/keywords.jav b/j2k/testData/ast/identifier/statement/keywords.jav similarity index 100% rename from testData/ast/identifier/statement/keywords.jav rename to j2k/testData/ast/identifier/statement/keywords.jav diff --git a/testData/ast/identifier/statement/keywords.kt b/j2k/testData/ast/identifier/statement/keywords.kt similarity index 100% rename from testData/ast/identifier/statement/keywords.kt rename to j2k/testData/ast/identifier/statement/keywords.kt diff --git a/testData/ast/ifStatement/statement/ifStatementWithEmptyBlocks.jav b/j2k/testData/ast/ifStatement/statement/ifStatementWithEmptyBlocks.jav similarity index 100% rename from testData/ast/ifStatement/statement/ifStatementWithEmptyBlocks.jav rename to j2k/testData/ast/ifStatement/statement/ifStatementWithEmptyBlocks.jav diff --git a/testData/ast/ifStatement/statement/ifStatementWithEmptyBlocks.kt b/j2k/testData/ast/ifStatement/statement/ifStatementWithEmptyBlocks.kt similarity index 100% rename from testData/ast/ifStatement/statement/ifStatementWithEmptyBlocks.kt rename to j2k/testData/ast/ifStatement/statement/ifStatementWithEmptyBlocks.kt diff --git a/testData/ast/ifStatement/statement/ifStatementWithMultilineBlocks.jav b/j2k/testData/ast/ifStatement/statement/ifStatementWithMultilineBlocks.jav similarity index 100% rename from testData/ast/ifStatement/statement/ifStatementWithMultilineBlocks.jav rename to j2k/testData/ast/ifStatement/statement/ifStatementWithMultilineBlocks.jav diff --git a/testData/ast/ifStatement/statement/ifStatementWithMultilineBlocks.kt b/j2k/testData/ast/ifStatement/statement/ifStatementWithMultilineBlocks.kt similarity index 100% rename from testData/ast/ifStatement/statement/ifStatementWithMultilineBlocks.kt rename to j2k/testData/ast/ifStatement/statement/ifStatementWithMultilineBlocks.kt diff --git a/testData/ast/ifStatement/statement/ifStatementWithOneLineBlocks.jav b/j2k/testData/ast/ifStatement/statement/ifStatementWithOneLineBlocks.jav similarity index 100% rename from testData/ast/ifStatement/statement/ifStatementWithOneLineBlocks.jav rename to j2k/testData/ast/ifStatement/statement/ifStatementWithOneLineBlocks.jav diff --git a/testData/ast/ifStatement/statement/ifStatementWithOneLineBlocks.kt b/j2k/testData/ast/ifStatement/statement/ifStatementWithOneLineBlocks.kt similarity index 100% rename from testData/ast/ifStatement/statement/ifStatementWithOneLineBlocks.kt rename to j2k/testData/ast/ifStatement/statement/ifStatementWithOneLineBlocks.kt diff --git a/testData/ast/ifStatement/statement/ifStatementWithoutElse.jav b/j2k/testData/ast/ifStatement/statement/ifStatementWithoutElse.jav similarity index 100% rename from testData/ast/ifStatement/statement/ifStatementWithoutElse.jav rename to j2k/testData/ast/ifStatement/statement/ifStatementWithoutElse.jav diff --git a/testData/ast/ifStatement/statement/ifStatementWithoutElse.kt b/j2k/testData/ast/ifStatement/statement/ifStatementWithoutElse.kt similarity index 100% rename from testData/ast/ifStatement/statement/ifStatementWithoutElse.kt rename to j2k/testData/ast/ifStatement/statement/ifStatementWithoutElse.kt diff --git a/testData/ast/importStatement/file/importWithKeywords.jav b/j2k/testData/ast/importStatement/file/importWithKeywords.jav similarity index 100% rename from testData/ast/importStatement/file/importWithKeywords.jav rename to j2k/testData/ast/importStatement/file/importWithKeywords.jav diff --git a/testData/ast/importStatement/file/importWithKeywords.kt b/j2k/testData/ast/importStatement/file/importWithKeywords.kt similarity index 100% rename from testData/ast/importStatement/file/importWithKeywords.kt rename to j2k/testData/ast/importStatement/file/importWithKeywords.kt diff --git a/testData/ast/importStatement/file/importWithStar.jav b/j2k/testData/ast/importStatement/file/importWithStar.jav similarity index 100% rename from testData/ast/importStatement/file/importWithStar.jav rename to j2k/testData/ast/importStatement/file/importWithStar.jav diff --git a/testData/ast/importStatement/file/importWithStar.kt b/j2k/testData/ast/importStatement/file/importWithStar.kt similarity index 100% rename from testData/ast/importStatement/file/importWithStar.kt rename to j2k/testData/ast/importStatement/file/importWithStar.kt diff --git a/testData/ast/importStatement/file/simpleImport.jav b/j2k/testData/ast/importStatement/file/simpleImport.jav similarity index 100% rename from testData/ast/importStatement/file/simpleImport.jav rename to j2k/testData/ast/importStatement/file/simpleImport.jav diff --git a/testData/ast/importStatement/file/simpleImport.kt b/j2k/testData/ast/importStatement/file/simpleImport.kt similarity index 100% rename from testData/ast/importStatement/file/simpleImport.kt rename to j2k/testData/ast/importStatement/file/simpleImport.kt diff --git a/testData/ast/inProjectionType/method/methodParams.jav b/j2k/testData/ast/inProjectionType/method/methodParams.jav similarity index 100% rename from testData/ast/inProjectionType/method/methodParams.jav rename to j2k/testData/ast/inProjectionType/method/methodParams.jav diff --git a/testData/ast/inProjectionType/method/methodParams.kt b/j2k/testData/ast/inProjectionType/method/methodParams.kt similarity index 100% rename from testData/ast/inProjectionType/method/methodParams.kt rename to j2k/testData/ast/inProjectionType/method/methodParams.kt diff --git a/testData/ast/inheritance/file/classOneExtendsBaseGeneric.jav b/j2k/testData/ast/inheritance/file/classOneExtendsBaseGeneric.jav similarity index 100% rename from testData/ast/inheritance/file/classOneExtendsBaseGeneric.jav rename to j2k/testData/ast/inheritance/file/classOneExtendsBaseGeneric.jav diff --git a/testData/ast/inheritance/file/classOneExtendsBaseGeneric.kt b/j2k/testData/ast/inheritance/file/classOneExtendsBaseGeneric.kt similarity index 100% rename from testData/ast/inheritance/file/classOneExtendsBaseGeneric.kt rename to j2k/testData/ast/inheritance/file/classOneExtendsBaseGeneric.kt diff --git a/testData/ast/inheritance/file/classOneExtendsBaseWithOneParam.jav b/j2k/testData/ast/inheritance/file/classOneExtendsBaseWithOneParam.jav similarity index 100% rename from testData/ast/inheritance/file/classOneExtendsBaseWithOneParam.jav rename to j2k/testData/ast/inheritance/file/classOneExtendsBaseWithOneParam.jav diff --git a/testData/ast/inheritance/file/classOneExtendsBaseWithOneParam.kt b/j2k/testData/ast/inheritance/file/classOneExtendsBaseWithOneParam.kt similarity index 100% rename from testData/ast/inheritance/file/classOneExtendsBaseWithOneParam.kt rename to j2k/testData/ast/inheritance/file/classOneExtendsBaseWithOneParam.kt diff --git a/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParams.jav b/j2k/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParams.jav similarity index 100% rename from testData/ast/inheritance/file/classOneExtendsBaseWithZeroParams.jav rename to j2k/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParams.jav diff --git a/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParams.kt b/j2k/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParams.kt similarity index 100% rename from testData/ast/inheritance/file/classOneExtendsBaseWithZeroParams.kt rename to j2k/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParams.kt diff --git a/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.jav b/j2k/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.jav similarity index 100% rename from testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.jav rename to j2k/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.jav diff --git a/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.kt b/j2k/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.kt similarity index 100% rename from testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.kt rename to j2k/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.kt diff --git a/testData/ast/isOperator/expression/complicatedExpression.jav b/j2k/testData/ast/isOperator/expression/complicatedExpression.jav similarity index 100% rename from testData/ast/isOperator/expression/complicatedExpression.jav rename to j2k/testData/ast/isOperator/expression/complicatedExpression.jav diff --git a/testData/ast/isOperator/expression/complicatedExpression.kt b/j2k/testData/ast/isOperator/expression/complicatedExpression.kt similarity index 100% rename from testData/ast/isOperator/expression/complicatedExpression.kt rename to j2k/testData/ast/isOperator/expression/complicatedExpression.kt diff --git a/testData/ast/isOperator/expression/simpleReference.jav b/j2k/testData/ast/isOperator/expression/simpleReference.jav similarity index 100% rename from testData/ast/isOperator/expression/simpleReference.jav rename to j2k/testData/ast/isOperator/expression/simpleReference.jav diff --git a/testData/ast/isOperator/expression/simpleReference.kt b/j2k/testData/ast/isOperator/expression/simpleReference.kt similarity index 100% rename from testData/ast/isOperator/expression/simpleReference.kt rename to j2k/testData/ast/isOperator/expression/simpleReference.kt diff --git a/testData/ast/issues/file/kt-1016.jav b/j2k/testData/ast/issues/file/kt-1016.jav similarity index 100% rename from testData/ast/issues/file/kt-1016.jav rename to j2k/testData/ast/issues/file/kt-1016.jav diff --git a/testData/ast/issues/file/kt-1016.kt b/j2k/testData/ast/issues/file/kt-1016.kt similarity index 100% rename from testData/ast/issues/file/kt-1016.kt rename to j2k/testData/ast/issues/file/kt-1016.kt diff --git a/testData/ast/issues/file/kt-1048.jav b/j2k/testData/ast/issues/file/kt-1048.jav similarity index 100% rename from testData/ast/issues/file/kt-1048.jav rename to j2k/testData/ast/issues/file/kt-1048.jav diff --git a/testData/ast/issues/file/kt-1048.kt b/j2k/testData/ast/issues/file/kt-1048.kt similarity index 100% rename from testData/ast/issues/file/kt-1048.kt rename to j2k/testData/ast/issues/file/kt-1048.kt diff --git a/testData/ast/issues/file/kt-1074.jav b/j2k/testData/ast/issues/file/kt-1074.jav similarity index 100% rename from testData/ast/issues/file/kt-1074.jav rename to j2k/testData/ast/issues/file/kt-1074.jav diff --git a/testData/ast/issues/file/kt-1074.kt b/j2k/testData/ast/issues/file/kt-1074.kt similarity index 100% rename from testData/ast/issues/file/kt-1074.kt rename to j2k/testData/ast/issues/file/kt-1074.kt diff --git a/testData/ast/issues/file/kt-543-boxed.jav b/j2k/testData/ast/issues/file/kt-543-boxed.jav similarity index 100% rename from testData/ast/issues/file/kt-543-boxed.jav rename to j2k/testData/ast/issues/file/kt-543-boxed.jav diff --git a/testData/ast/issues/file/kt-543-boxed.kt b/j2k/testData/ast/issues/file/kt-543-boxed.kt similarity index 100% rename from testData/ast/issues/file/kt-543-boxed.kt rename to j2k/testData/ast/issues/file/kt-543-boxed.kt diff --git a/testData/ast/issues/file/kt-543-mixed.jav b/j2k/testData/ast/issues/file/kt-543-mixed.jav similarity index 100% rename from testData/ast/issues/file/kt-543-mixed.jav rename to j2k/testData/ast/issues/file/kt-543-mixed.jav diff --git a/testData/ast/issues/file/kt-543-mixed.kt b/j2k/testData/ast/issues/file/kt-543-mixed.kt similarity index 100% rename from testData/ast/issues/file/kt-543-mixed.kt rename to j2k/testData/ast/issues/file/kt-543-mixed.kt diff --git a/testData/ast/issues/file/kt-543.jav b/j2k/testData/ast/issues/file/kt-543.jav similarity index 100% rename from testData/ast/issues/file/kt-543.jav rename to j2k/testData/ast/issues/file/kt-543.jav diff --git a/testData/ast/issues/file/kt-543.kt b/j2k/testData/ast/issues/file/kt-543.kt similarity index 100% rename from testData/ast/issues/file/kt-543.kt rename to j2k/testData/ast/issues/file/kt-543.kt diff --git a/testData/ast/issues/file/kt-638.jav b/j2k/testData/ast/issues/file/kt-638.jav similarity index 100% rename from testData/ast/issues/file/kt-638.jav rename to j2k/testData/ast/issues/file/kt-638.jav diff --git a/testData/ast/issues/file/kt-638.kt b/j2k/testData/ast/issues/file/kt-638.kt similarity index 100% rename from testData/ast/issues/file/kt-638.kt rename to j2k/testData/ast/issues/file/kt-638.kt diff --git a/testData/ast/issues/file/kt-696.jav b/j2k/testData/ast/issues/file/kt-696.jav similarity index 100% rename from testData/ast/issues/file/kt-696.jav rename to j2k/testData/ast/issues/file/kt-696.jav diff --git a/testData/ast/issues/file/kt-696.kt b/j2k/testData/ast/issues/file/kt-696.kt similarity index 100% rename from testData/ast/issues/file/kt-696.kt rename to j2k/testData/ast/issues/file/kt-696.kt diff --git a/testData/ast/issues/file/kt-792-mixed.jav b/j2k/testData/ast/issues/file/kt-792-mixed.jav similarity index 100% rename from testData/ast/issues/file/kt-792-mixed.jav rename to j2k/testData/ast/issues/file/kt-792-mixed.jav diff --git a/testData/ast/issues/file/kt-792-mixed.kt b/j2k/testData/ast/issues/file/kt-792-mixed.kt similarity index 100% rename from testData/ast/issues/file/kt-792-mixed.kt rename to j2k/testData/ast/issues/file/kt-792-mixed.kt diff --git a/testData/ast/issues/file/kt-792.jav b/j2k/testData/ast/issues/file/kt-792.jav similarity index 100% rename from testData/ast/issues/file/kt-792.jav rename to j2k/testData/ast/issues/file/kt-792.jav diff --git a/testData/ast/issues/file/kt-792.kt b/j2k/testData/ast/issues/file/kt-792.kt similarity index 100% rename from testData/ast/issues/file/kt-792.kt rename to j2k/testData/ast/issues/file/kt-792.kt diff --git a/testData/ast/issues/file/kt-794-mixed.jav b/j2k/testData/ast/issues/file/kt-794-mixed.jav similarity index 100% rename from testData/ast/issues/file/kt-794-mixed.jav rename to j2k/testData/ast/issues/file/kt-794-mixed.jav diff --git a/testData/ast/issues/file/kt-794-mixed.kt b/j2k/testData/ast/issues/file/kt-794-mixed.kt similarity index 100% rename from testData/ast/issues/file/kt-794-mixed.kt rename to j2k/testData/ast/issues/file/kt-794-mixed.kt diff --git a/testData/ast/issues/file/kt-794.jav b/j2k/testData/ast/issues/file/kt-794.jav similarity index 100% rename from testData/ast/issues/file/kt-794.jav rename to j2k/testData/ast/issues/file/kt-794.jav diff --git a/testData/ast/issues/file/kt-794.kt b/j2k/testData/ast/issues/file/kt-794.kt similarity index 100% rename from testData/ast/issues/file/kt-794.kt rename to j2k/testData/ast/issues/file/kt-794.kt diff --git a/testData/ast/issues/file/kt-809-string.jav b/j2k/testData/ast/issues/file/kt-809-string.jav similarity index 100% rename from testData/ast/issues/file/kt-809-string.jav rename to j2k/testData/ast/issues/file/kt-809-string.jav diff --git a/testData/ast/issues/file/kt-809-string.kt b/j2k/testData/ast/issues/file/kt-809-string.kt similarity index 100% rename from testData/ast/issues/file/kt-809-string.kt rename to j2k/testData/ast/issues/file/kt-809-string.kt diff --git a/testData/ast/issues/file/kt-809.jav b/j2k/testData/ast/issues/file/kt-809.jav similarity index 100% rename from testData/ast/issues/file/kt-809.jav rename to j2k/testData/ast/issues/file/kt-809.jav diff --git a/testData/ast/issues/file/kt-809.kt b/j2k/testData/ast/issues/file/kt-809.kt similarity index 100% rename from testData/ast/issues/file/kt-809.kt rename to j2k/testData/ast/issues/file/kt-809.kt diff --git a/testData/ast/issues/file/kt-820-field.jav b/j2k/testData/ast/issues/file/kt-820-field.jav similarity index 100% rename from testData/ast/issues/file/kt-820-field.jav rename to j2k/testData/ast/issues/file/kt-820-field.jav diff --git a/testData/ast/issues/file/kt-820-field.kt b/j2k/testData/ast/issues/file/kt-820-field.kt similarity index 100% rename from testData/ast/issues/file/kt-820-field.kt rename to j2k/testData/ast/issues/file/kt-820-field.kt diff --git a/testData/ast/issues/file/kt-820-string.jav b/j2k/testData/ast/issues/file/kt-820-string.jav similarity index 100% rename from testData/ast/issues/file/kt-820-string.jav rename to j2k/testData/ast/issues/file/kt-820-string.jav diff --git a/testData/ast/issues/file/kt-820-string.kt b/j2k/testData/ast/issues/file/kt-820-string.kt similarity index 100% rename from testData/ast/issues/file/kt-820-string.kt rename to j2k/testData/ast/issues/file/kt-820-string.kt diff --git a/testData/ast/issues/file/kt-820.jav b/j2k/testData/ast/issues/file/kt-820.jav similarity index 100% rename from testData/ast/issues/file/kt-820.jav rename to j2k/testData/ast/issues/file/kt-820.jav diff --git a/testData/ast/issues/file/kt-820.kt b/j2k/testData/ast/issues/file/kt-820.kt similarity index 100% rename from testData/ast/issues/file/kt-820.kt rename to j2k/testData/ast/issues/file/kt-820.kt diff --git a/testData/ast/issues/file/kt-824-isDir.jav b/j2k/testData/ast/issues/file/kt-824-isDir.jav similarity index 100% rename from testData/ast/issues/file/kt-824-isDir.jav rename to j2k/testData/ast/issues/file/kt-824-isDir.jav diff --git a/testData/ast/issues/file/kt-824-isDir.kt b/j2k/testData/ast/issues/file/kt-824-isDir.kt similarity index 100% rename from testData/ast/issues/file/kt-824-isDir.kt rename to j2k/testData/ast/issues/file/kt-824-isDir.kt diff --git a/testData/ast/issues/file/kt-824.jav b/j2k/testData/ast/issues/file/kt-824.jav similarity index 100% rename from testData/ast/issues/file/kt-824.jav rename to j2k/testData/ast/issues/file/kt-824.jav diff --git a/testData/ast/issues/file/kt-824.kt b/j2k/testData/ast/issues/file/kt-824.kt similarity index 100% rename from testData/ast/issues/file/kt-824.kt rename to j2k/testData/ast/issues/file/kt-824.kt diff --git a/testData/ast/issues/file/kt-828.jav b/j2k/testData/ast/issues/file/kt-828.jav similarity index 100% rename from testData/ast/issues/file/kt-828.jav rename to j2k/testData/ast/issues/file/kt-828.jav diff --git a/testData/ast/issues/file/kt-828.kt b/j2k/testData/ast/issues/file/kt-828.kt similarity index 100% rename from testData/ast/issues/file/kt-828.kt rename to j2k/testData/ast/issues/file/kt-828.kt diff --git a/testData/ast/issues/file/kt-836.jav b/j2k/testData/ast/issues/file/kt-836.jav similarity index 100% rename from testData/ast/issues/file/kt-836.jav rename to j2k/testData/ast/issues/file/kt-836.jav diff --git a/testData/ast/issues/file/kt-836.kt b/j2k/testData/ast/issues/file/kt-836.kt similarity index 100% rename from testData/ast/issues/file/kt-836.kt rename to j2k/testData/ast/issues/file/kt-836.kt diff --git a/testData/ast/issues/file/kt-837.jav b/j2k/testData/ast/issues/file/kt-837.jav similarity index 100% rename from testData/ast/issues/file/kt-837.jav rename to j2k/testData/ast/issues/file/kt-837.jav diff --git a/testData/ast/issues/file/kt-837.kt b/j2k/testData/ast/issues/file/kt-837.kt similarity index 100% rename from testData/ast/issues/file/kt-837.kt rename to j2k/testData/ast/issues/file/kt-837.kt diff --git a/testData/ast/issues/file/kt-852.jav b/j2k/testData/ast/issues/file/kt-852.jav similarity index 100% rename from testData/ast/issues/file/kt-852.jav rename to j2k/testData/ast/issues/file/kt-852.jav diff --git a/testData/ast/issues/file/kt-852.kt b/j2k/testData/ast/issues/file/kt-852.kt similarity index 100% rename from testData/ast/issues/file/kt-852.kt rename to j2k/testData/ast/issues/file/kt-852.kt diff --git a/testData/ast/issues/file/kt-871.jav b/j2k/testData/ast/issues/file/kt-871.jav similarity index 100% rename from testData/ast/issues/file/kt-871.jav rename to j2k/testData/ast/issues/file/kt-871.jav diff --git a/testData/ast/issues/file/kt-871.kt b/j2k/testData/ast/issues/file/kt-871.kt similarity index 100% rename from testData/ast/issues/file/kt-871.kt rename to j2k/testData/ast/issues/file/kt-871.kt diff --git a/testData/ast/issues/file/kt-879.jav b/j2k/testData/ast/issues/file/kt-879.jav similarity index 100% rename from testData/ast/issues/file/kt-879.jav rename to j2k/testData/ast/issues/file/kt-879.jav diff --git a/testData/ast/issues/file/kt-879.kt b/j2k/testData/ast/issues/file/kt-879.kt similarity index 100% rename from testData/ast/issues/file/kt-879.kt rename to j2k/testData/ast/issues/file/kt-879.kt diff --git a/testData/ast/issues/file/kt-893.jav b/j2k/testData/ast/issues/file/kt-893.jav similarity index 100% rename from testData/ast/issues/file/kt-893.jav rename to j2k/testData/ast/issues/file/kt-893.jav diff --git a/testData/ast/issues/file/kt-893.kt b/j2k/testData/ast/issues/file/kt-893.kt similarity index 100% rename from testData/ast/issues/file/kt-893.kt rename to j2k/testData/ast/issues/file/kt-893.kt diff --git a/testData/ast/issues/file/kt-963.jav b/j2k/testData/ast/issues/file/kt-963.jav similarity index 100% rename from testData/ast/issues/file/kt-963.jav rename to j2k/testData/ast/issues/file/kt-963.jav diff --git a/testData/ast/issues/file/kt-963.kt b/j2k/testData/ast/issues/file/kt-963.kt similarity index 100% rename from testData/ast/issues/file/kt-963.kt rename to j2k/testData/ast/issues/file/kt-963.kt diff --git a/testData/ast/kotlinExclusion/file/kt-656.jav b/j2k/testData/ast/kotlinExclusion/file/kt-656.jav similarity index 100% rename from testData/ast/kotlinExclusion/file/kt-656.jav rename to j2k/testData/ast/kotlinExclusion/file/kt-656.jav diff --git a/testData/ast/kotlinExclusion/file/kt-656.kt b/j2k/testData/ast/kotlinExclusion/file/kt-656.kt similarity index 100% rename from testData/ast/kotlinExclusion/file/kt-656.kt rename to j2k/testData/ast/kotlinExclusion/file/kt-656.kt diff --git a/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.jav b/j2k/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.jav similarity index 100% rename from testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.jav rename to j2k/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.jav diff --git a/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.kt b/j2k/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.kt similarity index 100% rename from testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.kt rename to j2k/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.kt diff --git a/testData/ast/literalExpression/file/char.jav b/j2k/testData/ast/literalExpression/file/char.jav similarity index 100% rename from testData/ast/literalExpression/file/char.jav rename to j2k/testData/ast/literalExpression/file/char.jav diff --git a/testData/ast/literalExpression/file/char.kt b/j2k/testData/ast/literalExpression/file/char.kt similarity index 100% rename from testData/ast/literalExpression/file/char.kt rename to j2k/testData/ast/literalExpression/file/char.kt diff --git a/testData/ast/literalExpression/file/dollarInsideString.jav b/j2k/testData/ast/literalExpression/file/dollarInsideString.jav similarity index 100% rename from testData/ast/literalExpression/file/dollarInsideString.jav rename to j2k/testData/ast/literalExpression/file/dollarInsideString.jav diff --git a/testData/ast/literalExpression/file/dollarInsideString.kt b/j2k/testData/ast/literalExpression/file/dollarInsideString.kt similarity index 100% rename from testData/ast/literalExpression/file/dollarInsideString.kt rename to j2k/testData/ast/literalExpression/file/dollarInsideString.kt diff --git a/testData/ast/literalExpression/file/endsWithDFL.jav b/j2k/testData/ast/literalExpression/file/endsWithDFL.jav similarity index 100% rename from testData/ast/literalExpression/file/endsWithDFL.jav rename to j2k/testData/ast/literalExpression/file/endsWithDFL.jav diff --git a/testData/ast/literalExpression/file/endsWithDFL.kt b/j2k/testData/ast/literalExpression/file/endsWithDFL.kt similarity index 100% rename from testData/ast/literalExpression/file/endsWithDFL.kt rename to j2k/testData/ast/literalExpression/file/endsWithDFL.kt diff --git a/testData/ast/literalExpression/file/hex.jav b/j2k/testData/ast/literalExpression/file/hex.jav similarity index 100% rename from testData/ast/literalExpression/file/hex.jav rename to j2k/testData/ast/literalExpression/file/hex.jav diff --git a/testData/ast/literalExpression/file/hex.kt b/j2k/testData/ast/literalExpression/file/hex.kt similarity index 100% rename from testData/ast/literalExpression/file/hex.kt rename to j2k/testData/ast/literalExpression/file/hex.kt diff --git a/testData/ast/literalExpression/file/octal.jav b/j2k/testData/ast/literalExpression/file/octal.jav similarity index 100% rename from testData/ast/literalExpression/file/octal.jav rename to j2k/testData/ast/literalExpression/file/octal.jav diff --git a/testData/ast/literalExpression/file/octal.kt b/j2k/testData/ast/literalExpression/file/octal.kt similarity index 100% rename from testData/ast/literalExpression/file/octal.kt rename to j2k/testData/ast/literalExpression/file/octal.kt diff --git a/testData/ast/literalExpression/file/trueOrFalse.jav b/j2k/testData/ast/literalExpression/file/trueOrFalse.jav similarity index 100% rename from testData/ast/literalExpression/file/trueOrFalse.jav rename to j2k/testData/ast/literalExpression/file/trueOrFalse.jav diff --git a/testData/ast/literalExpression/file/trueOrFalse.kt b/j2k/testData/ast/literalExpression/file/trueOrFalse.kt similarity index 100% rename from testData/ast/literalExpression/file/trueOrFalse.kt rename to j2k/testData/ast/literalExpression/file/trueOrFalse.kt diff --git a/testData/ast/localVariable/statement/object.jav b/j2k/testData/ast/localVariable/statement/object.jav similarity index 100% rename from testData/ast/localVariable/statement/object.jav rename to j2k/testData/ast/localVariable/statement/object.jav diff --git a/testData/ast/localVariable/statement/object.kt b/j2k/testData/ast/localVariable/statement/object.kt similarity index 100% rename from testData/ast/localVariable/statement/object.kt rename to j2k/testData/ast/localVariable/statement/object.kt diff --git a/testData/ast/methodCallExpression/file/genericMethod.jav b/j2k/testData/ast/methodCallExpression/file/genericMethod.jav similarity index 100% rename from testData/ast/methodCallExpression/file/genericMethod.jav rename to j2k/testData/ast/methodCallExpression/file/genericMethod.jav diff --git a/testData/ast/methodCallExpression/file/genericMethod.kt b/j2k/testData/ast/methodCallExpression/file/genericMethod.kt similarity index 100% rename from testData/ast/methodCallExpression/file/genericMethod.kt rename to j2k/testData/ast/methodCallExpression/file/genericMethod.kt diff --git a/testData/ast/methodCallExpression/statement/callWithKeywords.jav b/j2k/testData/ast/methodCallExpression/statement/callWithKeywords.jav similarity index 100% rename from testData/ast/methodCallExpression/statement/callWithKeywords.jav rename to j2k/testData/ast/methodCallExpression/statement/callWithKeywords.jav diff --git a/testData/ast/methodCallExpression/statement/callWithKeywords.kt b/j2k/testData/ast/methodCallExpression/statement/callWithKeywords.kt similarity index 100% rename from testData/ast/methodCallExpression/statement/callWithKeywords.kt rename to j2k/testData/ast/methodCallExpression/statement/callWithKeywords.kt diff --git a/testData/ast/methodCallExpression/statement/emptyCall.jav b/j2k/testData/ast/methodCallExpression/statement/emptyCall.jav similarity index 100% rename from testData/ast/methodCallExpression/statement/emptyCall.jav rename to j2k/testData/ast/methodCallExpression/statement/emptyCall.jav diff --git a/testData/ast/methodCallExpression/statement/emptyCall.kt b/j2k/testData/ast/methodCallExpression/statement/emptyCall.kt similarity index 100% rename from testData/ast/methodCallExpression/statement/emptyCall.kt rename to j2k/testData/ast/methodCallExpression/statement/emptyCall.kt diff --git a/testData/ast/methodCallExpression/statement/simpleCall.jav b/j2k/testData/ast/methodCallExpression/statement/simpleCall.jav similarity index 100% rename from testData/ast/methodCallExpression/statement/simpleCall.jav rename to j2k/testData/ast/methodCallExpression/statement/simpleCall.jav diff --git a/testData/ast/methodCallExpression/statement/simpleCall.kt b/j2k/testData/ast/methodCallExpression/statement/simpleCall.kt similarity index 100% rename from testData/ast/methodCallExpression/statement/simpleCall.kt rename to j2k/testData/ast/methodCallExpression/statement/simpleCall.kt diff --git a/testData/ast/newClassExpression/expression/classWithParam.jav b/j2k/testData/ast/newClassExpression/expression/classWithParam.jav similarity index 100% rename from testData/ast/newClassExpression/expression/classWithParam.jav rename to j2k/testData/ast/newClassExpression/expression/classWithParam.jav diff --git a/testData/ast/newClassExpression/expression/classWithParam.kt b/j2k/testData/ast/newClassExpression/expression/classWithParam.kt similarity index 100% rename from testData/ast/newClassExpression/expression/classWithParam.kt rename to j2k/testData/ast/newClassExpression/expression/classWithParam.kt diff --git a/testData/ast/newClassExpression/expression/classWithParams.jav b/j2k/testData/ast/newClassExpression/expression/classWithParams.jav similarity index 100% rename from testData/ast/newClassExpression/expression/classWithParams.jav rename to j2k/testData/ast/newClassExpression/expression/classWithParams.jav diff --git a/testData/ast/newClassExpression/expression/classWithParams.kt b/j2k/testData/ast/newClassExpression/expression/classWithParams.kt similarity index 100% rename from testData/ast/newClassExpression/expression/classWithParams.kt rename to j2k/testData/ast/newClassExpression/expression/classWithParams.kt diff --git a/testData/ast/newClassExpression/expression/classWithoutBody.jav b/j2k/testData/ast/newClassExpression/expression/classWithoutBody.jav similarity index 100% rename from testData/ast/newClassExpression/expression/classWithoutBody.jav rename to j2k/testData/ast/newClassExpression/expression/classWithoutBody.jav diff --git a/testData/ast/newClassExpression/expression/classWithoutBody.kt b/j2k/testData/ast/newClassExpression/expression/classWithoutBody.kt similarity index 100% rename from testData/ast/newClassExpression/expression/classWithoutBody.kt rename to j2k/testData/ast/newClassExpression/expression/classWithoutBody.kt diff --git a/testData/ast/newClassExpression/expression/newClassWithAnonymousScope.jav b/j2k/testData/ast/newClassExpression/expression/newClassWithAnonymousScope.jav similarity index 100% rename from testData/ast/newClassExpression/expression/newClassWithAnonymousScope.jav rename to j2k/testData/ast/newClassExpression/expression/newClassWithAnonymousScope.jav diff --git a/testData/ast/newClassExpression/expression/newClassWithAnonymousScope.kt b/j2k/testData/ast/newClassExpression/expression/newClassWithAnonymousScope.kt similarity index 100% rename from testData/ast/newClassExpression/expression/newClassWithAnonymousScope.kt rename to j2k/testData/ast/newClassExpression/expression/newClassWithAnonymousScope.kt diff --git a/testData/ast/newClassExpression/file/fullQualifiedName.jav b/j2k/testData/ast/newClassExpression/file/fullQualifiedName.jav similarity index 100% rename from testData/ast/newClassExpression/file/fullQualifiedName.jav rename to j2k/testData/ast/newClassExpression/file/fullQualifiedName.jav diff --git a/testData/ast/newClassExpression/file/fullQualifiedName.kt b/j2k/testData/ast/newClassExpression/file/fullQualifiedName.kt similarity index 100% rename from testData/ast/newClassExpression/file/fullQualifiedName.kt rename to j2k/testData/ast/newClassExpression/file/fullQualifiedName.kt diff --git a/testData/ast/newClassExpression/file/fullQualifiedName2.jav b/j2k/testData/ast/newClassExpression/file/fullQualifiedName2.jav similarity index 100% rename from testData/ast/newClassExpression/file/fullQualifiedName2.jav rename to j2k/testData/ast/newClassExpression/file/fullQualifiedName2.jav diff --git a/testData/ast/newClassExpression/file/fullQualifiedName2.kt b/j2k/testData/ast/newClassExpression/file/fullQualifiedName2.kt similarity index 100% rename from testData/ast/newClassExpression/file/fullQualifiedName2.kt rename to j2k/testData/ast/newClassExpression/file/fullQualifiedName2.kt diff --git a/testData/ast/newClassExpression/file/genericClassInvocation.jav b/j2k/testData/ast/newClassExpression/file/genericClassInvocation.jav similarity index 100% rename from testData/ast/newClassExpression/file/genericClassInvocation.jav rename to j2k/testData/ast/newClassExpression/file/genericClassInvocation.jav diff --git a/testData/ast/newClassExpression/file/genericClassInvocation.kt b/j2k/testData/ast/newClassExpression/file/genericClassInvocation.kt similarity index 100% rename from testData/ast/newClassExpression/file/genericClassInvocation.kt rename to j2k/testData/ast/newClassExpression/file/genericClassInvocation.kt diff --git a/testData/ast/newClassExpression/file/newClassByFullName.jav b/j2k/testData/ast/newClassExpression/file/newClassByFullName.jav similarity index 100% rename from testData/ast/newClassExpression/file/newClassByFullName.jav rename to j2k/testData/ast/newClassExpression/file/newClassByFullName.jav diff --git a/testData/ast/newClassExpression/file/newClassByFullName.kt b/j2k/testData/ast/newClassExpression/file/newClassByFullName.kt similarity index 100% rename from testData/ast/newClassExpression/file/newClassByFullName.kt rename to j2k/testData/ast/newClassExpression/file/newClassByFullName.kt diff --git a/testData/ast/newClassExpression/file/newInnerClass.jav b/j2k/testData/ast/newClassExpression/file/newInnerClass.jav similarity index 100% rename from testData/ast/newClassExpression/file/newInnerClass.jav rename to j2k/testData/ast/newClassExpression/file/newInnerClass.jav diff --git a/testData/ast/newClassExpression/file/newInnerClass.kt b/j2k/testData/ast/newClassExpression/file/newInnerClass.kt similarity index 100% rename from testData/ast/newClassExpression/file/newInnerClass.kt rename to j2k/testData/ast/newClassExpression/file/newInnerClass.kt diff --git a/testData/ast/newClassExpression/file/newListAndNewMember.jav b/j2k/testData/ast/newClassExpression/file/newListAndNewMember.jav similarity index 100% rename from testData/ast/newClassExpression/file/newListAndNewMember.jav rename to j2k/testData/ast/newClassExpression/file/newListAndNewMember.jav diff --git a/testData/ast/newClassExpression/file/newListAndNewMember.kt b/j2k/testData/ast/newClassExpression/file/newListAndNewMember.kt similarity index 100% rename from testData/ast/newClassExpression/file/newListAndNewMember.kt rename to j2k/testData/ast/newClassExpression/file/newListAndNewMember.kt diff --git a/testData/ast/newClassExpression/file/newStaticInnerClass.jav b/j2k/testData/ast/newClassExpression/file/newStaticInnerClass.jav similarity index 100% rename from testData/ast/newClassExpression/file/newStaticInnerClass.jav rename to j2k/testData/ast/newClassExpression/file/newStaticInnerClass.jav diff --git a/testData/ast/newClassExpression/file/newStaticInnerClass.kt b/j2k/testData/ast/newClassExpression/file/newStaticInnerClass.kt similarity index 100% rename from testData/ast/newClassExpression/file/newStaticInnerClass.kt rename to j2k/testData/ast/newClassExpression/file/newStaticInnerClass.kt diff --git a/testData/ast/objectLiteral/file/MyFrame.jav b/j2k/testData/ast/objectLiteral/file/MyFrame.jav similarity index 100% rename from testData/ast/objectLiteral/file/MyFrame.jav rename to j2k/testData/ast/objectLiteral/file/MyFrame.jav diff --git a/testData/ast/objectLiteral/file/MyFrame.kt b/j2k/testData/ast/objectLiteral/file/MyFrame.kt similarity index 100% rename from testData/ast/objectLiteral/file/MyFrame.kt rename to j2k/testData/ast/objectLiteral/file/MyFrame.kt diff --git a/testData/ast/outProjectionType/method/methodParams.jav b/j2k/testData/ast/outProjectionType/method/methodParams.jav similarity index 100% rename from testData/ast/outProjectionType/method/methodParams.jav rename to j2k/testData/ast/outProjectionType/method/methodParams.jav diff --git a/testData/ast/outProjectionType/method/methodParams.kt b/j2k/testData/ast/outProjectionType/method/methodParams.kt similarity index 100% rename from testData/ast/outProjectionType/method/methodParams.kt rename to j2k/testData/ast/outProjectionType/method/methodParams.kt diff --git a/testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.jav b/j2k/testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.jav similarity index 100% rename from testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.jav rename to j2k/testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.jav diff --git a/testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.kt b/j2k/testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.kt similarity index 100% rename from testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.kt rename to j2k/testData/ast/packageStatement/file/orgJetbrainsJetJ2kIn.kt diff --git a/testData/ast/parenthesizedExpression/expression/parenthesized.jav b/j2k/testData/ast/parenthesizedExpression/expression/parenthesized.jav similarity index 100% rename from testData/ast/parenthesizedExpression/expression/parenthesized.jav rename to j2k/testData/ast/parenthesizedExpression/expression/parenthesized.jav diff --git a/testData/ast/parenthesizedExpression/expression/parenthesized.kt b/j2k/testData/ast/parenthesizedExpression/expression/parenthesized.kt similarity index 100% rename from testData/ast/parenthesizedExpression/expression/parenthesized.kt rename to j2k/testData/ast/parenthesizedExpression/expression/parenthesized.kt diff --git a/testData/ast/parenthesizedExpression/expression/parenthesized2.jav b/j2k/testData/ast/parenthesizedExpression/expression/parenthesized2.jav similarity index 100% rename from testData/ast/parenthesizedExpression/expression/parenthesized2.jav rename to j2k/testData/ast/parenthesizedExpression/expression/parenthesized2.jav diff --git a/testData/ast/parenthesizedExpression/expression/parenthesized2.kt b/j2k/testData/ast/parenthesizedExpression/expression/parenthesized2.kt similarity index 100% rename from testData/ast/parenthesizedExpression/expression/parenthesized2.kt rename to j2k/testData/ast/parenthesizedExpression/expression/parenthesized2.kt diff --git a/testData/ast/polyadicExpression/expression/divide.jav b/j2k/testData/ast/polyadicExpression/expression/divide.jav similarity index 100% rename from testData/ast/polyadicExpression/expression/divide.jav rename to j2k/testData/ast/polyadicExpression/expression/divide.jav diff --git a/testData/ast/polyadicExpression/expression/divide.kt b/j2k/testData/ast/polyadicExpression/expression/divide.kt similarity index 100% rename from testData/ast/polyadicExpression/expression/divide.kt rename to j2k/testData/ast/polyadicExpression/expression/divide.kt diff --git a/testData/ast/polyadicExpression/expression/minus.jav b/j2k/testData/ast/polyadicExpression/expression/minus.jav similarity index 100% rename from testData/ast/polyadicExpression/expression/minus.jav rename to j2k/testData/ast/polyadicExpression/expression/minus.jav diff --git a/testData/ast/polyadicExpression/expression/minus.kt b/j2k/testData/ast/polyadicExpression/expression/minus.kt similarity index 100% rename from testData/ast/polyadicExpression/expression/minus.kt rename to j2k/testData/ast/polyadicExpression/expression/minus.kt diff --git a/testData/ast/polyadicExpression/expression/multiply.jav b/j2k/testData/ast/polyadicExpression/expression/multiply.jav similarity index 100% rename from testData/ast/polyadicExpression/expression/multiply.jav rename to j2k/testData/ast/polyadicExpression/expression/multiply.jav diff --git a/testData/ast/polyadicExpression/expression/multiply.kt b/j2k/testData/ast/polyadicExpression/expression/multiply.kt similarity index 100% rename from testData/ast/polyadicExpression/expression/multiply.kt rename to j2k/testData/ast/polyadicExpression/expression/multiply.kt diff --git a/testData/ast/polyadicExpression/expression/plus.jav b/j2k/testData/ast/polyadicExpression/expression/plus.jav similarity index 100% rename from testData/ast/polyadicExpression/expression/plus.jav rename to j2k/testData/ast/polyadicExpression/expression/plus.jav diff --git a/testData/ast/polyadicExpression/expression/plus.kt b/j2k/testData/ast/polyadicExpression/expression/plus.kt similarity index 100% rename from testData/ast/polyadicExpression/expression/plus.kt rename to j2k/testData/ast/polyadicExpression/expression/plus.kt diff --git a/testData/ast/polyadicExpression/expression/remainder.jav b/j2k/testData/ast/polyadicExpression/expression/remainder.jav similarity index 100% rename from testData/ast/polyadicExpression/expression/remainder.jav rename to j2k/testData/ast/polyadicExpression/expression/remainder.jav diff --git a/testData/ast/polyadicExpression/expression/remainder.kt b/j2k/testData/ast/polyadicExpression/expression/remainder.kt similarity index 100% rename from testData/ast/polyadicExpression/expression/remainder.kt rename to j2k/testData/ast/polyadicExpression/expression/remainder.kt diff --git a/testData/ast/polyadicExpression/expression/unassignedShiftRight.jav b/j2k/testData/ast/polyadicExpression/expression/unassignedShiftRight.jav similarity index 100% rename from testData/ast/polyadicExpression/expression/unassignedShiftRight.jav rename to j2k/testData/ast/polyadicExpression/expression/unassignedShiftRight.jav diff --git a/testData/ast/polyadicExpression/expression/unassignedShiftRight.kt b/j2k/testData/ast/polyadicExpression/expression/unassignedShiftRight.kt similarity index 100% rename from testData/ast/polyadicExpression/expression/unassignedShiftRight.kt rename to j2k/testData/ast/polyadicExpression/expression/unassignedShiftRight.kt diff --git a/testData/ast/postfixOperator/statement/decrement.jav b/j2k/testData/ast/postfixOperator/statement/decrement.jav similarity index 100% rename from testData/ast/postfixOperator/statement/decrement.jav rename to j2k/testData/ast/postfixOperator/statement/decrement.jav diff --git a/testData/ast/postfixOperator/statement/decrement.kt b/j2k/testData/ast/postfixOperator/statement/decrement.kt similarity index 100% rename from testData/ast/postfixOperator/statement/decrement.kt rename to j2k/testData/ast/postfixOperator/statement/decrement.kt diff --git a/testData/ast/postfixOperator/statement/increment.jav b/j2k/testData/ast/postfixOperator/statement/increment.jav similarity index 100% rename from testData/ast/postfixOperator/statement/increment.jav rename to j2k/testData/ast/postfixOperator/statement/increment.jav diff --git a/testData/ast/postfixOperator/statement/increment.kt b/j2k/testData/ast/postfixOperator/statement/increment.kt similarity index 100% rename from testData/ast/postfixOperator/statement/increment.kt rename to j2k/testData/ast/postfixOperator/statement/increment.kt diff --git a/testData/ast/prefixOperator/statement/decrement.jav b/j2k/testData/ast/prefixOperator/statement/decrement.jav similarity index 100% rename from testData/ast/prefixOperator/statement/decrement.jav rename to j2k/testData/ast/prefixOperator/statement/decrement.jav diff --git a/testData/ast/prefixOperator/statement/decrement.kt b/j2k/testData/ast/prefixOperator/statement/decrement.kt similarity index 100% rename from testData/ast/prefixOperator/statement/decrement.kt rename to j2k/testData/ast/prefixOperator/statement/decrement.kt diff --git a/testData/ast/prefixOperator/statement/excl.jav b/j2k/testData/ast/prefixOperator/statement/excl.jav similarity index 100% rename from testData/ast/prefixOperator/statement/excl.jav rename to j2k/testData/ast/prefixOperator/statement/excl.jav diff --git a/testData/ast/prefixOperator/statement/excl.kt b/j2k/testData/ast/prefixOperator/statement/excl.kt similarity index 100% rename from testData/ast/prefixOperator/statement/excl.kt rename to j2k/testData/ast/prefixOperator/statement/excl.kt diff --git a/testData/ast/prefixOperator/statement/increment.jav b/j2k/testData/ast/prefixOperator/statement/increment.jav similarity index 100% rename from testData/ast/prefixOperator/statement/increment.jav rename to j2k/testData/ast/prefixOperator/statement/increment.jav diff --git a/testData/ast/prefixOperator/statement/increment.kt b/j2k/testData/ast/prefixOperator/statement/increment.kt similarity index 100% rename from testData/ast/prefixOperator/statement/increment.kt rename to j2k/testData/ast/prefixOperator/statement/increment.kt diff --git a/testData/ast/prefixOperator/statement/kt-667.jav b/j2k/testData/ast/prefixOperator/statement/kt-667.jav similarity index 100% rename from testData/ast/prefixOperator/statement/kt-667.jav rename to j2k/testData/ast/prefixOperator/statement/kt-667.jav diff --git a/testData/ast/prefixOperator/statement/kt-667.kt b/j2k/testData/ast/prefixOperator/statement/kt-667.kt similarity index 100% rename from testData/ast/prefixOperator/statement/kt-667.kt rename to j2k/testData/ast/prefixOperator/statement/kt-667.kt diff --git a/testData/ast/prefixOperator/statement/tilde.jav b/j2k/testData/ast/prefixOperator/statement/tilde.jav similarity index 100% rename from testData/ast/prefixOperator/statement/tilde.jav rename to j2k/testData/ast/prefixOperator/statement/tilde.jav diff --git a/testData/ast/prefixOperator/statement/tilde.kt b/j2k/testData/ast/prefixOperator/statement/tilde.kt similarity index 100% rename from testData/ast/prefixOperator/statement/tilde.kt rename to j2k/testData/ast/prefixOperator/statement/tilde.kt diff --git a/testData/ast/rawGenerics/file/kt-540-map.jav b/j2k/testData/ast/rawGenerics/file/kt-540-map.jav similarity index 100% rename from testData/ast/rawGenerics/file/kt-540-map.jav rename to j2k/testData/ast/rawGenerics/file/kt-540-map.jav diff --git a/testData/ast/rawGenerics/file/kt-540-map.kt b/j2k/testData/ast/rawGenerics/file/kt-540-map.kt similarity index 100% rename from testData/ast/rawGenerics/file/kt-540-map.kt rename to j2k/testData/ast/rawGenerics/file/kt-540-map.kt diff --git a/testData/ast/rawGenerics/file/kt-540-rawGenericClass.jav b/j2k/testData/ast/rawGenerics/file/kt-540-rawGenericClass.jav similarity index 100% rename from testData/ast/rawGenerics/file/kt-540-rawGenericClass.jav rename to j2k/testData/ast/rawGenerics/file/kt-540-rawGenericClass.jav diff --git a/testData/ast/rawGenerics/file/kt-540-rawGenericClass.kt b/j2k/testData/ast/rawGenerics/file/kt-540-rawGenericClass.kt similarity index 100% rename from testData/ast/rawGenerics/file/kt-540-rawGenericClass.kt rename to j2k/testData/ast/rawGenerics/file/kt-540-rawGenericClass.kt diff --git a/testData/ast/rawGenerics/file/kt-540.jav b/j2k/testData/ast/rawGenerics/file/kt-540.jav similarity index 100% rename from testData/ast/rawGenerics/file/kt-540.jav rename to j2k/testData/ast/rawGenerics/file/kt-540.jav diff --git a/testData/ast/rawGenerics/file/kt-540.kt b/j2k/testData/ast/rawGenerics/file/kt-540.kt similarity index 100% rename from testData/ast/rawGenerics/file/kt-540.kt rename to j2k/testData/ast/rawGenerics/file/kt-540.kt diff --git a/testData/ast/rawGenerics/file/rawGenericMethod.jav b/j2k/testData/ast/rawGenerics/file/rawGenericMethod.jav similarity index 100% rename from testData/ast/rawGenerics/file/rawGenericMethod.jav rename to j2k/testData/ast/rawGenerics/file/rawGenericMethod.jav diff --git a/testData/ast/rawGenerics/file/rawGenericMethod.kt b/j2k/testData/ast/rawGenerics/file/rawGenericMethod.kt similarity index 100% rename from testData/ast/rawGenerics/file/rawGenericMethod.kt rename to j2k/testData/ast/rawGenerics/file/rawGenericMethod.kt diff --git a/testData/ast/returnStatement/statement/returnChar.jav b/j2k/testData/ast/returnStatement/statement/returnChar.jav similarity index 100% rename from testData/ast/returnStatement/statement/returnChar.jav rename to j2k/testData/ast/returnStatement/statement/returnChar.jav diff --git a/testData/ast/returnStatement/statement/returnChar.kt b/j2k/testData/ast/returnStatement/statement/returnChar.kt similarity index 100% rename from testData/ast/returnStatement/statement/returnChar.kt rename to j2k/testData/ast/returnStatement/statement/returnChar.kt diff --git a/testData/ast/returnStatement/statement/returnLiteral.jav b/j2k/testData/ast/returnStatement/statement/returnLiteral.jav similarity index 100% rename from testData/ast/returnStatement/statement/returnLiteral.jav rename to j2k/testData/ast/returnStatement/statement/returnLiteral.jav diff --git a/testData/ast/returnStatement/statement/returnLiteral.kt b/j2k/testData/ast/returnStatement/statement/returnLiteral.kt similarity index 100% rename from testData/ast/returnStatement/statement/returnLiteral.kt rename to j2k/testData/ast/returnStatement/statement/returnLiteral.kt diff --git a/testData/ast/returnStatement/statement/returnNumber.jav b/j2k/testData/ast/returnStatement/statement/returnNumber.jav similarity index 100% rename from testData/ast/returnStatement/statement/returnNumber.jav rename to j2k/testData/ast/returnStatement/statement/returnNumber.jav diff --git a/testData/ast/returnStatement/statement/returnNumber.kt b/j2k/testData/ast/returnStatement/statement/returnNumber.kt similarity index 100% rename from testData/ast/returnStatement/statement/returnNumber.kt rename to j2k/testData/ast/returnStatement/statement/returnNumber.kt diff --git a/testData/ast/returnStatement/statement/returnString.jav b/j2k/testData/ast/returnStatement/statement/returnString.jav similarity index 100% rename from testData/ast/returnStatement/statement/returnString.jav rename to j2k/testData/ast/returnStatement/statement/returnString.jav diff --git a/testData/ast/returnStatement/statement/returnString.kt b/j2k/testData/ast/returnStatement/statement/returnString.kt similarity index 100% rename from testData/ast/returnStatement/statement/returnString.kt rename to j2k/testData/ast/returnStatement/statement/returnString.kt diff --git a/testData/ast/starProjectionType/method/methodParams.jav b/j2k/testData/ast/starProjectionType/method/methodParams.jav similarity index 100% rename from testData/ast/starProjectionType/method/methodParams.jav rename to j2k/testData/ast/starProjectionType/method/methodParams.jav diff --git a/testData/ast/starProjectionType/method/methodParams.kt b/j2k/testData/ast/starProjectionType/method/methodParams.kt similarity index 100% rename from testData/ast/starProjectionType/method/methodParams.kt rename to j2k/testData/ast/starProjectionType/method/methodParams.kt diff --git a/testData/ast/superExpression/class/classAextendsB.jav b/j2k/testData/ast/superExpression/class/classAextendsB.jav similarity index 100% rename from testData/ast/superExpression/class/classAextendsB.jav rename to j2k/testData/ast/superExpression/class/classAextendsB.jav diff --git a/testData/ast/superExpression/class/classAextendsB.kt b/j2k/testData/ast/superExpression/class/classAextendsB.kt similarity index 100% rename from testData/ast/superExpression/class/classAextendsB.kt rename to j2k/testData/ast/superExpression/class/classAextendsB.kt diff --git a/testData/ast/superExpression/file/classAdotSuperFoo.jav b/j2k/testData/ast/superExpression/file/classAdotSuperFoo.jav similarity index 100% rename from testData/ast/superExpression/file/classAdotSuperFoo.jav rename to j2k/testData/ast/superExpression/file/classAdotSuperFoo.jav diff --git a/testData/ast/superExpression/file/classAdotSuperFoo.kt b/j2k/testData/ast/superExpression/file/classAdotSuperFoo.kt similarity index 100% rename from testData/ast/superExpression/file/classAdotSuperFoo.kt rename to j2k/testData/ast/superExpression/file/classAdotSuperFoo.kt diff --git a/testData/ast/superExpression/statement/superStatement.jav b/j2k/testData/ast/superExpression/statement/superStatement.jav similarity index 100% rename from testData/ast/superExpression/statement/superStatement.jav rename to j2k/testData/ast/superExpression/statement/superStatement.jav diff --git a/testData/ast/superExpression/statement/superStatement.kt b/j2k/testData/ast/superExpression/statement/superStatement.kt similarity index 100% rename from testData/ast/superExpression/statement/superStatement.kt rename to j2k/testData/ast/superExpression/statement/superStatement.kt diff --git a/testData/ast/switch/file/comlicatedFallDown.jav b/j2k/testData/ast/switch/file/comlicatedFallDown.jav similarity index 100% rename from testData/ast/switch/file/comlicatedFallDown.jav rename to j2k/testData/ast/switch/file/comlicatedFallDown.jav diff --git a/testData/ast/switch/file/comlicatedFallDown.kt b/j2k/testData/ast/switch/file/comlicatedFallDown.kt similarity index 100% rename from testData/ast/switch/file/comlicatedFallDown.kt rename to j2k/testData/ast/switch/file/comlicatedFallDown.kt diff --git a/testData/ast/switch/file/fallDown.jav b/j2k/testData/ast/switch/file/fallDown.jav similarity index 100% rename from testData/ast/switch/file/fallDown.jav rename to j2k/testData/ast/switch/file/fallDown.jav diff --git a/testData/ast/switch/file/fallDown.kt b/j2k/testData/ast/switch/file/fallDown.kt similarity index 100% rename from testData/ast/switch/file/fallDown.kt rename to j2k/testData/ast/switch/file/fallDown.kt diff --git a/testData/ast/switch/file/kt-539.jav b/j2k/testData/ast/switch/file/kt-539.jav similarity index 100% rename from testData/ast/switch/file/kt-539.jav rename to j2k/testData/ast/switch/file/kt-539.jav diff --git a/testData/ast/switch/file/kt-539.kt b/j2k/testData/ast/switch/file/kt-539.kt similarity index 100% rename from testData/ast/switch/file/kt-539.kt rename to j2k/testData/ast/switch/file/kt-539.kt diff --git a/testData/ast/synchronizedStatement/statement/singleLineExample.jav b/j2k/testData/ast/synchronizedStatement/statement/singleLineExample.jav similarity index 100% rename from testData/ast/synchronizedStatement/statement/singleLineExample.jav rename to j2k/testData/ast/synchronizedStatement/statement/singleLineExample.jav diff --git a/testData/ast/synchronizedStatement/statement/singleLineExample.kt b/j2k/testData/ast/synchronizedStatement/statement/singleLineExample.kt similarity index 100% rename from testData/ast/synchronizedStatement/statement/singleLineExample.kt rename to j2k/testData/ast/synchronizedStatement/statement/singleLineExample.kt diff --git a/testData/ast/thisExpression/file/classAdotThisFoo.jav b/j2k/testData/ast/thisExpression/file/classAdotThisFoo.jav similarity index 100% rename from testData/ast/thisExpression/file/classAdotThisFoo.jav rename to j2k/testData/ast/thisExpression/file/classAdotThisFoo.jav diff --git a/testData/ast/thisExpression/file/classAdotThisFoo.kt b/j2k/testData/ast/thisExpression/file/classAdotThisFoo.kt similarity index 100% rename from testData/ast/thisExpression/file/classAdotThisFoo.kt rename to j2k/testData/ast/thisExpression/file/classAdotThisFoo.kt diff --git a/testData/ast/thisExpression/statement/thisStatement.jav b/j2k/testData/ast/thisExpression/statement/thisStatement.jav similarity index 100% rename from testData/ast/thisExpression/statement/thisStatement.jav rename to j2k/testData/ast/thisExpression/statement/thisStatement.jav diff --git a/testData/ast/thisExpression/statement/thisStatement.kt b/j2k/testData/ast/thisExpression/statement/thisStatement.kt similarity index 100% rename from testData/ast/thisExpression/statement/thisStatement.kt rename to j2k/testData/ast/thisExpression/statement/thisStatement.kt diff --git a/testData/ast/throwStatement/statement/simpleThrowStatement.jav b/j2k/testData/ast/throwStatement/statement/simpleThrowStatement.jav similarity index 100% rename from testData/ast/throwStatement/statement/simpleThrowStatement.jav rename to j2k/testData/ast/throwStatement/statement/simpleThrowStatement.jav diff --git a/testData/ast/throwStatement/statement/simpleThrowStatement.kt b/j2k/testData/ast/throwStatement/statement/simpleThrowStatement.kt similarity index 100% rename from testData/ast/throwStatement/statement/simpleThrowStatement.kt rename to j2k/testData/ast/throwStatement/statement/simpleThrowStatement.kt diff --git a/testData/ast/trait/class/abstactInterface.jav b/j2k/testData/ast/trait/class/abstactInterface.jav similarity index 100% rename from testData/ast/trait/class/abstactInterface.jav rename to j2k/testData/ast/trait/class/abstactInterface.jav diff --git a/testData/ast/trait/class/abstactInterface.kt b/j2k/testData/ast/trait/class/abstactInterface.kt similarity index 100% rename from testData/ast/trait/class/abstactInterface.kt rename to j2k/testData/ast/trait/class/abstactInterface.kt diff --git a/testData/ast/trait/class/emptyInterface.jav b/j2k/testData/ast/trait/class/emptyInterface.jav similarity index 100% rename from testData/ast/trait/class/emptyInterface.jav rename to j2k/testData/ast/trait/class/emptyInterface.jav diff --git a/testData/ast/trait/class/emptyInterface.kt b/j2k/testData/ast/trait/class/emptyInterface.kt similarity index 100% rename from testData/ast/trait/class/emptyInterface.kt rename to j2k/testData/ast/trait/class/emptyInterface.kt diff --git a/testData/ast/trait/class/extendsOneClassAndImplementsSeveralInterfaces.jav b/j2k/testData/ast/trait/class/extendsOneClassAndImplementsSeveralInterfaces.jav similarity index 100% rename from testData/ast/trait/class/extendsOneClassAndImplementsSeveralInterfaces.jav rename to j2k/testData/ast/trait/class/extendsOneClassAndImplementsSeveralInterfaces.jav diff --git a/testData/ast/trait/class/extendsOneClassAndImplementsSeveralInterfaces.kt b/j2k/testData/ast/trait/class/extendsOneClassAndImplementsSeveralInterfaces.kt similarity index 100% rename from testData/ast/trait/class/extendsOneClassAndImplementsSeveralInterfaces.kt rename to j2k/testData/ast/trait/class/extendsOneClassAndImplementsSeveralInterfaces.kt diff --git a/testData/ast/trait/class/extendsOneInterface.jav b/j2k/testData/ast/trait/class/extendsOneInterface.jav similarity index 100% rename from testData/ast/trait/class/extendsOneInterface.jav rename to j2k/testData/ast/trait/class/extendsOneInterface.jav diff --git a/testData/ast/trait/class/extendsOneInterface.kt b/j2k/testData/ast/trait/class/extendsOneInterface.kt similarity index 100% rename from testData/ast/trait/class/extendsOneInterface.kt rename to j2k/testData/ast/trait/class/extendsOneInterface.kt diff --git a/testData/ast/trait/class/interfaceWithFields.jav b/j2k/testData/ast/trait/class/interfaceWithFields.jav similarity index 100% rename from testData/ast/trait/class/interfaceWithFields.jav rename to j2k/testData/ast/trait/class/interfaceWithFields.jav diff --git a/testData/ast/trait/class/interfaceWithFields.kt b/j2k/testData/ast/trait/class/interfaceWithFields.kt similarity index 100% rename from testData/ast/trait/class/interfaceWithFields.kt rename to j2k/testData/ast/trait/class/interfaceWithFields.kt diff --git a/testData/ast/trait/class/interfaceWithMethodDeclaration.jav b/j2k/testData/ast/trait/class/interfaceWithMethodDeclaration.jav similarity index 100% rename from testData/ast/trait/class/interfaceWithMethodDeclaration.jav rename to j2k/testData/ast/trait/class/interfaceWithMethodDeclaration.jav diff --git a/testData/ast/trait/class/interfaceWithMethodDeclaration.kt b/j2k/testData/ast/trait/class/interfaceWithMethodDeclaration.kt similarity index 100% rename from testData/ast/trait/class/interfaceWithMethodDeclaration.kt rename to j2k/testData/ast/trait/class/interfaceWithMethodDeclaration.kt diff --git a/testData/ast/trait/class/interfaceWithStaticFields.jav b/j2k/testData/ast/trait/class/interfaceWithStaticFields.jav similarity index 100% rename from testData/ast/trait/class/interfaceWithStaticFields.jav rename to j2k/testData/ast/trait/class/interfaceWithStaticFields.jav diff --git a/testData/ast/trait/class/interfaceWithStaticFields.kt b/j2k/testData/ast/trait/class/interfaceWithStaticFields.kt similarity index 100% rename from testData/ast/trait/class/interfaceWithStaticFields.kt rename to j2k/testData/ast/trait/class/interfaceWithStaticFields.kt diff --git a/testData/ast/trait/class/internalInterface.jav b/j2k/testData/ast/trait/class/internalInterface.jav similarity index 100% rename from testData/ast/trait/class/internalInterface.jav rename to j2k/testData/ast/trait/class/internalInterface.jav diff --git a/testData/ast/trait/class/internalInterface.kt b/j2k/testData/ast/trait/class/internalInterface.kt similarity index 100% rename from testData/ast/trait/class/internalInterface.kt rename to j2k/testData/ast/trait/class/internalInterface.kt diff --git a/testData/ast/trait/class/privateInterface.jav b/j2k/testData/ast/trait/class/privateInterface.jav similarity index 100% rename from testData/ast/trait/class/privateInterface.jav rename to j2k/testData/ast/trait/class/privateInterface.jav diff --git a/testData/ast/trait/class/privateInterface.kt b/j2k/testData/ast/trait/class/privateInterface.kt similarity index 100% rename from testData/ast/trait/class/privateInterface.kt rename to j2k/testData/ast/trait/class/privateInterface.kt diff --git a/testData/ast/trait/class/protectedInterface.jav b/j2k/testData/ast/trait/class/protectedInterface.jav similarity index 100% rename from testData/ast/trait/class/protectedInterface.jav rename to j2k/testData/ast/trait/class/protectedInterface.jav diff --git a/testData/ast/trait/class/protectedInterface.kt b/j2k/testData/ast/trait/class/protectedInterface.kt similarity index 100% rename from testData/ast/trait/class/protectedInterface.kt rename to j2k/testData/ast/trait/class/protectedInterface.kt diff --git a/testData/ast/trait/class/publicInterface.jav b/j2k/testData/ast/trait/class/publicInterface.jav similarity index 100% rename from testData/ast/trait/class/publicInterface.jav rename to j2k/testData/ast/trait/class/publicInterface.jav diff --git a/testData/ast/trait/class/publicInterface.kt b/j2k/testData/ast/trait/class/publicInterface.kt similarity index 100% rename from testData/ast/trait/class/publicInterface.kt rename to j2k/testData/ast/trait/class/publicInterface.kt diff --git a/testData/ast/tryStatement/statement/commonCaseForTryStatement.jav b/j2k/testData/ast/tryStatement/statement/commonCaseForTryStatement.jav similarity index 100% rename from testData/ast/tryStatement/statement/commonCaseForTryStatement.jav rename to j2k/testData/ast/tryStatement/statement/commonCaseForTryStatement.jav diff --git a/testData/ast/tryStatement/statement/commonCaseForTryStatement.kt b/j2k/testData/ast/tryStatement/statement/commonCaseForTryStatement.kt similarity index 100% rename from testData/ast/tryStatement/statement/commonCaseForTryStatement.kt rename to j2k/testData/ast/tryStatement/statement/commonCaseForTryStatement.kt diff --git a/testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithEmptyFinally.jav b/j2k/testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithEmptyFinally.jav similarity index 100% rename from testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithEmptyFinally.jav rename to j2k/testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithEmptyFinally.jav diff --git a/testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithEmptyFinally.kt b/j2k/testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithEmptyFinally.kt similarity index 100% rename from testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithEmptyFinally.kt rename to j2k/testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithEmptyFinally.kt diff --git a/testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithFinally.jav b/j2k/testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithFinally.jav similarity index 100% rename from testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithFinally.jav rename to j2k/testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithFinally.jav diff --git a/testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithFinally.kt b/j2k/testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithFinally.kt similarity index 100% rename from testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithFinally.kt rename to j2k/testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithFinally.kt diff --git a/testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithoutFinally.jav b/j2k/testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithoutFinally.jav similarity index 100% rename from testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithoutFinally.jav rename to j2k/testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithoutFinally.jav diff --git a/testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithoutFinally.kt b/j2k/testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithoutFinally.kt similarity index 100% rename from testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithoutFinally.kt rename to j2k/testData/ast/tryStatement/statement/emptyTryWithTwoCatchesWithoutFinally.kt diff --git a/testData/ast/typeCastExpression/expression/extendsWildcardCast.jav b/j2k/testData/ast/typeCastExpression/expression/extendsWildcardCast.jav similarity index 100% rename from testData/ast/typeCastExpression/expression/extendsWildcardCast.jav rename to j2k/testData/ast/typeCastExpression/expression/extendsWildcardCast.jav diff --git a/testData/ast/typeCastExpression/expression/extendsWildcardCast.kt b/j2k/testData/ast/typeCastExpression/expression/extendsWildcardCast.kt similarity index 100% rename from testData/ast/typeCastExpression/expression/extendsWildcardCast.kt rename to j2k/testData/ast/typeCastExpression/expression/extendsWildcardCast.kt diff --git a/testData/ast/typeCastExpression/expression/fooCast.jav b/j2k/testData/ast/typeCastExpression/expression/fooCast.jav similarity index 100% rename from testData/ast/typeCastExpression/expression/fooCast.jav rename to j2k/testData/ast/typeCastExpression/expression/fooCast.jav diff --git a/testData/ast/typeCastExpression/expression/fooCast.kt b/j2k/testData/ast/typeCastExpression/expression/fooCast.kt similarity index 100% rename from testData/ast/typeCastExpression/expression/fooCast.kt rename to j2k/testData/ast/typeCastExpression/expression/fooCast.kt diff --git a/testData/ast/typeCastExpression/expression/intCast.jav b/j2k/testData/ast/typeCastExpression/expression/intCast.jav similarity index 100% rename from testData/ast/typeCastExpression/expression/intCast.jav rename to j2k/testData/ast/typeCastExpression/expression/intCast.jav diff --git a/testData/ast/typeCastExpression/expression/intCast.kt b/j2k/testData/ast/typeCastExpression/expression/intCast.kt similarity index 100% rename from testData/ast/typeCastExpression/expression/intCast.kt rename to j2k/testData/ast/typeCastExpression/expression/intCast.kt diff --git a/testData/ast/typeCastExpression/expression/primitiveType.jav b/j2k/testData/ast/typeCastExpression/expression/primitiveType.jav similarity index 100% rename from testData/ast/typeCastExpression/expression/primitiveType.jav rename to j2k/testData/ast/typeCastExpression/expression/primitiveType.jav diff --git a/testData/ast/typeCastExpression/expression/primitiveType.kt b/j2k/testData/ast/typeCastExpression/expression/primitiveType.kt similarity index 100% rename from testData/ast/typeCastExpression/expression/primitiveType.kt rename to j2k/testData/ast/typeCastExpression/expression/primitiveType.kt diff --git a/testData/ast/typeCastExpression/expression/simpleGenericCast.jav b/j2k/testData/ast/typeCastExpression/expression/simpleGenericCast.jav similarity index 100% rename from testData/ast/typeCastExpression/expression/simpleGenericCast.jav rename to j2k/testData/ast/typeCastExpression/expression/simpleGenericCast.jav diff --git a/testData/ast/typeCastExpression/expression/simpleGenericCast.kt b/j2k/testData/ast/typeCastExpression/expression/simpleGenericCast.kt similarity index 100% rename from testData/ast/typeCastExpression/expression/simpleGenericCast.kt rename to j2k/testData/ast/typeCastExpression/expression/simpleGenericCast.kt diff --git a/testData/ast/typeCastExpression/expression/stringCast.jav b/j2k/testData/ast/typeCastExpression/expression/stringCast.jav similarity index 100% rename from testData/ast/typeCastExpression/expression/stringCast.jav rename to j2k/testData/ast/typeCastExpression/expression/stringCast.jav diff --git a/testData/ast/typeCastExpression/expression/stringCast.kt b/j2k/testData/ast/typeCastExpression/expression/stringCast.kt similarity index 100% rename from testData/ast/typeCastExpression/expression/stringCast.kt rename to j2k/testData/ast/typeCastExpression/expression/stringCast.kt diff --git a/testData/ast/typeCastExpression/expression/superWildcardCast.jav b/j2k/testData/ast/typeCastExpression/expression/superWildcardCast.jav similarity index 100% rename from testData/ast/typeCastExpression/expression/superWildcardCast.jav rename to j2k/testData/ast/typeCastExpression/expression/superWildcardCast.jav diff --git a/testData/ast/typeCastExpression/expression/superWildcardCast.kt b/j2k/testData/ast/typeCastExpression/expression/superWildcardCast.kt similarity index 100% rename from testData/ast/typeCastExpression/expression/superWildcardCast.kt rename to j2k/testData/ast/typeCastExpression/expression/superWildcardCast.kt diff --git a/testData/ast/typeCastExpression/expression/wildcardCast.jav b/j2k/testData/ast/typeCastExpression/expression/wildcardCast.jav similarity index 100% rename from testData/ast/typeCastExpression/expression/wildcardCast.jav rename to j2k/testData/ast/typeCastExpression/expression/wildcardCast.jav diff --git a/testData/ast/typeCastExpression/expression/wildcardCast.kt b/j2k/testData/ast/typeCastExpression/expression/wildcardCast.kt similarity index 100% rename from testData/ast/typeCastExpression/expression/wildcardCast.kt rename to j2k/testData/ast/typeCastExpression/expression/wildcardCast.kt diff --git a/testData/ast/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.jav b/j2k/testData/ast/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.jav similarity index 100% rename from testData/ast/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.jav rename to j2k/testData/ast/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.jav diff --git a/testData/ast/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.kt b/j2k/testData/ast/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.kt similarity index 100% rename from testData/ast/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.kt rename to j2k/testData/ast/typeParameters/class/classDoubleParametrizationWithTwoBoundsWithExtending.kt diff --git a/testData/ast/typeParameters/class/classParametrizationWithTwoBounds.jav b/j2k/testData/ast/typeParameters/class/classParametrizationWithTwoBounds.jav similarity index 100% rename from testData/ast/typeParameters/class/classParametrizationWithTwoBounds.jav rename to j2k/testData/ast/typeParameters/class/classParametrizationWithTwoBounds.jav diff --git a/testData/ast/typeParameters/class/classParametrizationWithTwoBounds.kt b/j2k/testData/ast/typeParameters/class/classParametrizationWithTwoBounds.kt similarity index 100% rename from testData/ast/typeParameters/class/classParametrizationWithTwoBounds.kt rename to j2k/testData/ast/typeParameters/class/classParametrizationWithTwoBounds.kt diff --git a/testData/ast/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.jav b/j2k/testData/ast/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.jav similarity index 100% rename from testData/ast/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.jav rename to j2k/testData/ast/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.jav diff --git a/testData/ast/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.kt b/j2k/testData/ast/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.kt similarity index 100% rename from testData/ast/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.kt rename to j2k/testData/ast/typeParameters/class/classParametrizationWithTwoBoundsWithExtending.kt diff --git a/testData/ast/typeParameters/class/complexExampleWithClassExtending.jav b/j2k/testData/ast/typeParameters/class/complexExampleWithClassExtending.jav similarity index 100% rename from testData/ast/typeParameters/class/complexExampleWithClassExtending.jav rename to j2k/testData/ast/typeParameters/class/complexExampleWithClassExtending.jav diff --git a/testData/ast/typeParameters/class/complexExampleWithClassExtending.kt b/j2k/testData/ast/typeParameters/class/complexExampleWithClassExtending.kt similarity index 100% rename from testData/ast/typeParameters/class/complexExampleWithClassExtending.kt rename to j2k/testData/ast/typeParameters/class/complexExampleWithClassExtending.kt diff --git a/testData/ast/typeParameters/class/complexExampleWithClassMultiplyExtending.jav b/j2k/testData/ast/typeParameters/class/complexExampleWithClassMultiplyExtending.jav similarity index 100% rename from testData/ast/typeParameters/class/complexExampleWithClassMultiplyExtending.jav rename to j2k/testData/ast/typeParameters/class/complexExampleWithClassMultiplyExtending.jav diff --git a/testData/ast/typeParameters/class/complexExampleWithClassMultiplyExtending.kt b/j2k/testData/ast/typeParameters/class/complexExampleWithClassMultiplyExtending.kt similarity index 100% rename from testData/ast/typeParameters/class/complexExampleWithClassMultiplyExtending.kt rename to j2k/testData/ast/typeParameters/class/complexExampleWithClassMultiplyExtending.kt diff --git a/testData/ast/typeParameters/class/genericClass.jav b/j2k/testData/ast/typeParameters/class/genericClass.jav similarity index 100% rename from testData/ast/typeParameters/class/genericClass.jav rename to j2k/testData/ast/typeParameters/class/genericClass.jav diff --git a/testData/ast/typeParameters/class/genericClass.kt b/j2k/testData/ast/typeParameters/class/genericClass.kt similarity index 100% rename from testData/ast/typeParameters/class/genericClass.kt rename to j2k/testData/ast/typeParameters/class/genericClass.kt diff --git a/testData/ast/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.jav b/j2k/testData/ast/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.jav similarity index 100% rename from testData/ast/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.jav rename to j2k/testData/ast/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.jav diff --git a/testData/ast/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.kt b/j2k/testData/ast/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.kt similarity index 100% rename from testData/ast/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.kt rename to j2k/testData/ast/typeParameters/class/traitDoubleParametrizationWithTwoBoundsWithExtending.kt diff --git a/testData/ast/typeParameters/method/methodDoubleParametrizationWithTwoBounds.jav b/j2k/testData/ast/typeParameters/method/methodDoubleParametrizationWithTwoBounds.jav similarity index 100% rename from testData/ast/typeParameters/method/methodDoubleParametrizationWithTwoBounds.jav rename to j2k/testData/ast/typeParameters/method/methodDoubleParametrizationWithTwoBounds.jav diff --git a/testData/ast/typeParameters/method/methodDoubleParametrizationWithTwoBounds.kt b/j2k/testData/ast/typeParameters/method/methodDoubleParametrizationWithTwoBounds.kt similarity index 100% rename from testData/ast/typeParameters/method/methodDoubleParametrizationWithTwoBounds.kt rename to j2k/testData/ast/typeParameters/method/methodDoubleParametrizationWithTwoBounds.kt diff --git a/testData/ast/typeParameters/method/where.jav b/j2k/testData/ast/typeParameters/method/where.jav similarity index 100% rename from testData/ast/typeParameters/method/where.jav rename to j2k/testData/ast/typeParameters/method/where.jav diff --git a/testData/ast/typeParameters/method/where.kt b/j2k/testData/ast/typeParameters/method/where.kt similarity index 100% rename from testData/ast/typeParameters/method/where.kt rename to j2k/testData/ast/typeParameters/method/where.kt diff --git a/testData/ast/typeParameters/statement/genericParam.jav b/j2k/testData/ast/typeParameters/statement/genericParam.jav similarity index 100% rename from testData/ast/typeParameters/statement/genericParam.jav rename to j2k/testData/ast/typeParameters/statement/genericParam.jav diff --git a/testData/ast/typeParameters/statement/genericParam.kt b/j2k/testData/ast/typeParameters/statement/genericParam.kt similarity index 100% rename from testData/ast/typeParameters/statement/genericParam.kt rename to j2k/testData/ast/typeParameters/statement/genericParam.kt diff --git a/testData/ast/typeParameters/statement/manyGenericParams.jav b/j2k/testData/ast/typeParameters/statement/manyGenericParams.jav similarity index 100% rename from testData/ast/typeParameters/statement/manyGenericParams.jav rename to j2k/testData/ast/typeParameters/statement/manyGenericParams.jav diff --git a/testData/ast/typeParameters/statement/manyGenericParams.kt b/j2k/testData/ast/typeParameters/statement/manyGenericParams.kt similarity index 100% rename from testData/ast/typeParameters/statement/manyGenericParams.kt rename to j2k/testData/ast/typeParameters/statement/manyGenericParams.kt diff --git a/testData/ast/varArg/method/ellipsisTypeSeveralParams.jav b/j2k/testData/ast/varArg/method/ellipsisTypeSeveralParams.jav similarity index 100% rename from testData/ast/varArg/method/ellipsisTypeSeveralParams.jav rename to j2k/testData/ast/varArg/method/ellipsisTypeSeveralParams.jav diff --git a/testData/ast/varArg/method/ellipsisTypeSeveralParams.kt b/j2k/testData/ast/varArg/method/ellipsisTypeSeveralParams.kt similarity index 100% rename from testData/ast/varArg/method/ellipsisTypeSeveralParams.kt rename to j2k/testData/ast/varArg/method/ellipsisTypeSeveralParams.kt diff --git a/testData/ast/varArg/method/ellipsisTypeSingleParams.jav b/j2k/testData/ast/varArg/method/ellipsisTypeSingleParams.jav similarity index 100% rename from testData/ast/varArg/method/ellipsisTypeSingleParams.jav rename to j2k/testData/ast/varArg/method/ellipsisTypeSingleParams.jav diff --git a/testData/ast/varArg/method/ellipsisTypeSingleParams.kt b/j2k/testData/ast/varArg/method/ellipsisTypeSingleParams.kt similarity index 100% rename from testData/ast/varArg/method/ellipsisTypeSingleParams.kt rename to j2k/testData/ast/varArg/method/ellipsisTypeSingleParams.kt diff --git a/testData/ast/whileStatement/statement/whileWithBlock.jav b/j2k/testData/ast/whileStatement/statement/whileWithBlock.jav similarity index 100% rename from testData/ast/whileStatement/statement/whileWithBlock.jav rename to j2k/testData/ast/whileStatement/statement/whileWithBlock.jav diff --git a/testData/ast/whileStatement/statement/whileWithBlock.kt b/j2k/testData/ast/whileStatement/statement/whileWithBlock.kt similarity index 100% rename from testData/ast/whileStatement/statement/whileWithBlock.kt rename to j2k/testData/ast/whileStatement/statement/whileWithBlock.kt diff --git a/testData/ast/whileStatement/statement/whileWithEmptyBlock.jav b/j2k/testData/ast/whileStatement/statement/whileWithEmptyBlock.jav similarity index 100% rename from testData/ast/whileStatement/statement/whileWithEmptyBlock.jav rename to j2k/testData/ast/whileStatement/statement/whileWithEmptyBlock.jav diff --git a/testData/ast/whileStatement/statement/whileWithEmptyBlock.kt b/j2k/testData/ast/whileStatement/statement/whileWithEmptyBlock.kt similarity index 100% rename from testData/ast/whileStatement/statement/whileWithEmptyBlock.kt rename to j2k/testData/ast/whileStatement/statement/whileWithEmptyBlock.kt diff --git a/testData/ast/whileStatement/statement/whileWithExpression.jav b/j2k/testData/ast/whileStatement/statement/whileWithExpression.jav similarity index 100% rename from testData/ast/whileStatement/statement/whileWithExpression.jav rename to j2k/testData/ast/whileStatement/statement/whileWithExpression.jav diff --git a/testData/ast/whileStatement/statement/whileWithExpression.kt b/j2k/testData/ast/whileStatement/statement/whileWithExpression.kt similarity index 100% rename from testData/ast/whileStatement/statement/whileWithExpression.kt rename to j2k/testData/ast/whileStatement/statement/whileWithExpression.kt diff --git a/testData/ast/whileStatement/statement/whileWithReturn.jav b/j2k/testData/ast/whileStatement/statement/whileWithReturn.jav similarity index 100% rename from testData/ast/whileStatement/statement/whileWithReturn.jav rename to j2k/testData/ast/whileStatement/statement/whileWithReturn.jav diff --git a/testData/ast/whileStatement/statement/whileWithReturn.kt b/j2k/testData/ast/whileStatement/statement/whileWithReturn.kt similarity index 100% rename from testData/ast/whileStatement/statement/whileWithReturn.kt rename to j2k/testData/ast/whileStatement/statement/whileWithReturn.kt