[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:
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
+51
@@ -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
|
||||
+4
-2
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
@@ -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,
|
||||
|
||||
+3
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Vendored
+2
-2
@@ -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>()
|
||||
|
||||
Vendored
+2
-2
@@ -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>()
|
||||
|
||||
Vendored
+8
-8
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user