branch: externals/sql-indent
commit 580cb4b2f1f5f4c11058105adb61f78cf5eb2568
Author: Pierre Téchoueyres <[email protected]>
Commit: Alex Harsányi <[email protected]>

    Try to correct 'bad closing for begin block' message. (#36)
    
    Detection of for .. loop inside another statement
    
    see "test-data/pr36.sql" for an example.
---
 sql-indent-test.el         |  7 +++++++
 sql-indent.el              |  4 ++--
 test-data/pr36-io-left.eld |  1 +
 test-data/pr36-syn.eld     | 43 +++++++++++++++++++++++++++++++++++++++++++
 test-data/pr36.sql         | 17 +++++++++++++++++
 5 files changed, 70 insertions(+), 2 deletions(-)

diff --git a/sql-indent-test.el b/sql-indent-test.el
index 95fc875..046ca07 100644
--- a/sql-indent-test.el
+++ b/sql-indent-test.el
@@ -319,4 +319,11 @@ information read from DATA-FILE (as generated by
    "test-data/pr33.sql" "test-data/pr33-io-left.eld"
    sqlind-indentation-left-offsets-alist 2))
 
+(ert-deftest sqlind-ert-pr36 ()
+  (sqlind-ert-check-file-syntax "test-data/pr36.sql" "test-data/pr36-syn.eld"))
+
+(ert-deftest sqlind-ert-pr36-io-left ()
+  (sqlind-ert-check-file-indentation "test-data/pr36.sql" 
"test-data/pr36-io-left.eld"
+   sqlind-indentation-left-offsets-alist 2))
+
 ;;; sql-indent-test.el ends here
diff --git a/sql-indent.el b/sql-indent.el
index e77345f..d374d43 100644
--- a/sql-indent.el
+++ b/sql-indent.el
@@ -299,7 +299,7 @@ But don't go before LIMIT."
     (catch 'done
       (while (> (point) (or limit (point-min)))
         (when (re-search-backward
-               
";\\|:=\\|\\b\\(declare\\|begin\\|cursor\\|loop\\|if\\|then\\|else\\|elsif\\)\\b\\|)"
+               
";\\|:=\\|\\b\\(declare\\|begin\\|cursor\\|for\\|loop\\|if\\|then\\|else\\|elsif\\)\\b\\|)"
                limit 'noerror)
           (unless (sqlind-in-comment-or-string (point))
             (let ((candidate-pos (match-end 0)))
@@ -308,7 +308,7 @@ But don't go before LIMIT."
                      ;; of the keywords inside one of them and think this is a
                      ;; statement start.
                      (progn (forward-char 1) (forward-sexp -1)))
-                    ((looking-at "\\bcursor\\b")
+                    ((looking-at "\\b\\(cursor\\|for\\)\\b")
                      ;; statement begins at the start of the keyword
                      (throw 'done (point)))
                     ((looking-at "\\b\\(then\\|else\\)\\b")
diff --git a/test-data/pr36-io-left.eld b/test-data/pr36-io-left.eld
new file mode 100644
index 0000000..e0fa856
--- /dev/null
+++ b/test-data/pr36-io-left.eld
@@ -0,0 +1 @@
+(0 2 4 6 8 6 4 2 0 0 0 0 0 0 0 0 0 0)
diff --git a/test-data/pr36-syn.eld b/test-data/pr36-syn.eld
new file mode 100644
index 0000000..a4089ff
--- /dev/null
+++ b/test-data/pr36-syn.eld
@@ -0,0 +1,43 @@
+((((block-start begin)
+   . 1)
+  (toplevel . 1))
+ (((in-begin-block toplevel-block "")
+   . 1))
+ (((in-block if "")
+   . 9))
+ (((in-block loop "")
+   . 27))
+ (((in-block if "")
+   . 53))
+ (((block-end if "")
+   . 53)
+  ((in-block if "")
+   . 53))
+ (((block-end loop "")
+   . 27)
+  ((in-block loop "")
+   . 27))
+ (((block-end if "")
+   . 9)
+  ((in-block if "")
+   . 9))
+ (((block-end toplevel-block "")
+   . 1)
+  ((in-begin-block toplevel-block "")
+   . 1))
+ ((toplevel . 1))
+ ((toplevel . 1))
+ ((comment-start . 1)
+  (toplevel . 1))
+ ((comment-start . 1)
+  (toplevel . 1))
+ ((comment-start . 1)
+  (toplevel . 1))
+ ((comment-start . 1)
+  (toplevel . 1))
+ ((comment-start . 1)
+  (toplevel . 1))
+ ((comment-start . 1)
+  (toplevel . 1))
+ ((toplevel . 1)))
+
diff --git a/test-data/pr36.sql b/test-data/pr36.sql
new file mode 100644
index 0000000..b24cd60
--- /dev/null
+++ b/test-data/pr36.sql
@@ -0,0 +1,17 @@
+begin
+  if a = b then
+    for rec in cur loop
+      if c = d then
+        inst1;
+      end if;
+    end loop;
+  end if;
+end;
+/
+
+-- Local Variables:
+-- mode: sql
+-- tab-width: 2
+-- indent-tabs-mode: nil
+-- sql-product: oracle
+-- End:

Reply via email to