[compiler] missed type parameters in local properties (KTIJ-23583)

even though local variables won't contain type parameters,
let's build fir for them
This commit is contained in:
Anna Kozlova
2022-11-15 20:02:50 +01:00
committed by Space Team
parent 3fdd0aacd3
commit 702d0b4d54
15 changed files with 149 additions and 15 deletions
@@ -268,6 +268,12 @@ public class Fe10IdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated extends A
runTest("analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.kt");
}
@Test
@TestMetadata("typeParameters.kt")
public void testTypeParameters() throws Exception {
runTest("analysis/analysis-api/testData/symbols/symbolByPsi/typeParameters.kt");
}
@Test
@TestMetadata("varargFunctions.kt")
public void testVarargFunctions() throws Exception {
@@ -268,6 +268,12 @@ public class FirIdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated extends Ab
runTest("analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.kt");
}
@Test
@TestMetadata("typeParameters.kt")
public void testTypeParameters() throws Exception {
runTest("analysis/analysis-api/testData/symbols/symbolByPsi/typeParameters.kt");
}
@Test
@TestMetadata("varargFunctions.kt")
public void testVarargFunctions() throws Exception {
@@ -268,6 +268,12 @@ public class FirStandaloneNormalAnalysisSourceModuleSymbolByPsiTestGenerated ext
runTest("analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.kt");
}
@Test
@TestMetadata("typeParameters.kt")
public void testTypeParameters() throws Exception {
runTest("analysis/analysis-api/testData/symbols/symbolByPsi/typeParameters.kt");
}
@Test
@TestMetadata("varargFunctions.kt")
public void testVarargFunctions() throws Exception {
@@ -0,0 +1,51 @@
KtTypeParameterSymbol:
annotationsList: []
isReified: false
name: T
origin: SOURCE
typeParameters: []
upperBounds: []
variance: INVARIANT
getContainingModule: KtSourceModule "Sources of main"
deprecationStatus: null
KtLocalVariableSymbol:
annotationsList: []
callableIdIfNonLocal: null
contextReceivers: []
isExtension: false
isVal: true
name: x
origin: SOURCE
receiverType: null
returnType: kotlin/Int
symbolKind: LOCAL
typeParameters: []
getContainingModule: KtSourceModule "Sources of main"
deprecationStatus: null
KtFunctionSymbol:
annotationsList: []
callableIdIfNonLocal: /f
contextReceivers: []
hasStableParameterNames: true
isBuiltinFunctionInvoke: false
isExtension: false
isExternal: false
isInfix: false
isInline: false
isOperator: false
isOverride: false
isStatic: false
isSuspend: false
modality: FINAL
name: f
origin: SOURCE
receiverType: null
returnType: kotlin/Unit
symbolKind: TOP_LEVEL
typeParameters: []
valueParameters: []
visibility: Public
getContainingModule: KtSourceModule "Sources of main"
deprecationStatus: null
@@ -0,0 +1,4 @@
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE
fun f() {
val <T : unresovled_reference> x:Int = 4
}
@@ -0,0 +1 @@
fun f()
@@ -0,0 +1,53 @@
KtTypeParameterSymbol:
annotationsList: []
isReified: false
name: T
origin: SOURCE
typeParameters: []
upperBounds: [
ERROR_TYPE
]
variance: INVARIANT
getContainingModule: KtSourceModule "Sources of main"
deprecationStatus: null
KtLocalVariableSymbol:
annotationsList: []
callableIdIfNonLocal: null
contextReceivers: []
isExtension: false
isVal: true
name: x
origin: SOURCE
receiverType: null
returnType: kotlin/Int
symbolKind: LOCAL
typeParameters: []
getContainingModule: KtSourceModule "Sources of main"
deprecationStatus: null
KtFunctionSymbol:
annotationsList: []
callableIdIfNonLocal: /f
contextReceivers: []
hasStableParameterNames: true
isBuiltinFunctionInvoke: false
isExtension: false
isExternal: false
isInfix: false
isInline: false
isOperator: false
isOverride: false
isStatic: false
isSuspend: false
modality: FINAL
name: f
origin: SOURCE
receiverType: null
returnType: kotlin/Unit
symbolKind: TOP_LEVEL
typeParameters: []
valueParameters: []
visibility: Public
getContainingModule: KtSourceModule "Sources of main"
deprecationStatus: null
@@ -32,8 +32,10 @@ object FirPropertyTypeParametersChecker : FirPropertyChecker() {
declaration.contextReceivers.forEach { collectAllTypes(it.typeRef.coneType) }
val usedNames = usedTypes.filterIsInstance<ConeTypeParameterType>().map { it.lookupTag.name }
declaration.typeParameters.filterNot { usedNames.contains(it.name) }.forEach { danglingParam ->
reporter.reportOn(danglingParam.source, FirErrors.TYPE_PARAMETER_OF_PROPERTY_NOT_USED_IN_RECEIVER, context)
if (!declaration.isLocal) {
declaration.typeParameters.filterNot { usedNames.contains(it.name) }.forEach { danglingParam ->
reporter.reportOn(danglingParam.source, FirErrors.TYPE_PARAMETER_OF_PROPERTY_NOT_USED_IN_RECEIVER, context)
}
}
}
@@ -1173,6 +1173,7 @@ class DeclarationsConverter(
isLateInit = modifiers.hasLateinit()
}
typeParameters += firTypeParameters
generateAccessorsByDelegate(
delegateBuilder,
baseModuleData,
@@ -1611,6 +1611,7 @@ open class RawFirBuilder(
isLocal = true
symbol = FirPropertySymbol(propertyName)
extractTypeParametersTo(this, symbol)
backingField = this@toFirProperty.fieldDeclaration.toFirBackingField(
this@toFirProperty,
propertySymbol = symbol,
@@ -120,6 +120,9 @@ open class FirDeclarationsResolveTransformer(transformer: FirAbstractBodyResolve
property.getter?.let { it.transformStatus(this, it.resolveStatus(containingProperty = property).mode()) }
property.setter?.let { it.transformStatus(this, it.resolveStatus(containingProperty = property).mode()) }
property.backingField?.let { it.transformStatus(this, it.resolveStatus(containingProperty = property).mode()) }
context.withProperty(property) {
doTransformTypeParameters(property)
}
return transformLocalVariable(property)
}
@@ -9,6 +9,6 @@ class SomeClass {
val <<!WRONG_ANNOTATION_TARGET!>@A1<!> <!WRONG_ANNOTATION_TARGET!>@A2(3)<!> <!REPEATED_ANNOTATION, WRONG_ANNOTATION_TARGET!>@A2<!> <!REPEATED_ANNOTATION, WRONG_ANNOTATION_TARGET!>@A1(<!TOO_MANY_ARGUMENTS!>12<!>)<!> <!REPEATED_ANNOTATION, WRONG_ANNOTATION_TARGET!>@A2(<!ARGUMENT_TYPE_MISMATCH!>"Test"<!>)<!> T> T.field: Int get() = 12
fun foo() {
val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><@A1 @A2(3) @A2 @A1(12) @A2("Test") T><!> localVal = 12
val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><<!WRONG_ANNOTATION_TARGET!>@A1<!> <!WRONG_ANNOTATION_TARGET!>@A2(3)<!> <!REPEATED_ANNOTATION, WRONG_ANNOTATION_TARGET!>@A2<!> <!REPEATED_ANNOTATION, WRONG_ANNOTATION_TARGET!>@A1(<!TOO_MANY_ARGUMENTS!>12<!>)<!> <!REPEATED_ANNOTATION, WRONG_ANNOTATION_TARGET!>@A2(<!ARGUMENT_TYPE_MISMATCH!>"Test"<!>)<!> T><!> localVal = 12
}
}
@@ -5,8 +5,8 @@ import kotlin.reflect.KProperty
fun test() {
val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING!><T><!> a0 = 0
val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING!><T : __UNRESOLVED__><!> a1 = ""
val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING!><T : String><!> a2 = 0
val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING!><T : <!UNRESOLVED_REFERENCE!>__UNRESOLVED__<!>><!> a1 = ""
val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING!><T : <!FINAL_UPPER_BOUND!>String<!>><!> a2 = 0
<!WRONG_MODIFIER_TARGET!>const<!> val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING!><T><!> a3 = 0
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING!><T><!> a4 = 0
val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING!><T><!> a5 by Delegate<Int>()
@@ -5,8 +5,8 @@ import kotlin.reflect.KProperty
fun test() {
val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><T><!> a0 = 0
val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><T : __UNRESOLVED__><!> a1 = ""
val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><T : String><!> a2 = 0
val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><T : <!UNRESOLVED_REFERENCE!>__UNRESOLVED__<!>><!> a1 = ""
val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><T : <!FINAL_UPPER_BOUND!>String<!>><!> a2 = 0
<!WRONG_MODIFIER_TARGET!>const<!> val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><T><!> a3 = 0
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><T><!> a4 = 0
val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><T><!> a5 by Delegate<Int>()
@@ -27,8 +27,8 @@ fun case_4() {
// TESTCASE NUMBER: 5
fun case_5() {
val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><T : __UNRESOLVED__><!> x1: Map<Int, Int> = mapOf(1 to 1)
var <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><T : __UNRESOLVED__><!> x2: Map<Int, Int> = mapOf(1 to 1)
val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><T : <!UNRESOLVED_REFERENCE!>__UNRESOLVED__<!>><!> x1: Map<Int, Int> = mapOf(1 to 1)
var <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><T : <!UNRESOLVED_REFERENCE!>__UNRESOLVED__<!>><!> x2: Map<Int, Int> = mapOf(1 to 1)
}
/*
@@ -77,18 +77,18 @@ fun case_11() {
// TESTCASE NUMBER: 12
fun case_12() {
val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><T : __UNRESOLVED__><!> x: Int
var <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><T : __UNRESOLVED__><!> x: Int
val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><T : <!UNRESOLVED_REFERENCE!>__UNRESOLVED__<!>><!> x: Int
var <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><T : <!UNRESOLVED_REFERENCE!>__UNRESOLVED__<!>><!> x: Int
}
// TESTCASE NUMBER: 13
fun case_13() {
val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><T : __UNRESOLVED__><!> x: Int where __UNRESOLVED__: __UNRESOLVED__
var <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><T : __UNRESOLVED__><!> x: Int where __UNRESOLVED__: __UNRESOLVED__
val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><T : <!UNRESOLVED_REFERENCE!>__UNRESOLVED__<!>><!> x: Int where __UNRESOLVED__: __UNRESOLVED__
var <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><T : <!UNRESOLVED_REFERENCE!>__UNRESOLVED__<!>><!> x: Int where __UNRESOLVED__: __UNRESOLVED__
}
// TESTCASE NUMBER: 14
fun case_14() {
val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><T : T><!> x1 = 1
var <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><T : T><!> x2 = 1
val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><<!CYCLIC_GENERIC_UPPER_BOUND!>T : T<!>><!> x1 = 1
var <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><<!CYCLIC_GENERIC_UPPER_BOUND!>T : T<!>><!> x2 = 1
}