collectReferenceToMutatedCollections fails on Kotlin intersection type

  • Languages of the repository: Kotlin
  • Gradle Sonar plugin: 5.0.0.4638
  • Android: Java 17 with target 11
  • Error observed
Cannot analyse '[redacted source].kt' with 'KtChecksVisitor': declarationDescriptor is null for constructor = {String & T} with class org.jetbrains.kotlin.types.IntersectionTypeConstructor
java.lang.IllegalArgumentException: declarationDescriptor is null for constructor = {String & T} with class org.jetbrains.kotlin.types.IntersectionTypeConstructor
	at org.jetbrains.kotlin.js.descriptorUtils.DescriptorUtilsKt.getKotlinTypeFqName(descriptorUtils.kt:26)
	at org.sonarsource.kotlin.checks.CollectionShouldBeImmutableCheck.collectReferenceToMutatedCollections(CollectionShouldBeImmutableCheck.kt:156)
  • Steps to reproduce

The problematic code was of the form

interface Foo {}
suspend fun <T:Any> bar(lambda: (Foo) -> T): List<String> {
  val foo = makeFoo()
  return when (val res = lambda(foo)) {
    is String -> listOf(res)
    is List<*> -> res as List<String>
    else -> emptyList()
  }
}
  • Workaround

None (aside from working out which code is triggering the exception and fixing it :grin:)

1 Like

Getting a very similar issue (also probably related to casting) at org.sonarsource.kotlin.api.checks.ApiExtensionsKt.expressionTypeFqn(ApiExtensions.kt:334)

Hello @rohancz and welcome to the Sonar Community!

Thank you for reporting this issue, I’ve reduced the reproducer and created the issue [SONARKT-388] - Jira to fix it.

Cheers,
Angelo

Similar issue:
Cannot analyse '...' with 'KtChecksVisitor': declarationDescriptor is null for constructor = {Comparable<{Instant & String}> & java.io.Serializable} with class org.jetbrains.kotlin.types.IntersectionTypeConstructor

It’s an android project and this particular class uses import java.time.Instant + desugaring. The code is if-else that returns either String or Instant

Hi @Oleksii_Malovanyi,

Welcome to the community!

You’ve resurrected a topic that’s 6 months old. Per the FAQ, please don’t do that. Please create a new thread with all your details.

 
Thx,
Ann