[FIR] Forbid annotations on anonymous initializers and destructuring declarations
#KT-59896 Merge-request: KT-MR-13197 Merged-by: Evgeniy Zhelenskiy <Evgeniy.Zhelenskiy@jetbrains.com>
This commit is contained in:
committed by
Space Team
parent
e901629cf0
commit
5258e2044d
+2
-2
@@ -35,7 +35,7 @@ import org.jetbrains.kotlin.resolve.checkers.OptInNames
|
|||||||
private val defaultAnnotationTargets = KotlinTarget.DEFAULT_TARGET_SET
|
private val defaultAnnotationTargets = KotlinTarget.DEFAULT_TARGET_SET
|
||||||
|
|
||||||
fun FirAnnotation.getAllowedAnnotationTargets(session: FirSession): Set<KotlinTarget> {
|
fun FirAnnotation.getAllowedAnnotationTargets(session: FirSession): Set<KotlinTarget> {
|
||||||
if (annotationTypeRef is FirErrorTypeRef) return KotlinTarget.values().toSet()
|
if (annotationTypeRef is FirErrorTypeRef) return KotlinTarget.ALL_TARGET_SET
|
||||||
val annotationClassSymbol = (this.annotationTypeRef.coneType as? ConeClassLikeType)
|
val annotationClassSymbol = (this.annotationTypeRef.coneType as? ConeClassLikeType)
|
||||||
?.fullyExpandedType(session)?.lookupTag?.toSymbol(session) ?: return defaultAnnotationTargets
|
?.fullyExpandedType(session)?.lookupTag?.toSymbol(session) ?: return defaultAnnotationTargets
|
||||||
annotationClassSymbol.lazyResolveToPhase(FirResolvePhase.BODY_RESOLVE)
|
annotationClassSymbol.lazyResolveToPhase(FirResolvePhase.BODY_RESOLVE)
|
||||||
@@ -70,7 +70,7 @@ fun FirClassLikeSymbol<*>.getAllowedAnnotationTargets(session: FirSession): Set<
|
|||||||
//but `JvmStubBasedFirDeserializedSymbolProvider` which works in IDE over stubs, misses classes
|
//but `JvmStubBasedFirDeserializedSymbolProvider` which works in IDE over stubs, misses classes
|
||||||
?: (calleeReference as? FirFromMissingDependenciesNamedReference)?.name?.asString()
|
?: (calleeReference as? FirFromMissingDependenciesNamedReference)?.name?.asString()
|
||||||
?: return@mapNotNullTo null
|
?: return@mapNotNullTo null
|
||||||
KotlinTarget.values().firstOrNull { target -> target.name == targetName }
|
KotlinTarget.entries.firstOrNull { target -> target.name == targetName }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.fir.analysis.checkers
|
|||||||
|
|
||||||
import com.intellij.lang.LighterASTNode
|
import com.intellij.lang.LighterASTNode
|
||||||
import org.jetbrains.kotlin.*
|
import org.jetbrains.kotlin.*
|
||||||
import org.jetbrains.kotlin.KtFakeSourceElementKind.DesugaredComponentFunctionCall
|
|
||||||
import org.jetbrains.kotlin.builtins.StandardNames.HASHCODE_NAME
|
import org.jetbrains.kotlin.builtins.StandardNames.HASHCODE_NAME
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
@@ -643,7 +642,7 @@ fun getActualTargetList(container: FirAnnotationContainer): AnnotationTargetList
|
|||||||
when {
|
when {
|
||||||
annotated.isLocal ->
|
annotated.isLocal ->
|
||||||
when {
|
when {
|
||||||
annotated.source?.kind == DesugaredComponentFunctionCall -> TargetLists.T_DESTRUCTURING_DECLARATION
|
annotated.name == SpecialNames.DESTRUCT -> TargetLists.T_DESTRUCTURING_DECLARATION
|
||||||
annotated.isCatchParameter == true -> TargetLists.T_CATCH_PARAMETER
|
annotated.isCatchParameter == true -> TargetLists.T_CATCH_PARAMETER
|
||||||
else -> TargetLists.T_LOCAL_VARIABLE
|
else -> TargetLists.T_LOCAL_VARIABLE
|
||||||
}
|
}
|
||||||
@@ -694,9 +693,7 @@ fun getActualTargetList(container: FirAnnotationContainer): AnnotationTargetList
|
|||||||
} else {
|
} else {
|
||||||
TargetLists.T_OBJECT_LITERAL
|
TargetLists.T_OBJECT_LITERAL
|
||||||
}
|
}
|
||||||
// TODO, KT-59819: properly implement those cases
|
// TODO, KT-59819: properly implement this case
|
||||||
// is KtDestructuringDeclarationEntry -> TargetLists.T_LOCAL_VARIABLE
|
|
||||||
// is KtDestructuringDeclaration -> TargetLists.T_DESTRUCTURING_DECLARATION
|
|
||||||
// is KtLambdaExpression -> TargetLists.T_FUNCTION_LITERAL
|
// is KtLambdaExpression -> TargetLists.T_FUNCTION_LITERAL
|
||||||
else -> TargetLists.EMPTY
|
else -> TargetLists.EMPTY
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
annotation class Ann
|
|
||||||
|
|
||||||
data class Pair(val x: Int, val y: Int)
|
|
||||||
|
|
||||||
fun foo(): Int {
|
|
||||||
@Ann val (a, b) = Pair(12, 34)
|
|
||||||
@<!UNRESOLVED_REFERENCE!>Err<!> val (c, d) = Pair(56, 78)
|
|
||||||
return a + b + c + d
|
|
||||||
}
|
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
annotation class Ann
|
annotation class Ann
|
||||||
|
|
||||||
data class Pair(val x: Int, val y: Int)
|
data class Pair(val x: Int, val y: Int)
|
||||||
|
|||||||
-14
@@ -1,14 +0,0 @@
|
|||||||
annotation class Ann(val x: Int)
|
|
||||||
|
|
||||||
data class A(val x: Int, val y: Int)
|
|
||||||
|
|
||||||
fun bar(): Array<A> = null!!
|
|
||||||
|
|
||||||
fun foo() {
|
|
||||||
for (@Ann(1) i in 1..100) {}
|
|
||||||
for (@Ann(2) i in 1..100) {}
|
|
||||||
|
|
||||||
for (@Ann(3) (x, @Ann(4) y) in bar()) {}
|
|
||||||
|
|
||||||
for (@<!UNRESOLVED_REFERENCE!>Err<!>() (x,y) in bar()) {}
|
|
||||||
}
|
|
||||||
+1
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
annotation class Ann(val x: Int)
|
annotation class Ann(val x: Int)
|
||||||
|
|
||||||
data class A(val x: Int, val y: Int)
|
data class A(val x: Int, val y: Int)
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
fun test(): Any? {
|
|
||||||
@ann val (a, b) = P(1, 1)
|
|
||||||
return a + b
|
|
||||||
}
|
|
||||||
|
|
||||||
annotation class ann
|
|
||||||
data class P(val a: Int, val b: Int)
|
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
fun test(): Any? {
|
fun test(): Any? {
|
||||||
<!WRONG_ANNOTATION_TARGET!>@ann<!> val (a, b) = P(1, 1)
|
<!WRONG_ANNOTATION_TARGET!>@ann<!> val (a, b) = P(1, 1)
|
||||||
return a + b
|
return a + b
|
||||||
|
|||||||
+3
-3
@@ -71,15 +71,15 @@ enum class KotlinTarget(val description: String, val isDefault: Boolean = true)
|
|||||||
private val map = HashMap<String, KotlinTarget>()
|
private val map = HashMap<String, KotlinTarget>()
|
||||||
|
|
||||||
init {
|
init {
|
||||||
for (target in values()) {
|
for (target in entries) {
|
||||||
map[target.name] = target
|
map[target.name] = target
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun valueOrNull(name: String): KotlinTarget? = map[name]
|
fun valueOrNull(name: String): KotlinTarget? = map[name]
|
||||||
|
|
||||||
val DEFAULT_TARGET_SET: Set<KotlinTarget> = values().filter { it.isDefault }.toSet()
|
val DEFAULT_TARGET_SET: Set<KotlinTarget> = entries.filter { it.isDefault }.toSet()
|
||||||
val ALL_TARGET_SET: Set<KotlinTarget> = values().toSet()
|
val ALL_TARGET_SET: Set<KotlinTarget> = entries.toSet()
|
||||||
|
|
||||||
val ANNOTATION_CLASS_LIST = listOf(ANNOTATION_CLASS, CLASS)
|
val ANNOTATION_CLASS_LIST = listOf(ANNOTATION_CLASS, CLASS)
|
||||||
val LOCAL_CLASS_LIST = listOf(LOCAL_CLASS, CLASS)
|
val LOCAL_CLASS_LIST = listOf(LOCAL_CLASS, CLASS)
|
||||||
|
|||||||
Reference in New Issue
Block a user