J2K: fixed conversion of base class constructor arguments

This commit is contained in:
Valentin Kipyatkov
2014-10-17 21:17:06 +04:00
committed by valentin
parent 9ac23cd657
commit 7762d4e7c6
7 changed files with 41 additions and 12 deletions
@@ -149,7 +149,7 @@ class ConstructorConverter(private val psiClass: PsiClass,
}
}
public var baseClassParams: List<Expression> = listOf()
public var baseClassParams: List<LazyElement<Expression>> = listOf()
private set
public fun convertConstructor(constructor: PsiMethod,
@@ -258,22 +258,25 @@ class ConstructorConverter(private val psiClass: PsiClass,
}
// we need to replace renamed parameter usages in base class constructor arguments and in default values
val correctedConverter = converter.withSpecialContext(psiClass) /* to correct nested class references */
val correctedCodeConverter = correctedConverter.createDefaultCodeConverter()/*TODO!!!*/
.withSpecialExpressionConverter(ReplacingExpressionConverter(this, parameterUsageReplacementMap))
val correctedConverter = converter.withSpecialContext(psiClass) /* to correct nested class references */
fun correctCodeConverter(codeConverter: CodeConverter)
= codeConverter.withSpecialExpressionConverter(ReplacingExpressionConverter(this, parameterUsageReplacementMap))
val statement = primaryConstructor.getBody()?.getStatements()?.firstOrNull()
val methodCall = (statement as? PsiExpressionStatement)?.getExpression() as? PsiMethodCallExpression
if (methodCall != null && methodCall.isSuperConstructorCall()) {
baseClassParams = correctedCodeConverter.convertExpressions(methodCall.getArgumentList().getExpressions())
baseClassParams = methodCall.getArgumentList().getExpressions().map {
correctedConverter.lazyElement { codeConverter -> correctCodeConverter(codeConverter).convertExpression(it) }
}
}
val parameterList = ParameterList(params.indices.map { i ->
val parameter = params[i]
val indexFromEnd = params.size - i - 1
val defaultValue = if (indexFromEnd < lastParamDefaults.size)
correctedCodeConverter.convertExpression(lastParamDefaults[indexFromEnd], parameter.getType())
correctCodeConverter(correctedConverter.createDefaultCodeConverter()/*TODO!!*/).convertExpression(lastParamDefaults[indexFromEnd], parameter.getType())
else
null
if (!parameterToField.containsKey(parameter)) {
+1 -1
View File
@@ -24,7 +24,7 @@ open class Class(
modifiers: Modifiers,
val typeParameterList: TypeParameterList,
val extendsTypes: List<Type>,
val baseClassParams: List<Expression>,
val baseClassParams: List<LazyElement<Expression>>,
val implementsTypes: List<Type>,
val body: ClassBody
) : Member(annotations, modifiers) {
@@ -22,7 +22,7 @@ abstract class Member(val annotations: Annotations, val modifiers: Modifiers) :
class ClassBody (
val primaryConstructorSignature: PrimaryConstructorSignature?,
val baseClassParams: List<Expression>,
val baseClassParams: List<LazyElement<Expression>>,
val members: List<Member>,
val classObjectMembers: List<Member>,
val factoryFunctions: List<FactoryFunction>,
+2 -3
View File
@@ -24,11 +24,10 @@ class Enum(
modifiers: Modifiers,
typeParameterList: TypeParameterList,
extendsTypes: List<Type>,
baseClassParams: List<Expression>,
baseClassParams: List<LazyElement<Expression>>,
implementsTypes: List<Type>,
body: ClassBody
) : Class(name, annotations, modifiers, typeParameterList,
extendsTypes, baseClassParams, implementsTypes, body) {
) : Class(name, annotations, modifiers, typeParameterList, extendsTypes, baseClassParams, implementsTypes, body) {
override fun generateCode(builder: CodeBuilder) {
builder.append(body.factoryFunctions, "\n", "", "\n\n")
+1 -1
View File
@@ -23,7 +23,7 @@ class Trait(name: Identifier,
modifiers: Modifiers,
typeParameterList: TypeParameterList,
extendsTypes: List<Type>,
baseClassParams: List<Expression>,
baseClassParams: List<LazyElement<Expression>>,
implementsTypes: List<Type>,
body: ClassBody
) : Class(name, annotations, modifiers, typeParameterList, extendsTypes, baseClassParams, implementsTypes, body) {
@@ -0,0 +1,17 @@
public class Base {
protected int myX = 42;
public int getX() {
return myX;
}
Base(int x){
myX = x;
}
}
class Derived extends Base {
Derived(Base b) {
super(b.myX);
}
}
@@ -0,0 +1,10 @@
public class Base(x: Int) {
public var x: Int = 42
protected set
{
this.x = x
}
}
class Derived(b: Base) : Base(b.x)