4747(defconst java-comment-style (make-idee/comment-style :block-beginning " /*" :block-ending " */"
4848 :custom-block-beginning idee/comment-java-custom-block-beginning :custom-line-prefix idee/comment-java-custom-line-prefix :custom-block-ending idee/comment-java-custom-block-ending))
4949(defvar idee/java-last-visited-class nil )
50+ (defvar idee/java-initialized nil )
5051
5152
5253(defun idee/java-enable ()
7677 (jshell-process-name (format " *jshell %s " (if module-dir module-dir (idee/project-root-dir))))
7778 (existing-buffer (car (seq-filter (lambda (b ) (idee/starts-with (buffer-name b) jshell-process-name)) (buffer-list )))))
7879 (if existing-buffer
79- (switch-to-buffer existing-buffer)
80+ (switch-to-buffer existing-buffer)
8081 (let* ((new-jshell-process-name (format " *%s * " jshell-buffer-name)))
8182 (ansi-term " /bin/sh" jshell-buffer-name)
8283 (term-line-mode )
9899 " Create a new java class with FQCN from the specified ARCHETYPE.
99100The new class will be created under SRC-PATH or `src/main/java` if the src path is ommitted.
100101The target module will be the current, unless BASE-PATH has been specified, in which case it will be used."
101- (with-temp-buffer
102- (let* ((base-path (file-name-as-directory (or base-path (idee/module-root-dir))))
103- (src-path (file-name-as-directory (or src-path " src/main/java" )))
104- (package (idee/java-package-of-fqcn fqcn))
105- (class-name (substring fqcn (+ 1 (length package ))))
106- (package-path (replace-regexp-in-string (regexp-quote " ." ) " /" package ))
107- (class (concat base-path (format " %s /%s /%s .java" src-path package-path class-name))))
108- (set-visited-file-name class)
109- (insert archetype)
110- (java-mode )
111- (yas-expand )
112- (write-file class))))
102+ (with-temp-buffer
103+ (let* ((base-path (file-name-as-directory (or base-path (idee/module-root-dir))))
104+ (src-path (file-name-as-directory (or src-path " src/main/java" )))
105+ (package (idee/java-package-of-fqcn fqcn))
106+ (class-name (substring fqcn (+ 1 (length package ))))
107+ (package-path (replace-regexp-in-string (regexp-quote " ." ) " /" package ))
108+ (class (concat base-path (format " %s /%s /%s .java" src-path package-path class-name))))
109+ (set-visited-file-name class)
110+ (insert archetype)
111+ (java-mode )
112+ (yas-expand )
113+ (write-file class))))
113114
114115(defun idee/java-archetype-create-resource (name archetype &optional src-path base-path )
115116 " Create a new java class with FQCN in the current module from the specified ARCHETYPE."
116- (with-temp-buffer
117- (let* ((base-path (file-name-as-directory (or base-path (idee/module-root-dir))))
118- (src-path (file-name-as-directory (or src-path " src/main/resources" )))
119- (resource (concat base-path (format " %s /%s " src-path name)))
120- (extension (file-name-extension resource))
121- (mode (cdr (assoc extension idee/type-modes-alist))))
122- (set-visited-file-name resource)
123- (when archetype
124- (insert archetype)
125- (when mode (funcall mode))
126- (yas-expand ))
127- (write-file resource))))
117+ (with-temp-buffer
118+ (let* ((base-path (file-name-as-directory (or base-path (idee/module-root-dir))))
119+ (src-path (file-name-as-directory (or src-path " src/main/resources" )))
120+ (resource (concat base-path (format " %s /%s " src-path name)))
121+ (extension (file-name-extension resource))
122+ (mode (cdr (assoc extension idee/type-modes-alist))))
123+ (set-visited-file-name resource)
124+ (when archetype
125+ (insert archetype)
126+ (when mode (funcall mode))
127+ (yas-expand ))
128+ (write-file resource))))
128129
129130(defun idee/java-register-spi (interface impl )
130131 " Create a new java class with FQCN in the current module from the specified ARCHETYPE."
@@ -147,54 +148,54 @@ The target module will be the current, unless BASE-PATH has been specified, in w
147148 (idee/java-archetype-create-class fqcn " abstract-factory" )))
148149
149150(defun idee/java-archetype-annotation-processor ()
150- " A simple java annotation and annotation processor archetype."
151- (interactive )
152- (let* ((current-fqcn (idee/java-fqcn-of (buffer-file-name )))
153- (current-pkg (idee/java-package-of (buffer-file-name )))
154- (fqcn (read-string " Annotation processor qualified class name:" current-pkg)))
155- (idee/java-archetype-create-class fqcn " annotation" )
156- (idee/java-archetype-create-class (concat fqcn " Processor" ) " apt" )
157- (idee/java-register-spi " javax.annotation.processing.Processor" fqcn)))
151+ " A simple java annotation and annotation processor archetype."
152+ (interactive )
153+ (let* ((current-fqcn (idee/java-fqcn-of (buffer-file-name )))
154+ (current-pkg (idee/java-package-of (buffer-file-name )))
155+ (fqcn (read-string " Annotation processor qualified class name:" current-pkg)))
156+ (idee/java-archetype-create-class fqcn " annotation" )
157+ (idee/java-archetype-create-class (concat fqcn " Processor" ) " apt" )
158+ (idee/java-register-spi " javax.annotation.processing.Processor" fqcn)))
158159
159160; ;
160161; ; Snippets
161162; ;
162163
163164(defun idee/java-create-template (source-file name key &optional templates-dir )
164165 " Create snippet from file."
165- (with-temp-buffer
166- (let* ((root-dir (idee/project-root-dir (buffer-file-name )))
167- (conf-dir (concat (file-name-as-directory root-dir) idee/project-conf-dir))
168- (project-templates-dir (concat (file-name-as-directory conf-dir) " templates" ))
169- (templates-dir (or templates-dir project-templates-dir))
170- (body (idee/java-snippet-body-from source-file))
171- (target (concat (file-name-as-directory templates-dir) (format " java-mode/%s " key)))
172- (parent (file-name-directory target)))
173- (set-visited-file-name target)
174- (insert (format " # name: %s " name))
175- (newline )
176- (insert (format " # key: %s " key))
177- (newline )
178- (insert " # --" )
179- (newline )
180- (insert body)
181- (write-file target)
182- (yas-load-directory parent)
183- (yas-compile-directory parent))))
166+ (with-temp-buffer
167+ (let* ((root-dir (idee/project-root-dir (buffer-file-name )))
168+ (conf-dir (concat (file-name-as-directory root-dir) idee/project-conf-dir))
169+ (project-templates-dir (concat (file-name-as-directory conf-dir) " templates" ))
170+ (templates-dir (or templates-dir project-templates-dir))
171+ (body (idee/java-snippet-body-from source-file))
172+ (target (concat (file-name-as-directory templates-dir) (format " java-mode/%s " key)))
173+ (parent (file-name-directory target)))
174+ (set-visited-file-name target)
175+ (insert (format " # name: %s " name))
176+ (newline )
177+ (insert (format " # key: %s " key))
178+ (newline )
179+ (insert " # --" )
180+ (newline )
181+ (insert body)
182+ (write-file target)
183+ (yas-load-directory parent)
184+ (yas-compile-directory parent))))
184185
185186(defun idee/java-snippet-body-from (f )
186187 " Create snippet from file F."
187188 (with-temp-buffer
188189 (save-excursion
189- (insert-file-contents f)
190- (goto-char (point-min ))
191- (idee/comment-remove-at-point java-comment-style)
192- (let* ((content (buffer-substring-no-properties (point-min ) (point-max )))
193- (class-name (idee/java-class-name-of f))
194- (updated (concat
195- " `idee/header`\n " (replace-regexp-in-string " package[ ]+[a-zA-Z0-9\. -]+;" " `idee/java-package-line`"
190+ (insert-file-contents f)
191+ (goto-char (point-min ))
192+ (idee/comment-remove-at-point java-comment-style)
193+ (let* ((content (buffer-substring-no-properties (point-min ) (point-max )))
194+ (class-name (idee/java-class-name-of f))
195+ (updated (concat
196+ " `idee/header`\n " (replace-regexp-in-string " package[ ]+[a-zA-Z0-9\. -]+;" " `idee/java-package-line`"
196197 (replace-regexp-in-string (regexp-quote class-name) idee/java-snippet-class-name content t ) t ))))
197- updated))))
198+ updated))))
198199
199200(defun idee/filename ()
200201 " Return the name for the current file."
@@ -208,44 +209,62 @@ The target module will be the current, unless BASE-PATH has been specified, in w
208209 (equal build-gradle x)))
209210 (directory-files root)))
210211
212+ ;;;### autoload
211213(defun idee/java-visitor (root )
212214 " Check if a java project is available under the specified ROOT."
213- (if (idee/java-project-p root)
214- (idee/java-enable)))
215+ (when (idee/java-project-p root)
216+ (idee/lsp-java-init)
217+ (idee/java-enable)))
215218
216219;;;### autoload
217220(defun idee/java-init ()
218221 " Initialize java."
219222 (interactive )
220223 ; ; Dependencies
221- (idee/lsp-java-init)
222- (idee/maven-init)
223- (idee/quarkus-init)
224- (idee/spring-init)
225-
226- (idee/visitor-register 'idee/java-visitor )
227-
228- (idee/template-factory-register (make-idee/template-factory
229- :mode 'java-mode
230- :description " A java temlate factory"
231- :func 'idee/java-create-template ))
232- (idee/archetype-register
233- (make-idee/archetype
234- :name " Java Abstract Factory"
235- :description " A simple java abstract factory"
236- :func 'idee/java-archetype-abstract-factory ))
237-
238- (idee/archetype-register
239- (make-idee/archetype
240- :name " Java Annotation and Processor"
241- :description " A java annotation and a java annotation processor"
242- :func 'idee/java-archetype-annotation-processor ))
224+ (idee/only-once idee/java-initialized
225+ ; ; LSP
226+ (idee/lsp-java-init)
227+
228+ ; ; Maven
229+ (idee/visitor-register 'idee/maven-visitor )
230+ (idee/project-factory-register (make-idee/project-factory
231+ :name " Maven"
232+ :description " New Maven project from archetype."
233+ :func 'idee/new-maven-from-archetype-project ))
234+ ; ; Quarkus
235+ (idee/visitor-register 'idee/quarkus-visitor )
236+ (idee/project-factory-register (make-idee/project-factory
237+ :name " Quarkus"
238+ :description " New Quarkus project created using the quarkus maven plugin."
239+ :func 'idee/new-quarkus-rest-project ))
240+
241+ ; ; Spring
242+ (idee/project-factory-register (make-idee/project-factory
243+ :name " Spring"
244+ :description " New Spring project created using https://start.spring.io"
245+ :func 'idee/new-spring-starter-project ))
246+
247+ (idee/template-factory-register (make-idee/template-factory
248+ :mode 'java-mode
249+ :description " A java temlate factory"
250+ :func 'idee/java-create-template ))
251+ (idee/archetype-register
252+ (make-idee/archetype
253+ :name " Java Abstract Factory"
254+ :description " A simple java abstract factory"
255+ :func 'idee/java-archetype-abstract-factory ))
256+
257+ (idee/archetype-register
258+ (make-idee/archetype
259+ :name " Java Annotation and Processor"
260+ :description " A java annotation and a java annotation processor"
261+ :func 'idee/java-archetype-annotation-processor ))
243262
244263 ; ;; Hook
245- (add-hook 'java-mode-hook 'idee/java-enable )
246- (add-hook 'java-mode-hook 'idee/java-visit-file )
264+ (add-hook 'java-mode-hook 'idee/java-enable )
265+ (add-hook 'java-mode-hook 'idee/java-visit-file )
247266
248- (advice-add 'projectile-switch-to-buffer :after #'idee/java-visit-file ))
267+ (advice-add 'projectile-switch-to-buffer :after #'idee/java-visit-file )) ))
249268
250269(provide 'idee-java )
251270; ;; idee-java.el ends here
0 commit comments