Skip to content

Play Services artifact Gradle Module Metadata doesn't advertise the sources jar's existence #4112

Open
@EdricChan03

Description

Describe the bug

Currently, sources for the kotlinx-coroutines-play-services artifact aren't recognised, resulting in IntelliJ decompiling the Kotlin source-code when viewing the source of a method, for example the Task.await() method.

This appears to be because the Gradle Module Metadata file that's published onto Maven Central doesn't advertise to end consumers that a sources jar is available, so IntelliJ doesn't download one:

(from https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-play-services/1.8.0/kotlinx-coroutines-play-services-1.8.0.module)

Expand to view GMM file for kotlinx-coroutines-play-services 1.8.0

{
  "formatVersion": "1.1",
  "component": {
    "group": "org.jetbrains.kotlinx",
    "module": "kotlinx-coroutines-play-services",
    "version": "1.8.0",
    "attributes": {
      "org.gradle.status": "release"
    }
  },
  "createdBy": {
    "gradle": {
      "version": "8.5"
    }
  },
  "variants": [
    {
      "name": "apiElements",
      "attributes": {
        "org.gradle.category": "library",
        "org.gradle.dependency.bundling": "external",
        "org.gradle.jvm.environment": "standard-jvm",
        "org.gradle.jvm.version": 8,
        "org.gradle.libraryelements": "jar",
        "org.gradle.usage": "java-api",
        "org.jetbrains.kotlin.platform.type": "jvm"
      },
      "dependencies": [
        /* truncated */
      ],
      "files": [
        {
          "name": "kotlinx-coroutines-play-services-1.8.0.jar",
          "url": "kotlinx-coroutines-play-services-1.8.0.jar",
          "size": 13181,
          "sha512": "3930d6e68f13ff1a49b4de2a35c12f009a2a21c2e7eb21dbffe62ac1e7b7d5de1f08cd823fe92b952f5c4362223f80993e14e1335162bc3f7afa5f5dd90c657e",
          "sha256": "2d6e60b3db6300e20319f30c7c7736267f57b93324b32e94916e6f6028b5b9c5",
          "sha1": "ebdce55873a91b132fd11bf9c8315a8d7f10de75",
          "md5": "13e363f35f10b0b93207666c19e049e5"
        }
      ]
    },
    {
      "name": "runtimeElements",
      "attributes": {
        "org.gradle.category": "library",
        "org.gradle.dependency.bundling": "external",
        "org.gradle.jvm.environment": "standard-jvm",
        "org.gradle.jvm.version": 8,
        "org.gradle.libraryelements": "jar",
        "org.gradle.usage": "java-runtime",
        "org.jetbrains.kotlin.platform.type": "jvm"
      },
      "dependencies": [
        /* truncated */
      ],
      "files": [
        {
          "name": "kotlinx-coroutines-play-services-1.8.0.jar",
          "url": "kotlinx-coroutines-play-services-1.8.0.jar",
          "size": 13181,
          "sha512": "3930d6e68f13ff1a49b4de2a35c12f009a2a21c2e7eb21dbffe62ac1e7b7d5de1f08cd823fe92b952f5c4362223f80993e14e1335162bc3f7afa5f5dd90c657e",
          "sha256": "2d6e60b3db6300e20319f30c7c7736267f57b93324b32e94916e6f6028b5b9c5",
          "sha1": "ebdce55873a91b132fd11bf9c8315a8d7f10de75",
          "md5": "13e363f35f10b0b93207666c19e049e5"
        }
      ]
    }
  ]
}

This is compared to the other artifacts (such as kotlinx-coroutines-core-jvm), which does expose that a sources jar exists:

Expand to view GMM file for kotlinx-coroutines-core-jvm 1.8.0

{
  "formatVersion": "1.1",
  "component": {
    "url": "../../kotlinx-coroutines-core/1.8.0/kotlinx-coroutines-core-1.8.0.module",
    "group": "org.jetbrains.kotlinx",
    "module": "kotlinx-coroutines-core",
    "version": "1.8.0",
    "attributes": {
      "org.gradle.status": "release"
    }
  },
  "createdBy": {
    "gradle": {
      "version": "8.5"
    }
  },
  "variants": [
    {
      "name": "jvmApiElements-published",
      "attributes": {
        "org.gradle.category": "library",
        "org.gradle.libraryelements": "jar",
        "org.gradle.usage": "java-api",
        "org.jetbrains.kotlin.platform.type": "jvm"
      },
      "dependencies": [
        /* truncated */
      ],
      "files": [
        {
          "name": "kotlinx-coroutines-core-jvm-1.8.0.jar",
          "url": "kotlinx-coroutines-core-jvm-1.8.0.jar",
          "size": 1548360,
          "sha512": "081391dcc0b66e4f71401a0684c8f0fe0fa10f195ca5e50208419b4f6110d9b0f90250a43950114d75c79455b9d304afadc069b98c5bc86afa7701ddaed51af1",
          "sha256": "9860906a1937490bf5f3b06d2f0e10ef451e65b95b269f22daf68a3d1f5065c5",
          "sha1": "ac1dc37a30a93150b704022f8d895ee1bd3a36b3",
          "md5": "d29200b10d99a82fafcceabc3a48f7e0"
        }
      ]
    },
    {
      "name": "jvmRuntimeElements-published",
      "attributes": {
        "org.gradle.category": "library",
        "org.gradle.libraryelements": "jar",
        "org.gradle.usage": "java-runtime",
        "org.jetbrains.kotlin.platform.type": "jvm"
      },
      "dependencies": [
        /* truncated */
      ],
      "files": [
        {
          "name": "kotlinx-coroutines-core-jvm-1.8.0.jar",
          "url": "kotlinx-coroutines-core-jvm-1.8.0.jar",
          "size": 1548360,
          "sha512": "081391dcc0b66e4f71401a0684c8f0fe0fa10f195ca5e50208419b4f6110d9b0f90250a43950114d75c79455b9d304afadc069b98c5bc86afa7701ddaed51af1",
          "sha256": "9860906a1937490bf5f3b06d2f0e10ef451e65b95b269f22daf68a3d1f5065c5",
          "sha1": "ac1dc37a30a93150b704022f8d895ee1bd3a36b3",
          "md5": "d29200b10d99a82fafcceabc3a48f7e0"
        }
      ]
    },
    {
      "name": "jvmSourcesElements-published",
      "attributes": {
        "org.gradle.category": "documentation",
        "org.gradle.dependency.bundling": "external",
        "org.gradle.docstype": "sources",
        "org.gradle.libraryelements": "jar",
        "org.gradle.usage": "java-runtime",
        "org.jetbrains.kotlin.platform.type": "jvm"
      },
      "files": [
        {
          "name": "kotlinx-coroutines-core-jvm-1.8.0-sources.jar",
          "url": "kotlinx-coroutines-core-jvm-1.8.0-sources.jar",
          "size": 390254,
          "sha512": "9fb6527120a76cd4a6a0749983a02835f81c747692b3f12a90700fe98f6d463e026d4e7cdb84c003424e0cf3029db30cf6b423e49cab99bd9e06d917f6cf9374",
          "sha256": "451599ff2044e6a98f975b28d106891cc664ae69ad7a30c572dffb5413202179",
          "sha1": "037cb5fe79f895c0900ab9422b14ac91b7b3b37b",
          "md5": "1dd8ed7ce1d91fb7e4e017b4b085c09a"
        }
      ]
    }
  ]
}

Provide a Reproducer

  1. Create a Gradle module which has the play-services artifact:

(gradle/libs.versions.toml)

[versions]
firebase-bom = "32.8.1"
kotlinx-coroutines = "1.8.0"

[libraries]
kotlinx-coroutines-playServices = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-play-services", version.ref = "kotlinx-coroutines" }

firebase-bom = { module = "com.google.firebase:firebase-bom", version.ref = "firebase-bom" }
firebase-auth = { module = "com.google.firebase:firebase-auth" }
dependencies {
  implementation(platform(libs.firebase.bom))
  implementation(libs.firebase.auth)
  implementation(libs.kotlinx.coroutines.playServices)
}
  1. Add some code which uses Task.await()
/**
 * Asynchronously creates a user using the email + password authentication method,
 * with the given [email] and [password].
 * @return The result of the user creation request.
 * @see FirebaseAuth.createUserWithEmailAndPassword
 */
suspend fun FirebaseAuth.createUserWithEmailAndPasswordAsync(
    email: String, password: String
): AuthResult = createUserWithEmailAndPassword(email, password).await()
  1. View source on the await() method
  2. Notice that it navigates to the decompiled Kotlin class rather than the source code (and also showing a licensing warning)
Screenshot of decompilation licensing warning dialog Screenshot of Tasks.kt decompiled output, with no source code

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions