(defvar scope-gen-id-alist nil)
-(defsubst scope-local-get (sym local)
- "Get binding position of symbol SYM in local context LOCAL."
- (alist-get sym local))
-
(defsubst scope-local-new (sym pos &optional local)
"Return new local context with SYM bound at POS.
((symbolp sym) sym)
((symbol-with-pos-p sym) (bare-symbol sym))))
-(defsubst scope-report (type beg len &optional def _id)
- (funcall scope-callback type beg len def))
+(defsubst scope-report (type beg len &optional id def)
+ (funcall scope-callback type beg len id (or def (and (numberp id) id))))
(defun scope-s (local sym)
(let* ((beg (scope-sym-pos sym))
(cond
((keywordp bare) (scope-report 'constant beg len))
((and scope-current-let-alist-form (= (aref name 0) ?.))
- ;; FIXME: Support jumping to `let-alist' call as the
- ;; "definition" of the `.foo' variables.
- (scope-report 'variable beg len (cdr scope-current-let-alist-form)
- (list 'let-alist (car scope-current-let-alist-form) bare)))
- (t (scope-report 'variable beg len (scope-local-get bare local)
- (or (alist-get bare scope-gen-id-alist)
- (scope-local-get bare local))))))))
+ (scope-report 'variable beg len
+ (list 'let-alist (car scope-current-let-alist-form) bare)
+ (cdr scope-current-let-alist-form)))
+ (t
+ (let ((id (alist-get bare local)))
+ (scope-report 'variable beg len id)))))))
(defun scope-let-1 (local0 local bindings body)
(if bindings
(bare (bare-symbol sym))
(len (length (symbol-name bare)))
(beg (scope-sym-pos sym)))
- (when beg (funcall scope-callback 'variable beg len beg))
+ (when beg (scope-report 'variable beg len beg))
(scope-1 local0 (cadr binding))
(scope-let-1 local0 (scope-local-new bare beg local)
(cdr bindings) body))
(bare (bare-symbol sym))
(len (length (symbol-name bare)))
(beg (scope-sym-pos sym)))
- (when beg (funcall scope-callback 'variable beg len beg))
+ (when beg (scope-report 'variable beg len beg))
(scope-1 local (cadr binding))
(scope-let*
(scope-local-new bare beg local) (cdr bindings) body))
(defun scope-interactive (local intr spec modes)
(when (symbol-with-pos-p intr)
- (funcall scope-callback 'special-form
- (symbol-with-pos-pos intr)
- (length (symbol-name (scope-sym-bare intr)))
- nil))
+ (scope-report 'special-form
+ (symbol-with-pos-pos intr)
+ (length (symbol-name (scope-sym-bare intr)))))
(scope-1 local spec)
(mapc #'scope-major-mode-name modes))
(symbolp decl)))
((eq (bare-symbol decl) 'declare)))
(when (symbol-with-pos-p decl)
- (funcall scope-callback 'macro
- (symbol-with-pos-pos decl)
- (length (symbol-name (bare-symbol decl)))
- nil))
+ (scope-report 'macro
+ (symbol-with-pos-pos decl)
+ (length (symbol-name (bare-symbol decl)))))
(dolist (spec (cdr form))
(when-let ((head (car-safe spec))
(bare (scope-sym-bare head)))
(when (symbol-with-pos-p head)
- (funcall scope-callback 'declaration
- (symbol-with-pos-pos head)
- (length (symbol-name bare))
- nil))
+ (scope-report 'declaration
+ (symbol-with-pos-pos head)
+ (length (symbol-name bare))))
(cl-case bare
(completion (scope-sharpquote local (cadr spec)))
(interactive-only
(let* ((beg (symbol-with-pos-pos arg))
(bare (bare-symbol arg))
(len (length (symbol-name bare))))
- (when beg
- (if (memq (bare-symbol arg) '(&optional &rest _))
- (funcall scope-callback 'ampersand beg len nil)
- (funcall scope-callback 'variable beg len beg))))))
+ (when (and beg (not (eq bare '_)))
+ (if (memq bare '(&optional &rest))
+ (scope-report 'ampersand beg len)
+ (scope-report 'variable beg len beg))))))
;; Handle BODY.
(let ((l local))
(dolist (arg args)
(defun scope-defun (local name args body)
(when-let ((beg (scope-sym-pos name))
(bare (scope-sym-bare name)))
- (funcall scope-callback 'defun beg (length (symbol-name bare)) nil))
+ (scope-report 'defun beg (length (symbol-name bare))))
(scope-lambda local args body))
(defun scope-cond (local clauses)
(defun scope-defvar (local name init)
(when-let ((beg (scope-sym-pos name))
(bare (scope-sym-bare name)))
- (funcall scope-callback 'defvar beg (length (symbol-name bare)) nil))
+ (scope-report 'defvar beg (length (symbol-name bare))))
(scope-1 local init))
(defun scope-condition-case (local var bodyform handlers)
(beg (when (symbol-with-pos-p var) (symbol-with-pos-pos var)))
(l (scope-local-new bare beg local)))
(when beg
- (funcall scope-callback 'variable beg (length (symbol-name bare)) beg))
+ (scope-report 'variable beg (length (symbol-name bare)) beg))
(scope-1 local bodyform)
(dolist (handler handlers)
(dolist (cond-name (ensure-list (car-safe handler)))
(clen (length (symbol-name cbare))))
(cond
((booleanp cbare))
- ((keywordp cbare) (funcall scope-callback 'constant cbeg clen nil))
- (t (funcall scope-callback 'condition cbeg clen nil)))))
+ ((keywordp cbare) (scope-report 'constant cbeg clen))
+ (t (scope-report 'condition cbeg clen)))))
(scope-n l (cdr handler)))))
(defvar scope-flet-alist nil)
(beg (scope-sym-pos func))
(bare (bare-symbol func)))
(when beg
- (funcall scope-callback 'function beg (length (symbol-name bare)) beg))
+ (scope-report 'function beg (length (symbol-name bare)) beg))
(if (cdr exps)
;; def is (FUNC ARGLIST BODY...)
(scope-lambda local (car exps) (cdr exps))
(beg (scope-sym-pos func))
(bare (bare-symbol func)))
(when beg
- (funcall scope-callback 'function beg (length (symbol-name bare)) beg))
+ (scope-report 'function beg (length (symbol-name bare)) beg))
(let ((scope-flet-alist (scope-local-new bare beg scope-flet-alist)))
(scope-lambda local args body)
(scope-flet local (cdr defs) forms)))
(let* ((beg (scope-sym-pos name))
(bare (bare-symbol name)))
(when beg
- (funcall scope-callback 'block beg (length (symbol-name bare)) beg))
+ (scope-report 'block beg (length (symbol-name bare)) beg))
(let ((scope-block-alist (scope-local-new bare beg scope-block-alist)))
(scope-n local body)))
(scope-n local body)))
(defun scope-return-from (local name result)
(when-let ((bare (and (symbol-with-pos-p name) (bare-symbol name)))
(pos (alist-get bare scope-block-alist)))
- (funcall scope-callback 'block
- (symbol-with-pos-pos name) (length (symbol-name bare)) pos))
+ (scope-report 'block
+ (symbol-with-pos-pos name) (length (symbol-name bare)) pos))
(scope-1 local result))
(defvar scope-assume-func-p nil)
(cond
((or (functionp bare) scope-assume-func-p)
(when beg
- (funcall scope-callback 'function beg (length (symbol-name bare)) nil)))
+ (scope-report 'function beg (length (symbol-name bare)))))
((or (assq bare scope-flet-alist) (consp arg))
(scope-1 local arg)))))
((consp arg) (scope-1 local arg))))
(bare (scope-sym-bare var))
(beg (scope-sym-pos var)))
(when beg
- (funcall scope-callback 'variable beg (length (symbol-name bare)) beg))
+ (scope-report 'variable beg (length (symbol-name bare)) beg))
(scope-loop-for-and (scope-local-new bare beg local) rest)))
(defun scope-loop-for-being-the-hash-keys-of (local0 local expr rest)
(bare (bare-symbol var))
(beg (scope-sym-pos var)))
(when beg
- (funcall scope-callback 'variable beg (length (symbol-name bare)) beg))
+ (scope-report 'variable beg (length (symbol-name bare)) beg))
(scope-loop-for local0 (scope-local-new bare beg local) (cdr-safe vars) rest))
(when-let ((bare (scope-sym-bare (car rest)))
(more (cdr rest)))
(bare (scope-sym-bare var))
(beg (scope-sym-pos var)))
(when beg
- (funcall scope-callback 'variable
+ (scope-report 'variable
beg (length (symbol-name bare)) beg))
(scope-loop (scope-local-new bare beg local) (cdr more)))
(scope-loop local rest))))
(l (scope-local-new bare beg local))
(eql (car rest)))
(when beg
- (funcall scope-callback 'variable beg (length (symbol-name bare)) beg))
+ (scope-report 'variable beg (length (symbol-name bare)) beg))
(if (eq (scope-sym-bare eql) '=)
(let* ((val (cadr rest)) (more (cddr rest)))
(scope-1 local val)
(let* ((beg (scope-sym-pos name))
(bare (scope-sym-bare name)))
(when beg
- (funcall scope-callback 'block beg (length (symbol-name bare)) beg))
+ (scope-report 'block beg (length (symbol-name bare)) beg))
(let ((scope-block-alist (scope-local-new bare beg scope-block-alist)))
(scope-loop local rest))))
(let ((bare (scope-sym-bare name))
(beg (scope-sym-pos name)))
(when beg
- (funcall scope-callback 'function beg (length (symbol-name bare)) beg))
+ (scope-report 'function beg (length (symbol-name bare)) beg))
(dolist (binding bindings)
(let* ((sym (car (ensure-list binding)))
(beg (symbol-with-pos-pos sym))
(bare (bare-symbol sym)))
(when beg
- (funcall scope-callback 'variable beg (length (symbol-name bare)) beg))
+ (scope-report 'variable beg (length (symbol-name bare)) beg))
(scope-1 local (cadr binding))))
(let ((l local))
(dolist (binding bindings)
(let* ((head (car regexp))
(bare (scope-sym-bare head)))
(when bare
- (funcall scope-callback 'rx-construct
- (symbol-with-pos-pos head) (length (symbol-name bare))
- (alist-get bare scope-rx-alist)))
+ (scope-report 'rx-construct
+ (symbol-with-pos-pos head) (length (symbol-name bare))
+ (alist-get bare scope-rx-alist)))
(cond
((memq bare '(literal regex regexp eval))
(scope-1 local (cadr regexp)))
group-n submatch-n))
(scope-rx local (cdr regexp)))))
(when-let ((bare (scope-sym-bare regexp)))
- (funcall scope-callback 'rx-construct
- (symbol-with-pos-pos regexp) (length (symbol-name bare))
- (alist-get bare scope-rx-alist)))))
+ (scope-report 'rx-construct
+ (symbol-with-pos-pos regexp) (length (symbol-name bare))
+ (alist-get bare scope-rx-alist)))))
(defun scope-rx-define (local name rest)
(when-let ((bare (scope-sym-bare name)))
- (funcall scope-callback 'rx-construct
- (symbol-with-pos-pos name) (length (symbol-name bare)) nil))
+ (scope-report 'rx-construct
+ (symbol-with-pos-pos name) (length (symbol-name bare)) nil))
(if (not (cdr rest))
(scope-rx-1 local (car rest))
(let ((l scope-rx-alist)
(len (length (symbol-name bare))))
(when beg
(if (memq (bare-symbol arg) '(&optional &rest _))
- (funcall scope-callback 'ampersand beg len nil)
- (funcall scope-callback 'rx-construct beg len beg))))))
+ (scope-report 'ampersand beg len)
+ (scope-report 'rx-construct beg len beg))))))
(dolist (arg args)
(when-let ((bare (bare-symbol arg))
(beg (scope-sym-pos arg)))
(let ((name (car binding)) (rest (cdr binding)))
(when-let ((bare (scope-sym-bare name))
(beg (symbol-with-pos-pos name)))
- (funcall scope-callback 'rx-construct
+ (scope-report 'rx-construct
beg (length (symbol-name bare)) beg))
(if (cdr rest)
(let ((l scope-rx-alist)
(len (length (symbol-name bare))))
(when beg
(if (memq (bare-symbol arg) '(&optional &rest _))
- (funcall scope-callback 'ampersand beg len nil)
- (funcall scope-callback 'rx-construct beg len beg))))))
+ (scope-report 'ampersand beg len)
+ (scope-report 'rx-construct beg len beg))))))
(dolist (arg args)
(when-let ((bare (bare-symbol arg))
(beg (scope-sym-pos arg)))
(defun scope-gv-define-expander (local name handler)
(when-let* ((beg (scope-sym-pos name)) (bare (scope-sym-bare name)))
- (funcall scope-callback 'defun beg (length (symbol-name bare)) nil))
+ (scope-report 'defun beg (length (symbol-name bare))))
(scope-1 local handler))
(defun scope-gv-define-simple-setter (local name setter rest)
(when-let* ((beg (scope-sym-pos name)) (bare (scope-sym-bare name)))
- (funcall scope-callback 'defun beg (length (symbol-name bare)) nil))
+ (scope-report 'defun beg (length (symbol-name bare))))
(when-let* ((beg (scope-sym-pos setter)) (bare (scope-sym-bare setter)))
- (funcall scope-callback 'function beg (length (symbol-name bare)) nil))
+ (scope-report 'function beg (length (symbol-name bare))))
(scope-n local rest))
(defun scope-catch (local tag body)
(sym (cadr tag))
(beg (scope-sym-pos sym))
(bare (scope-sym-bare sym)))
- (funcall scope-callback 'throw-tag beg (length (symbol-name bare)) nil))
+ (scope-report 'throw-tag beg (length (symbol-name bare))))
(scope-n local body))
(defun scope-face (_local face-form)
(cond
((symbol-with-pos-p face)
(when-let ((beg (scope-sym-pos face)) (bare (scope-sym-bare face)))
- (funcall scope-callback 'face beg (length (symbol-name bare)) nil)))
+ (scope-report 'face beg (length (symbol-name bare)))))
((keywordp (scope-sym-bare (car-safe face)))
(let ((l face))
(while l
((keywordp bare)))
(when-let ((beg (scope-sym-pos kw))
(len (length (symbol-name bare))))
- (funcall scope-callback 'constant beg len nil))
+ (scope-report 'constant beg len))
(when (eq bare :inherit)
(when-let ((beg (scope-sym-pos vl)) (fbare (scope-sym-bare vl)))
- (funcall scope-callback 'face beg (length (symbol-name fbare)) nil))))))))))
+ (scope-report 'face beg (length (symbol-name fbare))))))))))))
(defun scope-deftype (local name args body)
(when-let* ((beg (scope-sym-pos name)) (bare (scope-sym-bare name)))
- (funcall scope-callback 'type beg (length (symbol-name bare)) nil))
+ (scope-report 'type beg (length (symbol-name bare))))
(scope-lambda local args body))
(defun scope-widget-type (_local form)
(cond
((symbol-with-pos-p type)
(when-let* ((beg (scope-sym-pos type)) (bare (scope-sym-bare type)))
- (funcall scope-callback 'widget-type
- (symbol-with-pos-pos type)
- (length (symbol-name (bare-symbol type))) nil)))
+ (scope-report 'widget-type
+ (symbol-with-pos-pos type)
+ (length (symbol-name (bare-symbol type))))))
((consp type)
(let ((head (car type)))
(when-let ((beg (scope-sym-pos head)) (bare (scope-sym-bare head)))
- (funcall scope-callback 'widget-type beg (length (symbol-name bare)) nil))
+ (scope-report 'widget-type beg (length (symbol-name bare))))
(when-let ((bare (scope-sym-bare head)))
(scope-widget-type-arguments bare (cdr type)))))))
(defun scope-widget-type-keyword-arguments (head kw args)
(when-let ((beg (scope-sym-pos kw))
(len (length (symbol-name (bare-symbol kw)))))
- (funcall scope-callback 'constant beg len nil))
+ (scope-report 'constant beg len))
(cond
((and (memq head '(plist alist))
(memq kw '(:key-type :value-type)))
(when-let* ((fun (car args))
(beg (scope-sym-pos fun))
(bare (scope-sym-bare fun)))
- (funcall scope-callback 'function beg (length (symbol-name bare)) nil)))
+ (scope-report 'function beg (length (symbol-name bare)))))
((memq kw '(:args))
(mapc #'scope-widget-type-1 (car args))))
;; TODO: (restricted-sexp :match-alternatives CRITERIA)
(when-let* ((fun (car args))
(beg (scope-sym-pos fun))
(bare (scope-sym-bare fun)))
- (funcall scope-callback 'function beg (length (symbol-name bare)) nil)))
+ (scope-report 'function beg (length (symbol-name bare)))))
((variable-item)
(when-let* ((var (car args))
(beg (scope-sym-pos var))
(bare (scope-sym-bare var)))
- (funcall scope-callback 'variable beg (length (symbol-name bare)) nil)))))
+ (scope-report 'variable beg (length (symbol-name bare)))))))
(defun scope-quoted-group (_local sym-form)
(when-let* (((eq (scope-sym-bare (car-safe sym-form)) 'quote))
(sym (cadr sym-form))
(beg (scope-sym-pos sym))
(bare (scope-sym-bare sym)))
- (funcall scope-callback 'group beg (length (symbol-name bare)) nil)))
+ (scope-report 'group beg (length (symbol-name bare)))))
(defun scope-defmethod-1 (local0 local args body)
(if args
((setq bare (scope-sym-bare var))
(when-let* ((beg (scope-sym-pos var))
(len (length (symbol-name bare))))
- (funcall scope-callback 'variable beg len beg))
+ (scope-report 'variable beg len beg))
(cond
((consp spec)
(let ((head (car spec)) (form (cadr spec)))
(when-let* ((beg (symbol-with-pos-pos spec))
(bare (bare-symbol spec))
(len (length (symbol-name bare))))
- (funcall scope-callback 'type beg len nil))))
+ (scope-report 'type beg len))))
(scope-defmethod-1
local0 (scope-local-new bare (scope-sym-pos var) local)
(cdr args) body)))))
(cond
((memq bare '(&optional &rest &body _))
(when-let ((beg (scope-sym-pos arg)))
- (funcall scope-callback 'ampersand beg (length (symbol-name bare)) nil))
+ (scope-report 'ampersand beg (length (symbol-name bare))))
(scope-defmethod-1 local0 local (cdr args) body))
((eq bare '&context)
(let* ((expr-type (cadr args))
(spec (cadr expr-type))
(more (cddr args)))
(when-let ((beg (scope-sym-pos arg)))
- (funcall scope-callback 'ampersand beg (length (symbol-name bare)) nil))
+ (scope-report 'ampersand beg (length (symbol-name bare))))
(scope-1 local0 expr)
(cond
((consp spec)
(when-let* ((beg (symbol-with-pos-pos spec))
(bare (bare-symbol spec))
(len (length (symbol-name bare))))
- (funcall scope-callback 'type beg len beg))))
+ (scope-report 'type beg len beg))))
(scope-defmethod-1 local0 local more body)))
(t
(when-let* ((beg (scope-sym-pos arg))
(len (length (symbol-name bare))))
- (funcall scope-callback 'variable beg len beg))
+ (scope-report 'variable beg len beg))
(scope-defmethod-1
local0 (scope-local-new bare (scope-sym-pos arg) local)
(cdr args) body))))))
(defun scope-defmethod (local name rest)
"Analyze method definition for NAME with args REST in LOCAL context."
(when-let* ((beg (scope-sym-pos name)) (bare (scope-sym-bare name)))
- (funcall scope-callback 'defun beg (length (symbol-name bare)) nil))
+ (scope-report 'defun beg (length (symbol-name bare))))
;; [EXTRA]
(when (eq (scope-sym-bare (car rest)) :extra)
(scope-s local (car rest))
(defun scope-cl-defun (local name arglist body)
(when-let ((beg (scope-sym-pos name))
(bare (scope-sym-bare name)))
- (funcall scope-callback 'defun beg (length (symbol-name bare)) nil))
+ (scope-report 'defun beg (length (symbol-name bare))))
(scope-cl-lambda local arglist body))
(defun scope-cl-lambda (local arglist body)
(if (memq bare '(&optional &rest &body &key &aux &whole))
(progn
(when-let ((beg (scope-sym-pos head)))
- (funcall scope-callback 'ampersand beg (length (symbol-name bare)) nil))
+ (scope-report 'ampersand beg (length (symbol-name bare))))
(cl-case bare
(&optional (scope-cl-lambda-optional local (cadr arglist) (cddr arglist) more body))
((&rest &body) (scope-cl-lambda-rest local (cadr arglist) (cddr arglist) more body))
(&aux (scope-cl-lambda-aux local (cadr arglist) (cddr arglist) more body))
(&whole (scope-cl-lambda-1 local (cdr arglist) more body))))
(when-let ((beg (scope-sym-pos head)))
- (funcall scope-callback 'variable beg (length (symbol-name bare)) beg))
+ (scope-report 'variable beg (length (symbol-name bare)) beg))
(scope-cl-lambda-1 (scope-local-new bare (scope-sym-pos head) local)
(cdr arglist) more body)))))
(scope-cl-lambda-1 local (list '&rest arglist) more body)))
body)
(when-let ((bare (scope-sym-bare svar)))
(when-let ((beg (scope-sym-pos svar)))
- (funcall scope-callback 'variable beg (length (symbol-name bare)) beg))
+ (scope-report 'variable beg (length (symbol-name bare)) beg))
(setq l (scope-local-new bare (scope-sym-pos svar) l)))
(when-let ((bare (scope-sym-bare var)))
(when-let ((beg (scope-sym-pos var)))
- (funcall scope-callback 'variable beg (length (symbol-name bare)) beg))
+ (scope-report 'variable beg (length (symbol-name bare)) beg))
(setq l (scope-local-new bare (scope-sym-pos var) l)))
(cond
(arglist
((memq bare '(&rest &body &key &aux))))
(progn
(when-let ((beg (scope-sym-pos head)))
- (funcall scope-callback 'ampersand beg (length (symbol-name bare)) nil))
+ (scope-report 'ampersand beg (length (symbol-name bare))))
(cl-case bare
((&rest &body) (scope-cl-lambda-rest l (cadr arglist) (cddr arglist) more body))
(&key (scope-cl-lambda-key l (cadr arglist) (cddr arglist) more body))
(scope-cl-lambda-1 l var (cons arglist more) body)
(when-let ((bare (scope-sym-bare var)))
(when-let ((beg (scope-sym-pos var)))
- (funcall scope-callback 'variable beg (length (symbol-name bare)) beg))
+ (scope-report 'variable beg (length (symbol-name bare)) beg))
(setq l (scope-local-new bare (scope-sym-pos var) l)))
(cond
(arglist
((memq bare '(&key &aux))))
(progn
(when-let ((beg (scope-sym-pos head)))
- (funcall scope-callback 'ampersand beg (length (symbol-name bare)) nil))
+ (scope-report 'ampersand beg (length (symbol-name bare))))
(cl-case bare
(&key (scope-cl-lambda-key l (cadr arglist) (cddr arglist) more body))
(&aux (scope-cl-lambda-aux l (cadr arglist) (cddr arglist) more body))))
(when-let ((bare (scope-sym-bare kw))
((keywordp bare)))
(when-let ((beg (scope-sym-pos kw)))
- (funcall scope-callback 'constant beg (length (symbol-name bare)) nil))
+ (scope-report 'constant beg (length (symbol-name bare))))
(setq l (scope-local-new bare (scope-sym-pos svar) l)))
(if (consp var)
(scope-cl-lambda-1 l var (cons (append (when svar (list svar))
body)
(when-let ((bare (scope-sym-bare svar)))
(when-let ((beg (scope-sym-pos svar)))
- (funcall scope-callback 'variable beg (length (symbol-name bare)) beg))
+ (scope-report 'variable beg (length (symbol-name bare)) beg))
(setq l (scope-local-new bare (scope-sym-pos svar) l)))
(when-let ((bare (scope-sym-bare var)))
(when-let ((beg (scope-sym-pos var)))
- (funcall scope-callback 'variable beg (length (symbol-name bare)) beg))
+ (scope-report 'variable beg (length (symbol-name bare)) beg))
(setq l (scope-local-new bare (scope-sym-pos var) l)))
(cond
(arglist
((memq bare '(&aux &allow-other-keys))))
(progn
(when-let ((beg (scope-sym-pos head)))
- (funcall scope-callback 'ampersand beg (length (symbol-name bare)) nil))
+ (scope-report 'ampersand beg (length (symbol-name bare))))
(cl-case bare
(&aux (scope-cl-lambda-aux l (cadr arglist) (cddr arglist) more body))
(&allow-other-keys (scope-cl-lambda-1 l (car more) (cdr more) body))))
(scope-cl-lambda-1 l var (cons arglist more) body)
(when-let ((bare (scope-sym-bare var)))
(when-let ((beg (scope-sym-pos var)))
- (funcall scope-callback 'variable beg (length (symbol-name bare)) beg))
+ (scope-report 'variable beg (length (symbol-name bare)) beg))
(setq l (scope-local-new bare (scope-sym-pos var) l)))
(cond
(arglist (scope-cl-lambda-aux l (car arglist) (cdr arglist) more body))
(scope-cl-lambda local arglist mbody)
(when-let ((bare (scope-sym-bare name)))
(when-let ((beg (scope-sym-pos name)))
- (funcall scope-callback 'macro beg (length (symbol-name bare)) beg))
+ (scope-report 'macro beg (length (symbol-name bare)) beg))
(let ((scope-macrolet-alist (scope-local-new bare (scope-sym-pos name) scope-macrolet-alist)))
(scope-cl-macrolet local (cdr bindings) body))))
(scope-n local body)))
(bkw (scope-sym-bare kw))
((keywordp bkw)))
(when-let ((beg (scope-sym-pos kw)))
- (funcall scope-callback 'constant beg (length (symbol-name bkw)) nil))
+ (scope-report 'constant beg (length (symbol-name bkw))))
(cl-case bkw
((:init-value :keymap :after-hook :initialize)
(scope-1 local (cadr body)))
(scope-global-minor-mode-predicate (cadr body))))
(setq body (cddr body)))
(when-let ((bare (scope-sym-bare mode)) (beg (scope-sym-pos mode)))
- (funcall scope-callback 'defun beg (length (symbol-name bare)) nil)
+ (scope-report 'defun beg (length (symbol-name bare)))
(unless explicit-var
- (funcall scope-callback 'defvar beg (length (symbol-name bare)) nil)))
+ (scope-report 'defvar beg (length (symbol-name bare)))))
(scope-n local body)))
(defun scope-global-minor-mode-predicate (pred)
(bare (bare-symbol mode))
((not (booleanp bare)))
(len (length (symbol-name bare))))
- (funcall scope-callback 'major-mode beg len nil)))
+ (scope-report 'major-mode beg len)))
(defun scope-mode-line-construct (_local format)
(scope-mode-line-construct-1 format))
(defun scope-mode-line-construct-1 (format)
(cond
((symbol-with-pos-p format)
- (funcall scope-callback 'variable
- (symbol-with-pos-pos format)
- (length (symbol-name (bare-symbol format)))
- nil))
+ (scope-report 'variable
+ (symbol-with-pos-pos format)
+ (length (symbol-name (bare-symbol format)))))
((consp format)
(let ((head (car format)))
(cond
(when bare
(cond
((assq bare scope-flet-alist)
- (funcall scope-callback 'function
- (symbol-with-pos-pos f) (length (symbol-name bare))
- (alist-get bare scope-flet-alist))
+ (scope-report 'function
+ (symbol-with-pos-pos f) (length (symbol-name bare))
+ (alist-get bare scope-flet-alist))
(scope-n local forms))
((assq bare scope-macrolet-alist)
- (funcall scope-callback 'macro
- (symbol-with-pos-pos f) (length (symbol-name bare))
- (alist-get bare scope-macrolet-alist))
+ (scope-report 'macro
+ (symbol-with-pos-pos f) (length (symbol-name bare))
+ (alist-get bare scope-macrolet-alist))
;; Local macros can be unsafe, so we do not expand them.
;; Hence we cannot interpret their arguments.
)
(alias (cadr alias-form))
(beg (scope-sym-pos alias))
(bare (scope-sym-bare alias)))
- (funcall scope-callback 'defun beg (length (symbol-name bare)) nil)))
+ (scope-report 'defun beg (length (symbol-name bare)))))
(custom-declare-variable
(when-let* ((sym-form (car forms))
((eq (scope-sym-bare (car-safe sym-form)) 'quote))
(sym (cadr sym-form))
(beg (scope-sym-pos sym))
(bare (scope-sym-bare sym)))
- (funcall scope-callback 'defvar beg (length (symbol-name bare)) nil))
+ (scope-report 'defvar beg (length (symbol-name bare))))
(when-let* ((props (cdddr forms))
(symbols-with-pos-enabled t))
(when-let ((val-form (plist-get props :type)))
(alias (cadr alias-form))
(beg (scope-sym-pos alias))
(bare (scope-sym-bare alias)))
- (funcall scope-callback 'defface beg (length (symbol-name bare)) nil))
+ (scope-report 'defface beg (length (symbol-name bare))))
(when-let* ((spec-form (cadr forms))
((eq (scope-sym-bare (car-safe spec-form)) 'quote))
(specs (cadr spec-form))
(beg (scope-sym-pos alias))
(bare (scope-sym-bare alias)))
(unless (booleanp bare)
- (funcall scope-callback 'type beg (length (symbol-name bare)) nil))))
+ (scope-report 'type beg (length (symbol-name bare))))))
(throw
(when-let* ((tag-form (car forms))
((memq (scope-sym-bare (car-safe tag-form)) '(quote \`)))
(tag (cadr tag-form))
(beg (scope-sym-pos tag))
(bare (scope-sym-bare tag)))
- (funcall scope-callback 'throw-tag beg (length (symbol-name bare)) nil)))
+ (scope-report 'throw-tag beg (length (symbol-name bare)))))
(( boundp set symbol-value define-abbrev-table
special-variable-p local-variable-p
local-variable-if-set-p
(var (cadr var-form))
(beg (scope-sym-pos var))
(bare (scope-sym-bare var)))
- (funcall scope-callback 'variable beg (length (symbol-name bare)) nil)))
+ (scope-report 'variable beg (length (symbol-name bare)))))
((run-hooks)
(dolist (var-form forms)
(when-let* (((memq (scope-sym-bare (car-safe var-form)) '(quote \`)))
(var (cadr var-form))
(beg (scope-sym-pos var))
(bare (scope-sym-bare var)))
- (funcall scope-callback 'variable beg (length (symbol-name bare)) nil))))
+ (scope-report 'variable beg (length (symbol-name bare))))))
((featurep provide require)
(when-let* ((feat-form (car forms))
((memq (scope-sym-bare (car-safe feat-form)) '(quote \`)))
(feat (cadr feat-form))
(beg (scope-sym-pos feat))
(bare (scope-sym-bare feat)))
- (funcall scope-callback 'feature beg (length (symbol-name bare)) nil)))
+ (scope-report 'feature beg (length (symbol-name bare)))))
((fboundp)
(when-let* ((fun-form (car forms))
((memq (scope-sym-bare (car-safe fun-form)) '(quote \`)))
(fun (cadr fun-form))
(beg (scope-sym-pos fun))
(bare (scope-sym-bare fun)))
- (funcall scope-callback 'function beg (length (symbol-name bare)) nil)))
+ (scope-report 'function beg (length (symbol-name bare)))))
(overlay-put
(when-let* ((prop (cadr forms))
((memq (scope-sym-bare (car-safe prop)) '(quote \`)))
(name (cadr name-form))
(beg (scope-sym-pos name))
(bare (scope-sym-bare name)))
- (funcall scope-callback 'type beg (length (symbol-name bare)) nil))
+ (scope-report 'type beg (length (symbol-name bare))))
(when-let* ((sups-form (cadr forms))
((memq (scope-sym-bare (car-safe sups-form)) '(quote \`)))
(sups (cadr sups-form)))
(dolist (sup (cadr sups-form))
(when-let* ((beg (scope-sym-pos sup)) (bare (scope-sym-bare sup)))
- (funcall scope-callback 'type beg (length (symbol-name bare)) nil)))))
+ (scope-report 'type beg (length (symbol-name bare)))))))
((cl-struct-define)
(when-let* ((name-form (car forms))
((memq (scope-sym-bare (car-safe name-form)) '(quote \`)))
(name (cadr name-form))
(beg (scope-sym-pos name))
(bare (scope-sym-bare name)))
- (funcall scope-callback 'type beg (length (symbol-name bare)) nil))
+ (scope-report 'type beg (length (symbol-name bare))))
(when-let* ((prnt-form (caddr forms))
((memq (scope-sym-bare (car-safe prnt-form)) '(quote \`)))
(prnt (cadr prnt-form))
(beg (scope-sym-pos prnt))
(bare (scope-sym-bare prnt)))
- (funcall scope-callback 'type beg (length (symbol-name bare)) nil)))
+ (scope-report 'type beg (length (symbol-name bare)))))
((define-widget)
(when-let* ((name-form (car forms))
((memq (scope-sym-bare (car-safe name-form)) '(quote \`)))
(name (cadr name-form))
(beg (scope-sym-pos name))
(bare (scope-sym-bare name)))
- (funcall scope-callback 'widget-type beg (length (symbol-name bare)) nil))
+ (scope-report 'widget-type beg (length (symbol-name bare))))
(when-let* ((prnt-form (cadr forms))
((memq (scope-sym-bare (car-safe prnt-form)) '(quote \`)))
(prnt (cadr prnt-form))
(beg (scope-sym-pos prnt))
(bare (scope-sym-bare prnt)))
- (funcall scope-callback 'widget-type beg (length (symbol-name bare)) nil))
+ (scope-report 'widget-type beg (length (symbol-name bare))))
(when-let* ((props (cdddr forms))
(symbols-with-pos-enabled t))
(when-let ((val-form (plist-get props :type)))
(name (cadr name-form))
(beg (scope-sym-pos name))
(bare (scope-sym-bare name)))
- (funcall scope-callback 'condition beg (length (symbol-name bare)) nil))
+ (scope-report 'condition beg (length (symbol-name bare))))
(when-let* ((prnt-form (caddr forms))
((memq (scope-sym-bare (car-safe prnt-form)) '(quote \`))))
(dolist (prnt (ensure-list (cadr prnt-form)))
(when-let* ((beg (scope-sym-pos prnt)) (bare (scope-sym-bare prnt)))
- (funcall scope-callback 'condition beg (length (symbol-name bare)) nil)))))
+ (scope-report 'condition beg (length (symbol-name bare)))))))
((signal)
(when-let* ((name-form (car forms))
((memq (scope-sym-bare (car-safe name-form)) '(quote \`)))
(name (cadr name-form))
(beg (scope-sym-pos name))
(bare (scope-sym-bare name)))
- (funcall scope-callback 'condition beg (length (symbol-name bare)) nil)))
+ (scope-report 'condition beg (length (symbol-name bare)))))
((provide-theme custom-declare-theme)
(when-let* ((name-form (car forms))
((memq (scope-sym-bare (car-safe name-form)) '(quote \`)))
(name (cadr name-form))
(beg (scope-sym-pos name))
(bare (scope-sym-bare name)))
- (funcall scope-callback 'theme beg (length (symbol-name bare)) nil)))
+ (scope-report 'theme beg (length (symbol-name bare)))))
((defvaralias)
(when-let* ((new-form (car forms))
((memq (scope-sym-bare (car-safe new-form)) '(quote \`)))
(name (cadr new-form))
(beg (scope-sym-pos name))
(bare (scope-sym-bare name)))
- (funcall scope-callback 'defvar beg (length (symbol-name bare)) nil))
+ (scope-report 'defvar beg (length (symbol-name bare))))
(when-let* ((base-form (cadr forms))
((memq (scope-sym-bare (car-safe base-form)) '(quote \`)))
(name (cadr base-form))
(beg (scope-sym-pos name))
(bare (scope-sym-bare name)))
- (funcall scope-callback 'variable beg (length (symbol-name bare)) nil))))
+ (scope-report 'variable beg (length (symbol-name bare))))))
(when (symbol-with-pos-p f)
- (funcall scope-callback 'function
- (symbol-with-pos-pos f) (length (symbol-name bare))
- nil))
+ (scope-report 'function
+ (symbol-with-pos-pos f) (length (symbol-name bare))))
(scope-n local forms))
((special-form-p bare)
(when (symbol-with-pos-p f)
- (funcall scope-callback 'special-form
- (symbol-with-pos-pos f) (length (symbol-name bare))
- nil))
+ (scope-report 'special-form
+ (symbol-with-pos-pos f) (length (symbol-name bare))))
(cond
((eq bare 'let)
(scope-let local (car forms) (cdr forms)))
(scope-n local forms))))
((macrop bare)
(when (symbol-with-pos-p f)
- (funcall scope-callback 'macro
- (symbol-with-pos-pos f) (length (symbol-name bare))
- nil))
+ (scope-report 'macro
+ (symbol-with-pos-pos f) (length (symbol-name bare))))
(cond
((memq bare '(let-alist))
(scope-1 local (car forms))
(let ((scope-current-let-alist-form
- (or (scope-sym-pos f)
- (cons 'gen (cl-incf scope-counter)))))
+ (cons (or (scope-sym-pos f)
+ (cons 'gen (cl-incf scope-counter)))
+ (scope-sym-pos f))))
(scope-n local (cdr forms))))
((eq (get bare 'edebug-form-spec) t) (scope-n local forms))
((eq bare 'lambda) (scope-lambda local (car forms) (cdr forms)))
(when-let* ((wsym (car-safe warning))
(beg (scope-sym-pos wsym))
(bare (scope-sym-bare wsym)))
- (funcall scope-callback 'warning-type beg
- (length (symbol-name bare)) nil)))
+ (scope-report 'warning-type beg
+ (length (symbol-name bare)))))
(scope-n local (cdr forms)))
((memq bare '(with-slots))
(scope-with-slots local (car forms) (cadr forms) (cddr forms)))
(macroexpand-1 form macroexpand-all-environment))))))))
(scope-assume-func-p
(when (symbol-with-pos-p f)
- (funcall scope-callback 'function
- (symbol-with-pos-pos f) (length (symbol-name bare))
- nil))
+ (scope-report 'function
+ (symbol-with-pos-pos f) (length (symbol-name bare))))
(scope-n local forms))))))
((symbol-with-pos-p form) (scope-s local form))))
(defun scope (callback &optional stream)
"Read and analyze code from STREAM, reporting findings via CALLBACK.
-Call CALLBACK for each analyzed symbol SYM with arguments TYPE, POS, LEN
-and BINDER, where TYPE a symbol that specifies the semantics of SYM; POS
-is the position of SYM in STREAM; LEN is SYM's length; and BINDER is the
-position in which SYM is bound. If SYM is itself a binding occurrence,
-then POS and BINDER are equal. If SYM is not lexically bound, then
-BINDER is nil. This function ignores `read-symbol-shorthands', so SYM
-and LEN always correspond to the symbol as it appears in STREAM.
+Call CALLBACK for each analyzed symbol SYM with arguments TYPE, POS,
+LEN, ID and DEF, where TYPE is a symbol that specifies the semantics of
+SYM; POS is the position of SYM in STREAM; LEN is SYM's length; ID is an
+object that uniquely identifies (co-)occurrences of SYM in the current
+defun; and DEF is the position in which SYM is locally defined, or nil.
+If SYM is itself a binding occurrence, then POS and BINDER are equal.
+If SYM is not lexically bound, then BINDER is nil. This function
+ignores `read-symbol-shorthands', so SYM and LEN always correspond to
+the symbol as it appears in STREAM.
If STREAM is nil, it defaults to the current buffer.