[FIR] Implement DEPRECATED_SINCE_KOTLIN_WITH_DEPRECATED_LEVEL, fix tests

This commit is contained in:
Ivan Kochurkin
2021-05-11 18:23:21 +03:00
committed by TeamCityServer
parent 77c137df22
commit 177394f6ef
8 changed files with 49 additions and 6 deletions
@@ -160,6 +160,7 @@ object DIAGNOSTICS_LIST : DiagnosticList() {
val DEPRECATED_SINCE_KOTLIN_WITH_UNORDERED_VERSIONS by error<PsiElement>()
val DEPRECATED_SINCE_KOTLIN_WITHOUT_ARGUMENTS by error<PsiElement>()
val DEPRECATED_SINCE_KOTLIN_WITHOUT_DEPRECATED by error<PsiElement>()
val DEPRECATED_SINCE_KOTLIN_WITH_DEPRECATED_LEVEL by error<PsiElement>()
}
val EXPOSED_VISIBILITY by object : DiagnosticGroup("Exposed visibility") {
@@ -166,6 +166,7 @@ object FirErrors {
val DEPRECATED_SINCE_KOTLIN_WITH_UNORDERED_VERSIONS by error0<PsiElement>()
val DEPRECATED_SINCE_KOTLIN_WITHOUT_ARGUMENTS by error0<PsiElement>()
val DEPRECATED_SINCE_KOTLIN_WITHOUT_DEPRECATED by error0<PsiElement>()
val DEPRECATED_SINCE_KOTLIN_WITH_DEPRECATED_LEVEL by error0<PsiElement>()
// Exposed visibility
val EXPOSED_TYPEALIAS_EXPANDED_TYPE by error3<KtNamedDeclaration, EffectiveVisibility, FirMemberDeclaration, EffectiveVisibility>(SourceElementPositioningStrategies.DECLARATION_NAME)
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn
import org.jetbrains.kotlin.fir.declarations.FirAnnotatedDeclaration
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.argumentMapping
import org.jetbrains.kotlin.fir.resolve.fqName
import org.jetbrains.kotlin.name.FqName
@@ -25,6 +26,7 @@ object FirAnnotationChecker : FirAnnotatedDeclarationChecker() {
) {
var deprecatedCall: FirAnnotationCall? = null
var deprecatedSinceKotlinCall: FirAnnotationCall? = null
for (annotation in declaration.annotations) {
val fqName = annotation.fqName(context.session)
if (fqName == deprecatedClassId) {
@@ -34,8 +36,25 @@ object FirAnnotationChecker : FirAnnotatedDeclarationChecker() {
}
}
if (deprecatedSinceKotlinCall != null && deprecatedCall == null) {
reporter.reportOn(deprecatedSinceKotlinCall.source, FirErrors.DEPRECATED_SINCE_KOTLIN_WITHOUT_DEPRECATED, context)
if (deprecatedSinceKotlinCall != null) {
if (deprecatedCall == null) {
reporter.reportOn(deprecatedSinceKotlinCall.source, FirErrors.DEPRECATED_SINCE_KOTLIN_WITHOUT_DEPRECATED, context)
} else {
val argumentMapping = deprecatedCall.argumentMapping ?: return
var report = false
for ((_, value) in argumentMapping) {
report = value.name.identifier == "level"
if (report)
break
}
if (report) {
reporter.reportOn(
deprecatedSinceKotlinCall.source,
FirErrors.DEPRECATED_SINCE_KOTLIN_WITH_DEPRECATED_LEVEL,
context
)
}
}
}
}
}
@@ -88,6 +88,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DELEGATION_SUPER_
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DEPRECATED_MODIFIER_PAIR
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DEPRECATED_SINCE_KOTLIN_WITHOUT_ARGUMENTS
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DEPRECATED_SINCE_KOTLIN_WITHOUT_DEPRECATED
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DEPRECATED_SINCE_KOTLIN_WITH_DEPRECATED_LEVEL
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DEPRECATED_SINCE_KOTLIN_WITH_UNORDERED_VERSIONS
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DEPRECATED_TYPE_PARAMETER_SYNTAX
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DESERIALIZATION_ERROR
@@ -443,6 +444,10 @@ class FirDefaultErrorMessages : DefaultErrorMessages.Extension {
DEPRECATED_SINCE_KOTLIN_WITHOUT_DEPRECATED,
" DeprecatedSinceKotlin annotation can be used only together with Deprecated annotation"
)
map.put(
DEPRECATED_SINCE_KOTLIN_WITH_DEPRECATED_LEVEL,
"DeprecatedSinceKotlin annotation can be used only with unspecified deprecation level of Deprecated annotation"
)
// Exposed visibility group // #
map.put(
@@ -9,19 +9,19 @@ fun good() {}
class Clazz
@Deprecated("", level = DeprecationLevel.WARNING)
<!DEPRECATED_SINCE_KOTLIN_WITHOUT_ARGUMENTS!>@DeprecatedSinceKotlin()<!>
<!DEPRECATED_SINCE_KOTLIN_WITHOUT_ARGUMENTS, DEPRECATED_SINCE_KOTLIN_WITH_DEPRECATED_LEVEL!>@DeprecatedSinceKotlin()<!>
fun fooWarning() {}
@Deprecated("", ReplaceWith(""), DeprecationLevel.WARNING)
<!DEPRECATED_SINCE_KOTLIN_WITHOUT_ARGUMENTS!>@DeprecatedSinceKotlin()<!>
<!DEPRECATED_SINCE_KOTLIN_WITHOUT_ARGUMENTS, DEPRECATED_SINCE_KOTLIN_WITH_DEPRECATED_LEVEL!>@DeprecatedSinceKotlin()<!>
fun fooDefaultWarning() {}
@Deprecated("", level = DeprecationLevel.ERROR)
<!DEPRECATED_SINCE_KOTLIN_WITHOUT_ARGUMENTS!>@DeprecatedSinceKotlin()<!>
<!DEPRECATED_SINCE_KOTLIN_WITHOUT_ARGUMENTS, DEPRECATED_SINCE_KOTLIN_WITH_DEPRECATED_LEVEL!>@DeprecatedSinceKotlin()<!>
fun fooError() {}
@Deprecated("", level = DeprecationLevel.HIDDEN)
<!DEPRECATED_SINCE_KOTLIN_WITHOUT_ARGUMENTS!>@DeprecatedSinceKotlin()<!>
<!DEPRECATED_SINCE_KOTLIN_WITHOUT_ARGUMENTS, DEPRECATED_SINCE_KOTLIN_WITH_DEPRECATED_LEVEL!>@DeprecatedSinceKotlin()<!>
fun fooHidden() {}
@Deprecated("")
@@ -545,6 +545,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
token,
)
}
add(FirErrors.DEPRECATED_SINCE_KOTLIN_WITH_DEPRECATED_LEVEL) { firDiagnostic ->
DeprecatedSinceKotlinWithDeprecatedLevelImpl(
firDiagnostic as FirPsiDiagnostic<*>,
token,
)
}
add(FirErrors.EXPOSED_TYPEALIAS_EXPANDED_TYPE) { firDiagnostic ->
ExposedTypealiasExpandedTypeImpl(
firDiagnostic.a,
@@ -392,6 +392,10 @@ sealed class KtFirDiagnostic<PSI: PsiElement> : KtDiagnosticWithPsi<PSI> {
override val diagnosticClass get() = DeprecatedSinceKotlinWithoutDeprecated::class
}
abstract class DeprecatedSinceKotlinWithDeprecatedLevel : KtFirDiagnostic<PsiElement>() {
override val diagnosticClass get() = DeprecatedSinceKotlinWithDeprecatedLevel::class
}
abstract class ExposedTypealiasExpandedType : KtFirDiagnostic<KtNamedDeclaration>() {
override val diagnosticClass get() = ExposedTypealiasExpandedType::class
abstract val elementVisibility: EffectiveVisibility
@@ -633,6 +633,13 @@ internal class DeprecatedSinceKotlinWithoutDeprecatedImpl(
override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic)
}
internal class DeprecatedSinceKotlinWithDeprecatedLevelImpl(
firDiagnostic: FirPsiDiagnostic<*>,
override val token: ValidityToken,
) : KtFirDiagnostic.DeprecatedSinceKotlinWithDeprecatedLevel(), KtAbstractFirDiagnostic<PsiElement> {
override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic)
}
internal class ExposedTypealiasExpandedTypeImpl(
override val elementVisibility: EffectiveVisibility,
override val restrictingDeclaration: KtSymbol,