|
1 | 1 | (ns com.github.clojure-lsp.intellij.editor
|
2 | 2 | (:require
|
3 | 3 | [clojure-lsp.shared :as lsp.shared]
|
| 4 | + [clojure.java.io :as io] |
4 | 5 | [com.github.clojure-lsp.intellij.editor :as editor]
|
5 | 6 | [com.github.ericdallo.clj4intellij.app-manager :as app-manager]
|
6 | 7 | [com.github.ericdallo.clj4intellij.util :as util])
|
|
11 | 12 | [com.intellij.openapi.project Project ProjectLocator]
|
12 | 13 | [com.intellij.openapi.util TextRange]
|
13 | 14 | [com.intellij.openapi.util.text StringUtil]
|
14 |
| - [com.intellij.openapi.vfs VirtualFile] |
| 15 | + [com.intellij.openapi.vfs VfsUtil VirtualFile] |
15 | 16 | [com.intellij.psi PsiFile]
|
16 | 17 | [com.intellij.psi PsiManager]))
|
17 | 18 |
|
|
56 | 57 | (.guessProjectForFile (ProjectLocator/getInstance)
|
57 | 58 | v-file))
|
58 | 59 |
|
| 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 | + |
59 | 93 | (defn apply-workspace-edit ^Boolean
|
60 | 94 | [^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 |
62 | 96 | ;; TODO Improve to check version to known if file changed
|
63 | 97 | (app-manager/invoke-later!
|
64 | 98 | {:invoke-fn
|
|
71 | 105 | :project project
|
72 | 106 | :command-fn
|
73 | 107 | (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?))))}))}))})) |
0 commit comments