[NI] Move abstract class instantiation check to call checkers
This way the check works for callable reference arguments. Also candidate applicability during resolution does not change compared to the old inference. ^KT-37530 Fixed
This commit is contained in:
+10
@@ -1884,6 +1884,11 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirOldFronte
|
|||||||
runTest("compiler/testData/diagnostics/tests/callableReference/kt35959.kt");
|
runTest("compiler/testData/diagnostics/tests/callableReference/kt35959.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt37530.kt")
|
||||||
|
public void testKt37530() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/callableReference/kt37530.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt7430_wrongClassOnLHS.kt")
|
@TestMetadata("kt7430_wrongClassOnLHS.kt")
|
||||||
public void testKt7430_wrongClassOnLHS() throws Exception {
|
public void testKt7430_wrongClassOnLHS() throws Exception {
|
||||||
runTest("compiler/testData/diagnostics/tests/callableReference/kt7430_wrongClassOnLHS.kt");
|
runTest("compiler/testData/diagnostics/tests/callableReference/kt7430_wrongClassOnLHS.kt");
|
||||||
@@ -15860,6 +15865,11 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirOldFronte
|
|||||||
runTest("compiler/testData/diagnostics/tests/overload/defaultParameters.kt");
|
runTest("compiler/testData/diagnostics/tests/overload/defaultParameters.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("disambiguateByFailedAbstractClassCheck.kt")
|
||||||
|
public void testDisambiguateByFailedAbstractClassCheck() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/overload/disambiguateByFailedAbstractClassCheck.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("EmptyArgumentListInLambda.kt")
|
@TestMetadata("EmptyArgumentListInLambda.kt")
|
||||||
public void testEmptyArgumentListInLambda() throws Exception {
|
public void testEmptyArgumentListInLambda() throws Exception {
|
||||||
runTest("compiler/testData/diagnostics/tests/overload/EmptyArgumentListInLambda.kt");
|
runTest("compiler/testData/diagnostics/tests/overload/EmptyArgumentListInLambda.kt");
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ private val DEFAULT_CALL_CHECKERS = listOf(
|
|||||||
PrimitiveNumericComparisonCallChecker, LambdaWithSuspendModifierCallChecker,
|
PrimitiveNumericComparisonCallChecker, LambdaWithSuspendModifierCallChecker,
|
||||||
UselessElvisCallChecker(), ResultTypeWithNullableOperatorsChecker(), NullableVarargArgumentCallChecker,
|
UselessElvisCallChecker(), ResultTypeWithNullableOperatorsChecker(), NullableVarargArgumentCallChecker,
|
||||||
NamedFunAsExpressionChecker, ContractNotAllowedCallChecker, ReifiedTypeParameterSubstitutionChecker(), TypeOfChecker,
|
NamedFunAsExpressionChecker, ContractNotAllowedCallChecker, ReifiedTypeParameterSubstitutionChecker(), TypeOfChecker,
|
||||||
MissingDependencySupertypeChecker.ForCalls
|
MissingDependencySupertypeChecker.ForCalls, AbstractClassInstantiationChecker,
|
||||||
)
|
)
|
||||||
private val DEFAULT_TYPE_CHECKERS = emptyList<AdditionalTypeChecker>()
|
private val DEFAULT_TYPE_CHECKERS = emptyList<AdditionalTypeChecker>()
|
||||||
private val DEFAULT_CLASSIFIER_USAGE_CHECKERS = listOf(
|
private val DEFAULT_CLASSIFIER_USAGE_CHECKERS = listOf(
|
||||||
|
|||||||
+29
@@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 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.descriptors.ConstructorDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
|
import org.jetbrains.kotlin.diagnostics.Errors.CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS
|
||||||
|
import org.jetbrains.kotlin.diagnostics.reportDiagnosticOnce
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.callResolverUtil.isSuperOrDelegatingConstructorCall
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
||||||
|
|
||||||
|
object AbstractClassInstantiationChecker : CallChecker {
|
||||||
|
override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) {
|
||||||
|
val candidateDescriptor = resolvedCall.candidateDescriptor
|
||||||
|
val call = resolvedCall.call
|
||||||
|
|
||||||
|
if (candidateDescriptor is ConstructorDescriptor &&
|
||||||
|
!isSuperOrDelegatingConstructorCall(call)
|
||||||
|
) {
|
||||||
|
if (candidateDescriptor.constructedClass.modality == Modality.ABSTRACT) {
|
||||||
|
context.trace.reportDiagnosticOnce(CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS.on(call.callElement))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
-15
@@ -12,7 +12,6 @@ import org.jetbrains.kotlin.config.LanguageFeature
|
|||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor
|
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor
|
||||||
import org.jetbrains.kotlin.incremental.record
|
import org.jetbrains.kotlin.incremental.record
|
||||||
import org.jetbrains.kotlin.resolve.calls.components.CollectionTypeVariableUsagesInfo.getTypeParameterByVariable
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.components.TypeArgumentsToParametersMapper.TypeArgumentsMapping.NoExplicitArguments
|
import org.jetbrains.kotlin.resolve.calls.components.TypeArgumentsToParametersMapper.TypeArgumentsMapping.NoExplicitArguments
|
||||||
import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemOperation
|
import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemOperation
|
||||||
import org.jetbrains.kotlin.resolve.calls.inference.NewConstraintSystem
|
import org.jetbrains.kotlin.resolve.calls.inference.NewConstraintSystem
|
||||||
@@ -36,20 +35,6 @@ import org.jetbrains.kotlin.types.typeUtil.makeNotNullable
|
|||||||
import org.jetbrains.kotlin.types.typeUtil.makeNullable
|
import org.jetbrains.kotlin.types.typeUtil.makeNullable
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||||
|
|
||||||
internal object CheckInstantiationOfAbstractClass : ResolutionPart() {
|
|
||||||
override fun KotlinResolutionCandidate.process(workIndex: Int) {
|
|
||||||
val candidateDescriptor = resolvedCall.candidateDescriptor
|
|
||||||
|
|
||||||
if (candidateDescriptor is ConstructorDescriptor &&
|
|
||||||
!callComponents.statelessCallbacks.isSuperOrDelegatingConstructorCall(resolvedCall.atom)
|
|
||||||
) {
|
|
||||||
if (candidateDescriptor.constructedClass.modality == Modality.ABSTRACT) {
|
|
||||||
addDiagnostic(InstantiationOfAbstractClass)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal object CheckVisibility : ResolutionPart() {
|
internal object CheckVisibility : ResolutionPart() {
|
||||||
override fun KotlinResolutionCandidate.process(workIndex: Int) {
|
override fun KotlinResolutionCandidate.process(workIndex: Int) {
|
||||||
val containingDescriptor = scopeTower.lexicalScope.ownerDescriptor
|
val containingDescriptor = scopeTower.lexicalScope.ownerDescriptor
|
||||||
|
|||||||
-1
@@ -212,7 +212,6 @@ enum class KotlinCallKind(vararg resolutionPart: ResolutionPart) {
|
|||||||
PostponedVariablesInitializerResolutionPart
|
PostponedVariablesInitializerResolutionPart
|
||||||
),
|
),
|
||||||
FUNCTION(
|
FUNCTION(
|
||||||
CheckInstantiationOfAbstractClass,
|
|
||||||
CheckVisibility,
|
CheckVisibility,
|
||||||
CheckInfixResolutionPart,
|
CheckInfixResolutionPart,
|
||||||
CheckOperatorResolutionPart,
|
CheckOperatorResolutionPart,
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
// !WITH_NEW_INFERENCE
|
||||||
|
|
||||||
|
abstract class Abstract
|
||||||
|
|
||||||
|
fun <D> create(fn: () -> D): D {
|
||||||
|
return fn()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun main() {
|
||||||
|
create(::Abstract)
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
// !WITH_NEW_INFERENCE
|
||||||
|
|
||||||
|
abstract class Abstract
|
||||||
|
|
||||||
|
fun <D> create(fn: () -> D): D {
|
||||||
|
return fn()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun main() {
|
||||||
|
create(::<!CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS, OI;CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS, OI;CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS!>Abstract<!>)
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
public fun </*0*/ D> create(/*0*/ fn: () -> D): D
|
||||||
|
public fun main(): kotlin.Unit
|
||||||
|
|
||||||
|
public abstract class Abstract {
|
||||||
|
public constructor Abstract()
|
||||||
|
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
|
||||||
|
}
|
||||||
+34
@@ -0,0 +1,34 @@
|
|||||||
|
// !WITH_NEW_IFERENCE
|
||||||
|
// !LANGUAGE: +NewInference
|
||||||
|
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||||
|
|
||||||
|
// FILE: packageA.kt
|
||||||
|
|
||||||
|
package a
|
||||||
|
|
||||||
|
abstract class Cls
|
||||||
|
abstract class Cls2
|
||||||
|
|
||||||
|
// FILE: packageB.kt
|
||||||
|
|
||||||
|
package b
|
||||||
|
|
||||||
|
fun Cls() {}
|
||||||
|
class Cls2
|
||||||
|
|
||||||
|
// FILE: test.kt
|
||||||
|
|
||||||
|
package c
|
||||||
|
|
||||||
|
import a.*
|
||||||
|
import b.*
|
||||||
|
|
||||||
|
fun take(arg: Any) {}
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
<!AMBIGUITY!>Cls<!>()
|
||||||
|
take(<!AMBIGUITY!>Cls<!>())
|
||||||
|
|
||||||
|
Cls2()
|
||||||
|
take(Cls2())
|
||||||
|
}
|
||||||
+34
@@ -0,0 +1,34 @@
|
|||||||
|
// !WITH_NEW_IFERENCE
|
||||||
|
// !LANGUAGE: +NewInference
|
||||||
|
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||||
|
|
||||||
|
// FILE: packageA.kt
|
||||||
|
|
||||||
|
package a
|
||||||
|
|
||||||
|
abstract class Cls
|
||||||
|
abstract class Cls2
|
||||||
|
|
||||||
|
// FILE: packageB.kt
|
||||||
|
|
||||||
|
package b
|
||||||
|
|
||||||
|
fun Cls() {}
|
||||||
|
class Cls2
|
||||||
|
|
||||||
|
// FILE: test.kt
|
||||||
|
|
||||||
|
package c
|
||||||
|
|
||||||
|
import a.*
|
||||||
|
import b.*
|
||||||
|
|
||||||
|
fun take(arg: Any) {}
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
<!OVERLOAD_RESOLUTION_AMBIGUITY!>Cls<!>()
|
||||||
|
take(<!OVERLOAD_RESOLUTION_AMBIGUITY!>Cls<!>())
|
||||||
|
|
||||||
|
<!UNRESOLVED_REFERENCE!>Cls2<!>()
|
||||||
|
take(<!UNRESOLVED_REFERENCE!>Cls2<!>())
|
||||||
|
}
|
||||||
+34
@@ -0,0 +1,34 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
package a {
|
||||||
|
|
||||||
|
public abstract class Cls {
|
||||||
|
public constructor Cls()
|
||||||
|
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 abstract class Cls2 {
|
||||||
|
public constructor Cls2()
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
package b {
|
||||||
|
public fun Cls(): kotlin.Unit
|
||||||
|
|
||||||
|
public final class Cls2 {
|
||||||
|
public constructor Cls2()
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
package c {
|
||||||
|
public fun take(/*0*/ arg: kotlin.Any): kotlin.Unit
|
||||||
|
public fun test(): kotlin.Unit
|
||||||
|
}
|
||||||
@@ -1891,6 +1891,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTestWithFirVali
|
|||||||
runTest("compiler/testData/diagnostics/tests/callableReference/kt35959.kt");
|
runTest("compiler/testData/diagnostics/tests/callableReference/kt35959.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt37530.kt")
|
||||||
|
public void testKt37530() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/callableReference/kt37530.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt7430_wrongClassOnLHS.kt")
|
@TestMetadata("kt7430_wrongClassOnLHS.kt")
|
||||||
public void testKt7430_wrongClassOnLHS() throws Exception {
|
public void testKt7430_wrongClassOnLHS() throws Exception {
|
||||||
runTest("compiler/testData/diagnostics/tests/callableReference/kt7430_wrongClassOnLHS.kt");
|
runTest("compiler/testData/diagnostics/tests/callableReference/kt7430_wrongClassOnLHS.kt");
|
||||||
@@ -15867,6 +15872,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTestWithFirVali
|
|||||||
runTest("compiler/testData/diagnostics/tests/overload/defaultParameters.kt");
|
runTest("compiler/testData/diagnostics/tests/overload/defaultParameters.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("disambiguateByFailedAbstractClassCheck.kt")
|
||||||
|
public void testDisambiguateByFailedAbstractClassCheck() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/overload/disambiguateByFailedAbstractClassCheck.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("EmptyArgumentListInLambda.kt")
|
@TestMetadata("EmptyArgumentListInLambda.kt")
|
||||||
public void testEmptyArgumentListInLambda() throws Exception {
|
public void testEmptyArgumentListInLambda() throws Exception {
|
||||||
runTest("compiler/testData/diagnostics/tests/overload/EmptyArgumentListInLambda.kt");
|
runTest("compiler/testData/diagnostics/tests/overload/EmptyArgumentListInLambda.kt");
|
||||||
|
|||||||
Generated
+10
@@ -1886,6 +1886,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing
|
|||||||
runTest("compiler/testData/diagnostics/tests/callableReference/kt35959.kt");
|
runTest("compiler/testData/diagnostics/tests/callableReference/kt35959.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt37530.kt")
|
||||||
|
public void testKt37530() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/callableReference/kt37530.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt7430_wrongClassOnLHS.kt")
|
@TestMetadata("kt7430_wrongClassOnLHS.kt")
|
||||||
public void testKt7430_wrongClassOnLHS() throws Exception {
|
public void testKt7430_wrongClassOnLHS() throws Exception {
|
||||||
runTest("compiler/testData/diagnostics/tests/callableReference/kt7430_wrongClassOnLHS.kt");
|
runTest("compiler/testData/diagnostics/tests/callableReference/kt7430_wrongClassOnLHS.kt");
|
||||||
@@ -15862,6 +15867,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing
|
|||||||
runTest("compiler/testData/diagnostics/tests/overload/defaultParameters.kt");
|
runTest("compiler/testData/diagnostics/tests/overload/defaultParameters.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("disambiguateByFailedAbstractClassCheck.kt")
|
||||||
|
public void testDisambiguateByFailedAbstractClassCheck() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/overload/disambiguateByFailedAbstractClassCheck.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("EmptyArgumentListInLambda.kt")
|
@TestMetadata("EmptyArgumentListInLambda.kt")
|
||||||
public void testEmptyArgumentListInLambda() throws Exception {
|
public void testEmptyArgumentListInLambda() throws Exception {
|
||||||
runTest("compiler/testData/diagnostics/tests/overload/EmptyArgumentListInLambda.kt");
|
runTest("compiler/testData/diagnostics/tests/overload/EmptyArgumentListInLambda.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user