KT-544 fixed: "Create generic init functions for generic classes"
This commit is contained in:
@@ -98,11 +98,19 @@ public class Class extends Member {
|
|||||||
statements.add(new ReturnStatement(new IdentifierImpl("__"))); // TODO: move to one place, find other __ usages
|
statements.add(new ReturnStatement(new IdentifierImpl("__"))); // TODO: move to one place, find other __ usages
|
||||||
final Block block = new Block(statements);
|
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(
|
result.add(new Function(
|
||||||
new IdentifierImpl("init"),
|
new IdentifierImpl("init"),
|
||||||
modifiers,
|
modifiers,
|
||||||
new ClassType(myName),
|
new ClassType(myName),
|
||||||
f.getTypeParameters(),
|
typeParameters,
|
||||||
f.getParams(),
|
f.getParams(),
|
||||||
block
|
block
|
||||||
));
|
));
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
import org.jetbrains.jet.j2k.Converter;
|
import org.jetbrains.jet.j2k.Converter;
|
||||||
import org.jetbrains.jet.j2k.ast.*;
|
import org.jetbrains.jet.j2k.ast.*;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static org.jetbrains.jet.j2k.Converter.*;
|
import static org.jetbrains.jet.j2k.Converter.*;
|
||||||
@@ -207,9 +208,14 @@ public class ExpressionVisitor extends StatementVisitor {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
// is constructor secondary
|
// is constructor secondary
|
||||||
|
final List<Type> typeParameters = expression.getClassReference() != null ? typesToTypeList(expression.getClassReference().getTypeParameters()) : Collections.<Type>emptyList();
|
||||||
return new CallChainExpression(
|
return new CallChainExpression(
|
||||||
new IdentifierImpl(constructor.getName(), false),
|
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
|
@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")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user