diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt index 05380c8a32d..1e76e693181 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt @@ -38,13 +38,15 @@ public class DefaultParameterValueSubstitutor(val state: GenerationState) { * If all of the parameters of the specified constructor declare default values, * generates a no-argument constructor that passes default values for all arguments. */ - fun generateConstructorOverloadsIfNeeded( + fun generatePrimaryConstructorOverloadsIfNeeded( constructorDescriptor: ConstructorDescriptor, classBuilder: ClassBuilder, contextKind: OwnerKind, classOrObject: KtClassOrObject ) { - if (generateOverloadsIfNeeded(classOrObject, constructorDescriptor, constructorDescriptor, contextKind, classBuilder)) { + val methodElement = classOrObject.getPrimaryConstructor() ?: classOrObject + + if (generateOverloadsIfNeeded(methodElement, constructorDescriptor, constructorDescriptor, contextKind, classBuilder)) { return } @@ -52,7 +54,7 @@ public class DefaultParameterValueSubstitutor(val state: GenerationState) { return } - generateOverloadWithSubstitutedParameters(constructorDescriptor, constructorDescriptor, classBuilder, classOrObject, contextKind, + generateOverloadWithSubstitutedParameters(constructorDescriptor, constructorDescriptor, classBuilder, methodElement, contextKind, constructorDescriptor.countDefaultParameters()) } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java index 7c46a6f7e4a..9620de6daa3 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java @@ -957,7 +957,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { functionCodegen.generateDefaultIfNeeded(constructorContext, constructorDescriptor, OwnerKind.IMPLEMENTATION, DefaultParameterValueLoader.DEFAULT, null); - new DefaultParameterValueSubstitutor(state).generateConstructorOverloadsIfNeeded(constructorDescriptor, v, kind, myClass); + new DefaultParameterValueSubstitutor(state).generatePrimaryConstructorOverloadsIfNeeded(constructorDescriptor, v, kind, myClass); if (isCompanionObject(descriptor)) { context.recordSyntheticAccessorIfNeeded(constructorDescriptor, bindingContext); @@ -969,8 +969,10 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { ConstructorContext constructorContext = context.intoConstructor(constructorDescriptor); + KtSecondaryConstructor constructor = (KtSecondaryConstructor) descriptorToDeclaration(constructorDescriptor); + functionCodegen.generateMethod( - JvmDeclarationOriginKt.OtherOrigin(descriptorToDeclaration(constructorDescriptor), constructorDescriptor), + JvmDeclarationOriginKt.OtherOrigin(constructor, constructorDescriptor), constructorDescriptor, constructorContext, new FunctionGenerationStrategy.CodegenBased(state, constructorDescriptor) { @Override @@ -984,7 +986,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { DefaultParameterValueLoader.DEFAULT, null); new DefaultParameterValueSubstitutor(state).generateOverloadsIfNeeded( - myClass, constructorDescriptor, constructorDescriptor, kind, v + constructor, constructorDescriptor, constructorDescriptor, kind, v ); } diff --git a/idea/testData/findUsages/kotlin/findFunctionUsages/jvmOverloaded.0.kt b/idea/testData/findUsages/kotlin/findFunctionUsages/jvmOverloaded.0.kt new file mode 100644 index 00000000000..c68f727fe5b --- /dev/null +++ b/idea/testData/findUsages/kotlin/findFunctionUsages/jvmOverloaded.0.kt @@ -0,0 +1,12 @@ +// PSI_ELEMENT: org.jetbrains.kotlin.psi.KtNamedFunction +// OPTIONS: usages +@file:JvmName("Foo") + +@JvmOverloads +fun foo( + x: Int = 0, + y: Double = 0.0, + z: String = "0" +) { + +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findFunctionUsages/jvmOverloaded.1.java b/idea/testData/findUsages/kotlin/findFunctionUsages/jvmOverloaded.1.java new file mode 100644 index 00000000000..44646bf2426 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findFunctionUsages/jvmOverloaded.1.java @@ -0,0 +1,17 @@ +class Usages { + void foo() { + Foo.foo(); + } + + void fooX() { + Foo.foo(1); + } + + void fooXY() { + Foo.foo(1, 1.0); + } + + void fooXYZ() { + Foo.foo(1, 1.0, "1"); + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findFunctionUsages/jvmOverloaded.results.txt b/idea/testData/findUsages/kotlin/findFunctionUsages/jvmOverloaded.results.txt new file mode 100644 index 00000000000..3f5d017960e --- /dev/null +++ b/idea/testData/findUsages/kotlin/findFunctionUsages/jvmOverloaded.results.txt @@ -0,0 +1,4 @@ +Unclassified usage (11: 13) Foo.foo(1, 1.0); +Unclassified usage (15: 13) Foo.foo(1, 1.0, "1"); +Unclassified usage (3: 13) Foo.foo(); +Unclassified usage (7: 13) Foo.foo(1); \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findPrimaryConstructorUsages/jvmOverloaded.0.kt b/idea/testData/findUsages/kotlin/findPrimaryConstructorUsages/jvmOverloaded.0.kt new file mode 100644 index 00000000000..03baf9d1163 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPrimaryConstructorUsages/jvmOverloaded.0.kt @@ -0,0 +1,7 @@ +// PSI_ELEMENT: org.jetbrains.kotlin.psi.KtPrimaryConstructor +// OPTIONS: usages +public class A @JvmOverloads constructor ( + public val x: Int = 0, + public val y: Double = 0.0, + public val z: String = "0" +) \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findPrimaryConstructorUsages/jvmOverloaded.1.java b/idea/testData/findUsages/kotlin/findPrimaryConstructorUsages/jvmOverloaded.1.java new file mode 100644 index 00000000000..43c79267ec2 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPrimaryConstructorUsages/jvmOverloaded.1.java @@ -0,0 +1,17 @@ +public class Usages { + void createA() { + new A(); + } + + void createAx() { + new A(1); + } + + void createAxy() { + new A(1, 1.0); + } + + void createAxyz() { + new A(1, 1.0, "1"); + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findPrimaryConstructorUsages/jvmOverloaded.results.txt b/idea/testData/findUsages/kotlin/findPrimaryConstructorUsages/jvmOverloaded.results.txt new file mode 100644 index 00000000000..6efc67fb10a --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPrimaryConstructorUsages/jvmOverloaded.results.txt @@ -0,0 +1,4 @@ +New instance creation (11: 13) new A(1, 1.0); +New instance creation (15: 13) new A(1, 1.0, "1"); +New instance creation (3: 13) new A(); +New instance creation (7: 13) new A(1); \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/jvmOverloaded.0.kt b/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/jvmOverloaded.0.kt new file mode 100644 index 00000000000..1bb3598c8e7 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/jvmOverloaded.0.kt @@ -0,0 +1,5 @@ +// PSI_ELEMENT: org.jetbrains.kotlin.psi.KtSecondaryConstructor +// OPTIONS: usages +public class A { + @JvmOverloads constructor(x: Int = 0, y: Double = 0.0, z: String = "0") +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/jvmOverloaded.1.java b/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/jvmOverloaded.1.java new file mode 100644 index 00000000000..43c79267ec2 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/jvmOverloaded.1.java @@ -0,0 +1,17 @@ +public class Usages { + void createA() { + new A(); + } + + void createAx() { + new A(1); + } + + void createAxy() { + new A(1, 1.0); + } + + void createAxyz() { + new A(1, 1.0, "1"); + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/jvmOverloaded.results.txt b/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/jvmOverloaded.results.txt new file mode 100644 index 00000000000..6efc67fb10a --- /dev/null +++ b/idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/jvmOverloaded.results.txt @@ -0,0 +1,4 @@ +New instance creation (11: 13) new A(1, 1.0); +New instance creation (15: 13) new A(1, 1.0, "1"); +New instance creation (3: 13) new A(); +New instance creation (7: 13) new A(1); \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/findUsages/JetFindUsagesTestGenerated.java b/idea/tests/org/jetbrains/kotlin/findUsages/JetFindUsagesTestGenerated.java index d46db39916b..dda3d9622aa 100644 --- a/idea/tests/org/jetbrains/kotlin/findUsages/JetFindUsagesTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/findUsages/JetFindUsagesTestGenerated.java @@ -558,6 +558,12 @@ public class JetFindUsagesTestGenerated extends AbstractJetFindUsagesTest { doTest(fileName); } + @TestMetadata("jvmOverloaded.0.kt") + public void testJvmOverloaded() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findFunctionUsages/jvmOverloaded.0.kt"); + doTest(fileName); + } + @TestMetadata("kotlinInternalMethodUsages.0.kt") public void testKotlinInternalMethodUsages() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findFunctionUsages/kotlinInternalMethodUsages.0.kt"); @@ -813,6 +819,12 @@ public class JetFindUsagesTestGenerated extends AbstractJetFindUsagesTest { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/findUsages/kotlin/findPrimaryConstructorUsages"), Pattern.compile("^(.+)\\.0\\.kt$"), true); } + @TestMetadata("jvmOverloaded.0.kt") + public void testJvmOverloaded() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findPrimaryConstructorUsages/jvmOverloaded.0.kt"); + doTest(fileName); + } + @TestMetadata("missingName.0.kt") public void testMissingName() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findPrimaryConstructorUsages/missingName.0.kt"); @@ -1005,6 +1017,12 @@ public class JetFindUsagesTestGenerated extends AbstractJetFindUsagesTest { doTest(fileName); } + @TestMetadata("jvmOverloaded.0.kt") + public void testJvmOverloaded() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/jvmOverloaded.0.kt"); + doTest(fileName); + } + @TestMetadata("secondaryConstructor.0.kt") public void testSecondaryConstructor() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findSecondaryConstructorUsages/secondaryConstructor.0.kt");