From b8ed46066e3c261b6c3339cabd0c6819f9da92e3 Mon Sep 17 00:00:00 2001 From: Mark Punzalan Date: Fri, 24 Sep 2021 00:12:55 +0000 Subject: [PATCH] FIR: Change diagnostic for ConeHiddenCandidate to UNRESOLVED_REFERENCE. The KDoc for @Deprecated states that DeprecationLevel.HIDDEN usages should look like unresolved references. --- .../coneDiagnosticToFirDiagnostic.kt | 17 ++++++++- .../deprecatedInheritance_after.fir.kt | 2 +- .../deprecatedInheritance_before.fir.kt | 2 +- ...deprecatedPropertyInheritance_after.fir.kt | 6 +-- ...eprecatedPropertyInheritance_before.fir.kt | 6 +-- .../deprecatedSinceKotlin/hidden.fir.kt | 37 ------------------ .../deprecatedSinceKotlin/hidden.kt | 1 + .../deprecated/hiddenPropertyAccessors.fir.kt | 16 ++++---- .../resolveModIfRemIsHidden.fir.kt | 4 +- .../tests/resolve/HiddenDeclarations.fir.kt | 38 +++++++++---------- 10 files changed, 53 insertions(+), 76 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/deprecated/deprecatedSinceKotlin/hidden.fir.kt diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt index 391755609e0..5a4e9be2de1 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt @@ -22,29 +22,42 @@ import org.jetbrains.kotlin.fir.resolve.inference.model.ConeExpectedTypeConstrai import org.jetbrains.kotlin.fir.resolve.inference.model.ConeLambdaArgumentConstraintPosition import org.jetbrains.kotlin.fir.resolve.isTypeMismatchDueToNullability import org.jetbrains.kotlin.fir.symbols.impl.FirBackingFieldSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.typeContext import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.resolve.calls.inference.model.* import org.jetbrains.kotlin.resolve.calls.tower.CandidateApplicability import org.jetbrains.kotlin.resolve.calls.tower.isSuccess import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance import org.jetbrains.kotlin.utils.addToStdlib.runIf +import org.jetbrains.kotlin.utils.addToStdlib.safeAs private fun ConeDiagnostic.toFirDiagnostic( source: FirSourceElement, qualifiedAccessSource: FirSourceElement? ): FirDiagnostic? = when (this) { - is ConeUnresolvedReferenceError -> FirErrors.UNRESOLVED_REFERENCE.createOn(source, this.name?.asString() ?: "") + is ConeUnresolvedReferenceError -> FirErrors.UNRESOLVED_REFERENCE.createOn( + source, + (this.name ?: SpecialNames.NO_NAME_PROVIDED).asString() + ) is ConeUnresolvedSymbolError -> FirErrors.UNRESOLVED_REFERENCE.createOn(source, this.classId.asString()) is ConeUnresolvedNameError -> FirErrors.UNRESOLVED_REFERENCE.createOn(source, this.name.asString()) is ConeUnresolvedQualifierError -> FirErrors.UNRESOLVED_REFERENCE.createOn(source, this.qualifier) is ConeFunctionCallExpectedError -> FirErrors.FUNCTION_CALL_EXPECTED.createOn(source, this.name.asString(), this.hasValueParameters) is ConeFunctionExpectedError -> FirErrors.FUNCTION_EXPECTED.createOn(source, this.expression, this.type) is ConeResolutionToClassifierError -> FirErrors.RESOLUTION_TO_CLASSIFIER.createOn(source, this.candidateSymbol) - is ConeHiddenCandidateError -> FirErrors.INVISIBLE_REFERENCE.createOn(source, this.candidateSymbol) + is ConeHiddenCandidateError -> { + // Usages of callables with @Deprecated(DeprecationLevel.HIDDEN) should look like unresolved references. + // See: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-deprecated/ + FirErrors.UNRESOLVED_REFERENCE.createOn( + source, + (this.candidateSymbol.safeAs>()?.name ?: SpecialNames.NO_NAME_PROVIDED).asString() + ) + } is ConeVisibilityError -> FirErrors.INVISIBLE_REFERENCE.createOn(source, this.candidateSymbol) is ConeInapplicableWrongReceiver -> FirErrors.UNRESOLVED_REFERENCE_WRONG_RECEIVER.createOn(source, this.candidateSymbols) is ConeNoCompanionObject -> FirErrors.NO_COMPANION_OBJECT.createOn(source, this.candidateSymbol) diff --git a/compiler/testData/diagnostics/tests/deprecated/deprecatedInheritance_after.fir.kt b/compiler/testData/diagnostics/tests/deprecated/deprecatedInheritance_after.fir.kt index b1a0c1a7b70..765581922b7 100644 --- a/compiler/testData/diagnostics/tests/deprecated/deprecatedInheritance_after.fir.kt +++ b/compiler/testData/diagnostics/tests/deprecated/deprecatedInheritance_after.fir.kt @@ -115,7 +115,7 @@ fun use( ) { wd.f() ed.f() - hd.f() + hd.f() we.f() wh.f() diff --git a/compiler/testData/diagnostics/tests/deprecated/deprecatedInheritance_before.fir.kt b/compiler/testData/diagnostics/tests/deprecated/deprecatedInheritance_before.fir.kt index 3c9382f1b73..44193d7f394 100644 --- a/compiler/testData/diagnostics/tests/deprecated/deprecatedInheritance_before.fir.kt +++ b/compiler/testData/diagnostics/tests/deprecated/deprecatedInheritance_before.fir.kt @@ -115,7 +115,7 @@ fun use( ) { wd.f() ed.f() - hd.f() + hd.f() we.f() wh.f() diff --git a/compiler/testData/diagnostics/tests/deprecated/deprecatedPropertyInheritance_after.fir.kt b/compiler/testData/diagnostics/tests/deprecated/deprecatedPropertyInheritance_after.fir.kt index d9ea189ec99..fa527369562 100644 --- a/compiler/testData/diagnostics/tests/deprecated/deprecatedPropertyInheritance_after.fir.kt +++ b/compiler/testData/diagnostics/tests/deprecated/deprecatedPropertyInheritance_after.fir.kt @@ -107,8 +107,8 @@ fun use( setterDeprecated.p setterDeprecated.p = 1 - hiddenDeprecated.p - hiddenDeprecated.p = 1 + hiddenDeprecated.p + hiddenDeprecated.p = 1 wd.p wd.p = 1 @@ -132,5 +132,5 @@ fun use( ned.p = 1 diff.p - diff.p = 1 + diff.p = 1 } diff --git a/compiler/testData/diagnostics/tests/deprecated/deprecatedPropertyInheritance_before.fir.kt b/compiler/testData/diagnostics/tests/deprecated/deprecatedPropertyInheritance_before.fir.kt index 3bbd9590ae1..530007d01e5 100644 --- a/compiler/testData/diagnostics/tests/deprecated/deprecatedPropertyInheritance_before.fir.kt +++ b/compiler/testData/diagnostics/tests/deprecated/deprecatedPropertyInheritance_before.fir.kt @@ -107,8 +107,8 @@ fun use( setterDeprecated.p setterDeprecated.p = 1 - hiddenDeprecated.p - hiddenDeprecated.p = 1 + hiddenDeprecated.p + hiddenDeprecated.p = 1 wd.p wd.p = 1 @@ -132,5 +132,5 @@ fun use( ned.p = 1 diff.p - diff.p = 1 + diff.p = 1 } diff --git a/compiler/testData/diagnostics/tests/deprecated/deprecatedSinceKotlin/hidden.fir.kt b/compiler/testData/diagnostics/tests/deprecated/deprecatedSinceKotlin/hidden.fir.kt deleted file mode 100644 index 508367e9168..00000000000 --- a/compiler/testData/diagnostics/tests/deprecated/deprecatedSinceKotlin/hidden.fir.kt +++ /dev/null @@ -1,37 +0,0 @@ -// !API_VERSION: 1.4 - -package kotlin - -@Deprecated("") -@DeprecatedSinceKotlin(hiddenSince = "1.4") -class ClassCur - -@Deprecated("") -@DeprecatedSinceKotlin(hiddenSince = "1.4") -fun funCur() {} - -@Deprecated("") -@DeprecatedSinceKotlin(hiddenSince = "1.4") -val valCur = Unit - -@Deprecated("") -@DeprecatedSinceKotlin(hiddenSince = "1.5") -class ClassNext - -@Deprecated("") -@DeprecatedSinceKotlin(hiddenSince = "1.5") -fun funNext() {} - -@Deprecated("") -@DeprecatedSinceKotlin(hiddenSince = "1.5") -val valNext = Unit - -fun usage() { - ClassCur() - funCur() - valCur - - ClassNext() - funNext() - valNext -} diff --git a/compiler/testData/diagnostics/tests/deprecated/deprecatedSinceKotlin/hidden.kt b/compiler/testData/diagnostics/tests/deprecated/deprecatedSinceKotlin/hidden.kt index 3c06b91063a..03faeec3d32 100644 --- a/compiler/testData/diagnostics/tests/deprecated/deprecatedSinceKotlin/hidden.kt +++ b/compiler/testData/diagnostics/tests/deprecated/deprecatedSinceKotlin/hidden.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !API_VERSION: 1.4 package kotlin diff --git a/compiler/testData/diagnostics/tests/deprecated/hiddenPropertyAccessors.fir.kt b/compiler/testData/diagnostics/tests/deprecated/hiddenPropertyAccessors.fir.kt index 1de7c284de3..1bfece0cdfb 100644 --- a/compiler/testData/diagnostics/tests/deprecated/hiddenPropertyAccessors.fir.kt +++ b/compiler/testData/diagnostics/tests/deprecated/hiddenPropertyAccessors.fir.kt @@ -27,14 +27,14 @@ var v6: String set(value) {} fun test() { - v1 - v2 - v3 + v1 + v2 + v3 v3 = "" v4 - v4 = "" - v5 - v5 = "" - v6 - v6 = "" + v4 = "" + v5 + v5 = "" + v6 + v6 = "" } diff --git a/compiler/testData/diagnostics/tests/operatorRem/resolveModIfRemIsHidden.fir.kt b/compiler/testData/diagnostics/tests/operatorRem/resolveModIfRemIsHidden.fir.kt index 2ae4b0c91b8..2c01202bd4a 100644 --- a/compiler/testData/diagnostics/tests/operatorRem/resolveModIfRemIsHidden.fir.kt +++ b/compiler/testData/diagnostics/tests/operatorRem/resolveModIfRemIsHidden.fir.kt @@ -9,7 +9,7 @@ object A { } fun test() { - takeString(A % 123) + takeString(A % 123) } -fun takeString(s: String) {} \ No newline at end of file +fun takeString(s: String) {} diff --git a/compiler/testData/diagnostics/tests/resolve/HiddenDeclarations.fir.kt b/compiler/testData/diagnostics/tests/resolve/HiddenDeclarations.fir.kt index 7c817c5e8fb..b3f1b750831 100644 --- a/compiler/testData/diagnostics/tests/resolve/HiddenDeclarations.fir.kt +++ b/compiler/testData/diagnostics/tests/resolve/HiddenDeclarations.fir.kt @@ -38,23 +38,23 @@ open class A { val String.memberExtensionProperty: Int get() = 1 fun foo() { - topLevelFun() - topLevelFun(1) - topLevelProperty++ - "".topLevelExtensionFun() - 1.topLevelExtensionFun() - "".topLevelExtensionProperty - 1.topLevelExtensionProperty + topLevelFun() + topLevelFun(1) + topLevelProperty++ + "".topLevelExtensionFun() + 1.topLevelExtensionFun() + "".topLevelExtensionProperty + 1.topLevelExtensionProperty - memberFun() - memberFun(1) - privateFun() - privateFun(1) - memberProperty - "".memberExtensionFun() - 1.memberExtensionFun() - "".memberExtensionProperty - 1.memberExtensionProperty + memberFun() + memberFun(1) + privateFun() + privateFun(1) + memberProperty + "".memberExtensionFun() + 1.memberExtensionFun() + "".memberExtensionProperty + 1.memberExtensionProperty A("") } @@ -76,9 +76,9 @@ interface I { class B : A("") { // still can override it override fun memberFun() { - super.memberFun() // but cannot call super :) - privateFun() - privateFun(1) + super.memberFun() // but cannot call super :) + privateFun() + privateFun(1) } }