branch: elpa/cider
commit 8d67a14bb9bc87e17553f37bc8755983e7df6d3b
Merge: a74dff972c 348dc156d8
Author: vemv <[email protected]>
Commit: GitHub <[email protected]>

    Merge pull request #3688 from yuhan0/fix-error-regex
    
    Handle negative line numbers in error messages
---
 cider-eval.el                     | 133 +++++++++++++++++++-------------------
 test/cider-error-parsing-tests.el |  11 +++-
 2 files changed, 78 insertions(+), 66 deletions(-)

diff --git a/cider-eval.el b/cider-eval.el
index 2f0083e235..bb88106aa9 100644
--- a/cider-eval.el
+++ b/cider-eval.el
@@ -561,54 +561,56 @@ It delegates the actual error content to the eval or op 
handler."
          (cider-default-err-eval-handler))
         (t (cider-default-err-eval-print-handler))))
 
-
-(defconst cider-clojure-1.10--location `((or "at ("
-                                             (sequence "at "
-                                                       (minimal-match 
(one-or-more anything)) ;; the fully-qualified name of the function that 
triggered the error
-                                                       " ("))
-                                         (group-n 2 (minimal-match 
(zero-or-more anything)))
-                                         ":"
-                                         (group-n 3 (one-or-more digit))
-                                         (optional ":" (group-n 4 (one-or-more 
digit)))
-                                         ")."))
-
-(defconst cider-clojure-1.10-error (append `(sequence
-                                             "Syntax error "
-                                             (minimal-match (zero-or-more 
anything))
-                                             (or "compiling "
-                                                 "macroexpanding "
-                                                 "reading source ")
-                                             (minimal-match (zero-or-more 
anything)))
-                                           cider-clojure-1.10--location))
-
-(defconst cider-clojure-unexpected-error (append `(sequence
-                                                   "Unexpected error ("
-                                                   (minimal-match (one-or-more 
anything))
-                                                   ") "
-                                                   (or "compiling "
-                                                       "macroexpanding "
-                                                       "reading source ")
-                                                   (minimal-match (one-or-more 
anything)))
-                                                 cider-clojure-1.10--location))
-
-(defconst cider-clojure-warning `(sequence
-                                  (minimal-match (zero-or-more anything))
-                                  (group-n 1 "warning")
-                                  ", "
-                                  (group-n 2 (minimal-match (zero-or-more 
anything)))
-                                  ":"
-                                  (group-n 3 (one-or-more digit))
-                                  (optional ":" (group-n 4 (one-or-more 
digit)))
-                                  " - "))
+;; Reference:
+;; 
https://github.com/clojure/clojure/blob/clojure-1.10.0/src/clj/clojure/main.clj#L251
+;; See `cider-compilation-regexp' for interpretation of match groups.
+(defconst cider-clojure-1.10--location
+  '(sequence
+    "at " (minimal-match (zero-or-more anything)) ;; the fully-qualified name 
of the function that triggered the error
+    "("
+    (group-n 2 (minimal-match (zero-or-more anything))) ; source file
+    ":" (group-n 3 (one-or-more (any "-" digit))) ; line number, may be 
negative (#3687)
+    (optional
+     ":" (group-n 4 (one-or-more (any "-" digit)))) ; column number
+    ")."))
+
+(defconst cider-clojure-1.10-error
+  `(sequence
+    "Syntax error "
+    (minimal-match (zero-or-more anything))
+    (or "compiling "
+        "macroexpanding "
+        "reading source ")
+    (minimal-match (zero-or-more anything))
+    ,cider-clojure-1.10--location))
+
+(defconst cider-clojure-unexpected-error
+  `(sequence
+    "Unexpected error (" (minimal-match (one-or-more anything)) ") "
+    (or "compiling "
+        "macroexpanding "
+        "reading source ")
+    (minimal-match (one-or-more anything))
+    ,cider-clojure-1.10--location))
+
+(defconst cider-clojure-warning
+  `(sequence
+    (minimal-match (zero-or-more anything))
+    (group-n 1 "warning")
+    ", " (group-n 2 (minimal-match (zero-or-more anything)))
+    ":" (group-n 3 (one-or-more (any "-" digit)))
+    (optional
+     ":" (group-n 4 (one-or-more (any "-" digit))))
+    " - "))
 
 ;; Please keep this in sync with `cider-clojure-compilation-error-regexp',
 ;; which is a subset of these regexes.
 (defconst cider-clojure-compilation-regexp
-  (eval
-   `(rx bol (or ,cider-clojure-warning
-                ,cider-clojure-1.10-error
-                ,cider-clojure-unexpected-error))
-   t)
+  (rx-to-string
+   `(seq bol (or ,cider-clojure-warning
+                 ,cider-clojure-1.10-error
+                 ,cider-clojure-unexpected-error))
+   'nogroup)
   "A few example values that will match:
 \"Reflection warning, /tmp/foo/src/foo/core.clj:14:1 - \"
 \"CompilerException java.lang.RuntimeException: Unable to resolve symbol: \\
@@ -617,10 +619,10 @@ lol in this context, compiling:(/foo/core.clj:10:1)\"
 \"Unexpected error (ClassCastException) macroexpanding defmulti at 
(src/haystack/parser.cljc:21:1).\"")
 
 (defconst cider-clojure-compilation-error-regexp
-  (eval
-   `(rx bol (or ,cider-clojure-1.10-error
-                ,cider-clojure-unexpected-error))
-   t)
+  (rx-to-string
+   `(seq bol (or ,cider-clojure-1.10-error
+                 ,cider-clojure-unexpected-error))
+   'nogroup)
   "Like `cider-clojure-compilation-regexp',
 but excluding warnings such as reflection warnings.
 
@@ -631,26 +633,23 @@ lol in this context, compiling:(/foo/core.clj:10:1)\"
 \"Unexpected error (ClassCastException) macroexpanding defmulti at 
(src/haystack/parser.cljc:21:1).\"")
 
 (defconst cider--clojure-execution-error-regexp
-  (append `(sequence
-            "Execution error "
-            (or (sequence "("
-                          (minimal-match (one-or-more anything))
-                          ")")
-                (minimal-match (zero-or-more anything))))
-          cider-clojure-1.10--location))
+  `(sequence
+    "Execution error "
+    (minimal-match (zero-or-more anything))
+    ,cider-clojure-1.10--location))
 
 (defconst cider--clojure-spec-execution-error-regexp
-  (append `(sequence
-            "Execution error - invalid arguments to "
-            (minimal-match (one-or-more anything))
-            " ")
-          cider-clojure-1.10--location))
+  `(sequence
+    "Execution error - invalid arguments to "
+    (minimal-match (one-or-more anything))
+    " "
+    ,cider-clojure-1.10--location))
 
 (defconst cider-clojure-runtime-error-regexp
-  (eval
-   `(rx bol (or ,cider--clojure-execution-error-regexp
-                ,cider--clojure-spec-execution-error-regexp))
-   t)
+  (rx-to-string
+   `(seq bol (or ,cider--clojure-execution-error-regexp
+                 ,cider--clojure-spec-execution-error-regexp))
+   'nogroup)
   "Matches runtime errors, as oppsed to compile-time/macroexpansion-time 
errors.
 
 A few example values that will match:
@@ -674,7 +673,11 @@ A few example values that will match:
       ")"))
 
 (defvar cider-compilation-regexp
-  (list cider-clojure-compilation-regexp  2 3 4 '(1))
+  (list cider-clojure-compilation-regexp
+        2     ; FILE
+        3     ; LINE
+        4     ; COLUMN
+        '(1)) ; TYPE = (WARNING . INFO)
   "Specifications for matching errors and warnings in Clojure stacktraces.
 See `compilation-error-regexp-alist' for help on their format.")
 
diff --git a/test/cider-error-parsing-tests.el 
b/test/cider-error-parsing-tests.el
index 4a887ac47a..8c01cd2c23 100644
--- a/test/cider-error-parsing-tests.el
+++ b/test/cider-error-parsing-tests.el
@@ -178,7 +178,16 @@
       (expect (progn
                 (string-match cider-clojure-runtime-error-regexp specimen)
                 (match-string 2 specimen))
-              :to-equal "src/haystack/parser.cljc"))))
+              :to-equal "src/haystack/parser.cljc")))
+
+  ;; Java source locations may be negative (#3687)
+  (it "Recognizes an error thrown from a java source file"
+    (let ((specimen "Execution error (FileNotFoundException) at 
java.io.FileInputStream/open0 (FileInputStream.java:-2)."))
+      (expect specimen :to-match cider-clojure-runtime-error-regexp)
+      (expect (progn
+                (string-match cider-clojure-runtime-error-regexp specimen)
+                (match-string 2 specimen))
+              :to-equal "FileInputStream.java"))))
 
 (describe "cider-module-info-regexp"
   (it "Matches module info provided by Java"

Reply via email to