diff --git a/.idea/libraries/kotlin_metadata.xml b/.idea/libraries/kotlin_metadata.xml index 5de7d939221c..7415d6bf17f3 100644 --- a/.idea/libraries/kotlin_metadata.xml +++ b/.idea/libraries/kotlin_metadata.xml @@ -1,18 +1,18 @@ - + - - 243ac56352ce7e1ca7f294a53b1a1b3040ca12b95725449f0c04bbee6d43d84c + + a4d99e5b88eff9972c117b577436aa587e83f78e60cf005cd614065f59ead7a9 - + - + \ No newline at end of file diff --git a/build/jvm-rules/MODULE.bazel b/build/jvm-rules/MODULE.bazel index e410ad180c91..ac2e16501f3e 100644 --- a/build/jvm-rules/MODULE.bazel +++ b/build/jvm-rules/MODULE.bazel @@ -18,8 +18,8 @@ local_path_override( http_archive( name = "kotlinc", - url = "https://github.com/JetBrains/kotlin/releases/download/v2.1.20-Beta1/kotlin-compiler-2.1.20-Beta1.zip", - sha256 = "a4e655eb8370c6dde9deaf1271836dc6d1d0a667fb00efb2e99021d91e2cf8a4", + url = "https://github.com/JetBrains/kotlin/releases/download/v2.1.20-Beta2/kotlin-compiler-2.1.20-Beta2.zip", + sha256 = "2d24cfb0fd736d86f6aa52fb7bd117b00f5df73d8d99d030f35413ba06db490a", build_file = "//:BUILD.kotlinc.bazel", strip_prefix = "kotlinc", ) @@ -79,119 +79,119 @@ http_file( http_file( name = "kotlin-build-tools-api", - url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-build-tools-api/2.1.20-Beta1/kotlin-build-tools-api-2.1.20-Beta1.jar", - sha256 = "09ddebb845f30310395d91c084f65d2133484080dfac1977502776b77345f3d7", - downloaded_file_path = "kotlin-build-tools-api-2.1.20-Beta1.jar", + url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-build-tools-api/2.1.20-Beta2/kotlin-build-tools-api-2.1.20-Beta2.jar", + sha256 = "d2155dea5f3a6262fa7f68400c858c2982d937863ec142cc13b142e915b324e3", + downloaded_file_path = "kotlin-build-tools-api-2.1.20-Beta2.jar", ) http_file( name = "kotlin-build-tools-api-sources", - url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-build-tools-api/2.1.20-Beta1/kotlin-build-tools-api-2.1.20-Beta1-sources.jar", - sha256 = "236ff9971b05fdbef35fafd390f39546c6b61467d4991474111a4823d359324b", - downloaded_file_path = "kotlin-build-tools-api-2.1.20-Beta1-sources.jar", + url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-build-tools-api/2.1.20-Beta2/kotlin-build-tools-api-2.1.20-Beta2-sources.jar", + sha256 = "fe86558db8dc6b7712ef376b92de40f3573dd844f2529424fb8162309b97d7f6", + downloaded_file_path = "kotlin-build-tools-api-2.1.20-Beta2-sources.jar", ) http_file( name = "kotlin-util-klib", - url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-util-klib/2.1.20-Beta1/kotlin-util-klib-2.1.20-Beta1.jar", - sha256 = "f48b6323092cb30f860cb5c880d6107982d82941166073871a36349dfd3f7909", - downloaded_file_path = "kotlin-util-klib-2.1.20-Beta1.jar", + url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-util-klib/2.1.20-Beta2/kotlin-util-klib-2.1.20-Beta2.jar", + sha256 = "3323354cff5c1e10e5ce3a57a0eb9475b20868264689543b7bc80cf4797423ca", + downloaded_file_path = "kotlin-util-klib-2.1.20-Beta2.jar", ) http_file( name = "kotlin-util-klib-sources", - url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-util-klib/2.1.20-Beta1/kotlin-util-klib-2.1.20-Beta1-sources.jar", + url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-util-klib/2.1.20-Beta2/kotlin-util-klib-2.1.20-Beta2-sources.jar", sha256 = "4aa4da6df01507c0fe9b48ff4f3d2a5eb5edf5f894850169c90efc89330a9d8b", - downloaded_file_path = "kotlin-util-klib-2.1.20-Beta1-sources.jar", + downloaded_file_path = "kotlin-util-klib-2.1.20-Beta2-sources.jar", ) http_file( name = "kotlin-util-klib-metadata", - url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-util-klib-metadata/2.1.20-Beta1/kotlin-util-klib-metadata-2.1.20-Beta1.jar", - sha256 = "1b59ec74876c8d13242d04aeefc22e10444ed082f38ad52fc95bc64a6896c7fd", - downloaded_file_path = "kotlin-util-klib-metadata-2.1.20-Beta1.jar", + url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-util-klib-metadata/2.1.20-Beta2/kotlin-util-klib-metadata-2.1.20-Beta2.jar", + sha256 = "98261bc30acd236aadd09de17b8a375a5a3181af72e293b4d5e41e08a2e2f691", + downloaded_file_path = "kotlin-util-klib-metadata-2.1.20-Beta2.jar", ) http_file( name = "kotlin-util-klib-metadata-sources", - url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-util-klib-metadata/2.1.20-Beta1/kotlin-util-klib-metadata-2.1.20-Beta1-sources.jar", - sha256 = "7d4d0fcd74aa62a12add77e9738a29562086dd23fd095e40f8e5308e8335b5bf", - downloaded_file_path = "kotlin-util-klib-metadata-2.1.20-Beta1-sources.jar", + url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-util-klib-metadata/2.1.20-Beta2/kotlin-util-klib-metadata-2.1.20-Beta2-sources.jar", + sha256 = "8c09123a01414e2e8b7b691aecb3e96b36d993f0101de8566f62f5ff6a1e8d3f", + downloaded_file_path = "kotlin-util-klib-metadata-2.1.20-Beta2-sources.jar", ) http_file( name = "kotlin-build-tools-impl", - url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-build-tools-impl/2.1.20-Beta1/kotlin-build-tools-impl-2.1.20-Beta1.jar", - sha256 = "7e1e4d96ca0d29fc5890b9eadca97f64917e1d67f8385b91cc28cee9215b70b3", - downloaded_file_path = "kotlin-build-tools-impl-2.1.20-Beta1.jar", + url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-build-tools-impl/2.1.20-Beta2/kotlin-build-tools-impl-2.1.20-Beta2.jar", + sha256 = "fef93d25defc9c63fc2d8a85914282ccf18bd4fdf4a757d00417e82c4fe30d75", + downloaded_file_path = "kotlin-build-tools-impl-2.1.20-Beta2.jar", ) http_file( name = "kotlin-build-tools-impl-sources", - url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-build-tools-impl/2.1.20-Beta1/kotlin-build-tools-impl-2.1.20-Beta1-sources.jar", - sha256 = "8f7fe21cd6773f9b4d842cc8eb282e72004b300b6f23b6a32d27346de7336533", - downloaded_file_path = "kotlin-build-tools-impl-2.1.20-Beta1-sources.jar", + url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-build-tools-impl/2.1.20-Beta2/kotlin-build-tools-impl-2.1.20-Beta2-sources.jar", + sha256 = "8f8f11d1078d1a4ee7c5c3a61c3df74e0b3c1820e97a95b9e3a81ea4f70f6101", + downloaded_file_path = "kotlin-build-tools-impl-2.1.20-Beta2-sources.jar", ) http_file( name = "kotlin-compiler", - url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-compiler/2.1.20-Beta1/kotlin-compiler-2.1.20-Beta1.jar", - sha256 = "7bc01138d15bc1b7657480ce9fabbbb704626f92287edc05745341b11d8795b4", - downloaded_file_path = "kotlin-compiler-2.1.20-Beta1.jar", + url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-compiler/2.1.20-Beta2/kotlin-compiler-2.1.20-Beta2.jar", + sha256 = "367c4d9e0ba8c4e1f5ee52552bb4c63ca1422fc8543333378480031eda5010eb", + downloaded_file_path = "kotlin-compiler-2.1.20-Beta2.jar", ) http_file( name = "kotlin-compiler-sources", - url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-compiler/2.1.20-Beta1/kotlin-compiler-2.1.20-Beta1-sources.jar", - sha256 = "8a670f50a7e506cb859a4b4122a7c6d5dfd0fb180a5efd3448ab551dbfc85589", - downloaded_file_path = "kotlin-compiler-2.1.20-Beta1-sources.jar", + url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-compiler/2.1.20-Beta2/kotlin-compiler-2.1.20-Beta2-sources.jar", + sha256 = "84652229286b1136776b0d739993c48d5a963343a9dbd240a7a41da99c68556d", + downloaded_file_path = "kotlin-compiler-2.1.20-Beta2-sources.jar", ) http_file( name = "kotlin-metadata-jvm", - url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-metadata-jvm/2.1.20-Beta1/kotlin-metadata-jvm-2.1.20-Beta1.jar", - sha256 = "243ac56352ce7e1ca7f294a53b1a1b3040ca12b95725449f0c04bbee6d43d84c", - downloaded_file_path = "kotlin-metadata-jvm-2.1.20-Beta1.jar", + url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-metadata-jvm/2.1.20-Beta2/kotlin-metadata-jvm-2.1.20-Beta2.jar", + sha256 = "a4d99e5b88eff9972c117b577436aa587e83f78e60cf005cd614065f59ead7a9", + downloaded_file_path = "kotlin-metadata-jvm-2.1.20-Beta2.jar", ) http_file( name = "kotlin-metadata-jvm-sources", - url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-metadata-jvm/2.1.20-Beta1/kotlin-metadata-jvm-2.1.20-Beta1-sources.jar", + url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-metadata-jvm/2.1.20-Beta2/kotlin-metadata-jvm-2.1.20-Beta2-sources.jar", sha256 = "3f5468b5c409702c7cac30067208b7218ab9e3f7209e686966c6c2de2134dd18", - downloaded_file_path = "kotlin-metadata-jvm-2.1.20-Beta1-sources.jar", + downloaded_file_path = "kotlin-metadata-jvm-2.1.20-Beta2-sources.jar", ) http_file( name = "kotlin-jps-plugin", - url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-jps-plugin/2.1.20-Beta1/kotlin-jps-plugin-2.1.20-Beta1.jar", - sha256 = "0f60c6f49e74ee938605890553df1ba1ce219ebd8a8ff8d93dab82a202293ae8", - downloaded_file_path = "kotlin-jps-plugin-2.1.20-Beta1.jar", + url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-jps-plugin/2.1.20-Beta2/kotlin-jps-plugin-2.1.20-Beta2.jar", + sha256 = "479f83fbaff22361ac3c1c2de410043901afe71e06fa6ab599b0037059b53788", + downloaded_file_path = "kotlin-jps-plugin-2.1.20-Beta2.jar", ) http_file( name = "kotlin-jps-plugin-sources", - url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-jps-plugin/2.1.20-Beta1/kotlin-jps-plugin-2.1.20-Beta1-sources.jar", - sha256 = "5a337df793923ff69a55e52d386e17205570686bab85a4967fb58bbb6aee340a", - downloaded_file_path = "kotlin-jps-plugin-2.1.20-Beta1-sources.jar", + url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-jps-plugin/2.1.20-Beta2/kotlin-jps-plugin-2.1.20-Beta2-sources.jar", + sha256 = "9050fd365fa139a4aa0c5c1383d177474eacf151495b577987ffc86bc78cecbc", + downloaded_file_path = "kotlin-jps-plugin-2.1.20-Beta2-sources.jar", ) http_file( name = "kotlin-serialization-compiler-plugin", - url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-serialization-compiler-plugin/2.1.20-Beta1/kotlin-serialization-compiler-plugin-2.1.20-Beta1.jar", - sha256 = "6c84d19e34509173b9e9f7ea7cbd96e1a1c8314b603f691a328012dd1e0b8f9e", - downloaded_file_path = "kotlin-serialization-compiler-plugin-2.1.20-Beta1.jar", + url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-serialization-compiler-plugin/2.1.20-Beta2/kotlin-serialization-compiler-plugin-2.1.20-Beta2.jar", + sha256 = "deabc2903e4c1aab9d5e3e4be29736c0873a961b7b2f9db02051d5fd1675ceb8", + downloaded_file_path = "kotlin-serialization-compiler-plugin-2.1.20-Beta2.jar", ) http_file( name = "kotlin-serialization-compiler-plugin-sources", - url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-serialization-compiler-plugin/2.1.20-Beta1/kotlin-serialization-compiler-plugin-2.1.20-Beta1-sources.jar", - sha256 = "09037197de2c7b4a022c1bb9be4ed3d13d38dd63ca7c08465765e98501378306", - downloaded_file_path = "kotlin-serialization-compiler-plugin-2.1.20-Beta1-sources.jar", + url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-serialization-compiler-plugin/2.1.20-Beta2/kotlin-serialization-compiler-plugin-2.1.20-Beta2-sources.jar", + sha256 = "941b3bf2b6b366f6b6d066b8d17daf4ec974ec9a419888aa3448716b15fde8e9", + downloaded_file_path = "kotlin-serialization-compiler-plugin-2.1.20-Beta2-sources.jar", ) http_file( name = "kotlin-compose-compiler-plugin", - url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-compose-compiler-plugin/2.1.20-Beta1/kotlin-compose-compiler-plugin-2.1.20-Beta1.jar", - sha256 = "a8b056165e5f0f294b52b61721bfbf776d17e6a270a33f8e6e5d8bf405ece4a4", - downloaded_file_path = "kotlin-compose-compiler-plugin-2.1.20-Beta1.jar", + url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-compose-compiler-plugin/2.1.20-Beta2/kotlin-compose-compiler-plugin-2.1.20-Beta2.jar", + sha256 = "516e93281f577203335d0aaafcd63a5ffa23082d674c3d78159d5000b1c40f61", + downloaded_file_path = "kotlin-compose-compiler-plugin-2.1.20-Beta2.jar", ) http_file( name = "kotlin-compose-compiler-plugin-sources", - url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-compose-compiler-plugin/2.1.20-Beta1/kotlin-compose-compiler-plugin-2.1.20-Beta1-sources.jar", - sha256 = "320128e59ff599f6016addcc6aabea8bd2715609586502430647b4820fbe9836", - downloaded_file_path = "kotlin-compose-compiler-plugin-2.1.20-Beta1-sources.jar", + url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-compose-compiler-plugin/2.1.20-Beta2/kotlin-compose-compiler-plugin-2.1.20-Beta2-sources.jar", + sha256 = "bfb26a777eb4338852c072adb735c7903306e7c45ea57a59e6a023f2986af628", + downloaded_file_path = "kotlin-compose-compiler-plugin-2.1.20-Beta2-sources.jar", ) http_file( diff --git a/build/jvm-rules/libs.lock.json b/build/jvm-rules/libs.lock.json index 876c0e1a67e4..1a11ac6aaa2c 100644 --- a/build/jvm-rules/libs.lock.json +++ b/build/jvm-rules/libs.lock.json @@ -43,40 +43,40 @@ "abfef148779957f34430c14e9b9a98872ea8064336bc82998d53668a0ded7d2a", "d1fd0853979b6670f073fb95f83794c5792706e179a686a6471ee3a6450bf716" ], - "org.jetbrains.kotlin:kotlin-build-tools-api:2.1.20-Beta1": [ - "09ddebb845f30310395d91c084f65d2133484080dfac1977502776b77345f3d7", - "236ff9971b05fdbef35fafd390f39546c6b61467d4991474111a4823d359324b" + "org.jetbrains.kotlin:kotlin-build-tools-api:2.1.20-Beta2": [ + "d2155dea5f3a6262fa7f68400c858c2982d937863ec142cc13b142e915b324e3", + "fe86558db8dc6b7712ef376b92de40f3573dd844f2529424fb8162309b97d7f6" ], - "org.jetbrains.kotlin:kotlin-build-tools-impl:2.1.20-Beta1": [ - "7e1e4d96ca0d29fc5890b9eadca97f64917e1d67f8385b91cc28cee9215b70b3", - "8f7fe21cd6773f9b4d842cc8eb282e72004b300b6f23b6a32d27346de7336533" + "org.jetbrains.kotlin:kotlin-build-tools-impl:2.1.20-Beta2": [ + "fef93d25defc9c63fc2d8a85914282ccf18bd4fdf4a757d00417e82c4fe30d75", + "8f8f11d1078d1a4ee7c5c3a61c3df74e0b3c1820e97a95b9e3a81ea4f70f6101" ], - "org.jetbrains.kotlin:kotlin-compiler:2.1.20-Beta1": [ - "7bc01138d15bc1b7657480ce9fabbbb704626f92287edc05745341b11d8795b4", - "8a670f50a7e506cb859a4b4122a7c6d5dfd0fb180a5efd3448ab551dbfc85589" + "org.jetbrains.kotlin:kotlin-compiler:2.1.20-Beta2": [ + "367c4d9e0ba8c4e1f5ee52552bb4c63ca1422fc8543333378480031eda5010eb", + "84652229286b1136776b0d739993c48d5a963343a9dbd240a7a41da99c68556d" ], - "org.jetbrains.kotlin:kotlin-compose-compiler-plugin:2.1.20-Beta1": [ - "a8b056165e5f0f294b52b61721bfbf776d17e6a270a33f8e6e5d8bf405ece4a4", - "320128e59ff599f6016addcc6aabea8bd2715609586502430647b4820fbe9836" + "org.jetbrains.kotlin:kotlin-compose-compiler-plugin:2.1.20-Beta2": [ + "516e93281f577203335d0aaafcd63a5ffa23082d674c3d78159d5000b1c40f61", + "bfb26a777eb4338852c072adb735c7903306e7c45ea57a59e6a023f2986af628" ], - "org.jetbrains.kotlin:kotlin-jps-plugin:2.1.20-Beta1": [ - "0f60c6f49e74ee938605890553df1ba1ce219ebd8a8ff8d93dab82a202293ae8", - "5a337df793923ff69a55e52d386e17205570686bab85a4967fb58bbb6aee340a" + "org.jetbrains.kotlin:kotlin-jps-plugin:2.1.20-Beta2": [ + "479f83fbaff22361ac3c1c2de410043901afe71e06fa6ab599b0037059b53788", + "9050fd365fa139a4aa0c5c1383d177474eacf151495b577987ffc86bc78cecbc" ], - "org.jetbrains.kotlin:kotlin-metadata-jvm:2.1.20-Beta1": [ - "243ac56352ce7e1ca7f294a53b1a1b3040ca12b95725449f0c04bbee6d43d84c", + "org.jetbrains.kotlin:kotlin-metadata-jvm:2.1.20-Beta2": [ + "a4d99e5b88eff9972c117b577436aa587e83f78e60cf005cd614065f59ead7a9", "3f5468b5c409702c7cac30067208b7218ab9e3f7209e686966c6c2de2134dd18" ], - "org.jetbrains.kotlin:kotlin-serialization-compiler-plugin:2.1.20-Beta1": [ - "6c84d19e34509173b9e9f7ea7cbd96e1a1c8314b603f691a328012dd1e0b8f9e", - "09037197de2c7b4a022c1bb9be4ed3d13d38dd63ca7c08465765e98501378306" + "org.jetbrains.kotlin:kotlin-serialization-compiler-plugin:2.1.20-Beta2": [ + "deabc2903e4c1aab9d5e3e4be29736c0873a961b7b2f9db02051d5fd1675ceb8", + "941b3bf2b6b366f6b6d066b8d17daf4ec974ec9a419888aa3448716b15fde8e9" ], - "org.jetbrains.kotlin:kotlin-util-klib-metadata:2.1.20-Beta1": [ - "1b59ec74876c8d13242d04aeefc22e10444ed082f38ad52fc95bc64a6896c7fd", - "7d4d0fcd74aa62a12add77e9738a29562086dd23fd095e40f8e5308e8335b5bf" + "org.jetbrains.kotlin:kotlin-util-klib-metadata:2.1.20-Beta2": [ + "98261bc30acd236aadd09de17b8a375a5a3181af72e293b4d5e41e08a2e2f691", + "8c09123a01414e2e8b7b691aecb3e96b36d993f0101de8566f62f5ff6a1e8d3f" ], - "org.jetbrains.kotlin:kotlin-util-klib:2.1.20-Beta1": [ - "f48b6323092cb30f860cb5c880d6107982d82941166073871a36349dfd3f7909", + "org.jetbrains.kotlin:kotlin-util-klib:2.1.20-Beta2": [ + "3323354cff5c1e10e5ce3a57a0eb9475b20868264689543b7bc80cf4797423ca", "4aa4da6df01507c0fe9b48ff4f3d2a5eb5edf5f894850169c90efc89330a9d8b" ], "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.1": [ diff --git a/build/jvm-rules/libs.yaml b/build/jvm-rules/libs.yaml index cd4746cce4d9..e825646de659 100644 --- a/build/jvm-rules/libs.yaml +++ b/build/jvm-rules/libs.yaml @@ -5,28 +5,28 @@ version: 4.29.3 # kotlin JPS plugin - id: org.jetbrains.kotlin:kotlin-build-tools-api - version: 2.1.20-Beta1 + version: 2.1.20-Beta2 - id: org.jetbrains.kotlin:kotlin-util-klib - version: 2.1.20-Beta1 + version: 2.1.20-Beta2 - id: org.jetbrains.kotlin:kotlin-util-klib-metadata - version: 2.1.20-Beta1 + version: 2.1.20-Beta2 # kotlin compiler - id: org.jetbrains.kotlin:kotlin-build-tools-impl - version: 2.1.20-Beta1 + version: 2.1.20-Beta2 - id: org.jetbrains.kotlin:kotlin-compiler - version: 2.1.20-Beta1 + version: 2.1.20-Beta2 runtimeDeps: - "@lib//:jetbrains-annotations" - ":kotlinx-coroutines-core" - id: org.jetbrains.kotlin:kotlin-metadata-jvm - version: 2.1.20-Beta1 + version: 2.1.20-Beta2 - id: org.jetbrains.kotlin:kotlin-jps-plugin - version: 2.1.20-Beta1 + version: 2.1.20-Beta2 # kotlin compiler plugins - id: org.jetbrains.kotlin:kotlin-serialization-compiler-plugin - version: 2.1.20-Beta1 + version: 2.1.20-Beta2 - id: org.jetbrains.kotlin:kotlin-compose-compiler-plugin - version: 2.1.20-Beta1 + version: 2.1.20-Beta2 - id: dev.drewhamilton.poko:poko-compiler-plugin version: 0.18.2 # other libs diff --git a/build/jvm-rules/src/abi/JavaAbiClassVisitor.kt b/build/jvm-rules/src/abi/JavaAbiClassVisitor.kt index 47bdb65da347..1438aff9ae87 100644 --- a/build/jvm-rules/src/abi/JavaAbiClassVisitor.kt +++ b/build/jvm-rules/src/abi/JavaAbiClassVisitor.kt @@ -35,8 +35,6 @@ internal class JavaAbiClassVisitor( } override fun visit(version: Int, access: Int, name: String, signature: String?, superName: String?, interfaces: Array?) { - //isApiClass = (access and (Opcodes.ACC_PUBLIC or Opcodes.ACC_PROTECTED)) != 0 - // we have a lot of violations for now - allow any, even package-local class isApiClass = (access and (Opcodes.ACC_PUBLIC or Opcodes.ACC_PROTECTED)) != 0 if (isApiClass) { classVisitor.visit(version, access, name, signature, superName, interfaces) diff --git a/build/jvm-rules/src/abi/KotlinAbiClassVisitor.kt b/build/jvm-rules/src/abi/KotlinAbiClassVisitor.kt index 3891d8a8d79c..d715919b61cc 100644 --- a/build/jvm-rules/src/abi/KotlinAbiClassVisitor.kt +++ b/build/jvm-rules/src/abi/KotlinAbiClassVisitor.kt @@ -1,15 +1,17 @@ +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +@file:Suppress("ReplaceGetOrSet") + package org.jetbrains.bazel.jvm.abi import org.jetbrains.org.objectweb.asm.AnnotationVisitor -import org.jetbrains.org.objectweb.asm.Attribute +import org.jetbrains.org.objectweb.asm.ClassReader import org.jetbrains.org.objectweb.asm.ClassVisitor +import org.jetbrains.org.objectweb.asm.ClassWriter import org.jetbrains.org.objectweb.asm.FieldVisitor import org.jetbrains.org.objectweb.asm.MethodVisitor -import org.jetbrains.org.objectweb.asm.ModuleVisitor import org.jetbrains.org.objectweb.asm.Opcodes -import org.jetbrains.org.objectweb.asm.RecordComponentVisitor -import org.jetbrains.org.objectweb.asm.TypePath -import org.jetbrains.org.objectweb.asm.tree.AnnotationNode +import org.jetbrains.org.objectweb.asm.commons.ClassRemapper +import org.jetbrains.org.objectweb.asm.commons.Remapper import org.jetbrains.org.objectweb.asm.tree.FieldNode import org.jetbrains.org.objectweb.asm.tree.MethodNode import kotlin.metadata.KmClass @@ -29,51 +31,56 @@ import kotlin.metadata.jvm.localDelegatedProperties import kotlin.metadata.jvm.signature import kotlin.metadata.visibility -internal class KotlinAbiClassVisitor( - private val classVisitor: ClassVisitor, +internal fun createAbForKotlin(classesToBeDeleted: HashSet, item: JarContentToProcess): ByteArray? { + val classWriter = ClassWriter(0) + val innerClassesToKeep = HashSet() + val remapper = ClassRemapper(classWriter, object : Remapper() { + override fun map(internalName: String): String { + innerClassesToKeep.add(internalName) + return internalName + } + + override fun mapInnerClassName(name: String, ownerName: String?, innerName: String?): String? = innerName + }) + val abiClassVisitor = KotlinAbiClassVisitor( + classesToBeDeleted = classesToBeDeleted, + treatInternalAsPrivate = false, + remapper = remapper, + innerClassesToKeep = innerClassesToKeep, + ) + ClassReader(item.data).accept(abiClassVisitor, ClassReader.SKIP_FRAMES) + if (abiClassVisitor.isApiClass) { + return classWriter.toByteArray() + } + return null +} + +private class InnerClassInfo( + @JvmField val name: String, + @JvmField val outerName: String?, + @JvmField val innerName: String?, + @JvmField val access: Int, +) + +// inspired by JvmAbiOutputExtension +private class KotlinAbiClassVisitor( private val classesToBeDeleted: MutableSet, private val treatInternalAsPrivate: Boolean, -) : ClassVisitor(Opcodes.API_VERSION) { + remapper: ClassRemapper, + private val innerClassesToKeep: MutableSet, +) : ClassVisitor(Opcodes.API_VERSION, remapper) { + private val innerClassToInfo = mutableMapOf() + // tracks if this class has any public API members var isApiClass: Boolean = true private set - private val visibleAnnotations = ArrayList() - private val invisibleAnnotations = ArrayList() - private val fields = mutableListOf() private val methods = mutableListOf() private var kotlinMetadata: Pair? = null - override fun visitAnnotation(descriptor: String, visible: Boolean): AnnotationVisitor? { - // parse @Metadata for Kotlin-specific visibility information - @Suppress("SpellCheckingInspection") - if (descriptor == "Lkotlin/Metadata;") { - return KotlinAnnotationVisitor { - kotlinMetadata = descriptor to KotlinClassMetadata.readStrict(it) - } - } - else { - val annotationNode = AnnotationNode(api, descriptor) - (if (visible) visibleAnnotations else invisibleAnnotations).add(annotationNode) - return annotationNode - } - } - - override fun visit(version: Int, access: Int, name: String, signature: String?, superName: String?, interfaces: Array?) { - isApiClass = (access and (Opcodes.ACC_PUBLIC or Opcodes.ACC_PROTECTED)) != 0 - if (isApiClass) { - val visibility = (kotlinMetadata?.second as? KotlinClassMetadata.Class)?.kmClass?.visibility - if (visibility == null || !isPrivateVisibility(visibility, treatInternalAsPrivate)) { - classVisitor.visit(version, access, name, signature, superName, interfaces) - return - } - else { - isApiClass = false - } - } - - classesToBeDeleted.add(name) + override fun visitSource(source: String?, debug: String?) { + // debug not important } override fun visitField( @@ -113,20 +120,61 @@ internal class KotlinAbiClassVisitor( val method = MethodNode(Opcodes.API_VERSION, access, name, descriptor, signature, exceptions) methods.add(method) + if (access and (Opcodes.ACC_NATIVE or Opcodes.ACC_ABSTRACT) != 0) { + return method + } + val functions = kotlinMetadata?.second?.let { getFunctions(it) } val isInlineMethod = functions != null && functions.any { it.isInline && it.name == method.name } if (isInlineMethod) { return method } else { - return ReplaceWithEmptyBody(method) + return BodyStrippingMethodVisitor(method) } } - override fun visitEnd() { - visibleAnnotations.sortBy { it.desc } - invisibleAnnotations.sortBy { it.desc } + override fun visitInnerClass(name: String, outerName: String?, innerName: String?, access: Int) { + // `visitInnerClass` is called before `visitField`/`visitMethod`, so we don't know + // which types are referenced by kept methods yet. + innerClassToInfo[name] = InnerClassInfo(name, outerName, innerName, access) + } + override fun visitAnnotation(descriptor: String, visible: Boolean): AnnotationVisitor? { + // parse @Metadata for Kotlin-specific visibility information + @Suppress("SpellCheckingInspection") + when (descriptor) { + "Lkotlin/Metadata;" -> { + return KotlinAnnotationVisitor { + kotlinMetadata = descriptor to KotlinClassMetadata.readStrict(it) + } + } + "Lkotlin/jvm/internal/SourceDebugExtension;" -> { + return null + } + else -> { + return super.visitAnnotation(descriptor, visible) + } + } + } + + override fun visit(version: Int, access: Int, name: String, signature: String?, superName: String?, interfaces: Array?) { + isApiClass = (access and (Opcodes.ACC_PUBLIC or Opcodes.ACC_PROTECTED)) != 0 + if (isApiClass) { + val visibility = (kotlinMetadata?.second as? KotlinClassMetadata.Class)?.kmClass?.visibility + if (visibility == null || !isPrivateVisibility(visibility, treatInternalAsPrivate)) { + cv.visit(version, access, name, signature, superName, interfaces) + return + } + else { + isApiClass = false + } + } + + classesToBeDeleted.add(name) + } + + override fun visitEnd() { fields.sortBy { it.name } methods.sortBy { it.name } @@ -134,85 +182,27 @@ internal class KotlinAbiClassVisitor( transformAndWriteKotlinMetadata( metadata = header, descriptor = descriptor, - classVisitor = classVisitor, + classVisitor = cv, classesToBeDeleted = classesToBeDeleted, treatInternalAsPrivate = treatInternalAsPrivate, ) } - for (annotation in visibleAnnotations) { - annotation.accept(classVisitor.visitAnnotation(annotation.desc, true)) - } - for (annotation in invisibleAnnotations) { - annotation.accept(classVisitor.visitAnnotation(annotation.desc, false)) - } - for (field in fields) { - field.accept(classVisitor) + field.accept(cv) } - //val km = kotlinMetadata?.second - //val functions = getFunctions(km) for (method in methods) { - //if (isInlineMethod || !isKotlin) { - method.accept(classVisitor) - //} - //else { - // val methodVisitor = cv.visitMethod(method.access, method.name, method.desc, method.signature, method.exceptions?.toTypedArray()) - // methodVisitor.visitCode() - // methodVisitor.visitInsn(Opcodes.RETURN) - // methodVisitor.visitMaxs(0, 0) - // methodVisitor.visitEnd() - //} + val methodVisitor = cv.visitMethod(method.access, method.name, method.desc, method.signature, method.exceptions?.toTypedArray()) + method.accept(methodVisitor) } - classVisitor.visitEnd() - } - - override fun visitSource(source: String?, debug: String?) { - classVisitor.visitSource(source, debug) - } - - override fun visitModule(name: String?, access: Int, version: String?): ModuleVisitor? { - return classVisitor.visitModule(name, access, version) - } - - override fun visitAttribute(attribute: Attribute?) { - classVisitor.visitAttribute(attribute) - } - - override fun visitOuterClass(owner: String?, name: String?, descriptor: String?) { - classVisitor.visitOuterClass(owner, name, descriptor) - } - - override fun visitRecordComponent(name: String?, descriptor: String?, signature: String?): RecordComponentVisitor? { - return classVisitor.visitRecordComponent(name, descriptor, signature) - } - - override fun visitTypeAnnotation(typeRef: Int, typePath: TypePath?, descriptor: String?, visible: Boolean): AnnotationVisitor? { - return classVisitor.visitTypeAnnotation(typeRef, typePath, descriptor, visible) - } - - override fun visitNestMember(nestMember: String?) { - if (nestMember == null || !classesToBeDeleted.contains(nestMember)) { - classVisitor.visitNestMember(nestMember) + for (name in innerClassesToKeep.sorted()) { + val innerClassInfo = innerClassToInfo.get(name) ?: continue + cv.visitInnerClass(innerClassInfo.name, innerClassInfo.outerName, innerClassInfo.innerName, innerClassInfo.access) } - } - override fun visitPermittedSubclass(permittedSubclass: String?) { - if (permittedSubclass == null || !classesToBeDeleted.contains(permittedSubclass)) { - classVisitor.visitPermittedSubclass(permittedSubclass) - } - } - - override fun visitInnerClass(name: String?, outerName: String?, innerName: String?, access: Int) { - if (innerName == null || !classesToBeDeleted.contains(name)) { - classVisitor.visitInnerClass(name, outerName, innerName, access) - } - } - - override fun visitNestHost(nestHost: String?) { - classVisitor.visitNestHost(nestHost) + cv.visitEnd() } private fun isMethodKotlinInternal(methodName: String?): Boolean { @@ -373,27 +363,13 @@ private fun removePrivateDeclarationsForDeclarationContainer( } } -private class ReplaceWithEmptyBody( - private val targetWriter: MethodVisitor, -) : MethodVisitor(Opcodes.API_VERSION) { +private class BodyStrippingMethodVisitor(visitor: MethodVisitor) : MethodVisitor(Opcodes.API_VERSION, visitor) { override fun visitCode() { - targetWriter.visitCode() - targetWriter.visitInsn(Opcodes.RETURN) - } - - override fun visitParameter(name: String?, access: Int) { - targetWriter.visitParameter(name, access) - } - - override fun visitParameterAnnotation(parameter: Int, descriptor: String?, visible: Boolean): AnnotationVisitor? { - return targetWriter.visitParameterAnnotation(parameter, descriptor, visible) - } - - override fun visitAnnotation(descriptor: String?, visible: Boolean): AnnotationVisitor? { - return targetWriter.visitAnnotation(descriptor, visible) - } - - override fun visitEnd() { - targetWriter.visitEnd() + mv.visitCode() + mv.visitInsn(Opcodes.ACONST_NULL) + mv.visitInsn(Opcodes.ATHROW) + mv.visitMaxs(0, 0) + mv.visitEnd() + mv = null } } \ No newline at end of file diff --git a/build/jvm-rules/src/abi/TestAbiGenerator.kt b/build/jvm-rules/src/abi/TestAbiGenerator.kt index ca019db63ceb..6ad7d829b2b2 100644 --- a/build/jvm-rules/src/abi/TestAbiGenerator.kt +++ b/build/jvm-rules/src/abi/TestAbiGenerator.kt @@ -13,16 +13,16 @@ internal object TestAbiGenerator { try { //val className = "com.intellij.codeInsight.folding.impl.FoldingUtil" val className = "com.intellij.ui.AppUIUtilKt" - val classReader = ClassReader(zip.getInputStream(zip.getEntry(className.replace('.', '/') + ".class"))) + val zipName = className.replace('.', '/') + ".class" + val data = zip.getInputStream(zip.getEntry(zipName)).use { it.readAllBytes() } + val classesToBeDeleted = HashSet() - val classWriter = ClassWriter(classReader, 0) - val abiVisitor = KotlinAbiClassVisitor( - classVisitor = classWriter, - classesToBeDeleted = classesToBeDeleted, - treatInternalAsPrivate = false, - ) - classReader.accept(abiVisitor, ClassReader.SKIP_CODE or ClassReader.SKIP_FRAMES) - val bytes = classWriter.toByteArray() + val bytes = createAbForKotlin(HashSet(), JarContentToProcess( + name = zipName.toByteArray(), + data = data, + isKotlinModuleMetadata = false, + isKotlin = true, + )) //val classNode = ClassNode() //ClassReader(bytes).accept(classNode, 0) } diff --git a/build/jvm-rules/src/abi/abi.kt b/build/jvm-rules/src/abi/abi.kt index 032ae2ec211a..0710b03c9be2 100644 --- a/build/jvm-rules/src/abi/abi.kt +++ b/build/jvm-rules/src/abi/abi.kt @@ -40,16 +40,11 @@ suspend fun writeAbi(abiJar: Path, classChannel: Channel) { private fun createAbi(item: JarContentToProcess, classesToBeDeleted: HashSet): ByteArray? { if (item.isKotlin) { - val classWriter = ClassWriter(ClassWriter.COMPUTE_MAXS) - val abiClassVisitor = KotlinAbiClassVisitor( - classVisitor = classWriter, - classesToBeDeleted = classesToBeDeleted, - treatInternalAsPrivate = false, - ) - ClassReader(item.data).accept(abiClassVisitor, ClassReader.SKIP_FRAMES) - if (abiClassVisitor.isApiClass) { - return classWriter.toByteArray() + // check that Java ABI works + if (true) { + return item.data } + return createAbForKotlin(classesToBeDeleted, item) } else { val classWriter = ClassWriter(0) diff --git a/build/jvm-rules/src/compiler-util/ArgMap.kt b/build/jvm-rules/src/compiler-util/ArgMap.kt index 32d682c0ee31..508350b38a81 100644 --- a/build/jvm-rules/src/compiler-util/ArgMap.kt +++ b/build/jvm-rules/src/compiler-util/ArgMap.kt @@ -1,4 +1,4 @@ -// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.bazel.jvm.kotlin import java.util.* @@ -30,7 +30,7 @@ class ArgMap> internal constructor(private val map: EnumMap = requireNotNull(map[key]) { "$key is not optional"} + fun mandatory(key: T): List = requireNotNull(map[key]) { "$key is not optional" } fun optional(key: T): List? = map[key] @@ -68,7 +68,8 @@ fun > createArgMap( if (it.startsWith("--")) { mergeCurrent() currentKey = java.lang.Enum.valueOf(enumClass, it.substring(2).uppercase().replace('-', '_')) - } else { + } + else { currentValue.add(it) } } diff --git a/build/jvm-rules/src/jps-builder/JpsBuilder.kt b/build/jvm-rules/src/jps-builder/JpsBuilder.kt index 728c9a70d569..b28bcc46260e 100644 --- a/build/jvm-rules/src/jps-builder/JpsBuilder.kt +++ b/build/jvm-rules/src/jps-builder/JpsBuilder.kt @@ -14,7 +14,6 @@ import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap import kotlinx.coroutines.* import org.apache.arrow.memory.RootAllocator import org.jetbrains.annotations.VisibleForTesting -import org.jetbrains.bazel.jvm.WorkRequest import org.jetbrains.bazel.jvm.WorkRequestExecutor import org.jetbrains.bazel.jvm.jps.impl.* import org.jetbrains.bazel.jvm.jps.state.LoadStateResult @@ -28,7 +27,6 @@ import org.jetbrains.bazel.jvm.kotlin.JvmBuilderFlags import org.jetbrains.bazel.jvm.kotlin.parseArgs import org.jetbrains.bazel.jvm.processRequests import org.jetbrains.bazel.jvm.use -import org.jetbrains.jps.api.CanceledStatus import org.jetbrains.jps.api.GlobalOptions import org.jetbrains.jps.backwardRefs.JavaBackwardReferenceIndexBuilder import org.jetbrains.jps.builders.java.JavaModuleBuildTargetType @@ -77,7 +75,7 @@ fun configureGlobalJps(tracer: Tracer, scope: CoroutineScope) { configureKotlincHome() } -internal class JpsBuildWorker private constructor(private val allocator: RootAllocator) : WorkRequestExecutor { +internal class JpsBuildWorker private constructor(private val allocator: RootAllocator) : WorkRequestExecutor { companion object { @JvmStatic fun main(startupArgs: Array) { @@ -86,14 +84,15 @@ internal class JpsBuildWorker private constructor(private val allocator: RootAll startupArgs = startupArgs, executor = JpsBuildWorker(allocator), setup = { tracer, scope -> configureGlobalJps(tracer = tracer, scope = scope) }, - serviceName = "jps-builder" + reader = WorkRequestWithDigestReader(System.`in`), + serviceName = "jps-builder", ) } } } @OptIn(ExperimentalStdlibApi::class) - override suspend fun execute(request: WorkRequest, writer: Writer, baseDir: Path, tracingContext: Context, tracer: Tracer): Int { + override suspend fun execute(request: WorkRequestWithDigests, writer: Writer, baseDir: Path, tracingContext: Context, tracer: Tracer): Int { val dependencyFileToDigest = hashMap() val sourceFileToDigest = hashMap(request.inputPaths.size) val sources = ArrayList() @@ -101,7 +100,7 @@ internal class JpsBuildWorker private constructor(private val allocator: RootAll val sourceFileToDigestDebugString = if (isDebugEnabled) StringBuilder() else null val dependencyFileToDigestDebugString = if (isDebugEnabled) StringBuilder() else null for ((index, input) in request.inputPaths.withIndex()) { - val digest = request.inputDigests[index] + val digest = request.inputDigests.get(index) if (input.endsWith(".kt") || input.endsWith(".java")) { val file = baseDir.resolve(input).normalize() sources.add(file) @@ -347,11 +346,11 @@ private suspend fun initAndBuild( val storageInitializer = StorageInitializer(dataDir = dataDir, classOutDir = classOutDir) val storageManager = tracer.spanBuilder("init storage").setParent(tracingContext).use { span -> if (isRebuild) { - storageInitializer.clearAndInit(span) - } - else { - storageInitializer.init(span) - } + storageInitializer.clearAndInit(span) + } + else { + storageInitializer.init(span) + } } try { val projectDescriptor = storageInitializer.createProjectDescriptor( @@ -376,10 +375,7 @@ private suspend fun initAndBuild( projectDescriptor, messageHandler, emptyMap(), - object : CanceledStatus { - override fun isCanceled(): Boolean = !coroutineContext.isActive - }, - ) + ) { !coroutineContext.isActive } val exitCode = tracer.spanBuilder("compile") .setParent(tracingContext) diff --git a/build/jvm-rules/src/jps-builder/WorkRequestWithDigestReader.kt b/build/jvm-rules/src/jps-builder/WorkRequestWithDigestReader.kt new file mode 100644 index 000000000000..e5b1116cc360 --- /dev/null +++ b/build/jvm-rules/src/jps-builder/WorkRequestWithDigestReader.kt @@ -0,0 +1,72 @@ +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package org.jetbrains.bazel.jvm.jps + +import org.jetbrains.bazel.jvm.WorkRequest +import org.jetbrains.bazel.jvm.WorkRequestReader +import org.jetbrains.bazel.jvm.doReadWorkRequestFromStream +import java.io.InputStream + +internal class WorkRequestWithDigests( + arguments: Array, + inputPaths: Array, + requestId: Int, + cancel: Boolean, + verbosity: Int, + sandboxDir: String?, + @JvmField val inputDigests: Array, +) : WorkRequest( + arguments = arguments, + inputPaths = inputPaths, + requestId = requestId, + cancel = cancel, + verbosity = verbosity, + sandboxDir = sandboxDir, +) + +internal open class WorkRequestWithDigestReader( + //private val allocator: BufferAllocator, + private val input: InputStream, +) : WorkRequestReader { + private val inputPathsToReuse = ArrayList() + private val inputDigestToReuse = ArrayList() + private val argListToReuse = ArrayList() + + override fun readWorkRequestFromStream(): WorkRequestWithDigests? { + //val digests = VarBinaryVector("digests", allocator) + //var counter = 0 + //try { + // digests.allocateNew() + + val inputDigestToReuse = inputDigestToReuse + inputDigestToReuse.clear() + val result = doReadWorkRequestFromStream( + input = input, + inputPathsToReuse = inputPathsToReuse, + argListToReuse = argListToReuse, + readDigest = { codedInputStream, tag -> + val digest = codedInputStream.readByteArray() + //inputDigestToReuse.setSafe(counter++, digest) + inputDigestToReuse.add(digest) + }, + requestCreator = { argListToReuse, inputPathsToReuse, requestId, cancel, verbosity, sandboxDir -> + //digests.setValueCount(counter) + //counter = -1 + WorkRequestWithDigests( + arguments = argListToReuse, + inputPaths = inputPathsToReuse, + requestId = requestId, + cancel = cancel, + verbosity = verbosity, + sandboxDir = sandboxDir, + inputDigests = inputDigestToReuse.toTypedArray(), + ) + }, + ) + return result + //} + //finally { + // if (counter != -1) { + // digests.close() + // } + } +} diff --git a/build/jvm-rules/src/kotlin-builder/KotlinBuilder.kt b/build/jvm-rules/src/kotlin-builder/KotlinBuilder.kt index fc9f87e73795..ee392c0770bc 100644 --- a/build/jvm-rules/src/kotlin-builder/KotlinBuilder.kt +++ b/build/jvm-rules/src/kotlin-builder/KotlinBuilder.kt @@ -1,19 +1,20 @@ -// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.bazel.jvm.kotlin import io.opentelemetry.api.trace.Tracer import io.opentelemetry.context.Context import org.jetbrains.bazel.jvm.WorkRequest import org.jetbrains.bazel.jvm.WorkRequestExecutor +import org.jetbrains.bazel.jvm.WorkRequestReaderWithoutDigest import org.jetbrains.bazel.jvm.processRequests import java.io.Writer import java.nio.file.Path -object KotlinBuildWorker : WorkRequestExecutor { +object KotlinBuildWorker : WorkRequestExecutor { @JvmStatic fun main(startupArgs: Array) { org.jetbrains.kotlin.cli.jvm.compiler.CompileEnvironmentUtil - processRequests(startupArgs = startupArgs, executor = this, serviceName = "kotlin-builder") + processRequests(startupArgs = startupArgs, executor = this, reader = WorkRequestReaderWithoutDigest(System.`in`), serviceName = "kotlin-builder") } override suspend fun execute(request: WorkRequest, writer: Writer, baseDir: Path, tracingContext: Context, tracer: Tracer): Int { diff --git a/build/jvm-rules/src/kotlin-builder/KotlinJvmTaskExecutor.kt b/build/jvm-rules/src/kotlin-builder/KotlinJvmTaskExecutor.kt index ad6eded353bd..e55e874ff415 100644 --- a/build/jvm-rules/src/kotlin-builder/KotlinJvmTaskExecutor.kt +++ b/build/jvm-rules/src/kotlin-builder/KotlinJvmTaskExecutor.kt @@ -1,4 +1,4 @@ -// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.bazel.jvm.kotlin import com.google.devtools.build.lib.view.proto.Deps @@ -11,18 +11,24 @@ import org.jetbrains.kotlin.cli.common.ExitCode import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments import org.jetbrains.kotlin.cli.common.config.addKotlinSourceRoot import org.jetbrains.kotlin.cli.common.messages.* +import org.jetbrains.kotlin.cli.common.moduleChunk import org.jetbrains.kotlin.cli.common.modules.ModuleBuilder +import org.jetbrains.kotlin.cli.common.modules.ModuleChunk import org.jetbrains.kotlin.cli.common.setupCommonArguments +import org.jetbrains.kotlin.cli.jvm.compiler.BazelJvmCliPipeline +import org.jetbrains.kotlin.cli.jvm.compiler.BazelJvmConfigurationPipelinePhase +import org.jetbrains.kotlin.cli.jvm.compiler.configTemplate import org.jetbrains.kotlin.cli.jvm.compiler.configurePlugins -import org.jetbrains.kotlin.cli.jvm.compiler.k2jvm import org.jetbrains.kotlin.cli.jvm.compiler.loadPlugins import org.jetbrains.kotlin.cli.jvm.config.JvmClasspathRoot import org.jetbrains.kotlin.cli.jvm.config.JvmModulePathRoot import org.jetbrains.kotlin.cli.jvm.config.addJavaSourceRoot import org.jetbrains.kotlin.cli.jvm.setupJvmSpecificArguments -import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.JVMConfigurationKeys +import org.jetbrains.kotlin.config.Services import org.jetbrains.kotlin.config.messageCollector +import org.jetbrains.kotlin.config.moduleName +import org.jetbrains.kotlin.config.modules import org.jetbrains.kotlin.metadata.deserialization.MetadataVersion import org.jetbrains.kotlin.modules.JavaRootPath import java.io.BufferedInputStream @@ -68,7 +74,7 @@ internal suspend fun compileKotlinForJvm( kotlinArgs.freeArgs = sources.map { it.toString() } val messageCollector = WriterBackedMessageCollector(verbose = context.isTracing) - val config = org.jetbrains.kotlin.cli.jvm.compiler.configTemplate.copy() + val config = configTemplate.copy() config.put(CLIConfigurationKeys.ORIGINAL_MESSAGE_COLLECTOR_KEY, messageCollector) val collector = GroupingMessageCollector(messageCollector, kotlinArgs.allWarningsAsErrors, kotlinArgs.reportAllWarnings).also { config.messageCollector = it @@ -88,7 +94,7 @@ internal suspend fun compileKotlinForJvm( loadPlugins(configuration = config, pluginConfigurations = pluginConfigurations) val moduleName = info.moduleName - config.put(CommonConfigurationKeys.MODULE_NAME, moduleName) + config.moduleName = moduleName val module = ModuleBuilder(moduleName, outFilePath, "java-production") @@ -128,14 +134,21 @@ internal suspend fun compileKotlinForJvm( config.add(CLIConfigurationKeys.CONTENT_ROOTS, JvmClasspathRoot(ioFile)) } - config.addAll(JVMConfigurationKeys.MODULES, listOf(module)) + val modules = listOf(module) + config.modules = modules + config.moduleChunk = ModuleChunk(modules) - k2jvm( - config = config, - rootDisposable = rootDisposable, - module = module, - messageCollector = messageCollector, - ).code + val pipeline = BazelJvmCliPipeline(BazelJvmConfigurationPipelinePhase(config)) + //val groupingMessageCollector = GroupingMessageCollector(messageCollector, false, false) + //val argumentsInput = ArgumentsPipelineArtifact( + // kotlinArgs, + // Services.EMPTY, + // rootDisposable, + // groupingMessageCollector, + // pipeline.defaultPerformanceManager, + //) + + pipeline.execute(kotlinArgs, Services.EMPTY, messageCollector).code } finally { Disposer.dispose(rootDisposable) diff --git a/build/jvm-rules/src/kotlin-builder/TestKotlinBuildWorker.kt b/build/jvm-rules/src/kotlin-builder/TestKotlinBuildWorker.kt index ee192d2762f2..eec665cfd42f 100644 --- a/build/jvm-rules/src/kotlin-builder/TestKotlinBuildWorker.kt +++ b/build/jvm-rules/src/kotlin-builder/TestKotlinBuildWorker.kt @@ -1,3 +1,4 @@ +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.bazel.jvm.kotlin import kotlinx.coroutines.Dispatchers @@ -15,7 +16,7 @@ internal object TestKotlinBuildWorker { val testPaths = getTestWorkerPaths() val baseDir = testPaths.baseDir runBlocking(Dispatchers.Default) { - val testModule = TestModules.PLATFORM_BOOTSTRAP + val testModule = TestModules.XML_DOM val sources = collectSources(sourceDirPath = testModule.sourcePath, paths = testPaths) val testParams = testModule.getParams(baseDir) diff --git a/build/jvm-rules/src/kotlin-builder/compilation/CompileEnvironmentUtil.kt b/build/jvm-rules/src/kotlin-builder/compilation/CompileEnvironmentUtil.kt index b3b439c68663..da4bfebf8788 100644 --- a/build/jvm-rules/src/kotlin-builder/compilation/CompileEnvironmentUtil.kt +++ b/build/jvm-rules/src/kotlin-builder/compilation/CompileEnvironmentUtil.kt @@ -1,10 +1,9 @@ -// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. @file:Suppress("PackageDirectoryMismatch") package org.jetbrains.kotlin.cli.jvm.compiler import org.jetbrains.bazel.jvm.kotlin.createJar -import org.jetbrains.intellij.build.io.ZipIndexWriter import org.jetbrains.kotlin.backend.common.output.OutputFileCollection import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.cli.common.modules.ModuleChunk diff --git a/build/jvm-rules/src/kotlin-builder/compilation/compiler.kt b/build/jvm-rules/src/kotlin-builder/compilation/compiler.kt index b7302aa140a0..4ca895b19c30 100644 --- a/build/jvm-rules/src/kotlin-builder/compilation/compiler.kt +++ b/build/jvm-rules/src/kotlin-builder/compilation/compiler.kt @@ -1,40 +1,44 @@ -// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.kotlin.cli.jvm.compiler -import com.intellij.openapi.Disposable -import org.jetbrains.kotlin.backend.jvm.jvmLoweringPhases -import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys -import org.jetbrains.kotlin.cli.common.ExitCode +import org.jetbrains.kotlin.backend.common.phaser.then import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments import org.jetbrains.kotlin.cli.common.createPhaseConfig import org.jetbrains.kotlin.cli.common.messages.MessageCollector -import org.jetbrains.kotlin.cli.common.modules.ModuleBuilder -import org.jetbrains.kotlin.cli.jvm.compiler.pipeline.compileModulesUsingFrontendIrAndLightTree -import org.jetbrains.kotlin.cli.jvm.compiler.pipeline.createProjectEnvironment +import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.K2JVMCompilerPerformanceManager import org.jetbrains.kotlin.cli.jvm.config.configureJdkClasspathRoots import org.jetbrains.kotlin.cli.jvm.configureAdvancedJvmOptions import org.jetbrains.kotlin.cli.jvm.plugins.PluginCliParser.RegisteredPluginInfo +import org.jetbrains.kotlin.cli.pipeline.AbstractCliPipeline +import org.jetbrains.kotlin.cli.pipeline.AbstractConfigurationPhase +import org.jetbrains.kotlin.cli.pipeline.ArgumentsPipelineArtifact +import org.jetbrains.kotlin.cli.pipeline.CheckCompilationErrors +import org.jetbrains.kotlin.cli.pipeline.ConfigurationPipelineArtifact +import org.jetbrains.kotlin.cli.pipeline.PipelineContext +import org.jetbrains.kotlin.cli.pipeline.jvm.JvmBackendPipelinePhase +import org.jetbrains.kotlin.cli.pipeline.jvm.JvmBinaryPipelineArtifact +import org.jetbrains.kotlin.cli.pipeline.jvm.JvmFir2IrPipelinePhase +import org.jetbrains.kotlin.cli.pipeline.jvm.JvmFrontendPipelinePhase import org.jetbrains.kotlin.cli.plugins.processCompilerPluginOptions import org.jetbrains.kotlin.compiler.plugin.CommandLineProcessor import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar import org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi import org.jetbrains.kotlin.compiler.plugin.PluginProcessingException -import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.JVMConfigurationKeys import org.jetbrains.kotlin.config.messageCollector +import org.jetbrains.kotlin.config.phaseConfig +import org.jetbrains.kotlin.config.phaser.CompilerPhase +import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion +import org.jetbrains.kotlin.metadata.deserialization.MetadataVersion import org.jetbrains.kotlin.util.ServiceLoaderLite import java.io.File import java.net.URLClassLoader private fun createCompilerConfigurationTemplate(): CompilerConfiguration { val config = CompilerConfiguration() - config.put(CLIConfigurationKeys.FLEXIBLE_PHASE_CONFIG, createPhaseConfig( - compoundPhase = jvmLoweringPhases, - arguments = CommonCompilerArguments.DummyImpl(), - messageCollector = MessageCollector.NONE, - )) + config.phaseConfig = createPhaseConfig(arguments = CommonCompilerArguments.DummyImpl()) config.put(JVMConfigurationKeys.JDK_HOME, File(System.getProperty("java.home") ?: error("No java.home system property"))) config.put(JVMConfigurationKeys.DISABLE_STANDARD_SCRIPT_DEFINITION, true) @@ -50,56 +54,84 @@ private fun createCompilerConfigurationTemplate(): CompilerConfiguration { internal val configTemplate = createCompilerConfigurationTemplate() -internal fun k2jvm( - config: CompilerConfiguration, - rootDisposable: Disposable, - module: ModuleBuilder, - messageCollector: MessageCollector, -): ExitCode { - val moduleBuilders = listOf(module) +internal class BazelJvmCliPipeline( + private val configPhase: BazelJvmConfigurationPipelinePhase, +) : AbstractCliPipeline() { + override val defaultPerformanceManager: K2JVMCompilerPerformanceManager = K2JVMCompilerPerformanceManager() - val modularJdkRoot = module.modularJdkRoot - if (modularJdkRoot != null) { - // We use the SDK of the first module in the chunk, which is not always correct because some other module in the chunk - // might depend on a different SDK - config.put(JVMConfigurationKeys.JDK_HOME, File(modularJdkRoot)) + override fun createCompoundPhase(arguments: K2JVMCompilerArguments): CompilerPhase, *> { + return createRegularPipeline() } - require(config.getBoolean(CommonConfigurationKeys.USE_LIGHT_TREE)) - require(config.getBoolean(CommonConfigurationKeys.USE_FIR)) - if (messageCollector.hasErrors()) { - return ExitCode.COMPILATION_ERROR + private fun createRegularPipeline(): CompilerPhase, JvmBinaryPipelineArtifact> { + // instead of JvmConfigurationPipelinePhase, we use our own BazelJvmConfigurationPipelinePhase + return configPhase then + JvmFrontendPipelinePhase then + JvmFir2IrPipelinePhase then + JvmBackendPipelinePhase } - - val projectEnvironment = createProjectEnvironment( - configuration = config, - parentDisposable = rootDisposable, - configFiles = EnvironmentConfigFiles.JVM_CONFIG_FILES, - messageCollector = messageCollector, - ) - if (messageCollector.hasErrors()) { - return ExitCode.COMPILATION_ERROR - } - - if (!FirKotlinToJvmBytecodeCompiler.checkNotSupportedPlugins(config, messageCollector)) { - return ExitCode.COMPILATION_ERROR - } - - if (compileModulesUsingFrontendIrAndLightTree( - projectEnvironment = projectEnvironment, - compilerConfiguration = config, - messageCollector = messageCollector, - buildFile = null, - chunk = moduleBuilders, - targetDescription = module.getModuleName() + "-" + module.getModuleType(), - checkSourceFiles = false, - isPrintingVersion = false, - )) { - return ExitCode.OK - } - return ExitCode.COMPILATION_ERROR } +internal class BazelJvmConfigurationPipelinePhase( + private val config: CompilerConfiguration, +) : AbstractConfigurationPhase( + name = "JvmConfigurationPipelinePhase", + postActions = setOf(CheckCompilationErrors.CheckMessageCollector), + configurationUpdaters = emptyList() +) { + override fun executePhase(input: ArgumentsPipelineArtifact): ConfigurationPipelineArtifact? { + return ConfigurationPipelineArtifact(config, input.diagnosticCollector, input.rootDisposable) + } + + override fun createMetadataVersion(versionArray: IntArray): BinaryVersion = MetadataVersion(*versionArray) +} + +//internal fun k2jvm( +// config: CompilerConfiguration, +// rootDisposable: Disposable, +// module: ModuleBuilder, +// messageCollector: MessageCollector, +//): ExitCode { +// val moduleBuilders = listOf(module) +// +// val modularJdkRoot = module.modularJdkRoot +// if (modularJdkRoot != null) { +// // We use the SDK of the first module in the chunk, which is not always correct because some other module in the chunk +// // might depend on a different SDK +// config.put(JVMConfigurationKeys.JDK_HOME, File(modularJdkRoot)) +// } +// +// require(config.getBoolean(CommonConfigurationKeys.USE_LIGHT_TREE)) +// require(config.getBoolean(CommonConfigurationKeys.USE_FIR)) +// if (messageCollector.hasErrors()) { +// return ExitCode.COMPILATION_ERROR +// } +// +// val projectEnvironment = createCoreEnvironment( +// configuration = config, +// rootDisposable = rootDisposable, +// configFiles = EnvironmentConfigFiles.JVM_CONFIG_FILES, +// messageCollector = messageCollector, +// ) +// if (messageCollector.hasErrors()) { +// return ExitCode.COMPILATION_ERROR +// } +// +// if (compileModulesUsingFrontendIrAndLightTree( +// projectEnvironment = projectEnvironment, +// compilerConfiguration = config, +// messageCollector = messageCollector, +// buildFile = null, +// chunk = moduleBuilders, +// targetDescription = module.getModuleName() + "-" + module.getModuleType(), +// checkSourceFiles = false, +// isPrintingVersion = false, +// )) { +// return ExitCode.OK +// } +// return ExitCode.COMPILATION_ERROR +//} + @OptIn(ExperimentalCompilerApi::class) internal fun loadPlugins( configuration: CompilerConfiguration, diff --git a/build/jvm-rules/src/kotlin-builder/compilation/incremental.kt b/build/jvm-rules/src/kotlin-builder/compilation/incremental.kt index 151d7a3a17fe..44c0db794faf 100644 --- a/build/jvm-rules/src/kotlin-builder/compilation/incremental.kt +++ b/build/jvm-rules/src/kotlin-builder/compilation/incremental.kt @@ -1,4 +1,4 @@ -// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.kotlin.cli.jvm.compiler import org.jetbrains.bazel.jvm.kotlin.TraceHelper @@ -46,6 +46,10 @@ private class WorkerKotlinLogger(private val out: Writer, override val isDebugEn } } + override fun warn(msg: String, throwable: Throwable?) { + out.append("WARN: ").appendLine(msg + " " + throwable?.stackTraceToString()) + } + override fun warn(msg: String) { out.append("WARN: ").appendLine(msg) } diff --git a/build/jvm-rules/src/kotlin-plugins/abi/JvmAbiOutputExtension.kt b/build/jvm-rules/src/kotlin-plugins/abi/JvmAbiOutputExtension.kt index 89881074a0a1..5c4d658156c4 100644 --- a/build/jvm-rules/src/kotlin-plugins/abi/JvmAbiOutputExtension.kt +++ b/build/jvm-rules/src/kotlin-plugins/abi/JvmAbiOutputExtension.kt @@ -1,4 +1,4 @@ -// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.kotlin.jvm.abi @@ -199,8 +199,8 @@ internal class JvmAbiOutputExtension( av.visitEnd() } - innerClassesToKeep.addInnerClasses(innerClassInfos, internalName) - innerClassesToKeep.addOuterClasses(innerClassInfos) + addInnerClasses(innerClassesToKeep, innerClassInfos, internalName) + addOuterClasses(innerClassesToKeep, innerClassInfos) for (name in innerClassesToKeep.sorted()) { innerClassInfos[name]?.let { cv.visitInnerClass(it.name, it.outerName, it.innerName, it.access) } } @@ -219,12 +219,12 @@ internal class JvmAbiOutputExtension( // Outer class infos for a class and all classes transitively nested in it (that are public ABI) // should be kept in its own class file even if the classes are otherwise unused. - private fun MutableSet.addInnerClasses(innerClassInfos: Map, internalName: String) { + private fun addInnerClasses(names: MutableSet, innerClassInfos: Map, internalName: String) { val innerClassesByOuterName = innerClassInfos.values.groupBy { it.outerName } val stack = mutableListOf(internalName) while (stack.isNotEmpty()) { val next = stack.removeLast() - add(next) + names.add(next) // Classes form a tree by nesting, so none of the children have been visited yet. innerClassesByOuterName[next]?.mapNotNullTo(stack) { info -> info.name.takeUnless { abiClassInfos[it] == AbiClassInfo.Deleted } @@ -233,11 +233,11 @@ internal class JvmAbiOutputExtension( } // For every class A.B, if its outer class info is kept then so should be A's. - private fun MutableSet.addOuterClasses(innerClassInfos: Map) { - for (name in toList()) { + private fun addOuterClasses(names: MutableSet, innerClassInfos: Map) { + for (name in names.toTypedArray()) { var info = innerClassInfos[name] while (info != null) { - info = info.outerName?.takeIf(::add)?.let(innerClassInfos::get) + info = info.outerName?.takeIf { names.add(it) }?.let(innerClassInfos::get) } } } diff --git a/build/jvm-rules/src/kotlin-plugins/jdeps/JdepsGenExtension.kt b/build/jvm-rules/src/kotlin-plugins/jdeps/JdepsGenExtension.kt index 2691d41481f2..059fcb2bcec8 100644 --- a/build/jvm-rules/src/kotlin-plugins/jdeps/JdepsGenExtension.kt +++ b/build/jvm-rules/src/kotlin-plugins/jdeps/JdepsGenExtension.kt @@ -1,10 +1,11 @@ -// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package io.bazel.kotlin.plugin.jdeps import com.google.devtools.build.lib.view.proto.Deps import org.jetbrains.bazel.jvm.kotlin.JarOwner import org.jetbrains.bazel.jvm.kotlin.JarOwner.Companion.INJECTING_RULE_KIND import org.jetbrains.bazel.jvm.kotlin.JarOwner.Companion.TARGET_LABEL +import org.jetbrains.intellij.build.io.writeFileUsingTempFile import org.jetbrains.kotlin.codegen.ClassFileFactory import org.jetbrains.kotlin.codegen.extensions.ClassFileFactoryFinalizerExtension import org.jetbrains.kotlin.config.CompilerConfiguration @@ -105,8 +106,11 @@ private fun doWriteJdeps( deps.sortBy { it.path } rootBuilder.addAllDependency(deps) // build and write out deps.proto - val jdepsOutput = configuration.getNotNull(JdepsGenConfigurationKeys.OUTPUT_JDEPS) - Files.write(Path.of(jdepsOutput), rootBuilder.build().toByteArray()) + val jdepsOutput = Path.of(configuration.getNotNull(JdepsGenConfigurationKeys.OUTPUT_JDEPS)) + val data = rootBuilder.build().toByteArray() + writeFileUsingTempFile(jdepsOutput) { + Files.write(it, data) + } } private fun doStrictDeps( diff --git a/build/jvm-rules/src/misc/JvmWorker.kt b/build/jvm-rules/src/misc/JvmWorker.kt index bcf0c0d2c3b9..919e893da13f 100644 --- a/build/jvm-rules/src/misc/JvmWorker.kt +++ b/build/jvm-rules/src/misc/JvmWorker.kt @@ -1,4 +1,4 @@ -// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.bazel.jvm import io.opentelemetry.api.trace.Tracer @@ -11,10 +11,10 @@ import java.io.Writer import java.nio.channels.FileChannel import java.nio.file.Path -object JvmWorker : WorkRequestExecutor { +object JvmWorker : WorkRequestExecutor { @JvmStatic fun main(startupArgs: Array) { - processRequests(startupArgs = startupArgs, executor = this, serviceName = "jvm-worker") + processRequests(startupArgs = startupArgs, executor = this, reader = WorkRequestReaderWithoutDigest(System.`in`), serviceName = "jvm-worker") } override suspend fun execute(request: WorkRequest, writer: Writer, baseDir: Path, tracingContext: Context, tracer: Tracer): Int { diff --git a/build/jvm-rules/src/worker-framework/BUILD.bazel b/build/jvm-rules/src/worker-framework/BUILD.bazel index a3481cc1d9f4..45500c651c14 100644 --- a/build/jvm-rules/src/worker-framework/BUILD.bazel +++ b/build/jvm-rules/src/worker-framework/BUILD.bazel @@ -17,6 +17,7 @@ kt_jvm_library( "//:opentelemetry-exporter-logging-otlp", "//:kotlinx-coroutines-core", "//:protobuf-java", + "@lib//:netty-buffer", "@lib//:jetbrains-annotations", ], runtime_deps = [ diff --git a/build/jvm-rules/src/worker-framework/WorkRequestHandler.kt b/build/jvm-rules/src/worker-framework/WorkRequestHandler.kt index 083089c45e8b..4010f2e747c5 100644 --- a/build/jvm-rules/src/worker-framework/WorkRequestHandler.kt +++ b/build/jvm-rules/src/worker-framework/WorkRequestHandler.kt @@ -1,4 +1,4 @@ -// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. @file:Suppress("ReplaceGetOrSet") package org.jetbrains.bazel.jvm @@ -32,8 +32,8 @@ import kotlin.coroutines.cancellation.CancellationException import kotlin.coroutines.coroutineContext import kotlin.system.exitProcess -fun interface WorkRequestExecutor { - suspend fun execute(request: WorkRequest, writer: Writer, baseDir: Path, tracingContext: Context, tracer: Tracer): Int +fun interface WorkRequestExecutor { + suspend fun execute(request: T, writer: Writer, baseDir: Path, tracingContext: Context, tracer: Tracer): Int } fun configureOpenTelemetry(out: OutputStream, serviceName: String): OpenTelemetrySdk { @@ -51,10 +51,9 @@ fun configureOpenTelemetry(out: OutputStream, serviceName: String): OpenTelemetr val tracerProvider = SdkTracerProvider.builder() .setResource(resource) .setSampler(Sampler.alwaysOn()) - .addSpanProcessor(batchSpanProcessor) // For batch exporting (preferred in production) + .addSpanProcessor(batchSpanProcessor) .build() - // Build and set the OpenTelemetry SDK val openTelemetrySdk = OpenTelemetrySdk.builder() .setTracerProvider(tracerProvider) .build() @@ -63,10 +62,11 @@ fun configureOpenTelemetry(out: OutputStream, serviceName: String): OpenTelemetr private val noopTracer = OpenTelemetry.noop().getTracer("noop") -fun processRequests( +fun processRequests( startupArgs: Array, - executor: WorkRequestExecutor, + executor: WorkRequestExecutor, serviceName: String?, + reader: WorkRequestReader, setup: (Tracer, CoroutineScope) -> Unit = { _, _ -> }, ) { if (!startupArgs.contains("--persistent_worker")) { @@ -84,8 +84,8 @@ fun processRequests( runBlocking(Dispatchers.Default) { tracer.spanBuilder("process requests").use { span -> setup(tracer, this@runBlocking) - WorkRequestHandler(requestExecutor = executor, input = System.`in`, out = System.out, tracer = tracer) - .processRequests(Context.current().with(span)) + WorkRequestHandler(requestExecutor = executor, out = System.out, tracer = tracer) + .processRequests(reader, Context.current().with(span)) } exitProcess(0) @@ -97,8 +97,8 @@ fun processRequests( } } -private class RequestState(@JvmField val request: WorkRequest) { - @JvmField val state = AtomicReference(NOT_STARTED) +private class RequestState(@JvmField val request: T) { + @JvmField val state = AtomicReference(NOT_STARTED) } @VisibleForTesting @@ -110,13 +110,12 @@ internal enum class WorkRequestState { * A helper class that handles [WorkRequests](https://bazel.build/docs/persistent-workers), including * [multiplex workers](https://bazel.build/docs/multiplex-worker). */ -internal class WorkRequestHandler internal constructor( +internal class WorkRequestHandler internal constructor( /** * The function to be called after each [WorkRequest] is read. */ - private val requestExecutor: WorkRequestExecutor, + private val requestExecutor: WorkRequestExecutor, - private val input: InputStream, private val out: OutputStream, /** @@ -130,11 +129,11 @@ internal class WorkRequestHandler internal constructor( /** * Requests that are currently being processed. */ - private val activeRequests = ConcurrentHashMap() + private val activeRequests = ConcurrentHashMap>() @OptIn(DelicateCoroutinesApi::class) - internal suspend fun processRequests(tracingContext: Context) { - val requestChannel = Channel(Channel.UNLIMITED) + internal suspend fun processRequests(reader: WorkRequestReader, tracingContext: Context) { + val requestChannel = Channel>(Channel.UNLIMITED) try { coroutineScope { tracer.spanBuilder("process requests").setParent(tracingContext).use { span -> @@ -142,7 +141,7 @@ internal class WorkRequestHandler internal constructor( } tracer.spanBuilder("read requests").setParent(tracingContext).use { span -> - readRequests(requestChannel, span) + readRequests(requestChannel, reader, span) } } } @@ -167,14 +166,11 @@ internal class WorkRequestHandler internal constructor( } } - private suspend fun readRequests(requestChannel: Channel, span: Span) { - val inputPathsToReuse = ArrayList() - val inputDigestsToReuse = ArrayList() - val argListToReuse = ArrayList() + private suspend fun readRequests(requestChannel: Channel>, reader: WorkRequestReader, span: Span) { while (coroutineContext.isActive) { val request = try { runInterruptible(Dispatchers.IO) { - readWorkRequestFromStream(input, inputPathsToReuse, inputDigestsToReuse, argListToReuse) + reader.readWorkRequestFromStream() } } catch (e: InterruptedIOException) { @@ -227,7 +223,7 @@ internal class WorkRequestHandler internal constructor( } } - private fun CoroutineScope.startTaskProcessing(requestChannel: Channel, tracingContext: Context) { + private fun CoroutineScope.startTaskProcessing(requestChannel: Channel>, tracingContext: Context) { repeat(Runtime.getRuntime().availableProcessors().coerceAtLeast(2)) { launch { for (item in requestChannel) { @@ -241,7 +237,7 @@ internal class WorkRequestHandler internal constructor( AttributeKey.stringArrayKey("arguments"), request.arguments.toList(), //AttributeKey.stringArrayKey("inputs"), request.inputs.map { it.path }, AttributeKey.longKey("id"), request.requestId.toLong(), - AttributeKey.stringKey("sandboxDir"), request.sandboxDir?.toString() ?: "", + AttributeKey.stringKey("sandboxDir"), request.sandboxDir ?: "", )) .setParent(tracingContext) .startSpan() @@ -317,7 +313,7 @@ internal class WorkRequestHandler internal constructor( } } - private suspend fun cancelRequestOnShutdown(item: RequestState, span: Span) { + private suspend fun cancelRequestOnShutdown(item: RequestState, span: Span) { val stateRef = item.state val requestId = item.request.requestId if (stateRef.compareAndSet(NOT_STARTED, FINISHED) || stateRef.compareAndSet(STARTED, FINISHED)) { @@ -336,7 +332,7 @@ internal class WorkRequestHandler internal constructor( } internal suspend fun handleRequest( - request: WorkRequest, + request: T, requestState: AtomicReference, tracingContext: Context?, parentSpan: Span?, diff --git a/build/jvm-rules/src/worker-framework/WorkRequestHandlerTest.kt b/build/jvm-rules/src/worker-framework/WorkRequestHandlerTest.kt index 232577d805a2..b62d614dcee6 100644 --- a/build/jvm-rules/src/worker-framework/WorkRequestHandlerTest.kt +++ b/build/jvm-rules/src/worker-framework/WorkRequestHandlerTest.kt @@ -40,9 +40,9 @@ class WorkRequestHandlerTest { @Timeout(value = 10, unit = TimeUnit.SECONDS) fun normalWorkRequest() { val out = ByteArrayOutputStream() - val handler = WorkRequestHandler( + val handler = WorkRequestHandler( requestExecutor = { args, err, _, _, _ -> 1 }, - input = ByteArrayInputStream(ByteArray(0)), + //input = ByteArrayInputStream(ByteArray(0)), out = out, tracer = OpenTelemetry.noop().getTracer("noop"), ) @@ -50,7 +50,6 @@ class WorkRequestHandlerTest { val request = WorkRequest( arguments = arrayOf("--sources", "A.java"), inputPaths = emptyArray(), - inputDigests = emptyArray(), requestId = 0, cancel = false, verbosity = 0, @@ -70,9 +69,9 @@ class WorkRequestHandlerTest { @Timeout(value = 10, unit = TimeUnit.SECONDS) fun multiplexWorkRequest() { val out = ByteArrayOutputStream() - val handler = WorkRequestHandler( + val handler = WorkRequestHandler( requestExecutor = { args, err, _, _, _ -> 0 }, - input = ByteArray(0).inputStream(), + //input = ByteArray(0).inputStream(), out, tracer = OpenTelemetry.noop().getTracer("noop"), ) @@ -96,7 +95,7 @@ class WorkRequestHandlerTest { // work request threads release this when they have started val started = Semaphore(0) val workerThreads = AtomicInteger() - val handler = WorkRequestHandler( + val handler = WorkRequestHandler( requestExecutor = { args, err, _, _, _ -> // each call to this, runs in its own thread workerThreads.incrementAndGet() @@ -112,12 +111,11 @@ class WorkRequestHandlerTest { } 0 }, - input = PipedInputStream(src), out = OutputStream.nullOutputStream(), tracer = OpenTelemetry.noop().getTracer("noop"), ) - useHandler(handler = handler, waitForProcessing = true, errorFilter = { it.message != "Intentional death!" }) { + useHandler(handler = handler, input = PipedInputStream(src), waitForProcessing = true, errorFilter = { it.message != "Intentional death!" }) { val args = listOf("--sources", "A.java") WorkerProtocol.WorkRequest.newBuilder().addAllArguments(args).setRequestId(42).build().writeDelimitedTo(src) WorkerProtocol.WorkRequest.newBuilder().addAllArguments(args).setRequestId(43).build().writeDelimitedTo(src) @@ -131,12 +129,12 @@ class WorkRequestHandlerTest { @Timeout(value = 10, unit = TimeUnit.SECONDS) fun testOutput() { val out = ByteArrayOutputStream() - val handler = WorkRequestHandler( + val handler = WorkRequestHandler( requestExecutor = { args, err, _, _, _ -> err.appendLine("Failed!") 1 }, - input = ByteArray(0).inputStream(), + //input = ByteArray(0).inputStream(), out, tracer = OpenTelemetry.noop().getTracer("noop"), ) @@ -157,11 +155,11 @@ class WorkRequestHandlerTest { @Timeout(value = 10, unit = TimeUnit.SECONDS) fun testException() { val out = ByteArrayOutputStream() - val handler = WorkRequestHandler( + val handler = WorkRequestHandler( requestExecutor = { args, err, _, _, _ -> throw RuntimeException("Exploded!") }, - input = ByteArray(0).inputStream(), + //input = ByteArray(0).inputStream(), out, tracer = OpenTelemetry.noop().getTracer("noop"), ) @@ -186,13 +184,13 @@ class WorkRequestHandlerTest { val src = PipedOutputStream() val dest = PipedInputStream() - val handler = WorkRequestHandler( + val input = PipedInputStream(src) + val handler = WorkRequestHandler( requestExecutor = { args, err, _, _, _ -> handlerCalled = true err.appendLine("Such work! Much progress! Wow!") 1 }, - input = PipedInputStream(src), out = PipedOutputStream(dest), tracer = OpenTelemetry.noop().getTracer("noop"), cancelHandler = { @@ -200,7 +198,7 @@ class WorkRequestHandlerTest { }, ) - useHandler(handler) { + useHandler(handler, input) { WorkerProtocol.WorkRequest.newBuilder().setRequestId(42).build().writeDelimitedTo(src) WorkerProtocol.WorkRequest.newBuilder().setRequestId(42).setCancel(true).build().writeDelimitedTo(src) @@ -235,7 +233,7 @@ class WorkRequestHandlerTest { val failures = ConcurrentLinkedQueue() // we force the regular handling to not finish until after we have read the cancel response, to avoid flakiness - val handler = WorkRequestHandler( + val handler = WorkRequestHandler( requestExecutor = { args, err, _, _, _ -> // this handler waits until the main thread has sent a cancel request handlerCalled.release() @@ -248,14 +246,13 @@ class WorkRequestHandlerTest { } 0 }, - input = PipedInputStream(src), out = PipedOutputStream(dest), tracer = OpenTelemetry.noop().getTracer("noop"), cancelHandler = { i -> cancelCalled.incrementAndGet() } ) // this thread just makes sure the WorkRequestHandler does work asynchronously - useHandler(handler, failures, waitForProcessing = true) { + useHandler(handler, PipedInputStream(src), failures, waitForProcessing = true) { WorkerProtocol.WorkRequest.newBuilder().setRequestId(42).build().writeDelimitedTo(src) // make sure the handler is called before sending the cancel request, or we might process the cancellation entirely before that handlerCalled.acquire() @@ -285,7 +282,7 @@ class WorkRequestHandlerTest { // we force the regular handling to not finish until after we have read the cancel response, to avoid flakiness val inputStream = PipedInputStream(src) - val handler = WorkRequestHandler( + val handler = WorkRequestHandler( requestExecutor = { args, err, _, _, _ -> try { waitForCancel.acquire() @@ -296,7 +293,6 @@ class WorkRequestHandlerTest { } 0 }, - input = inputStream, out = PipedOutputStream(dest), tracer = OpenTelemetry.noop().getTracer("noop"), cancelHandler = { @@ -304,7 +300,7 @@ class WorkRequestHandlerTest { }, ) - useHandler(handler, failures, waitForProcessing = true) { + useHandler(handler, inputStream, failures, waitForProcessing = true) { WorkerProtocol.WorkRequest.newBuilder().setRequestId(42).build().writeDelimitedTo(src) WorkerProtocol.WorkRequest.newBuilder().setRequestId(42).setCancel(true).build().writeDelimitedTo(src) WorkerProtocol.WorkRequest.newBuilder().setRequestId(42).setCancel(true).build().writeDelimitedTo(src) @@ -332,19 +328,18 @@ class WorkRequestHandlerTest { val dest = PipedInputStream() // we force the cancel request to not happen until after we have read the normal response, to avoid flakiness - val handler = WorkRequestHandler( + val handler = WorkRequestHandler( requestExecutor = { args, err, _, _, _ -> handlerCalled.release() err.appendLine("Such work! Much progress! Wow!") 2 }, - input = PipedInputStream(src), out = PipedOutputStream(dest), tracer = OpenTelemetry.noop().getTracer("noop"), ) var r: WorkResponse? = null - useHandler(handler, waitForProcessing = true) { + useHandler(handler, PipedInputStream(src), waitForProcessing = true) { WorkerProtocol.WorkRequest.newBuilder().setRequestId(42).build().writeDelimitedTo(src) r = WorkResponse.parseDelimitedFrom(dest) WorkerProtocol.WorkRequest.newBuilder().setRequestId(42).setCancel(true).build().writeDelimitedTo(src) @@ -367,9 +362,9 @@ class WorkRequestHandlerTest { @Timeout(value = 10, unit = TimeUnit.SECONDS) fun workRequestHandlerWithWorkRequestCallback() { val out = ByteArrayOutputStream() - val handler = WorkRequestHandler( + val handler = WorkRequestHandler( requestExecutor = { request, err, _, _, _ -> request.arguments.size }, - ByteArrayInputStream(ByteArray(0)), + //ByteArrayInputStream(ByteArray(0)), out, tracer = OpenTelemetry.noop().getTracer("noop"), ) @@ -392,7 +387,7 @@ private fun newWorkRequest(args: List, requestId: Int = 42): WorkRequest arguments = args.toTypedArray(), requestId = requestId, inputPaths = emptyArray(), - inputDigests = emptyArray(), + //inputDigests = emptyArray(), cancel = false, verbosity = 0, sandboxDir = null @@ -401,7 +396,8 @@ private fun newWorkRequest(args: List, requestId: Int = 42): WorkRequest @OptIn(DelicateCoroutinesApi::class, ExperimentalCoroutinesApi::class) private inline fun useHandler( - handler: WorkRequestHandler, + handler: WorkRequestHandler, + input: InputStream, failures: ConcurrentLinkedQueue = ConcurrentLinkedQueue(), waitForProcessing: Boolean = false, crossinline errorFilter: (Throwable) -> Boolean = { true }, @@ -409,7 +405,7 @@ private inline fun useHandler( ) { val processor = GlobalScope.async(Dispatchers.Default) { try { - handler.processRequests(Context.current()) + handler.processRequests(WorkRequestReaderWithoutDigest(input), Context.current()) } catch (_: CancellationException) { } diff --git a/build/jvm-rules/src/worker-framework/protocol.kt b/build/jvm-rules/src/worker-framework/protocol.kt index dcf7071b8fba..5346ebb9a969 100644 --- a/build/jvm-rules/src/worker-framework/protocol.kt +++ b/build/jvm-rules/src/worker-framework/protocol.kt @@ -1,27 +1,54 @@ +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.bazel.jvm import com.google.protobuf.CodedInputStream -import jdk.internal.util.xml.impl.Input -import java.io.FilterInputStream +import io.netty.buffer.PooledByteBufAllocator import java.io.InputStream -import kotlin.math.min -class WorkRequest( +open class WorkRequest( @JvmField val arguments: Array, @JvmField val inputPaths: Array, - @JvmField val inputDigests: Array, @JvmField val requestId: Int, @JvmField val cancel: Boolean, @JvmField val verbosity: Int, @JvmField val sandboxDir: String? ) -internal fun readWorkRequestFromStream( +interface WorkRequestReader { + fun readWorkRequestFromStream(): T? +} + +class WorkRequestReaderWithoutDigest(private val input: InputStream) : WorkRequestReader { + private val inputPathsToReuse = ArrayList() + private val argListToReuse = ArrayList() + + override fun readWorkRequestFromStream(): WorkRequest? { + return doReadWorkRequestFromStream( + input = input, + inputPathsToReuse = inputPathsToReuse, + argListToReuse = argListToReuse, + readDigest = { codedInputStream, tag -> codedInputStream.skipField(tag) }, + requestCreator = { argListToReuse, inputPathsToReuse, requestId, cancel, verbosity, sandboxDir -> + WorkRequest( + arguments = argListToReuse, + inputPaths = inputPathsToReuse, + requestId = requestId, + cancel = cancel, + verbosity = verbosity, + sandboxDir = sandboxDir + ) + }, + ) + } +} + +inline fun doReadWorkRequestFromStream( input: InputStream, inputPathsToReuse: MutableList, - inputDigestsToReuse: MutableList, - argListToReuse: MutableList -): WorkRequest? { + argListToReuse: MutableList, + readDigest: (CodedInputStream, Int) -> Unit, + requestCreator: RequestCreator, +): T? { // read the length-prefixed WorkRequest val firstByte = input.read() if (firstByte == -1) { @@ -29,16 +56,69 @@ internal fun readWorkRequestFromStream( } val size = CodedInputStream.readRawVarint32(firstByte, input) + val buffer = PooledByteBufAllocator.DEFAULT.heapBuffer(size, size) + try { + var toRead = size + while (toRead > 0) { + val n = buffer.writeBytes(input, toRead) + if (n < 0) { + throw IllegalStateException("Unexpected EOF") + } + toRead -= n + } + assert(buffer.readableBytes() == size) - var requestId = 0 - var cancel = false - var verbosity = 0 - var sandboxDir: String? = null + var requestId = 0 + var cancel = false + var verbosity = 0 + var sandboxDir: String? = null - val codedInputStream = CodedInputStream.newInstance(LimitedInputStream(input, size)) - argListToReuse.clear() - inputPathsToReuse.clear() - inputDigestsToReuse.clear() + val codedInputStream = CodedInputStream.newInstance(buffer.array(), buffer.arrayOffset() + buffer.readerIndex(), buffer.readableBytes()) + argListToReuse.clear() + inputPathsToReuse.clear() + while (true) { + val tag = codedInputStream.readTag() + if (tag == 0) { + break + } + + when (tag.shr(3)) { + 1 -> argListToReuse.add(codedInputStream.readString()) + 2 -> { + val messageSize = codedInputStream.readRawVarint32() + val limit = codedInputStream.pushLimit(messageSize) + readInput(codedInputStream, inputPathsToReuse, readDigest) + codedInputStream.popLimit(limit) + } + + 3 -> requestId = codedInputStream.readInt32() + 4 -> cancel = codedInputStream.readBool() + 5 -> verbosity = codedInputStream.readInt32() + 6 -> sandboxDir = codedInputStream.readString() + else -> codedInputStream.skipField(tag) + } + } + + return requestCreator( + (argListToReuse as java.util.ArrayList).toArray(emptyStringArray), + (inputPathsToReuse as java.util.ArrayList).toArray(emptyStringArray), + requestId, + cancel, + verbosity, + sandboxDir, + ) + } + finally { + buffer.release() + } +} + +@PublishedApi +internal inline fun readInput( + codedInputStream: CodedInputStream, + inputPathsToReuse: MutableList, + readDigest: (CodedInputStream, Int) -> Unit +) { while (true) { val tag = codedInputStream.readTag() if (tag == 0) { @@ -46,81 +126,21 @@ internal fun readWorkRequestFromStream( } when (tag.shr(3)) { - 1 -> argListToReuse.add(codedInputStream.readString()) - 2 -> { - var path = "" - var digest: ByteArray? = null - val messageSize = codedInputStream.readRawVarint32() - val limit = codedInputStream.pushLimit(messageSize) - while (true) { - val tag = codedInputStream.readTag() - if (tag == 0) { - break - } - - when (tag.shr(3)) { - 1 -> path = codedInputStream.readString() - 2 -> digest = codedInputStream.readByteArray() - else -> codedInputStream.skipField(tag) - } - } - codedInputStream.popLimit(limit) - inputPathsToReuse.add(path) - inputDigestsToReuse.add(digest!!) - } - 3 -> requestId = codedInputStream.readInt32() - 4 -> cancel = codedInputStream.readBool() - 5 -> verbosity = codedInputStream.readInt32() - 6 -> sandboxDir = codedInputStream.readString() + 1 -> inputPathsToReuse.add(codedInputStream.readString()) + 2 -> readDigest(codedInputStream, tag) else -> codedInputStream.skipField(tag) } } - - return WorkRequest( - arguments = argListToReuse.toTypedArray(), - inputPaths = inputPathsToReuse.toTypedArray(), - inputDigests = inputDigestsToReuse.toTypedArray(), - requestId = requestId, - cancel = cancel, - verbosity = verbosity, - sandboxDir = sandboxDir - ) } -private class LimitedInputStream(input: InputStream, private var limit: Int) : FilterInputStream(input) { - override fun available(): Int = min(super.available(), limit) +@PublishedApi +internal val emptyStringArray = emptyArray() - override fun read(): Int { - if (limit <= 0) { - return -1 - } - - val result = super.read() - if (result >= 0) { - --limit - } - return result - } - - override fun read(b: ByteArray?, off: Int, len: Int): Int { - var len = len - if (limit <= 0) { - return -1 - } - - len = min(len, limit) - val result = super.read(b, off, len) - if (result >= 0) { - limit -= result - } - return result - } - - override fun skip(n: Long): Long { - val result = super.skip(min(n, limit.toLong())).toInt() - if (result >= 0) { - limit -= result - } - return result.toLong() - } -} \ No newline at end of file +typealias RequestCreator = ( + argListToReuse: Array, + inputPathsToReuse: Array, + requestId: Int, + cancel: Boolean, + verbosity: Int, + sandboxDir: String? +) -> T diff --git a/build/jvm-rules/src/worker-framework/testHelper.kt b/build/jvm-rules/src/worker-framework/testHelper.kt index 0d4247b5d393..3b363da6ffc8 100644 --- a/build/jvm-rules/src/worker-framework/testHelper.kt +++ b/build/jvm-rules/src/worker-framework/testHelper.kt @@ -14,6 +14,7 @@ import kotlin.io.path.walk import kotlin.system.exitProcess enum class TestModules(@JvmField val sourcePath: String, private val paramsPath: String) { + XML_DOM("platform/util/xmlDom/src", "platform/util/xmlDom/xmlDom.jar-0.params"), PLATFORM_IMPL("platform/platform-impl/src", "platform/platform-impl/ide-impl.jar-0.params"), LANG_IMPL("platform/lang-impl/src", "platform/lang-impl/lang-impl.jar-0.params"), PLATFORM_BOOTSTRAP("platform/platform-impl/bootstrap/src", "platform/platform-impl/bootstrap/ide-bootstrap-kt.jar-0.params"); @@ -32,7 +33,7 @@ data class TestWorkerPaths( fun getTestWorkerPaths(): TestWorkerPaths { val userHomeDir = Path.of(System.getProperty("user.home")) - val ideaProjectDirName = if (Runtime.getRuntime().availableProcessors() >= 20) "idea-push" else "idea" + val ideaProjectDirName = "idea" val projectDir = userHomeDir.resolve("projects/$ideaProjectDirName") val communityDir = projectDir.resolve("community") val baseDir = getBazelExecRoot(projectDir) diff --git a/lib/BUILD.bazel b/lib/BUILD.bazel index 866517609bf2..5025d67fe1f1 100644 --- a/lib/BUILD.bazel +++ b/lib/BUILD.bazel @@ -3323,8 +3323,8 @@ kt_jvm_import( kt_jvm_import( name = "kotlin-metadata", - jar = "@kotlin-metadata-jvm-2_1_20-Beta1_http//file", - srcjar = "@kotlin-metadata-jvm-2_1_20-Beta1-sources_http//file", + jar = "@kotlin-metadata-jvm-2_1_20-Beta2_http//file", + srcjar = "@kotlin-metadata-jvm-2_1_20-Beta2-sources_http//file", visibility = ["//visibility:public"] ) diff --git a/lib/MODULE.bazel b/lib/MODULE.bazel index f3447c34ab7e..8626cdc5e4fa 100644 --- a/lib/MODULE.bazel +++ b/lib/MODULE.bazel @@ -4585,17 +4585,17 @@ http_file( ) http_file( - name = "kotlin-metadata-jvm-2_1_20-Beta1_http", - url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-metadata-jvm/2.1.20-Beta1/kotlin-metadata-jvm-2.1.20-Beta1.jar", - sha256 = "243ac56352ce7e1ca7f294a53b1a1b3040ca12b95725449f0c04bbee6d43d84c", - downloaded_file_path = "kotlin-metadata-jvm-2.1.20-Beta1.jar" + name = "kotlin-metadata-jvm-2_1_20-Beta2_http", + url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-metadata-jvm/2.1.20-Beta2/kotlin-metadata-jvm-2.1.20-Beta2.jar", + sha256 = "a4d99e5b88eff9972c117b577436aa587e83f78e60cf005cd614065f59ead7a9", + downloaded_file_path = "kotlin-metadata-jvm-2.1.20-Beta2.jar" ) http_file( - name = "kotlin-metadata-jvm-2_1_20-Beta1-sources_http", - url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-metadata-jvm/2.1.20-Beta1/kotlin-metadata-jvm-2.1.20-Beta1-sources.jar", + name = "kotlin-metadata-jvm-2_1_20-Beta2-sources_http", + url = "https://cache-redirector.jetbrains.com/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-metadata-jvm/2.1.20-Beta2/kotlin-metadata-jvm-2.1.20-Beta2-sources.jar", sha256 = "3f5468b5c409702c7cac30067208b7218ab9e3f7209e686966c6c2de2134dd18", - downloaded_file_path = "kotlin-metadata-jvm-2.1.20-Beta1-sources.jar" + downloaded_file_path = "kotlin-metadata-jvm-2.1.20-Beta2-sources.jar" ) http_file( diff --git a/platform/build-scripts/bazel/intellij.platform.buildScripts.bazel.iml b/platform/build-scripts/bazel/intellij.platform.buildScripts.bazel.iml index a03f8b03198c..b1cbe1d37891 100644 --- a/platform/build-scripts/bazel/intellij.platform.buildScripts.bazel.iml +++ b/platform/build-scripts/bazel/intellij.platform.buildScripts.bazel.iml @@ -43,5 +43,6 @@ + \ No newline at end of file diff --git a/platform/build-scripts/bazel/src/org/jetbrains/intellij/build/bazel/BazelBuildFileGenerator.kt b/platform/build-scripts/bazel/src/org/jetbrains/intellij/build/bazel/BazelBuildFileGenerator.kt index 114e91860a4b..d54ca2c8aa8d 100644 --- a/platform/build-scripts/bazel/src/org/jetbrains/intellij/build/bazel/BazelBuildFileGenerator.kt +++ b/platform/build-scripts/bazel/src/org/jetbrains/intellij/build/bazel/BazelBuildFileGenerator.kt @@ -15,6 +15,8 @@ import org.jetbrains.kotlin.jps.model.JpsKotlinFacetModuleExtension import java.nio.file.Files import java.nio.file.Path import java.util.* +import kotlin.io.path.ExperimentalPathApi +import kotlin.io.path.deleteRecursively import kotlin.io.path.invariantSeparatorsPathString internal class ModuleList( @@ -517,6 +519,7 @@ private fun computeResources(module: JpsModule, contentRoots: List, bazelB .toList() } +@OptIn(ExperimentalPathApi::class) private fun extraResourceTarget( module: JpsModule, contentRoots: List, @@ -532,6 +535,20 @@ private fun extraResourceTarget( return@mapNotNull null } + val isEmptyDir = Files.newDirectoryStream(metaInf).use { stream -> + val iterator = stream.iterator() + while (iterator.hasNext()) { + if (!iterator.next().toString().startsWith('.')) { + return@use false + } + } + true + } + if (isEmptyDir) { + metaInf.deleteRecursively() + return@mapNotNull null + } + val metaInfRelative = resolveRelativeToBazelBuildFileDirectory(childDir = metaInf, contentRoots = contentRoots, bazelBuildDir = bazelBuildDir, module = module) .invariantSeparatorsPathString