diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetClass.java b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetClass.java index eede0280959..4ce9681af71 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetClass.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetClass.java @@ -237,4 +237,18 @@ public class JetClass extends JetTypeParameterListOwnerStub imp } return body.getAllDefaultObjects(); } + + public boolean hasPrimaryConstructor() { + return hasExplicitPrimaryConstructor() || !hasSecondaryConstructors(); + } + + private boolean hasSecondaryConstructors() { + return !getSecondaryConstructors().isEmpty(); + } + + @NotNull + public List getSecondaryConstructors() { + JetClassBody body = getBody(); + return body != null ? body.getSecondaryConstructors() : Collections.emptyList(); + } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetClassBody.java b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetClassBody.java index 104e6eae553..5b9a95b3c13 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetClassBody.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetClassBody.java @@ -61,6 +61,11 @@ public class JetClassBody extends JetElementImplStub getSecondaryConstructors() { + return getStubOrPsiChildrenAsList(JetStubElementTypes.SECONDARY_CONSTRUCTOR); + } + @NotNull public List getProperties() { return getStubOrPsiChildrenAsList(JetStubElementTypes.PROPERTY); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java index d1d9fc36d8b..8aa6a217927 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java @@ -1256,7 +1256,7 @@ public class DescriptorResolver { @NotNull JetClass classElement, BindingTrace trace ) { - if (classDescriptor.getKind() == ClassKind.ENUM_ENTRY) return null; + if (classDescriptor.getKind() == ClassKind.ENUM_ENTRY || !classElement.hasPrimaryConstructor()) return null; return createConstructorDescriptor( scope, classDescriptor, @@ -1266,6 +1266,25 @@ public class DescriptorResolver { classDescriptor.getTypeConstructor().getParameters(), classElement.getPrimaryConstructorParameters(), trace); } + @NotNull + public ConstructorDescriptorImpl resolveSecondaryConstructorDescriptor( + @NotNull JetScope scope, + @NotNull ClassDescriptor classDescriptor, + @NotNull JetSecondaryConstructor constructor, + @NotNull BindingTrace trace + ) { + return createConstructorDescriptor( + scope, + classDescriptor, + false, + constructor.getModifierList(), + constructor, + classDescriptor.getTypeConstructor().getParameters(), + constructor.getValueParameters(), + trace + ); + } + @NotNull public PropertyDescriptor resolvePrimaryConstructorParameterToAProperty( @NotNull ClassDescriptor classDescriptor, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope.kt index cf266c19411..68096c297a5 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope.kt @@ -262,9 +262,13 @@ public open class LazyClassMemberScope( override fun getPackage(name: Name): PackageViewDescriptor? = null - public fun getConstructors(): Set { - val constructor = getPrimaryConstructor() - return if (constructor != null) setOf(constructor) else setOf() + private val secondaryConstructors: NotNullLazyValue> + = c.storageManager.createLazyValue { resolveSecondaryConstructors() } + + public fun getConstructors(): Collection { + val result = secondaryConstructors() + val primaryConstructor = getPrimaryConstructor() + return if (primaryConstructor == null) result else result + primaryConstructor } public fun getPrimaryConstructor(): ConstructorDescriptor? = primaryConstructor() @@ -278,7 +282,7 @@ public open class LazyClassMemberScope( classOrObject as JetClass val constructor = c.descriptorResolver.resolvePrimaryConstructorDescriptor( thisDescriptor.getScopeForClassHeaderResolution(), thisDescriptor, classOrObject, trace) - assert(constructor != null) { "No constructor created for $thisDescriptor" } + constructor ?: return null setDeferredReturnType(constructor) return constructor } @@ -291,6 +295,20 @@ public open class LazyClassMemberScope( return null } + private fun resolveSecondaryConstructors(): Collection { + val classOrObject = declarationProvider.getOwnerInfo().getCorrespondingClassOrObject() + if (classOrObject !is JetClass) return emptyList() + if (thisDescriptor.getKind().isSingleton()) return emptyList() + + return classOrObject.getSecondaryConstructors().map { constructor -> + val descriptor = c.descriptorResolver.resolveSecondaryConstructorDescriptor( + thisDescriptor.getScopeForSecondaryConstructorHeaderResolution(), thisDescriptor, constructor, trace + ) + setDeferredReturnType(descriptor) + descriptor + } + } + protected fun setDeferredReturnType(descriptor: ConstructorDescriptorImpl) { descriptor.setReturnType(DeferredType.create(c.storageManager, trace, { thisDescriptor.getDefaultType() })) } diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/constructorCallType.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/constructorCallType.kt new file mode 100644 index 00000000000..24414bcf36a --- /dev/null +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/constructorCallType.kt @@ -0,0 +1,26 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER +class A(x: Int) { + constructor(x: Double) {} + constructor(x: String) {} +} +val x1: A = A(1) +val x2: A = A(1.0) +val x3: A = A("abc") + +class B { + constructor(x: String) {} + constructor(x: R) {} +} + +val y1: B = B(1) +val y2: B = B("") +val y3: B = B(1) +val y4: B = B("") + +val y5: B = B(1) +val y6: B = B("") // TODO: doesn't work here but ok on y8 +val y7: B = B(1) +val y8: B = B("") + +val y9 = B(1) +val y10 = B("") diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/constructorCallType.txt b/compiler/testData/diagnostics/tests/secondaryConstructors/constructorCallType.txt new file mode 100644 index 00000000000..560d2f78d2a --- /dev/null +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/constructorCallType.txt @@ -0,0 +1,32 @@ +package + +internal val x1: A +internal val x2: A +internal val x3: A +internal val y1: B +internal val y10: [ERROR : Type for B("")] +internal val y2: B +internal val y3: B +internal val y4: B +internal val y5: B +internal val y6: B +internal val y7: B +internal val y8: B +internal val y9: B + +internal final class A { + public constructor A(/*0*/ x: kotlin.Double) + public constructor A(/*0*/ x: kotlin.Int) + public constructor A(/*0*/ x: kotlin.String) + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +internal final class B { + public constructor B(/*0*/ x: R) + public constructor B(/*0*/ x: kotlin.String) + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/noPrimaryConstructor.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/noPrimaryConstructor.kt new file mode 100644 index 00000000000..6a55f3fd351 --- /dev/null +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/noPrimaryConstructor.kt @@ -0,0 +1,8 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER +class A { + constructor(x: Int) { + + } +} + +val x = A() diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/noPrimaryConstructor.txt b/compiler/testData/diagnostics/tests/secondaryConstructors/noPrimaryConstructor.txt new file mode 100644 index 00000000000..1806bab9b2a --- /dev/null +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/noPrimaryConstructor.txt @@ -0,0 +1,10 @@ +package + +internal val x: A + +internal final class A { + public constructor A(/*0*/ x: kotlin.Int) + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/resolvedCalls/secondaryConstructors/classWithGenerics.kt b/compiler/testData/resolvedCalls/secondaryConstructors/classWithGenerics.kt new file mode 100644 index 00000000000..27030a20544 --- /dev/null +++ b/compiler/testData/resolvedCalls/secondaryConstructors/classWithGenerics.kt @@ -0,0 +1,5 @@ +class A { + constructor(x: T) {} +} + +val y = A(1) diff --git a/compiler/testData/resolvedCalls/secondaryConstructors/classWithGenerics.txt b/compiler/testData/resolvedCalls/secondaryConstructors/classWithGenerics.txt new file mode 100644 index 00000000000..b57d7c631a5 --- /dev/null +++ b/compiler/testData/resolvedCalls/secondaryConstructors/classWithGenerics.txt @@ -0,0 +1,19 @@ +class A { + constructor(x: T) {} +} + +val y = A(1) + + +Resolved call: + +Candidate descriptor: constructor A(x: T) defined in A +Resulting descriptor: constructor A(x: Int) defined in A + +Explicit receiver kind = NO_EXPLICIT_RECEIVER +Dispatch receiver = NO_RECEIVER +Extension receiver = NO_RECEIVER + +Value arguments mapping: + +SUCCESS x : Int = 1 diff --git a/compiler/testData/resolvedCalls/secondaryConstructors/classWithGenerics2.kt b/compiler/testData/resolvedCalls/secondaryConstructors/classWithGenerics2.kt new file mode 100644 index 00000000000..8a8fe1009bd --- /dev/null +++ b/compiler/testData/resolvedCalls/secondaryConstructors/classWithGenerics2.kt @@ -0,0 +1,5 @@ +class A { + constructor(x: T) {} +} + +val y = A(1) \ No newline at end of file diff --git a/compiler/testData/resolvedCalls/secondaryConstructors/classWithGenerics2.txt b/compiler/testData/resolvedCalls/secondaryConstructors/classWithGenerics2.txt new file mode 100644 index 00000000000..ea3ed14f89f --- /dev/null +++ b/compiler/testData/resolvedCalls/secondaryConstructors/classWithGenerics2.txt @@ -0,0 +1,19 @@ +class A { + constructor(x: T) {} +} + +val y = A(1) + + +Resolved call: + +Candidate descriptor: constructor A(x: T) defined in A +Resulting descriptor: constructor A(x: Int) defined in A + +Explicit receiver kind = NO_EXPLICIT_RECEIVER +Dispatch receiver = NO_RECEIVER +Extension receiver = NO_RECEIVER + +Value arguments mapping: + +SUCCESS x : Int = 1 diff --git a/compiler/testData/resolvedCalls/secondaryConstructors/classWithGenerics3.kt b/compiler/testData/resolvedCalls/secondaryConstructors/classWithGenerics3.kt new file mode 100644 index 00000000000..df9d04b217b --- /dev/null +++ b/compiler/testData/resolvedCalls/secondaryConstructors/classWithGenerics3.kt @@ -0,0 +1,6 @@ +class B { + constructor(x: String) {} + constructor(x: R) {} +} + +val y8: B = B("") diff --git a/compiler/testData/resolvedCalls/secondaryConstructors/classWithGenerics3.txt b/compiler/testData/resolvedCalls/secondaryConstructors/classWithGenerics3.txt new file mode 100644 index 00000000000..4ef699d24d7 --- /dev/null +++ b/compiler/testData/resolvedCalls/secondaryConstructors/classWithGenerics3.txt @@ -0,0 +1,20 @@ +class B { + constructor(x: String) {} + constructor(x: R) {} +} + +val y8: B = B("") + + +Resolved call: + +Candidate descriptor: constructor B(x: String) defined in B +Resulting descriptor: constructor B(x: String) defined in B + +Explicit receiver kind = NO_EXPLICIT_RECEIVER +Dispatch receiver = NO_RECEIVER +Extension receiver = NO_RECEIVER + +Value arguments mapping: + +SUCCESS x : String = "" diff --git a/compiler/testData/resolvedCalls/secondaryConstructors/explicitPrimaryArgs.kt b/compiler/testData/resolvedCalls/secondaryConstructors/explicitPrimaryArgs.kt new file mode 100644 index 00000000000..8d52103fcb3 --- /dev/null +++ b/compiler/testData/resolvedCalls/secondaryConstructors/explicitPrimaryArgs.kt @@ -0,0 +1,10 @@ +class A(x: Double) { + constructor(x: Int) { + + } + constructor(x: String) { + + } +} + +A(1.0) diff --git a/compiler/testData/resolvedCalls/secondaryConstructors/explicitPrimaryArgs.txt b/compiler/testData/resolvedCalls/secondaryConstructors/explicitPrimaryArgs.txt new file mode 100644 index 00000000000..99052480fd9 --- /dev/null +++ b/compiler/testData/resolvedCalls/secondaryConstructors/explicitPrimaryArgs.txt @@ -0,0 +1,23 @@ +class A(x: Double) { + constructor(x: Int) { + + } + constructor(x: String) { + + } +} + +A(1.0) + + +Resolved call: + +Resulting descriptor: constructor A(x: Double) defined in A + +Explicit receiver kind = NO_EXPLICIT_RECEIVER +Dispatch receiver = NO_RECEIVER +Extension receiver = NO_RECEIVER + +Value arguments mapping: + +SUCCESS x : Double = 1.0 diff --git a/compiler/testData/resolvedCalls/secondaryConstructors/explicitPrimaryCallSecondary.kt b/compiler/testData/resolvedCalls/secondaryConstructors/explicitPrimaryCallSecondary.kt new file mode 100644 index 00000000000..b4bbd5e3e74 --- /dev/null +++ b/compiler/testData/resolvedCalls/secondaryConstructors/explicitPrimaryCallSecondary.kt @@ -0,0 +1,10 @@ +class A(x: Double) { + constructor(x: Int) { + + } + constructor(x: String) { + + } +} + +A("abc") diff --git a/compiler/testData/resolvedCalls/secondaryConstructors/explicitPrimaryCallSecondary.txt b/compiler/testData/resolvedCalls/secondaryConstructors/explicitPrimaryCallSecondary.txt new file mode 100644 index 00000000000..92fe8d431d1 --- /dev/null +++ b/compiler/testData/resolvedCalls/secondaryConstructors/explicitPrimaryCallSecondary.txt @@ -0,0 +1,23 @@ +class A(x: Double) { + constructor(x: Int) { + + } + constructor(x: String) { + + } +} + +A("abc") + + +Resolved call: + +Resulting descriptor: constructor A(x: String) defined in A + +Explicit receiver kind = NO_EXPLICIT_RECEIVER +Dispatch receiver = NO_RECEIVER +Extension receiver = NO_RECEIVER + +Value arguments mapping: + +SUCCESS x : String = "abc" diff --git a/compiler/testData/resolvedCalls/secondaryConstructors/explicitPrimaryNoArgs.kt b/compiler/testData/resolvedCalls/secondaryConstructors/explicitPrimaryNoArgs.kt new file mode 100644 index 00000000000..9f64c20e398 --- /dev/null +++ b/compiler/testData/resolvedCalls/secondaryConstructors/explicitPrimaryNoArgs.kt @@ -0,0 +1,10 @@ +class A() { + constructor(x: Int) { + + } + constructor(x: String) { + + } +} + +A() diff --git a/compiler/testData/resolvedCalls/secondaryConstructors/explicitPrimaryNoArgs.txt b/compiler/testData/resolvedCalls/secondaryConstructors/explicitPrimaryNoArgs.txt new file mode 100644 index 00000000000..4f2af293051 --- /dev/null +++ b/compiler/testData/resolvedCalls/secondaryConstructors/explicitPrimaryNoArgs.txt @@ -0,0 +1,19 @@ +class A() { + constructor(x: Int) { + + } + constructor(x: String) { + + } +} + +A() + + +Resolved call: + +Resulting descriptor: constructor A() defined in A + +Explicit receiver kind = NO_EXPLICIT_RECEIVER +Dispatch receiver = NO_RECEIVER +Extension receiver = NO_RECEIVER diff --git a/compiler/testData/resolvedCalls/secondaryConstructors/implicitPrimary.kt b/compiler/testData/resolvedCalls/secondaryConstructors/implicitPrimary.kt new file mode 100644 index 00000000000..7204614b36a --- /dev/null +++ b/compiler/testData/resolvedCalls/secondaryConstructors/implicitPrimary.kt @@ -0,0 +1,3 @@ +class A + +A() diff --git a/compiler/testData/resolvedCalls/secondaryConstructors/implicitPrimary.txt b/compiler/testData/resolvedCalls/secondaryConstructors/implicitPrimary.txt new file mode 100644 index 00000000000..d1345693f85 --- /dev/null +++ b/compiler/testData/resolvedCalls/secondaryConstructors/implicitPrimary.txt @@ -0,0 +1,12 @@ +class A + +A() + + +Resolved call: + +Resulting descriptor: constructor A() defined in A + +Explicit receiver kind = NO_EXPLICIT_RECEIVER +Dispatch receiver = NO_RECEIVER +Extension receiver = NO_RECEIVER diff --git a/compiler/testData/resolvedCalls/secondaryConstructors/overload1.kt b/compiler/testData/resolvedCalls/secondaryConstructors/overload1.kt new file mode 100644 index 00000000000..8f894342eaf --- /dev/null +++ b/compiler/testData/resolvedCalls/secondaryConstructors/overload1.kt @@ -0,0 +1,10 @@ +class A { + constructor(x: Int) { + + } + constructor(x: String) { + + } +} + +A("abc") diff --git a/compiler/testData/resolvedCalls/secondaryConstructors/overload1.txt b/compiler/testData/resolvedCalls/secondaryConstructors/overload1.txt new file mode 100644 index 00000000000..b930a56c468 --- /dev/null +++ b/compiler/testData/resolvedCalls/secondaryConstructors/overload1.txt @@ -0,0 +1,23 @@ +class A { + constructor(x: Int) { + + } + constructor(x: String) { + + } +} + +A("abc") + + +Resolved call: + +Resulting descriptor: constructor A(x: String) defined in A + +Explicit receiver kind = NO_EXPLICIT_RECEIVER +Dispatch receiver = NO_RECEIVER +Extension receiver = NO_RECEIVER + +Value arguments mapping: + +SUCCESS x : String = "abc" diff --git a/compiler/testData/resolvedCalls/secondaryConstructors/overload2.kt b/compiler/testData/resolvedCalls/secondaryConstructors/overload2.kt new file mode 100644 index 00000000000..d04297c8ee5 --- /dev/null +++ b/compiler/testData/resolvedCalls/secondaryConstructors/overload2.kt @@ -0,0 +1,10 @@ +class A { + constructor(x: Int) { + + } + constructor(x: String) { + + } +} + +A(1) diff --git a/compiler/testData/resolvedCalls/secondaryConstructors/overload2.txt b/compiler/testData/resolvedCalls/secondaryConstructors/overload2.txt new file mode 100644 index 00000000000..7e6ee5836b1 --- /dev/null +++ b/compiler/testData/resolvedCalls/secondaryConstructors/overload2.txt @@ -0,0 +1,23 @@ +class A { + constructor(x: Int) { + + } + constructor(x: String) { + + } +} + +A(1) + + +Resolved call: + +Resulting descriptor: constructor A(x: Int) defined in A + +Explicit receiver kind = NO_EXPLICIT_RECEIVER +Dispatch receiver = NO_RECEIVER +Extension receiver = NO_RECEIVER + +Value arguments mapping: + +SUCCESS x : Int = 1 diff --git a/compiler/testData/resolvedCalls/secondaryConstructors/overload3.kt b/compiler/testData/resolvedCalls/secondaryConstructors/overload3.kt new file mode 100644 index 00000000000..040cde48bf1 --- /dev/null +++ b/compiler/testData/resolvedCalls/secondaryConstructors/overload3.kt @@ -0,0 +1,10 @@ +class A { + constructor(x: Int) { + + } + constructor(x: Int, y: String) { + + } +} + +A(1, "abc") diff --git a/compiler/testData/resolvedCalls/secondaryConstructors/overload3.txt b/compiler/testData/resolvedCalls/secondaryConstructors/overload3.txt new file mode 100644 index 00000000000..ddb9e735fe3 --- /dev/null +++ b/compiler/testData/resolvedCalls/secondaryConstructors/overload3.txt @@ -0,0 +1,24 @@ +class A { + constructor(x: Int) { + + } + constructor(x: Int, y: String) { + + } +} + +A(1, "abc") + + +Resolved call: + +Resulting descriptor: constructor A(x: Int, y: String) defined in A + +Explicit receiver kind = NO_EXPLICIT_RECEIVER +Dispatch receiver = NO_RECEIVER +Extension receiver = NO_RECEIVER + +Value arguments mapping: + +SUCCESS x : Int = 1 +SUCCESS y : String = "abc" diff --git a/compiler/testData/resolvedCalls/secondaryConstructors/overloadDefault.kt b/compiler/testData/resolvedCalls/secondaryConstructors/overloadDefault.kt new file mode 100644 index 00000000000..ebd6b3b83c9 --- /dev/null +++ b/compiler/testData/resolvedCalls/secondaryConstructors/overloadDefault.kt @@ -0,0 +1,10 @@ +class A { + constructor(x: Int) { + + } + constructor(x: Double, y: String = "abc") { + + } +} + +A(1.0) diff --git a/compiler/testData/resolvedCalls/secondaryConstructors/overloadDefault.txt b/compiler/testData/resolvedCalls/secondaryConstructors/overloadDefault.txt new file mode 100644 index 00000000000..3869001c058 --- /dev/null +++ b/compiler/testData/resolvedCalls/secondaryConstructors/overloadDefault.txt @@ -0,0 +1,23 @@ +class A { + constructor(x: Int) { + + } + constructor(x: Double, y: String = "abc") { + + } +} + +A(1.0) + + +Resolved call: + +Resulting descriptor: constructor A(x: Double, y: String = ...) defined in A + +Explicit receiver kind = NO_EXPLICIT_RECEIVER +Dispatch receiver = NO_RECEIVER +Extension receiver = NO_RECEIVER + +Value arguments mapping: + +SUCCESS x : Double = 1.0 diff --git a/compiler/testData/resolvedCalls/secondaryConstructors/overloadNamed.kt b/compiler/testData/resolvedCalls/secondaryConstructors/overloadNamed.kt new file mode 100644 index 00000000000..ab59e1be087 --- /dev/null +++ b/compiler/testData/resolvedCalls/secondaryConstructors/overloadNamed.kt @@ -0,0 +1,10 @@ +class A { + constructor(x: Int) { + + } + constructor(x: Double, y: String = "abc") { + + } +} + +A(x=1.0) diff --git a/compiler/testData/resolvedCalls/secondaryConstructors/overloadNamed.txt b/compiler/testData/resolvedCalls/secondaryConstructors/overloadNamed.txt new file mode 100644 index 00000000000..e1e724073d8 --- /dev/null +++ b/compiler/testData/resolvedCalls/secondaryConstructors/overloadNamed.txt @@ -0,0 +1,23 @@ +class A { + constructor(x: Int) { + + } + constructor(x: Double, y: String = "abc") { + + } +} + +A(x=1.0) + + +Resolved call: + +Resulting descriptor: constructor A(x: Double, y: String = ...) defined in A + +Explicit receiver kind = NO_EXPLICIT_RECEIVER +Dispatch receiver = NO_RECEIVER +Extension receiver = NO_RECEIVER + +Value arguments mapping: + +SUCCESS x : Double = 1.0 diff --git a/compiler/testData/resolvedCalls/secondaryConstructors/simple.kt b/compiler/testData/resolvedCalls/secondaryConstructors/simple.kt new file mode 100644 index 00000000000..3b761f875a5 --- /dev/null +++ b/compiler/testData/resolvedCalls/secondaryConstructors/simple.kt @@ -0,0 +1,7 @@ +class A { + constructor(x: Int) { + + } +} + +A(1) diff --git a/compiler/testData/resolvedCalls/secondaryConstructors/simple.txt b/compiler/testData/resolvedCalls/secondaryConstructors/simple.txt new file mode 100644 index 00000000000..61b13118859 --- /dev/null +++ b/compiler/testData/resolvedCalls/secondaryConstructors/simple.txt @@ -0,0 +1,20 @@ +class A { + constructor(x: Int) { + + } +} + +A(1) + + +Resolved call: + +Resulting descriptor: constructor A(x: Int) defined in A + +Explicit receiver kind = NO_EXPLICIT_RECEIVER +Dispatch receiver = NO_RECEIVER +Extension receiver = NO_RECEIVER + +Value arguments mapping: + +SUCCESS x : Int = 1 diff --git a/compiler/testData/resolvedCalls/secondaryConstructors/varargs.kt b/compiler/testData/resolvedCalls/secondaryConstructors/varargs.kt new file mode 100644 index 00000000000..e5f66ae4b41 --- /dev/null +++ b/compiler/testData/resolvedCalls/secondaryConstructors/varargs.kt @@ -0,0 +1,5 @@ +class A { + constructor(vararg x: Int) {} +} + +val y = A(0, *intArray(1, 2, 3), 4)) \ No newline at end of file diff --git a/compiler/testData/resolvedCalls/secondaryConstructors/varargs.txt b/compiler/testData/resolvedCalls/secondaryConstructors/varargs.txt new file mode 100644 index 00000000000..cebf588508e --- /dev/null +++ b/compiler/testData/resolvedCalls/secondaryConstructors/varargs.txt @@ -0,0 +1,20 @@ +class A { + constructor(vararg x: Int) {} +} + +val y = A(0, *intArray(1, 2, 3), 4)) + + +Resolved call: + +Resulting descriptor: constructor A(vararg x: Int) defined in A + +Explicit receiver kind = NO_EXPLICIT_RECEIVER +Dispatch receiver = NO_RECEIVER +Extension receiver = NO_RECEIVER + +Value arguments mapping: + +SUCCESS x : IntArray = 0 +SUCCESS x : IntArray = intArray(1, 2, 3) +SUCCESS x : IntArray = 4 diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index 7706b93b941..66681ef7e3a 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -86,6 +86,7 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { Tests.Regressions.class, Tests.Resolve.class, Tests.Scopes.class, + Tests.SecondaryConstructors.class, Tests.SenselessComparison.class, Tests.Shadowing.class, Tests.SmartCasts.class, @@ -10388,6 +10389,27 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { } } + @TestMetadata("compiler/testData/diagnostics/tests/secondaryConstructors") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class SecondaryConstructors extends AbstractJetDiagnosticsTest { + public void testAllFilesPresentInSecondaryConstructors() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/tests/secondaryConstructors"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("constructorCallType.kt") + public void testConstructorCallType() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/secondaryConstructors/constructorCallType.kt"); + doTest(fileName); + } + + @TestMetadata("noPrimaryConstructor.kt") + public void testNoPrimaryConstructor() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/secondaryConstructors/noPrimaryConstructor.kt"); + doTest(fileName); + } + } + @TestMetadata("compiler/testData/diagnostics/tests/senselessComparison") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/compiler/tests/org/jetbrains/kotlin/resolve/calls/ResolvedCallsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/resolve/calls/ResolvedCallsTestGenerated.java index 441e6e6cbcf..67b7d15a1ed 100644 --- a/compiler/tests/org/jetbrains/kotlin/resolve/calls/ResolvedCallsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/resolve/calls/ResolvedCallsTestGenerated.java @@ -39,6 +39,7 @@ import java.util.regex.Pattern; ResolvedCallsTestGenerated.ObjectsAndClassObjects.class, ResolvedCallsTestGenerated.RealExamples.class, ResolvedCallsTestGenerated.Resolve.class, + ResolvedCallsTestGenerated.SecondaryConstructors.class, ResolvedCallsTestGenerated.ThisOrSuper.class, }) @RunWith(JUnit3RunnerWithInners.class) @@ -529,6 +530,99 @@ public class ResolvedCallsTestGenerated extends AbstractResolvedCallsTest { } } + @TestMetadata("compiler/testData/resolvedCalls/secondaryConstructors") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class SecondaryConstructors extends AbstractResolvedCallsTest { + public void testAllFilesPresentInSecondaryConstructors() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/resolvedCalls/secondaryConstructors"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("classWithGenerics.kt") + public void testClassWithGenerics() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/resolvedCalls/secondaryConstructors/classWithGenerics.kt"); + doTest(fileName); + } + + @TestMetadata("classWithGenerics2.kt") + public void testClassWithGenerics2() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/resolvedCalls/secondaryConstructors/classWithGenerics2.kt"); + doTest(fileName); + } + + @TestMetadata("classWithGenerics3.kt") + public void testClassWithGenerics3() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/resolvedCalls/secondaryConstructors/classWithGenerics3.kt"); + doTest(fileName); + } + + @TestMetadata("explicitPrimaryArgs.kt") + public void testExplicitPrimaryArgs() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/resolvedCalls/secondaryConstructors/explicitPrimaryArgs.kt"); + doTest(fileName); + } + + @TestMetadata("explicitPrimaryCallSecondary.kt") + public void testExplicitPrimaryCallSecondary() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/resolvedCalls/secondaryConstructors/explicitPrimaryCallSecondary.kt"); + doTest(fileName); + } + + @TestMetadata("explicitPrimaryNoArgs.kt") + public void testExplicitPrimaryNoArgs() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/resolvedCalls/secondaryConstructors/explicitPrimaryNoArgs.kt"); + doTest(fileName); + } + + @TestMetadata("implicitPrimary.kt") + public void testImplicitPrimary() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/resolvedCalls/secondaryConstructors/implicitPrimary.kt"); + doTest(fileName); + } + + @TestMetadata("overload1.kt") + public void testOverload1() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/resolvedCalls/secondaryConstructors/overload1.kt"); + doTest(fileName); + } + + @TestMetadata("overload2.kt") + public void testOverload2() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/resolvedCalls/secondaryConstructors/overload2.kt"); + doTest(fileName); + } + + @TestMetadata("overload3.kt") + public void testOverload3() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/resolvedCalls/secondaryConstructors/overload3.kt"); + doTest(fileName); + } + + @TestMetadata("overloadDefault.kt") + public void testOverloadDefault() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/resolvedCalls/secondaryConstructors/overloadDefault.kt"); + doTest(fileName); + } + + @TestMetadata("overloadNamed.kt") + public void testOverloadNamed() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/resolvedCalls/secondaryConstructors/overloadNamed.kt"); + doTest(fileName); + } + + @TestMetadata("simple.kt") + public void testSimple() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/resolvedCalls/secondaryConstructors/simple.kt"); + doTest(fileName); + } + + @TestMetadata("varargs.kt") + public void testVarargs() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/resolvedCalls/secondaryConstructors/varargs.kt"); + doTest(fileName); + } + } + @TestMetadata("compiler/testData/resolvedCalls/thisOrSuper") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)