@@ -315,6 +315,9 @@ Otherwise open the file and do the changes non-interactively."
315
315
(and cljr-use-multiple-cursors
316
316
(not (bound-and-true-p evil-mode))))
317
317
318
+ (defun cljr--vector-at-point-p ()
319
+ (eq (char-after ) ?\[ ))
320
+
318
321
(defun cljr--fix-special-modifier-combinations (key )
319
322
(cl-case key
320
323
(" C-s-i" " s-TAB" )
@@ -570,8 +573,12 @@ errors."
570
573
(join-line )
571
574
(paredit-forward-delete 1 ))
572
575
573
- (defun cljr--looking-at-dependency-vector-p ()
574
- (looking-at " \\ [[^[[:space:]]+[[:space:]]+\" " ))
576
+ (defun cljr--looking-at-dependency-p ()
577
+ (or
578
+ ; ; boot & leiningen dependency vector
579
+ (looking-at " \\ [[^[[:space:]]+[[:space:]]+\" " )
580
+ ; ; clj dependency style
581
+ (looking-at " \\ ([a-z0-9\-\. /]+\\ )[[:space:]]*\{ .*\\ (:mvn\\ |:local\\ |:git\\ )/\\ (root\\ |version\\ |url\\ )[[:space:]]+\\ (\" [^\" ]+\" \\ )" )))
575
582
576
583
(defun cljr--just-one-blank-line ()
577
584
" Ensure there's only one blank line at POINT."
@@ -787,7 +794,7 @@ A new record is created to define this constructor."
787
794
788
795
(defun cljr--project-dir ()
789
796
(or
790
- (thread-last '(" project.clj" " build.boot" " pom.xml" )
797
+ (thread-last '(" project.clj" " build.boot" " pom.xml" " deps.edn " )
791
798
(mapcar 'cljr--locate-project-file )
792
799
(delete 'nil )
793
800
car )
@@ -804,6 +811,8 @@ A new record is created to define this constructor."
804
811
(let ((file (expand-file-name " build.boot" project-dir)))
805
812
(and (file-exists-p file) file))
806
813
(let ((file (expand-file-name " pom.xml" project-dir)))
814
+ (and (file-exists-p file) file))
815
+ (let ((file (expand-file-name " deps.edn" project-dir)))
807
816
(and (file-exists-p file) file)))))
808
817
809
818
(defun cljr--project-files ()
@@ -815,6 +824,9 @@ A new record is created to define this constructor."
815
824
" -not -regex \" .*svn.*\" "
816
825
1000 ))))
817
826
827
+ (defun cljr--project-with-deps-p (project-file )
828
+ (string-match " /deps.edn$" project-file))
829
+
818
830
(defun cljr--buffers-visiting-dir (dir )
819
831
(seq-filter (lambda (buf )
820
832
(when-let (path (buffer-file-name buf))
@@ -1979,7 +1991,7 @@ See: https://github.com/clojure-emacs/clj-refactor.el/wiki/cljr-project-clean"
1979
1991
(cljr--post-command-message " Project clean done." )))
1980
1992
1981
1993
(defun cljr--extract-dependency-name ()
1982
- (cl-assert (cljr--looking-at-dependency-vector- p))
1994
+ (cl-assert (cljr--looking-at-dependency-p))
1983
1995
(forward-char )
1984
1996
(prog1
1985
1997
(buffer-substring-no-properties
@@ -1998,9 +2010,9 @@ See: https://github.com/clojure-emacs/clj-refactor.el/wiki/cljr-project-clean"
1998
2010
1999
2011
(defun cljr--extract-next-dependency-name ()
2000
2012
(while (not (or (cljr--empty-buffer-p)
2001
- (cljr--looking-at-dependency-vector- p)))
2013
+ (cljr--looking-at-dependency-p)))
2002
2014
(delete-char 1 ))
2003
- (when (cljr--looking-at-dependency-vector- p)
2015
+ (when (cljr--looking-at-dependency-p)
2004
2016
(cljr--extract-dependency-name)))
2005
2017
2006
2018
(defun cljr--get-sorted-dependency-names (deps )
@@ -2074,19 +2086,22 @@ See: https://github.com/clojure-emacs/clj-refactor.el/wiki/cljr-project-clean"
2074
2086
2075
2087
See: https://github.com/clojure-emacs/clj-refactor.el/wiki/cljr-sort-project-dependencies"
2076
2088
(interactive )
2077
- (cljr--update-file (cljr--project-file)
2078
- (goto-char (point-min ))
2079
- (while (re-search-forward " :dependencies" (point-max ) t )
2080
- (forward-char )
2081
- (thread-first (buffer-substring-no-properties (point )
2082
- (cljr--point-after 'paredit-forward ))
2083
- cljr--get-sorted-dependency-names
2084
- (cljr--sort-dependency-vectors (thread-last (clojure-delete-and-extract-sexp)
2085
- (string-remove-prefix " [" )
2086
- (string-remove-suffix " ]" )))
2087
- insert))
2088
- (indent-region (point-min ) (point-max ))
2089
- (save-buffer )))
2089
+ (let ((project-file (cljr--project-file)))
2090
+ (if (cljr--project-with-deps-p project-file)
2091
+ (user-error " Dependencies sorting not supported in deps.edn yet." )
2092
+ (cljr--update-file project-file
2093
+ (goto-char (point-min ))
2094
+ (while (re-search-forward " :dependencies" (point-max ) t )
2095
+ (forward-char )
2096
+ (thread-first (buffer-substring-no-properties (point )
2097
+ (cljr--point-after 'paredit-forward ))
2098
+ cljr--get-sorted-dependency-names
2099
+ (cljr--sort-dependency-vectors (thread-last (clojure-delete-and-extract-sexp)
2100
+ (string-remove-prefix " [" )
2101
+ (string-remove-suffix " ]" )))
2102
+ insert))
2103
+ (indent-region (point-min ) (point-max ))
2104
+ (save-buffer )))))
2090
2105
2091
2106
(defun cljr--call-middleware-sync (request &optional key )
2092
2107
" Call the middleware with REQUEST.
@@ -2182,18 +2197,34 @@ possible choices. If the choice is trivial, return it."
2182
2197
(completing-read prompt choices nil nil nil nil (car choices)))
2183
2198
(read-from-minibuffer prompt)))
2184
2199
2200
+ (defun cljr--insert-into-leiningen-dependencies (artifact version )
2201
+ (re-search-forward " :dependencies" )
2202
+ (paredit-forward)
2203
+ (paredit-backward-down)
2204
+ (newline-and-indent )
2205
+ (insert " [" artifact " \" " version " \" ]" ))
2206
+
2207
+ (defun cljr--insert-into-clj-dependencies (artifact version )
2208
+ (re-search-forward " :deps" )
2209
+ (forward-sexp )
2210
+ (backward-char )
2211
+ (newline-and-indent )
2212
+ (insert artifact " {:mvn/version \" " version " \" }" ))
2213
+
2185
2214
(defun cljr--add-project-dependency (artifact version )
2186
- (cljr--update-file (cljr--project-file)
2187
- (goto-char (point-min ))
2188
- (re-search-forward " :dependencies" )
2189
- (paredit-forward)
2190
- (paredit-backward-down)
2191
- (newline-and-indent )
2192
- (insert " [" artifact " \" " version " \" ]" )
2193
- (cljr--post-command-message " Added %s version %s as a project dependency" artifact version)
2194
- (when cljr-hotload-dependencies
2195
- (paredit-backward-down)
2196
- (cljr-hotload-dependency))))
2215
+ (let* ((project-file (cljr--project-file))
2216
+ (deps (cljr--project-with-deps-p project-file)))
2217
+ (cljr--update-file project-file
2218
+ (goto-char (point-min ))
2219
+ (if deps
2220
+ (cljr--insert-into-clj-dependencies artifact version)
2221
+ (cljr--insert-into-leiningen-dependencies artifact version))
2222
+ (cljr--post-command-message " Added %s version %s as a project dependency" artifact version)
2223
+ (when cljr-hotload-dependencies
2224
+ (if deps
2225
+ (back-to-indentation )
2226
+ (paredit-backward-down))
2227
+ (cljr-hotload-dependency)))))
2197
2228
2198
2229
;;;### autoload
2199
2230
(defun cljr-add-project-dependency (force )
@@ -2209,22 +2240,27 @@ See: https://github.com/clojure-emacs/clj-refactor.el/wiki/cljr-add-project-depe
2209
2240
(cljr--add-project-dependency lib-name version)))
2210
2241
2211
2242
;;;### autoload
2212
- (defun cljr-update-project-dependency ()
2243
+ (defun cljr-update-project-dependency (&optional version )
2213
2244
" Update the version of the dependency at point."
2214
2245
(interactive )
2215
2246
(cljr--ensure-op-supported " artifact-list" )
2216
- (unless (cljr--looking-at-dependency-vector- p)
2217
- (user-error " Place cursor in front of dependency vector to update." ))
2247
+ (unless (cljr--looking-at-dependency-p)
2248
+ (user-error " Place cursor in front of dependency to update." ))
2218
2249
(save-excursion
2219
- (let (lib-name)
2220
- (paredit-forward-down)
2250
+ (let (lib-name
2251
+ (lein-style (cljr--vector-at-point-p)))
2252
+ (if lein-style
2253
+ (paredit-forward-down))
2221
2254
(setq lib-name (cljr--extract-sexp))
2222
2255
(paredit-forward)
2223
2256
(skip-syntax-forward " " )
2224
- (let ((version (thread-last (cljr--get-versions-from-middleware lib-name)
2225
- (cljr--prompt-user-for (concat lib-name " version: " )))))
2257
+ (let ((artifact-version (or version
2258
+ (thread-last (cljr--get-versions-from-middleware lib-name)
2259
+ (cljr--prompt-user-for (concat lib-name " version: " ))))))
2226
2260
(cljr--delete-sexp)
2227
- (insert " \" " version " \" " ))))
2261
+ (if lein-style
2262
+ (insert " \" " artifact-version " \" " )
2263
+ (insert " \{ :mvn/version \" " artifact-version " \"\} " )))))
2228
2264
(when cljr-hotload-dependencies
2229
2265
(cljr-hotload-dependency)
2230
2266
(cljr--ensure-op-supported " artifact-list" )))
@@ -2236,19 +2272,25 @@ See: https://github.com/clojure-emacs/clj-refactor.el/wiki/cljr-add-project-depe
2236
2272
See: https://github.com/clojure-emacs/clj-refactor.el/wiki/cljr-update-project-dependencies"
2237
2273
(interactive )
2238
2274
(cljr--ensure-op-supported " artifact-list" )
2239
- (find-file (cljr--project-file))
2240
- (goto-char (point-min ))
2241
- (let (cljr-hotload-dependencies)
2242
- (while (re-search-forward " :dependencies" (point-max ) t )
2243
- (paredit-forward-down)
2244
- (cljr--skip-past-whitespace-and-comments)
2245
- (while (not (looking-at " ]" ))
2246
- (let ((highlight (cljr--highlight-sexp)))
2247
- (unwind-protect
2248
- (cljr-update-project-dependency)
2249
- (delete-overlay highlight )))
2250
- (paredit-forward)
2251
- (cljr--skip-past-whitespace-and-comments)))))
2275
+ (let ((project-file (cljr--project-file)))
2276
+ (find-file project-file)
2277
+ (goto-char (point-min ))
2278
+ (let (cljr-hotload-dependencies)
2279
+ (if (cljr--project-with-deps-p project-file)
2280
+ (cljr--update-dependencies " :deps" " }" 2 )
2281
+ (cljr--update-dependencies " :dependencies" " ]" 1 )))))
2282
+
2283
+ (defun cljr--update-dependencies (keyword dependency-closing-brace forward-count )
2284
+ (while (re-search-forward keyword (point-max ) t )
2285
+ (paredit-forward-down)
2286
+ (cljr--skip-past-whitespace-and-comments)
2287
+ (while (not (looking-at dependency-closing-brace))
2288
+ (let ((highlight (cljr--highlight-sexp)))
2289
+ (unwind-protect
2290
+ (cljr-update-project-dependency)
2291
+ (delete-overlay highlight )))
2292
+ (paredit-forward forward-count)
2293
+ (cljr--skip-past-whitespace-and-comments))))
2252
2294
2253
2295
(defun cljr--skip-past-whitespace-and-comments ()
2254
2296
(skip-syntax-forward " >" )
@@ -2844,13 +2886,25 @@ See: https://github.com/clojure-emacs/clj-refactor.el/wiki/cljr-add-missing-libs
2844
2886
(cljr--maybe-clean-ns)
2845
2887
(cljr--maybe-eval-ns-form))
2846
2888
2847
- (defun cljr--dependency-vector-at-point ()
2889
+ (defun cljr--dependency-at-point ()
2890
+ " Returns project dependency at point.
2891
+
2892
+ Recognizes both leiningen- and deps.edn-style dependencies, but the latter is always
2893
+ transformed back to leiningen dependency vector which is what nrepl backend
2894
+ expects for hot-loading."
2848
2895
(save-excursion
2849
2896
(ignore-errors
2850
- (while (not (cljr--looking-at-dependency-vector- p))
2897
+ (while (not (cljr--looking-at-dependency-p))
2851
2898
(paredit-backward-up))
2852
- (buffer-substring-no-properties (point )
2853
- (cljr--point-after 'paredit-forward )))))
2899
+
2900
+ (if (cljr--vector-at-point-p)
2901
+ (buffer-substring-no-properties (point )
2902
+ (cljr--point-after 'paredit-forward ))
2903
+ (concat " ["
2904
+ (match-string-no-properties 1 )
2905
+ " "
2906
+ (match-string-no-properties 4 )
2907
+ " ]" )))))
2854
2908
2855
2909
(defun cljr--hotload-dependency-callback (response )
2856
2910
(cljr--maybe-rethrow-error response)
@@ -2866,10 +2920,11 @@ See: https://github.com/clojure-emacs/clj-refactor.el/wiki/cljr-add-missing-libs
2866
2920
(with-temp-buffer
2867
2921
(insert string)
2868
2922
(goto-char (point-min ))
2869
- (cl-assert (cljr--looking-at-dependency-vector- p) nil
2923
+ (cl-assert (cljr--looking-at-dependency-p) nil
2870
2924
(format
2871
2925
(concat " Expected dependency vector of type "
2872
- " [org.clojure \" 1.7.0\" ], but got '%s'" )
2926
+ " [org.clojure \" 1.7.0\" ] or "
2927
+ " org.clojure {:mvn/version \" 1.7.0\" }, but got '%s'" )
2873
2928
string)))
2874
2929
string)
2875
2930
@@ -2882,8 +2937,9 @@ Defaults to the dependency vector at point, but prompts if none is found.
2882
2937
See: https://github.com/clojure-emacs/clj-refactor.el/wiki/cljr-hotload-dependency"
2883
2938
(interactive )
2884
2939
(cljr--ensure-op-supported " hotload-dependency" )
2885
- (let ((dependency-vector (or (cljr--dependency-vector- at-point)
2940
+ (let ((dependency-vector (or (cljr--dependency-at-point)
2886
2941
(cljr--prompt-user-for " Dependency vector: " ))))
2942
+
2887
2943
(cljr--assert-dependency-vector dependency-vector)
2888
2944
(cljr--call-middleware-async
2889
2945
(cljr--create-msg " hotload-dependency" " coordinates" dependency-vector)
0 commit comments