[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/scala-mode 3413883 004/217: run-on-p
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/scala-mode 3413883 004/217: run-on-p |
Date: |
Sun, 29 Aug 2021 11:30:33 -0400 (EDT) |
branch: elpa/scala-mode
commit 34138839ca48385bc5633784788c82477889737d
Author: Heikki Vesalainen <heikkivesalainen@yahoo.com>
Commit: Heikki Vesalainen <heikkivesalainen@yahoo.com>
run-on-p
---
Example.scala | 2 +-
scala-mode-map.el | 1 +
scala-mode-syntax.el | 160 ++++++++++++++++++++++++++++++++++++++++-----------
3 files changed, 130 insertions(+), 33 deletions(-)
diff --git a/Example.scala b/Example.scala
index 3b312b6..d46ea96 100644
--- a/Example.scala
+++ b/Example.scala
@@ -122,7 +122,7 @@ val f = foo(kissa,
kala)
val g = bar(
- kissa
+ kissa,
kala
)
diff --git a/scala-mode-map.el b/scala-mode-map.el
index 9ad1758..b88f2ea 100644
--- a/scala-mode-map.el
+++ b/scala-mode-map.el
@@ -18,6 +18,7 @@
(scala-mode-map:define-keys
keymap
(([backspace] 'backward-delete-char-untabify)
+ ([(control c)(control r)] 'scala-syntax:runonp) ; TODO remove
;; ("\r" 'scala-newline)
([(control c)(control c)] 'comment-region)
;; ("}" 'scala-electric-brace)
diff --git a/scala-mode-syntax.el b/scala-mode-syntax.el
index 84c3e10..3b5ad43 100644
--- a/scala-mode-syntax.el
+++ b/scala-mode-syntax.el
@@ -8,7 +8,10 @@
(require 'scala-mode-constants)
+;;;;
;;;; Scala syntax regular expressions
+;;;;
+
;;; Based on the Scala language specification 2.9. Note: order is not
;;; the same as in the document, as here things are declared before
;;; used.
@@ -27,8 +30,15 @@
(defconst scala-syntax:lower-group "[:lower:]")
(defconst scala-syntax:letter-group (concat scala-syntax:lower-group
scala-syntax:upper-group)) ;; TODO: add Lt, Lo, Nl
(defconst scala-syntax:digit-group "0-9")
+(defconst scala-syntax:letterOrDigit-group (concat
+
scala-syntax:upperAndUnderscore-group
+ scala-syntax:lower-group
+ scala-syntax:digit-group))
(defconst scala-syntax:opchar-group "!#%&*+/:<=>?@\\\\\\^|~\\-") ;; TODO: Sm,
So
+;; Scala delimiters (Chapter 1), but no quotes
+(defconst scala-syntax:delimiter-group ".,;")
+
;; Integer Literal (Chapter 1.3.1)
(defconst scala-syntax:nonZeroDigit-group "1-9")
(defconst scala-syntax:octalDigit-group "0-7")
@@ -147,50 +157,63 @@
(defconst scala-syntax:after-reserved-symbol-underscore-re
;; what can be after reserved symbol _ (if there is something else, it
;; will be upper case letter per SLS)
- (concat "$\\|[^" scala-syntax:upper-group scala-syntax:lower-group
scala-syntax:digit-group "]"))
+ (concat "$\\|[^" scala-syntax:letterOrDigit-group "]"))
(defconst scala-syntax:reserved-symbol-underscore-re
;; reserved symbol _
- (concat "\\(^\\|[^" scala-syntax:upper-group scala-syntax:lower-group
scala-syntax:digit-group "]\\)"
+ (concat "\\(^\\|[^" scala-syntax:letterOrDigit-group "]\\)"
"\\(_\\)"
- "\\($\\|[^" scala-syntax:upper-group scala-syntax:lower-group
scala-syntax:digit-group "]\\)"))
+ "\\($\\|[^" scala-syntax:letterOrDigit-group "]\\)"))
+
+(defconst scala-syntax:reserved-symbols-unsafe-re
+ ;; reserved symbols. The regexp is unsafe as it does not
+ ;; check the context.
+ "\\([:=#@\u21D2\u2190]\\|=>\\|<[:%!?\\-]\\|>:\\)" )
(defconst scala-syntax:reserved-symbols-re
;; reserved symbols and XML starts ('<!' and '<?')
(concat "\\(^\\|[^" scala-syntax:opchar-group "]\\)"
- "\\([:=#@\u21D2\u2190]\\|=>\\|<[:%!?\\-]\\|>:\\)"
+ scala-syntax:reserved-symbols-unsafe-re
"\\($\\|[^" scala-syntax:opchar-group "]\\)"))
(defconst scala-syntax:reserved-re
- (concat scala-syntax:keywords-re "\\|" scala-syntax:reserved-symbols-re
"\\|" scala-syntax:reserved-symbol-underscore-re))
+ (concat scala-syntax:keywords-re
+ "\\|" scala-syntax:reserved-symbols-re
+ "\\|" scala-syntax:reserved-symbol-underscore-re))
(defconst scala-syntax:mustNotTerminate-keywords-re
- "Keywords which cannot end a expression and are infact a sign of run-on."
- (regexp-opt '("catch", "else", "extends", "finally",
- "forSome", "match", "with", "yield") 'words))
+ (regexp-opt '("catch" "else" "extends" "finally"
+ "forSome" "match" "with" "yield") 'words)
+ "Keywords whiOAch cannot end a expression and are infact a sign of run-on.")
(defconst scala-syntax:mustNotTerminate-re
- "All keywords and symbols that cannot terminate a expression
-and are infact a sign of run-on, except for @, which may start
-an expression with annotation."
(concat "\\(" scala-syntax:mustNotTerminate-keywords-re
- "\\|" scala-syntax:reserved-symbols-re "\\)"))
+ "\\|[.]\\)")
+ "All keywords and symbols that cannot terminate a expression
+and are infact a sign of run-on. Reserved-symbols not included.")
(defconst scala-syntax:mustTerminate-re
+ (concat "\\([({\\[,;]\\|=>?\\|" scala-syntax:empty-line-re "\\)")
"Symbols that must terminate an expression, i.e the following expression
-cannot be a run-on. This includes only , and ; and the empty line"
- (concat "\\([,;]|" scala-syntax:empty-line-re "\\)"))
+cannot be a run-on. This includes only parenthesis, '=', '=>', ',' and ';'
+and the empty line")
(defconst scala-syntax:mustNotContinue-re
- "Keywords that begin an expression, i.e they cannot be run-on to the
-previous the line even if there is no semi in between."
- ;; 'case' and 'while' are unclear. 'case' might belong to 'case class'
- ;; while 'while' might belong to a 'do..while'
- (regexp-opt '("abstract", "class", "def", "do", "final",
- "for", "if", "implicit", "import", "lazy",
- "new", "object", "override", "package", "private",
- "protected", "return", "sealed", "throw",
- "trait", "try", "type", "val", "var") 'words))
+ ;; Although SLS says case continues an expression, we say
+ ;; for the sake of indenting, it does not. Hence case is
+ ;; never a run-on of the previous line.
+ ;; While we cannot handle here since it could be 'do..while'
+ (concat "\\("
+ (regexp-opt '("abstract" "class" "def" "do" "final"
+ "for" "if" "implicit" "import" "lazy"
+ "new" "object" "override" "package" "private"
+ "protected" "return" "sealed" "throw"
+ "trait" "try" "type" "val" "var" "case")
+ 'words)
+ "\\|[)}]\\|]\\)")
+ "Keywords that begin an expression and parenthesis that end an
+expression, i.e they cannot be run-on to the previous line even
+if there is no semi in between.")
(defconst scala-syntax:double-arrow-re
"=>\\|\u21D2")
@@ -206,7 +229,10 @@ previous the line even if there is no semi in between."
(re-search-forward scala-syntax:reserved-symbols-re nil t))
+;;;;
;;;; Character syntax table and related syntax-propertize functions
+;;;;
+
;;; The syntax table relies havily on the syntax-propertize-functions being
;;; run. Hence this syntax requires at least emacs 24, which introduced
;;; this new facility.
@@ -239,8 +265,9 @@ previous the line even if there is no semi in between."
(modify-syntax-entry ?\] ")[" syntab)
(modify-syntax-entry ?\} "){" syntab)
- ;; _ is upper-case letter, but will be modified to be punctuation
- ;; when in reserved symbol position by syntax-propertize-function
+ ;; _ is upper-case letter, but will be modified to be symbol
+ ;; constituent when in reserved symbol position by
+ ;; syntax-propertize-function
(modify-syntax-entry ?\_ "w" syntab)
;; by default all opchars are punctuation, but they will be
@@ -296,7 +323,7 @@ match-group 'match-group'"
'syntax-table
,value))
-(defun scala-syntax:propertize-characterLiterals (start end)
+(defun scala-syntax:propertize-characterLiterals (start e§nd)
"Mark start and end of character literals as syntax class
7 (string quotes). Only valid character literals will be marked."
(save-excursion
@@ -344,9 +371,9 @@ get marked. This means invalid one-line strings will not be
fontified."
(scala-syntax:put-syntax-table-property 1 '(15 . nil)))))))
(defun scala-syntax:propertize-underscore-and-idrest (start end)
- "Mark all underscores (_) as punctuation (syntax 1) or upper
-case letter (syntax 2). Also mark opchars in idrest as symbol
-constituents (syntax 3)"
+ "Mark all underscores (_) as symbol constituents (syntax 3) or
+upper case letter (syntax 2). Also mark opchars in idrest as
+symbol constituents (syntax 3)"
(save-excursion
(goto-char start)
(while (re-search-forward "_" end t)
@@ -356,17 +383,17 @@ constituents (syntax 3)"
match-beg match-end 'syntax-table
(if (= match-beg (line-beginning-position))
(if (looking-at scala-syntax:after-reserved-symbol-underscore-re)
- '(1 . nil) ; punctuation
+ '(3 . nil) ; symbol constituent
'(2 . nil)) ; word syntax
(save-excursion
(goto-char (1- match-beg))
(if (looking-at scala-syntax:reserved-symbol-underscore-re)
- '(1 . nil) ; punctuation
+ '(3 . nil) ; symbol constituent
;; check for opchars that should be marked as symbol
constituents (3)
(goto-char match-end)
(when (looking-at scala-syntax:op-re)
(scala-syntax:put-syntax-table-property 0 '(3 . nil)))
- '(2 . nil))))))))) ;; word syntax (2) for the '_'
+ '(3 . nil))))))))) ;; symbol constituent syntax (3) also for
the '_'
(defun scala-syntax:propertize (start end)
"See syntax-propertize-function"
@@ -374,3 +401,72 @@ constituents (syntax 3)"
(scala-syntax:propertize-stringLiterals start end)
(scala-syntax:propertize-underscore-and-idrest start end))
+
+;;;;
+;;;; Syntax navigation functions
+;;;;
+
+(defun scala-syntax:beginning-of-code-line ()
+ (interactive)
+ "Move to the beginning of code on the line, or to the end of
+the line, if the line is empty"
+ (let ((eol (line-end-position)))
+ (beginning-of-line)
+ (forward-comment (buffer-size))
+ (if (> (point) eol)
+ eol
+ (skip-syntax-forward " " eol))))
+
+(defun scala-syntax:looking-back-empty-line-p ()
+ "Return t if the previous line is empty"
+ (save-excursion
+ (skip-syntax-backward " " (line-beginning-position))
+ (and (bolp)
+ (forward-line -1)
+ (looking-at scala-syntax:empty-line-re))))
+
+(defun scala-syntax:skip-backward-ignorable ()
+ "Move backwards over ignorable whitespace and comments. A
+completely empty line is not ignorable and will not be moved
+over. Returns the number of points moved (will be negative)."
+ (while (and (not (scala-syntax:looking-back-empty-line-p))
+ (forward-comment -1)))
+ (skip-syntax-backward " " (line-beginning-position)))
+
+(defun scala-syntax:looking-back-token (re)
+ "Return the start position of the token matched by re, if the
+current position is preceeded by it, or nil if not. All ignorable
+comments and whitespace are ignored, i.e. does not search past an
+empty line. Expects to be outside of comment."
+ (save-excursion
+ ;; skip back all comments
+ (scala-syntax:skip-backward-ignorable)
+ (let ((end (point)))
+ ;; skip back punctuation or ids (words and related symbols and
delimiters)
+ (or (/= 0 (skip-chars-backward scala-syntax:delimiter-group))
+ (/= 0 (skip-syntax-backward "."))
+ (/= 0 (skip-syntax-backward "("))
+ (/= 0 (skip-syntax-backward "w_'$")))
+ ;; if we didn't move, then we didn't find anything
+ (if (= (point) end)
+ nil
+ (if (looking-at re) (point) nil)))))
+
+(defun scala-syntax:runonp (&optional point)
+ (interactive)
+ "Returns t if the current point (or point at 'point) is on a
+line that is a run-on to previous line."
+ (save-excursion
+ (when point (goto-char point))
+ (scala-syntax:beginning-of-code-line)
+ (let ((p (not (or (looking-at scala-syntax:mustNotContinue-re)
+ (scala-syntax:looking-back-empty-line-p)
+ (scala-syntax:looking-back-token
+ scala-syntax:mustTerminate-re)))))
+ (when p (message "runon @ %d" (point)))
+ p )))
+
+; (defconst scala-syntax:mustNotTerminate-re
+; scala-syntax:reserved-symbols-unsafe-re
+;(defconst scala-syntax:mustTerminate-re
+;(defconst scala-syntax:mustNotContinue-re
- [nongnu] branch elpa/scala-mode created (now 598cb68), ELPA Syncer, 2021/08/29
- [nongnu] elpa/scala-mode 5ba0a78 005/217: run-on and list indent primitives, ELPA Syncer, 2021/08/29
- [nongnu] elpa/scala-mode ca7308a 002/217: Initial commit with README and Example.scala outlining how it will work, ELPA Syncer, 2021/08/29
- [nongnu] elpa/scala-mode a8b0936 003/217: Working on syntax, ELPA Syncer, 2021/08/29
- [nongnu] elpa/scala-mode 6f1b748 001/217: Example.scala to show how we intend to indent, ELPA Syncer, 2021/08/29
- [nongnu] elpa/scala-mode 3413883 004/217: run-on-p,
ELPA Syncer <=
- [nongnu] elpa/scala-mode f0cc3d4 006/217: working on indent rules, ELPA Syncer, 2021/08/29
- [nongnu] elpa/scala-mode f17fa95 007/217: approaching a functioning indent engine, ELPA Syncer, 2021/08/29
- [nongnu] elpa/scala-mode 4dbaa5f 010/217: picked some of Erik's fontlock magic for an interim solution, ELPA Syncer, 2021/08/29
- [nongnu] elpa/scala-mode 84e5c8a 013/217: regression fix, ELPA Syncer, 2021/08/29
- [nongnu] elpa/scala-mode aebc5b0 017/217: Fixes #7: indenting of block lines when at last char of buffer, ELPA Syncer, 2021/08/29
- [nongnu] elpa/scala-mode c3ea76f 009/217: fixed indenting of if body (and probably other things), ELPA Syncer, 2021/08/29
- [nongnu] elpa/scala-mode ba3c9ca 020/217: renamed README to README.md, ELPA Syncer, 2021/08/29
- [nongnu] elpa/scala-mode 9f74c7d 015/217: Partial fix to #5., ELPA Syncer, 2021/08/29
- [nongnu] elpa/scala-mode 84d9c10 011/217: highlight string escapes, ELPA Syncer, 2021/08/29
- [nongnu] elpa/scala-mode 150e3d2 012/217: updated README with some TODOs, ELPA Syncer, 2021/08/29