Skip to content

Commit bbb05f9

Browse files
committed
add zig lsp extractor
1 parent 7f54f43 commit bbb05f9

File tree

4 files changed

+57
-6
lines changed

4 files changed

+57
-6
lines changed

src/io/github/dundalek/stratify/lsp.clj

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -242,13 +242,24 @@
242242
(let [{:keys [start end]} (:selectionRange sym)]
243243
(str uri "#L" (:line start) "C" (:character start) "-L" (:line end) "C" (:character end))))
244244

245-
(defn extract-graph [{:keys [server root-path source-paths source-pattern]}]
245+
(defn- send-did-open! [server uri file-path]
246+
(server-message! server {:method "textDocument/didOpen"
247+
:params {:textDocument {:uri uri
248+
:languageId "zig"
249+
:version 1
250+
:text (slurp file-path)}}
251+
:jsonrpc "2.0"}))
252+
253+
(defn extract-graph [{:keys [server root-path source-paths source-pattern open-documents?]}]
246254
(let [uri-base (str "file://" root-path "/")
247-
file-uris (->> source-paths
248-
(mapcat (fn [path]
249-
(fs/glob (fs/file root-path path) source-pattern)))
250-
(map path->uri))
255+
file-paths (->> source-paths
256+
(mapcat (fn [path]
257+
(fs/glob (fs/file root-path path) source-pattern))))
258+
file-uris (map path->uri file-paths)
251259
file-uris-set (set file-uris)
260+
_ (when open-documents?
261+
(doseq [[uri path] (map vector file-uris file-paths)]
262+
(send-did-open! server uri (str path))))
252263
symbols (->> file-uris
253264
(mapcat (fn [uri]
254265
(->> (server-request! server "textDocument/documentSymbol"
@@ -415,6 +426,20 @@
415426
(finally
416427
(server-stop! server)))))
417428

429+
(defn extract-zig [opts]
430+
(let [opts (normalize-opts opts)
431+
{:keys [root-path]} opts
432+
server (start-server {:args ["zls"]})]
433+
(try
434+
(server-initialize! server {:root-path root-path})
435+
(extract-graph (merge {:source-paths ["src"]
436+
:source-pattern "**.zig"
437+
:open-documents? true
438+
:server server}
439+
opts))
440+
(finally
441+
(server-stop! server)))))
442+
418443
(defn decode-semantic-tokens [payload token-types token-modifiers]
419444
(let [{:keys [data]} payload]
420445
(loop [[delta-line delta-start-char length token-type-id token-modifiers-bits & remaining] data

src/stratify/main.clj

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
(def ^:private source-formats
2323
#{"clj" "dgml" "dot" "overarch" "pulumi" "scip"
24-
"go-lsp" "lua-lsp" "rust-lsp"})
24+
"go-lsp" "lua-lsp" "rust-lsp" "zig-lsp"})
2525

2626
(def ^:private target-formats #{"codecharta" "dep-tree" "dgml"})
2727

@@ -145,6 +145,10 @@
145145
(let [g (lsp/extract-rust {:root-path (first args)})]
146146
(open-studio g))
147147

148+
(and studio (= from "zig-lsp"))
149+
(let [g (lsp/extract-zig {:root-path (first args)})]
150+
(open-studio g))
151+
148152
(and studio (= from "overarch"))
149153
(do
150154
(add-deps "overarch")
@@ -187,6 +191,10 @@
187191
(let [g (lsp/extract-rust {:root-path (first args)})]
188192
(sdgml/write-to-file output-file (lsp/graph->dgml g)))
189193

194+
(= from "zig-lsp")
195+
(let [g (lsp/extract-zig {:root-path (first args)})]
196+
(sdgml/write-to-file output-file (lsp/graph->dgml g)))
197+
190198
(= from "overarch")
191199
(do
192200
(add-deps "overarch")
@@ -284,6 +292,8 @@
284292

285293
(main* "-f" "rust-lsp" "test/resources/code/rust/greeting")
286294

295+
(main* "-f" "zig-lsp" "test/resources/code/zig/greeting")
296+
287297
(main* "--studio" "-f" "overarch" "test/resources/overarch/model.edn")
288298

289299
(main* "-f" "dot" "test/resources/graphviz/simple.dot")
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"enable_build_on_save": true,
3+
"build_on_save_step": "check"
4+
}

test/src/io/github/dundalek/stratify/lsp_test.clj

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,18 @@
8585
"src/main.rs#L2C3-L2C7" {:label "main", :parent "src/main.rs"}}})
8686
(extract-relative-graph lsp/extract-rust "test/resources/code/rust/greeting"))))
8787

88+
(deftest extract-zig
89+
(is (= (make-digraph
90+
{:adj {"src/main.zig#L3C7-L3C11" #{"src/main.zig#L0C6-L0C9" "src/main.zig#L1C6-L1C14"}}
91+
:attrs {"src" {:category "Namespace", :label "src", :parent nil},
92+
"src/greeting.zig" {:category "Namespace", :label "greeting.zig", :parent "src"},
93+
"src/greeting.zig#L0C7-L0C12" {:label "greet", :parent "src/greeting.zig"},
94+
"src/main.zig" {:category "Namespace", :label "main.zig", :parent "src"},
95+
"src/main.zig#L0C6-L0C9" {:label "std", :parent "src/main.zig"},
96+
"src/main.zig#L1C6-L1C14" {:label "greeting", :parent "src/main.zig"},
97+
"src/main.zig#L3C7-L3C11" {:label "main", :parent "src/main.zig"}}})
98+
(extract-relative-graph lsp/extract-zig "test/resources/code/zig/greeting"))))
99+
88100
(deftest location-less-or-equal?
89101
(is (true? (lsp/location-less-or-equal? {:line 0 :character 0} {:line 0 :character 15})))
90102
(is (true? (lsp/location-less-or-equal? {:line 0 :character 15} {:line 1 :character 1})))

0 commit comments

Comments
 (0)