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
|
private set
|
||||||
|
|
||||||
public fun convertConstructor(constructor: PsiMethod,
|
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
|
// 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 statement = primaryConstructor.getBody()?.getStatements()?.firstOrNull()
|
||||||
val methodCall = (statement as? PsiExpressionStatement)?.getExpression() as? PsiMethodCallExpression
|
val methodCall = (statement as? PsiExpressionStatement)?.getExpression() as? PsiMethodCallExpression
|
||||||
if (methodCall != null && methodCall.isSuperConstructorCall()) {
|
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 parameterList = ParameterList(params.indices.map { i ->
|
||||||
val parameter = params[i]
|
val parameter = params[i]
|
||||||
val indexFromEnd = params.size - i - 1
|
val indexFromEnd = params.size - i - 1
|
||||||
val defaultValue = if (indexFromEnd < lastParamDefaults.size)
|
val defaultValue = if (indexFromEnd < lastParamDefaults.size)
|
||||||
correctedCodeConverter.convertExpression(lastParamDefaults[indexFromEnd], parameter.getType())
|
correctCodeConverter(correctedConverter.createDefaultCodeConverter()/*TODO!!*/).convertExpression(lastParamDefaults[indexFromEnd], parameter.getType())
|
||||||
else
|
else
|
||||||
null
|
null
|
||||||
if (!parameterToField.containsKey(parameter)) {
|
if (!parameterToField.containsKey(parameter)) {
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ open class Class(
|
|||||||
modifiers: Modifiers,
|
modifiers: Modifiers,
|
||||||
val typeParameterList: TypeParameterList,
|
val typeParameterList: TypeParameterList,
|
||||||
val extendsTypes: List<Type>,
|
val extendsTypes: List<Type>,
|
||||||
val baseClassParams: List<Expression>,
|
val baseClassParams: List<LazyElement<Expression>>,
|
||||||
val implementsTypes: List<Type>,
|
val implementsTypes: List<Type>,
|
||||||
val body: ClassBody
|
val body: ClassBody
|
||||||
) : Member(annotations, modifiers) {
|
) : Member(annotations, modifiers) {
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ abstract class Member(val annotations: Annotations, val modifiers: Modifiers) :
|
|||||||
|
|
||||||
class ClassBody (
|
class ClassBody (
|
||||||
val primaryConstructorSignature: PrimaryConstructorSignature?,
|
val primaryConstructorSignature: PrimaryConstructorSignature?,
|
||||||
val baseClassParams: List<Expression>,
|
val baseClassParams: List<LazyElement<Expression>>,
|
||||||
val members: List<Member>,
|
val members: List<Member>,
|
||||||
val classObjectMembers: List<Member>,
|
val classObjectMembers: List<Member>,
|
||||||
val factoryFunctions: List<FactoryFunction>,
|
val factoryFunctions: List<FactoryFunction>,
|
||||||
|
|||||||
@@ -24,11 +24,10 @@ class Enum(
|
|||||||
modifiers: Modifiers,
|
modifiers: Modifiers,
|
||||||
typeParameterList: TypeParameterList,
|
typeParameterList: TypeParameterList,
|
||||||
extendsTypes: List<Type>,
|
extendsTypes: List<Type>,
|
||||||
baseClassParams: List<Expression>,
|
baseClassParams: List<LazyElement<Expression>>,
|
||||||
implementsTypes: List<Type>,
|
implementsTypes: List<Type>,
|
||||||
body: ClassBody
|
body: ClassBody
|
||||||
) : Class(name, annotations, modifiers, typeParameterList,
|
) : Class(name, annotations, modifiers, typeParameterList, extendsTypes, baseClassParams, implementsTypes, body) {
|
||||||
extendsTypes, baseClassParams, implementsTypes, body) {
|
|
||||||
|
|
||||||
override fun generateCode(builder: CodeBuilder) {
|
override fun generateCode(builder: CodeBuilder) {
|
||||||
builder.append(body.factoryFunctions, "\n", "", "\n\n")
|
builder.append(body.factoryFunctions, "\n", "", "\n\n")
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ class Trait(name: Identifier,
|
|||||||
modifiers: Modifiers,
|
modifiers: Modifiers,
|
||||||
typeParameterList: TypeParameterList,
|
typeParameterList: TypeParameterList,
|
||||||
extendsTypes: List<Type>,
|
extendsTypes: List<Type>,
|
||||||
baseClassParams: List<Expression>,
|
baseClassParams: List<LazyElement<Expression>>,
|
||||||
implementsTypes: List<Type>,
|
implementsTypes: List<Type>,
|
||||||
body: ClassBody
|
body: ClassBody
|
||||||
) : Class(name, annotations, modifiers, typeParameterList, extendsTypes, baseClassParams, implementsTypes, body) {
|
) : 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