Merge remote-tracking branch 'origin/master' into feature/android
This commit is contained in:
commit
562b2fca7d
11 changed files with 208 additions and 160 deletions
|
@ -1,8 +1,8 @@
|
|||
\input texinfo @c -*- mode: texinfo; coding: utf-8 -*-
|
||||
@comment %**start of header
|
||||
@setfilename ../../info/flymake.info
|
||||
@set VERSION 1.2.2
|
||||
@set UPDATED November 2021
|
||||
@set VERSION 1.3.3
|
||||
@set UPDATED April 2023
|
||||
@settitle GNU Flymake @value{VERSION}
|
||||
@include docstyle.texi
|
||||
@syncodeindex pg cp
|
||||
|
@ -394,7 +394,7 @@ its @code{flymake-overlay-control} property:
|
|||
|
||||
@item
|
||||
@cindex severity of diagnostic
|
||||
@code{flymake-severity} is a non-negative integer specifying the
|
||||
@code{severity} is a non-negative integer specifying the
|
||||
diagnostic's severity. The higher the value, the more serious is the
|
||||
error. If the overlay property @code{priority} is not specified in
|
||||
@code{flymake-overlay-control}, @code{flymake-severity} is used to set
|
||||
|
@ -409,6 +409,17 @@ type, in case the name of the symbol associated with it is very long.
|
|||
@vindex flymake-category
|
||||
@code{flymake-category} is a symbol whose property list is considered
|
||||
the default for missing values of any other properties.
|
||||
|
||||
@item
|
||||
@cindex mode-line appearance of a diagnostic
|
||||
@code{mode-line-face} is a face specifier controlling the appearance
|
||||
of the indicator of this type of diagnostic in the mode line.
|
||||
|
||||
@item
|
||||
@cindex summarized appearance of a diagnostic
|
||||
@code{echo-face} is a face specifier controlling the appearance of the
|
||||
summarized description of this diagnostic when reading diagnostic
|
||||
messages (@pxref{Finding diagnostics}).
|
||||
@end itemize
|
||||
|
||||
@cindex predefined diagnostic types
|
||||
|
|
|
@ -1642,7 +1642,7 @@ See Info node `(elisp) Integer Basics'."
|
|||
bool-vector-count-consecutive bool-vector-count-population
|
||||
bool-vector-subsetp
|
||||
boundp buffer-file-name buffer-local-variables buffer-modified-p
|
||||
buffer-substring byte-code-function-p
|
||||
buffer-substring
|
||||
capitalize car-less-than-car car cdr ceiling char-after char-before
|
||||
char-equal char-to-string char-width compare-strings
|
||||
window-configuration-equal-p concat coordinates-in-window-p
|
||||
|
@ -1702,6 +1702,7 @@ See Info node `(elisp) Integer Basics'."
|
|||
'(arrayp atom
|
||||
bobp bolp bool-vector-p
|
||||
buffer-list buffer-size buffer-string bufferp
|
||||
byte-code-function-p
|
||||
car-safe case-table-p cdr-safe char-or-string-p characterp
|
||||
charsetp commandp cons consp
|
||||
current-buffer current-global-map current-indentation
|
||||
|
|
|
@ -3563,6 +3563,8 @@ lambda-expression."
|
|||
;;delq delete cl-delete
|
||||
;;nconc plist-put
|
||||
)))
|
||||
;; Don't warn for arguments to `ignore'.
|
||||
(not (eq byte-compile--for-effect 'for-effect-no-warn))
|
||||
(byte-compile-warning-enabled-p
|
||||
'ignored-return-value (car form)))
|
||||
(byte-compile-warn-x
|
||||
|
@ -4446,11 +4448,8 @@ This function is never called when `lexical-binding' is nil."
|
|||
|
||||
(defun byte-compile-ignore (form)
|
||||
(dolist (arg (cdr form))
|
||||
;; Compile args for value (to avoid warnings about unused values),
|
||||
;; emit a discard after each, and trust the LAP peephole optimiser
|
||||
;; to annihilate useless ops.
|
||||
(byte-compile-form arg)
|
||||
(byte-compile-discard))
|
||||
;; Compile each argument for-effect but suppress unused-value warnings.
|
||||
(byte-compile-form arg 'for-effect-no-warn))
|
||||
(byte-compile-form nil))
|
||||
|
||||
;; Return the list of items in CONDITION-PARAM that match PRED-LIST.
|
||||
|
|
|
@ -478,7 +478,8 @@ artlist; otherwise store the ARTLIST in the group parameters."
|
|||
|
||||
(deffoo nnselect-request-move-article
|
||||
(article _group _server accept-form &optional last _internal-move-group)
|
||||
(let* ((artgroup (nnselect-article-group article))
|
||||
(let* ((nnimap-expunge 'immediately)
|
||||
(artgroup (nnselect-article-group article))
|
||||
(artnumber (nnselect-article-number article))
|
||||
(to-newsgroup (nth 1 accept-form))
|
||||
(to-method (gnus-find-method-for-group to-newsgroup))
|
||||
|
|
|
@ -921,15 +921,13 @@ the semicolon. This function skips the semicolon."
|
|||
"goto_statement"
|
||||
"case_statement")))
|
||||
|
||||
;; IMO it makes more sense to define what's NOT sexp, since sexp by
|
||||
;; spirit, especially when used for movement, is like "expression"
|
||||
;; or "syntax unit". --yuan
|
||||
(setq-local treesit-sexp-type-regexp
|
||||
(regexp-opt '("preproc"
|
||||
"declarator"
|
||||
"qualifier"
|
||||
"type"
|
||||
"parameter"
|
||||
"expression"
|
||||
"literal"
|
||||
"string")))
|
||||
;; It more useful to include semicolons as sexp so that
|
||||
;; users can move to the end of a statement.
|
||||
(rx (not (or "{" "}" "[" "]" "(" ")" ","))))
|
||||
|
||||
;; Nodes like struct/enum/union_specifier can appear in
|
||||
;; function_definitions, so we need to find the top-level node.
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
;; Author: Pavel Kobyakov <pk_at_work@yahoo.com>
|
||||
;; Maintainer: João Távora <joaotavora@gmail.com>
|
||||
;; Version: 1.3.2
|
||||
;; Version: 1.3.3
|
||||
;; Keywords: c languages tools
|
||||
;; Package-Requires: ((emacs "26.1") (eldoc "1.14.0") (project "0.7.1"))
|
||||
|
||||
|
@ -371,11 +371,19 @@ diagnostics at BEG."
|
|||
(flymake--diag-accessor flymake-diagnostic-end flymake--diag-end end)
|
||||
(flymake--diag-accessor flymake-diagnostic-buffer flymake--diag-locus locus)
|
||||
|
||||
(defun flymake-diagnostic-oneliner (diag)
|
||||
"Get truncated one-line text string for diagnostic DIAG."
|
||||
(let ((txt (flymake-diagnostic-text diag)))
|
||||
(substring txt 0 (cl-loop for i from 0 for a across txt
|
||||
when (eq a ?\n) return i))))
|
||||
(defun flymake-diagnostic-oneliner (diag &optional nopaintp)
|
||||
"Get truncated one-line text string for diagnostic DIAG.
|
||||
This is useful for displaying the DIAG's text to the user in
|
||||
confined spaces, such as the echo are. Unless NOPAINTP is t,
|
||||
propertize returned text with the `echo-face' property of DIAG's
|
||||
type."
|
||||
(let* ((txt (flymake-diagnostic-text diag))
|
||||
(txt (substring txt 0 (cl-loop for i from 0 for a across txt
|
||||
when (eq a ?\n) return i))))
|
||||
(if nopaintp txt
|
||||
(propertize txt 'face
|
||||
(flymake--lookup-type-property
|
||||
(flymake-diagnostic-type diag) 'echo-face 'flymake-error)))))
|
||||
|
||||
(cl-defun flymake--overlays (&key beg end filter compare key)
|
||||
"Get flymake-related overlays.
|
||||
|
@ -577,18 +585,21 @@ Node `(Flymake)Flymake error types'"
|
|||
(put 'flymake-error 'flymake-bitmap 'flymake-error-bitmap)
|
||||
(put 'flymake-error 'severity (warning-numeric-level :error))
|
||||
(put 'flymake-error 'mode-line-face 'compilation-error)
|
||||
(put 'flymake-error 'echo-face 'error)
|
||||
(put 'flymake-error 'flymake-type-name "error")
|
||||
|
||||
(put 'flymake-warning 'face 'flymake-warning)
|
||||
(put 'flymake-warning 'flymake-bitmap 'flymake-warning-bitmap)
|
||||
(put 'flymake-warning 'severity (warning-numeric-level :warning))
|
||||
(put 'flymake-warning 'mode-line-face 'compilation-warning)
|
||||
(put 'flymake-warning 'echo-face 'warning)
|
||||
(put 'flymake-warning 'flymake-type-name "warning")
|
||||
|
||||
(put 'flymake-note 'face 'flymake-note)
|
||||
(put 'flymake-note 'flymake-bitmap 'flymake-note-bitmap)
|
||||
(put 'flymake-note 'severity (warning-numeric-level :debug))
|
||||
(put 'flymake-note 'mode-line-face 'compilation-info)
|
||||
(put 'flymake-note 'echo-face 'compilation-info)
|
||||
(put 'flymake-note 'flymake-type-name "note")
|
||||
|
||||
(defun flymake--lookup-type-property (type prop &optional default)
|
||||
|
@ -736,7 +747,7 @@ Return nil or the overlay created."
|
|||
(lambda (window _ov pos)
|
||||
(with-selected-window window
|
||||
(mapconcat
|
||||
#'flymake-diagnostic-text
|
||||
#'flymake-diagnostic-oneliner
|
||||
(flymake-diagnostics pos)
|
||||
"\n"))))
|
||||
(default-maybe 'severity (warning-numeric-level :error))
|
||||
|
@ -1263,13 +1274,7 @@ Intended for `eldoc-documentation-functions' (which see)."
|
|||
(when-let ((diags (flymake-diagnostics (point))))
|
||||
(funcall report-doc
|
||||
(mapconcat #'flymake-diagnostic-text diags "\n")
|
||||
:echo (mapconcat (lambda (d)
|
||||
(propertize (flymake-diagnostic-oneliner d)
|
||||
'face
|
||||
(flymake--lookup-type-property
|
||||
(flymake-diagnostic-type d)
|
||||
'face
|
||||
'flymake-error)))
|
||||
:echo (mapconcat #'flymake-diagnostic-oneliner
|
||||
diags "\n"))))
|
||||
|
||||
(defun flymake-goto-next-error (&optional n filter interactive)
|
||||
|
@ -1595,7 +1600,7 @@ filename of the diagnostic relative to that directory."
|
|||
"\\1\\2" bname)
|
||||
"(anon)")
|
||||
'help-echo (format "From `%s' backend" backend))
|
||||
(,(flymake-diagnostic-oneliner diag)
|
||||
(,(flymake-diagnostic-oneliner diag t)
|
||||
mouse-face highlight
|
||||
help-echo "mouse-2: visit this diagnostic"
|
||||
face nil
|
||||
|
|
|
@ -1086,6 +1086,15 @@ leading double colon is not added."
|
|||
(put-text-property pos (1+ pos) 'syntax-table
|
||||
(string-to-syntax "!"))))))))
|
||||
|
||||
(defun ruby-ts--sexp-p (node)
|
||||
;; Skip parenless calls (implicit parens are both non-obvious to the
|
||||
;; user, and might take over when we want to just over some physical
|
||||
;; parens/braces).
|
||||
(or (not (equal (treesit-node-type node)
|
||||
"argument_list"))
|
||||
(equal (treesit-node-type (treesit-node-child node 0))
|
||||
"(")))
|
||||
|
||||
(defvar-keymap ruby-ts-mode-map
|
||||
:doc "Keymap used in Ruby mode"
|
||||
:parent prog-mode-map
|
||||
|
@ -1114,8 +1123,10 @@ leading double colon is not added."
|
|||
(setq-local treesit-defun-type-regexp ruby-ts--method-regex)
|
||||
|
||||
(setq-local treesit-sexp-type-regexp
|
||||
(rx bol
|
||||
(or "class"
|
||||
(cons (rx
|
||||
bol
|
||||
(or
|
||||
"class"
|
||||
"module"
|
||||
"method"
|
||||
"array"
|
||||
|
@ -1147,7 +1158,8 @@ leading double colon is not added."
|
|||
"instance_variable"
|
||||
"global_variable"
|
||||
)
|
||||
eol))
|
||||
eol)
|
||||
#'ruby-ts--sexp-p))
|
||||
|
||||
;; AFAIK, Ruby can not nest methods
|
||||
(setq-local treesit-defun-prefer-top-level nil)
|
||||
|
|
152
lisp/treesit.el
152
lisp/treesit.el
|
@ -1783,15 +1783,17 @@ however, smaller in scope than sentences. This is used by
|
|||
`treesit-forward-sexp' and friends.")
|
||||
|
||||
(defun treesit-forward-sexp (&optional arg)
|
||||
"Tree-sitter implementation for `forward-sexp-function'.
|
||||
ARG is described in the docstring of `forward-sexp-function'."
|
||||
(interactive "^p")
|
||||
(or arg (setq arg 1))
|
||||
(funcall
|
||||
(if (> arg 0) #'treesit-end-of-thing #'treesit-beginning-of-thing)
|
||||
treesit-sexp-type-regexp (abs arg)))
|
||||
treesit-sexp-type-regexp (abs arg) 'restricted))
|
||||
|
||||
(defun treesit-transpose-sexps (&optional arg)
|
||||
"Tree-sitter `transpose-sexps' function.
|
||||
Arg is the same as in `transpose-sexps'.
|
||||
ARG is the same as in `transpose-sexps'.
|
||||
|
||||
Locate the node closest to POINT, and transpose that node with
|
||||
its sibling node ARG nodes away.
|
||||
|
@ -1896,33 +1898,53 @@ Basically,
|
|||
pattern
|
||||
(cons pattern nil)))
|
||||
|
||||
(defun treesit-beginning-of-thing (pattern &optional arg)
|
||||
(defun treesit-beginning-of-thing (pattern &optional arg tactic)
|
||||
"Like `beginning-of-defun', but generalized into things.
|
||||
|
||||
PATTERN is like `treesit-defun-type-regexp', ARG
|
||||
is the same as in `beginning-of-defun'.
|
||||
|
||||
TACTIC determines how does this function move between things. It
|
||||
can be `nested', `top-level', `restricted', or nil. `nested'
|
||||
means normal nested navigation: try to move to siblings first,
|
||||
and if there aren't enough siblings, move to the parent and its
|
||||
siblings. `top-level' means only consider top-level things, and
|
||||
nested things are ignored. `restricted' means movement is
|
||||
restricted inside the thing that encloses POS (i.e., parent),
|
||||
should there be one. If omitted, TACTIC is considered to be
|
||||
`nested'.
|
||||
|
||||
Return non-nil if successfully moved, nil otherwise."
|
||||
(pcase-let* ((arg (or arg 1))
|
||||
(`(,regexp . ,pred) (treesit--thing-unpack-pattern
|
||||
pattern))
|
||||
(dest (treesit--navigate-thing
|
||||
(point) (- arg) 'beg regexp pred)))
|
||||
(point) (- arg) 'beg regexp pred tactic)))
|
||||
(when dest
|
||||
(goto-char dest))))
|
||||
|
||||
(defun treesit-end-of-thing (pattern &optional arg)
|
||||
(defun treesit-end-of-thing (pattern &optional arg tactic)
|
||||
"Like `end-of-defun', but generalized into things.
|
||||
|
||||
PATTERN is like `treesit-defun-type-regexp', ARG is the same as
|
||||
in `end-of-defun'.
|
||||
|
||||
TACTIC determines how does this function move between things. It
|
||||
can be `nested', `top-level', `restricted', or nil. `nested'
|
||||
means normal nested navigation: try to move to siblings first,
|
||||
and if there aren't enough siblings, move to the parent and its
|
||||
siblings. `top-level' means only consider top-level things, and
|
||||
nested things are ignored. `restricted' means movement is
|
||||
restricted inside the thing that encloses POS (i.e., parent),
|
||||
should there be one. If omitted, TACTIC is considered to be
|
||||
`nested'.
|
||||
|
||||
Return non-nil if successfully moved, nil otherwise."
|
||||
(pcase-let* ((arg (or arg 1))
|
||||
(`(,regexp . ,pred) (treesit--thing-unpack-pattern
|
||||
pattern))
|
||||
(dest (treesit--navigate-thing
|
||||
(point) arg 'end regexp pred)))
|
||||
(point) arg 'end regexp pred tactic)))
|
||||
(when dest
|
||||
(goto-char dest))))
|
||||
|
||||
|
@ -1943,7 +1965,8 @@ and `treesit-defun-skipper'."
|
|||
(catch 'done
|
||||
(dotimes (_ 2)
|
||||
|
||||
(when (treesit-beginning-of-thing treesit-defun-type-regexp arg)
|
||||
(when (treesit-beginning-of-thing
|
||||
treesit-defun-type-regexp arg treesit-defun-tactic)
|
||||
(when treesit-defun-skipper
|
||||
(funcall treesit-defun-skipper)
|
||||
(setq success t)))
|
||||
|
@ -1971,7 +1994,8 @@ this function depends on `treesit-defun-type-regexp' and
|
|||
(catch 'done
|
||||
(dotimes (_ 2) ; Not making progress is better than infloop.
|
||||
|
||||
(when (treesit-end-of-thing treesit-defun-type-regexp arg)
|
||||
(when (treesit-end-of-thing
|
||||
treesit-defun-type-regexp arg treesit-defun-tactic)
|
||||
(when treesit-defun-skipper
|
||||
(funcall treesit-defun-skipper)))
|
||||
|
||||
|
@ -2144,7 +2168,7 @@ REGEXP and PRED are the same as in `treesit-thing-at-point'."
|
|||
;; -> Obviously we don't want to go to parent's end, instead, we
|
||||
;; want to go to parent's prev-sibling's end. Again, we recurse
|
||||
;; in the function to do that.
|
||||
(defun treesit--navigate-thing (pos arg side regexp &optional pred recursing)
|
||||
(defun treesit--navigate-thing (pos arg side regexp &optional pred tactic recursing)
|
||||
"Navigate thing ARG steps from POS.
|
||||
|
||||
If ARG is positive, move forward that many steps, if negative,
|
||||
|
@ -2157,6 +2181,16 @@ across, return nil.
|
|||
|
||||
REGEXP and PRED are the same as in `treesit-thing-at-point'.
|
||||
|
||||
TACTIC determines how does this function move between things. It
|
||||
can be `nested', `top-level', `restricted', or nil. `nested'
|
||||
means normal nested navigation: try to move to siblings first,
|
||||
and if there aren't enough siblings, move to the parent and its
|
||||
siblings. `top-level' means only consider top-level things, and
|
||||
nested things are ignored. `restricted' means movement is
|
||||
restricted inside the thing that encloses POS (i.e., parent),
|
||||
should there be one. If omitted, TACTIC is considered to be
|
||||
`nested'.
|
||||
|
||||
RECURSING is an internal parameter, if non-nil, it means this
|
||||
function is called recursively."
|
||||
(pcase-let*
|
||||
|
@ -2178,53 +2212,57 @@ function is called recursively."
|
|||
;; When PARENT is nil, nested and top-level are the same, if
|
||||
;; there is a PARENT, make PARENT to be the top-level parent
|
||||
;; and pretend there is no nested PREV and NEXT.
|
||||
(when (and (eq treesit-defun-tactic 'top-level)
|
||||
(when (and (eq tactic 'top-level)
|
||||
parent)
|
||||
(setq parent (treesit--top-level-thing
|
||||
parent regexp pred)
|
||||
prev nil
|
||||
next nil))
|
||||
;; Move...
|
||||
(if (> arg 0)
|
||||
;; ...forward.
|
||||
(if (and (eq side 'beg)
|
||||
;; Should we skip the defun (recurse)?
|
||||
(cond (next (and (not recursing) ; [1] (see below)
|
||||
(eq pos (funcall advance next))))
|
||||
(parent t))) ; [2]
|
||||
;; Special case: go to next beg-of-defun, but point
|
||||
;; is already on beg-of-defun. Set POS to the end
|
||||
;; of next-sib/parent defun, and run one more step.
|
||||
;; If there is a next-sib defun, we only need to
|
||||
;; recurse once, so we don't need to recurse if we
|
||||
;; are already recursing [1]. If there is no
|
||||
;; next-sib but a parent, keep stepping out
|
||||
;; (recursing) until we got out of the parents until
|
||||
;; (1) there is a next sibling defun, or (2) no more
|
||||
;; parents [2].
|
||||
;;
|
||||
;; If point on beg-of-defun but we are already
|
||||
;; recurring, that doesn't count as special case,
|
||||
;; because we have already made progress (by moving
|
||||
;; the end of next before recurring.)
|
||||
;; If TACTIC is `restricted', the implementation is very simple.
|
||||
(if (eq tactic 'restricted)
|
||||
(setq pos (funcall advance (if (> arg 0) next prev)))
|
||||
;; For `nested', it's a bit more work:
|
||||
;; Move...
|
||||
(if (> arg 0)
|
||||
;; ...forward.
|
||||
(if (and (eq side 'beg)
|
||||
;; Should we skip the defun (recurse)?
|
||||
(cond (next (and (not recursing) ; [1] (see below)
|
||||
(eq pos (funcall advance next))))
|
||||
(parent t))) ; [2]
|
||||
;; Special case: go to next beg-of-defun, but point
|
||||
;; is already on beg-of-defun. Set POS to the end
|
||||
;; of next-sib/parent defun, and run one more step.
|
||||
;; If there is a next-sib defun, we only need to
|
||||
;; recurse once, so we don't need to recurse if we
|
||||
;; are already recursing [1]. If there is no
|
||||
;; next-sib but a parent, keep stepping out
|
||||
;; (recursing) until we got out of the parents until
|
||||
;; (1) there is a next sibling defun, or (2) no more
|
||||
;; parents [2].
|
||||
;;
|
||||
;; If point on beg-of-defun but we are already
|
||||
;; recurring, that doesn't count as special case,
|
||||
;; because we have already made progress (by moving
|
||||
;; the end of next before recurring.)
|
||||
(setq pos (or (treesit--navigate-thing
|
||||
(treesit-node-end (or next parent))
|
||||
1 'beg regexp pred tactic t)
|
||||
(throw 'term nil)))
|
||||
;; Normal case.
|
||||
(setq pos (funcall advance (or next parent))))
|
||||
;; ...backward.
|
||||
(if (and (eq side 'end)
|
||||
(cond (prev (and (not recursing)
|
||||
(eq pos (funcall advance prev))))
|
||||
(parent t)))
|
||||
;; Special case: go to prev end-of-defun.
|
||||
(setq pos (or (treesit--navigate-thing
|
||||
(treesit-node-end (or next parent))
|
||||
1 'beg regexp pred t)
|
||||
(treesit-node-start (or prev parent))
|
||||
-1 'end regexp pred tactic t)
|
||||
(throw 'term nil)))
|
||||
;; Normal case.
|
||||
(setq pos (funcall advance (or next parent))))
|
||||
;; ...backward.
|
||||
(if (and (eq side 'end)
|
||||
(cond (prev (and (not recursing)
|
||||
(eq pos (funcall advance prev))))
|
||||
(parent t)))
|
||||
;; Special case: go to prev end-of-defun.
|
||||
(setq pos (or (treesit--navigate-thing
|
||||
(treesit-node-start (or prev parent))
|
||||
-1 'end regexp pred t)
|
||||
(throw 'term nil)))
|
||||
;; Normal case.
|
||||
(setq pos (funcall advance (or prev parent)))))
|
||||
(setq pos (funcall advance (or prev parent))))))
|
||||
;; A successful step! Decrement counter.
|
||||
(cl-decf counter))))
|
||||
;; Counter equal to 0 means we successfully stepped ARG steps.
|
||||
|
@ -2984,6 +3022,9 @@ See `treesit-language-source-alist' for details."
|
|||
(buffer-local-value 'url-http-response-status buffer)
|
||||
200)))))
|
||||
|
||||
(defvar treesit--install-language-grammar-out-dir-history nil
|
||||
"History for OUT-DIR for `treesit-install-language-grammar'.")
|
||||
|
||||
;;;###autoload
|
||||
(defun treesit-install-language-grammar (lang)
|
||||
"Build and install the tree-sitter language grammar library for LANG.
|
||||
|
@ -3005,11 +3046,20 @@ executable programs, such as the C/C++ compiler and linker."
|
|||
(when-let ((recipe
|
||||
(or (assoc lang treesit-language-source-alist)
|
||||
(treesit--install-language-grammar-build-recipe
|
||||
lang))))
|
||||
lang)))
|
||||
(default-out-dir
|
||||
(or (car treesit--install-language-grammar-out-dir-history)
|
||||
(locate-user-emacs-file "tree-sitter")))
|
||||
(out-dir
|
||||
(read-string
|
||||
(format "Install to (default: %s): "
|
||||
default-out-dir)
|
||||
nil
|
||||
'treesit--install-language-grammar-out-dir-history
|
||||
default-out-dir)))
|
||||
(condition-case err
|
||||
(apply #'treesit--install-language-grammar-1
|
||||
;; The nil is OUT-DIR.
|
||||
(cons nil recipe))
|
||||
(cons out-dir recipe))
|
||||
(error
|
||||
(display-warning
|
||||
'treesit
|
||||
|
|
|
@ -47,13 +47,6 @@
|
|||
/* Make syntax table lookup grant data in gl_state. */
|
||||
#define SYNTAX(c) syntax_property (c, 1)
|
||||
|
||||
/* Convert the pointer to the char to BEG-based offset from the start. */
|
||||
#define PTR_TO_OFFSET(d) POS_AS_IN_BUFFER (POINTER_TO_OFFSET (d))
|
||||
/* Strings are 0-indexed, buffers are 1-indexed; pun on the boolean
|
||||
result to get the right base index. */
|
||||
#define POS_AS_IN_BUFFER(p) \
|
||||
((p) + (NILP (gl_state.object) || BUFFERP (gl_state.object)))
|
||||
|
||||
#define RE_MULTIBYTE_P(bufp) ((bufp)->multibyte)
|
||||
#define RE_TARGET_MULTIBYTE_P(bufp) ((bufp)->target_multibyte)
|
||||
#define RE_STRING_CHAR(p, multibyte) \
|
||||
|
@ -3258,12 +3251,7 @@ re_search_2 (struct re_pattern_buffer *bufp, const char *str1, ptrdiff_t size1,
|
|||
/* See whether the pattern is anchored. */
|
||||
anchored_start = (bufp->buffer[0] == begline);
|
||||
|
||||
gl_state.object = re_match_object; /* Used by SYNTAX_TABLE_BYTE_TO_CHAR. */
|
||||
{
|
||||
ptrdiff_t charpos = SYNTAX_TABLE_BYTE_TO_CHAR (POS_AS_IN_BUFFER (startpos));
|
||||
|
||||
SETUP_SYNTAX_TABLE_FOR_OBJECT (re_match_object, charpos, 1);
|
||||
}
|
||||
RE_SETUP_SYNTAX_TABLE_FOR_OBJECT (re_match_object, startpos);
|
||||
|
||||
/* Loop through the string, looking for a place to start matching. */
|
||||
for (;;)
|
||||
|
@ -3871,10 +3859,7 @@ re_match_2 (struct re_pattern_buffer *bufp,
|
|||
{
|
||||
ptrdiff_t result;
|
||||
|
||||
ptrdiff_t charpos;
|
||||
gl_state.object = re_match_object; /* Used by SYNTAX_TABLE_BYTE_TO_CHAR. */
|
||||
charpos = SYNTAX_TABLE_BYTE_TO_CHAR (POS_AS_IN_BUFFER (pos));
|
||||
SETUP_SYNTAX_TABLE_FOR_OBJECT (re_match_object, charpos, 1);
|
||||
RE_SETUP_SYNTAX_TABLE_FOR_OBJECT (re_match_object, pos);
|
||||
|
||||
result = re_match_2_internal (bufp, (re_char *) string1, size1,
|
||||
(re_char *) string2, size2,
|
||||
|
@ -4806,8 +4791,8 @@ re_match_2_internal (struct re_pattern_buffer *bufp,
|
|||
int c1, c2;
|
||||
int s1, s2;
|
||||
int dummy;
|
||||
ptrdiff_t offset = PTR_TO_OFFSET (d);
|
||||
ptrdiff_t charpos = SYNTAX_TABLE_BYTE_TO_CHAR (offset) - 1;
|
||||
ptrdiff_t offset = POINTER_TO_OFFSET (d);
|
||||
ptrdiff_t charpos = RE_SYNTAX_TABLE_BYTE_TO_CHAR (offset) - 1;
|
||||
UPDATE_SYNTAX_TABLE (charpos);
|
||||
GET_CHAR_BEFORE_2 (c1, d, string1, end1, string2, end2);
|
||||
nchars++;
|
||||
|
@ -4846,8 +4831,8 @@ re_match_2_internal (struct re_pattern_buffer *bufp,
|
|||
int c1, c2;
|
||||
int s1, s2;
|
||||
int dummy;
|
||||
ptrdiff_t offset = PTR_TO_OFFSET (d);
|
||||
ptrdiff_t charpos = SYNTAX_TABLE_BYTE_TO_CHAR (offset);
|
||||
ptrdiff_t offset = POINTER_TO_OFFSET (d);
|
||||
ptrdiff_t charpos = RE_SYNTAX_TABLE_BYTE_TO_CHAR (offset);
|
||||
UPDATE_SYNTAX_TABLE (charpos);
|
||||
PREFETCH ();
|
||||
GET_CHAR_AFTER (c2, d, dummy);
|
||||
|
@ -4889,8 +4874,8 @@ re_match_2_internal (struct re_pattern_buffer *bufp,
|
|||
int c1, c2;
|
||||
int s1, s2;
|
||||
int dummy;
|
||||
ptrdiff_t offset = PTR_TO_OFFSET (d);
|
||||
ptrdiff_t charpos = SYNTAX_TABLE_BYTE_TO_CHAR (offset) - 1;
|
||||
ptrdiff_t offset = POINTER_TO_OFFSET (d);
|
||||
ptrdiff_t charpos = RE_SYNTAX_TABLE_BYTE_TO_CHAR (offset) - 1;
|
||||
UPDATE_SYNTAX_TABLE (charpos);
|
||||
GET_CHAR_BEFORE_2 (c1, d, string1, end1, string2, end2);
|
||||
nchars++;
|
||||
|
@ -4931,8 +4916,8 @@ re_match_2_internal (struct re_pattern_buffer *bufp,
|
|||
is the character at D, and S2 is the syntax of C2. */
|
||||
int c1, c2;
|
||||
int s1, s2;
|
||||
ptrdiff_t offset = PTR_TO_OFFSET (d);
|
||||
ptrdiff_t charpos = SYNTAX_TABLE_BYTE_TO_CHAR (offset);
|
||||
ptrdiff_t offset = POINTER_TO_OFFSET (d);
|
||||
ptrdiff_t charpos = RE_SYNTAX_TABLE_BYTE_TO_CHAR (offset);
|
||||
UPDATE_SYNTAX_TABLE (charpos);
|
||||
PREFETCH ();
|
||||
c2 = RE_STRING_CHAR (d, target_multibyte);
|
||||
|
@ -4972,8 +4957,8 @@ re_match_2_internal (struct re_pattern_buffer *bufp,
|
|||
is the character at D, and S2 is the syntax of C2. */
|
||||
int c1, c2;
|
||||
int s1, s2;
|
||||
ptrdiff_t offset = PTR_TO_OFFSET (d);
|
||||
ptrdiff_t charpos = SYNTAX_TABLE_BYTE_TO_CHAR (offset) - 1;
|
||||
ptrdiff_t offset = POINTER_TO_OFFSET (d);
|
||||
ptrdiff_t charpos = RE_SYNTAX_TABLE_BYTE_TO_CHAR (offset) - 1;
|
||||
UPDATE_SYNTAX_TABLE (charpos);
|
||||
GET_CHAR_BEFORE_2 (c1, d, string1, end1, string2, end2);
|
||||
nchars++;
|
||||
|
@ -5008,8 +4993,8 @@ re_match_2_internal (struct re_pattern_buffer *bufp,
|
|||
mcnt);
|
||||
PREFETCH ();
|
||||
{
|
||||
ptrdiff_t offset = PTR_TO_OFFSET (d);
|
||||
ptrdiff_t pos1 = SYNTAX_TABLE_BYTE_TO_CHAR (offset);
|
||||
ptrdiff_t offset = POINTER_TO_OFFSET (d);
|
||||
ptrdiff_t pos1 = RE_SYNTAX_TABLE_BYTE_TO_CHAR (offset);
|
||||
UPDATE_SYNTAX_TABLE (pos1);
|
||||
}
|
||||
{
|
||||
|
|
50
src/syntax.c
50
src/syntax.c
|
@ -250,7 +250,6 @@ SETUP_SYNTAX_TABLE (ptrdiff_t from, ptrdiff_t count)
|
|||
gl_state.b_property = BEGV;
|
||||
gl_state.e_property = ZV + 1;
|
||||
gl_state.object = Qnil;
|
||||
gl_state.offset = 0;
|
||||
if (parse_sexp_lookup_properties)
|
||||
{
|
||||
if (count > 0)
|
||||
|
@ -266,46 +265,38 @@ SETUP_SYNTAX_TABLE (ptrdiff_t from, ptrdiff_t count)
|
|||
/* Same as above, but in OBJECT. If OBJECT is nil, use current buffer.
|
||||
If it is t (which is only used in fast_c_string_match_ignore_case),
|
||||
ignore properties altogether.
|
||||
|
||||
This is meant for regex-emacs.c to use. For buffers, regex-emacs.c
|
||||
passes arguments to the UPDATE_SYNTAX_TABLE functions which are
|
||||
relative to BEGV. So if it is a buffer, we set the offset field to
|
||||
BEGV. */
|
||||
FROMBYTE is an regexp-byteoffset. */
|
||||
|
||||
void
|
||||
SETUP_SYNTAX_TABLE_FOR_OBJECT (Lisp_Object object,
|
||||
ptrdiff_t from, ptrdiff_t count)
|
||||
RE_SETUP_SYNTAX_TABLE_FOR_OBJECT (Lisp_Object object,
|
||||
ptrdiff_t frombyte)
|
||||
{
|
||||
SETUP_BUFFER_SYNTAX_TABLE ();
|
||||
gl_state.object = object;
|
||||
if (BUFFERP (gl_state.object))
|
||||
{
|
||||
struct buffer *buf = XBUFFER (gl_state.object);
|
||||
gl_state.b_property = 1;
|
||||
gl_state.e_property = BUF_ZV (buf) - BUF_BEGV (buf) + 1;
|
||||
gl_state.offset = BUF_BEGV (buf) - 1;
|
||||
gl_state.b_property = BEG;
|
||||
gl_state.e_property = BUF_ZV (buf);
|
||||
}
|
||||
else if (NILP (gl_state.object))
|
||||
{
|
||||
gl_state.b_property = 1;
|
||||
gl_state.e_property = ZV - BEGV + 1;
|
||||
gl_state.offset = BEGV - 1;
|
||||
gl_state.b_property = BEG;
|
||||
gl_state.e_property = ZV; /* FIXME: Why not +1 like in SETUP_SYNTAX_TABLE? */
|
||||
}
|
||||
else if (EQ (gl_state.object, Qt))
|
||||
{
|
||||
gl_state.b_property = 0;
|
||||
gl_state.e_property = PTRDIFF_MAX;
|
||||
gl_state.offset = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
gl_state.b_property = 0;
|
||||
gl_state.e_property = 1 + SCHARS (gl_state.object);
|
||||
gl_state.offset = 0;
|
||||
}
|
||||
if (parse_sexp_lookup_properties)
|
||||
update_syntax_table (from + gl_state.offset - (count <= 0),
|
||||
count, 1, gl_state.object);
|
||||
update_syntax_table (RE_SYNTAX_TABLE_BYTE_TO_CHAR (frombyte),
|
||||
1, 1, gl_state.object);
|
||||
}
|
||||
|
||||
/* Update gl_state to an appropriate interval which contains CHARPOS. The
|
||||
|
@ -341,8 +332,8 @@ update_syntax_table (ptrdiff_t charpos, EMACS_INT count, bool init,
|
|||
if (!i)
|
||||
return;
|
||||
i = gl_state.forward_i;
|
||||
gl_state.b_property = i->position - gl_state.offset;
|
||||
gl_state.e_property = INTERVAL_LAST_POS (i) - gl_state.offset;
|
||||
gl_state.b_property = i->position;
|
||||
gl_state.e_property = INTERVAL_LAST_POS (i);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -362,7 +353,7 @@ update_syntax_table (ptrdiff_t charpos, EMACS_INT count, bool init,
|
|||
{
|
||||
invalidate = false;
|
||||
gl_state.forward_i = i;
|
||||
gl_state.e_property = INTERVAL_LAST_POS (i) - gl_state.offset;
|
||||
gl_state.e_property = INTERVAL_LAST_POS (i);
|
||||
}
|
||||
}
|
||||
else if (charpos >= INTERVAL_LAST_POS (i)) /* Move right. */
|
||||
|
@ -375,7 +366,7 @@ update_syntax_table (ptrdiff_t charpos, EMACS_INT count, bool init,
|
|||
{
|
||||
invalidate = false;
|
||||
gl_state.backward_i = i;
|
||||
gl_state.b_property = i->position - gl_state.offset;
|
||||
gl_state.b_property = i->position;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -391,12 +382,12 @@ update_syntax_table (ptrdiff_t charpos, EMACS_INT count, bool init,
|
|||
if (count > 0)
|
||||
{
|
||||
gl_state.backward_i = i;
|
||||
gl_state.b_property = i->position - gl_state.offset;
|
||||
gl_state.b_property = i->position;
|
||||
}
|
||||
else
|
||||
{
|
||||
gl_state.forward_i = i;
|
||||
gl_state.e_property = INTERVAL_LAST_POS (i) - gl_state.offset;
|
||||
gl_state.e_property = INTERVAL_LAST_POS (i);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -426,13 +417,13 @@ update_syntax_table (ptrdiff_t charpos, EMACS_INT count, bool init,
|
|||
{
|
||||
if (count > 0)
|
||||
{
|
||||
gl_state.e_property = i->position - gl_state.offset;
|
||||
gl_state.e_property = i->position;
|
||||
gl_state.forward_i = i;
|
||||
}
|
||||
else
|
||||
{
|
||||
gl_state.b_property
|
||||
= i->position + LENGTH (i) - gl_state.offset;
|
||||
= i->position + LENGTH (i);
|
||||
gl_state.backward_i = i;
|
||||
}
|
||||
return;
|
||||
|
@ -442,7 +433,7 @@ update_syntax_table (ptrdiff_t charpos, EMACS_INT count, bool init,
|
|||
if (count > 0)
|
||||
{
|
||||
gl_state.e_property
|
||||
= i->position + LENGTH (i) - gl_state.offset
|
||||
= i->position + LENGTH (i)
|
||||
/* e_property at EOB is not set to ZV but to ZV+1, so that
|
||||
we can do INC(from);UPDATE_SYNTAX_TABLE_FORWARD without
|
||||
having to check eob between the two. */
|
||||
|
@ -451,7 +442,7 @@ update_syntax_table (ptrdiff_t charpos, EMACS_INT count, bool init,
|
|||
}
|
||||
else
|
||||
{
|
||||
gl_state.b_property = i->position - gl_state.offset;
|
||||
gl_state.b_property = i->position;
|
||||
gl_state.backward_i = i;
|
||||
}
|
||||
return;
|
||||
|
@ -2201,8 +2192,7 @@ skip_syntaxes (bool forwardp, Lisp_Object string, Lisp_Object lim)
|
|||
while (!parse_sexp_lookup_properties
|
||||
|| pos < gl_state.e_property);
|
||||
|
||||
update_syntax_table_forward (pos + gl_state.offset,
|
||||
false, gl_state.object);
|
||||
update_syntax_table_forward (pos, false, gl_state.object);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
24
src/syntax.h
24
src/syntax.h
|
@ -85,8 +85,6 @@ struct gl_state_s
|
|||
and possibly at the
|
||||
intervals too, depending
|
||||
on: */
|
||||
/* Offset for positions specified to UPDATE_SYNTAX_TABLE. */
|
||||
ptrdiff_t offset;
|
||||
};
|
||||
|
||||
extern struct gl_state_s gl_state;
|
||||
|
@ -147,28 +145,27 @@ extern bool syntax_prefix_flag_p (int c);
|
|||
|
||||
extern unsigned char const syntax_spec_code[0400];
|
||||
|
||||
/* Convert the byte offset BYTEPOS into a character position,
|
||||
for the object recorded in gl_state with SETUP_SYNTAX_TABLE_FOR_OBJECT.
|
||||
/* Convert the regexp's BYTEOFFSET into a character position,
|
||||
for the object recorded in gl_state with RE_SETUP_SYNTAX_TABLE_FOR_OBJECT.
|
||||
|
||||
The value is meant for use in code that does nothing when
|
||||
parse_sexp_lookup_properties is false, so return 0 in that case,
|
||||
for speed. */
|
||||
|
||||
INLINE ptrdiff_t
|
||||
SYNTAX_TABLE_BYTE_TO_CHAR (ptrdiff_t bytepos)
|
||||
RE_SYNTAX_TABLE_BYTE_TO_CHAR (ptrdiff_t byteoffset)
|
||||
{
|
||||
return (! parse_sexp_lookup_properties
|
||||
? 0
|
||||
: STRINGP (gl_state.object)
|
||||
? string_byte_to_char (gl_state.object, bytepos)
|
||||
? string_byte_to_char (gl_state.object, byteoffset)
|
||||
: BUFFERP (gl_state.object)
|
||||
? ((buf_bytepos_to_charpos
|
||||
(XBUFFER (gl_state.object),
|
||||
(bytepos + BUF_BEGV_BYTE (XBUFFER (gl_state.object)) - 1)))
|
||||
- BUF_BEGV (XBUFFER (gl_state.object)) + 1)
|
||||
(byteoffset + BUF_BEGV_BYTE (XBUFFER (gl_state.object))))))
|
||||
: NILP (gl_state.object)
|
||||
? BYTE_TO_CHAR (bytepos + BEGV_BYTE - 1) - BEGV + 1
|
||||
: bytepos);
|
||||
? BYTE_TO_CHAR (byteoffset + BEGV_BYTE)
|
||||
: byteoffset);
|
||||
}
|
||||
|
||||
/* Make syntax table state (gl_state) good for CHARPOS, assuming it is
|
||||
|
@ -178,8 +175,7 @@ INLINE void
|
|||
UPDATE_SYNTAX_TABLE_FORWARD (ptrdiff_t charpos)
|
||||
{ /* Performs just-in-time syntax-propertization. */
|
||||
if (parse_sexp_lookup_properties && charpos >= gl_state.e_property)
|
||||
update_syntax_table_forward (charpos + gl_state.offset,
|
||||
false, gl_state.object);
|
||||
update_syntax_table_forward (charpos, false, gl_state.object);
|
||||
}
|
||||
|
||||
/* Make syntax table state (gl_state) good for CHARPOS, assuming it is
|
||||
|
@ -189,7 +185,7 @@ INLINE void
|
|||
UPDATE_SYNTAX_TABLE_BACKWARD (ptrdiff_t charpos)
|
||||
{
|
||||
if (parse_sexp_lookup_properties && charpos < gl_state.b_property)
|
||||
update_syntax_table (charpos + gl_state.offset, -1, false, gl_state.object);
|
||||
update_syntax_table (charpos, -1, false, gl_state.object);
|
||||
}
|
||||
|
||||
/* Make syntax table good for CHARPOS. */
|
||||
|
@ -212,7 +208,7 @@ SETUP_BUFFER_SYNTAX_TABLE (void)
|
|||
}
|
||||
|
||||
extern ptrdiff_t scan_words (ptrdiff_t, EMACS_INT);
|
||||
extern void SETUP_SYNTAX_TABLE_FOR_OBJECT (Lisp_Object, ptrdiff_t, ptrdiff_t);
|
||||
extern void RE_SETUP_SYNTAX_TABLE_FOR_OBJECT (Lisp_Object, ptrdiff_t);
|
||||
|
||||
INLINE_HEADER_END
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue