From 357d1dab824a39fb3907bb15e146845cc1c5550f Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 21 Nov 2011 16:37:01 +0400 Subject: [PATCH] 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