76 lines
2.4 KiB
EmacsLisp
76 lines
2.4 KiB
EmacsLisp
|
;;; ~/.doom.d/sql-strings.el -*- lexical-binding: t; -*-
|
||
|
|
||
|
;;; https://www.emacswiki.org/emacs/StringAtPoint
|
||
|
(defun ourcomments-string-or-comment-bounds-1 (what)
|
||
|
(save-restriction
|
||
|
(widen)
|
||
|
(let* ((here (point))
|
||
|
;; Fix-me: when on end-point, how to handle that and which should be last hit point?
|
||
|
(state (parse-partial-sexp (point-min) (1+ here)))
|
||
|
(type (if (nth 3 state)
|
||
|
'string
|
||
|
(if (nth 4 state)
|
||
|
'comment)))
|
||
|
(start (when type (nth 8 state)))
|
||
|
end)
|
||
|
(unless start
|
||
|
(setq state (parse-partial-sexp (point-min) here))
|
||
|
(setq type (if (nth 3 state)
|
||
|
'string
|
||
|
(if (nth 4 state)
|
||
|
'comment)))
|
||
|
(setq start (when type (nth 8 state))))
|
||
|
(unless (or (not what)
|
||
|
(eq what type))
|
||
|
(setq start nil))
|
||
|
(if (not start)
|
||
|
(progn
|
||
|
(goto-char here)
|
||
|
nil)
|
||
|
(setq state (parse-partial-sexp (1+ start) (point-max)
|
||
|
nil nil state 'syntax-table))
|
||
|
(setq end (point))
|
||
|
(goto-char here)
|
||
|
(cons start end)))))
|
||
|
|
||
|
(defun ourcomments-bounds-of-string-at-point ()
|
||
|
"Return bounds of string at point if any."
|
||
|
(ourcomments-string-or-comment-bounds-1 'string))
|
||
|
|
||
|
(put 'string 'bounds-of-thing-at-point 'ourcomments-bounds-of-string-at-point)
|
||
|
|
||
|
(defun -sanitize-sql-string (str)
|
||
|
(->> str
|
||
|
(downcase)
|
||
|
(s-trim)
|
||
|
(replace-regexp-in-string
|
||
|
(rx (or (and string-start (or "\"\"\""
|
||
|
"\""))
|
||
|
(and (or "\"\"\""
|
||
|
"\"")
|
||
|
string-end)))
|
||
|
"")
|
||
|
(s-trim)))
|
||
|
|
||
|
(defun sql-string-p (str)
|
||
|
"Returns 't if STR looks like a string literal for a SQL statement"
|
||
|
(setq str (-sanitize-sql-string str))
|
||
|
(or (s-starts-with? "select" str)))
|
||
|
|
||
|
;;; tests
|
||
|
|
||
|
(require 'ert)
|
||
|
|
||
|
(ert-deftest sanitize-sql-string-test ()
|
||
|
(should (string-equal "select * from foo;"
|
||
|
(-sanitize-sql-string
|
||
|
"\"\"\"SELECT * FROM foo;\n\n\"\"\""))))
|
||
|
|
||
|
(ert-deftest test-sql-string-p ()
|
||
|
(dolist (str '("SELECT * FROM foo;"
|
||
|
"select * from foo;"))
|
||
|
(should (sql-string-p str)))
|
||
|
|
||
|
(dolist (str '("not a QUERY"))
|
||
|
(should-not (sql-string-p str))))
|