|
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