From 1ea2c24562692a7a6c82ab1ab9dc06839ad662c6 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Mon, 8 Jun 2015 18:50:11 +0300 Subject: [PATCH] Light Classes: Primary constructor fixes --- .../codegen/ImplementationBodyCodegen.java | 4 +++- ...KotlinLightClassForExplicitDeclaration.java | 6 +++--- .../kotlin/asJava/KotlinLightParameter.java | 9 ++------- .../kotlin/asJava/LightClassUtil.java | 4 ++++ .../jetbrains/kotlin/asJava/lightClassUtils.kt | 18 +++++++----------- .../tests/overload/ConstructorVsFunOverload.kt | 9 ++++----- .../resolve/resolveWithRedeclarationError.kt | 3 +-- .../secondaryConstructors/redeclarations.kt | 6 +++--- .../idea/refactoring/JetRefactoringUtil.java | 7 ++----- .../ClassFromClass_verification.xml | 6 ++++-- .../hierarchy/class/sub/ClassFromClass/main.kt | 4 ++++ .../ClassFromTrait_verification.xml | 14 +++++++------- .../ObjectFromClass_verification.xml | 12 ++++++------ .../ObjectFromTrait_verification.xml | 12 ++++++------ .../TraitFromClass_verification.xml | 14 +++++++------- .../TraitFromTrait_verification.xml | 14 +++++++------- 16 files changed, 70 insertions(+), 72 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java index b5f9374fac4..662053ea4ca 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java @@ -1046,7 +1046,9 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { ConstructorContext constructorContext = context.intoConstructor(constructorDescriptor); - functionCodegen.generateMethod(OtherOrigin(myClass, constructorDescriptor), constructorDescriptor, constructorContext, + JetPrimaryConstructor primaryConstructor = myClass.getPrimaryConstructor(); + JvmDeclarationOrigin origin = OtherOrigin(primaryConstructor != null ? primaryConstructor : myClass, constructorDescriptor); + functionCodegen.generateMethod(origin, constructorDescriptor, constructorContext, new FunctionGenerationStrategy.CodegenBased(state, constructorDescriptor) { @Override public void doGenerateBody(@NotNull ExpressionCodegen codegen, @NotNull JvmMethodSignature signature) { diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinLightClassForExplicitDeclaration.java b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinLightClassForExplicitDeclaration.java index 3697147c588..b05fd81edae 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinLightClassForExplicitDeclaration.java +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinLightClassForExplicitDeclaration.java @@ -100,15 +100,15 @@ public class KotlinLightClassForExplicitDeclaration extends KotlinWrappingLightC //noinspection unchecked PsiElement declaration = JetPsiUtil.getTopmostParentOfTypes( classOrObject, - JetNamedFunction.class, JetProperty.class, JetClassInitializer.class, JetParameter.class + JetNamedFunction.class, JetConstructor.class, JetProperty.class, JetClassInitializer.class, JetParameter.class ); if (declaration instanceof JetParameter) { declaration = PsiTreeUtil.getParentOfType(declaration, JetNamedDeclaration.class); } - if (declaration instanceof JetNamedFunction) { - JetNamedFunction function = (JetNamedFunction) declaration; + if (declaration instanceof JetFunction) { + JetFunction function = (JetFunction) declaration; return getParentByPsiMethod(LightClassUtil.getLightClassMethod(function), function.getName(), false); } diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinLightParameter.java b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinLightParameter.java index c115d6bbddb..ca17a72b177 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinLightParameter.java +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinLightParameter.java @@ -78,13 +78,8 @@ public class KotlinLightParameter extends LightParameter implements KotlinLightE int jetIndex = PsiUtilPackage.isExtensionDeclaration(declaration) ? index - 1 : index; if (jetIndex < 0) return null; - if (declaration instanceof JetNamedFunction) { - List paramList = ((JetNamedFunction) declaration).getValueParameters(); - return jetIndex < paramList.size() ? paramList.get(jetIndex) : null; - } - - if (declaration instanceof JetClass) { - List paramList = ((JetClass) declaration).getPrimaryConstructorParameters(); + if (declaration instanceof JetFunction) { + List paramList = ((JetFunction) declaration).getValueParameters(); return jetIndex < paramList.size() ? paramList.get(jetIndex) : null; } diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassUtil.java b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassUtil.java index ba6b640c584..8c16bc8368c 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassUtil.java +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassUtil.java @@ -247,6 +247,10 @@ public class LightClassUtil { declaration = (JetProperty) propertyParent; } + if (declaration instanceof JetConstructor) { + return getPsiClass(((JetConstructor) declaration).getClassOrObject()); + } + //noinspection unchecked if (PsiTreeUtil.getParentOfType(declaration, JetFunction.class, JetProperty.class) != null) { // Can't get wrappers for internal declarations. Their classes are not generated during calcStub diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt index 5127c9c329e..ebc3f5982e6 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt @@ -67,22 +67,18 @@ public fun PsiElement.getRepresentativeLightMethod(): PsiMethod? = } public fun JetParameter.toPsiParameter(): PsiParameter? { - val paramList = getNonStrictParentOfType() - if (paramList == null) return null + val paramList = getNonStrictParentOfType() ?: return null val paramIndex = paramList.getParameters().indexOf(this) val owner = paramList.getParent() val lightParamIndex = if (owner is JetDeclaration && owner.isExtensionDeclaration()) paramIndex + 1 else paramIndex - val method: PsiMethod? = when (owner) { - is JetFunction -> LightClassUtil.getLightClassMethod(owner) - is JetPropertyAccessor -> LightClassUtil.getLightClassAccessorMethod(owner) - is JetPrimaryConstructor -> LightClassUtil.getPsiClass(owner.getContainingClassOrObject())?.getConstructors()?.let { constructors -> - if (constructors.isNotEmpty()) constructors[0] else null - } - else -> null - } - if (method == null) return null + val method: PsiMethod = + when (owner) { + is JetFunction -> LightClassUtil.getLightClassMethod(owner) + is JetPropertyAccessor -> LightClassUtil.getLightClassAccessorMethod(owner) + else -> null + } ?: return null return method.getParameterList().getParameters()[lightParamIndex] } diff --git a/compiler/testData/diagnostics/tests/overload/ConstructorVsFunOverload.kt b/compiler/testData/diagnostics/tests/overload/ConstructorVsFunOverload.kt index 257ca589532..9d6a424734f 100644 --- a/compiler/testData/diagnostics/tests/overload/ConstructorVsFunOverload.kt +++ b/compiler/testData/diagnostics/tests/overload/ConstructorVsFunOverload.kt @@ -2,21 +2,21 @@ package constructorVsFun -class a() { } +class a() { } fun a() = 1 class Tram { fun f() { } - class f() { } + class f() { } } class Yvayva { companion object { fun fghj() { } - class fghj() { } + class fghj() { } } } @@ -26,5 +26,4 @@ class Rtyu { companion object { class ololo() { } } -} - +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/resolve/resolveWithRedeclarationError.kt b/compiler/testData/diagnostics/tests/resolve/resolveWithRedeclarationError.kt index 318b77673d4..94f9fd05d1c 100644 --- a/compiler/testData/diagnostics/tests/resolve/resolveWithRedeclarationError.kt +++ b/compiler/testData/diagnostics/tests/resolve/resolveWithRedeclarationError.kt @@ -31,5 +31,4 @@ fun z(view: () -> Unit) {} fun x() = z { z { z { z { z { z { z { z { } } } } } } } } fun x() = z { z { z { z { z { z { z { z { } } } } } } } } -class x() {} - +class x() {} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/redeclarations.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/redeclarations.kt index eb568279afc..0391ad88b2a 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/redeclarations.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/redeclarations.kt @@ -1,6 +1,6 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER -class A(x: String = "", y: String = "") { +class A(x: String = "", y: String = "") { constructor(x: String, y: String): this(x, y) constructor(): this("", "") constructor(): this("", "") @@ -13,7 +13,7 @@ class B { fun B(x: Int) {} class Outer { - class A(x: String = "", y: String = "") { + class A(x: String = "", y: String = "") { constructor(x: String, y: String): this(x, y) constructor(): this("", "") constructor(): this("", "") @@ -24,4 +24,4 @@ class Outer { } fun B(x: Int) {} -} +} \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/JetRefactoringUtil.java b/idea/src/org/jetbrains/kotlin/idea/refactoring/JetRefactoringUtil.java index 573d523a8bb..52ba0ef9fbe 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/JetRefactoringUtil.java +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/JetRefactoringUtil.java @@ -340,11 +340,8 @@ public class JetRefactoringUtil { if (method instanceof KotlinLightMethod) { JetDeclaration declaration = ((KotlinLightMethod) method).getOrigin(); - if (declaration instanceof JetNamedFunction) { - result.add(((JetNamedFunction) declaration).getValueParameters().get(parameterIndex)); - } - else if (declaration instanceof JetClass) { - result.add(((JetClass) declaration).getPrimaryConstructorParameters().get(parameterIndex)); + if (declaration instanceof JetFunction) { + result.add(((JetFunction) declaration).getValueParameters().get(parameterIndex)); } } else { diff --git a/idea/testData/hierarchy/class/sub/ClassFromClass/ClassFromClass_verification.xml b/idea/testData/hierarchy/class/sub/ClassFromClass/ClassFromClass_verification.xml index d64338ddc32..f0319a34e19 100644 --- a/idea/testData/hierarchy/class/sub/ClassFromClass/ClassFromClass_verification.xml +++ b/idea/testData/hierarchy/class/sub/ClassFromClass/ClassFromClass_verification.xml @@ -1,12 +1,14 @@ - - + + + + diff --git a/idea/testData/hierarchy/class/sub/ClassFromClass/main.kt b/idea/testData/hierarchy/class/sub/ClassFromClass/main.kt index 3392ab64503..e8475e82fdf 100644 --- a/idea/testData/hierarchy/class/sub/ClassFromClass/main.kt +++ b/idea/testData/hierarchy/class/sub/ClassFromClass/main.kt @@ -18,6 +18,10 @@ class MyClass(a: A = run { class X: A(); object: A() {} }) { } } +class MyClass2 { + constructor(a: A = run { class X: A(); object: A() {} }) +} + val bar: Int get() { class E: A() diff --git a/idea/testData/hierarchy/class/sub/ClassFromTrait/ClassFromTrait_verification.xml b/idea/testData/hierarchy/class/sub/ClassFromTrait/ClassFromTrait_verification.xml index d64338ddc32..ee6ef5994c2 100644 --- a/idea/testData/hierarchy/class/sub/ClassFromTrait/ClassFromTrait_verification.xml +++ b/idea/testData/hierarchy/class/sub/ClassFromTrait/ClassFromTrait_verification.xml @@ -1,12 +1,12 @@ - - - - - - + - + + + + + + diff --git a/idea/testData/hierarchy/class/sub/ObjectFromClass/ObjectFromClass_verification.xml b/idea/testData/hierarchy/class/sub/ObjectFromClass/ObjectFromClass_verification.xml index 6b16012ffc7..18de46d44df 100644 --- a/idea/testData/hierarchy/class/sub/ObjectFromClass/ObjectFromClass_verification.xml +++ b/idea/testData/hierarchy/class/sub/ObjectFromClass/ObjectFromClass_verification.xml @@ -1,10 +1,10 @@ - - - + - - - + + + + + diff --git a/idea/testData/hierarchy/class/sub/ObjectFromTrait/ObjectFromTrait_verification.xml b/idea/testData/hierarchy/class/sub/ObjectFromTrait/ObjectFromTrait_verification.xml index 6b16012ffc7..18de46d44df 100644 --- a/idea/testData/hierarchy/class/sub/ObjectFromTrait/ObjectFromTrait_verification.xml +++ b/idea/testData/hierarchy/class/sub/ObjectFromTrait/ObjectFromTrait_verification.xml @@ -1,10 +1,10 @@ - - - + - - - + + + + + diff --git a/idea/testData/hierarchy/class/sub/TraitFromClass/TraitFromClass_verification.xml b/idea/testData/hierarchy/class/sub/TraitFromClass/TraitFromClass_verification.xml index 689e0b70f8d..ee6ef5994c2 100644 --- a/idea/testData/hierarchy/class/sub/TraitFromClass/TraitFromClass_verification.xml +++ b/idea/testData/hierarchy/class/sub/TraitFromClass/TraitFromClass_verification.xml @@ -1,12 +1,12 @@ - - - - - - + + + - + + + + diff --git a/idea/testData/hierarchy/class/sub/TraitFromTrait/TraitFromTrait_verification.xml b/idea/testData/hierarchy/class/sub/TraitFromTrait/TraitFromTrait_verification.xml index 689e0b70f8d..ee6ef5994c2 100644 --- a/idea/testData/hierarchy/class/sub/TraitFromTrait/TraitFromTrait_verification.xml +++ b/idea/testData/hierarchy/class/sub/TraitFromTrait/TraitFromTrait_verification.xml @@ -1,12 +1,12 @@ - - - - - - + + + - + + + +