Subject: bug#77848: closed (Re: bug#77848: 31.0.50; treesit-update-ranges: offset setting is ignored for local parsers)

From: [email-masked] (GNU bug Tracking System)
Date: Thu, 17 Apr 2025 23:46:03 +0000

Your bug report

#77848: 31.0.50; treesit-update-ranges: offset setting is ignored for local parsers

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
77848: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=77848
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#77848: 31.0.50; treesit-update-ranges: offset setting is ignored for local parsers
From: Yuan Fu <[email-masked]>
To: Juri Linkov <[email-masked]>
Cc: Roman Rudakov <[email-masked]>, [email-masked]
Date: Thu, 17 Apr 2025 16:44:42 -0700
List-Id: <debbugs-submit.debbugs.gnu.org>

> On Apr 16, 2025, at 11:24 PM, Juri Linkov <[email-masked]> wrote:
> 
> Cc-ing Yuan for the help.
> 
>> Hello, I've noticed that when defining 'treesit-range-settings' using the
>> 'treesit-range-rules helper function, such as:
>> 
>> (treesit-range-rules
>> :embed 'markdown-inline
>> :host 'clojure
>> :offset '(1 . -1)
>> :local t
>> (clojure-ts--docstring-query '@capture))
>> 
>> The ':offset' setting doesn't have any effect.
>> 
>> After debugging the 'treesit-update-ranges' function, I noticed that it
>> calls 'treesit--update-range-1', which in turn calls
>> 'treesit--update-ranges-local' if ':local t' is
>> specified. 'treesit--update-ranges-local' does not accept offset as an
>> argument, although it is mentioned in its documentation string:
>> 
>>> OFFSET is a cons of start and end offsets that are applied to the range
>>> for the local parser.
>> 
>> This discrepancy between the documented behavior and the actual
>> implementation of 'treesit--update-ranges-local' regarding the offset
>> argument might be a bug.

Yes, it’s indeed a bug. I’ve pushed a fix for it. Thanks to you both!

Yuan

Subject: 31.0.50; treesit-update-ranges: offset setting is ignored for local parsers
From: Roman Rudakov <[email-masked]>
To: [email-masked]
Date: Wed, 16 Apr 2025 21:05:13 +0200
List-Id: <debbugs-submit.debbugs.gnu.org>

Hello, I've noticed that when defining 'treesit-range-settings' using 
the 'treesit-range-rules helper function, such as:

(treesit-range-rules
  :embed 'markdown-inline
  :host 'clojure
  :offset '(1 . -1)
  :local t
  (clojure-ts--docstring-query '@capture))

The ':offset' setting doesn't have any effect.

After debugging the 'treesit-update-ranges' function, I noticed that 
it calls 'treesit--update-range-1', which in turn calls 
'treesit--update-ranges-local' if ':local t' is 
specified. 'treesit--update-ranges-local' does not accept offset as an 
argument, although it is mentioned in its documentation string:

> OFFSET is a cons of start and end offsets that are applied to the 
> range
> for the local parser.

This discrepancy between the documented behavior and the actual 
implementation of 'treesit--update-ranges-local' regarding the offset 
argument might be a bug.

In GNU Emacs 31.0.50 (build 1, aarch64-apple-darwin24.4.0, NS
 appkit-2575.50 Version 15.4 (Build 24E248)) of 2025-04-16 built on
 macbookpro.home
Windowing system distributor 'Apple', version 10.3.2575
System Description:  macOS 15.4

Configured using:
 'configure --disable-dependency-tracking --disable-silent-rules
 --enable-locallisppath=/opt/homebrew/share/emacs/site-lisp
 --infodir=/opt/homebrew/Cellar/emacs-plus@31/31.0.50/share/info/emacs
 --prefix=/opt/homebrew/Cellar/emacs-plus@31/31.0.50
 --with-native-compilation=aot --with-xml2 --with-gnutls
 --without-compress-install --without-dbus --without-imagemagick
 --with-modules --with-rsvg --with-webp --without-pop --with-ns
 --disable-ns-self-contained 'CFLAGS=-O2 -DFD_SETSIZE=10000
 -DDARWIN_UNLIMITED_SELECT -I/opt/homebrew/opt/sqlite/include
 -I/opt/homebrew/opt/gcc/include 
 -I/opt/homebrew/opt/libgccjit/include'
 'LDFLAGS=-L/opt/homebrew/opt/sqlite/lib -L/opt/homebrew/lib/gcc/14
 -I/opt/homebrew/opt/gcc/include 
 -I/opt/homebrew/opt/libgccjit/include''
Configured features:
ACL GIF GLIB GMP GNUTLS JPEG LCMS2 LIBXML2 MODULES NATIVE_COMP NOTIFY
KQUEUE NS PDUMPER PNG RSVG SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS
TREE_SITTER WEBP XIM ZLIB
Important settings:
  value of $LANG: en_US.UTF-8
  locale-coding-system: utf-8-unix

Major mode: Lisp Interaction

Minor modes in effect:
  global-git-commit-mode: t
  magit-auto-revert-mode: t
  idle-highlight-mode: t
  subword-mode: t
  yas-minor-mode: t
  hl-todo-mode: t
  flymake-mode: t
  server-mode: t
  pdf-occur-global-minor-mode: t
  mu4e-column-faces-mode: t
  mu4e-modeline-mode: t
  auto-insert-mode: t
  electric-pair-mode: t
  org-roam-db-autosync-mode: t
  outline-minor-mode: t
  minions-mode: t
  repeat-mode: t
  save-place-mode: t
  minibuffer-electric-default-mode: t
  savehist-mode: t
  recentf-mode: t
  global-auto-revert-mode: t
  global-hl-line-mode: t
  apheleia-mode: t
  global-eldoc-mode: t
  eldoc-mode: t
  show-paren-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  tab-bar-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  window-divider-mode: t
  minibuffer-regexp-mode: t
  column-number-mode: t
  line-number-mode: t
  transient-mark-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  hs-minor-mode: t

Load-path shadows:
/Users/rrudakov/.config/emacs/elpa/ef-themes-1.9.0/theme-loaddefs 
hides 
/Users/rrudakov/.config/emacs/elpa/modus-themes-4.6.0/theme-loaddefs
/Users/rrudakov/.config/emacs/elpa/magit-4.3.2/magit-autorevert hides 
/Users/rrudakov/.config/emacs/elpa/magit-section-4.3.2/magit-autorevert
/Users/rrudakov/.config/emacs/elpa/password-store-20231201.954/password-store 
hides /opt/homebrew/share/emacs/site-lisp/pass/password-store
/Users/rrudakov/.config/emacs/elpa/transient-0.8.7/transient hides 
/opt/homebrew/Cellar/emacs-plus@31/31.0.50/share/emacs/31.0.50/lisp/transient
/Users/rrudakov/.config/emacs/elpa/ef-themes-1.9.0/theme-loaddefs 
hides 
/opt/homebrew/Cellar/emacs-plus@31/31.0.50/share/emacs/31.0.50/lisp/theme-loaddefs

Features:
(shadow emacsbug re-builder descr-text tramp-cache time-stamp shortdoc
epa-file network-stream mailalias dabbrev pcmpl-unix pcmpl-gnu misc
cal-move magit-ediff ediff ediff-merg ediff-mult ediff-wind ediff-diff
ediff-help ediff-init ediff-util magit-extras view alert log4e gntp
dired-aux cl-print edebug debug backtrace help-fns radix-tree
emacs-everywhere vc-hg vc-svn bug-reference markdown-ts-mode
markdown-mode edit-indirect misearch multi-isearch apheleia 
apheleia-rcs
apheleia-dp apheleia-formatters apheleia-utils apheleia-log
apheleia-formatter-context face-remap magit-bookmark magit-submodule
magit-blame magit-stash magit-reflog magit-bisect magit-push 
magit-pull
magit-fetch magit-clone magit-remote magit-commit magit-sequence
magit-notes magit-worktree magit-tag magit-merge magit-branch
magit-reset magit-files magit-refs magit-status magit magit-repos
magit-apply magit-wip magit-log which-func magit-diff smerge-mode diff
git-commit log-edit pcvs-util add-log magit-core magit-autorevert
magit-margin magit-transient magit-process with-editor magit-mode
benchmark magit-git magit-base vc-git diff-mode track-changes qp sort
smiley gnus-cite mm-archive mail-extr textsec uni-scripts idna-mapping
uni-confusable textsec-check clojure-ts-mode flymake-kondor 
clj-refactor
hydra lv inflections mc-hide-unmatched-lines-mode mc-mark-more 
sgml-mode
mc-cycle-cursors multiple-cursors-core rect paredit cider tramp-sh
cider-debug cider-browse-ns cider-mode cider-xref-backend cider-find
cider-completion cider-profile cider-inspector cider-eval cider-jar
arc-mode archive-mode cider-repl-history pulse cider-repl 
cider-resolve
cider-test cider-overlays cider-stacktrace cider-doc cider-browse-spec
cider-clojuredocs cider-eldoc cider-docstring cider-client 
cider-common
xref cider-completion-context cider-connection cider-popup
sesman-browser nrepl-client cider-util tramp trampver 
tramp-integration
tramp-message tramp-compat tramp-loaddefs sesman queue nrepl-dict
spinner parseedn parseclj-parser parseclj-lex parseclj-alist
clojure-mode align idle-highlight-mode cap-words superword subword
hideshow yasnippet ef-maris-dark-theme ef-themes cus-start hl-todo
checkdoc lisp-mnt flymake server github org-git ghub-graphql treepy
gsexp ghub url-http url-gw nsm url-auth google-translate-smooth-ui
google-translate-core-ui facemenu color popup google-translate-core
google-translate-backend use-package-ensure pdf-occur tablist
tablist-filter semantic/wisent/comp semantic/wisent
semantic/wisent/wisent semantic/util-modes semantic/util semantic
semantic/tag semantic/lex semantic/fw mode-local cedet pdf-isearch
let-alist pdf-misc pdf-tools pdf-view jka-compr pdf-cache pdf-info tq
pdf-util pdf-macs image-mode exif ob-restclient restclient
mu4e-column-faces mu4e-icalendar gnus-icalendar icalendar mu4e 
mu4e-org
mu4e-notification notifications mu4e-main smtpmail mu4e-view
mu4e-mime-parts mu4e-headers mu4e-thread mu4e-actions mu4e-compose
mu4e-draft gnus-msg mu4e-search mu4e-lists mu4e-bookmarks mu4e-mark
mu4e-message flow-fill mu4e-contacts mu4e-update mu4e-folders
mu4e-context mu4e-query-items mu4e-server mu4e-modeline mu4e-vars
mu4e-helpers mu4e-config mu4e-window bookmark ido mu4e-obsolete
yaml-ts-mode dockerfile-ts-mode rust-ts-mode typescript-ts-mode js
c-ts-common imenu cc-mode cc-fonts cc-guess cc-menus cc-cmds cc-styles
cc-align cc-engine cc-vars cc-defs vlf-setup vlf vlf-base vlf-tune
autoinsert rg files-x vc vc-dispatcher rg-info-hack rg-menu transient
edmacro kmacro rg-ibuffer rg-result wgrep-rg wgrep rg-history 
rg-header
ibuf-ext ibuffer ibuffer-loaddefs grep compile elec-pair
emacsql-sqlite-builtin org-roam-migrate org-roam-log org-roam-mode
org-roam-capture org-roam-id org-roam-node crm org-roam-db
org-roam-utils org-roam-compat org-roam org-capture emacsql-sqlite
emacsql emacsql-compiler magit-section cursor-sensor llama comp
comp-cstr dash async ob-async ob-plantuml ob-ditaa ob-clojure 
ob-haskell
ob-sqlite ob-shell shell ob-sql ob-python python project org-clock 
appt
diary-lib diary-loaddefs org-duration comp-run comp-common flyspell
ispell oc-basic bibtex disp-table ol-info ol-gnus nnselect gnus-art
mm-uu mml2015 mm-view mml-smime smime gnutls dig gnus-sum
shr-tag-pre-highlight language-detection shr pixel-fill kinsoku 
url-file
svg dom gnus-group gnus-undo gnus-start gnus-dbus dbus xml gnus-cloud
nnimap nnmail mail-source utf7 nnoo parse-time iso8601 gnus-spec
gnus-int gnus-range message sendmail yank-media puny dired
dired-loaddefs rfc822 mml mml-sec epa derived epg rfc6068 epg-config
mm-decode mm-bodies mm-encode mail-parse rfc2231 rfc2047 rfc2045
ietf-drums mailabbrev gmm-utils mailheader gnus-win gnus nnheader
gnus-util text-property-search mail-utils range mm-util mail-prsvr
ox-gfm ox-md ox-odt rng-loc rng-uri rng-parse rng-match rng-dt 
rng-util
rng-pttrn nxml-parse nxml-ns nxml-enc xmltok nxml-util ox-latex
ox-icalendar ox-html table ox-ascii ox-publish ox org-attach 
org-agenda
org-element org-persist org-id org-element-ast inline avl-tree 
generator
org-refile org ob ob-tangle ob-ref ob-lob ob-table ob-exp org-macro
org-src sh-script smie treesit executable ob-comint org-pcomplete
pcomplete org-list org-footnote org-faces org-entities time-date
noutline outline org-version ob-emacs-lisp ob-core ob-eval org-cycle
org-table org-keys oc org-loaddefs thingatpt find-func cal-menu 
calendar
cal-loaddefs ol org-fold org-fold-core org-compat org-macs format-spec
exec-path-from-shell minions compat repeat hippie-exp comint ansi-osc
ansi-color ring advice saveplace minibuf-eldef savehist recentf
tree-widget cl-extra help-mode autorevert filenotify use-package-core
hl-line finder-inf add-node-modules-path-autoloads alert-autoloads
apheleia-autoloads easy-mmode auctex-autoloads tex-site
buttercup-autoloads clj-refactor-autoloads cider-autoloads
clojure-mode-autoloads clojure-ts-mode-autoloads csv-mode-autoloads
debbugs-autoloads dired-git-info-autoloads dired-subtree-autoloads
dired-hacks-utils-autoloads dtrt-indent-autoloads
edit-indirect-autoloads ef-themes-autoloads elfeed-autoloads
emacs-everywhere-autoloads emmet-mode-autoloads
exec-path-from-shell-autoloads expand-region-autoloads
flymake-kondor-autoloads flyspell-correct-autoloads ghub-autoloads
git-link-autoloads gitignore-templates-autoloads gntp-autoloads
google-c-style-autoloads google-translate-autoloads
groovy-mode-autoloads haskell-mode-autoloads hl-todo-autoloads
hydra-autoloads idle-highlight-mode-autoloads inflections-autoloads
log4e-autoloads logview-autoloads datetime-autoloads extmap-autoloads
lua-mode-autoloads lv-autoloads magit-autoloads pcase
markdown-mode-autoloads minions-autoloads modus-themes-autoloads
mu4e-column-faces-autoloads multiple-cursors-autoloads
nginx-mode-autoloads nov-autoloads esxml-autoloads kv-autoloads
ob-async-autoloads async-autoloads ob-restclient-autoloads
org-roam-autoloads magit-section-autoloads llama-autoloads
emacsql-autoloads org-tree-slide-autoloads ox-jira-autoloads
ox-slack-autoloads ox-gfm-autoloads paredit-autoloads 
parseedn-autoloads
parseclj-autoloads password-store-otp-autoloads 
password-store-autoloads
pdf-tools-autoloads pip-requirements-autoloads pkgbuild-mode-autoloads
plantuml-mode-autoloads dash-autoloads popup-autoloads 
pyvenv-autoloads
queue-autoloads rainbow-mode-autoloads restclient-autoloads 
rg-autoloads
s-autoloads sesman-autoloads shr-tag-pre-highlight-autoloads
language-detection-autoloads sly-autoloads warnings spinner-autoloads
sql-indent-autoloads ssh-config-mode-autoloads rx tablist-autoloads
telega-autoloads transient-autoloads treepy-autoloads
vimrc-mode-autoloads visual-fill-column-autoloads vlf-autoloads
web-mode-autoloads wgrep-autoloads info with-editor-autoloads
yasnippet-autoloads package browse-url xdg url url-proxy url-privacy
url-expand url-methods url-history url-cookie generate-lisp-file
url-domsuf url-util mailcap url-handlers url-parse auth-source cl-seq
eieio eieio-core cl-macs password-cache json subr-x map byte-opt gv
bytecomp byte-compile url-vars cus-edit pp cus-load icons wid-edit
cl-loaddefs cl-lib rmc iso-transl tooltip cconv eldoc paren electric
uniquify ediff-hook vc-hooks lisp-float-type elisp-mode mwheel
term/ns-win ns-win ucs-normalize mule-util term/common-win tool-bar 
dnd
fontset image regexp-opt fringe tabulated-list replace newcomment
text-mode lisp-mode prog-mode register page tab-bar menu-bar 
rfn-eshadow
isearch easymenu timer select scroll-bar mouse jit-lock font-lock 
syntax
font-core term/tty-colors frame minibuffer nadvice seq simple 
cl-generic
indonesian philippine cham georgian utf-8-lang misc-lang vietnamese
tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew 
greek
romanian slovak czech european ethiopic indian cyrillic chinese
composite emoji-zwj charscript charprop case-table epa-hook
jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button 
loaddefs
theme-loaddefs faces cus-face macroexp files window text-properties
overlay sha1 md5 base64 format env code-pages mule custom widget 
keymap
hashtable-print-readable backquote threads kqueue cocoa ns lcms2
multi-tty make-network-process tty-child-frames native-compile emacs)

Memory information:
((conses 16 1254711 512110) (symbols 48 81955 84)
 (strings 32 417506 9240) (string-bytes 1 11844813)
 (vectors 16 309427) (vector-slots 8 3125768 209057)
 (floats 8 92057 1427) (intervals 56 44552 11081) (buffers 992 56))

-- 
Best regards, Roman