J2K: fixed conversion of base class constructor arguments
This commit is contained in:
committed by
valentin
parent
9ac23cd657
commit
7762d4e7c6
@@ -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)) {
|
||||
|
||||
@@ -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>,
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
Reference in New Issue
Block a user