[FIR] Implement EXPANDED_TYPE_CANNOT_BE_INHERITED, PROJECTION_IN_IMMEDIATE_ARGUMENT_TO_SUPERTYPE

Add `starAsModifier` to `modifierSetPosition`
This commit is contained in:
Ivan Kochurkin
2021-06-17 00:05:22 +03:00
committed by teamcityserver
parent 937846b62d
commit ec20f52707
15 changed files with 118 additions and 36 deletions
@@ -363,7 +363,7 @@ object PositioningStrategies {
val LATEINIT_MODIFIER: PositioningStrategy<KtModifierListOwner> = modifierSetPosition(KtTokens.LATEINIT_KEYWORD)
@JvmField
val VARIANCE_MODIFIER: PositioningStrategy<KtModifierListOwner> = modifierSetPosition(KtTokens.IN_KEYWORD, KtTokens.OUT_KEYWORD)
val VARIANCE_MODIFIER: PositioningStrategy<KtModifierListOwner> = projectionPosition()
@JvmField
val CONST_MODIFIER: PositioningStrategy<KtModifierListOwner> = modifierSetPosition(KtTokens.CONST_KEYWORD)
@@ -414,11 +414,29 @@ object PositioningStrategies {
return markElement(modifier)
}
}
throw IllegalStateException("None of the modifiers is found: " + listOf(*tokens))
}
}
}
@JvmStatic
fun projectionPosition(): PositioningStrategy<KtModifierListOwner> {
return object : PositioningStrategy<KtModifierListOwner>() {
override fun mark(element: KtModifierListOwner): List<TextRange> {
if (element is KtTypeProjection && element.projectionKind == KtProjectionKind.STAR) {
return markElement(element)
}
val modifierList = element.modifierList.sure { "No modifier list, but modifier has been found by the analyzer" }
modifierList.getModifier(KtTokens.IN_KEYWORD)?.let { return markElement(it) }
modifierList.getModifier(KtTokens.OUT_KEYWORD)?.let { return markElement(it) }
throw IllegalStateException("None of the modifiers is found: in, out")
}
}
}
@JvmField
val ARRAY_ACCESS: PositioningStrategy<KtArrayAccessExpression> = object : PositioningStrategy<KtArrayAccessExpression>() {
override fun mark(element: KtArrayAccessExpression): List<TextRange> {