Skip to content

Commit 29d0d91

Browse files
sandwwraithSpace Team
authored andcommitted
Implement basic version of improved unused return value checker.
Checker supports most expressions, but without separation between stable and unstable values. Add analysis and CLI flag with 3 modes to support further extension to FULL mode. Add @MustUseReturnValue and @IgnorableReturnValue to stdlib. #KT-74804 Fixed #KT-74806 Fixed Merge-request: KT-MR-19960 Merged-by: Leonid Startsev <[email protected]>
1 parent 6ecf544 commit 29d0d91

File tree

51 files changed

+1928
-170
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+1928
-170
lines changed

analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KaFirDataClassConverters.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4569,6 +4569,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KaDiagnosticConverterBuilder.buildConvert
45694569
token,
45704570
)
45714571
}
4572+
add(FirErrors.RETURN_VALUE_NOT_USED) { firDiagnostic ->
4573+
ReturnValueNotUsedImpl(
4574+
firDiagnostic as KtPsiDiagnostic,
4575+
token,
4576+
)
4577+
}
45724578
add(FirErrors.UNSAFE_CALL) { firDiagnostic ->
45734579
UnsafeCallImpl(
45744580
firSymbolBuilder.typeBuilder.buildKtType(firDiagnostic.a),

analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KaFirDiagnostics.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3189,6 +3189,10 @@ sealed interface KaFirDiagnostic<PSI : PsiElement> : KaDiagnosticWithPsi<PSI> {
31893189
override val diagnosticClass get() = TypecheckerHasRunIntoRecursiveProblem::class
31903190
}
31913191

3192+
interface ReturnValueNotUsed : KaFirDiagnostic<KtElement> {
3193+
override val diagnosticClass get() = ReturnValueNotUsed::class
3194+
}
3195+
31923196
interface UnsafeCall : KaFirDiagnostic<PsiElement> {
31933197
override val diagnosticClass get() = UnsafeCall::class
31943198
val receiverType: KaType

analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KaFirDiagnosticsImpl.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3835,6 +3835,11 @@ internal class TypecheckerHasRunIntoRecursiveProblemImpl(
38353835
token: KaLifetimeToken,
38363836
) : KaAbstractFirDiagnostic<KtExpression>(firDiagnostic, token), KaFirDiagnostic.TypecheckerHasRunIntoRecursiveProblem
38373837

3838+
internal class ReturnValueNotUsedImpl(
3839+
firDiagnostic: KtPsiDiagnostic,
3840+
token: KaLifetimeToken,
3841+
) : KaAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KaFirDiagnostic.ReturnValueNotUsed
3842+
38383843
internal class UnsafeCallImpl(
38393844
override val receiverType: KaType,
38403845
override val receiverExpression: KtExpression?,

analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLDiagnosticsFe10TestGenerated.java

Lines changed: 70 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLReversedDiagnosticsFe10TestGenerated.java

Lines changed: 70 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

compiler/cli/cli-common/gen/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArgumentsCopyGenerated.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ fun copyCommonCompilerArguments(from: CommonCompilerArguments, to: CommonCompile
7272
to.reportAllWarnings = from.reportAllWarnings
7373
to.reportOutputFiles = from.reportOutputFiles
7474
to.reportPerf = from.reportPerf
75+
to.returnValueChecker = from.returnValueChecker
7576
to.script = from.script
7677
to.selfUpperBoundInference = from.selfUpperBoundInference
7778
to.skipMetadataVersionCheck = from.skipMetadataVersionCheck

compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,17 @@ This flag partially enables functionality of `-Xexplicit-api` flag, so please do
574574
field = value
575575
}
576576

577+
@Argument(
578+
value = "-Xreturn-value-checker",
579+
valueDescription = "{check|full|disable}",
580+
description = """Set improved unused return value checker mode. Use 'check' to run checker only and use 'full' to also enable automatic annotation insertion."""
581+
)
582+
var returnValueChecker: String = ReturnValueCheckerMode.DISABLED.state
583+
set(value) {
584+
checkFrozen()
585+
field = value
586+
}
587+
577588
@Argument(
578589
value = "-Xinference-compatibility",
579590
description = "Enable compatibility changes for the generic type inference algorithm."
@@ -909,6 +920,10 @@ default: 'first-only-warn' in language version 2.2+, 'first-only' in version 2.1
909920
put(AnalysisFlags.allowFullyQualifiedNameInKClass, true)
910921
put(AnalysisFlags.dontWarnOnErrorSuppression, dontWarnOnErrorSuppression)
911922
fillWarningLevelMap(collector)
923+
ReturnValueCheckerMode.fromString(returnValueChecker)?.also { put(AnalysisFlags.returnValueCheckerMode, it) } ?: collector.report(
924+
CompilerMessageSeverity.ERROR,
925+
"Unknown value for parameter -Xreturn-value-checker: '$returnValueChecker'. Value should be one of ${ReturnValueCheckerMode.availableValues()}"
926+
)
912927
}
913928
}
914929

compiler/config/src/org/jetbrains/kotlin/config/AnalysisFlags.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@ object AnalysisFlags {
8888
val expandTypeAliasesInTypeResolution by AnalysisFlag.Delegates.Boolean(defaultValue = true)
8989

9090
val warningLevels by AnalysisFlag.Delegates.WarningLevelMap
91+
92+
@JvmStatic
93+
val returnValueCheckerMode by AnalysisFlag.Delegates.ReturnValueCheckerDisabledByDefault
9194
}
9295

9396
@Deprecated(

compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsWithLatestLanguageVersionTestGenerated.java

Lines changed: 70 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/PhasedJvmDiagnosticLightTreeTestGenerated.java

Lines changed: 65 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)