Skip to content

Commit 5797187

Browse files
sandwwraithSpace Team
authored andcommitted
[FIR] Enhance status for Java methods with MustUse status from overridden members
Since we copy return value status from parents to implementations (KT-79922), it should be done for Java enhanced methods as well, to support mixed hierarchies. By doing so, we can also ditch hard-coded list of collection methods in the checker — all required statuses will be copied to Java's collections implementations from interfaces declared in kotlin.collections. #KT-74810 Fixed
1 parent 3325a09 commit 5797187

File tree

15 files changed

+197
-38
lines changed

15 files changed

+197
-38
lines changed

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

Lines changed: 6 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-gen/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLPartialDiagnosticsFe10TestGenerated.java

Lines changed: 6 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-gen/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLReversedDiagnosticsFe10TestGenerated.java

Lines changed: 6 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/FirLightTreeOldFrontendDiagnosticsWithLatestLanguageVersionTestGenerated.java

Lines changed: 6 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: 6 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/PhasedJvmDiagnosticPsiTestGenerated.java

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

compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirUnusedReturnValueChecker.kt

Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -171,44 +171,9 @@ private fun ConeKotlinType.isIgnorable(): Boolean {
171171
private fun FirCallableSymbol<*>.isExcluded(session: FirSession): Boolean = session.mustUseReturnValueStatusComponent.hasIgnorableLikeAnnotation(resolvedAnnotationClassIds)
172172

173173
private fun FirCallableSymbol<*>.isSubjectToCheck(): Boolean {
174-
callableId?.ifTypealiasedJvmCollection { return it }
175-
176-
177174
// TBD: Do we want to report them unconditionally? Or only in FULL mode?
178175
// If latter, metadata flag should be added for them too.
179176
if (this is FirEnumEntrySymbol) return true
180177

181178
return resolvedStatus.returnValueStatus == ReturnValueStatus.MustUse
182179
}
183-
184-
private inline fun CallableId.ifTypealiasedJvmCollection(nonIgnorableCollectionMethod: (Boolean) -> Unit) {
185-
val packageName = packageName.asString()
186-
if (packageName != "kotlin.collections" && packageName != "java.util") return
187-
val className = className?.asString() ?: return
188-
if (className !in setOf( // libraries/stdlib/jvm/src/kotlin/collections/TypeAliases.kt
189-
"ArrayList",
190-
"HashSet",
191-
"LinkedHashSet",
192-
"HashMap",
193-
"LinkedHashMap",
194-
)
195-
) return
196-
nonIgnorableCollectionMethod(
197-
callableName.asString() !in setOf(
198-
"add",
199-
"addAll",
200-
"remove",
201-
"removeAt",
202-
"removeAll",
203-
"removeIf",
204-
"set",
205-
"put",
206-
"putIfAbsent",
207-
"merge",
208-
"compute",
209-
"computeIfAbsent",
210-
"retainAll",
211-
"removeLast"
212-
)
213-
)
214-
}

compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import org.jetbrains.kotlin.fir.caches.firCachesFactory
2121
import org.jetbrains.kotlin.fir.declarations.*
2222
import org.jetbrains.kotlin.fir.declarations.builder.*
2323
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
24-
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl
2524
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
2625
import org.jetbrains.kotlin.fir.declarations.synthetic.buildSyntheticProperty
2726
import org.jetbrains.kotlin.fir.declarations.utils.*
@@ -59,6 +58,7 @@ import org.jetbrains.kotlin.load.java.AnnotationQualifierApplicabilityType.VALUE
5958
import org.jetbrains.kotlin.load.java.typeEnhancement.*
6059
import org.jetbrains.kotlin.load.kotlin.SignatureBuildingComponents
6160
import org.jetbrains.kotlin.name.*
61+
import org.jetbrains.kotlin.resolve.ReturnValueStatus
6262
import org.jetbrains.kotlin.types.AbstractTypeChecker
6363
import org.jetbrains.kotlin.types.model.KotlinTypeMarker
6464
import org.jetbrains.kotlin.types.model.TypeParameterMarker
@@ -409,7 +409,7 @@ class FirSignatureEnhancement(
409409
origin = declarationOrigin
410410

411411
this.name = name!!
412-
status = firMethod.status
412+
status = enhanceStatus(firMethod, predefinedEnhancementInfo, overriddenMembers)
413413
symbol = if (isIntersectionOverride) {
414414
FirIntersectionOverrideFunctionSymbol(
415415
methodId, overriddenMembers.map { it.symbol },
@@ -505,6 +505,20 @@ class FirSignatureEnhancement(
505505
return function.symbol
506506
}
507507

508+
private fun enhanceStatus(
509+
method: FirSimpleFunction,
510+
predefinedEnhancementInfo: PredefinedFunctionEnhancementInfo?,
511+
overriddenMembers: List<FirCallableDeclaration>,
512+
): FirDeclarationStatus {
513+
val original = method.status
514+
if (original.returnValueStatus != ReturnValueStatus.Unspecified) return original
515+
val newRvStatus = overriddenMembers.firstNotNullOfOrNull { declaration ->
516+
declaration.status.returnValueStatus.takeIf { it != ReturnValueStatus.Unspecified }
517+
}
518+
if (newRvStatus == null) return original
519+
return original.copy(returnValueStatus = newRvStatus)
520+
}
521+
508522
private fun buildEnhancedValueParameter(
509523
valueParameter: FirValueParameter,
510524
enhancedReturnType: FirResolvedTypeRef,

compiler/testData/diagnostics/tests/crv/exclusions.fir.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ fun unitF(): Unit = Unit
1010
fun coll(m: MutableList<String>) {
1111
m.add("")
1212
<!RETURN_VALUE_NOT_USED!>m.isEmpty()<!>
13+
<!RETURN_VALUE_NOT_USED!>m.toString()<!>
1314
}
1415

1516
fun nullable(m: MutableList<String>?) {
@@ -20,6 +21,7 @@ fun nullable(m: MutableList<String>?) {
2021
fun lhs(s: LinkedHashSet<String>) {
2122
s.add("x")
2223
<!RETURN_VALUE_NOT_USED!>s.isEmpty()<!>
24+
<!RETURN_VALUE_NOT_USED!>s.toString()<!>
2325
}
2426

2527
fun javaType(m: java.util.ArrayList<String>) {

compiler/testData/diagnostics/tests/crv/exclusions.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ fun unitF(): Unit = Unit
1010
fun coll(m: MutableList<String>) {
1111
m.add("")
1212
m.isEmpty()
13+
m.toString()
1314
}
1415

1516
fun nullable(m: MutableList<String>?) {
@@ -20,6 +21,7 @@ fun nullable(m: MutableList<String>?) {
2021
fun lhs(s: LinkedHashSet<String>) {
2122
s.add("x")
2223
s.isEmpty()
24+
s.toString()
2325
}
2426

2527
fun javaType(m: java.util.ArrayList<String>) {

0 commit comments

Comments
 (0)