Skip to content

Commit 794319c

Browse files
committed
Add support for creating Clojure namespaces.
Fixes #78
1 parent 61f37f8 commit 794319c

File tree

9 files changed

+80
-2
lines changed

9 files changed

+80
-2
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
## [Unreleased]
44

5+
- Add support for creating Clojure namespaces. #78
6+
57
## 3.4.0
68

79
- Fix go to declaration or usages. #70

src/main/clojure/com/github/clojure_lsp/intellij/extension/language_server_factory.clj

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
[com.intellij.openapi.vfs LocalFileSystem VirtualFile]
1919
[com.redhat.devtools.lsp4ij LSPIJUtils LanguageServerFactory ServerStatus]
2020
[com.redhat.devtools.lsp4ij.client LanguageClientImpl]
21-
[com.redhat.devtools.lsp4ij.client.features EditorBehaviorFeature LSPClientFeatures LSPProgressFeature]
21+
[com.redhat.devtools.lsp4ij.client.features LSPClientFeatures LSPProgressFeature]
2222
[com.redhat.devtools.lsp4ij.installation LanguageServerInstallerBase]
2323
[com.redhat.devtools.lsp4ij.server OSProcessStreamConnectionProvider]
2424
[java.io File]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
(ns com.github.clojure-lsp.intellij.extension.new-file
2+
(:require
3+
[clojure.java.io :as io]
4+
[clojure.string :as string]
5+
[com.github.clojure-lsp.intellij.client :as lsp-client]
6+
[com.rpl.proxy-plus :refer [proxy+]])
7+
(:import
8+
[com.github.clojure_lsp.intellij Icons]
9+
[com.intellij.ide.actions CreateFileFromTemplateAction CreateFileFromTemplateDialog$Builder]
10+
[com.intellij.ide.fileTemplates FileTemplate]
11+
[com.intellij.psi PsiDirectory]))
12+
13+
(set! *warn-on-reflection* true)
14+
15+
(defn ^:private filename->source-path [filename project]
16+
(let [source-paths (get-in (lsp-client/server-info project) [:final-settings "source-paths"])]
17+
(first (filter #(string/starts-with? filename %) source-paths))))
18+
19+
(defn ^:private dir->partial-namespace
20+
[filename project]
21+
(when-let [current-source-path (filename->source-path filename project)]
22+
(some-> filename
23+
(string/replace-first (re-pattern current-source-path) "")
24+
(string/replace (System/getProperty "file.separator") ".")
25+
(string/replace #"_" "-")
26+
not-empty
27+
(subs 1)
28+
(str "."))))
29+
30+
(defn ^:private dialog [project ^PsiDirectory dir ^CreateFileFromTemplateDialog$Builder builder]
31+
(let [filename (.getPath (.getVirtualFile dir))
32+
namespace (dir->partial-namespace filename project)]
33+
(-> builder
34+
(.setTitle "New Clojure namespace")
35+
(.setDefaultText (or namespace ""))
36+
(.addKind "Clojure (.clj)" Icons/CLOJURE "ClojureNamespace")
37+
(.addKind "ClojureScript (.cljs)" Icons/CLOJURE_SCRIPT "ClojureScriptNamespace")
38+
(.addKind "CLJC (.cljc)" Icons/CLOJURE "CLJCNamespace")
39+
(.addKind "ClojureDart (.cljd)" Icons/CLOJURE_DART "ClojureDartNamespace"))))
40+
41+
(defn ^:private create-file-from-template
42+
[project ^String ns ^FileTemplate template ^PsiDirectory dir]
43+
(let [dir-filename (.getPath (.getVirtualFile dir))
44+
separator (System/getProperty "file.separator")
45+
source-path (filename->source-path dir-filename project)
46+
ns-path (-> ns
47+
(string/replace "." separator)
48+
(string/replace "-" "_"))
49+
new-name (string/replace-first (.getCanonicalPath (io/file source-path ns-path))
50+
(str dir-filename separator)
51+
"")]
52+
(CreateFileFromTemplateAction/createFileFromTemplate new-name template dir nil true)))
53+
54+
(defn ->ClojureNewFileAction [project]
55+
(proxy+
56+
["Clojure namespace" "Create a new Clojure namespace" Icons/CLOJURE]
57+
CreateFileFromTemplateAction
58+
(buildDialog [_ project dir builder]
59+
(dialog project dir builder))
60+
(getActionName [_ _dir new-name _template-name]
61+
(str "Create Clojure namespace: " new-name))
62+
(createFileFromTemplate [_ name template dir]
63+
(create-file-from-template project name template dir))))

src/main/clojure/com/github/clojure_lsp/intellij/extension/register_actions_startup.clj

+10-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
[camel-snake-kebab.core :as csk]
44
[com.github.clojure-lsp.intellij.client :as lsp-client]
55
[com.github.clojure-lsp.intellij.editor :as editor]
6+
[com.github.clojure-lsp.intellij.extension.new-file :as extension.new-file]
67
[com.github.ericdallo.clj4intellij.action :as action]
78
[com.github.ericdallo.clj4intellij.extension :refer [def-extension]]
89
[com.github.ericdallo.clj4intellij.logger :as logger]
@@ -114,7 +115,15 @@
114115

115116
(def-extension RegisterActionsStartup []
116117
ProjectActivity
117-
(execute [_this ^Project _project ^CoroutineScope _]
118+
(execute [_this ^Project project ^CoroutineScope _]
119+
(action/register-action! :id "ClojureLSP.NewClojureFile"
120+
:title "Clojure namespace"
121+
:description "Create a Clojure namespace"
122+
:icon Icons/CLOJURE
123+
:action (extension.new-file/->ClojureNewFileAction project))
124+
(action/register-group! :id "ClojureLSP.NewGroup"
125+
:children [{:type :add-to-group :group-id "NewGroup" :anchor :first}
126+
{:type :reference :ref "ClojureLSP.NewClojureFile"}])
118127
(doseq [{:keys [name text description use-shortcut-of keyboard-shortcut]} clojure-lsp-commands]
119128
(action/register-action! :id (str "ClojureLSP." (csk/->PascalCase name))
120129
:title text

src/main/resources/META-INF/plugin.xml

+4
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@
3636
<lang.syntaxHighlighterFactory language="clojure" implementationClass="com.github.clojure_lsp.intellij.extension.syntax_highlighter.ClojureSyntaxHighlighter"/>
3737
<colorSettingsPage implementation="com.github.clojure_lsp.intellij.extension.color_settings_page.ClojureColorSettingsPage"/>
3838

39+
<internalFileTemplate name="ClojureNamespace"/>
40+
<internalFileTemplate name="ClojureScriptNamespace"/>
41+
<internalFileTemplate name="CLJCNamespace"/>
42+
3943
<!-- Features -->
4044
<postStartupActivity implementation="com.github.ericdallo.clj4intellij.extension.NREPLStartup"/>
4145
<postStartupActivity id="clojure-lsp-init-db" implementation="com.github.clojure_lsp.intellij.extension.init_db_startup.InitDBStartup"/>

src/main/resources/fileTemplates/internal/CLJCNamespace.cljc.ft

Whitespace-only changes.

src/main/resources/fileTemplates/internal/ClojureDartNamespace.cljd.ft

Whitespace-only changes.

src/main/resources/fileTemplates/internal/ClojureNamespace.clj.ft

Whitespace-only changes.

src/main/resources/fileTemplates/internal/ClojureScriptNamespace.cljs.ft

Whitespace-only changes.

0 commit comments

Comments
 (0)