Prohibit references to members of containing class in super constructor of nested object
#KT-25289 In Progress
This commit is contained in:
committed by
TeamCityServer
parent
3c093f57ba
commit
53b6d6f767
+12
@@ -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
|
||||
|
||||
|
||||
+7
@@ -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,
|
||||
|
||||
+77
@@ -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))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Vendored
+30
@@ -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 })
|
||||
}
|
||||
Vendored
+30
@@ -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<!> })
|
||||
}
|
||||
Vendored
+119
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
compiler/testData/diagnostics/tests/classObjects/selfCallsInCompanionSuperConstructor_warning.fir.kt
Vendored
+30
@@ -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 })
|
||||
}
|
||||
Vendored
+30
@@ -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<!> })
|
||||
}
|
||||
Vendored
+119
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Generated
+12
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user