diff --git a/.github/workflows/release-proxy.yml b/.github/workflows/release-proxy.yml index 7f15f03..24a5628 100644 --- a/.github/workflows/release-proxy.yml +++ b/.github/workflows/release-proxy.yml @@ -17,32 +17,26 @@ jobs: include: - target: aarch64-apple-darwin runner: macos-15 - helper_asset_name: java-task-helper-darwin-aarch64.tar.gz proxy_asset: java-lsp-proxy-darwin-aarch64.tar.gz bridge_asset: gradle-lsp-bridge-darwin-aarch64.tar.gz - target: x86_64-apple-darwin runner: macos-15-intel - helper_asset_name: java-task-helper-darwin-x86_64.tar.gz proxy_asset: java-lsp-proxy-darwin-x86_64.tar.gz bridge_asset: gradle-lsp-bridge-darwin-x86_64.tar.gz - target: x86_64-unknown-linux-gnu runner: ubuntu-22.04 - helper_asset_name: java-task-helper-linux-x86_64.tar.gz proxy_asset: java-lsp-proxy-linux-x86_64.tar.gz bridge_asset: gradle-lsp-bridge-linux-x86_64.tar.gz - target: aarch64-unknown-linux-gnu runner: ubuntu-22.04-arm - helper_asset_name: java-task-helper-linux-aarch64.tar.gz proxy_asset: java-lsp-proxy-linux-aarch64.tar.gz bridge_asset: gradle-lsp-bridge-linux-aarch64.tar.gz - target: x86_64-pc-windows-msvc runner: windows-latest - helper_asset_name: java-task-helper-windows-x86_64.zip proxy_asset: java-lsp-proxy-windows-x86_64.zip bridge_asset: gradle-lsp-bridge-windows-x86_64.zip - target: aarch64-pc-windows-msvc runner: windows-11-arm - helper_asset_name: java-task-helper-windows-aarch64.zip proxy_asset: java-lsp-proxy-windows-aarch64.zip bridge_asset: gradle-lsp-bridge-windows-aarch64.zip @@ -63,20 +57,12 @@ jobs: run: cargo build --release --target ${{ matrix.target }} -p java-lsp-proxy -p gradle-lsp-bridge shell: bash - - name: Build task helper binary - working-directory: task_helper - run: cargo build --release --target ${{ matrix.target }} - shell: bash - - name: Package binaries (Unix) if: runner.os != 'Windows' run: | tar -czf ${{ matrix.proxy_asset }} \ -C target/${{ matrix.target }}/release \ java-lsp-proxy - tar -czf ${{ matrix.helper_asset_name }} \ - -C target/${{ matrix.target }}/release \ - java-task-helper tar -czf ${{ matrix.bridge_asset }} \ -C target/${{ matrix.target }}/release \ gradle-lsp-bridge @@ -84,8 +70,7 @@ jobs: - name: Package binaries (Windows) if: runner.os == 'Windows' shell: pwsh - run: | - Compress-Archive -Path target/${{ matrix.target }}/release/java-task-helper.exe -DestinationPath ${{ matrix.helper_asset_name }} + run: | Compress-Archive -Path target/${{ matrix.target }}/release/java-lsp-proxy.exe -DestinationPath ${{ matrix.proxy_asset }} Compress-Archive -Path target/${{ matrix.target }}/release/gradle-lsp-bridge.exe -DestinationPath ${{ matrix.bridge_asset }} @@ -94,7 +79,6 @@ jobs: with: name: binaries-${{ matrix.target }} path: | - ${{ matrix.helper_asset_name }} ${{ matrix.proxy_asset }} ${{ matrix.bridge_asset }} retention-days: 1 diff --git a/Cargo.lock b/Cargo.lock index f4009c5..ac86b03 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19,19 +19,19 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.103" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" [[package]] name = "async-trait" -version = "0.1.89" +version = "0.1.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +checksum = "ae36dc4177970ef04fde5178d3e2429882def40e57a451f919c098f72baa6cec" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] @@ -60,9 +60,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bitflags" -version = "2.13.0" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" [[package]] name = "block-buffer" @@ -81,9 +81,9 @@ checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] name = "cc" -version = "1.2.66" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5d6cac793997bd970000024b2934968efe83b382de4fdcf4fcb46b6ee4ad996" +checksum = "5add81bb678e6cb321aff7fa0dc7689ad82b112dbc032cea19f91d6b8e3582b9" dependencies = [ "find-msvc-tools", "shlex", @@ -152,14 +152,14 @@ checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] name = "either" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" +checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d" [[package]] name = "encode_unicode" @@ -185,9 +185,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" [[package]] name = "find-msvc-tools" @@ -228,9 +228,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +checksum = "a88cf1f829d945f548cf8fec32c61b1f202b6d93b45848602fc02af4b12ad218" dependencies = [ "futures-channel", "futures-core", @@ -243,9 +243,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +checksum = "262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae" dependencies = [ "futures-core", "futures-sink", @@ -253,15 +253,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" +checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" [[package]] name = "futures-executor" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +checksum = "6754879cc9f2c66f88c6e5c35344bb0bdb0708b0352b1201815667c7eabc7458" dependencies = [ "futures-core", "futures-task", @@ -270,38 +270,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" +checksum = "4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a" [[package]] name = "futures-macro" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +checksum = "2d6d3cde68c518367be28956066ddfef33813991b77a55005a69dae04bf3b10b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] name = "futures-sink" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" +checksum = "e34418ac499d6305c2fb5ad0ed2f6ac998c5f8ca209b4510f7f94242c647e307" [[package]] name = "futures-task" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" +checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" [[package]] name = "futures-util" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" dependencies = [ "futures-channel", "futures-core", @@ -406,9 +406,9 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" dependencies = [ "bytes", "http", @@ -416,9 +416,9 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2" dependencies = [ "bytes", "futures-core", @@ -441,9 +441,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" +checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" dependencies = [ "atomic-waker", "bytes", @@ -652,15 +652,6 @@ dependencies = [ "serde_json", ] -[[package]] -name = "java-task-helper" -version = "6.8.23" -dependencies = [ - "serde", - "serde_json", - "tempfile", -] - [[package]] name = "leb128fmt" version = "0.1.0" @@ -669,9 +660,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.186" +version = "0.2.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] name = "linux-raw-sys" @@ -709,9 +700,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" dependencies = [ "libc", "wasi", @@ -747,7 +738,7 @@ checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -772,14 +763,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn", + "syn 2.0.119", ] [[package]] name = "proc-macro2" -version = "1.0.106" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" dependencies = [ "unicode-ident", ] @@ -804,7 +795,7 @@ dependencies = [ "itertools", "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -820,9 +811,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.46" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" dependencies = [ "proc-macro2", ] @@ -835,9 +826,9 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "regex" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0e75113e14dc5acb068cd0786884f214f1312650a3d36d269f5c4f3cdee8a2" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" dependencies = [ "aho-corasick", "memchr", @@ -847,9 +838,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.15" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f388202e4b80542a0921078cc23b6333bcf1409c1e3f86404cae4766a6131db" +checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad" dependencies = [ "aho-corasick", "memchr", @@ -887,9 +878,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" dependencies = [ "serde_core", "serde_derive", @@ -897,29 +888,29 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] name = "serde_json" -version = "1.0.150" +version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" dependencies = [ "indexmap", "itoa", @@ -931,9 +922,9 @@ dependencies = [ [[package]] name = "sha1" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" dependencies = [ "cfg-if", "cpufeatures", @@ -958,9 +949,9 @@ dependencies = [ [[package]] name = "simd-adler32" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" [[package]] name = "similar" @@ -982,9 +973,9 @@ checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" [[package]] name = "socket2" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ "libc", "windows-sys 0.61.2", @@ -1013,9 +1004,20 @@ checksum = "2b2231b7c3057d5e4ad0156fb3dc807d900806020c5ffa3ee6ff2c8c76fb8520" [[package]] name = "syn" -version = "2.0.118" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" dependencies = [ "proc-macro2", "quote", @@ -1036,7 +1038,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -1064,9 +1066,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.52.3" +version = "1.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" dependencies = [ "bytes", "libc", @@ -1080,20 +1082,20 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.7.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" +checksum = "6328af13490e73a9b4694030fafd93f8c8c6a9dede33e821c3fc63eddf8042ba" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] name = "tokio-stream" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" +checksum = "a3d06f0b082ba57c26b79407372e57cf2a1e28124f78e9479fe80322cf53420b" dependencies = [ "futures-core", "pin-project-lite", @@ -1102,13 +1104,14 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.18" +version = "0.7.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" dependencies = [ "bytes", "futures-core", "futures-sink", + "libc", "pin-project-lite", "tokio", ] @@ -1208,7 +1211,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -1222,9 +1225,9 @@ dependencies = [ [[package]] name = "tree-sitter" -version = "0.26.10" +version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c343ed63e3f5c64d1acdecb5d2c13d4e169cb5fde0052106ebaa6c6f27f9e55" +checksum = "af1c71c1c4cc0920b20d6b0f6572e7682cd07a6a2faec71067a31fa394c586df" dependencies = [ "cc", "regex", @@ -1484,7 +1487,7 @@ dependencies = [ "heck", "indexmap", "prettyplease", - "syn", + "syn 2.0.119", "wasm-metadata", "wit-bindgen-core", "wit-component", @@ -1500,7 +1503,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn", + "syn 2.0.119", "wit-bindgen-core", "wit-bindgen-rust", ] @@ -1567,7 +1570,7 @@ checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", "synstructure", ] @@ -1615,7 +1618,7 @@ checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", "synstructure", ] @@ -1649,11 +1652,11 @@ checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] name = "zmij" -version = "1.0.21" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/Cargo.toml b/Cargo.toml index dd4a159..927ba23 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,6 @@ members = [ ".", "proxy", - "task_helper", "proxy-common", "gradle-bridge" ] diff --git a/README.md b/README.md index f699712..65c2511 100644 --- a/README.md +++ b/README.md @@ -668,10 +668,6 @@ The project includes a `justfile` with common development tasks: | `just proxy-build` | Build the proxy binary in debug mode | | `just proxy-release` | Build the proxy binary in release mode | | `just proxy-install` | Build release proxy and copy it to the extension workdir | -| `just task-build` | Build the task helper binary in debug mode | -| `just task-release` | Build the task helper binary in release mode | -| `just task-install` | Build release task helper and copy it to the extension workdir | -| `just task-test` | Run task helper tests | | `just bridge-build` | Build the gradle-lsp-bridge binary in debug mode | | `just bridge-release` | Build the gradle-lsp-bridge binary in release mode | | `just bridge-install` | Build release gradle-lsp-bridge and copy it to the extension workdir | @@ -683,7 +679,7 @@ The project includes a `justfile` with common development tasks: ### Testing Local Binary Changes -The three native binaries (`java-lsp-proxy` in `proxy/`, `gradle-lsp-bridge` in `gradle-bridge/`, `java-task-helper` in `task_helper/`) are **not** rebuilt when you use "Rebuild Dev Extension" — and by default the extension downloads release binaries from GitHub. There are two ways to run a local build instead. +The native binaries (`java-lsp-proxy` in `proxy/`, `gradle-lsp-bridge` in `gradle-bridge/`) are **not** rebuilt when you use "Rebuild Dev Extension" — and by default the extension downloads release binaries from GitHub. There are two ways to run a local build instead. #### Option A: Install into the extension workdir (recommended) @@ -692,7 +688,6 @@ The `*-install` recipes build the release binary and copy it into the extension' ```sh just proxy-install # java-lsp-proxy just bridge-install # gradle-lsp-bridge -just task-install # java-task-helper ``` Each copies to the `bin/` directory of the Zed extension workdir: @@ -758,14 +753,13 @@ If you have Rust installed on the remote server, clone the repo there and build # On the remote host git clone https://github.com/zed-extensions/java.git cd java -cargo build --release -p java-lsp-proxy -p gradle-lsp-bridge -p java-task-helper -# Binaries are at: /target/release/{java-lsp-proxy,gradle-lsp-bridge,java-task-helper} +cargo build --release -p java-lsp-proxy -p gradle-lsp-bridge +# Binaries are at: /target/release/{java-lsp-proxy,gradle-lsp-bridge} # Copy to the remote extensions workdir mkdir -p ~/.local/share/zed/remote_extensions/work/java/bin cp target/release/java-lsp-proxy \ target/release/gradle-lsp-bridge \ - target/release/java-task-helper \ ~/.local/share/zed/remote_extensions/work/java/bin/ ``` @@ -775,12 +769,11 @@ If you prefer to build on your local machine, cross-compile for the remote targe ```sh # Build for the remote's target -cargo build --release --target x86_64-unknown-linux-gnu -p java-lsp-proxy -p gradle-lsp-bridge -p java-task-helper +cargo build --release --target x86_64-unknown-linux-gnu -p java-lsp-proxy -p gradle-lsp-bridge # You may need: rustup target add x86_64-unknown-linux-gnu (and a linker in .cargo/config.toml) # Copy the binaries to the remote server scp target/x86_64-unknown-linux-gnu/release/java-lsp-proxy \ - target/x86_64-unknown-linux-gnu/release/java-task-helper \ target/x86_64-unknown-linux-gnu/release/gradle-lsp-bridge \ user@remote:~/java-bins/ ``` diff --git a/justfile b/justfile index fe378d5..248e709 100644 --- a/justfile +++ b/justfile @@ -1,7 +1,6 @@ native_target := `rustc -vV | grep host | awk '{print $2}'` ext_dir := if os() == "macos" { env("HOME") / "Library/Application Support/Zed/extensions/work/java" } else if os() == "linux" { env("HOME") / ".local/share/zed/extensions/work/java" } else { env("LOCALAPPDATA") / "Zed/extensions/work/java" } proxy_bin := ext_dir / "bin" / "java-lsp-proxy" -tasks_bin := ext_dir / "task-bin" / "java-task-helper" bridge_bin := ext_dir / "bin" / "gradle-lsp-bridge" # Build proxy in debug mode @@ -18,30 +17,6 @@ proxy-install: proxy-release cp "target/{{ native_target }}/release/java-lsp-proxy" "{{ proxy_bin }}" @echo "Installed to {{ ext_dir }}" -# --- Task helper recipes --- - -# Build task helper in debug mode -task-build: - cd task_helper && cargo build --target {{ native_target }} - -# Build task helper in release mode -task-release: - cd task_helper && cargo build --release --target {{ native_target }} - -# Build task helper release and install to extension workdir for testing -task-install: task-release - mkdir -p "{{ ext_dir }}/task-bin" - cp "target/{{ native_target }}/release/java-task-helper" "{{ tasks_bin }}" - @echo "Installed to {{ ext_dir }}" - -# Run task helper tests -task-test: - cd task_helper && cargo test - -# Clean task helper build -task-clean: - cd task_helper && cargo clean - # --- Core recipes --- # Build gradle-lsp-bridge in debug mode bridge-build: @@ -73,5 +48,5 @@ clippy: # Format and clippy all code lint: fmt clippy -# Build everything: lint, extension, and install proxy, task helper & bridge -all: lint ext-build proxy-install task-install bridge-install +# Build everything: lint, extension, and install proxy & bridge +all: lint ext-build proxy-install bridge-install diff --git a/languages/java/tasks.cmd.example.json b/languages/java/tasks.cmd.example.json deleted file mode 100644 index 7b095b4..0000000 --- a/languages/java/tasks.cmd.example.json +++ /dev/null @@ -1,37 +0,0 @@ -[ - { - "label": "Run $ZED_CUSTOM_java_class_name", - "command": "\"%LOCALAPPDATA%\\zed\\extensions\\work\\java\\task-bin\\java-task-helper.exe\" run-class \"%ZED_FILE%\" \"%ZED_CUSTOM_java_package_name%\" \"%ZED_CUSTOM_java_class_name%\" \"%ZED_CUSTOM_java_outer_class_name%\"", - "use_new_terminal": false, - "reveal": "always", - "tags": ["java-main"] - }, - { - "label": "Run $ZED_CUSTOM_java_class_name.$ZED_CUSTOM_java_method_name", - "command": "\"%LOCALAPPDATA%\\zed\\extensions\\work\\java\\task-bin\\java-task-helper.exe\" run-test-method \"%ZED_FILE%\" \"%ZED_CUSTOM_java_package_name%\" \"%ZED_CUSTOM_java_class_name%\" \"%ZED_CUSTOM_java_outer_class_name%\" \"%ZED_CUSTOM_java_method_name%\"", - "use_new_terminal": false, - "reveal": "always", - "tags": ["java-test-method", "java-test-method-nested"] - }, - { - "label": "Test class $ZED_CUSTOM_java_class_name", - "command": "\"%LOCALAPPDATA%\\zed\\extensions\\work\\java\\task-bin\\java-task-helper.exe\" run-test-class \"%ZED_FILE%\" \"%ZED_CUSTOM_java_package_name%\" \"%ZED_CUSTOM_java_class_name%\" \"%ZED_CUSTOM_java_outer_class_name%\"", - "use_new_terminal": false, - "reveal": "always", - "tags": ["java-test-class", "java-test-class-nested"] - }, - { - "label": "Run tests", - "command": "\"%LOCALAPPDATA%\\zed\\extensions\\work\\java\\task-bin\\java-task-helper.exe\" run-all-tests \"%ZED_FILE%\"", - "use_new_terminal": false, - "reveal": "always", - "tags": ["java-test-all"] - }, - { - "label": "Clear JDTLS cache", - "command": "\"%LOCALAPPDATA%\\zed\\extensions\\work\\java\\task-bin\\java-task-helper.exe\" clear-cache", - "use_new_terminal": false, - "reveal": "always", - "tags": [] - } -] diff --git a/languages/java/tasks.fish.example.json b/languages/java/tasks.fish.example.json deleted file mode 100644 index 9f587ad..0000000 --- a/languages/java/tasks.fish.example.json +++ /dev/null @@ -1,37 +0,0 @@ -[ - { - "label": "Run $ZED_CUSTOM_java_class_name", - "command": "\"$HOME/.local/share/zed/extensions/work/java/task-bin/java-task-helper\" run-class \"$ZED_FILE\" \"$ZED_CUSTOM_java_package_name\" \"$ZED_CUSTOM_java_class_name\" \"$ZED_CUSTOM_java_outer_class_name\"", - "use_new_terminal": false, - "reveal": "always", - "tags": ["java-main"] - }, - { - "label": "Run $ZED_CUSTOM_java_class_name.$ZED_CUSTOM_java_method_name", - "command": "\"$HOME/.local/share/zed/extensions/work/java/task-bin/java-task-helper\" run-test-method \"$ZED_FILE\" \"$ZED_CUSTOM_java_package_name\" \"$ZED_CUSTOM_java_class_name\" \"$ZED_CUSTOM_java_outer_class_name\" \"$ZED_CUSTOM_java_method_name\"", - "use_new_terminal": false, - "reveal": "always", - "tags": ["java-test-method", "java-test-method-nested"] - }, - { - "label": "Test class $ZED_CUSTOM_java_class_name", - "command": "\"$HOME/.local/share/zed/extensions/work/java/task-bin/java-task-helper\" run-test-class \"$ZED_FILE\" \"$ZED_CUSTOM_java_package_name\" \"$ZED_CUSTOM_java_class_name\" \"$ZED_CUSTOM_java_outer_class_name\"", - "use_new_terminal": false, - "reveal": "always", - "tags": ["java-test-class", "java-test-class-nested"] - }, - { - "label": "Run tests", - "command": "\"$HOME/.local/share/zed/extensions/work/java/task-bin/java-task-helper\" run-all-tests \"$ZED_FILE\"", - "use_new_terminal": false, - "reveal": "always", - "tags": ["java-test-all"] - }, - { - "label": "Clear JDTLS cache", - "command": "\"$HOME/.local/share/zed/extensions/work/java/task-bin/java-task-helper\" clear-cache", - "use_new_terminal": false, - "reveal": "always", - "tags": [] - } -] diff --git a/languages/java/tasks.json b/languages/java/tasks.json index 38c25ba..c1d828b 100644 --- a/languages/java/tasks.json +++ b/languages/java/tasks.json @@ -1,37 +1,89 @@ [ { "label": "Run $ZED_CUSTOM_java_class_name", - "command": "set ErrorActionPreference SilentlyContinue ; eval \"EXT=\\\"${XDG_DATA_HOME:-$HOME/.local/share}/zed/extensions/work/java\\\"; if [ \\\"$(uname 2>/dev/null)\\\" = \\\"Darwin\\\" ]; then EXT=\\\"$HOME/Library/Application Support/Zed/extensions/work/java\\\"; fi; if [ -n \\\"$LOCALAPPDATA\\\" ]; then CYGP=$(cygpath -u \\\"$LOCALAPPDATA\\\" 2>/dev/null); if [ -n \\\"$CYGP\\\" ]; then EXT=\\\"$CYGP/zed/extensions/work/java\\\"; else EXT=\\\"$LOCALAPPDATA/zed/extensions/work/java\\\"; fi; fi; \\\"\\$EXT/task-bin/java-task-helper\\\" run-class \\\"$ZED_FILE\\\" \\\"${ZED_CUSTOM_java_package_name:-}\\\" \\\"$ZED_CUSTOM_java_class_name\\\" \\\"${ZED_CUSTOM_java_outer_class_name:-}\\\" ; exit\" ; set ErrorActionPreference Continue ; $Q=[char]34 ; iex \"& $Q$env:LOCALAPPDATA\\zed\\extensions\\work\\java\\task-bin\\java-task-helper.exe$Q run-class $Q$env:ZED_FILE$Q $Q$env:ZED_CUSTOM_java_package_name$Q $Q$env:ZED_CUSTOM_java_class_name$Q $Q$env:ZED_CUSTOM_java_outer_class_name$Q\"", + "command": "pkg=\"${ZED_CUSTOM_java_package_name:-}\"; cls=\"$ZED_CUSTOM_java_class_name\"; if [ -n \"$pkg\" ]; then c=\"$pkg.$cls\"; else c=\"$cls\"; fi; f=\"$ZED_FILE\"; p=\"$PWD\"; d=$(dirname \"${f#$p/}\"); if [ -f pom.xml ]; then m=\".\"; md=\"$d\"; while [ \"$md\" != \".\" ] && [ \"$md\" != \"/\" ]; do if [ -f \"$md/pom.xml\" ]; then m=\"$md\"; break; fi; md=$(dirname \"$md\"); done; [ -f ./mvnw ] && CMD=\"./mvnw\" || CMD=\"mvn\"; case \"$f\" in *\"/src/test/\"*) COMPILE_GOAL=\"test-compile\"; CLASSPATH_SCOPE=\"test\";; *) COMPILE_GOAL=\"compile\"; CLASSPATH_SCOPE=\"runtime\";; esac; if [ \"$m\" = \".\" ]; then $CMD clean $COMPILE_GOAL exec:java -Dexec.mainClass=\"$c\" -Dexec.classpathScope=$CLASSPATH_SCOPE; else $CMD clean $COMPILE_GOAL -pl \"$m\" -am && $CMD exec:java -pl \"$m\" -Dexec.mainClass=\"$c\" -Dexec.classpathScope=$CLASSPATH_SCOPE; fi; elif [ -f build.gradle ] || [ -f build.gradle.kts ] || [ -f settings.gradle ] || [ -f settings.gradle.kts ]; then m=\".\"; md=\"$d\"; while [ \"$md\" != \".\" ] && [ \"$md\" != \"/\" ]; do if [ -f \"$md/build.gradle\" ] || [ -f \"$md/build.gradle.kts\" ]; then m=\"$md\"; break; fi; md=$(dirname \"$md\"); done; if [ \"$m\" = \".\" ]; then mp=\"\"; else mp=\":$(echo \"$m\" | tr '/' ':')\"; fi; [ -f ./gradlew ] && CMD=\"./gradlew\" || CMD=\"gradle\"; $CMD ${mp}:run -PmainClass=\"$c\"; else find . -name '*.java' -not -path './bin/*' -not -path './target/*' -not -path './build/*' -print0 | xargs -0 javac -d bin && java -cp bin \"$c\"; fi;", "use_new_terminal": false, "reveal": "always", - "tags": ["java-main"] + "tags": [ + "java-main" + ], + "shell": { + "with_arguments": { + "program": "/bin/sh", + "args": [ + "-c" + ] + } + } }, { - "label": "Run $ZED_CUSTOM_java_class_name.${ZED_CUSTOM_java_outer_class_name:}.$ZED_CUSTOM_java_method_name", - "command": "set ErrorActionPreference SilentlyContinue ; eval \"EXT=\\\"${XDG_DATA_HOME:-$HOME/.local/share}/zed/extensions/work/java\\\"; if [ \\\"$(uname 2>/dev/null)\\\" = \\\"Darwin\\\" ]; then EXT=\\\"$HOME/Library/Application Support/Zed/extensions/work/java\\\"; fi; if [ -n \\\"$LOCALAPPDATA\\\" ]; then CYGP=$(cygpath -u \\\"$LOCALAPPDATA\\\" 2>/dev/null); if [ -n \\\"$CYGP\\\" ]; then EXT=\\\"$CYGP/zed/extensions/work/java\\\"; else EXT=\\\"$LOCALAPPDATA/zed/extensions/work/java\\\"; fi; fi; \\\"\\$EXT/task-bin/java-task-helper\\\" run-test-method \\\"$ZED_FILE\\\" \\\"${ZED_CUSTOM_java_package_name:-}\\\" \\\"$ZED_CUSTOM_java_class_name\\\" \\\"${ZED_CUSTOM_java_outer_class_name:-}\\\" \\\"$ZED_CUSTOM_java_method_name\\\" ; exit\" ; set ErrorActionPreference Continue ; $Q=[char]34 ; iex \"& $Q$env:LOCALAPPDATA\\zed\\extensions\\work\\java\\task-bin\\java-task-helper.exe$Q run-test-method $Q$env:ZED_FILE$Q $Q$env:ZED_CUSTOM_java_package_name$Q $Q$env:ZED_CUSTOM_java_class_name$Q $Q$env:ZED_CUSTOM_java_outer_class_name$Q $Q$env:ZED_CUSTOM_java_method_name$Q\"", + "label": "$ZED_CUSTOM_java_class_name.${ZED_CUSTOM_java_outer_class_name:}.$ZED_CUSTOM_java_method_name", + "command": "package=\"${ZED_CUSTOM_java_package_name:-}\"; outer=\"${ZED_CUSTOM_java_outer_class_name:-}\"; inner=\"$ZED_CUSTOM_java_class_name\"; method=\"$ZED_CUSTOM_java_method_name\"; sep=\"$\"; if [ -n \"$outer\" ]; then c=\"$outer$sep$inner\"; else c=\"$inner\"; fi; if [ -n \"$package\" ]; then fqc=\"$package.$c\"; else fqc=\"$c\"; fi; f=\"$ZED_FILE\"; p=\"$PWD\"; d=$(dirname \"${f#$p/}\"); if [ -f pom.xml ]; then m=\".\"; md=\"$d\"; while [ \"$md\" != \".\" ] && [ \"$md\" != \"/\" ]; do if [ -f \"$md/pom.xml\" ]; then m=\"$md\"; break; fi; md=$(dirname \"$md\"); done; [ -f ./mvnw ] && CMD=\"./mvnw\" || CMD=\"mvn\"; if [ \"$m\" = \".\" ]; then $CMD clean test -Dtest=\"$fqc#$method\"; else $CMD clean test-compile -pl \"$m\" -am && $CMD test -pl \"$m\" -Dtest=\"$fqc#$method\"; fi; elif [ -f build.gradle ] || [ -f build.gradle.kts ] || [ -f settings.gradle ] || [ -f settings.gradle.kts ]; then m=\".\"; md=\"$d\"; while [ \"$md\" != \".\" ] && [ \"$md\" != \"/\" ]; do if [ -f \"$md/build.gradle\" ] || [ -f \"$md/build.gradle.kts\" ]; then m=\"$md\"; break; fi; md=$(dirname \"$md\"); done; if [ \"$m\" = \".\" ]; then mp=\"\"; else mp=\":$(echo \"$m\" | tr '/' ':')\"; fi; [ -f ./gradlew ] && CMD=\"./gradlew\" || CMD=\"gradle\"; $CMD ${mp}:test --tests \"$fqc.$method\"; else >&2 echo 'No build tool found'; exit 1; fi;", "use_new_terminal": false, "reveal": "always", - "tags": ["java-test-method", "java-test-method-nested"] + "tags": [ + "java-test-method", + "java-test-method-nested" + ], + "shell": { + "with_arguments": { + "program": "/bin/sh", + "args": [ + "-c" + ] + } + } }, { "label": "Test class $ZED_CUSTOM_java_class_name", - "command": "set ErrorActionPreference SilentlyContinue ; eval \"EXT=\\\"${XDG_DATA_HOME:-$HOME/.local/share}/zed/extensions/work/java\\\"; if [ \\\"$(uname 2>/dev/null)\\\" = \\\"Darwin\\\" ]; then EXT=\\\"$HOME/Library/Application Support/Zed/extensions/work/java\\\"; fi; if [ -n \\\"$LOCALAPPDATA\\\" ]; then CYGP=$(cygpath -u \\\"$LOCALAPPDATA\\\" 2>/dev/null); if [ -n \\\"$CYGP\\\" ]; then EXT=\\\"$CYGP/zed/extensions/work/java\\\"; else EXT=\\\"$LOCALAPPDATA/zed/extensions/work/java\\\"; fi; fi; \\\"\\$EXT/task-bin/java-task-helper\\\" run-test-class \\\"$ZED_FILE\\\" \\\"${ZED_CUSTOM_java_package_name:-}\\\" \\\"$ZED_CUSTOM_java_class_name\\\" \\\"${ZED_CUSTOM_java_outer_class_name:-}\\\" ; exit\" ; set ErrorActionPreference Continue ; $Q=[char]34 ; iex \"& $Q$env:LOCALAPPDATA\\zed\\extensions\\work\\java\\task-bin\\java-task-helper.exe$Q run-test-class $Q$env:ZED_FILE$Q $Q$env:ZED_CUSTOM_java_package_name$Q $Q$env:ZED_CUSTOM_java_class_name$Q $Q$env:ZED_CUSTOM_java_outer_class_name$Q\"", + "command": "package=\"${ZED_CUSTOM_java_package_name:-}\"; outer=\"${ZED_CUSTOM_java_outer_class_name:-}\"; inner=\"$ZED_CUSTOM_java_class_name\"; sep=\"$\"; if [ -n \"$outer\" ]; then c=\"$outer$sep$inner\"; else c=\"$inner\"; fi; if [ -n \"$package\" ]; then fqc=\"$package.$c\"; else fqc=\"$c\"; fi; f=\"$ZED_FILE\"; p=\"$PWD\"; d=$(dirname \"${f#$p/}\"); if [ -f pom.xml ]; then m=\".\"; md=\"$d\"; while [ \"$md\" != \".\" ] && [ \"$md\" != \"/\" ]; do if [ -f \"$md/pom.xml\" ]; then m=\"$md\"; break; fi; md=$(dirname \"$md\"); done; [ -f ./mvnw ] && CMD=\"./mvnw\" || CMD=\"mvn\"; if [ \"$m\" = \".\" ]; then $CMD clean test -Dtest=\"$fqc\"; else $CMD clean test-compile -pl \"$m\" -am && $CMD test -pl \"$m\" -Dtest=\"$fqc\"; fi; elif [ -f build.gradle ] || [ -f build.gradle.kts ] || [ -f settings.gradle ] || [ -f settings.gradle.kts ]; then m=\".\"; md=\"$d\"; while [ \"$md\" != \".\" ] && [ \"$md\" != \"/\" ]; do if [ -f \"$md/build.gradle\" ] || [ -f \"$md/build.gradle.kts\" ]; then m=\"$md\"; break; fi; md=$(dirname \"$md\"); done; if [ \"$m\" = \".\" ]; then mp=\"\"; else mp=\":$(echo \"$m\" | tr '/' ':')\"; fi; [ -f ./gradlew ] && CMD=\"./gradlew\" || CMD=\"gradle\"; $CMD ${mp}:test --tests \"$fqc\"; else >&2 echo 'No build tool found'; exit 1; fi;", "use_new_terminal": false, "reveal": "always", - "tags": ["java-test-class", "java-test-class-nested"] + "tags": [ + "java-test-class", + "java-test-class-nested" + ], + "shell": { + "with_arguments": { + "program": "/bin/sh", + "args": [ + "-c" + ] + } + } }, { "label": "Run tests", - "command": "set ErrorActionPreference SilentlyContinue ; eval \"EXT=\\\"${XDG_DATA_HOME:-$HOME/.local/share}/zed/extensions/work/java\\\"; if [ \\\"$(uname 2>/dev/null)\\\" = \\\"Darwin\\\" ]; then EXT=\\\"$HOME/Library/Application Support/Zed/extensions/work/java\\\"; fi; if [ -n \\\"$LOCALAPPDATA\\\" ]; then CYGP=$(cygpath -u \\\"$LOCALAPPDATA\\\" 2>/dev/null); if [ -n \\\"$CYGP\\\" ]; then EXT=\\\"$CYGP/zed/extensions/work/java\\\"; else EXT=\\\"$LOCALAPPDATA/zed/extensions/work/java\\\"; fi; fi; \\\"\\$EXT/task-bin/java-task-helper\\\" run-all-tests \\\"$ZED_FILE\\\" ; exit\" ; set ErrorActionPreference Continue ; $Q=[char]34 ; iex \"& $Q$env:LOCALAPPDATA\\zed\\extensions\\work\\java\\task-bin\\java-task-helper.exe$Q run-all-tests $Q$env:ZED_FILE$Q\"", + "command": "f=\"$ZED_FILE\"; p=\"$PWD\"; d=$(dirname \"${f#$p/}\"); if [ -f pom.xml ]; then m=\".\"; md=\"$d\"; while [ \"$md\" != \".\" ] && [ \"$md\" != \"/\" ]; do if [ -f \"$md/pom.xml\" ]; then m=\"$md\"; break; fi; md=$(dirname \"$md\"); done; [ -f ./mvnw ] && CMD=\"./mvnw\" || CMD=\"mvn\"; if [ \"$m\" = \".\" ]; then $CMD clean test; else $CMD clean test-compile -pl \"$m\" -am && $CMD test -pl \"$m\"; fi; elif [ -f build.gradle ] || [ -f build.gradle.kts ] || [ -f settings.gradle ] || [ -f settings.gradle.kts ]; then m=\".\"; md=\"$d\"; while [ \"$md\" != \".\" ] && [ \"$md\" != \"/\" ]; do if [ -f \"$md/build.gradle\" ] || [ -f \"$md/build.gradle.kts\" ]; then m=\"$md\"; break; fi; md=$(dirname \"$md\"); done; if [ \"$m\" = \".\" ]; then mp=\"\"; else mp=\":$(echo \"$m\" | tr '/' ':')\"; fi; [ -f ./gradlew ] && CMD=\"./gradlew\" || CMD=\"gradle\"; $CMD ${mp}:test; else >&2 echo 'No build tool found'; exit 1; fi;", "use_new_terminal": false, "reveal": "always", - "tags": ["java-test-all"] + "tags": [ + "java-test-all" + ], + "shell": { + "with_arguments": { + "program": "/bin/sh", + "args": [ + "-c" + ] + } + } }, { "label": "Clear JDTLS cache", - "command": "set ErrorActionPreference SilentlyContinue ; eval \"EXT=\\\"${XDG_DATA_HOME:-$HOME/.local/share}/zed/extensions/work/java\\\"; if [ \\\"$(uname 2>/dev/null)\\\" = \\\"Darwin\\\" ]; then EXT=\\\"$HOME/Library/Application Support/Zed/extensions/work/java\\\"; fi; if [ -n \\\"$LOCALAPPDATA\\\" ]; then CYGP=$(cygpath -u \\\"$LOCALAPPDATA\\\" 2>/dev/null); if [ -n \\\"$CYGP\\\" ]; then EXT=\\\"$CYGP/zed/extensions/work/java\\\"; else EXT=\\\"$LOCALAPPDATA/zed/extensions/work/java\\\"; fi; fi; \\\"\\$EXT/task-bin/java-task-helper\\\" clear-cache ; exit\" ; set ErrorActionPreference Continue ; $Q=[char]34 ; iex \"& $Q$env:LOCALAPPDATA\\zed\\extensions\\work\\java\\task-bin\\java-task-helper.exe$Q clear-cache\"", + "command": "cache_dir=\"\"; if [ -n \"$XDG_CACHE_HOME\" ]; then cache_dir=\"$XDG_CACHE_HOME\"; elif [ \"$(uname)\" = \"Darwin\" ]; then cache_dir=\"$HOME/Library/Caches\"; else cache_dir=\"$HOME/.cache\"; fi; found=$(find \"$cache_dir\" -maxdepth 1 -type d -name 'jdtls-*' 2>/dev/null); if [ -n \"$found\" ]; then echo \"$found\" | xargs rm -rf && echo 'JDTLS cache cleared. Restart the language server'; else echo 'No JDTLS cache found'; fi", "use_new_terminal": false, "reveal": "always", - "tags": [] + "tags": [ + "java-clear-cache" + ], + "shell": { + "with_arguments": { + "program": "/bin/sh", + "args": [ + "-c" + ] + } + } } ] diff --git a/src/java.rs b/src/java.rs index d6223a5..b65526b 100644 --- a/src/java.rs +++ b/src/java.rs @@ -10,7 +10,6 @@ mod jdtls_server; mod language_server; mod lsp; mod proxy; -mod task; mod util; use std::str::FromStr; diff --git a/src/jdtls_server.rs b/src/jdtls_server.rs index d77c970..8578a7b 100644 --- a/src/jdtls_server.rs +++ b/src/jdtls_server.rs @@ -15,7 +15,6 @@ use crate::{ jdtls::{Jdtls, Lombok, build_jdtls_launch_args, get_jdtls_launcher_from_path}, language_server::LanguageServer, proxy::Proxy, - task::TaskHelper, util::{path_to_file_uri, path_to_string}, }; @@ -25,7 +24,6 @@ pub struct JdtlsServer { pub proxy: Proxy, pub jdk: Jdk, pub debugger: Debugger, - pub task_helper: TaskHelper, pub cached_workspace: Option, } @@ -37,7 +35,6 @@ impl JdtlsServer { proxy: Proxy::new(), jdk: Jdk::new(), debugger: Debugger::new(), - task_helper: TaskHelper::new(), cached_workspace: None, } } @@ -120,13 +117,6 @@ impl LanguageServer for JdtlsServer { println!("Failed to download debugger: {err}"); }; - if let Err(err) = - self.task_helper - .get_or_download(language_server_id, &configuration, worktree) - { - println!("Failed to download task helper: {err}"); - } - self.cached_workspace = Some(worktree.root_path()); Ok(zed::Command { diff --git a/src/task.rs b/src/task.rs deleted file mode 100644 index fec9652..0000000 --- a/src/task.rs +++ /dev/null @@ -1,160 +0,0 @@ -use std::{fs::metadata, path::PathBuf}; - -use zed_extension_api::{ - self as zed, DownloadedFileType, LanguageServerId, LanguageServerInstallationStatus, Worktree, - serde_json::Value, set_language_server_installation_status, -}; - -use crate::{ - downloadable::Downloadable, - util::{ - mark_checked_once, platform_asset_name, platform_exec_name, remove_all_files_except, - should_use_local_or_download, - }, -}; - -const TASK_HELPER_BINARY: &str = "java-task-helper"; -/// It needs to live in a different directory compared to other vended binaries -/// to avoid breaking `tasks.json` on each release -const TASK_HELPER_INSTALL_PATH: &str = "task-bin"; -const GITHUB_REPO: &str = "zed-extensions/java"; - -pub struct TaskHelper { - cached_path: Option, -} - -impl TaskHelper { - pub fn new() -> Self { - Self { cached_path: None } - } -} - -impl Downloadable for TaskHelper { - const INSTALL_PATH: &'static str = TASK_HELPER_INSTALL_PATH; - - fn find_local(&self) -> Option { - let local_binary = PathBuf::from(TASK_HELPER_INSTALL_PATH).join(task_helper_exec()); - if metadata(&local_binary).is_ok_and(|m| m.is_file()) { - return Some(local_binary); - } - - std::fs::read_dir(TASK_HELPER_INSTALL_PATH) - .ok()? - .filter_map(Result::ok) - .map(|e| e.path().join(task_helper_exec())) - .filter(|p| metadata(p).is_ok_and(|m| m.is_file())) - .last() - } - - fn loaded(&self) -> bool { - self.cached_path.is_some() - } - - fn fetch_latest_version(&self, _worktree: &Worktree) -> zed::Result { - // The task helper is built and released together with the extension, so - // the matching release is the one tagged with the extension's own version. - Ok(format!("v{}", env!("CARGO_PKG_VERSION"))) - } - - fn download( - &mut self, - version: &str, - language_server_id: &LanguageServerId, - _worktree: &Worktree, - ) -> zed::Result { - let (name, file_type) = asset_name()?; - let exec_name = task_helper_exec(); - let bin_path = format!("{TASK_HELPER_INSTALL_PATH}/{}", exec_name); - - if metadata(&bin_path).is_ok() { - self.cached_path = Some(bin_path.clone()); - return Ok(PathBuf::from(bin_path)); - } - - let release = zed::github_release_by_tag_name(GITHUB_REPO, version) - .map_err(|err| format!("Failed to fetch task helper release {version}: {err}"))?; - - let asset = release - .assets - .iter() - .find(|a| a.name == name) - .ok_or_else(|| format!("No asset found matching {name:?}"))?; - - set_language_server_installation_status( - language_server_id, - &LanguageServerInstallationStatus::Downloading, - ); - - zed::download_file(&asset.download_url, TASK_HELPER_INSTALL_PATH, file_type) - .map_err(|err| format!("Failed to download task helper: {err}"))?; - - let _ = zed::make_file_executable(&bin_path); - set_language_server_installation_status( - language_server_id, - &LanguageServerInstallationStatus::None, - ); - let _ = remove_all_files_except(TASK_HELPER_INSTALL_PATH, &exec_name); - let _ = mark_checked_once(TASK_HELPER_INSTALL_PATH, version); - - self.cached_path = Some(bin_path.clone()); - Ok(PathBuf::from(bin_path)) - } - - fn get_or_download( - &mut self, - language_server_id: &LanguageServerId, - configuration: &Option, - worktree: &Worktree, - ) -> zed::Result { - if let Some(path) = self.user_configured_path(configuration, worktree) { - self.cached_path = Some(path.clone()); - return Ok(PathBuf::from(path)); - } - - if let Some(path) = - should_use_local_or_download(configuration, self.find_local(), Self::INSTALL_PATH) - .unwrap_or(None) - { - let s = path.to_string_lossy().to_string(); - self.cached_path = Some(s); - return Ok(path); - } - - let downloaded = self - .fetch_latest_version(worktree) - .and_then(|version| self.download(&version, language_server_id, worktree)); - - let download_err = match downloaded { - Ok(path) => return Ok(path), - Err(err) => err, - }; - - // The version check or download failed (e.g. GitHub API rate - // limiting) — an existing local installation is better than none. - if let Some(path) = self.find_local() { - println!( - "Failed to update task helper, falling back to local installation: {download_err}" - ); - let s = path.to_string_lossy().to_string(); - self.cached_path = Some(s); - return Ok(path); - } - - if let Some(path) = worktree.which(task_helper_exec().as_str()) { - return Ok(PathBuf::from(path)); - } - - Err(format!( - "'{}' not found: {download_err}", - task_helper_exec() - )) - } -} - -fn asset_name() -> zed::Result<(String, DownloadedFileType)> { - platform_asset_name(TASK_HELPER_BINARY) -} - -fn task_helper_exec() -> String { - platform_exec_name(TASK_HELPER_BINARY) -} diff --git a/task_helper/Cargo.toml b/task_helper/Cargo.toml deleted file mode 100644 index ee0776e..0000000 --- a/task_helper/Cargo.toml +++ /dev/null @@ -1,14 +0,0 @@ -[package] -name = "java-task-helper" -version = "6.8.23" -edition = "2021" -publish = false -license = "Apache-2.0" -description = "Task management helper for the Zed Java extension" - -[dependencies] -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" - -[dev-dependencies] -tempfile = "3.17.1" diff --git a/task_helper/src/build_tool/gradle.rs b/task_helper/src/build_tool/gradle.rs deleted file mode 100644 index 8f4099e..0000000 --- a/task_helper/src/build_tool/gradle.rs +++ /dev/null @@ -1,126 +0,0 @@ -use crate::build_tool::{find_closest_module, full_class_name, task, which_wrapper, BuildTool}; -use crate::command::TaskCommand; -use crate::is_debug; -use std::path::PathBuf; - -pub struct Gradle { - root: PathBuf, -} - -impl Gradle { - pub fn new(root: PathBuf) -> Self { - Self { root } - } - - fn find_module(&self, file: &str) -> Option { - find_closest_module(file, &self.root, &["build.gradle", "build.gradle.kts"]) - } - - fn cwd(&self) -> String { - self.root.to_string_lossy().to_string() - } - - fn command(&self) -> String { - which_wrapper(&self.root, "gradle") - } - - fn gradle_task(&self, module: &Option, task_name: &str) -> String { - match module { - Some(m) => { - let gradle_path = m.to_string_lossy().replace(['/', '\\'], ":"); - format!(":{gradle_path}:{task_name}") - } - None => format!(":{task_name}"), - } - } - - fn debug_args() -> Vec { - if is_debug() { - vec!["--debug-jvm".to_string()] - } else { - vec![] - } - } - - fn test_filter( - package: &str, - class: &str, - outer: Option<&str>, - method: Option<&str>, - ) -> String { - let full = full_class_name(package, class, outer); - match method { - Some(m) => format!("{}.{}", full, m), - None => full, - } - } - - fn test_args(&self, module: &Option, filter: Option<&str>) -> Vec { - let gradle_task = self.gradle_task(module, "test"); - let mut args = vec![gradle_task]; - if let Some(f) = filter { - args.push("--tests".to_string()); - args.push(f.to_string()); - } - args.extend(Self::debug_args()); - args - } -} - -impl BuildTool for Gradle { - fn run_class( - &self, - file: &str, - package: &str, - class: &str, - outer: Option<&str>, - ) -> TaskCommand { - let module = self.find_module(file); - let full_name = full_class_name(package, class, outer); - let gradle_task = self.gradle_task(&module, "run"); - - let mut args = vec![gradle_task, format!("-PmainClass={}", full_name)]; - args.extend(Self::debug_args()); - - task(self.command(), args, self.cwd(), vec![]) - } - - fn run_test_method( - &self, - file: &str, - package: &str, - class: &str, - outer: Option<&str>, - method: &str, - ) -> TaskCommand { - let module = self.find_module(file); - let test_filter = Self::test_filter(package, class, outer, Some(method)); - - let args = self.test_args(&module, Some(&test_filter)); - - task(self.command(), args, self.cwd(), vec![]) - } - - fn run_test_class( - &self, - file: &str, - package: &str, - class: &str, - outer: Option<&str>, - ) -> TaskCommand { - let module = self.find_module(file); - let test_filter = Self::test_filter(package, class, outer, None); - - let args = self.test_args(&module, Some(&test_filter)); - - task(self.command(), args, self.cwd(), vec![]) - } - - fn run_all_tests(&self, file: &str) -> TaskCommand { - let module = self.find_module(file); - - let args = self.test_args(&module, None); - - task(self.command(), args, self.cwd(), vec![]) - } -} diff --git a/task_helper/src/build_tool/maven.rs b/task_helper/src/build_tool/maven.rs deleted file mode 100644 index da7ffdd..0000000 --- a/task_helper/src/build_tool/maven.rs +++ /dev/null @@ -1,142 +0,0 @@ -use crate::build_tool::{find_closest_module, full_class_name, task, which_wrapper, BuildTool}; -use crate::command::TaskCommand; -use crate::{get_jdwp_args, is_debug}; -use std::path::PathBuf; - -pub struct Maven { - root: PathBuf, -} - -impl Maven { - pub fn new(root: PathBuf) -> Self { - Self { root } - } - - fn find_module(&self, file: &str) -> Option { - find_closest_module(file, &self.root, &["pom.xml"]) - } - - fn cwd(&self) -> String { - self.root.to_string_lossy().to_string() - } - - fn command(&self) -> String { - which_wrapper(&self.root, "mvn") - } - - fn debug_env() -> Vec<(String, String)> { - if is_debug() { - vec![("MAVEN_OPTS".to_string(), get_jdwp_args())] - } else { - vec![] - } - } - - fn debug_arg() -> Option { - is_debug().then(|| "-Dmaven.surefire.debug".to_string()) - } - - fn test_filter( - package: &str, - class: &str, - outer: Option<&str>, - method: Option<&str>, - ) -> String { - let full = full_class_name(package, class, outer); - match method { - Some(m) => format!("{}#{}", full, m), - None => full, - } - } - - fn module_prefix(module: &Option) -> Vec { - match module { - Some(m) => vec![ - "-pl".to_string(), - m.to_string_lossy().to_string(), - "-am".to_string(), - ], - None => vec![], - } - } - - fn test_args(module: &Option) -> Vec { - let mut args = vec!["test".to_string(), "-U".to_string()]; - args.extend(Self::module_prefix(module)); - args.push("-Dsurefire.failIfNoSpecifiedTests=false".to_string()); - args - } -} - -impl BuildTool for Maven { - fn run_class( - &self, - file: &str, - package: &str, - class: &str, - outer: Option<&str>, - ) -> TaskCommand { - let module = self.find_module(file); - let full_name = full_class_name(package, class, outer); - let is_test = file.contains("/src/test/"); - let compile_goal = if is_test { "test-compile" } else { "compile" }; - let classpath_scope = if is_test { "test" } else { "runtime" }; - - let mut args = vec![compile_goal.to_string(), "exec:java".to_string()]; - args.extend(Self::module_prefix(&module)); - args.push(format!("-Dexec.mainClass={}", full_name)); - args.push(format!("-Dexec.classpathScope={}", classpath_scope)); - - task(self.command(), args, self.cwd(), Self::debug_env()) - } - - fn run_test_method( - &self, - file: &str, - package: &str, - class: &str, - outer: Option<&str>, - method: &str, - ) -> TaskCommand { - let module = self.find_module(file); - let test_filter = Self::test_filter(package, class, outer, Some(method)); - - let mut args = Self::test_args(&module); - args.push(format!("-Dtest={}", test_filter)); - if let Some(a) = Self::debug_arg() { - args.push(a); - } - - task(self.command(), args, self.cwd(), Self::debug_env()) - } - - fn run_test_class( - &self, - file: &str, - package: &str, - class: &str, - outer: Option<&str>, - ) -> TaskCommand { - let module = self.find_module(file); - let test_filter = Self::test_filter(package, class, outer, None); - - let mut args = Self::test_args(&module); - args.push(format!("-Dtest={}", test_filter)); - if let Some(a) = Self::debug_arg() { - args.push(a); - } - - task(self.command(), args, self.cwd(), Self::debug_env()) - } - - fn run_all_tests(&self, file: &str) -> TaskCommand { - let module = self.find_module(file); - - let mut args = Self::test_args(&module); - if let Some(a) = Self::debug_arg() { - args.push(a); - } - - task(self.command(), args, self.cwd(), Self::debug_env()) - } -} diff --git a/task_helper/src/build_tool/mod.rs b/task_helper/src/build_tool/mod.rs deleted file mode 100644 index e14bcef..0000000 --- a/task_helper/src/build_tool/mod.rs +++ /dev/null @@ -1,318 +0,0 @@ -use crate::command::TaskCommand; -use std::env; -use std::path::{Path, PathBuf}; - -pub mod gradle; -pub mod maven; -pub mod vanilla; - -fn canonicalize_clean(path: &Path) -> PathBuf { - let c = path.canonicalize().unwrap_or_else(|_| path.to_path_buf()); - let s = c.to_string_lossy(); - if let Some(stripped) = s.strip_prefix(r"\\?\") { - PathBuf::from(stripped) - } else { - c - } -} - -pub fn full_class_name(package: &str, class: &str, outer: Option<&str>) -> String { - let full_class = match outer { - Some(o) => format!("{}${}", o, class), - None => class.to_string(), - }; - if package.is_empty() { - full_class - } else { - format!("{}.{}", package, full_class) - } -} - -pub fn task( - command: String, - args: Vec, - cwd: String, - env: Vec<(String, String)>, -) -> TaskCommand { - TaskCommand { - command, - args, - cwd, - env, - then: vec![], - } -} - -pub trait BuildTool { - fn run_class(&self, file: &str, package: &str, class: &str, outer: Option<&str>) - -> TaskCommand; - fn run_test_method( - &self, - file: &str, - package: &str, - class: &str, - outer: Option<&str>, - method: &str, - ) -> TaskCommand; - fn run_test_class( - &self, - file: &str, - package: &str, - class: &str, - outer: Option<&str>, - ) -> TaskCommand; - fn run_all_tests(&self, file: &str) -> TaskCommand; -} - -pub fn detect_build_tool(cwd: &Path) -> (Box, PathBuf) { - let cwd = canonicalize_clean(cwd); - - // Walk up from cwd to find the highest directory with a build marker file. - // This determines the project root, ensuring gradlew/mvnw are found - // regardless of where in the project tree the user opened the file. - let root = walk_up_to_highest_marker(&cwd).unwrap_or(cwd); - - if root.join("pom.xml").exists() { - (Box::new(maven::Maven::new(root.clone())), root) - } else if root.join("build.gradle").exists() - || root.join("build.gradle.kts").exists() - || root.join("settings.gradle").exists() - || root.join("settings.gradle.kts").exists() - { - (Box::new(gradle::Gradle::new(root.clone())), root) - } else { - (Box::new(vanilla::Vanilla::new(root.clone())), root) - } -} - -/// Walk up from `start` to the filesystem root, returning the *highest* -/// directory that contains a build marker file (pom.xml, build.gradle, -/// build.gradle.kts, settings.gradle, settings.gradle.kts). -fn walk_up_to_highest_marker(start: &Path) -> Option { - let mut current = Some(start); - let mut highest = None; - while let Some(dir) = current { - if dir.join("pom.xml").exists() - || dir.join("build.gradle").exists() - || dir.join("build.gradle.kts").exists() - || dir.join("settings.gradle").exists() - || dir.join("settings.gradle.kts").exists() - { - highest = Some(dir.to_path_buf()); - } - current = dir.parent(); - } - highest -} - -pub fn get_workspace_root(file: Option<&str>) -> (Box, PathBuf) { - let start = file - .and_then(|f| Path::new(f).parent().map(|p| p.to_path_buf())) - .unwrap_or_else(|| env::current_dir().unwrap_or_default()); - detect_build_tool(&start) -} - -pub fn find_closest_module(file_path: &str, root: &Path, marker_files: &[&str]) -> Option { - let file_path = Path::new(file_path); - let current_abs = if file_path.is_absolute() { - if file_path.is_file() { - file_path.parent().map(|p| p.to_path_buf()) - } else { - Some(file_path.to_path_buf()) - } - } else { - let abs = root.join(file_path); - if abs.is_file() { - abs.parent().map(|p| p.to_path_buf()) - } else { - Some(abs) - } - }; - - let abs_root = canonicalize_clean(root); - - let mut current_opt = current_abs; - while let Some(current) = current_opt { - let current_canonical = canonicalize_clean(¤t); - if !current_canonical.starts_with(&abs_root) { - break; - } - - for marker in marker_files { - if current.join(marker).exists() { - let rel = current_canonical - .strip_prefix(&abs_root) - .ok() - .map(|p| p.to_path_buf()); - if let Some(ref p) = rel { - if p.as_os_str().is_empty() { - return None; // Root module - } - } - return rel; - } - } - - if current_canonical == abs_root { - break; - } - - current_opt = current.parent().map(|p| p.to_path_buf()); - } - None -} - -#[cfg(windows)] -pub fn which_wrapper(root: &Path, tool_name: &str) -> String { - let wrapper_path = root.join("gradlew.bat"); - if wrapper_path.exists() { - eprintln!("Detected {} project. Using gradlew.bat wrapper.", tool_name); - return wrapper_path.to_string_lossy().to_string(); - } - let wrapper_path = root.join("mvnw.cmd"); - if wrapper_path.exists() { - eprintln!("Detected {} project. Using mvnw.cmd wrapper.", tool_name); - return wrapper_path.to_string_lossy().to_string(); - } - eprintln!( - "Detected {} project. No wrapper found, using {}.", - tool_name, tool_name - ); - tool_name.to_string() -} - -#[cfg(not(windows))] -pub fn which_wrapper(root: &Path, tool_name: &str) -> String { - let wrapper_path = root.join("gradlew"); - if wrapper_path.exists() { - eprintln!("Detected {} project. Using ./gradlew wrapper.", tool_name); - "./gradlew".to_string() - } else if root.join("mvnw").exists() { - eprintln!("Detected {} project. Using ./mvnw wrapper.", tool_name); - "./mvnw".to_string() - } else { - eprintln!( - "Detected {} project. No wrapper found, using {}.", - tool_name, tool_name - ); - tool_name.to_string() - } -} - -#[cfg(test)] -mod tests { - use super::*; - use std::fs::{self, File}; - use tempfile::tempdir; - - #[test] - fn test_detect_maven() { - let dir = tempdir().unwrap(); - File::create(dir.path().join("pom.xml")).unwrap(); - - let (_tool, root) = detect_build_tool(dir.path()); - // Since we return Box, we can't easily assert type, - // but we can check the root. - assert_eq!(root, dir.path().canonicalize().unwrap()); - } - - #[test] - fn test_detect_build_tool_walks_up_to_highest_marker() { - // Multi-module project: root has settings.gradle, submodule has build.gradle. - // detect_build_tool should return the root (highest), not the submodule. - let root_dir = tempdir().unwrap(); - let root_path = root_dir.path().canonicalize().unwrap(); - File::create(root_path.join("settings.gradle")).unwrap(); - - let sub_dir = root_path.join("module-a"); - fs::create_dir(&sub_dir).unwrap(); - File::create(sub_dir.join("build.gradle")).unwrap(); - - let deep_path = sub_dir.join("src/main/java/com/example/App.java"); - fs::create_dir_all(deep_path.parent().unwrap()).unwrap(); - File::create(&deep_path).unwrap(); - - // Call detect_build_tool with a deep file dir — should walk up to root - let (_tool, root) = detect_build_tool(deep_path.parent().unwrap()); - assert_eq!(root, root_path); - - // Call from submodule dir — should still walk up to root - let (_tool, root) = detect_build_tool(&sub_dir); - assert_eq!(root, root_path); - } - - #[test] - fn test_detect_build_tool_walks_up_from_deep_directory() { - // Project with pom.xml at root, file deep in tree. - // detect_build_tool should walk up and find the root. - let dir = tempdir().unwrap(); - let dir_path = dir.path().canonicalize().unwrap(); - File::create(dir_path.join("pom.xml")).unwrap(); - - let deep_dir = dir_path.join("src/main/java/com/example"); - fs::create_dir_all(&deep_dir).unwrap(); - - let (_tool, root) = detect_build_tool(&deep_dir); - assert_eq!(root, dir_path); - } - - #[test] - fn test_detect_build_tool_no_marker_returns_vanilla_and_cwd() { - let dir = tempdir().unwrap(); - let dir_path = dir.path().canonicalize().unwrap(); - let (_tool, root) = detect_build_tool(&dir_path); - assert_eq!(root, dir_path); - } - - #[test] - fn test_detect_build_tool_single_module() { - // Simple single-module project: just build.gradle, no settings file. - let dir = tempdir().unwrap(); - let dir_path = dir.path().canonicalize().unwrap(); - File::create(dir_path.join("build.gradle")).unwrap(); - - let file = dir_path.join("src/main/java/App.java"); - fs::create_dir_all(file.parent().unwrap()).unwrap(); - File::create(&file).unwrap(); - - let (_tool, root) = detect_build_tool(file.parent().unwrap()); - assert_eq!(root, dir_path); - } - - #[test] - fn test_find_closest_module_maven() { - let root_dir = tempdir().unwrap(); - let root_path = root_dir.path().canonicalize().unwrap(); - File::create(root_path.join("pom.xml")).unwrap(); - - let sub_dir = root_path.join("module-a"); - fs::create_dir(&sub_dir).unwrap(); - File::create(sub_dir.join("pom.xml")).unwrap(); - - let file_path = sub_dir.join("src/main/java/App.java"); - fs::create_dir_all(file_path.parent().unwrap()).unwrap(); - File::create(&file_path).unwrap(); - - let module = find_closest_module(file_path.to_str().unwrap(), &root_path, &["pom.xml"]); - assert_eq!(module, Some(PathBuf::from("module-a"))); - } - - #[test] - fn test_find_closest_module_gradle() { - let root_dir = tempdir().unwrap(); - let root_path = root_dir.path().canonicalize().unwrap(); - File::create(root_path.join("settings.gradle")).unwrap(); - - let sub_dir = root_path.join("module-b"); - fs::create_dir(&sub_dir).unwrap(); - File::create(sub_dir.join("build.gradle")).unwrap(); - - let file_path = sub_dir.join("src/main/java/App.java"); - fs::create_dir_all(file_path.parent().unwrap()).unwrap(); - File::create(&file_path).unwrap(); - - let module = - find_closest_module(file_path.to_str().unwrap(), &root_path, &["build.gradle"]); - assert_eq!(module, Some(PathBuf::from("module-b"))); - } -} diff --git a/task_helper/src/build_tool/vanilla.rs b/task_helper/src/build_tool/vanilla.rs deleted file mode 100644 index a966239..0000000 --- a/task_helper/src/build_tool/vanilla.rs +++ /dev/null @@ -1,110 +0,0 @@ -use crate::build_tool::{full_class_name, task, BuildTool}; -use crate::command::TaskCommand; -use crate::{get_jdwp_args, is_debug}; -use std::path::PathBuf; - -#[cfg(windows)] -fn echo_command() -> (String, Vec) { - ( - "cmd".to_string(), - vec!["/C".to_string(), "echo".to_string()], - ) -} - -#[cfg(not(windows))] -fn echo_command() -> (String, Vec) { - ("echo".to_string(), vec![]) -} - -pub struct Vanilla { - root: PathBuf, -} - -impl Vanilla { - pub fn new(root: PathBuf) -> Self { - Self { root } - } - - fn cwd(&self) -> String { - self.root.to_string_lossy().to_string() - } - - fn no_build_tool(&self) -> TaskCommand { - let (cmd, mut args) = echo_command(); - args.push("No build tool found".to_string()); - task(cmd, args, self.cwd(), vec![]) - } -} - -impl BuildTool for Vanilla { - fn run_class( - &self, - file: &str, - package: &str, - class: &str, - outer: Option<&str>, - ) -> TaskCommand { - let full_name = full_class_name(package, class, outer); - let is_simple = package.is_empty() && outer.is_none(); - - if is_simple { - let mut args = vec![]; - if is_debug() { - args.push(get_jdwp_args()); - } - args.push(file.to_string()); - return task("java".to_string(), args, self.cwd(), vec![]); - } - - let mut run_args = vec!["-cp".to_string(), "bin".to_string()]; - if is_debug() { - run_args.push(get_jdwp_args()); - } - run_args.push(full_name); - - let compile = task( - "javac".to_string(), - vec![ - "-d".to_string(), - "bin".to_string(), - "-sourcepath".to_string(), - ".".to_string(), - file.to_string(), - ], - self.cwd(), - vec![], - ); - - let run = task("java".to_string(), run_args, self.cwd(), vec![]); - - TaskCommand { - then: vec![run], - ..compile - } - } - - fn run_test_method( - &self, - _file: &str, - _package: &str, - _class: &str, - _outer: Option<&str>, - _method: &str, - ) -> TaskCommand { - self.no_build_tool() - } - - fn run_test_class( - &self, - _file: &str, - _package: &str, - _class: &str, - _outer: Option<&str>, - ) -> TaskCommand { - self.no_build_tool() - } - - fn run_all_tests(&self, _file: &str) -> TaskCommand { - self.no_build_tool() - } -} diff --git a/task_helper/src/command.rs b/task_helper/src/command.rs deleted file mode 100644 index 36306e7..0000000 --- a/task_helper/src/command.rs +++ /dev/null @@ -1,46 +0,0 @@ -use serde::Serialize; -use std::process::{self, Command}; - -#[derive(Serialize)] -pub struct TaskCommand { - pub command: String, - pub args: Vec, - pub cwd: String, - #[serde(skip_serializing_if = "Vec::is_empty", default)] - pub env: Vec<(String, String)>, - #[serde(skip_serializing_if = "Vec::is_empty", default)] - pub then: Vec, -} - -impl TaskCommand { - pub fn execute(self) { - let mut cmd = Command::new(&self.command); - cmd.args(&self.args); - cmd.current_dir(&self.cwd); - for (k, v) in &self.env { - cmd.env(k, v); - } - - cmd.stdin(process::Stdio::inherit()); - cmd.stdout(process::Stdio::inherit()); - cmd.stderr(process::Stdio::inherit()); - - let mut child = cmd.spawn().unwrap_or_else(|e| { - eprintln!("Failed to execute {}: {}", self.command, e); - process::exit(1); - }); - - let status = child.wait().unwrap_or_else(|e| { - eprintln!("Failed to wait for {}: {}", self.command, e); - process::exit(1); - }); - - if !status.success() { - process::exit(status.code().unwrap_or(1)); - } - - for next in self.then { - next.execute(); - } - } -} diff --git a/task_helper/src/main.rs b/task_helper/src/main.rs deleted file mode 100644 index b9676bb..0000000 --- a/task_helper/src/main.rs +++ /dev/null @@ -1,173 +0,0 @@ -mod build_tool; -mod command; -mod platform_paths; - -use crate::build_tool::get_workspace_root; -use std::env; - -fn main() { - let args: Vec = env::args().skip(1).collect(); - if args.is_empty() { - println!("java-task-helper: no arguments provided"); - return; - } - - let subcommand = &args[0]; - println!("java-task-helper: running subcommand={}", subcommand); - - if subcommand == "clear-cache" { - task_clear_cache(); - return; - } - - let file_path = args.get(1).map(|s| s.as_str()); - let (tool, root) = get_workspace_root(file_path); - println!( - "java-task-helper: workspace root={}", - root.to_string_lossy() - ); - - let result = match subcommand.as_str() { - "run-class" => { - if args.len() < 4 { - eprintln!( - "java-task-helper: run-class requires at least 4 arguments, got {}", - args.len() - ); - return; - } - let file = &args[1]; - let package = &args[2]; - let class = &args[3]; - let outer = args.get(4).filter(|s| !s.is_empty()).map(|s| s.as_str()); - Some(tool.run_class(file, package, class, outer)) - } - "run-test-method" => { - // Accept 5 or 6 args. On Windows, the iex invocation in tasks.json - // sometimes drops the empty-string outer-class argument, producing - // 5 positional args: subcommand, file, package, class, method. - if args.len() == 5 { - let file = &args[1]; - let package = &args[2]; - let class = &args[3]; - let method = &args[4]; - println!( - "java-task-helper: run-test-method file={} package={} class={} method={}", - file, package, class, method - ); - Some(tool.run_test_method(file, package, class, None, method)) - } else if args.len() >= 6 { - let file = &args[1]; - let package = &args[2]; - let class = &args[3]; - let outer = args.get(4).filter(|s| !s.is_empty()).map(|s| s.as_str()); - let method = &args[5]; - println!( - "java-task-helper: run-test-method file={} package={} class={} outer={:?} method={}", - file, package, class, outer, method - ); - Some(tool.run_test_method(file, package, class, outer, method)) - } else { - eprintln!( - "java-task-helper: run-test-method requires 5 or 6 arguments, got {}", - args.len() - ); - return; - } - } - "run-test-class" => { - if args.len() < 4 { - eprintln!( - "java-task-helper: run-test-class requires at least 4 arguments, got {}", - args.len() - ); - return; - } - let file = &args[1]; - let package = &args[2]; - let class = &args[3]; - let outer = args.get(4).filter(|s| !s.is_empty()).map(|s| s.as_str()); - Some(tool.run_test_class(file, package, class, outer)) - } - "run-all-tests" => { - if args.len() < 2 { - eprintln!( - "java-task-helper: run-all-tests requires at least 2 arguments, got {}", - args.len() - ); - return; - } - let file = &args[1]; - Some(tool.run_all_tests(file)) - } - _ => { - eprintln!("java-task-helper: unknown subcommand '{}'", subcommand); - None - } - }; - - if let Some(cmd) = result { - // Output JSON for transparency/debugging - if let Ok(json) = serde_json::to_string(&cmd) { - println!("{}", json); - } else { - eprintln!("java-task-helper: failed to serialize task command"); - } - // Execute the task - println!( - "java-task-helper: executing command={} args={:?}", - cmd.command, cmd.args - ); - cmd.execute(); - println!("java-task-helper: command finished"); - } -} - -pub fn is_debug() -> bool { - env::var("ZED_JAVA_DEBUG").unwrap_or_default() == "1" -} - -pub fn get_debug_port() -> String { - env::var("ZED_JAVA_DEBUG_PORT").unwrap_or_else(|_| "5005".to_string()) -} - -pub fn get_jdwp_args() -> String { - format!( - "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address={}", - get_debug_port() - ) -} - -fn task_clear_cache() { - let cache_dir = platform_paths::get_jdtls_cache_dir(); - - if !cache_dir.exists() { - println!("No JDTLS cache found"); - return; - } - - let mut cleared = false; - if let Ok(entries) = std::fs::read_dir(&cache_dir) { - for entry in entries.flatten() { - let path = entry.path(); - if path.is_dir() { - if let Some(name) = path.file_name().and_then(|n| n.to_str()) { - if name.starts_with("jdtls-") { - if let Err(e) = std::fs::remove_dir_all(&path) { - eprintln!("Failed to remove cache directory {:?}: {}", path, e); - } else { - println!("Removed cache directory {:?}", path); - cleared = true; - } - } - } - } - } - } - - if cleared { - println!("JDTLS cache cleared. Restart the language server"); - } else { - println!("No JDTLS cache found"); - } -} diff --git a/task_helper/src/platform_paths.rs b/task_helper/src/platform_paths.rs deleted file mode 100644 index 74abeac..0000000 --- a/task_helper/src/platform_paths.rs +++ /dev/null @@ -1,29 +0,0 @@ -use std::env; -use std::path::PathBuf; - -#[cfg(target_os = "macos")] -pub fn get_jdtls_cache_dir() -> PathBuf { - if let Ok(xdg) = env::var("XDG_CACHE_HOME") { - return PathBuf::from(xdg); - } - env::var("HOME") - .map(|h| PathBuf::from(h).join("Library").join("Caches")) - .unwrap_or_default() -} - -#[cfg(target_os = "windows")] -pub fn get_jdtls_cache_dir() -> PathBuf { - env::var("APPDATA") - .map(|h| PathBuf::from(h).join("Java").join("JDTLS")) - .unwrap_or_default() -} - -#[cfg(target_os = "linux")] -pub fn get_jdtls_cache_dir() -> PathBuf { - if let Ok(xdg) = env::var("XDG_CACHE_HOME") { - return PathBuf::from(xdg); - } - env::var("HOME") - .map(|h| PathBuf::from(h).join(".cache")) - .unwrap_or_default() -} diff --git a/tests/languages/java/snapshots/runnables_default_package.snap b/tests/languages/java/snapshots/runnables_default_package.snap index 43b0d0e..ae55a3b 100644 --- a/tests/languages/java/snapshots/runnables_default_package.snap +++ b/tests/languages/java/snapshots/runnables_default_package.snap @@ -1,6 +1,5 @@ --- source: tests/support/mod.rs -assertion_line: 82 expression: captures --- - name: _ diff --git a/tests/languages/java/snapshots/runnables_multi_level.snap b/tests/languages/java/snapshots/runnables_multi_level.snap index 75701a7..62ab971 100644 --- a/tests/languages/java/snapshots/runnables_multi_level.snap +++ b/tests/languages/java/snapshots/runnables_multi_level.snap @@ -1,6 +1,5 @@ --- source: tests/support/mod.rs -assertion_line: 82 expression: captures --- - name: java_package_name diff --git a/tests/languages/java/snapshots/runnables_single_level.snap b/tests/languages/java/snapshots/runnables_single_level.snap index 7c9c41b..4f8f55b 100644 --- a/tests/languages/java/snapshots/runnables_single_level.snap +++ b/tests/languages/java/snapshots/runnables_single_level.snap @@ -1,6 +1,5 @@ --- source: tests/support/mod.rs -assertion_line: 82 expression: captures --- - name: java_package_name diff --git a/tests/parse_test.rs b/tests/parse_test.rs deleted file mode 100644 index 6c7c7a4..0000000 --- a/tests/parse_test.rs +++ /dev/null @@ -1,60 +0,0 @@ -use tree_sitter::Parser; - -#[test] -fn parse_simplified_main() { - let source = r#"public class HelloWorld { - main(String[] args) { - IO.println("Hello, World!"); - } -}"#; - let mut parser = Parser::new(); - let language = tree_sitter_java::LANGUAGE.into(); - parser.set_language(&language).unwrap(); - let tree = parser.parse(source, None).unwrap(); - let root = tree.root_node(); - - println!("has_error: {}", root.has_error()); - println!( - "root kind: {:?} children: {}", - root.kind(), - root.child_count() - ); - dump_tree(source, root, 0); - - // The class body should have children - // If main is an ERROR node, this won't have a method_declaration - assert!( - !root.has_error(), - "Parser reported error for simplified main()" - ); -} - -fn dump_tree(source: &str, node: tree_sitter::Node, indent: usize) { - let prefix = " ".repeat(indent); - let kind = node.kind(); - let start = node.start_position(); - let end = node.end_position(); - if node.child_count() == 0 { - let text = node.utf8_text(source.as_bytes()).unwrap_or(""); - println!( - "{}{} [{},{} - {},{}] {:?}", - prefix, kind, start.row, start.column, end.row, end.column, text - ); - } else { - println!( - "{}{} [{},{} - {},{}] ({} children)", - prefix, - kind, - start.row, - start.column, - end.row, - end.column, - node.child_count() - ); - for i in 0..node.child_count() { - if let Some(child) = node.child(i as u32) { - dump_tree(source, child, indent + 1); - } - } - } -} diff --git a/tests/task_verification_test.rs b/tests/task_verification_test.rs index 56a7ea8..20f1a40 100644 --- a/tests/task_verification_test.rs +++ b/tests/task_verification_test.rs @@ -135,67 +135,6 @@ impl Drop for TestProject { let _ = fs::remove_dir_all(&self.temp_dir); } } - -static BUILD_HELPER: std::sync::OnceLock = std::sync::OnceLock::new(); - -fn ensure_task_helper_built() -> PathBuf { - BUILD_HELPER - .get_or_init(|| { - let manifest_dir = std::env::var("CARGO_MANIFEST_DIR") - .map(PathBuf::from) - .unwrap_or_else(|_| std::env::current_dir().unwrap()); - - let mut cmd = std::process::Command::new("cargo"); - cmd.current_dir(&manifest_dir); - cmd.env_remove("CARGO_BUILD_TARGET"); - cmd.args([ - "build", - "-p", - "java-task-helper", - "--bin", - "java-task-helper", - "--message-format=json", - ]); - if !cfg!(debug_assertions) { - cmd.arg("--release"); - } - - let output = cmd - .output() - .expect("failed to run cargo build for java-task-helper"); - assert!( - output.status.success(), - "cargo build -p java-task-helper failed:\n{}", - String::from_utf8_lossy(&output.stderr) - ); - - let stdout = String::from_utf8_lossy(&output.stdout); - let mut found_path = None; - for line in stdout.lines() { - if let Ok(val) = serde_json::from_str::(line) { - let is_target_bin = val["target"]["kind"] - .as_array() - .is_some_and(|k| k.iter().any(|kind| kind == "bin")); - if val["reason"] == "compiler-artifact" - && val["target"]["name"] == "java-task-helper" - && is_target_bin - { - found_path = val["filenames"] - .as_array() - .and_then(|files| files.first()) - .and_then(|f| f.as_str()) - .map(PathBuf::from); - } - } - } - - found_path.expect( - "Could not find compiler artifact filename for java-task-helper in cargo build output", - ) - }) - .clone() -} - struct TaskRunner<'a> { project: &'a TestProject, command: String, @@ -231,21 +170,6 @@ impl<'a> TaskRunner<'a> { fn run(self) -> String { let mut cmd = std::process::Command::new("sh"); - - let found_bin = ensure_task_helper_built(); - - // Create a temporary ZED_EXT directory structure matching what tasks.json expects - let zed_ext_base = self.project.temp_dir.join("mock_zed_ext"); - let zed_ext_dir = zed_ext_base.join("zed/extensions/work/java/task-bin"); - fs::create_dir_all(&zed_ext_dir).unwrap(); - let dest_bin = zed_ext_dir.join("java-task-helper"); - fs::copy(&found_bin, &dest_bin).unwrap(); - #[cfg(unix)] - { - use std::os::unix::fs::PermissionsExt; - fs::set_permissions(&dest_bin, fs::Permissions::from_mode(0o755)).unwrap(); - } - cmd.arg("-c") .arg(&self.command) .env("ZED_FILE", self.zed_file.to_string_lossy().to_string()) @@ -253,7 +177,6 @@ impl<'a> TaskRunner<'a> { .env("ZED_CUSTOM_java_package_name", &self.package) .env("ZED_CUSTOM_java_class_name", &self.class) .env("PATH", &self.project.new_path) - .env("XDG_DATA_HOME", zed_ext_base.to_string_lossy().to_string()) .current_dir(&self.project.temp_dir); for (k, v) in self.extra_env { @@ -261,14 +184,6 @@ impl<'a> TaskRunner<'a> { } let output = cmd.output().expect("Failed to execute shell command"); - if !output.status.success() { - panic!( - "Shell command failed with status: {:?}\nStdout: {}\nStderr: {}", - output.status, - String::from_utf8_lossy(&output.stdout), - String::from_utf8_lossy(&output.stderr) - ); - } String::from_utf8_lossy(&output.stdout).to_string() } } @@ -286,7 +201,7 @@ fn test_maven_single_module_command_logic() { .run(); assert!( - stdout.contains("MVN_CALLED: compile exec:java"), + stdout.contains("MVN_CALLED: clean compile exec:java -Dexec.mainClass=com.example.Main"), "Should run as single module. Got: {}", stdout ); @@ -297,7 +212,7 @@ fn test_maven_single_module_command_logic() { ); assert!( stdout_test - .contains("MVN_CALLED: test-compile exec:java -Dexec.mainClass=com.example.Main"), + .contains("MVN_CALLED: clean test-compile exec:java -Dexec.mainClass=com.example.Main"), "Should run as single module. Got: {}", stdout_test ); @@ -319,12 +234,12 @@ fn test_maven_multi_module_command_logic() { .run(); assert!( - stdout.contains("MVN_CALLED: compile exec:java -pl module-a -am"), + stdout.contains("MVN_CALLED: clean compile -pl module-a -am"), "Should build submodule with dependencies. Got: {}", stdout ); assert!( - stdout.contains("-Dexec.mainClass=com.example.Main"), + stdout.contains("MVN_CALLED: exec:java -pl module-a"), "Should run only the submodule. Got: {}", stdout ); @@ -335,12 +250,12 @@ fn test_maven_multi_module_command_logic() { ); assert!( - stdout_test.contains("MVN_CALLED: test-compile exec:java -pl module-a -am"), + stdout_test.contains("MVN_CALLED: clean test-compile -pl module-a -am"), "Should build submodule with dependencies. Got: {}", stdout_test ); assert!( - stdout_test.contains("-Dexec.mainClass=com.example.Main"), + stdout_test.contains("MVN_CALLED: exec:java -pl module-a"), "Should run only the submodule. Got: {}", stdout_test ); @@ -361,12 +276,12 @@ fn test_maven_nested_module_command_logic() { .run(); assert!( - stdout.contains("MVN_CALLED: test-compile exec:java -pl nested/module-b -am"), + stdout.contains("MVN_CALLED: clean test-compile -pl nested/module-b -am"), "Should build nested submodule with dependencies. Got: {}", stdout ); assert!( - stdout.contains("-Dexec.mainClass=com.example.Main"), + stdout.contains("MVN_CALLED: exec:java -pl nested/module-b"), "Should run only the nested submodule. Got: {}", stdout ); @@ -382,14 +297,12 @@ fn test_maven_multi_module_test_method_logic() { .run(); assert!( - stdout.contains("MVN_CALLED: test") - && stdout.contains("-U") - && stdout.contains("-pl module-a -am"), + stdout.contains("MVN_CALLED: clean test-compile -pl module-a -am"), "Should build submodule with dependencies. Got: {}", stdout ); assert!( - stdout.contains("-Dtest=com.example.Main#shouldPersist"), + stdout.contains("MVN_CALLED: test -pl module-a -Dtest=com.example.Main#shouldPersist"), "Should run only the submodule test. Got: {}", stdout ); @@ -407,7 +320,7 @@ fn test_maven_nested_class_test_method_logic() { .run(); assert!( - stdout.contains("-Dtest=com.example.Outer$Inner#testMe"), + stdout.contains("MVN_CALLED: test -pl module-a -Dtest=com.example.Outer$Inner#testMe"), "Should run nested class test method correctly. Got: {}", stdout ); @@ -420,14 +333,12 @@ fn test_maven_run_all_tests_logic() { let stdout = project.task("java-test-all").run(); assert!( - stdout.contains("MVN_CALLED: test") - && stdout.contains("-U") - && stdout.contains("-pl module-a -am"), + stdout.contains("MVN_CALLED: clean test-compile -pl module-a -am"), "Should build submodule with dependencies. Got: {}", stdout ); assert!( - stdout.contains("-pl module-a -am"), + stdout.contains("MVN_CALLED: test -pl module-a"), "Should run all tests in submodule. Got: {}", stdout ); @@ -440,14 +351,12 @@ fn test_maven_test_class_logic() { let stdout = project.task("java-test-class").run(); assert!( - stdout.contains("MVN_CALLED: test") - && stdout.contains("-U") - && stdout.contains("-pl module-a -am"), + stdout.contains("MVN_CALLED: clean test-compile -pl module-a -am"), "Should build submodule with dependencies. Got: {}", stdout ); assert!( - stdout.contains("-Dtest=com.example.Main"), + stdout.contains("MVN_CALLED: test -pl module-a -Dtest=com.example.Main"), "Should run only the submodule test class. Got: {}", stdout ); @@ -762,10 +671,15 @@ fn test_no_build_tool_command_logic() { stdout ); assert!( - stdout.contains(&project.zed_file.to_string_lossy().to_string()), + stdout.contains("./src/main/java/com/example/Main.java"), "Should compile Main.java. Got: {}", stdout ); + assert!( + stdout.contains("./src/test/java/com/example/MainTest.java"), + "Should compile MainTest.java. Got: {}", + stdout + ); assert!( stdout.contains("JAVA_CALLED: -cp bin com.example.Main"), "Should run with java. Got: {}",