From 62bfb55973a159c92468e438a2c7f94053203229 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 17 Nov 2011 12:54:37 +0400 Subject: [PATCH 01/22] 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 02/22] 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 03/22] 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 04/22] 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 05/22] 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 06/22] 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 07/22] 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 08/22] 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 09/22] 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 10/22] 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 11/22] 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 12/22] ! 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 13/22] 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 14/22] 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 15/22] 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 16/22] 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 17/22] 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 18/22] 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 19/22] 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 20/22] 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 21/22] 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 22/22] 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