KT-544 fixed: "Create generic init functions for generic classes"

This commit is contained in:
Sergey Ignatov
2011-11-21 16:37:01 +04:00
parent ef415f4748
commit 357d1dab82
4 changed files with 86 additions and 2 deletions
+9 -1
View File
@@ -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<Element> typeParameters = new LinkedList<Element>();
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
));
@@ -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<Type> typeParameters = expression.getClassReference() != null ? typesToTypeList(expression.getClassReference().getTypeParameters()) : Collections.<Type>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
@@ -0,0 +1,33 @@
public class Identifier<T> {
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<String>("name", false, true);
Identifier i2 = new Identifier<String>("name", false);
Identifier i3 = new Identifier<String>("name");
}
}
@@ -0,0 +1,37 @@
public open class Identifier<T>(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<T>(name : T?) : Identifier {
val __ = Identifier(name, false)
return __
}
open public fun init<T>(name : T?, isNullable : Boolean) : Identifier {
val __ = Identifier(name, false)
__.myNullable = isNullable
return __
}
open public fun init<T>(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<String?>("name", false, true)
var i2 : Identifier<*>? = Identifier.init<String?>("name", false)
var i3 : Identifier<*>? = Identifier.init<String?>("name")
}
}
}