diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index 1d1118275ed..125ff5ec65d 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -4243,6 +4243,18 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/classObjects/resolveFunctionInsideClassObject.kt"); } + @Test + @TestMetadata("selfCallsInCompanionSuperConstructor_error.kt") + public void testSelfCallsInCompanionSuperConstructor_error() throws Exception { + runTest("compiler/testData/diagnostics/tests/classObjects/selfCallsInCompanionSuperConstructor_error.kt"); + } + + @Test + @TestMetadata("selfCallsInCompanionSuperConstructor_warning.kt") + public void testSelfCallsInCompanionSuperConstructor_warning() throws Exception { + runTest("compiler/testData/diagnostics/tests/classObjects/selfCallsInCompanionSuperConstructor_warning.kt"); + } + @Test @TestMetadata("typeParametersInAnnonymousObject.kt") public void testTypeParametersInAnnonymousObject() throws Exception { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index f903eb4bbd1..aee06fa7107 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -436,6 +436,8 @@ public interface Errors { // Companion objects DiagnosticFactory0 MANY_COMPANION_OBJECTS = DiagnosticFactory0.create(ERROR, COMPANION_OBJECT); + DiagnosticFactory0 SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR_WARNING = DiagnosticFactory0.create(WARNING); + DiagnosticFactory0 SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR = DiagnosticFactory0.create(ERROR); // Objects diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index 90b2252db63..bb87ce2a511 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -12,9 +12,11 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.config.LanguageVersion; import org.jetbrains.kotlin.diagnostics.DiagnosticFactory; +import org.jetbrains.kotlin.diagnostics.DiagnosticFactory0; import org.jetbrains.kotlin.diagnostics.Errors; import org.jetbrains.kotlin.diagnostics.UnboundDiagnostic; import org.jetbrains.kotlin.metadata.deserialization.VersionRequirement; +import org.jetbrains.kotlin.psi.KtExpression; import org.jetbrains.kotlin.resolve.VarianceConflictDiagnosticData; import org.jetbrains.kotlin.types.KotlinTypeKt; import org.jetbrains.kotlin.util.OperatorNameConventions; @@ -27,6 +29,8 @@ import java.util.List; import java.util.ServiceLoader; import static org.jetbrains.kotlin.diagnostics.Errors.*; +import static org.jetbrains.kotlin.diagnostics.Severity.ERROR; +import static org.jetbrains.kotlin.diagnostics.Severity.WARNING; import static org.jetbrains.kotlin.diagnostics.rendering.Renderers.*; import static org.jetbrains.kotlin.diagnostics.rendering.RenderingContext.of; @@ -366,6 +370,9 @@ public class DefaultErrorMessages { MAP.put(MANY_COMPANION_OBJECTS, "Only one companion object is allowed per class"); + MAP.put(SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR_WARNING, "Self references to members of containing class are prohibited in constructor of nested object"); + MAP.put(SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR, "Self references to members of containing class are prohibited in constructor of nested object"); + MAP.put(DEPRECATION, "''{0}'' is deprecated. {1}", DEPRECATION_RENDERER, STRING); MAP.put(DEPRECATION_ERROR, "Using ''{0}'' is an error. {1}", DEPRECATION_RENDERER, STRING); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/PlatformConfiguratorBase.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/PlatformConfiguratorBase.kt index 169921f5074..8e9a5ffe72c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/PlatformConfiguratorBase.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/PlatformConfiguratorBase.kt @@ -58,7 +58,7 @@ private val DEFAULT_CALL_CHECKERS = listOf( NamedFunAsExpressionChecker, ContractNotAllowedCallChecker, ReifiedTypeParameterSubstitutionChecker(), MissingDependencySupertypeChecker.ForCalls, AbstractClassInstantiationChecker, SuspendConversionCallChecker, UnitConversionCallChecker, FunInterfaceConstructorReferenceChecker, NullableExtensionOperatorWithSafeCallChecker, - ReferencingToUnderscoreNamedParameterOfCatchBlockChecker, VarargWrongExecutionOrderChecker + ReferencingToUnderscoreNamedParameterOfCatchBlockChecker, VarargWrongExecutionOrderChecker, SelfCallInNestedObjectConstructorChecker ) private val DEFAULT_TYPE_CHECKERS = emptyList() private val DEFAULT_CLASSIFIER_USAGE_CHECKERS = listOf( diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolverUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolverUtil.kt index cc3cf0c0c67..199dc8656aa 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolverUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolverUtil.kt @@ -40,6 +40,7 @@ import org.jetbrains.kotlin.types.checker.KotlinTypeChecker import org.jetbrains.kotlin.types.expressions.OperatorConventions import org.jetbrains.kotlin.types.typeUtil.contains import org.jetbrains.kotlin.utils.SmartList +import kotlin.math.exp enum class ResolveArgumentsMode { RESOLVE_FUNCTION_ARGUMENTS, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/SelfCallInNestedObjectConstructorChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/SelfCallInNestedObjectConstructorChecker.kt new file mode 100644 index 00000000000..63ff6ba8de7 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/SelfCallInNestedObjectConstructorChecker.kt @@ -0,0 +1,77 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.resolve.calls.checkers + +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.config.LanguageFeature +import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.descriptors.ClassKind +import org.jetbrains.kotlin.descriptors.ConstructorDescriptor +import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.psi.KtElement +import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtVisitorVoid +import org.jetbrains.kotlin.resolve.BindingTrace +import org.jetbrains.kotlin.resolve.DescriptorUtils +import org.jetbrains.kotlin.resolve.calls.callResolverUtil.isSuperOrDelegatingConstructorCall +import org.jetbrains.kotlin.resolve.calls.callUtil.getCall +import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall +import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall +import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue + +object SelfCallInNestedObjectConstructorChecker : CallChecker { + override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) { + val candidateDescriptor = resolvedCall.candidateDescriptor + val call = resolvedCall.call + + if (candidateDescriptor !is ConstructorDescriptor || !isSuperOrDelegatingConstructorCall(call)) return + val constructedObject = context.resolutionContext.scope.ownerDescriptor.containingDeclaration as? ClassDescriptor ?: return + if (constructedObject.kind != ClassKind.OBJECT) return + val containingClass = constructedObject.containingDeclaration as? ClassDescriptor ?: return + if (candidateDescriptor.constructedClass == containingClass) { + val reportError = context.languageVersionSettings.supportsFeature(LanguageFeature.ProhibitSelfCallsInNestedObjects) + val visitor = Visitor(containingClass, context.trace, reportError) + resolvedCall.call.valueArgumentList?.accept(visitor) + } + } + + private class Visitor( + val containingClass: ClassDescriptor, + val trace: BindingTrace, + val reportError: Boolean + ) : KtVisitorVoid() { + override fun visitKtElement(element: KtElement) { + element.acceptChildren(this, null) + } + + override fun visitExpression(expression: KtExpression) { + checkArgument(expression) + expression.acceptChildren(this, null) + } + + private fun checkArgument(argumentExpression: KtExpression) { + val call = argumentExpression.getCall(trace.bindingContext) ?: return + val resolvedCall = call.getResolvedCall(trace.bindingContext) ?: return + checkReceiver(resolvedCall.dispatchReceiver, argumentExpression) + } + + private fun checkReceiver( + receiver: ReceiverValue?, + argument: KtExpression + ) { + val receiverType = receiver?.type ?: return + val receiverClass = receiverType.constructor.declarationDescriptor as? ClassDescriptor ?: return + if (DescriptorUtils.isSubclass(receiverClass, containingClass)) { + val factory = if (reportError) { + Errors.SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR + } else { + Errors.SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR_WARNING + } + trace.report(factory.on(argument)) + } + } + } +} diff --git a/compiler/testData/diagnostics/tests/classObjects/selfCallsInCompanionSuperConstructor_error.fir.kt b/compiler/testData/diagnostics/tests/classObjects/selfCallsInCompanionSuperConstructor_error.fir.kt new file mode 100644 index 00000000000..b80827aff7d --- /dev/null +++ b/compiler/testData/diagnostics/tests/classObjects/selfCallsInCompanionSuperConstructor_error.fir.kt @@ -0,0 +1,30 @@ +// !LANGUAGE: +ProhibitSelfCallsInNestedObjects +// ISSUE: KT-25289 + +abstract class Base(val baseProp: String) + +open class Foo1(val prop: Int, baseProp: String) : Base(baseProp) { + companion object : Foo1(prop, baseProp) +} + +open class Foo2(val prop: Int, baseProp: String) : Base(baseProp) { + companion object : Foo2(this.prop, this.baseProp) +} + +open class Foo3(val prop: Int, baseProp: String) : Base(baseProp) { + companion object : Foo3(Companion.prop, Companion.baseProp) +} + +open class Foo4(val prop: Int, baseProp: String) : Base(baseProp) { + object MyObject : Foo4(MyObject.prop, MyObject.baseProp) +} + +open class CheckNested(a: Any) { + class Nested + + companion object : CheckNested(Nested()) // Nested() doesn't have receiver, so there will be no error +} + +open class Foo5(val prop: Int) { + object MyObject : Foo5(with(MyObject) { prop }) +} diff --git a/compiler/testData/diagnostics/tests/classObjects/selfCallsInCompanionSuperConstructor_error.kt b/compiler/testData/diagnostics/tests/classObjects/selfCallsInCompanionSuperConstructor_error.kt new file mode 100644 index 00000000000..2608a9d2c65 --- /dev/null +++ b/compiler/testData/diagnostics/tests/classObjects/selfCallsInCompanionSuperConstructor_error.kt @@ -0,0 +1,30 @@ +// !LANGUAGE: +ProhibitSelfCallsInNestedObjects +// ISSUE: KT-25289 + +abstract class Base(val baseProp: String) + +open class Foo1(val prop: Int, baseProp: String) : Base(baseProp) { + companion object : Foo1(prop, baseProp) +} + +open class Foo2(val prop: Int, baseProp: String) : Base(baseProp) { + companion object : Foo2(this.prop, this.baseProp) +} + +open class Foo3(val prop: Int, baseProp: String) : Base(baseProp) { + companion object : Foo3(Companion.prop, Companion.baseProp) +} + +open class Foo4(val prop: Int, baseProp: String) : Base(baseProp) { + object MyObject : Foo4(MyObject.prop, MyObject.baseProp) +} + +open class CheckNested(a: Any) { + class Nested + + companion object : CheckNested(Nested()) // Nested() doesn't have receiver, so there will be no error +} + +open class Foo5(val prop: Int) { + object MyObject : Foo5(with(MyObject) { prop }) +} diff --git a/compiler/testData/diagnostics/tests/classObjects/selfCallsInCompanionSuperConstructor_error.txt b/compiler/testData/diagnostics/tests/classObjects/selfCallsInCompanionSuperConstructor_error.txt new file mode 100644 index 00000000000..8f5370b36cb --- /dev/null +++ b/compiler/testData/diagnostics/tests/classObjects/selfCallsInCompanionSuperConstructor_error.txt @@ -0,0 +1,119 @@ +package + +public abstract class Base { + public constructor Base(/*0*/ baseProp: kotlin.String) + public final val baseProp: 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 +} + +public open class CheckNested { + public constructor CheckNested(/*0*/ a: kotlin.Any) + 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 + + public companion object Companion : CheckNested { + private constructor Companion() + 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 + } + + public final class Nested { + public constructor Nested() + 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 + } +} + +public open class Foo1 : Base { + public constructor Foo1(/*0*/ prop: kotlin.Int, /*1*/ baseProp: kotlin.String) + public final override /*1*/ /*fake_override*/ val baseProp: kotlin.String + public final val prop: 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 + + public companion object Companion : Foo1 { + private constructor Companion() + public final override /*1*/ /*fake_override*/ val baseProp: kotlin.String + public final override /*1*/ /*fake_override*/ val prop: 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 + } +} + +public open class Foo2 : Base { + public constructor Foo2(/*0*/ prop: kotlin.Int, /*1*/ baseProp: kotlin.String) + public final override /*1*/ /*fake_override*/ val baseProp: kotlin.String + public final val prop: 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 + + public companion object Companion : Foo2 { + private constructor Companion() + public final override /*1*/ /*fake_override*/ val baseProp: kotlin.String + public final override /*1*/ /*fake_override*/ val prop: 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 + } +} + +public open class Foo3 : Base { + public constructor Foo3(/*0*/ prop: kotlin.Int, /*1*/ baseProp: kotlin.String) + public final override /*1*/ /*fake_override*/ val baseProp: kotlin.String + public final val prop: 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 + + public companion object Companion : Foo3 { + private constructor Companion() + public final override /*1*/ /*fake_override*/ val baseProp: kotlin.String + public final override /*1*/ /*fake_override*/ val prop: 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 + } +} + +public open class Foo4 : Base { + public constructor Foo4(/*0*/ prop: kotlin.Int, /*1*/ baseProp: kotlin.String) + public final override /*1*/ /*fake_override*/ val baseProp: kotlin.String + public final val prop: 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 + + public object MyObject : Foo4 { + private constructor MyObject() + public final override /*1*/ /*fake_override*/ val baseProp: kotlin.String + public final override /*1*/ /*fake_override*/ val prop: 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 + } +} + +public open class Foo5 { + public constructor Foo5(/*0*/ prop: kotlin.Int) + public final val prop: 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 + + public object MyObject : Foo5 { + private constructor MyObject() + public final override /*1*/ /*fake_override*/ val prop: 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/diagnostics/tests/classObjects/selfCallsInCompanionSuperConstructor_warning.fir.kt b/compiler/testData/diagnostics/tests/classObjects/selfCallsInCompanionSuperConstructor_warning.fir.kt new file mode 100644 index 00000000000..805a1e748f4 --- /dev/null +++ b/compiler/testData/diagnostics/tests/classObjects/selfCallsInCompanionSuperConstructor_warning.fir.kt @@ -0,0 +1,30 @@ +// !LANGUAGE: -ProhibitSelfCallsInNestedObjects +// ISSUE: KT-25289 + +abstract class Base(val baseProp: String) + +open class Foo1(val prop: Int, baseProp: String) : Base(baseProp) { + companion object : Foo1(prop, baseProp) +} + +open class Foo2(val prop: Int, baseProp: String) : Base(baseProp) { + companion object : Foo2(this.prop, this.baseProp) +} + +open class Foo3(val prop: Int, baseProp: String) : Base(baseProp) { + companion object : Foo3(Companion.prop, Companion.baseProp) +} + +open class Foo4(val prop: Int, baseProp: String) : Base(baseProp) { + object MyObject : Foo4(MyObject.prop, MyObject.baseProp) +} + +open class CheckNested(a: Any) { + class Nested + + companion object : CheckNested(Nested()) // Nested() doesn't have receiver, so there will be no error +} + +open class Foo5(val prop: Int) { + object MyObject : Foo5(with(MyObject) { prop }) +} diff --git a/compiler/testData/diagnostics/tests/classObjects/selfCallsInCompanionSuperConstructor_warning.kt b/compiler/testData/diagnostics/tests/classObjects/selfCallsInCompanionSuperConstructor_warning.kt new file mode 100644 index 00000000000..9bbd0e92e28 --- /dev/null +++ b/compiler/testData/diagnostics/tests/classObjects/selfCallsInCompanionSuperConstructor_warning.kt @@ -0,0 +1,30 @@ +// !LANGUAGE: -ProhibitSelfCallsInNestedObjects +// ISSUE: KT-25289 + +abstract class Base(val baseProp: String) + +open class Foo1(val prop: Int, baseProp: String) : Base(baseProp) { + companion object : Foo1(prop, baseProp) +} + +open class Foo2(val prop: Int, baseProp: String) : Base(baseProp) { + companion object : Foo2(this.prop, this.baseProp) +} + +open class Foo3(val prop: Int, baseProp: String) : Base(baseProp) { + companion object : Foo3(Companion.prop, Companion.baseProp) +} + +open class Foo4(val prop: Int, baseProp: String) : Base(baseProp) { + object MyObject : Foo4(MyObject.prop, MyObject.baseProp) +} + +open class CheckNested(a: Any) { + class Nested + + companion object : CheckNested(Nested()) // Nested() doesn't have receiver, so there will be no error +} + +open class Foo5(val prop: Int) { + object MyObject : Foo5(with(MyObject) { prop }) +} diff --git a/compiler/testData/diagnostics/tests/classObjects/selfCallsInCompanionSuperConstructor_warning.txt b/compiler/testData/diagnostics/tests/classObjects/selfCallsInCompanionSuperConstructor_warning.txt new file mode 100644 index 00000000000..8f5370b36cb --- /dev/null +++ b/compiler/testData/diagnostics/tests/classObjects/selfCallsInCompanionSuperConstructor_warning.txt @@ -0,0 +1,119 @@ +package + +public abstract class Base { + public constructor Base(/*0*/ baseProp: kotlin.String) + public final val baseProp: 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 +} + +public open class CheckNested { + public constructor CheckNested(/*0*/ a: kotlin.Any) + 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 + + public companion object Companion : CheckNested { + private constructor Companion() + 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 + } + + public final class Nested { + public constructor Nested() + 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 + } +} + +public open class Foo1 : Base { + public constructor Foo1(/*0*/ prop: kotlin.Int, /*1*/ baseProp: kotlin.String) + public final override /*1*/ /*fake_override*/ val baseProp: kotlin.String + public final val prop: 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 + + public companion object Companion : Foo1 { + private constructor Companion() + public final override /*1*/ /*fake_override*/ val baseProp: kotlin.String + public final override /*1*/ /*fake_override*/ val prop: 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 + } +} + +public open class Foo2 : Base { + public constructor Foo2(/*0*/ prop: kotlin.Int, /*1*/ baseProp: kotlin.String) + public final override /*1*/ /*fake_override*/ val baseProp: kotlin.String + public final val prop: 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 + + public companion object Companion : Foo2 { + private constructor Companion() + public final override /*1*/ /*fake_override*/ val baseProp: kotlin.String + public final override /*1*/ /*fake_override*/ val prop: 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 + } +} + +public open class Foo3 : Base { + public constructor Foo3(/*0*/ prop: kotlin.Int, /*1*/ baseProp: kotlin.String) + public final override /*1*/ /*fake_override*/ val baseProp: kotlin.String + public final val prop: 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 + + public companion object Companion : Foo3 { + private constructor Companion() + public final override /*1*/ /*fake_override*/ val baseProp: kotlin.String + public final override /*1*/ /*fake_override*/ val prop: 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 + } +} + +public open class Foo4 : Base { + public constructor Foo4(/*0*/ prop: kotlin.Int, /*1*/ baseProp: kotlin.String) + public final override /*1*/ /*fake_override*/ val baseProp: kotlin.String + public final val prop: 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 + + public object MyObject : Foo4 { + private constructor MyObject() + public final override /*1*/ /*fake_override*/ val baseProp: kotlin.String + public final override /*1*/ /*fake_override*/ val prop: 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 + } +} + +public open class Foo5 { + public constructor Foo5(/*0*/ prop: kotlin.Int) + public final val prop: 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 + + public object MyObject : Foo5 { + private constructor MyObject() + public final override /*1*/ /*fake_override*/ val prop: 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/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index eca0f962cc9..2c55f44ebef 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -4249,6 +4249,18 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/classObjects/resolveFunctionInsideClassObject.kt"); } + @Test + @TestMetadata("selfCallsInCompanionSuperConstructor_error.kt") + public void testSelfCallsInCompanionSuperConstructor_error() throws Exception { + runTest("compiler/testData/diagnostics/tests/classObjects/selfCallsInCompanionSuperConstructor_error.kt"); + } + + @Test + @TestMetadata("selfCallsInCompanionSuperConstructor_warning.kt") + public void testSelfCallsInCompanionSuperConstructor_warning() throws Exception { + runTest("compiler/testData/diagnostics/tests/classObjects/selfCallsInCompanionSuperConstructor_warning.kt"); + } + @Test @TestMetadata("typeParametersInAnnonymousObject.kt") public void testTypeParametersInAnnonymousObject() throws Exception { diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index 21a48ed8c89..a23d3c83b66 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -166,6 +166,7 @@ enum class LanguageFeature( ProhibitJvmFieldOnOverrideFromInterfaceInPrimaryConstructor(KOTLIN_1_6, kind = BUG_FIX), PrivateInFileEffectiveVisibility(KOTLIN_1_6, kind = BUG_FIX), ForbidUsingExtensionPropertyTypeParameterInDelegate(KOTLIN_1_6, kind = BUG_FIX), + ProhibitSelfCallsInNestedObjects(KOTLIN_1_6, kind = BUG_FIX), // Temporarily disabled, see KT-27084/KT-22379 SoundSmartcastFromLoopConditionForLoopAssignedVariables(sinceVersion = null, kind = BUG_FIX),