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 extends Member> 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 extends Member> 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 extends Member> members) {
+ private static List getStatic(List extends Member> 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 extends Member> members) {
+ private static List getNonStatic(List extends Member> 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