[FIR] Check DELEGATE_USES_EXTENSION_PROPERTY_TYPE_PARAMETER for anonymous objects
^KT-64102 Fixed
This commit is contained in:
committed by
Space Team
parent
8ee54a9045
commit
c4e0cafe9c
+6
@@ -10570,6 +10570,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia
|
|||||||
runTest("compiler/testData/diagnostics/tests/delegatedProperty/useTypeParameterOfExtensionProperty2.kt");
|
runTest("compiler/testData/diagnostics/tests/delegatedProperty/useTypeParameterOfExtensionProperty2.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("useTypeParameterOfExtensionProperty3.kt")
|
||||||
|
public void testUseTypeParameterOfExtensionProperty3() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/delegatedProperty/useTypeParameterOfExtensionProperty3.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("useTypeParameterOfExtensionProperty_Disabled.kt")
|
@TestMetadata("useTypeParameterOfExtensionProperty_Disabled.kt")
|
||||||
public void testUseTypeParameterOfExtensionProperty_Disabled() throws Exception {
|
public void testUseTypeParameterOfExtensionProperty_Disabled() throws Exception {
|
||||||
|
|||||||
+6
@@ -10570,6 +10570,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated
|
|||||||
runTest("compiler/testData/diagnostics/tests/delegatedProperty/useTypeParameterOfExtensionProperty2.kt");
|
runTest("compiler/testData/diagnostics/tests/delegatedProperty/useTypeParameterOfExtensionProperty2.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("useTypeParameterOfExtensionProperty3.kt")
|
||||||
|
public void testUseTypeParameterOfExtensionProperty3() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/delegatedProperty/useTypeParameterOfExtensionProperty3.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("useTypeParameterOfExtensionProperty_Disabled.kt")
|
@TestMetadata("useTypeParameterOfExtensionProperty_Disabled.kt")
|
||||||
public void testUseTypeParameterOfExtensionProperty_Disabled() throws Exception {
|
public void testUseTypeParameterOfExtensionProperty_Disabled() throws Exception {
|
||||||
|
|||||||
+6
@@ -10564,6 +10564,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir
|
|||||||
runTest("compiler/testData/diagnostics/tests/delegatedProperty/useTypeParameterOfExtensionProperty2.kt");
|
runTest("compiler/testData/diagnostics/tests/delegatedProperty/useTypeParameterOfExtensionProperty2.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("useTypeParameterOfExtensionProperty3.kt")
|
||||||
|
public void testUseTypeParameterOfExtensionProperty3() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/delegatedProperty/useTypeParameterOfExtensionProperty3.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("useTypeParameterOfExtensionProperty_Disabled.kt")
|
@TestMetadata("useTypeParameterOfExtensionProperty_Disabled.kt")
|
||||||
public void testUseTypeParameterOfExtensionProperty_Disabled() throws Exception {
|
public void testUseTypeParameterOfExtensionProperty_Disabled() throws Exception {
|
||||||
|
|||||||
+6
@@ -10570,6 +10570,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia
|
|||||||
runTest("compiler/testData/diagnostics/tests/delegatedProperty/useTypeParameterOfExtensionProperty2.kt");
|
runTest("compiler/testData/diagnostics/tests/delegatedProperty/useTypeParameterOfExtensionProperty2.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("useTypeParameterOfExtensionProperty3.kt")
|
||||||
|
public void testUseTypeParameterOfExtensionProperty3() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/delegatedProperty/useTypeParameterOfExtensionProperty3.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("useTypeParameterOfExtensionProperty_Disabled.kt")
|
@TestMetadata("useTypeParameterOfExtensionProperty_Disabled.kt")
|
||||||
public void testUseTypeParameterOfExtensionProperty_Disabled() throws Exception {
|
public void testUseTypeParameterOfExtensionProperty_Disabled() throws Exception {
|
||||||
|
|||||||
+7
-5
@@ -12,17 +12,19 @@ import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
|||||||
import org.jetbrains.kotlin.fir.analysis.checkers.unsubstitutedScope
|
import org.jetbrains.kotlin.fir.analysis.checkers.unsubstitutedScope
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
import org.jetbrains.kotlin.fir.declarations.utils.isExtension
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||||
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
|
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
|
||||||
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
||||||
import org.jetbrains.kotlin.fir.scopes.processAllProperties
|
import org.jetbrains.kotlin.fir.scopes.processAllProperties
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
||||||
import org.jetbrains.kotlin.fir.types.*
|
import org.jetbrains.kotlin.fir.types.*
|
||||||
|
|
||||||
object FirDelegateUsesExtensionPropertyTypeParameterChecker : FirPropertyChecker(MppCheckerKind.Common) {
|
object FirDelegateUsesExtensionPropertyTypeParameterChecker : FirPropertyChecker(MppCheckerKind.Common) {
|
||||||
override fun check(declaration: FirProperty, context: CheckerContext, reporter: DiagnosticReporter) {
|
override fun check(declaration: FirProperty, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||||
val delegate = declaration.delegate as? FirFunctionCall ?: return
|
if (!declaration.isExtension) return
|
||||||
|
val delegate = declaration.delegate ?: return
|
||||||
val parameters = declaration.typeParameters.mapTo(hashSetOf()) { it.symbol }
|
val parameters = declaration.typeParameters.mapTo(hashSetOf()) { it.symbol }
|
||||||
|
|
||||||
val usedTypeParameterSymbol = delegate.resolvedType.findUsedTypeParameterSymbol(parameters, delegate, context, reporter)
|
val usedTypeParameterSymbol = delegate.resolvedType.findUsedTypeParameterSymbol(parameters, delegate, context, reporter)
|
||||||
@@ -33,14 +35,14 @@ object FirDelegateUsesExtensionPropertyTypeParameterChecker : FirPropertyChecker
|
|||||||
|
|
||||||
private fun ConeKotlinType.findUsedTypeParameterSymbol(
|
private fun ConeKotlinType.findUsedTypeParameterSymbol(
|
||||||
typeParameterSymbols: HashSet<FirTypeParameterSymbol>,
|
typeParameterSymbols: HashSet<FirTypeParameterSymbol>,
|
||||||
delegate: FirFunctionCall,
|
delegate: FirExpression,
|
||||||
context: CheckerContext,
|
context: CheckerContext,
|
||||||
reporter: DiagnosticReporter,
|
reporter: DiagnosticReporter,
|
||||||
): FirTypeParameterSymbol? {
|
): FirTypeParameterSymbol? {
|
||||||
val expandedDelegateClassLikeType =
|
val expandedDelegateClassLikeType =
|
||||||
delegate.resolvedType.lowerBoundIfFlexible().fullyExpandedType(context.session)
|
delegate.resolvedType.lowerBoundIfFlexible().fullyExpandedType(context.session)
|
||||||
.unwrapDefinitelyNotNull() as? ConeClassLikeType ?: return null
|
.unwrapDefinitelyNotNull() as? ConeClassLikeType ?: return null
|
||||||
val delegateClassSymbol = expandedDelegateClassLikeType.lookupTag.toSymbol(context.session) as? FirRegularClassSymbol ?: return null
|
val delegateClassSymbol = expandedDelegateClassLikeType.lookupTag.toSymbol(context.session) as? FirClassSymbol<*> ?: return null
|
||||||
val delegateClassScope by lazy { delegateClassSymbol.unsubstitutedScope(context) }
|
val delegateClassScope by lazy { delegateClassSymbol.unsubstitutedScope(context) }
|
||||||
for (it in typeArguments) {
|
for (it in typeArguments) {
|
||||||
val theType = it.type ?: continue
|
val theType = it.type ?: continue
|
||||||
|
|||||||
Vendored
+23
@@ -0,0 +1,23 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
|
// ISSUE: KT-64102
|
||||||
|
// !DIAGNOSTICS: -DEBUG_INFO_SMARTCAST
|
||||||
|
// !LANGUAGE: +ForbidUsingExtensionPropertyTypeParameterInDelegate
|
||||||
|
// WITH_REFLECT
|
||||||
|
|
||||||
|
import kotlin.reflect.KProperty
|
||||||
|
|
||||||
|
class Inv<T>(var t: T)
|
||||||
|
|
||||||
|
open class Delegate<X> {
|
||||||
|
var x: X? = null
|
||||||
|
operator fun getValue(thisRef: Inv<X>, property: KProperty<*>) {
|
||||||
|
val _x = x
|
||||||
|
if (_x != null) {
|
||||||
|
thisRef.t = _x
|
||||||
|
} else {
|
||||||
|
x = thisRef.t
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val <T> Inv<T>.x: Unit <!DELEGATE_USES_EXTENSION_PROPERTY_TYPE_PARAMETER_ERROR!>by object : Delegate<T>() {}<!>
|
||||||
Generated
+6
@@ -10570,6 +10570,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
|
|||||||
runTest("compiler/testData/diagnostics/tests/delegatedProperty/useTypeParameterOfExtensionProperty2.kt");
|
runTest("compiler/testData/diagnostics/tests/delegatedProperty/useTypeParameterOfExtensionProperty2.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("useTypeParameterOfExtensionProperty3.kt")
|
||||||
|
public void testUseTypeParameterOfExtensionProperty3() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/delegatedProperty/useTypeParameterOfExtensionProperty3.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("useTypeParameterOfExtensionProperty_Disabled.kt")
|
@TestMetadata("useTypeParameterOfExtensionProperty_Disabled.kt")
|
||||||
public void testUseTypeParameterOfExtensionProperty_Disabled() throws Exception {
|
public void testUseTypeParameterOfExtensionProperty_Disabled() throws Exception {
|
||||||
|
|||||||
Reference in New Issue
Block a user