diff --git a/j2k/src/org/jetbrains/jet/j2k/ConstructorConverter.kt b/j2k/src/org/jetbrains/jet/j2k/ConstructorConverter.kt index 3ff53639152..efae0a8a1b1 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ConstructorConverter.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ConstructorConverter.kt @@ -149,7 +149,7 @@ class ConstructorConverter(private val psiClass: PsiClass, } } - public var baseClassParams: List = listOf() + public var baseClassParams: List> = 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)) { diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/Class.kt b/j2k/src/org/jetbrains/jet/j2k/ast/Class.kt index 5a2a9e9f725..8c55f569483 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/Class.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/Class.kt @@ -24,7 +24,7 @@ open class Class( modifiers: Modifiers, val typeParameterList: TypeParameterList, val extendsTypes: List, - val baseClassParams: List, + val baseClassParams: List>, val implementsTypes: List, val body: ClassBody ) : Member(annotations, modifiers) { diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/ClassBody.kt b/j2k/src/org/jetbrains/jet/j2k/ast/ClassBody.kt index 6bd425c3e81..ebd40bf9f82 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/ClassBody.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/ClassBody.kt @@ -22,7 +22,7 @@ abstract class Member(val annotations: Annotations, val modifiers: Modifiers) : class ClassBody ( val primaryConstructorSignature: PrimaryConstructorSignature?, - val baseClassParams: List, + val baseClassParams: List>, val members: List, val classObjectMembers: List, val factoryFunctions: List, diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/Enum.kt b/j2k/src/org/jetbrains/jet/j2k/ast/Enum.kt index b65c2ab88ac..3ca04608bb7 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/Enum.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/Enum.kt @@ -24,11 +24,10 @@ class Enum( modifiers: Modifiers, typeParameterList: TypeParameterList, extendsTypes: List, - baseClassParams: List, + baseClassParams: List>, implementsTypes: List, 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") diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/Trait.kt b/j2k/src/org/jetbrains/jet/j2k/ast/Trait.kt index 6ca937c8be8..85ffca2f00e 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/Trait.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/Trait.kt @@ -23,7 +23,7 @@ class Trait(name: Identifier, modifiers: Modifiers, typeParameterList: TypeParameterList, extendsTypes: List, - baseClassParams: List, + baseClassParams: List>, implementsTypes: List, body: ClassBody ) : Class(name, annotations, modifiers, typeParameterList, extendsTypes, baseClassParams, implementsTypes, body) { diff --git a/j2k/tests/testData/ast/dropAccessors/DifferentFieldNameAndSuperClass.java b/j2k/tests/testData/ast/dropAccessors/DifferentFieldNameAndSuperClass.java new file mode 100644 index 00000000000..7a88da18508 --- /dev/null +++ b/j2k/tests/testData/ast/dropAccessors/DifferentFieldNameAndSuperClass.java @@ -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); + } +} diff --git a/j2k/tests/testData/ast/dropAccessors/DifferentFieldNameAndSuperClass.kt b/j2k/tests/testData/ast/dropAccessors/DifferentFieldNameAndSuperClass.kt new file mode 100644 index 00000000000..7ff6c4c136f --- /dev/null +++ b/j2k/tests/testData/ast/dropAccessors/DifferentFieldNameAndSuperClass.kt @@ -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) \ No newline at end of file