emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] scratch/javaimp-gradle d9913c9: More fixes for gradle


From: Filipp Gunbin
Subject: [elpa] scratch/javaimp-gradle d9913c9: More fixes for gradle
Date: Thu, 24 Oct 2019 12:54:40 -0400 (EDT)

branch: scratch/javaimp-gradle
commit d9913c908adb152410e7885d9ec71a7ab7a0c8be
Author: Filipp Gunbin <address@hidden>
Commit: Filipp Gunbin <address@hidden>

    More fixes for gradle
---
 packages/javaimp/javaimp-gradle.el | 102 ++++++++++++++++++++++++++-----------
 packages/javaimp/javaimp-maven.el  |  13 +++--
 packages/javaimp/javaimp.el        |  47 +++++++++--------
 3 files changed, 107 insertions(+), 55 deletions(-)

diff --git a/packages/javaimp/javaimp-gradle.el 
b/packages/javaimp/javaimp-gradle.el
index 908067a..d0ff6b3 100644
--- a/packages/javaimp/javaimp-gradle.el
+++ b/packages/javaimp/javaimp-gradle.el
@@ -21,8 +21,6 @@
 
 (require 'javaimp-util)
 
-;; TODO support Groovy build files (build.gradle)
-
 (defcustom javaimp-gradle-program "gradle"
   "Path to the `gradle' program.  Customize it if the program is
 not on `exec-path'."
@@ -36,15 +34,14 @@ Passes specially crafted init file as -I argument to gradle 
and
 invokes task contained in it.  This task returns all needed
 information."
   (message "Visiting Gradle build file %s..." file)
-  (let* ((init-file (make-temp-file "javaimp" nil ".kts"
-                                    javaimp--gradle-init-file-contents))
-         (modules
-         (javaimp--call-build-tool javaimp-gradle-program
-                                    #'javaimp--gradle-handler
-                                    "-q"
-                                    "-b" (javaimp-cygpath-convert-maybe file)
-                                    "-I" (javaimp-cygpath-convert-maybe 
init-file)
-                                    "javaimpTask")))
+  (let* ((alists (javaimp--gradle-call file
+                                       javaimp--gradle-init-script
+                                       javaimp--gradle-init-script-kotlin
+                                       #'javaimp--gradle-handler
+                                       "javaimpTask"))
+         (modules (mapcar (lambda (alist)
+                            (javaimp--gradle-module-from-alist alist file))
+                          alists)))
     (prog1
         ;; first module is always root
         (javaimp--build-tree (car modules) nil modules)
@@ -52,7 +49,7 @@ information."
 
 (defun javaimp--gradle-handler ()
   (goto-char (point-min))
-  (let (modules alist parts sym val)
+  (let (alist res parts sym val)
     (while (not (eobp))
       (setq parts (split-string (thing-at-point 'line) "[=\n]+" t))
       (setq sym (intern (or (nth 0 parts)
@@ -60,19 +57,20 @@ information."
                                    (thing-at-point 'line))))
             val (nth 1 parts))
       (when (and (eq sym 'id) alist)    ;start of next module
-        (push (javaimp--gradle-module-from-alist alist) modules)
+        (push alist res)
         (setq alist nil))
       (push (cons sym val) alist)
       (forward-line 1))
     (when alist                         ;last module
-      (push (javaimp--gradle-module-from-alist alist) modules))
-    (nreverse modules)))
+      (push alist res))
+    (nreverse res)))
 
-(defun javaimp--gradle-module-from-alist (alist)
+(defun javaimp--gradle-module-from-alist (alist file-orig)
   (make-javaimp-module
    :id (javaimp--gradle-id-from-colon-separated (cdr (assq 'id alist)))
    :parent-id (javaimp--gradle-id-from-colon-separated (cdr (assq 'parent-id 
alist)))
    :file (cdr (assq 'file alist))
+   :file-orig file-orig
    :final-name (cdr (assq 'final-name alist))
    :packaging "jar"                     ;TODO
    :source-dir (file-name-as-directory
@@ -95,25 +93,69 @@ information."
         (error "Invalid maven id: %s" str))
       (make-javaimp-id :group (nth 0 parts) :artifact (nth 1 parts) :version 
(nth 2 parts)))))
 
-
-(defun javaimp--gradle-fetch-dep-jars-path (file)
-  (let ((init-file (make-temp-file "javaimp" nil ".kts"
-                                   
javaimp--gradle-init-file-contents-dep-jars-only)))
-    (javaimp--call-build-tool javaimp-gradle-program
-                              (lambda ()
-                                ;; expect just a single line
-                                (thing-at-point 'line))
+(defun javaimp--gradle-fetch-dep-jars-path (module)
+  ;; always invoke on originating file becase module's file may not
+  ;; exist (even if reported as project.buildFile property); also,
+  ;; local gradlew which needs to be invoked will usually reside
+  ;; alongside top-level build file
+  (javaimp--gradle-call (javaimp-module-file-orig module)
+                        javaimp--gradle-init-script-dep-jars-only
+                        javaimp--gradle-init-script-dep-jars-only-kotlin
+                        (lambda ()
+                          ;; expect just a single line
+                          (thing-at-point 'line))
+                        (format ":%s:javaimpTask" ;TODO what if root?
+                                (javaimp-id-artifact (javaimp-module-id 
module)))))
+
+
+(defun javaimp--gradle-call (file init-script init-script-kotlin handler task)
+  (let* ((is-kotlin (equal (file-name-extension file) "kts"))
+         (init-file (make-temp-file "javaimp" nil
+                                    (if is-kotlin ".kts")
+                                    (if is-kotlin init-script-kotlin 
init-script)))
+         (local-gradlew (concat (file-name-directory file) "gradlew")))
+    (javaimp--call-build-tool (if (file-exists-p local-gradlew)
+                                  local-gradlew
+                                javaimp-gradle-program)
+                              handler
                               "-q"
                               "-b" (javaimp-cygpath-convert-maybe file)
                               "-I" (javaimp-cygpath-convert-maybe init-file)
-                              "javaimpTask")))
+                              task)))
+
+
+(defconst javaimp--gradle-init-script
+  "allprojects {
+    task javaimpTask {
+        doLast {
+            println \"id=${project.group}:${project.name}:${project.version}\"
+            if (project.parent != null) {
+                println 
\"parent-id=${project.parent.group}:${project.parent.name}:${project.parent.version}\"
+            }
+            println \"file=${project.buildFile}\"
+            println \"final-name=${project.archivesBaseName}\"
+            println 'source-dir=' + sourceSets.main.java.srcDirs.collect { 
it.path }.join(':')
+            println 'test-source-dir=' + sourceSets.test.java.srcDirs.collect 
{ it.path }.join(':')
+            println \"build-dir=${project.buildDir}\"
+            println \"dep-jars=${configurations.testCompile.asPath}\"
+        }
+    }
+}")
 
+(defconst javaimp--gradle-init-script-dep-jars-only
+  "allprojects {
+    task javaimpTask {
+        doLast {
+            println \"${configurations.testCompile.asPath}\"
+        }
+    }
+}")
 
-(defconst javaimp--gradle-init-file-contents
+(defconst javaimp--gradle-init-script-kotlin
   "allprojects {
     tasks.register(\"javaimpTask\") {
         doLast {
-            println(\"id=$project.group:$project.name:$project.version\")
+            println(\"id=${project.group}:${project.name}:${project.version}\")
             if (project.parent != null) {
                 
println(\"parent-id=${project.parent.group}:${project.parent.name}:${project.parent.version}\")
             }
@@ -122,16 +164,16 @@ information."
             
println(\"source-dir=${sourceSets.main.java.sourceDirectories.asPath}\")
             
println(\"test-source-dir=${sourceSets.test.java.sourceDirectories.asPath}\")
             println(\"build-dir=${project.buildDir}\")
-            println(\"dep-jars=${configurations.testCompileClasspath.asPath}\")
+            println(\"dep-jars=${configurations.testCompile.asPath}\")
         }
     }
 }")
 
-(defconst javaimp--gradle-init-file-contents-dep-jars-only
+(defconst javaimp--gradle-init-script-dep-jars-only-kotlin
   "allprojects {
     tasks.register(\"javaimpTask\") {
         doLast {
-            println(\"${configurations.testCompileClasspath.asPath}\")
+            println(\"${configurations.testCompile.asPath}\")
         }
     }
 }")
diff --git a/packages/javaimp/javaimp-maven.el 
b/packages/javaimp/javaimp-maven.el
index 9ceb1a9..b39d0b0 100644
--- a/packages/javaimp/javaimp-maven.el
+++ b/packages/javaimp/javaimp-maven.el
@@ -41,7 +41,9 @@ belong to which modules and other module information"
                                              "-f" 
(javaimp-cygpath-convert-maybe file)
                                              "help:effective-pom"))
         (projects (javaimp--maven-projects-from-xml xml-tree))
-        (modules (mapcar #'javaimp--maven-module-from-xml projects))
+        (modules (mapcar (lambda (proj-elt)
+                            (javaimp--maven-module-from-xml proj-elt file))
+                          projects))
         ;; first module is always root
         (tree (javaimp--build-tree (car modules) nil modules)))
     (when tree
@@ -89,7 +91,7 @@ of <project> elements"
          (t
           (error "Neither <project> nor <projects> was found in pom")))))
 
-(defun javaimp--maven-module-from-xml (elt)
+(defun javaimp--maven-module-from-xml (elt file-orig)
   (let ((build-elt (javaimp--xml-child 'build elt)))
     (make-javaimp-module
      :id (javaimp--maven-id-from-xml elt)
@@ -97,6 +99,7 @@ of <project> elements"
      ;; <project> element does not contain pom file path, so we set this slot
      ;; later, see javaimp--maven-fill-modules-files
      :file nil
+     :file-orig file-orig
      :final-name (javaimp--xml-first-child
                  (javaimp--xml-child 'finalName build-elt))
      :packaging (javaimp--xml-first-child
@@ -159,14 +162,16 @@ of <project> elements"
                                                   "pom.xml")
                                           tree)))))
 
-(defun javaimp--maven-fetch-dep-jars-path (file)
+(defun javaimp--maven-fetch-dep-jars-path (module)
   (javaimp--call-build-tool javaimp-mvn-program
                             (lambda ()
                               (goto-char (point-min))
                               (search-forward "Dependencies classpath:")
                               (forward-line 1)
                               (thing-at-point 'line))
-                            "-f" (javaimp-cygpath-convert-maybe file)
+                            ;; always invoke for this module's pom.ml
+                            "-f" (javaimp-cygpath-convert-maybe
+                                  (javaimp-module-file module))
                             "dependency:build-classpath"))
 
 (provide 'javaimp-maven)
diff --git a/packages/javaimp/javaimp.el b/packages/javaimp/javaimp.el
index 4f87c05..fd88b4e 100644
--- a/packages/javaimp/javaimp.el
+++ b/packages/javaimp/javaimp.el
@@ -28,7 +28,7 @@
 ;;
 ;; - customize `javaimp-import-group-alist'
 ;; - call `javaimp-visit-project', giving it the top-level project
-;; directory where pom.xml / build.gradle.kts resides
+;; directory where pom.xml / build.gradle[.kts] resides
 ;;
 ;; Then in a Java buffer visiting a file under that project or one of its
 ;; submodules call `javaimp-organize-imports' or `javaimp-add-import'.
@@ -163,6 +163,7 @@ to the completion alternatives list."
 (cl-defstruct javaimp-module
   id parent-id
   file
+  file-orig
   final-name
   packaging
   source-dir test-source-dir build-dir
@@ -181,7 +182,7 @@ to the completion alternatives list."
 ;;;###autoload
 (defun javaimp-visit-project (dir)
   "Loads a project and its submodules.  DIR should point to a
-directory containing pom.xml / build.gradle.kts.
+directory containing pom.xml / build.gradle[.kts].
 
 After being processed by this command, the module tree becomes
 known to javaimp and `javaimp-add-import' may be called inside
@@ -192,45 +193,49 @@ any module file."
          (tree (cond
                 ((file-readable-p (setq build-file (concat exp-dir "pom.xml")))
                  (javaimp--maven-visit build-file))
-                ((file-readable-p (setq build-file (concat exp-dir 
"build.gradle.kts")))
+                ((or (file-readable-p (setq build-file (concat exp-dir 
"build.gradle")))
+                     (file-readable-p (setq build-file (concat exp-dir 
"build.gradle.kts"))))
                  (javaimp--gradle-visit build-file))
                 (t
                  (error "Could not find build file in dir %s" dir)))))
     (when tree
-      ;; delete previous loaded tree, if any
+      ;; delete previous tree(s) loaded from this build file, if any
       (setq javaimp-project-forest
            (seq-remove (lambda (tree)
-                         (equal (javaimp-module-file (javaimp-node-contents 
tree))
+                         (equal (javaimp-module-file-orig 
(javaimp-node-contents tree))
                                 build-file))
                        javaimp-project-forest))
       (push tree javaimp-project-forest)
       (message "Loaded tree for %s" dir))))
 
 
-;; Dep jars
+;; Dependency jars
 
 (defun javaimp--update-module-maybe (node)
   (let ((module (javaimp-node-contents node))
        need-update)
     ;; check if deps are initialized
-    (or (javaimp-module-dep-jars module)
-       (progn (message "Loading dependencies: %s" (javaimp-module-id module))
-              (setq need-update t)))
-    ;; check if any build-file up to the top one has changed
+    (unless (javaimp-module-dep-jars module)
+      (message "Loading dependencies: %s" (javaimp-module-id module))
+      (setq need-update t))
+    ;; check if this or any parent build file has changed since we
+    ;; loaded the module
     (let ((tmp node))
-      (while (and tmp
-                 (not need-update))
-       (let ((checked (javaimp-node-contents tmp)))
-         (if (> (float-time (javaimp--get-file-ts (javaimp-module-file 
checked)))
-                (float-time (javaimp-module-load-ts module)))
-             (progn
-               (message "Reloading dependencies for %s (build-file changed)"
-                         (javaimp-module-id checked))
-               (setq need-update t))))
+      (while (and tmp (not need-update))
+       (let ((cur (javaimp-node-contents tmp)))
+         (when (> (max (if (file-exists-p (javaimp-module-file cur))
+                            (float-time (javaimp--get-file-ts 
(javaimp-module-file cur)))
+                          -1)
+                        (if (file-exists-p (javaimp-module-file-orig cur))
+                            (float-time (javaimp--get-file-ts 
(javaimp-module-file-orig cur)))
+                          -1))
+                  (float-time (javaimp-module-load-ts module)))
+           (message "Reloading dependencies for %s (some build-file changed)"
+                     (javaimp-module-id cur))
+           (setq need-update t)))
        (setq tmp (javaimp-node-parent tmp))))
     (when need-update
-      (let* ((path (funcall (javaimp-module-dep-jars-path-fetcher module)
-                            (javaimp-module-file module)))
+      (let* ((path (funcall (javaimp-module-dep-jars-path-fetcher module) 
module))
              (new-dep-jars (javaimp--split-native-path path))
             (new-load-ts (current-time)))
        (setf (javaimp-module-dep-jars module) new-dep-jars)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]