Skip to content

Commit dc39be4

Browse files
committed
Support Create workspace edit operation.
Fixes #51
1 parent 434529c commit dc39be4

File tree

3 files changed

+44
-28
lines changed

3 files changed

+44
-28
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
## [Unreleased]
44

5+
- Support Create workspace edit operation. Fixes #51
6+
57
## 2.5.0
68

79
- Add syntax highlighting to Clojure documentation codeblocks

src/main/clojure/com/github/clojure_lsp/intellij/editor.clj

Lines changed: 40 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
(ns com.github.clojure-lsp.intellij.editor
22
(:require
33
[clojure-lsp.shared :as lsp.shared]
4+
[clojure.java.io :as io]
45
[com.github.clojure-lsp.intellij.editor :as editor]
56
[com.github.ericdallo.clj4intellij.app-manager :as app-manager]
67
[com.github.ericdallo.clj4intellij.util :as util])
@@ -11,7 +12,7 @@
1112
[com.intellij.openapi.project Project ProjectLocator]
1213
[com.intellij.openapi.util TextRange]
1314
[com.intellij.openapi.util.text StringUtil]
14-
[com.intellij.openapi.vfs VirtualFile]
15+
[com.intellij.openapi.vfs VfsUtil VirtualFile]
1516
[com.intellij.psi PsiFile]
1617
[com.intellij.psi PsiManager]))
1718

@@ -56,9 +57,42 @@
5657
(.guessProjectForFile (ProjectLocator/getInstance)
5758
v-file))
5859

60+
(defn ^:private create-document
61+
[{:keys [uri]}]
62+
(let [f (io/file (java.net.URI. uri))
63+
parent-vfile (VfsUtil/createDirectories (.getAbsolutePath (.getParentFile f)))]
64+
(.findOrCreateChildData parent-vfile nil (.getName f))))
65+
66+
(defn ^:private apply-document-change
67+
[{{:keys [uri]} :text-document :keys [edits]} project move-caret?]
68+
(let [editor (util/uri->editor uri project false)
69+
document (.getDocument editor)
70+
sorted-edits (sort-by (comp #(document+position->offset % document) :start :range) > edits)]
71+
(doseq [{:keys [new-text range]} sorted-edits
72+
:let [start (document+position->offset (:start range) document)
73+
end (document+position->offset (:end range) document)]]
74+
(cond
75+
(>= end 0)
76+
(if (<= (- end start) 0)
77+
(.insertString document start new-text)
78+
(.replaceString document start end new-text))
79+
80+
(= 0 start)
81+
(.setText document new-text)
82+
83+
(> start 0)
84+
(.insertString document start new-text)
85+
86+
:else
87+
(.insertString document (.getTextLength document) (str "\n" new-text)))
88+
(when move-caret?
89+
(.moveToOffset (.getCaretModel editor)
90+
(+ (count new-text) start))))
91+
(.saveDocument (FileDocumentManager/getInstance) document)))
92+
5993
(defn apply-workspace-edit ^Boolean
6094
[^Project project label move-caret? {:keys [document-changes]}]
61-
;; TODO Handle resourceOperations like creating, renaming and deleting files
95+
;; TODO Handle more resourceOperations like renaming and deleting files
6296
;; TODO Improve to check version to known if file changed
6397
(app-manager/invoke-later!
6498
{:invoke-fn
@@ -71,29 +105,7 @@
71105
:project project
72106
:command-fn
73107
(fn []
74-
(doseq [{{:keys [uri]} :text-document
75-
:keys [edits]} document-changes
76-
:let [editor (util/uri->editor uri project false)
77-
document (.getDocument editor)
78-
sorted-edits (sort-by (comp #(document+position->offset % document) :start :range) > edits)]]
79-
(doseq [{:keys [new-text range]} sorted-edits
80-
:let [start (document+position->offset (:start range) document)
81-
end (document+position->offset (:end range) document)]]
82-
(cond
83-
(>= end 0)
84-
(if (<= (- end start) 0)
85-
(.insertString document start new-text)
86-
(.replaceString document start end new-text))
87-
88-
(= 0 start)
89-
(.setText document new-text)
90-
91-
(> start 0)
92-
(.insertString document start new-text)
93-
94-
:else
95-
nil)
96-
(when move-caret?
97-
(.moveToOffset (.getCaretModel editor)
98-
(+ (count new-text) start))))
99-
(.saveDocument (FileDocumentManager/getInstance) document)))}))}))}))
108+
(doseq [document-change document-changes]
109+
(case (:kind document-change)
110+
"create" (create-document document-change)
111+
(apply-document-change document-change project move-caret?))))}))}))}))

src/main/clojure/com/github/clojure_lsp/intellij/workspace_edit.clj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
[com.github.clojure-lsp.intellij.client :as lsp-client]
44
[com.github.clojure-lsp.intellij.editor :as editor]
55
[com.github.ericdallo.clj4intellij.app-manager :as app-manager]
6+
[com.github.ericdallo.clj4intellij.logger :as logger]
67
[com.github.ericdallo.clj4intellij.util :as util]))
78

89
(set! *warn-on-reflection* true)
@@ -14,6 +15,7 @@
1415
(defmethod lsp-client/show-document :default [{:keys [project]} {:keys [uri take-focus selection]}]
1516
(app-manager/invoke-later!
1617
{:invoke-fn (fn []
18+
(logger/info "--------->" uri (util/uri->v-file uri))
1719
(let [editor (util/uri->editor uri project (boolean take-focus))]
1820
(.moveToOffset (.getCaretModel editor)
1921
(editor/document+position->offset (:start selection) (.getDocument editor)))))})

0 commit comments

Comments
 (0)