Prohibit references to members of containing class in super constructor of nested object

#KT-25289 In Progress
This commit is contained in:
Dmitriy Novozhilov
2021-04-06 13:29:58 +03:00
committed by TeamCityServer
parent 3c093f57ba
commit 53b6d6f767
14 changed files with 471 additions and 1 deletions
@@ -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 {
@@ -436,6 +436,8 @@ public interface Errors {
// Companion objects
DiagnosticFactory0<KtObjectDeclaration> MANY_COMPANION_OBJECTS = DiagnosticFactory0.create(ERROR, COMPANION_OBJECT);
DiagnosticFactory0<KtExpression> SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR_WARNING = DiagnosticFactory0.create(WARNING);
DiagnosticFactory0<KtExpression> SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR = DiagnosticFactory0.create(ERROR);
// Objects
@@ -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);
@@ -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<AdditionalTypeChecker>()
private val DEFAULT_CLASSIFIER_USAGE_CHECKERS = listOf(
@@ -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,
@@ -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))
}
}
}
}
@@ -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 })
}
@@ -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(<!SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR!>prop<!>, <!SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR!>baseProp<!>)
}
open class Foo2(val prop: Int, baseProp: String) : Base(baseProp) {
companion object : Foo2(<!SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR!>this.<!SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR!>prop<!><!>, <!SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR!>this.<!SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR!>baseProp<!><!>)
}
open class Foo3(val prop: Int, baseProp: String) : Base(baseProp) {
companion object : Foo3(<!SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR!>Companion.<!SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR!>prop<!><!>, <!SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR!>Companion.<!SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR!>baseProp<!><!>)
}
open class Foo4(val prop: Int, baseProp: String) : Base(baseProp) {
object MyObject : Foo4(<!SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR!>MyObject.<!SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR!>prop<!><!>, <!SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR!>MyObject.<!SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR!>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) { <!SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR!>prop<!> })
}
@@ -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
}
}
@@ -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 })
}
@@ -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(<!SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR_WARNING!>prop<!>, <!SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR_WARNING!>baseProp<!>)
}
open class Foo2(val prop: Int, baseProp: String) : Base(baseProp) {
companion object : Foo2(<!SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR_WARNING!>this.<!SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR_WARNING!>prop<!><!>, <!SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR_WARNING!>this.<!SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR_WARNING!>baseProp<!><!>)
}
open class Foo3(val prop: Int, baseProp: String) : Base(baseProp) {
companion object : Foo3(<!SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR_WARNING!>Companion.<!SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR_WARNING!>prop<!><!>, <!SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR_WARNING!>Companion.<!SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR_WARNING!>baseProp<!><!>)
}
open class Foo4(val prop: Int, baseProp: String) : Base(baseProp) {
object MyObject : Foo4(<!SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR_WARNING!>MyObject.<!SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR_WARNING!>prop<!><!>, <!SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR_WARNING!>MyObject.<!SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR_WARNING!>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) { <!SELF_CALL_IN_NESTED_OBJECT_CONSTRUCTOR_WARNING!>prop<!> })
}
@@ -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
}
}
@@ -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 {
@@ -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),