all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
@ 2023-03-21 14:00 Wilhelm Kirschbaum
  2023-03-23  1:03 ` Dmitry Gutov
  0 siblings, 1 reply; 83+ messages in thread
From: Wilhelm Kirschbaum @ 2023-03-21 14:00 UTC (permalink / raw)
  To: 62333; +Cc: casouri


With the following text in a buffer with elixir-ts-mode:

def foo() do
end

When I delete the `)` and re-insert it, the tree-sitter syntax 
tree does
not fully recover and the `do end` part is absent when observing 
using
treesit-explore-mode.

Before removing the `)`:

(source
 (call target: (identifier)
  (arguments
   (call target: (identifier)
    (arguments ( ))))
  (do_block do end)))

after re-inserting `)`:

(source
 (call target: (identifier)
  (arguments
   (call target: (identifier)
    (arguments ( ))))))

I can see the same behaviour using ruby-ts-mode when I remove the
following expression:

(setq-local syntax-propertize-function 
#'ruby-ts--syntax-propertize)

The ruby syntax I tested with:

def foo()
end

When I add a local `syntax-propertize-function' function to 
elixir-ts-mode
it also solves the problem of not fully recovering the tree-sitter
syntax tree.  It does not seem to matter what the function 
achieves
thought, so am a bit confused.


In GNU Emacs 30.0.50 (build 10, x86_64-pc-linux-gnu, GTK+ Version
 3.24.37, cairo version 1.17.8) of 2023-03-20 built on 
 melissa.local
Repository revision: 42fba8f36b19536964d6deb6a34f3fd1c02b43dd
Repository branch: master
System Description: Arch Linux

Configured using:
 'configure --with-native-compilation=aot --with-tree-sitter 
 --with-json
 --with-pgtk'
Configured features:
ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GPM GSETTINGS HARFBUZZ 
JPEG
JSON LCMS2 LIBSYSTEMD LIBXML2 MODULES NATIVE_COMP NOTIFY INOTIFY 
PDUMPER
PGTK PNG RSVG SECCOMP SOUND SQLITE3 THREADS TIFF 
TOOLKIT_SCROLL_BARS
TREE_SITTER WEBP XIM GTK3 ZLIB
Important settings:
  value of $LANG: en_ZA.UTF-8
  locale-coding-system: utf-8-unix

Major mode: Elixir

Minor modes in effect:
  electric-pair-mode: t
  erc-notifications-mode: t
  erc-list-mode: t
  erc-menu-mode: t
  erc-autojoin-mode: t
  erc-ring-mode: t
  erc-pcomplete-mode: t
  erc-track-mode: t
  erc-track-minor-mode: t
  erc-netsplit-mode: t
  erc-log-mode: t
  erc-services-mode: t
  erc-spelling-mode: t
  erc-match-mode: t
  erc-hl-nicks-mode: t
  erc-button-mode: t
  erc-fill-mode: t
  erc-stamp-mode: t
  erc-irccontrols-mode: t
  erc-noncommands-mode: t
  erc-move-to-prompt-mode: t
  erc-readonly-mode: t
  erc-networks-mode: t
  display-line-numbers-mode: t
  flyspell-mode: t
  whitespace-mode: t
  global-floatpays-mode: t
  floatpays-mode: t
  marginalia-mode: t
  savehist-mode: t
  vertico-mode: t
  global-corfu-mode: t
  corfu-mode: t
  yas-global-mode: t
  yas-minor-mode: t
  global-flycheck-mode: t
  flycheck-mode: t
  flymake-mode: t
  global-diff-hl-mode: t
  diff-hl-mode: t
  global-git-commit-mode: t
  shell-dirtrack-mode: t
  server-mode: t
  which-key-mode: t
  override-global-mode: t
  global-treesit-auto-mode: t
  treesit-explore-mode: t
  pixel-scroll-precision-mode: t
  repeat-mode: t
  winner-mode: t
  save-place-mode: t
  which-function-mode: t
  global-auto-revert-mode: t
  tooltip-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
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-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

Load-path shadows:
/home/wilhelm/.config/emacs/elpa/transient-20230315.1520/transient 
hides /usr/local/share/emacs/30.0.50/lisp/transient

Features:
(shadow view emacsbug shortdoc cus-start elec-pair descr-text 
sgml-mode
facemenu ruby-ts-mode ruby-mode em-unix em-term term ehelp 
em-script
em-prompt em-pred em-ls em-hist em-glob em-extpipe em-cmpl em-dirs
em-basic em-banner em-alias esh-mode esh-var eshell esh-cmd 
esh-ext
esh-opt esh-proc esh-io esh-arg esh-module esh-groups esh-util
tramp-cmds tramp-archive tramp-gvfs tramp tramp-loaddefs trampver
tramp-integration tramp-compat ls-lisp cl-print consult-imenu 
c-ts-mode
pulse jka-compr help-fns radix-tree consult-xref char-fold 
heex-ts-mode
elixir-ts-mode-tests ert-x dired-aux vc-hg vc-bzr vc-src vc-sccs 
vc-cvs
vc-rcs gnus-dired diff-hl-dired erts-mode misearch multi-isearch
goto-addr files-x git-rebase magit-extras face-remap cape 
network-stream
erc-desktop-notifications erc-imenu epa-file erc-image image-dired
image-dired-tags image-dired-external image-dired-util image-mode 
exif
erc-list erc-menu erc-join erc-ring erc-pcomplete erc-track 
erc-netsplit
erc-log erc-services erc-spelling erc-match erc-hl-nicks 
erc-button
erc-fill erc-stamp erc-goodies erc erc-backend erc-networks 
erc-common
erc-compat erc-loaddefs cursor-sensor display-line-numbers 
flyspell
ispell disp-table whitespace init.el mu4e-alert time ht alert 
log4e
notifications gntp mu4e mu4e-org mu4e-main mu4e-view gnus-art 
mm-uu
mml2015 mm-view mml-smime smime dig gnus-sum gnus-group gnus-undo
gnus-start gnus-dbus dbus gnus-cloud nnimap nnmail mail-source 
utf7 nnoo
gnus-spec gnus-int gnus-range gnus-win gnus nnheader range 
mu4e-headers
mu4e-compose mu4e-draft mu4e-actions smtpmail mu4e-search 
mu4e-lists
mu4e-bookmarks mu4e-mark mu4e-message flow-fill mule-util hl-line
mu4e-contacts mu4e-update mu4e-folders mu4e-server mu4e-context
mu4e-obsolete mu4e-vars mu4e-helpers mu4e-config ido srht plz verb 
js
c-ts-common denote mastodon mastodon-toot mastodon-iso persist
mastodon-http request flycheck-package package-build
package-build-badges package-recipe package-lint finder lisp-mnt 
eat
elfeed-show elfeed-search shr pixel-fill kinsoku elfeed-csv elfeed
elfeed-curl elfeed-log elfeed-db elfeed-lib url-queue url-file 
xml-query
fontaine modus-vivendi-theme modus-themes embark-consult 
consult-vertico
consult magit-bookmark bookmark embark-org org-element org-persist 
xdg
org-id org-refile avl-tree embark ffap marginalia savehist 
orderless
vertico kind-icon svg-lib svg dom xml corfu-terminal popon corfu 
eglot
external-completion array ert debug backtrace jsonrpc posframe
yasnippet-snippets yasnippet flycheck avy org-toc org-contrib 
org-clock
ob-shell ob-elixir async ob-async org ob ob-tangle ob-ref ob-lob
ob-table ob-exp org-macro org-src ob-comint org-pcomplete org-list
org-footnote org-faces org-entities ob-emacs-lisp ob-core ob-eval
org-cycle org-table ol org-fold org-fold-core org-keys oc 
org-loaddefs
cal-menu calendar cal-loaddefs org-version org-compat org-macs 
yaml-mode
terraform-mode hcl-mode php-mode mode-local find-func speedbar 
ezimage
dframe cc-mode cc-fonts cc-guess cc-menus cc-cmds cc-styles 
cc-align
php-face php php-project flymake-proc flymake cc-engine cc-vars 
cc-defs
erlang-start erlang etags fileloop generator xref project tempo 
align
mix use-package-bind-key elixir-ts-mode dockerfile-mode sh-script 
smie
executable pcmpl-args pcmpl-linux pcmpl-unix git-modes 
gitignore-mode
gitconfig-mode conf-mode gitattributes-mode diff-hl log-view 
vc-dir ewoc
vc forge-list forge-commands forge-semi forge-bitbucket buck 
forge-gogs
gogs forge-gitea gtea forge-gitlab glab forge-github ghub-graphql 
treepy
gsexp ghub url-http url-gw nsm url-auth let-alist gnutls 
forge-notify
forge-revnote forge-pullreq forge-issue forge-topic yaml 
parse-time
iso8601 bug-reference forge-post markdown-mode color forge-repo 
forge
forge-core forge-db closql emacsql-sqlite emacsql-sqlite-common 
emacsql
emacsql-compiler git-timemachine vc-git vc-dispatcher 
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 magit-diff smerge-mode diff 
diff-mode
git-commit log-edit message sendmail yank-media puny rfc822 mml 
mml-sec
epa epg rfc6068 epg-config gnus-util time-date mm-decode mm-bodies
mm-encode mail-parse rfc2231 rfc2047 rfc2045 mm-util ietf-drums
mail-prsvr mailabbrev mail-utils gmm-utils mailheader pcvs-util 
add-log
magit-core magit-autorevert magit-margin magit-transient 
magit-process
with-editor comp comp-cstr warnings rx shell pcomplete server 
magit-mode
transient magit-git magit-base magit-section format-spec crm 
compat
functions restclient advice noutline outline which-key ripgrep 
thingatpt
grep ag vc-svn compile text-property-search comint ansi-osc 
ansi-color
find-dired s dired-rainbow dired-subtree dired-hacks-utils dash 
dired
dired-loaddefs all-the-icons all-the-icons-faces data-material
data-weathericons data-octicons data-fileicons data-faicons
data-alltheicons exec-path-from-shell edmacro kmacro bind-key 
easy-mmode
use-package-ensure use-package-core finder-inf 
erc-hl-nicks-autoloads
forge-autoloads php-mode-autoloads kind-icon-autoloads 
erlang-autoloads
eat-autoloads flycheck-package-autoloads package-lint-autoloads
mastodon-autoloads persist-autoloads request-autoloads 
ripgrep-autoloads
terraform-mode-autoloads dired-subtree-autoloads 
yaml-mode-autoloads
avy-autoloads closql-autoloads srht-autoloads plz-autoloads
markdown-mode-autoloads verb-autoloads restclient-autoloads
embark-consult-autoloads embark-autoloads erc-image-autoloads
mu4e-alert-autoloads elfeed-autoloads cape-autoloads
marginalia-autoloads hcl-mode-autoloads corfu-terminal-autoloads
popon-autoloads package-build-autoloads derived yaml-autoloads
dockerfile-mode-autoloads treesit-auto-autoloads treesit-auto 
treesit
magit-autoloads pcase git-timemachine-autoloads 
emmet-mode-autoloads
ht-autoloads org-roam-autoloads magit-section-autoloads
emacsql-autoloads ag-autoloads posframe-autoloads
yasnippet-snippets-autoloads yasnippet-autoloads 
which-key-autoloads
ox-hugo-autoloads fontaine-autoloads diff-hl-autoloads
ob-async-autoloads async-autoloads all-the-icons-autoloads 
ts-autoloads
exunit-autoloads denote-autoloads f-autoloads s-autoloads
git-modes-autoloads tomelr-autoloads vertico-autoloads
flycheck-autoloads pkg-info-autoloads epl-autoloads deft-autoloads
git-commit-autoloads with-editor-autoloads ob-elixir-autoloads
pcmpl-args-autoloads consult-dir-autoloads consult-autoloads
mix-autoloads dired-rainbow-autoloads dired-hacks-utils-autoloads
orderless-autoloads dash-autoloads alert-autoloads log4e-autoloads
gntp-autoloads ghub-autoloads treepy-autoloads corfu-autoloads
org-contrib-autoloads web-mode-autoloads transient-autoloads info
compat-autoloads exec-path-from-shell-autoloads svg-lib-autoloads
package browse-url 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 map byte-opt gv bytecomp byte-compile url-vars
native cl-extra help-mode pixel-scroll cua-base subr-x repeat 
winner
ring saveplace which-func imenu autorevert filenotify cus-edit pp
cus-load icons wid-edit cl-loaddefs cl-lib early-init rmc 
iso-transl
tooltip cconv eldoc paren electric uniquify ediff-hook vc-hooks
lisp-float-type elisp-mode mwheel term/pgtk-win pgtk-win 
term/common-win
pgtk-dnd 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 dbusbind inotify dynamic-setting system-font-setting
font-render-setting cairo gtk pgtk lcms2 multi-tty 
make-network-process
native-compile emacs)

Memory information:
((conses 16 1519596 4641956)
 (symbols 48 97383 393)
 (strings 32 400012 126802)
 (string-bytes 1 12971136)
 (vectors 16 149074)
 (vector-slots 8 4019930 2141693)
 (floats 8 1373 14870)
 (intervals 56 61927 21199)
 (buffers 984 80))





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-21 14:00 bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes Wilhelm Kirschbaum
@ 2023-03-23  1:03 ` Dmitry Gutov
  2023-03-23  3:03   ` Yuan Fu
  0 siblings, 1 reply; 83+ messages in thread
From: Dmitry Gutov @ 2023-03-23  1:03 UTC (permalink / raw)
  To: Wilhelm Kirschbaum, 62333; +Cc: casouri

On 21/03/2023 16:00, Wilhelm Kirschbaum wrote:
> 
> With the following text in a buffer with elixir-ts-mode:
> 
> def foo() do
> end
> 
> When I delete the `)` and re-insert it, the tree-sitter syntax tree does
> not fully recover and the `do end` part is absent when observing using
> treesit-explore-mode.
> 
> Before removing the `)`:
> 
> (source
> (call target: (identifier)
>   (arguments
>    (call target: (identifier)
>     (arguments ( ))))
>   (do_block do end)))
> 
> after re-inserting `)`:
> 
> (source
> (call target: (identifier)
>   (arguments
>    (call target: (identifier)
>     (arguments ( ))))))
> 
> I can see the same behaviour using ruby-ts-mode when I remove the
> following expression:
> 
> (setq-local syntax-propertize-function #'ruby-ts--syntax-propertize)
> 
> The ruby syntax I tested with:
> 
> def foo()
> end
> 
> When I add a local `syntax-propertize-function' function to elixir-ts-mode
> it also solves the problem of not fully recovering the tree-sitter
> syntax tree.  It does not seem to matter what the function achieves
> thought, so am a bit confused.

I can repro both scenarios. Except with ruby-ts-mode, the difference in 
printed AST is the added wrapping in (program ...). But the visible 
result is similar: "end" not being highlighted.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-23  1:03 ` Dmitry Gutov
@ 2023-03-23  3:03   ` Yuan Fu
  2023-03-23  4:20     ` Dmitry Gutov
  0 siblings, 1 reply; 83+ messages in thread
From: Yuan Fu @ 2023-03-23  3:03 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: Wilhelm Kirschbaum, 62333, Eli Zaretskii

[-- Attachment #1: Type: text/plain, Size: 2242 bytes --]



> On Mar 22, 2023, at 6:03 PM, Dmitry Gutov <dgutov@yandex.ru> wrote:
> 
> On 21/03/2023 16:00, Wilhelm Kirschbaum wrote:
>> With the following text in a buffer with elixir-ts-mode:
>> def foo() do
>> end
>> When I delete the `)` and re-insert it, the tree-sitter syntax tree does
>> not fully recover and the `do end` part is absent when observing using
>> treesit-explore-mode.
>> Before removing the `)`:
>> (source
>> (call target: (identifier)
>>  (arguments
>>   (call target: (identifier)
>>    (arguments ( ))))
>>  (do_block do end)))
>> after re-inserting `)`:
>> (source
>> (call target: (identifier)
>>  (arguments
>>   (call target: (identifier)
>>    (arguments ( ))))))
>> I can see the same behaviour using ruby-ts-mode when I remove the
>> following expression:
>> (setq-local syntax-propertize-function #'ruby-ts--syntax-propertize)
>> The ruby syntax I tested with:
>> def foo()
>> end
>> When I add a local `syntax-propertize-function' function to elixir-ts-mode
>> it also solves the problem of not fully recovering the tree-sitter
>> syntax tree.  It does not seem to matter what the function achieves
>> thought, so am a bit confused.
> 
> I can repro both scenarios. Except with ruby-ts-mode, the difference in printed AST is the added wrapping in (program ...). But the visible result is similar: "end" not being highlighted.

The problem seems to be caused by narrowing during fontification: when parsing, tree-sitter sees that BUF_ZV_BYTE is smaller than it’s visible_end, and removed the part after the parenthesis from the parse tree. I suspect this has to do with the narrowed fontification we added for dealing with long lines. 

CC’ed Eli because I don’t really know anything about the locked narrow thing besides that it exists. In particular, how does it determine when and where to narrow?


To see it in action, apply this patch, and repeat Wilhelm’s experiment: remove the “)” and reinsert it. You should see

start: 9, oend: 10, nend: 9
start: 9, oend: 10, nend: 9
start: 9, oend: 9, nend: 10
start: 9, oend: 9, nend: 10
2.5 start: 10, oend: 18, nend: 10 —> culprit

(Make sure to turn off electric-pair-mode to reduce noise.)

Yuan


[-- Attachment #2: print.diff --]
[-- Type: application/octet-stream, Size: 2389 bytes --]

diff --git a/src/treesit.c b/src/treesit.c
index 5a4fe3e8803..9b46dcef2d1 100644
--- a/src/treesit.c
+++ b/src/treesit.c
@@ -806,6 +806,7 @@ treesit_record_change (ptrdiff_t start_byte, ptrdiff_t old_end_byte,
 	  eassert (start_offset <= old_end_offset);
 	  eassert (start_offset <= new_end_offset);
 
+	  printf("start: %ld, oend: %ld, nend: %ld\n", start_offset, old_end_offset, new_end_offset);
 	  treesit_tree_edit_1 (tree, start_offset, old_end_offset,
 			       new_end_offset);
 	  XTS_PARSER (lisp_parser)->need_reparse = true;
@@ -925,6 +926,7 @@ treesit_sync_visible_region (Lisp_Object parser)
   if (visible_beg > BUF_BEGV_BYTE (buffer))
     {
       /* Tree-sitter sees: insert at the beginning.  */
+      printf("1 start: %d, oend: %d, nend: %ld\n", 0, 0, visible_beg - BUF_BEGV_BYTE (buffer));
       treesit_tree_edit_1 (tree, 0, 0, visible_beg - BUF_BEGV_BYTE (buffer));
       visible_beg = BUF_BEGV_BYTE (buffer);
       eassert (visible_beg <= visible_end);
@@ -933,6 +935,9 @@ treesit_sync_visible_region (Lisp_Object parser)
   if (visible_end < BUF_ZV_BYTE (buffer))
     {
       /* Tree-sitter sees: insert at the end.  */
+      printf("2 start: %ld, oend: %ld, nend: %ld\n", visible_end - visible_beg,
+	     visible_end - visible_beg,
+	     BUF_ZV_BYTE (buffer) - visible_beg);
       treesit_tree_edit_1 (tree, visible_end - visible_beg,
 			   visible_end - visible_beg,
 			   BUF_ZV_BYTE (buffer) - visible_beg);
@@ -942,6 +947,9 @@ treesit_sync_visible_region (Lisp_Object parser)
   else if (visible_end > BUF_ZV_BYTE (buffer))
     {
       /* Tree-sitter sees: delete at the end.  */
+      printf("2.5 start: %ld, oend: %ld, nend: %ld\n", BUF_ZV_BYTE (buffer) - visible_beg,
+			   visible_end - visible_beg,
+			   BUF_ZV_BYTE (buffer) - visible_beg);
       treesit_tree_edit_1 (tree, BUF_ZV_BYTE (buffer) - visible_beg,
 			   visible_end - visible_beg,
 			   BUF_ZV_BYTE (buffer) - visible_beg);
@@ -952,6 +960,7 @@ treesit_sync_visible_region (Lisp_Object parser)
   if (visible_beg < BUF_BEGV_BYTE (buffer))
     {
       /* Tree-sitter sees: delete at the beginning.  */
+      printf("3 start: %d, oend: %ld, nend: %d\n", 0, BUF_BEGV_BYTE (buffer) - visible_beg, 0);
       treesit_tree_edit_1 (tree, 0, BUF_BEGV_BYTE (buffer) - visible_beg, 0);
       visible_beg = BUF_BEGV_BYTE (buffer);
       eassert (visible_beg <= visible_end);

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-23  3:03   ` Yuan Fu
@ 2023-03-23  4:20     ` Dmitry Gutov
  2023-03-23  7:13       ` Eli Zaretskii
  0 siblings, 1 reply; 83+ messages in thread
From: Dmitry Gutov @ 2023-03-23  4:20 UTC (permalink / raw)
  To: Yuan Fu; +Cc: Wilhelm Kirschbaum, 62333, Eli Zaretskii

On 23/03/2023 05:03, Yuan Fu wrote:
> I suspect this has to do with the narrowed fontification we added for dealing with long lines.

I'm pretty sure that one should only get used when the buffer contains a 
line longer than 10000 characters.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-23  4:20     ` Dmitry Gutov
@ 2023-03-23  7:13       ` Eli Zaretskii
  2023-03-23 21:18         ` Yuan Fu
  0 siblings, 1 reply; 83+ messages in thread
From: Eli Zaretskii @ 2023-03-23  7:13 UTC (permalink / raw)
  To: casouri, Dmitry Gutov; +Cc: wkirschbaum, 62333

> Date: Thu, 23 Mar 2023 06:20:19 +0200
> Cc: Wilhelm Kirschbaum <wkirschbaum@gmail.com>, 62333@debbugs.gnu.org,
>  Eli Zaretskii <eliz@gnu.org>
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> On 23/03/2023 05:03, Yuan Fu wrote:
> > I suspect this has to do with the narrowed fontification we added for dealing with long lines.
> 
> I'm pretty sure that one should only get used when the buffer contains a 
> line longer than 10000 characters.

Yes (but I believe the threshold is 50K characters).

The narrowing must come from somewhere else.  Yuan, how did you see
that ZV was changed?  Can you run with a breakpoint in
Fnarrow_to_region, and see which Lisp code does that?





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-23  7:13       ` Eli Zaretskii
@ 2023-03-23 21:18         ` Yuan Fu
  2023-03-23 21:30           ` Dmitry Gutov
  2023-03-23 22:06           ` Dmitry Gutov
  0 siblings, 2 replies; 83+ messages in thread
From: Yuan Fu @ 2023-03-23 21:18 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Wilhelm Kirschbaum, 62333, Dmitry Gutov



> On Mar 23, 2023, at 12:13 AM, Eli Zaretskii <eliz@gnu.org> wrote:
> 
>> Date: Thu, 23 Mar 2023 06:20:19 +0200
>> Cc: Wilhelm Kirschbaum <wkirschbaum@gmail.com>, 62333@debbugs.gnu.org,
>> Eli Zaretskii <eliz@gnu.org>
>> From: Dmitry Gutov <dgutov@yandex.ru>
>> 
>> On 23/03/2023 05:03, Yuan Fu wrote:
>>> I suspect this has to do with the narrowed fontification we added for dealing with long lines.
>> 
>> I'm pretty sure that one should only get used when the buffer contains a 
>> line longer than 10000 characters.
> 
> Yes (but I believe the threshold is 50K characters).
> 
> The narrowing must come from somewhere else.  Yuan, how did you see
> that ZV was changed?  Can you run with a breakpoint in
> Fnarrow_to_region, and see which Lisp code does that?

I did that, some observations:

1. This doesn’t reproduce on Linux (it does on Mac).
2. The function that narrowed the region is blink-matching-open
3. If I (advice-add 'blink-matching-open :around #’ignore) on my Mac, it “solves” the problem

I guess the question now is why redisplay is triggered in blink-matching-open on Mac?

Yuan




^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-23 21:18         ` Yuan Fu
@ 2023-03-23 21:30           ` Dmitry Gutov
  2023-03-23 22:06           ` Dmitry Gutov
  1 sibling, 0 replies; 83+ messages in thread
From: Dmitry Gutov @ 2023-03-23 21:30 UTC (permalink / raw)
  To: Yuan Fu, Eli Zaretskii; +Cc: Wilhelm Kirschbaum, 62333

On 23/03/2023 23:18, Yuan Fu wrote:
> 1. This doesn’t reproduce on Linux (it does on Mac).

It does reproduce on my Linux machine, though.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-23 21:18         ` Yuan Fu
  2023-03-23 21:30           ` Dmitry Gutov
@ 2023-03-23 22:06           ` Dmitry Gutov
  2023-03-23 23:59             ` Yuan Fu
  1 sibling, 1 reply; 83+ messages in thread
From: Dmitry Gutov @ 2023-03-23 22:06 UTC (permalink / raw)
  To: Yuan Fu, Eli Zaretskii; +Cc: Wilhelm Kirschbaum, 62333

On 23/03/2023 23:18, Yuan Fu wrote:
> I guess the question now is why redisplay is triggered in blink-matching-open

blink-matching-open calls sit-for after adjusting overlays.

sit-for starts with a redisplay.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-23 22:06           ` Dmitry Gutov
@ 2023-03-23 23:59             ` Yuan Fu
  2023-03-24  6:05               ` Eli Zaretskii
  0 siblings, 1 reply; 83+ messages in thread
From: Yuan Fu @ 2023-03-23 23:59 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: Wilhelm Kirschbaum, Eli Zaretskii, 62333



> On Mar 23, 2023, at 3:06 PM, Dmitry Gutov <dgutov@yandex.ru> wrote:
> 
> On 23/03/2023 23:18, Yuan Fu wrote:
>> I guess the question now is why redisplay is triggered in blink-matching-open
> 
> blink-matching-open calls sit-for after adjusting overlays.
> 
> sit-for starts with a redisplay.

But it’s not called when narrow-to-region is in effect.

Yuan




^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-23 23:59             ` Yuan Fu
@ 2023-03-24  6:05               ` Eli Zaretskii
  2023-03-24  7:34                 ` Yuan Fu
  0 siblings, 1 reply; 83+ messages in thread
From: Eli Zaretskii @ 2023-03-24  6:05 UTC (permalink / raw)
  To: Yuan Fu; +Cc: wkirschbaum, 62333, dgutov

> From: Yuan Fu <casouri@gmail.com>
> Date: Thu, 23 Mar 2023 16:59:28 -0700
> Cc: Eli Zaretskii <eliz@gnu.org>,
>  Wilhelm Kirschbaum <wkirschbaum@gmail.com>,
>  62333@debbugs.gnu.org
> 
> > On Mar 23, 2023, at 3:06 PM, Dmitry Gutov <dgutov@yandex.ru> wrote:
> > 
> > On 23/03/2023 23:18, Yuan Fu wrote:
> >> I guess the question now is why redisplay is triggered in blink-matching-open
> > 
> > blink-matching-open calls sit-for after adjusting overlays.
> > 
> > sit-for starts with a redisplay.
> 
> But it’s not called when narrow-to-region is in effect.

Exactly.  So the question is now: why does treesit.c see ZV changed,
if by the time it is supposed to be called from redisplay the
restriction is restored?

Is the problematic code in treesit.c really called from redisplay
triggered by sit-for in blink-matching-open?  Can you show the C and
Lisp backtrace from the call that "sees that BUF_ZV_BYTE is smaller
than its visible_end"?





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-24  6:05               ` Eli Zaretskii
@ 2023-03-24  7:34                 ` Yuan Fu
  2023-03-25  1:51                   ` Dmitry Gutov
  0 siblings, 1 reply; 83+ messages in thread
From: Yuan Fu @ 2023-03-24  7:34 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Wilhelm Kirschbaum, 62333, Dmitry Gutov



> On Mar 23, 2023, at 11:05 PM, Eli Zaretskii <eliz@gnu.org> wrote:
> 
>> From: Yuan Fu <casouri@gmail.com>
>> Date: Thu, 23 Mar 2023 16:59:28 -0700
>> Cc: Eli Zaretskii <eliz@gnu.org>,
>> Wilhelm Kirschbaum <wkirschbaum@gmail.com>,
>> 62333@debbugs.gnu.org
>> 
>>> On Mar 23, 2023, at 3:06 PM, Dmitry Gutov <dgutov@yandex.ru> wrote:
>>> 
>>> On 23/03/2023 23:18, Yuan Fu wrote:
>>>> I guess the question now is why redisplay is triggered in blink-matching-open
>>> 
>>> blink-matching-open calls sit-for after adjusting overlays.
>>> 
>>> sit-for starts with a redisplay.
>> 
>> But it’s not called when narrow-to-region is in effect.
> 
> Exactly.  So the question is now: why does treesit.c see ZV changed,
> if by the time it is supposed to be called from redisplay the
> restriction is restored?
> 
> Is the problematic code in treesit.c really called from redisplay
> triggered by sit-for in blink-matching-open?  Can you show the C and
> Lisp backtrace from the call that "sees that BUF_ZV_BYTE is smaller
> than its visible_end"?

Ah, I made a mistake, it isn’t that it doesn’t reproduce on Linux, but rather it doesn’t reproduce on emacs-29. Since I’m able to reproduce it on Linux, I set a breakpoint and the backtrace explains it: blink-match-open calls forward-sexp, which calls elixir-ts—forward-sexp, which accesses the parse tree, which causes tree-sitter to reparse in the narrowed context.

But normally tree-sitter will reparse again when redisplay fontifies the buffer, because now the visible portion is back to the whole buffer. Tree-sitter didn’t do that because I made a mistake when modifying treesit_ensure_parsed. I moved the code that checks for the need_reparse flag before treesit_sync_visible_region, which sets the need_reparse flag if it detects that narrow situation has changed.

Well, this is a bit embarrassing, there is even a comment warning this mistake, but anyway, I pushed a fix, once it gets merged into master, the problem should go away. 

As things stands right now, every time blink-match-open blinks the matching parenthesis, tree-sitter would reparse the buffer twice, that’s not exactly ideal. Blink-match-open’s use of narrowing is legit, and we can’t just automatically widen in tree-sitter functions.

Yuan








^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-24  7:34                 ` Yuan Fu
@ 2023-03-25  1:51                   ` Dmitry Gutov
  2023-03-25 12:34                     ` Eli Zaretskii
  0 siblings, 1 reply; 83+ messages in thread
From: Dmitry Gutov @ 2023-03-25  1:51 UTC (permalink / raw)
  To: Yuan Fu, Eli Zaretskii; +Cc: Wilhelm Kirschbaum, 62333

On 24/03/2023 09:34, Yuan Fu wrote:
 > Well, this is a bit embarrassing, there is even a comment warning 
this mistake, but anyway, I pushed a fix, once it gets merged into 
master, the problem should go away.

Excellent, thanks.

> As things stands right now, every time blink-match-open blinks the matching parenthesis, tree-sitter would reparse the buffer twice, that’s not exactly ideal. Blink-match-open’s use of narrowing is legit, and we can’t just automatically widen in tree-sitter functions.

Not ideal indeed.

Aside from the performance impact, we could also see cases where the 
"narrowed" parse tree contains errors (due to incomplete code) which 
make the tree itself less useful. Especially when the narrowing's end is 
closer to the current position than in blink-matching-open's usage.

Not sure how to solve that, but suppose we had a way to convey to 
treesit.c that it shouldn't change the visibility bounds for the parser 
in this particular instance? Though that would raise the issue of code 
trying to use node positions beyond the current accessible range.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-25  1:51                   ` Dmitry Gutov
@ 2023-03-25 12:34                     ` Eli Zaretskii
  2023-03-25 13:00                       ` Dmitry Gutov
  0 siblings, 1 reply; 83+ messages in thread
From: Eli Zaretskii @ 2023-03-25 12:34 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: wkirschbaum, casouri, 62333

> Date: Sat, 25 Mar 2023 03:51:48 +0200
> Cc: Wilhelm Kirschbaum <wkirschbaum@gmail.com>, 62333@debbugs.gnu.org
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> On 24/03/2023 09:34, Yuan Fu wrote:
>  > Well, this is a bit embarrassing, there is even a comment warning 
> this mistake, but anyway, I pushed a fix, once it gets merged into 
> master, the problem should go away.
> 
> Excellent, thanks.
> 
> > As things stands right now, every time blink-match-open blinks the matching parenthesis, tree-sitter would reparse the buffer twice, that’s not exactly ideal. Blink-match-open’s use of narrowing is legit, and we can’t just automatically widen in tree-sitter functions.
> 
> Not ideal indeed.
> 
> Aside from the performance impact, we could also see cases where the 
> "narrowed" parse tree contains errors (due to incomplete code) which 
> make the tree itself less useful. Especially when the narrowing's end is 
> closer to the current position than in blink-matching-open's usage.
> 
> Not sure how to solve that, but suppose we had a way to convey to 
> treesit.c that it shouldn't change the visibility bounds for the parser 
> in this particular instance? Though that would raise the issue of code 
> trying to use node positions beyond the current accessible range.

Exactly.  Which is why I don't think this is the right way.

Is there any real reason blink-matching-open narrows the buffer?  If
we could remove that narrowing, the problem with the parser's taking
notice of it would be gone.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-25 12:34                     ` Eli Zaretskii
@ 2023-03-25 13:00                       ` Dmitry Gutov
  2023-03-25 13:14                         ` Eli Zaretskii
  0 siblings, 1 reply; 83+ messages in thread
From: Dmitry Gutov @ 2023-03-25 13:00 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: wkirschbaum, casouri, 62333

On 25/03/2023 14:34, Eli Zaretskii wrote:
>> Not ideal indeed.
>>
>> Aside from the performance impact, we could also see cases where the
>> "narrowed" parse tree contains errors (due to incomplete code) which
>> make the tree itself less useful. Especially when the narrowing's end is
>> closer to the current position than in blink-matching-open's usage.
>>
>> Not sure how to solve that, but suppose we had a way to convey to
>> treesit.c that it shouldn't change the visibility bounds for the parser
>> in this particular instance? Though that would raise the issue of code
>> trying to use node positions beyond the current accessible range.
> Exactly.  Which is why I don't think this is the right way.
> 
> Is there any real reason blink-matching-open narrows the buffer?  If
> we could remove that narrowing, the problem with the parser's taking
> notice of it would be gone.

Performance: to avoid scanning for the matching paren too far in the buffer.

Which might seem like not that big a deal, or could even be handled in a 
special way here using the parse tree, but narrowing has been used for 
this purpose for a long time (to limit various kinds of searches or 
movements), so fundamentally the problem will still be with us.






^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-25 13:00                       ` Dmitry Gutov
@ 2023-03-25 13:14                         ` Eli Zaretskii
  2023-03-25 13:44                           ` Dmitry Gutov
  0 siblings, 1 reply; 83+ messages in thread
From: Eli Zaretskii @ 2023-03-25 13:14 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: wkirschbaum, casouri, 62333

> Date: Sat, 25 Mar 2023 15:00:24 +0200
> Cc: wkirschbaum@gmail.com, casouri@gmail.com, 62333@debbugs.gnu.org
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> On 25/03/2023 14:34, Eli Zaretskii wrote:
> > 
> > Is there any real reason blink-matching-open narrows the buffer?  If
> > we could remove that narrowing, the problem with the parser's taking
> > notice of it would be gone.
> 
> Performance: to avoid scanning for the matching paren too far in the buffer.

If that's the only reason, then tree-sitter based modes could widen
back in their sexp-moving functions, since they use the parse data for
this, right?

> Which might seem like not that big a deal, or could even be handled in a 
> special way here using the parse tree, but narrowing has been used for 
> this purpose for a long time (to limit various kinds of searches or 
> movements), so fundamentally the problem will still be with us.

There are many fundamental problems we cannot solve, but I'd settle
with solving some of their particular instances, one at a time.  In
this case, the problem is caused by a mode-specific function that uses
parser data, and is called inside a restriction.  So let's try solving
this particular combination of factors, if we can.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-25 13:14                         ` Eli Zaretskii
@ 2023-03-25 13:44                           ` Dmitry Gutov
  2023-03-25 14:09                             ` Eli Zaretskii
  0 siblings, 1 reply; 83+ messages in thread
From: Dmitry Gutov @ 2023-03-25 13:44 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: wkirschbaum, casouri, 62333

On 25/03/2023 15:14, Eli Zaretskii wrote:
>> Date: Sat, 25 Mar 2023 15:00:24 +0200
>> Cc:wkirschbaum@gmail.com,casouri@gmail.com,62333@debbugs.gnu.org
>> From: Dmitry Gutov<dgutov@yandex.ru>
>>
>> On 25/03/2023 14:34, Eli Zaretskii wrote:
>>> Is there any real reason blink-matching-open narrows the buffer?  If
>>> we could remove that narrowing, the problem with the parser's taking
>>> notice of it would be gone.
>> Performance: to avoid scanning for the matching paren too far in the buffer.
> If that's the only reason, then tree-sitter based modes could widen
> back in their sexp-moving functions, since they use the parse data for
> this, right?

Not necessarily: it doesn't know the purpose for which the narrowing was 
applied. Could be for a mixed-major-mode thing, or some other purpose. 
Long lines?

Do we recall the exact design idea why tree-sitter visibility is limited 
by the narrowing bounds? Because if we wanted to widen in all similar 
situations, we might as well make it not obey the narrowing at all.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-25 13:44                           ` Dmitry Gutov
@ 2023-03-25 14:09                             ` Eli Zaretskii
  2023-03-25 14:18                               ` Dmitry Gutov
  0 siblings, 1 reply; 83+ messages in thread
From: Eli Zaretskii @ 2023-03-25 14:09 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: wkirschbaum, casouri, 62333

> Date: Sat, 25 Mar 2023 15:44:18 +0200
> Cc: wkirschbaum@gmail.com, casouri@gmail.com, 62333@debbugs.gnu.org
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> > If that's the only reason, then tree-sitter based modes could widen
> > back in their sexp-moving functions, since they use the parse data for
> > this, right?
> 
> Not necessarily: it doesn't know the purpose for which the narrowing was 
> applied. Could be for a mixed-major-mode thing, or some other purpose. 

mixed-major-mode shouldn't be a problem.

> Long lines?

Easy to test, and the call to widen will do nothing anyway in that
case.

> Do we recall the exact design idea why tree-sitter visibility is limited 
> by the narrowing bounds?

For the same reason: because the buffer is inaccessible outside the
restriction, and tree-sitter wants to access the buffer text.

> Because if we wanted to widen in all similar situations, we might as
> well make it not obey the narrowing at all.

It is impossible to not obey narrowing, not in Emacs.  I told that and
explained that many times already, including simple examples of what
trouble this could cause to even the most innocent Lisp code.  I hoped
that by now this should no longer be brought forward.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-25 14:09                             ` Eli Zaretskii
@ 2023-03-25 14:18                               ` Dmitry Gutov
  2023-03-25 14:41                                 ` Eli Zaretskii
  0 siblings, 1 reply; 83+ messages in thread
From: Dmitry Gutov @ 2023-03-25 14:18 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: wkirschbaum, casouri, 62333

On 25/03/2023 16:09, Eli Zaretskii wrote:
>> Date: Sat, 25 Mar 2023 15:44:18 +0200
>> Cc: wkirschbaum@gmail.com, casouri@gmail.com, 62333@debbugs.gnu.org
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>>> If that's the only reason, then tree-sitter based modes could widen
>>> back in their sexp-moving functions, since they use the parse data for
>>> this, right?
>>
>> Not necessarily: it doesn't know the purpose for which the narrowing was
>> applied. Could be for a mixed-major-mode thing, or some other purpose.
> 
> mixed-major-mode shouldn't be a problem.

Why wouldn't it?

>> Long lines?
> 
> Easy to test, and the call to widen will do nothing anyway in that
> case.

Okay. Because of locked narrowing, I guess.

>> Do we recall the exact design idea why tree-sitter visibility is limited
>> by the narrowing bounds?
> 
> For the same reason: because the buffer is inaccessible outside the
> restriction, and tree-sitter wants to access the buffer text.
> 
>> Because if we wanted to widen in all similar situations, we might as
>> well make it not obey the narrowing at all.
> 
> It is impossible to not obey narrowing, not in Emacs.  I told that and
> explained that many times already, including simple examples of what
> trouble this could cause to even the most innocent Lisp code.  I hoped
> that by now this should no longer be brought forward.

Okay. But do you advocate all uses of tree-sitter to (widen) first?





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-25 14:18                               ` Dmitry Gutov
@ 2023-03-25 14:41                                 ` Eli Zaretskii
  2023-03-25 15:25                                   ` Dmitry Gutov
  0 siblings, 1 reply; 83+ messages in thread
From: Eli Zaretskii @ 2023-03-25 14:41 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: wkirschbaum, casouri, 62333

> Date: Sat, 25 Mar 2023 16:18:12 +0200
> Cc: wkirschbaum@gmail.com, casouri@gmail.com, 62333@debbugs.gnu.org
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> > mixed-major-mode shouldn't be a problem.
> 
> Why wouldn't it?

Because the sexp ends inside the current mode's block.

> >> Long lines?
> > 
> > Easy to test, and the call to widen will do nothing anyway in that
> > case.
> 
> Okay. Because of locked narrowing, I guess.

Yes.

> >> Because if we wanted to widen in all similar situations, we might as
> >> well make it not obey the narrowing at all.
> > 
> > It is impossible to not obey narrowing, not in Emacs.  I told that and
> > explained that many times already, including simple examples of what
> > trouble this could cause to even the most innocent Lisp code.  I hoped
> > that by now this should no longer be brought forward.
> 
> Okay. But do you advocate all uses of tree-sitter to (widen) first?

No, just in sexp-movement functions, at least for now.  If we discover
this is need in many more situations, we might consider more drastic
measures.  But I don't think we are there yet.  We've discovered just
one such case, in just one such mode, and it's on master.  We still
have ample time to see how widespread this is.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-25 14:41                                 ` Eli Zaretskii
@ 2023-03-25 15:25                                   ` Dmitry Gutov
  2023-03-25 15:57                                     ` Eli Zaretskii
  0 siblings, 1 reply; 83+ messages in thread
From: Dmitry Gutov @ 2023-03-25 15:25 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: wkirschbaum, casouri, 62333

On 25/03/2023 16:41, Eli Zaretskii wrote:
>> Date: Sat, 25 Mar 2023 16:18:12 +0200
>> Cc: wkirschbaum@gmail.com, casouri@gmail.com, 62333@debbugs.gnu.org
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>>> mixed-major-mode shouldn't be a problem.
>>
>> Why wouldn't it?
> 
> Because the sexp ends inside the current mode's block.

But if the mmm framework narrowed the region to the current mode's 
block, widening will force tree-sitter to parse the whole buffer. Which 
might even result in parse errors (instead of meaningful parse nodes) 
near point.

Or consider the case when the code in the current snippet is incomplete 
(e.g. a missing paren). Then it might find a "match" somewhere far outside.

>>>> Because if we wanted to widen in all similar situations, we might as
>>>> well make it not obey the narrowing at all.
>>>
>>> It is impossible to not obey narrowing, not in Emacs.  I told that and
>>> explained that many times already, including simple examples of what
>>> trouble this could cause to even the most innocent Lisp code.  I hoped
>>> that by now this should no longer be brought forward.
>>
>> Okay. But do you advocate all uses of tree-sitter to (widen) first?
> 
> No, just in sexp-movement functions, at least for now.  If we discover
> this is need in many more situations, we might consider more drastic
> measures.  But I don't think we are there yet.  We've discovered just
> one such case, in just one such mode, and it's on master.  We still
> have ample time to see how widespread this is.

I'm not sure whether tree-sitter is going to be used with mmm-mode (or 
similar) a lot, since it has its own provisions for mixing languages.

But I'd also like to consider the other cases where we *don't* want to 
widen first. Any of them come to mind?





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-25 15:25                                   ` Dmitry Gutov
@ 2023-03-25 15:57                                     ` Eli Zaretskii
  2023-03-25 16:03                                       ` Dmitry Gutov
  0 siblings, 1 reply; 83+ messages in thread
From: Eli Zaretskii @ 2023-03-25 15:57 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: wkirschbaum, casouri, 62333

> Date: Sat, 25 Mar 2023 17:25:17 +0200
> Cc: wkirschbaum@gmail.com, casouri@gmail.com, 62333@debbugs.gnu.org
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> On 25/03/2023 16:41, Eli Zaretskii wrote:
> >> Date: Sat, 25 Mar 2023 16:18:12 +0200
> >> Cc: wkirschbaum@gmail.com, casouri@gmail.com, 62333@debbugs.gnu.org
> >> From: Dmitry Gutov <dgutov@yandex.ru>
> >>
> >>> mixed-major-mode shouldn't be a problem.
> >>
> >> Why wouldn't it?
> > 
> > Because the sexp ends inside the current mode's block.
> 
> But if the mmm framework narrowed the region to the current mode's 
> block, widening will force tree-sitter to parse the whole buffer.

No, because such a mode mode should already make sure this doesn't
happen.

> >> Okay. But do you advocate all uses of tree-sitter to (widen) first?
> > 
> > No, just in sexp-movement functions, at least for now.  If we discover
> > this is need in many more situations, we might consider more drastic
> > measures.  But I don't think we are there yet.  We've discovered just
> > one such case, in just one such mode, and it's on master.  We still
> > have ample time to see how widespread this is.
> 
> I'm not sure whether tree-sitter is going to be used with mmm-mode (or 
> similar) a lot, since it has its own provisions for mixing languages.
> 
> But I'd also like to consider the other cases where we *don't* want to 
> widen first. Any of them come to mind?

No, not off the top of my head.

I think we should try this in this one case, and see if other cases
come up.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-25 15:57                                     ` Eli Zaretskii
@ 2023-03-25 16:03                                       ` Dmitry Gutov
  2023-03-25 16:24                                         ` Eli Zaretskii
  0 siblings, 1 reply; 83+ messages in thread
From: Dmitry Gutov @ 2023-03-25 16:03 UTC (permalink / raw)
  To: Eli Zaretskii
  Cc: wkirschbaum@gmail.com, casouri@gmail.com, 62333@debbugs.gnu.org

[-- Attachment #1: Type: text/html, Size: 2521 bytes --]

^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-25 16:03                                       ` Dmitry Gutov
@ 2023-03-25 16:24                                         ` Eli Zaretskii
  2023-03-25 17:05                                           ` Dmitry Gutov
  0 siblings, 1 reply; 83+ messages in thread
From: Eli Zaretskii @ 2023-03-25 16:24 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: wkirschbaum, casouri, 62333

> From: Dmitry Gutov <dgutov@yandex.ru>
> Cc: "wkirschbaum@gmail.com" <wkirschbaum@gmail.com>,
> 	"casouri@gmail.com" <casouri@gmail.com>,
> 	"62333@debbugs.gnu.org" <62333@debbugs.gnu.org>
> Date: Sat, 25 Mar 2023 19:03:45 +0300
> 
>   But if the mmm framework narrowed the region to the current mode's 
>   block, widening will force tree-sitter to parse the whole buffer.
> 
>  No, because such a mode mode should already make sure this doesn't
>  happen.
> 
> How?

The same way it makes sure a given parser is used only on the portion
of the buffer where the corresponding language is used.

>   But I'd also like to consider the other cases where we *don't* want to 
>   widen first. Any of them come to mind?
> 
>  No, not off the top of my head.
> 
>  I think we should try this in this one case, and see if other cases
>  come up.
> 
> I think we should try to answer the relevant questions first.

If we can, sure.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-25 16:24                                         ` Eli Zaretskii
@ 2023-03-25 17:05                                           ` Dmitry Gutov
  2023-03-25 17:40                                             ` Eli Zaretskii
  0 siblings, 1 reply; 83+ messages in thread
From: Dmitry Gutov @ 2023-03-25 17:05 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: wkirschbaum, casouri, 62333

On 25/03/2023 18:24, Eli Zaretskii wrote:
>> From: Dmitry Gutov <dgutov@yandex.ru>
>> Cc: "wkirschbaum@gmail.com" <wkirschbaum@gmail.com>,
>> 	"casouri@gmail.com" <casouri@gmail.com>,
>> 	"62333@debbugs.gnu.org" <62333@debbugs.gnu.org>
>> Date: Sat, 25 Mar 2023 19:03:45 +0300
>>
>>    But if the mmm framework narrowed the region to the current mode's
>>    block, widening will force tree-sitter to parse the whole buffer.
>>
>>   No, because such a mode mode should already make sure this doesn't
>>   happen.
>>
>> How?
> 
> The same way it makes sure a given parser is used only on the portion
> of the buffer where the corresponding language is used.

It uses narrowing. Major modes are not supposed to 'widen' willy-nilly.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-25 17:05                                           ` Dmitry Gutov
@ 2023-03-25 17:40                                             ` Eli Zaretskii
  2023-03-25 19:31                                               ` Yuan Fu
  2023-03-25 22:57                                               ` Dmitry Gutov
  0 siblings, 2 replies; 83+ messages in thread
From: Eli Zaretskii @ 2023-03-25 17:40 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: wkirschbaum, casouri, 62333

> Date: Sat, 25 Mar 2023 19:05:13 +0200
> Cc: wkirschbaum@gmail.com, casouri@gmail.com, 62333@debbugs.gnu.org
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> On 25/03/2023 18:24, Eli Zaretskii wrote:
> >> From: Dmitry Gutov <dgutov@yandex.ru>
> >> Cc: "wkirschbaum@gmail.com" <wkirschbaum@gmail.com>,
> >> 	"casouri@gmail.com" <casouri@gmail.com>,
> >> 	"62333@debbugs.gnu.org" <62333@debbugs.gnu.org>
> >> Date: Sat, 25 Mar 2023 19:03:45 +0300
> >>
> >>    But if the mmm framework narrowed the region to the current mode's
> >>    block, widening will force tree-sitter to parse the whole buffer.
> >>
> >>   No, because such a mode mode should already make sure this doesn't
> >>   happen.
> >>
> >> How?
> > 
> > The same way it makes sure a given parser is used only on the portion
> > of the buffer where the corresponding language is used.
> 
> It uses narrowing.

How does that work with features such as font-lock, which do widen?

Anyway, isn't this discussion a bit premature, as no TS mode has been
used with the mmm framework yet?  Because when they do, I imagine they
will need to invent some mechanism that is more reliable than
narrowing.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-25 17:40                                             ` Eli Zaretskii
@ 2023-03-25 19:31                                               ` Yuan Fu
  2023-03-25 23:29                                                 ` Dmitry Gutov
  2023-03-26  4:28                                                 ` Eli Zaretskii
  2023-03-25 22:57                                               ` Dmitry Gutov
  1 sibling, 2 replies; 83+ messages in thread
From: Yuan Fu @ 2023-03-25 19:31 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Wilhelm Kirschbaum, 62333, Dmitry Gutov


I don’t think we should blindly widen in tree-sitter sexp functions, but not because of mmm-mode—tree-sitter ranges should have that mostly covered. My primary concern is that what if narrowing is intended by the caller?

But I don’t have any good idea for blink-matching right now.

Yuan




^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-25 17:40                                             ` Eli Zaretskii
  2023-03-25 19:31                                               ` Yuan Fu
@ 2023-03-25 22:57                                               ` Dmitry Gutov
  2023-03-26  5:04                                                 ` Eli Zaretskii
  1 sibling, 1 reply; 83+ messages in thread
From: Dmitry Gutov @ 2023-03-25 22:57 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: wkirschbaum, casouri, 62333

On 25/03/2023 19:40, Eli Zaretskii wrote:
>> Date: Sat, 25 Mar 2023 19:05:13 +0200
>> Cc: wkirschbaum@gmail.com, casouri@gmail.com, 62333@debbugs.gnu.org
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>> On 25/03/2023 18:24, Eli Zaretskii wrote:
>>>> From: Dmitry Gutov <dgutov@yandex.ru>
>>>> Cc: "wkirschbaum@gmail.com" <wkirschbaum@gmail.com>,
>>>> 	"casouri@gmail.com" <casouri@gmail.com>,
>>>> 	"62333@debbugs.gnu.org" <62333@debbugs.gnu.org>
>>>> Date: Sat, 25 Mar 2023 19:03:45 +0300
>>>>
>>>>     But if the mmm framework narrowed the region to the current mode's
>>>>     block, widening will force tree-sitter to parse the whole buffer.
>>>>
>>>>    No, because such a mode mode should already make sure this doesn't
>>>>    happen.
>>>>
>>>> How?
>>>
>>> The same way it makes sure a given parser is used only on the portion
>>> of the buffer where the corresponding language is used.
>>
>> It uses narrowing.
> 
> How does that work with features such as font-lock, which do widen?

Using font-lock-dont-widen.

We've had this discussion several times over by now. Should it be 
documented somewhere?

> Anyway, isn't this discussion a bit premature, as no TS mode has been
> used with the mmm framework yet?

There is no reason to assume that: the combinations of modes are just a 
matter of user configuration. And so far it should be working okay.

> Because when they do, I imagine they
> will need to invent some mechanism that is more reliable than
> narrowing.

"They" is me. I'd rather the general mechanism keeps working, or we come 
up with another general mechanism that is a better substitute, before 
breaking this one.

And anyway, I like I mentioned, this will break this common pattern as well:

   (save-restriction
     (narrow-to-region ... some-limit-position)
     (forward-sexp))

I've used it in ruby-syntax-propertize-percent-literal, for example. 
Except with 'forward-list' rather than 'forward-sexp', but others can 
use the latter.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-25 19:31                                               ` Yuan Fu
@ 2023-03-25 23:29                                                 ` Dmitry Gutov
  2023-03-26 22:52                                                   ` Yuan Fu
  2023-03-26  4:28                                                 ` Eli Zaretskii
  1 sibling, 1 reply; 83+ messages in thread
From: Dmitry Gutov @ 2023-03-25 23:29 UTC (permalink / raw)
  To: Yuan Fu, Eli Zaretskii; +Cc: Wilhelm Kirschbaum, 62333

On 25/03/2023 21:31, Yuan Fu wrote:
> 
> I don’t think we should blindly widen in tree-sitter sexp functions, but not because of mmm-mode—tree-sitter ranges should have that mostly covered. My primary concern is that what if narrowing is intended by the caller?

Yes.

> But I don’t have any good idea for blink-matching right now.

show-paren-mode has show-paren-data-function (which treesit should also 
plug into, I think).

Since we're looking for ad-hoc solutions, we could add a similar 
extension point for blink-matching-paren.

Or even try to reuse show-paren-data-function: just specialize in a 
limited number of cases - check that (nth 1 data) matches point, and 
then take the elements 3,4 and perform the existing checks on them. 
There might be some differences in behavior, but probably nothing some 
checks using 'syntax-after' couldn't handle.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-25 19:31                                               ` Yuan Fu
  2023-03-25 23:29                                                 ` Dmitry Gutov
@ 2023-03-26  4:28                                                 ` Eli Zaretskii
  2023-03-26 22:57                                                   ` Yuan Fu
  1 sibling, 1 reply; 83+ messages in thread
From: Eli Zaretskii @ 2023-03-26  4:28 UTC (permalink / raw)
  To: Yuan Fu; +Cc: wkirschbaum, 62333, dgutov

> From: Yuan Fu <casouri@gmail.com>
> Date: Sat, 25 Mar 2023 12:31:58 -0700
> Cc: Dmitry Gutov <dgutov@yandex.ru>,
>  Wilhelm Kirschbaum <wkirschbaum@gmail.com>,
>  62333@debbugs.gnu.org
> 
> 
> I don’t think we should blindly widen in tree-sitter sexp functions, but not because of mmm-mode—tree-sitter ranges should have that mostly covered. My primary concern is that what if narrowing is intended by the caller?

What could be the reason for the caller to narrow when calling a
sexp-movement function?  Keep in mind that the only narrowing that
matters is one that prevents the sexp-movement function to find the
target of the movement.

> But I don’t have any good idea for blink-matching right now.

We could leave this alone for now, but in that case let's at least add
some FIXME comment in the relevant place(s), so that we could later
revisit this.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-25 22:57                                               ` Dmitry Gutov
@ 2023-03-26  5:04                                                 ` Eli Zaretskii
  2023-03-26  9:25                                                   ` Dmitry Gutov
  0 siblings, 1 reply; 83+ messages in thread
From: Eli Zaretskii @ 2023-03-26  5:04 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: wkirschbaum, casouri, 62333

> Date: Sun, 26 Mar 2023 00:57:22 +0200
> Cc: wkirschbaum@gmail.com, casouri@gmail.com, 62333@debbugs.gnu.org
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> > How does that work with features such as font-lock, which do widen?
> 
> Using font-lock-dont-widen.

That's only for font-lock.  Parsing was not on the table when that was
introduced, so it doesn't have a similar mechanism.

> We've had this discussion several times over by now. Should it be 
> documented somewhere?

Probably, but that's a tangent.

> > Anyway, isn't this discussion a bit premature, as no TS mode has been
> > used with the mmm framework yet?
> 
> There is no reason to assume that: the combinations of modes are just a 
> matter of user configuration. And so far it should be working okay.

Again, I'm talking about using a parser library.  We may need to
introduce a way of limiting the parser to a certain range of buffer
text positions, independently of narrowing.  As we all know, narrowing
is a problematic feature to use in Lisp programs, so maybe we should
do this better in the case of parsers.  Then problems like this one
could be solved more cleanly and simply.

> And anyway, I like I mentioned, this will break this common pattern as well:
> 
>    (save-restriction
>      (narrow-to-region ... some-limit-position)
>      (forward-sexp))
> 
> I've used it in ruby-syntax-propertize-percent-literal, for example. 
> Except with 'forward-list' rather than 'forward-sexp', but others can 
> use the latter.

You want to repeat all the arguments we already brought up?





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-26  5:04                                                 ` Eli Zaretskii
@ 2023-03-26  9:25                                                   ` Dmitry Gutov
  2023-03-26 10:01                                                     ` Eli Zaretskii
  0 siblings, 1 reply; 83+ messages in thread
From: Dmitry Gutov @ 2023-03-26  9:25 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: wkirschbaum, casouri, 62333

On 26/03/2023 08:04, Eli Zaretskii wrote:
>> Date: Sun, 26 Mar 2023 00:57:22 +0200
>> Cc: wkirschbaum@gmail.com, casouri@gmail.com, 62333@debbugs.gnu.org
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>>> How does that work with features such as font-lock, which do widen?
>>
>> Using font-lock-dont-widen.
> 
> That's only for font-lock.  Parsing was not on the table when that was
> introduced, so it doesn't have a similar mechanism.

Parsing is on-demand, by font-lock and other features.

>> We've had this discussion several times over by now. Should it be
>> documented somewhere?
> 
> Probably, but that's a tangent.
> 
>>> Anyway, isn't this discussion a bit premature, as no TS mode has been
>>> used with the mmm framework yet?
>>
>> There is no reason to assume that: the combinations of modes are just a
>> matter of user configuration. And so far it should be working okay.
> 
> Again, I'm talking about using a parser library.  We may need to
> introduce a way of limiting the parser to a certain range of buffer
> text positions, independently of narrowing.

Except it's already limited by narrowing.

> As we all know, narrowing
> is a problematic feature to use in Lisp programs, so maybe we should
> do this better in the case of parsers.  Then problems like this one
> could be solved more cleanly and simply.

Narrowing problematic to use in Lisp?

>> And anyway, I like I mentioned, this will break this common pattern as well:
>>
>>     (save-restriction
>>       (narrow-to-region ... some-limit-position)
>>       (forward-sexp))
>>
>> I've used it in ruby-syntax-propertize-percent-literal, for example.
>> Except with 'forward-list' rather than 'forward-sexp', but others can
>> use the latter.
> 
> You want to repeat all the arguments we already brought up?

You might choose to ignore a third-party mode, but breaking a common 
pattern seems more dangerous.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-26  9:25                                                   ` Dmitry Gutov
@ 2023-03-26 10:01                                                     ` Eli Zaretskii
  2023-03-26 22:00                                                       ` Dmitry Gutov
  0 siblings, 1 reply; 83+ messages in thread
From: Eli Zaretskii @ 2023-03-26 10:01 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: wkirschbaum, casouri, 62333

> Date: Sun, 26 Mar 2023 12:25:30 +0300
> Cc: wkirschbaum@gmail.com, casouri@gmail.com, 62333@debbugs.gnu.org
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> On 26/03/2023 08:04, Eli Zaretskii wrote:
> >> Date: Sun, 26 Mar 2023 00:57:22 +0200
> >> Cc: wkirschbaum@gmail.com, casouri@gmail.com, 62333@debbugs.gnu.org
> >> From: Dmitry Gutov <dgutov@yandex.ru>
> >>
> >>> How does that work with features such as font-lock, which do widen?
> >>
> >> Using font-lock-dont-widen.
> > 
> > That's only for font-lock.  Parsing was not on the table when that was
> > introduced, so it doesn't have a similar mechanism.
> 
> Parsing is on-demand, by font-lock and other features.

So you are suggesting to introduce kludges like font-lock-dont-widen
in all of those places?  I don't even see how we will find them all in
advance, let alone fix them or make sure they do what we want.

> > Again, I'm talking about using a parser library.  We may need to
> > introduce a way of limiting the parser to a certain range of buffer
> > text positions, independently of narrowing.
> 
> Except it's already limited by narrowing.

Which is a fragile, semi-broken means, as we all know.

> > As we all know, narrowing
> > is a problematic feature to use in Lisp programs, so maybe we should
> > do this better in the case of parsers.  Then problems like this one
> > could be solved more cleanly and simply.
> 
> Narrowing problematic to use in Lisp?

Yes, because users can easily change narrowing.  We've had problems
with that many times, and even some attempts at solving it, so why are
you pretending you don't know about those deficiencies?

> >> And anyway, I like I mentioned, this will break this common pattern as well:
> >>
> >>     (save-restriction
> >>       (narrow-to-region ... some-limit-position)
> >>       (forward-sexp))
> >>
> >> I've used it in ruby-syntax-propertize-percent-literal, for example.
> >> Except with 'forward-list' rather than 'forward-sexp', but others can
> >> use the latter.
> > 
> > You want to repeat all the arguments we already brought up?
> 
> You might choose to ignore a third-party mode, but breaking a common 
> pattern seems more dangerous.

??? How does that follow from what I said?

Look, I'm trying to see how we could come up with an infrastructure
that will support multiple modes and other similar features in the
same buffer without relying on narrowing, thus bypassing the
disadvantages and difficulties that come with narrowing.  I think we
have a good chance here to come up with such a solution, specifically
for features that us a parsing library.  If you aren't interested in
discussing that, and think we should stick to narrowing, then this
goes nowhere, and I'd rather bow out of it.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-26 10:01                                                     ` Eli Zaretskii
@ 2023-03-26 22:00                                                       ` Dmitry Gutov
  2023-03-27  8:24                                                         ` Gregory Heytings
  2023-03-27 13:29                                                         ` Eli Zaretskii
  0 siblings, 2 replies; 83+ messages in thread
From: Dmitry Gutov @ 2023-03-26 22:00 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: wkirschbaum, casouri, 62333

On 26/03/2023 13:01, Eli Zaretskii wrote:
>> Date: Sun, 26 Mar 2023 12:25:30 +0300
>> Cc: wkirschbaum@gmail.com, casouri@gmail.com, 62333@debbugs.gnu.org
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>> On 26/03/2023 08:04, Eli Zaretskii wrote:
>>>> Date: Sun, 26 Mar 2023 00:57:22 +0200
>>>> Cc: wkirschbaum@gmail.com, casouri@gmail.com, 62333@debbugs.gnu.org
>>>> From: Dmitry Gutov <dgutov@yandex.ru>
>>>>
>>>>> How does that work with features such as font-lock, which do widen?
>>>>
>>>> Using font-lock-dont-widen.
>>>
>>> That's only for font-lock.  Parsing was not on the table when that was
>>> introduced, so it doesn't have a similar mechanism.
>>
>> Parsing is on-demand, by font-lock and other features.
> 
> So you are suggesting to introduce kludges like font-lock-dont-widen
> in all of those places?

font-lock-dont-widen is a kludge, but that's largely determined by the 
way it's defined and used.

If we take indent-for-tab-command, for example, it doesn't have such a 
variable, and doesn't really need to: the top-level command calls 
'widen', and then indent-line-function (set by major mode and altered by 
e.g. mmm-mode) is free to impose its specific bounds.

I think, as far the immediate problem is concerned, blink-matching-paren 
could use the same route. And could even try to reuse 
show-paren-data-function instead of creating its own customization point.

> I don't even see how we will find them all in
> advance, let alone fix them or make sure they do what we want.

Just do it step-by-step.

The "grand unified theory of mixed major modes" has been attempted a few 
times in the past, and never reached anything practical. That's not to 
say nobody should try again, but they should keep that in mind.

>>> Again, I'm talking about using a parser library.  We may need to
>>> introduce a way of limiting the parser to a certain range of buffer
>>> text positions, independently of narrowing.
>>
>> Except it's already limited by narrowing.
> 
> Which is a fragile, semi-broken means, as we all know.

What is a broken mess, is user-level narrowing. And how the downstream 
code can never guess the purpose the narrowing was applied for.

>>> As we all know, narrowing
>>> is a problematic feature to use in Lisp programs, so maybe we should
>>> do this better in the case of parsers.  Then problems like this one
>>> could be solved more cleanly and simply.
>>
>> Narrowing problematic to use in Lisp?
> 
> Yes, because users can easily change narrowing.  We've had problems
> with that many times, and even some attempts at solving it, so why are
> you pretending you don't know about those deficiencies?

Because I suggested deprecating certain uses of it several times, and 
always got a "no" for an answer.

>>>> And anyway, I like I mentioned, this will break this common pattern as well:
>>>>
>>>>      (save-restriction
>>>>        (narrow-to-region ... some-limit-position)
>>>>        (forward-sexp))
>>>>
>>>> I've used it in ruby-syntax-propertize-percent-literal, for example.
>>>> Except with 'forward-list' rather than 'forward-sexp', but others can
>>>> use the latter.
>>>
>>> You want to repeat all the arguments we already brought up?
>>
>> You might choose to ignore a third-party mode, but breaking a common
>> pattern seems more dangerous.
> 
> ??? How does that follow from what I said?
> 
> Look, I'm trying to see how we could come up with an infrastructure
> that will support multiple modes and other similar features in the
> same buffer without relying on narrowing, thus bypassing the
> disadvantages and difficulties that come with narrowing.  I think we
> have a good chance here to come up with such a solution, specifically
> for features that us a parsing library.  If you aren't interested in
> discussing that, and think we should stick to narrowing, then this
> goes nowhere, and I'd rather bow out of it.

What I've seen here so far is you suggesting we go ahead and break the 
existing convention and then let "them" (third-party authors including 
myself) come up with a new working one.

My stance here is we shouldn't break it before we create a new one. And 
I'm happy to discuss it, of course. Just please don't expect me to take 
the initiative at this point.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-25 23:29                                                 ` Dmitry Gutov
@ 2023-03-26 22:52                                                   ` Yuan Fu
  2023-03-27  1:29                                                     ` Dmitry Gutov
  0 siblings, 1 reply; 83+ messages in thread
From: Yuan Fu @ 2023-03-26 22:52 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: Wilhelm Kirschbaum, Eli Zaretskii, 62333



> On Mar 25, 2023, at 4:29 PM, Dmitry Gutov <dgutov@yandex.ru> wrote:
> 
> On 25/03/2023 21:31, Yuan Fu wrote:
>> I don’t think we should blindly widen in tree-sitter sexp functions, but not because of mmm-mode—tree-sitter ranges should have that mostly covered. My primary concern is that what if narrowing is intended by the caller?
> 
> Yes.
> 
>> But I don’t have any good idea for blink-matching right now.
> 
> show-paren-mode has show-paren-data-function (which treesit should also plug into, I think).
> 
> Since we're looking for ad-hoc solutions, we could add a similar extension point for blink-matching-paren.
> 
> Or even try to reuse show-paren-data-function: just specialize in a limited number of cases - check that (nth 1 data) matches point, and then take the elements 3,4 and perform the existing checks on them. There might be some differences in behavior, but probably nothing some checks using 'syntax-after' couldn't handle.

Sounds good, I can work on this. This links to something I’ve been working on, namely some system that allows one to map abstract general constructs like pair, list, defun, assignment, etc, to grammar-specific definitions like a tree-sitter node type, and automatically construct functions accessing those information. We already have a primitive version of it: right now if you set treesit-defun-type-regexp, treesit-beginning/end-of-defun and treesit-defun-at-point would just work. I want to extend it further to allow you to get defun name, argument list, etc, and everything else I mentioned earlier.

If we can pull it off, a user only need to specify what is a pair and how to find the matching pair according to the language grammar, and the rest is automatic (a tree-sitter function for show-paren-data-function and blink-matching-paren).

Yuan




^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-26  4:28                                                 ` Eli Zaretskii
@ 2023-03-26 22:57                                                   ` Yuan Fu
  2023-03-27 13:32                                                     ` Eli Zaretskii
  0 siblings, 1 reply; 83+ messages in thread
From: Yuan Fu @ 2023-03-26 22:57 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Wilhelm Kirschbaum, 62333, Dmitry Gutov



> On Mar 25, 2023, at 9:28 PM, Eli Zaretskii <eliz@gnu.org> wrote:
> 
>> From: Yuan Fu <casouri@gmail.com>
>> Date: Sat, 25 Mar 2023 12:31:58 -0700
>> Cc: Dmitry Gutov <dgutov@yandex.ru>,
>> Wilhelm Kirschbaum <wkirschbaum@gmail.com>,
>> 62333@debbugs.gnu.org
>> 
>> 
>> I don’t think we should blindly widen in tree-sitter sexp functions, but not because of mmm-mode—tree-sitter ranges should have that mostly covered. My primary concern is that what if narrowing is intended by the caller?
> 
> What could be the reason for the caller to narrow when calling a
> sexp-movement function?  Keep in mind that the only narrowing that
> matters is one that prevents the sexp-movement function to find the
> target of the movement.

Maybe the user narrowed to a defun when writing code. There is a bug report on narrow-to-defun not working right in c-ts-mode, so there are definitely people who work like that.

>> But I don’t have any good idea for blink-matching right now.
> 
> We could leave this alone for now, but in that case let's at least add
> some FIXME comment in the relevant place(s), so that we could later
> revisit this.

Dmitry’s idea sounds good, we can add a tree-sitter backend for show-paren-data-function, and make the backend for blink-matching-paren configurable, then add a backend for it that uses show-paren-data-function, which in turn uses tree-sitter (or we add a backend that uses tree-sitter directly). In either case, the tree-sitter backend don’t need to use narrowing and we are good.

Yuan






^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-26 22:52                                                   ` Yuan Fu
@ 2023-03-27  1:29                                                     ` Dmitry Gutov
  0 siblings, 0 replies; 83+ messages in thread
From: Dmitry Gutov @ 2023-03-27  1:29 UTC (permalink / raw)
  To: Yuan Fu; +Cc: Wilhelm Kirschbaum, Eli Zaretskii, 62333

On 27/03/2023 01:52, Yuan Fu wrote:
> If we can pull it off, a user only need to specify what is a pair and how to find the matching pair according to the language grammar, and the rest is automatic (a tree-sitter function for show-paren-data-function and blink-matching-paren).

Sounds good. Indeed, for this feature a registry of opener-closers 
should suffice.

Another command that could use it, is an implementation of 
backward-up-list. Somehow the default up-list manages to use SMIE's 
forward-sexp-function (and backward...) definitions automatically, but 
not tree-sitter's. I've been told it's expected for now, so I think 
opener-closers are the missing piece (either to enhance 
treesit-forward-sexp/treesit-backward-sexp to resemble the originals 
more closely, or to implement treesit-backward-up).





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-26 22:00                                                       ` Dmitry Gutov
@ 2023-03-27  8:24                                                         ` Gregory Heytings
  2023-03-27 13:39                                                           ` Eli Zaretskii
  2023-03-27 23:20                                                           ` Dmitry Gutov
  2023-03-27 13:29                                                         ` Eli Zaretskii
  1 sibling, 2 replies; 83+ messages in thread
From: Gregory Heytings @ 2023-03-27  8:24 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: wkirschbaum, Eli Zaretskii, casouri, 62333


>>>> Again, I'm talking about using a parser library.  We may need to 
>>>> introduce a way of limiting the parser to a certain range of buffer 
>>>> text positions, independently of narrowing.
>>> 
>>> Except it's already limited by narrowing.
>> 
>> Which is a fragile, semi-broken means, as we all know.
>
> What is a broken mess, is user-level narrowing. And how the downstream 
> code can never guess the purpose the narrowing was applied for.
>

Note that this is what labeled narrowings attempts to solve.  It's perhaps 
not the best way to deal with code that has existed for a long time 
(because such code is not prepared to handle that kind of narrowing 
gracefully), but I don't see why it couldn't be used in new code/modes 
such as tree-sitter ones.  It is independent of user-level narrowing, and 
downstream code can act differently depending on the reason for which the 
narrowing was applied.






^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-26 22:00                                                       ` Dmitry Gutov
  2023-03-27  8:24                                                         ` Gregory Heytings
@ 2023-03-27 13:29                                                         ` Eli Zaretskii
  2023-03-27 23:33                                                           ` Dmitry Gutov
  1 sibling, 1 reply; 83+ messages in thread
From: Eli Zaretskii @ 2023-03-27 13:29 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: wkirschbaum, casouri, 62333

> Date: Mon, 27 Mar 2023 01:00:20 +0300
> Cc: wkirschbaum@gmail.com, casouri@gmail.com, 62333@debbugs.gnu.org
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> > So you are suggesting to introduce kludges like font-lock-dont-widen
> > in all of those places?
> 
> font-lock-dont-widen is a kludge, but that's largely determined by the 
> way it's defined and used.

With parser-based features, we have an opportunity to do this in a
cleaner manner.

> If we take indent-for-tab-command, for example, it doesn't have such a 
> variable, and doesn't really need to: the top-level command calls 
> 'widen', and then indent-line-function (set by major mode and altered by 
> e.g. mmm-mode) is free to impose its specific bounds.

I thought about a lower-level, infrastructure-level, mechanism that
could be used to restrict a parser to a certain region of the buffer.
Then this could be used by every feature based on parsers, instead of
us having to invent a separate solution for each one.

> The "grand unified theory of mixed major modes" has been attempted a few 
> times in the past, and never reached anything practical.

But here we have a unique opportunity to maybe find a solution, at
least for stuff based on tree-sitter and similar libraries.  That
maybe not "grand", but certainly "respectable".

> >> Except it's already limited by narrowing.
> > 
> > Which is a fragile, semi-broken means, as we all know.
> 
> What is a broken mess, is user-level narrowing.

Which is why restricting parsers should not be a user-level feature.

> > Look, I'm trying to see how we could come up with an infrastructure
> > that will support multiple modes and other similar features in the
> > same buffer without relying on narrowing, thus bypassing the
> > disadvantages and difficulties that come with narrowing.  I think we
> > have a good chance here to come up with such a solution, specifically
> > for features that us a parsing library.  If you aren't interested in
> > discussing that, and think we should stick to narrowing, then this
> > goes nowhere, and I'd rather bow out of it.
> 
> What I've seen here so far is you suggesting we go ahead and break the 
> existing convention and then let "them" (third-party authors including 
> myself) come up with a new working one.

You are mixing two semi-separate issues: how to fix the immediate
problem with blink-matching-paren (if we consider it a serious
problem), and how to try solving similar issues as a whole.  The
latter is a long-term goal, and we can discuss it freely and calmly;
whereby ideas can be brought up even if they might not be the most
clever ones or the ones with which you personally agree.

> My stance here is we shouldn't break it before we create a new one.

No one broke anything.  We are just discussing ideas.  Please don't
exaggerate.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-26 22:57                                                   ` Yuan Fu
@ 2023-03-27 13:32                                                     ` Eli Zaretskii
  2023-03-27 18:43                                                       ` Yuan Fu
  0 siblings, 1 reply; 83+ messages in thread
From: Eli Zaretskii @ 2023-03-27 13:32 UTC (permalink / raw)
  To: Yuan Fu; +Cc: wkirschbaum, 62333, dgutov

> From: Yuan Fu <casouri@gmail.com>
> Date: Sun, 26 Mar 2023 15:57:55 -0700
> Cc: Dmitry Gutov <dgutov@yandex.ru>,
>  Wilhelm Kirschbaum <wkirschbaum@gmail.com>,
>  62333@debbugs.gnu.org
> 
> > We could leave this alone for now, but in that case let's at least add
> > some FIXME comment in the relevant place(s), so that we could later
> > revisit this.
> 
> Dmitry’s idea sounds good, we can add a tree-sitter backend for show-paren-data-function, and make the backend for blink-matching-paren configurable, then add a backend for it that uses show-paren-data-function, which in turn uses tree-sitter (or we add a backend that uses tree-sitter directly). In either case, the tree-sitter backend don’t need to use narrowing and we are good.

Is this suitable for the release branch?  It sounds non-trivial, and
the problem is not very severe, to say the least.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-27  8:24                                                         ` Gregory Heytings
@ 2023-03-27 13:39                                                           ` Eli Zaretskii
  2023-03-27 20:05                                                             ` Gregory Heytings
  2023-03-27 23:06                                                             ` Dmitry Gutov
  2023-03-27 23:20                                                           ` Dmitry Gutov
  1 sibling, 2 replies; 83+ messages in thread
From: Eli Zaretskii @ 2023-03-27 13:39 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: wkirschbaum, casouri, 62333, dgutov

> Date: Mon, 27 Mar 2023 08:24:42 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: Eli Zaretskii <eliz@gnu.org>, wkirschbaum@gmail.com, casouri@gmail.com, 
>     62333@debbugs.gnu.org
> 
> >> Which is a fragile, semi-broken means, as we all know.
> >
> > What is a broken mess, is user-level narrowing. And how the downstream 
> > code can never guess the purpose the narrowing was applied for.
> 
> Note that this is what labeled narrowings attempts to solve.

Labeled narrowing cannot solve this because it does nothing to
alleviate the problems with user-defined narrowing.  So if the user
narrows the buffer, we cannot do anything to safely widen in the
general case, and labeled narrowing cannot help us.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-27 13:32                                                     ` Eli Zaretskii
@ 2023-03-27 18:43                                                       ` Yuan Fu
  0 siblings, 0 replies; 83+ messages in thread
From: Yuan Fu @ 2023-03-27 18:43 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Wilhelm Kirschbaum, 62333, Dmitry Gutov



> On Mar 27, 2023, at 6:32 AM, Eli Zaretskii <eliz@gnu.org> wrote:
> 
>> From: Yuan Fu <casouri@gmail.com>
>> Date: Sun, 26 Mar 2023 15:57:55 -0700
>> Cc: Dmitry Gutov <dgutov@yandex.ru>,
>> Wilhelm Kirschbaum <wkirschbaum@gmail.com>,
>> 62333@debbugs.gnu.org
>> 
>>> We could leave this alone for now, but in that case let's at least add
>>> some FIXME comment in the relevant place(s), so that we could later
>>> revisit this.
>> 
>> Dmitry’s idea sounds good, we can add a tree-sitter backend for show-paren-data-function, and make the backend for blink-matching-paren configurable, then add a backend for it that uses show-paren-data-function, which in turn uses tree-sitter (or we add a backend that uses tree-sitter directly). In either case, the tree-sitter backend don’t need to use narrowing and we are good.
> 
> Is this suitable for the release branch?  It sounds non-trivial, and
> the problem is not very severe, to say the least.

No, it’s intended for the master branch. Emacs-29 doesn’t have the blink-matching-paren problem anyway, since it doesn’t have treesit-forward-sexp. 

Yuan




^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-27 13:39                                                           ` Eli Zaretskii
@ 2023-03-27 20:05                                                             ` Gregory Heytings
  2023-03-28 11:30                                                               ` Eli Zaretskii
  2023-03-27 23:06                                                             ` Dmitry Gutov
  1 sibling, 1 reply; 83+ messages in thread
From: Gregory Heytings @ 2023-03-27 20:05 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: wkirschbaum, casouri, 62333, dgutov


>>>>>> Again, I'm talking about using a parser library.  We may need to 
>>>>>> introduce a way of limiting the parser to a certain range of buffer 
>>>>>> text positions, independently of narrowing.
>>>>>
>>>>> Except it's already limited by narrowing.
>>>>
>>>> Which is a fragile, semi-broken means, as we all know.
>>>
>>> What is a broken mess, is user-level narrowing. And how the downstream 
>>> code can never guess the purpose the narrowing was applied for.
>>
>> Note that this is what labeled narrowings attempts to solve.
>
> Labeled narrowing cannot solve this because it does nothing to alleviate 
> the problems with user-defined narrowing.  So if the user narrows the 
> buffer, we cannot do anything to safely widen in the general case, and 
> labeled narrowing cannot help us.
>

I must be missing something, but I don't understand what you mean.  If a 
user has narrowed a buffer to a certain region A-B, and if we want to 
limit a parser to a certain region C-D, we can do that safely with

(with-narrowing C D :label 'parser-library BODY)

which will work, independently of the A-B narrowing set by the user, and 
will reset the narrowing to A-B upon return.  And functions inside BODY 
will have to use (without-narrowing :label 'parser-library ...) to get 
access to the whole buffer.






^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-27 13:39                                                           ` Eli Zaretskii
  2023-03-27 20:05                                                             ` Gregory Heytings
@ 2023-03-27 23:06                                                             ` Dmitry Gutov
  2023-03-28 11:32                                                               ` Eli Zaretskii
  1 sibling, 1 reply; 83+ messages in thread
From: Dmitry Gutov @ 2023-03-27 23:06 UTC (permalink / raw)
  To: Eli Zaretskii, Gregory Heytings; +Cc: wkirschbaum, casouri, 62333

On 27/03/2023 16:39, Eli Zaretskii wrote:
>> Date: Mon, 27 Mar 2023 08:24:42 +0000
>> From: Gregory Heytings<gregory@heytings.org>
>> cc: Eli Zaretskii<eliz@gnu.org>,wkirschbaum@gmail.com,casouri@gmail.com,
>>      62333@debbugs.gnu.org
>>
>>>> Which is a fragile, semi-broken means, as we all know.
>>> What is a broken mess, is user-level narrowing. And how the downstream
>>> code can never guess the purpose the narrowing was applied for.
>> Note that this is what labeled narrowings attempts to solve.
> Labeled narrowing cannot solve this because it does nothing to
> alleviate the problems with user-defined narrowing.  So if the user
> narrows the buffer, we cannot do anything to safely widen in the
> general case, and labeled narrowing cannot help us.

Is that because we don't think the user level narrowing is done purely 
for visual effect? There is, again, a fair amount of confusion there, 
but judging by regular user requests for make this or that command 
ignore user-level narrowing, it seems like "purely visual" should be the 
default interpretation. And for harder narrowing, users could have a 
separate command, or a prefit arg, or etc.

When I'm talking user-level, I mean interactive 'C-x n', of course.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-27  8:24                                                         ` Gregory Heytings
  2023-03-27 13:39                                                           ` Eli Zaretskii
@ 2023-03-27 23:20                                                           ` Dmitry Gutov
  1 sibling, 0 replies; 83+ messages in thread
From: Dmitry Gutov @ 2023-03-27 23:20 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: wkirschbaum, Eli Zaretskii, casouri, 62333

On 27/03/2023 11:24, Gregory Heytings wrote:
> 
>>>>> Again, I'm talking about using a parser library.  We may need to 
>>>>> introduce a way of limiting the parser to a certain range of buffer 
>>>>> text positions, independently of narrowing.
>>>>
>>>> Except it's already limited by narrowing.
>>>
>>> Which is a fragile, semi-broken means, as we all know.
>>
>> What is a broken mess, is user-level narrowing. And how the downstream 
>> code can never guess the purpose the narrowing was applied for.
>>
> 
> Note that this is what labeled narrowings attempts to solve.  It's 
> perhaps not the best way to deal with code that has existed for a long 
> time (because such code is not prepared to handle that kind of narrowing 
> gracefully), but I don't see why it couldn't be used in new code/modes 
> such as tree-sitter ones.  It is independent of user-level narrowing, 
> and downstream code can act differently depending on the reason for 
> which the narrowing was applied.

It indeed sounds like something we had considered before: different 
types of narrowing (at the time we only wanted to distinguish between 
two types: "soft" and "hard", the latter for use by mixed-mode features, 
or other stuff which wanted to preclude full widening, such as Info). 
But that fizzled out on the prototyping stage.

(Aside: tree-sitter itself has its own support for "ranges", which will 
work without any narrowing related stuff as long as grammars for all 
langs are available -- or perhaps the combination should be available as 
a grammar too, I'm not sure -- anyway, it doesn't need much help, but it 
would still be nice to support embedding tree-sitter managed code inside 
"regular" modes, or have better support for mixing said regular modes, 
something we already do.)

The new narrowing feature with labels kind of resembles that, except if 
I'm thinking about "intents", I could probably enumerate "visual" (for 
interactive narrowing), "hard" (for mixed-mode stuff or Info), or... 
"movement" (simply performed to constrain movement, but without goal to 
alter the parsing context -- such as narrowing before calling 
forward-sexp, in blink-matching-paren's example). These could be 
documented and assigned relative depth, sorting them like "hard > 
movement > visual", where code willing to undo "movement" would 
naturally undo "visual" as well, and code will to undo "hard" narrowing 
would undo them all.

How treesit-forward-sexp would handle "movement" narrowing is something 
up for discussion, though: maybe just ignore it (given that there is no 
performance tax), or maybe it would still perform a position check at 
the end (after finding the matching paren), to see if it ends up beyond 
the accessible region.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-27 13:29                                                         ` Eli Zaretskii
@ 2023-03-27 23:33                                                           ` Dmitry Gutov
  2023-03-28 11:38                                                             ` Eli Zaretskii
  0 siblings, 1 reply; 83+ messages in thread
From: Dmitry Gutov @ 2023-03-27 23:33 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: wkirschbaum, casouri, 62333

On 27/03/2023 16:29, Eli Zaretskii wrote:
>> Date: Mon, 27 Mar 2023 01:00:20 +0300
>> Cc: wkirschbaum@gmail.com, casouri@gmail.com, 62333@debbugs.gnu.org
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>>> So you are suggesting to introduce kludges like font-lock-dont-widen
>>> in all of those places?
>>
>> font-lock-dont-widen is a kludge, but that's largely determined by the
>> way it's defined and used.
> 
> With parser-based features, we have an opportunity to do this in a
> cleaner manner.

parser-based features don't need this at all, if considered in 
isolation. But if we try to combine them with existing mode, or existing 
packages, they need to play by the common rules. Which they currently do.

>> If we take indent-for-tab-command, for example, it doesn't have such a
>> variable, and doesn't really need to: the top-level command calls
>> 'widen', and then indent-line-function (set by major mode and altered by
>> e.g. mmm-mode) is free to impose its specific bounds.
> 
> I thought about a lower-level, infrastructure-level, mechanism that
> could be used to restrict a parser to a certain region of the buffer.
> Then this could be used by every feature based on parsers, instead of
> us having to invent a separate solution for each one.

Like narrowing, but just for parsers? But parsers obey narrowing 
already. Sounds a bit like conceptual duplication. How does this solve 
blink-matching-paren issue anyway?

>> The "grand unified theory of mixed major modes" has been attempted a few
>> times in the past, and never reached anything practical.
> 
> But here we have a unique opportunity to maybe find a solution, at
> least for stuff based on tree-sitter and similar libraries.  That
> maybe not "grand", but certainly "respectable".

tree-sitter has its own support for mixed languages.

>>>> Except it's already limited by narrowing.
>>>
>>> Which is a fragile, semi-broken means, as we all know.
>>
>> What is a broken mess, is user-level narrowing.
> 
> Which is why restricting parsers should not be a user-level feature.

We're talking elisp-level, though. The problem with interactive 
narrowing, is its impossible to tell apart from one effected by Lisp. 
And they usually have different goals.

>>> Look, I'm trying to see how we could come up with an infrastructure
>>> that will support multiple modes and other similar features in the
>>> same buffer without relying on narrowing, thus bypassing the
>>> disadvantages and difficulties that come with narrowing.  I think we
>>> have a good chance here to come up with such a solution, specifically
>>> for features that us a parsing library.  If you aren't interested in
>>> discussing that, and think we should stick to narrowing, then this
>>> goes nowhere, and I'd rather bow out of it.
>>
>> What I've seen here so far is you suggesting we go ahead and break the
>> existing convention and then let "them" (third-party authors including
>> myself) come up with a new working one.
> 
> You are mixing two semi-separate issues: how to fix the immediate
> problem with blink-matching-paren (if we consider it a serious
> problem), and how to try solving similar issues as a whole.

Not mixing anything. We have one proposal for improving 
blink-matching-paren integration anyway. It should be compatible with 
whatever we choose regarding narrowing and mixed modes.

> The
> latter is a long-term goal, and we can discuss it freely and calmly;
> whereby ideas can be brought up even if they might not be the most
> clever ones or the ones with which you personally agree.

I'm not looking for "clever".

>> My stance here is we shouldn't break it before we create a new one.
> 
> No one broke anything.  We are just discussing ideas.  Please don't
> exaggerate.

I never said anybody has broken anything already.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-27 20:05                                                             ` Gregory Heytings
@ 2023-03-28 11:30                                                               ` Eli Zaretskii
  2023-03-28 11:39                                                                 ` Gregory Heytings
  0 siblings, 1 reply; 83+ messages in thread
From: Eli Zaretskii @ 2023-03-28 11:30 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: wkirschbaum, casouri, 62333, dgutov

> Date: Mon, 27 Mar 2023 20:05:07 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: dgutov@yandex.ru, wkirschbaum@gmail.com, casouri@gmail.com, 
>     62333@debbugs.gnu.org
> 
> > Labeled narrowing cannot solve this because it does nothing to alleviate 
> > the problems with user-defined narrowing.  So if the user narrows the 
> > buffer, we cannot do anything to safely widen in the general case, and 
> > labeled narrowing cannot help us.
> 
> I must be missing something, but I don't understand what you mean.  If a 
> user has narrowed a buffer to a certain region A-B, and if we want to 
> limit a parser to a certain region C-D, we can do that safely with
> 
> (with-narrowing C D :label 'parser-library BODY)

(You mean with-restriction.)

> which will work, independently of the A-B narrowing set by the user, and 
> will reset the narrowing to A-B upon return.

It will only work if [C..D] is inside [A..B].  It will not work if a
Lisp program wants to widen [A..B], i.e. if [C..D] is larger than
[A..B].





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-27 23:06                                                             ` Dmitry Gutov
@ 2023-03-28 11:32                                                               ` Eli Zaretskii
  2023-03-28 21:08                                                                 ` Dmitry Gutov
  0 siblings, 1 reply; 83+ messages in thread
From: Eli Zaretskii @ 2023-03-28 11:32 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: wkirschbaum, gregory, casouri, 62333

> Date: Tue, 28 Mar 2023 02:06:17 +0300
> Cc: wkirschbaum@gmail.com, casouri@gmail.com, 62333@debbugs.gnu.org
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> On 27/03/2023 16:39, Eli Zaretskii wrote:
> >> Date: Mon, 27 Mar 2023 08:24:42 +0000
> >> From: Gregory Heytings<gregory@heytings.org>
> >> cc: Eli Zaretskii<eliz@gnu.org>,wkirschbaum@gmail.com,casouri@gmail.com,
> >>      62333@debbugs.gnu.org
> >>
> >>>> Which is a fragile, semi-broken means, as we all know.
> >>> What is a broken mess, is user-level narrowing. And how the downstream
> >>> code can never guess the purpose the narrowing was applied for.
> >> Note that this is what labeled narrowings attempts to solve.
> > Labeled narrowing cannot solve this because it does nothing to
> > alleviate the problems with user-defined narrowing.  So if the user
> > narrows the buffer, we cannot do anything to safely widen in the
> > general case, and labeled narrowing cannot help us.
> 
> Is that because we don't think the user level narrowing is done purely 
> for visual effect?

Indeed, it isn't always for visual effect.

> judging by regular user requests for make this or that command 
> ignore user-level narrowing, it seems like "purely visual" should be the 
> default interpretation.

I think you base your judgment on feedback from users who are not used
to take advantage of narrowing in editing.  I think most young people
aren't, since this feature is more-or-less unique to Emacs.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-27 23:33                                                           ` Dmitry Gutov
@ 2023-03-28 11:38                                                             ` Eli Zaretskii
  2023-03-28 21:19                                                               ` Dmitry Gutov
  0 siblings, 1 reply; 83+ messages in thread
From: Eli Zaretskii @ 2023-03-28 11:38 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: wkirschbaum, casouri, 62333

> Date: Tue, 28 Mar 2023 02:33:38 +0300
> Cc: wkirschbaum@gmail.com, casouri@gmail.com, 62333@debbugs.gnu.org
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> > With parser-based features, we have an opportunity to do this in a
> > cleaner manner.
> 
> parser-based features don't need this at all, if considered in 
> isolation. But if we try to combine them with existing mode, or existing 
> packages, they need to play by the common rules. Which they currently do.

Sorry, I don't see the relevance of that to what I wrote above.

> >> If we take indent-for-tab-command, for example, it doesn't have such a
> >> variable, and doesn't really need to: the top-level command calls
> >> 'widen', and then indent-line-function (set by major mode and altered by
> >> e.g. mmm-mode) is free to impose its specific bounds.
> > 
> > I thought about a lower-level, infrastructure-level, mechanism that
> > could be used to restrict a parser to a certain region of the buffer.
> > Then this could be used by every feature based on parsers, instead of
> > us having to invent a separate solution for each one.
> 
> Like narrowing, but just for parsers? But parsers obey narrowing 
> already. Sounds a bit like conceptual duplication. How does this solve 
> blink-matching-paren issue anyway?

We could widen without fearing that a parser will "invade" regions of
buffer text that we don't want it to wander into.

> >> The "grand unified theory of mixed major modes" has been attempted a few
> >> times in the past, and never reached anything practical.
> > 
> > But here we have a unique opportunity to maybe find a solution, at
> > least for stuff based on tree-sitter and similar libraries.  That
> > maybe not "grand", but certainly "respectable".
> 
> tree-sitter has its own support for mixed languages.

So your argument about mmm framework was a red herring, cause that
problem doesn't exist wrt tree-sitter parsers?

> >>>> Except it's already limited by narrowing.
> >>>
> >>> Which is a fragile, semi-broken means, as we all know.
> >>
> >> What is a broken mess, is user-level narrowing.
> > 
> > Which is why restricting parsers should not be a user-level feature.
> 
> We're talking elisp-level, though. The problem with interactive 
> narrowing, is its impossible to tell apart from one effected by Lisp. 
> And they usually have different goals.

Yes.  So if this new feature will not be exposed to users, those
dangers will be avoided.

> >> What I've seen here so far is you suggesting we go ahead and break the
> >> existing convention and then let "them" (third-party authors including
> >> myself) come up with a new working one.
> > 
> > You are mixing two semi-separate issues: how to fix the immediate
> > problem with blink-matching-paren (if we consider it a serious
> > problem), and how to try solving similar issues as a whole.
> 
> Not mixing anything. We have one proposal for improving 
> blink-matching-paren integration anyway. It should be compatible with 
> whatever we choose regarding narrowing and mixed modes.
> 
> > The
> > latter is a long-term goal, and we can discuss it freely and calmly;
> > whereby ideas can be brought up even if they might not be the most
> > clever ones or the ones with which you personally agree.
> 
> I'm not looking for "clever".
> 
> >> My stance here is we shouldn't break it before we create a new one.
> > 
> > No one broke anything.  We are just discussing ideas.  Please don't
> > exaggerate.
> 
> I never said anybody has broken anything already.

You did say that my ideas break something, see above.  Ideas cannot
break any code, so this argument shouldn't be brought up if you want a
calm and rational discussion.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-28 11:30                                                               ` Eli Zaretskii
@ 2023-03-28 11:39                                                                 ` Gregory Heytings
  2023-03-28 12:11                                                                   ` Eli Zaretskii
  0 siblings, 1 reply; 83+ messages in thread
From: Gregory Heytings @ 2023-03-28 11:39 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: wkirschbaum, casouri, 62333, dgutov


>> which will work, independently of the A-B narrowing set by the user, 
>> and will reset the narrowing to A-B upon return.
>
> It will only work if [C..D] is inside [A..B].  It will not work if a 
> Lisp program wants to widen [A..B], i.e. if [C..D] is larger than 
> [A..B].
>

Hmmm... no, it will work for any values of [C..D]: (widen) is equivalent 
to (narrow-to-region 1 (1+ (buffer-size))), and in general the bounds 
given to 'narrow-to-region' are not limited by the current narrowing.






^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-28 11:39                                                                 ` Gregory Heytings
@ 2023-03-28 12:11                                                                   ` Eli Zaretskii
  2023-03-28 12:25                                                                     ` Gregory Heytings
  0 siblings, 1 reply; 83+ messages in thread
From: Eli Zaretskii @ 2023-03-28 12:11 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: wkirschbaum, casouri, 62333, dgutov

> Date: Tue, 28 Mar 2023 11:39:13 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: dgutov@yandex.ru, wkirschbaum@gmail.com, casouri@gmail.com, 
>     62333@debbugs.gnu.org
> 
> 
> >> which will work, independently of the A-B narrowing set by the user, 
> >> and will reset the narrowing to A-B upon return.
> >
> > It will only work if [C..D] is inside [A..B].  It will not work if a 
> > Lisp program wants to widen [A..B], i.e. if [C..D] is larger than 
> > [A..B].
> >
> 
> Hmmm... no, it will work for any values of [C..D]: (widen) is equivalent 
> to (narrow-to-region 1 (1+ (buffer-size))), and in general the bounds 
> given to 'narrow-to-region' are not limited by the current narrowing.

with-restriction signals an error if you call it wit a region that is
outside of the current restriction.  At least it does here.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-28 12:11                                                                   ` Eli Zaretskii
@ 2023-03-28 12:25                                                                     ` Gregory Heytings
  2023-03-28 12:36                                                                       ` Eli Zaretskii
  0 siblings, 1 reply; 83+ messages in thread
From: Gregory Heytings @ 2023-03-28 12:25 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: wkirschbaum, casouri, 62333, dgutov


>> Hmmm... no, it will work for any values of [C..D]: (widen) is 
>> equivalent to (narrow-to-region 1 (1+ (buffer-size))), and in general 
>> the bounds given to 'narrow-to-region' are not limited by the current 
>> narrowing.
>
> with-restriction signals an error if you call it wit a region that is 
> outside of the current restriction.  At least it does here.
>

Do you have a recipe?  It should not signal an error, and I can't 
reproduce that.  With this for instance:

M-: (global-set-key (kbd "C-t") (lambda () (interactive) (with-restriction 20 30 (message "{%s}" (buffer-string))))) RET

C-t (in *scratch*) displays {or text th}, even if the text is narrowed say 
to the second line.






^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-28 12:25                                                                     ` Gregory Heytings
@ 2023-03-28 12:36                                                                       ` Eli Zaretskii
  0 siblings, 0 replies; 83+ messages in thread
From: Eli Zaretskii @ 2023-03-28 12:36 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: wkirschbaum, casouri, 62333, dgutov

> Date: Tue, 28 Mar 2023 12:25:03 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: wkirschbaum@gmail.com, casouri@gmail.com, 62333@debbugs.gnu.org, 
>     dgutov@yandex.ru
> 
> 
> >> Hmmm... no, it will work for any values of [C..D]: (widen) is 
> >> equivalent to (narrow-to-region 1 (1+ (buffer-size))), and in general 
> >> the bounds given to 'narrow-to-region' are not limited by the current 
> >> narrowing.
> >
> > with-restriction signals an error if you call it wit a region that is 
> > outside of the current restriction.  At least it does here.
> >
> 
> Do you have a recipe?  It should not signal an error, and I can't 
> reproduce that.  With this for instance:
> 
> M-: (global-set-key (kbd "C-t") (lambda () (interactive) (with-restriction 20 30 (message "{%s}" (buffer-string))))) RET

Sorry, my bad.  Bad testing.

But regardless, lifting user-defined restriction is a no-no, that's
what the problem is all about.  with-restriction cannot do anything
against this.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-28 11:32                                                               ` Eli Zaretskii
@ 2023-03-28 21:08                                                                 ` Dmitry Gutov
  2023-03-29 11:08                                                                   ` Eli Zaretskii
  0 siblings, 1 reply; 83+ messages in thread
From: Dmitry Gutov @ 2023-03-28 21:08 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: wkirschbaum, gregory, casouri, 62333

On 28/03/2023 14:32, Eli Zaretskii wrote:
>> Date: Tue, 28 Mar 2023 02:06:17 +0300
>> Cc: wkirschbaum@gmail.com, casouri@gmail.com, 62333@debbugs.gnu.org
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>> On 27/03/2023 16:39, Eli Zaretskii wrote:
>>>> Date: Mon, 27 Mar 2023 08:24:42 +0000
>>>> From: Gregory Heytings<gregory@heytings.org>
>>>> cc: Eli Zaretskii<eliz@gnu.org>,wkirschbaum@gmail.com,casouri@gmail.com,
>>>>       62333@debbugs.gnu.org
>>>>
>>>>>> Which is a fragile, semi-broken means, as we all know.
>>>>> What is a broken mess, is user-level narrowing. And how the downstream
>>>>> code can never guess the purpose the narrowing was applied for.
>>>> Note that this is what labeled narrowings attempts to solve.
>>> Labeled narrowing cannot solve this because it does nothing to
>>> alleviate the problems with user-defined narrowing.  So if the user
>>> narrows the buffer, we cannot do anything to safely widen in the
>>> general case, and labeled narrowing cannot help us.
>>
>> Is that because we don't think the user level narrowing is done purely
>> for visual effect?
> 
> Indeed, it isn't always for visual effect.

When isn't it? Is there a way to determine that from code?

>> judging by regular user requests for make this or that command
>> ignore user-level narrowing, it seems like "purely visual" should be the
>> default interpretation.
> 
> I think you base your judgment on feedback from users who are not used
> to take advantage of narrowing in editing.  I think most young people
> aren't, since this feature is more-or-less unique to Emacs.

Either narrowing should be used to change lexical/grammatical/etc 
context, or it should not. Do we have any documentation that says one or 
the other way? That should affect how Lisp code deals with narrowing -- 
which interactive functions should widen, and so on.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-28 11:38                                                             ` Eli Zaretskii
@ 2023-03-28 21:19                                                               ` Dmitry Gutov
  2023-03-29 11:17                                                                 ` Eli Zaretskii
  0 siblings, 1 reply; 83+ messages in thread
From: Dmitry Gutov @ 2023-03-28 21:19 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: wkirschbaum, casouri, 62333

On 28/03/2023 14:38, Eli Zaretskii wrote:
>> Date: Tue, 28 Mar 2023 02:33:38 +0300
>> Cc: wkirschbaum@gmail.com, casouri@gmail.com, 62333@debbugs.gnu.org
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>>> With parser-based features, we have an opportunity to do this in a
>>> cleaner manner.
>>
>> parser-based features don't need this at all, if considered in
>> isolation. But if we try to combine them with existing mode, or existing
>> packages, they need to play by the common rules. Which they currently do.
> 
> Sorry, I don't see the relevance of that to what I wrote above.
> 
>>>> If we take indent-for-tab-command, for example, it doesn't have such a
>>>> variable, and doesn't really need to: the top-level command calls
>>>> 'widen', and then indent-line-function (set by major mode and altered by
>>>> e.g. mmm-mode) is free to impose its specific bounds.
>>>
>>> I thought about a lower-level, infrastructure-level, mechanism that
>>> could be used to restrict a parser to a certain region of the buffer.
>>> Then this could be used by every feature based on parsers, instead of
>>> us having to invent a separate solution for each one.
>>
>> Like narrowing, but just for parsers? But parsers obey narrowing
>> already. Sounds a bit like conceptual duplication. How does this solve
>> blink-matching-paren issue anyway?
> 
> We could widen without fearing that a parser will "invade" regions of
> buffer text that we don't want it to wander into.

So any code that wants to restrict a "parser" based buffer, would need 
to use a different primitive to narrow? And vice versa, any code that 
uses a parser, will need to (widen) first, to ensure that the parser is 
not affected by any restriction set up by any code previously?

Anyway, I don't see why we should institute a special category for these 
buffers. Most language modes which define syntax-propertize-function are 
basically "parser-based", in most of the relevant respects. Except the 
accuracy is less, and we write the parsing code ourselves.

>>>> The "grand unified theory of mixed major modes" has been attempted a few
>>>> times in the past, and never reached anything practical.
>>>
>>> But here we have a unique opportunity to maybe find a solution, at
>>> least for stuff based on tree-sitter and similar libraries.  That
>>> maybe not "grand", but certainly "respectable".
>>
>> tree-sitter has its own support for mixed languages.
> 
> So your argument about mmm framework was a red herring, cause that
> problem doesn't exist wrt tree-sitter parsers?

Nope, see the first paragraph of my previous reply (the "no relevance" one).

>>>> My stance here is we shouldn't break it before we create a new one.
>>>
>>> No one broke anything.  We are just discussing ideas.  Please don't
>>> exaggerate.
>>
>> I never said anybody has broken anything already.
> 
> You did say that my ideas break something, see above.  Ideas cannot
> break any code, so this argument shouldn't be brought up if you want a
> calm and rational discussion.

Ideas cannot, but implementing them can. "This or that change will break 
an existing convention" is a rational argument.

Shall we stop quibbling over words?





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-28 21:08                                                                 ` Dmitry Gutov
@ 2023-03-29 11:08                                                                   ` Eli Zaretskii
  2023-03-31  1:10                                                                     ` Dmitry Gutov
  0 siblings, 1 reply; 83+ messages in thread
From: Eli Zaretskii @ 2023-03-29 11:08 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: wkirschbaum, gregory, casouri, 62333

> Date: Wed, 29 Mar 2023 00:08:53 +0300
> Cc: wkirschbaum@gmail.com, gregory@heytings.org, casouri@gmail.com,
>  62333@debbugs.gnu.org
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> >> Is that because we don't think the user level narrowing is done purely
> >> for visual effect?
> > 
> > Indeed, it isn't always for visual effect.
> 
> When isn't it? Is there a way to determine that from code?

I'm not sure I understand the question, but if I do, then narrowing to
prevent search functions and commands from finding irrelevant hits is
one example that comes to mind.

> >> judging by regular user requests for make this or that command
> >> ignore user-level narrowing, it seems like "purely visual" should be the
> >> default interpretation.
> > 
> > I think you base your judgment on feedback from users who are not used
> > to take advantage of narrowing in editing.  I think most young people
> > aren't, since this feature is more-or-less unique to Emacs.
> 
> Either narrowing should be used to change lexical/grammatical/etc 
> context, or it should not. Do we have any documentation that says one or 
> the other way? That should affect how Lisp code deals with narrowing -- 
> which interactive functions should widen, and so on.

I was talking about user commands that narrow, so I'm not sure I
understand how documentation could help.  When the user types "C-x n n",
there's nothing Emacs can do except obey.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-28 21:19                                                               ` Dmitry Gutov
@ 2023-03-29 11:17                                                                 ` Eli Zaretskii
  2023-03-30 15:50                                                                   ` Gregory Heytings
  2023-03-31  1:17                                                                   ` Dmitry Gutov
  0 siblings, 2 replies; 83+ messages in thread
From: Eli Zaretskii @ 2023-03-29 11:17 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: wkirschbaum, casouri, 62333

> Date: Wed, 29 Mar 2023 00:19:41 +0300
> Cc: wkirschbaum@gmail.com, casouri@gmail.com, 62333@debbugs.gnu.org
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> >> Like narrowing, but just for parsers? But parsers obey narrowing
> >> already. Sounds a bit like conceptual duplication. How does this solve
> >> blink-matching-paren issue anyway?
> > 
> > We could widen without fearing that a parser will "invade" regions of
> > buffer text that we don't want it to wander into.
> 
> So any code that wants to restrict a "parser" based buffer, would need 
> to use a different primitive to narrow?

No, the idea is to create the parser with these restrictions to begin
with.

> And vice versa, any code that uses a parser, will need to (widen)
> first, to ensure that the parser is not affected by any restriction
> set up by any code previously?

No, if the parser is restricted, there should be no need to "widen"
it, at least not in most cases I could think about where a parser
should be restricted to a part of the buffer.

> Anyway, I don't see why we should institute a special category for these 
> buffers.

Because IMO it's cleaner and simpler than using narrowing, and doesn't
suffer from the problems we see in narrowing.

> >>>> The "grand unified theory of mixed major modes" has been attempted a few
> >>>> times in the past, and never reached anything practical.
> >>>
> >>> But here we have a unique opportunity to maybe find a solution, at
> >>> least for stuff based on tree-sitter and similar libraries.  That
> >>> maybe not "grand", but certainly "respectable".
> >>
> >> tree-sitter has its own support for mixed languages.
> > 
> > So your argument about mmm framework was a red herring, cause that
> > problem doesn't exist wrt tree-sitter parsers?
> 
> Nope, see the first paragraph of my previous reply (the "no relevance" one).

Which first paragraph is that?  In what "previous reply" should I look
and where?  (And why couldn't you simply copy that here, to make
following the discussion easier?)

> >>>> My stance here is we shouldn't break it before we create a new one.
> >>>
> >>> No one broke anything.  We are just discussing ideas.  Please don't
> >>> exaggerate.
> >>
> >> I never said anybody has broken anything already.
> > 
> > You did say that my ideas break something, see above.  Ideas cannot
> > break any code, so this argument shouldn't be brought up if you want a
> > calm and rational discussion.
> 
> Ideas cannot, but implementing them can. "This or that change will break 
> an existing convention" is a rational argument.
> 
> Shall we stop quibbling over words?

I'm "quibbling" over words because your particular selection of words
makes serious discussion nigh impossible.  Not the first time, either.
As soon as there's some disagreement, sooner or later those words
(like "quibbling") come out.  Whether it's because of some attitude or
not, I don't know, but you may wish to reflect on that and perhaps try
to express your disagreements using different words.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-29 11:17                                                                 ` Eli Zaretskii
@ 2023-03-30 15:50                                                                   ` Gregory Heytings
  2023-03-30 16:04                                                                     ` Eli Zaretskii
  2023-03-31  1:17                                                                   ` Dmitry Gutov
  1 sibling, 1 reply; 83+ messages in thread
From: Gregory Heytings @ 2023-03-30 15:50 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: wkirschbaum, casouri, 62333, Dmitry Gutov


>
> No, the idea is to create the parser with these restrictions to begin 
> with.
>

Could you perhaps explain, with some fictitious code, what kind of 
solution you imagine?  I'm not sure I understand (euphemism for: I'm sure 
I don't understand) the problem statement.

In what way would the restrictions you have in mind be different from 
those of a regular narrowing?

Also, would such a parser always/never/sometimes obey the user narrowing?






^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-30 15:50                                                                   ` Gregory Heytings
@ 2023-03-30 16:04                                                                     ` Eli Zaretskii
  2023-03-30 16:28                                                                       ` Gregory Heytings
  2023-03-31  1:25                                                                       ` Dmitry Gutov
  0 siblings, 2 replies; 83+ messages in thread
From: Eli Zaretskii @ 2023-03-30 16:04 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: wkirschbaum, casouri, 62333, dgutov

> Date: Thu, 30 Mar 2023 15:50:31 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: Dmitry Gutov <dgutov@yandex.ru>, wkirschbaum@gmail.com, casouri@gmail.com, 
>     62333@debbugs.gnu.org
> 
> > No, the idea is to create the parser with these restrictions to begin 
> > with.
> 
> Could you perhaps explain, with some fictitious code, what kind of 
> solution you imagine?  I'm not sure I understand (euphemism for: I'm sure 
> I don't understand) the problem statement.

Something like

  (treesit-make-parser LANGUAGE BUFFER nil START END)

and

  (treesit-parser-set-included-ranges RANGES...)

(the latter already exists).

> In what way would the restrictions you have in mind be different from 
> those of a regular narrowing?

User-defined narrowing will never contradict parser restrictions.

> Also, would such a parser always/never/sometimes obey the user narrowing?

It will always obey narrowing (it must), but we can then widen the
buffer temporarily inside some functions without caring about the
semantics of the narrowing and its source/purpose.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-30 16:04                                                                     ` Eli Zaretskii
@ 2023-03-30 16:28                                                                       ` Gregory Heytings
  2023-03-30 16:40                                                                         ` Eli Zaretskii
  2023-03-31  1:25                                                                       ` Dmitry Gutov
  1 sibling, 1 reply; 83+ messages in thread
From: Gregory Heytings @ 2023-03-30 16:28 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: wkirschbaum, casouri, 62333, dgutov


>> Could you perhaps explain, with some fictitious code, what kind of 
>> solution you imagine?  I'm not sure I understand (euphemism for: I'm 
>> sure I don't understand) the problem statement.
>
> Something like
>
>  (treesit-make-parser LANGUAGE BUFFER nil START END)
>
> and
>
>  (treesit-parser-set-included-ranges RANGES...)
>
> (the latter already exists).
>

Where "RANGES..." are included in [START..END], right?

>> In what way would the restrictions you have in mind be different from 
>> those of a regular narrowing?
>
> User-defined narrowing will never contradict parser restrictions.
>

You mean, they will be independent, right?  In other words, if the user 
sets the narrowing to 1000-1200 in a buffer in which treesit-make-parser 
has been called, say, once with 'php 400 1100' and once with 'js 1100 
1500', the two parsers will continue to have access to these ranges?

>> Also, would such a parser always/never/sometimes obey the user 
>> narrowing?
>
> It will always obey narrowing (it must), but we can then widen the 
> buffer temporarily inside some functions without caring about the 
> semantics of the narrowing and its source/purpose.
>

Here I'm confused, that sentence seems to contradict the previous one. 
"It" in "it will always obey narrowing" is the parser, right, and 
"narrowing" is "the narrowing bounds set by 'treesit-make-parser'", right?






^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-30 16:28                                                                       ` Gregory Heytings
@ 2023-03-30 16:40                                                                         ` Eli Zaretskii
  2023-03-30 17:27                                                                           ` Gregory Heytings
  0 siblings, 1 reply; 83+ messages in thread
From: Eli Zaretskii @ 2023-03-30 16:40 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: wkirschbaum, casouri, 62333, dgutov

> Date: Thu, 30 Mar 2023 16:28:58 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: wkirschbaum@gmail.com, casouri@gmail.com, 62333@debbugs.gnu.org, 
>     dgutov@yandex.ru
> 
> > Something like
> >
> >  (treesit-make-parser LANGUAGE BUFFER nil START END)
> >
> > and
> >
> >  (treesit-parser-set-included-ranges RANGES...)
> >
> > (the latter already exists).
> >
> 
> Where "RANGES..." are included in [START..END], right?

Probably.  Or maybe instead of START and END we should have RANGES...

> > User-defined narrowing will never contradict parser restrictions.
> 
> You mean, they will be independent, right?  In other words, if the user 
> sets the narrowing to 1000-1200 in a buffer in which treesit-make-parser 
> has been called, say, once with 'php 400 1100' and once with 'js 1100 
> 1500', the two parsers will continue to have access to these ranges?

The parsers _can_ have access to those ranges, if they need it for
some reason.  In general, everything in Emacs should honor the current
restriction, unless there's a good reason to ignore it.  The problem
with ignoring it is that we can never know which code/user defined the
restriction and for what purpose.  I hope that keeping the parser's
restrictions as part of the parser itself will allow us to break free
of that issue when we have to widen.

> >> Also, would such a parser always/never/sometimes obey the user 
> >> narrowing?
> >
> > It will always obey narrowing (it must), but we can then widen the 
> > buffer temporarily inside some functions without caring about the 
> > semantics of the narrowing and its source/purpose.
> >
> 
> Here I'm confused, that sentence seems to contradict the previous one. 
> "It" in "it will always obey narrowing" is the parser, right, and 
> "narrowing" is "the narrowing bounds set by 'treesit-make-parser'", right?

See above.  I hope that explains what I meant.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-30 16:40                                                                         ` Eli Zaretskii
@ 2023-03-30 17:27                                                                           ` Gregory Heytings
  2023-03-30 17:47                                                                             ` Eli Zaretskii
  0 siblings, 1 reply; 83+ messages in thread
From: Gregory Heytings @ 2023-03-30 17:27 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: wkirschbaum, casouri, 62333, dgutov


>>> User-defined narrowing will never contradict parser restrictions.
>>
>> You mean, they will be independent, right?  In other words, if the user 
>> sets the narrowing to 1000-1200 in a buffer in which 
>> treesit-make-parser has been called, say, once with 'php 400 1100' and 
>> once with 'js 1100 1500', the two parsers will continue to have access 
>> to these ranges?
>
> The parsers _can_ have access to those ranges, if they need it for some 
> reason.  In general, everything in Emacs should honor the current 
> restriction, unless there's a good reason to ignore it.
>

Okay, so in the above example by default the parsers will only have access 
to 1000-1100 for the first one, and 1100-1200 for the second one until the 
user removes the restrictions.  Unless they need to widen the buffer for 
some (good) reason.

If they do widen, will the parsers get access to [400..1100] and 
[1100..1500], or to the whole buffer?  Or will they have two ways to 
widen, one to get access to the whole region on which they have been 
defined, and another one to get access to the whole buffer?

>
> The problem with ignoring it is that we can never know which code/user 
> defined the restriction and for what purpose.  I hope that keeping the 
> parser's restrictions as part of the parser itself will allow us to 
> break free of that issue when we have to widen.
>

At least it's a possibility that seems worth investigating.






^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-30 17:27                                                                           ` Gregory Heytings
@ 2023-03-30 17:47                                                                             ` Eli Zaretskii
  2023-03-30 20:14                                                                               ` Gregory Heytings
  0 siblings, 1 reply; 83+ messages in thread
From: Eli Zaretskii @ 2023-03-30 17:47 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: wkirschbaum, casouri, 62333, dgutov

> Date: Thu, 30 Mar 2023 17:27:02 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: wkirschbaum@gmail.com, casouri@gmail.com, 62333@debbugs.gnu.org, 
>     dgutov@yandex.ru
> 
> > The parsers _can_ have access to those ranges, if they need it for some 
> > reason.  In general, everything in Emacs should honor the current 
> > restriction, unless there's a good reason to ignore it.
> 
> Okay, so in the above example by default the parsers will only have access 
> to 1000-1100 for the first one, and 1100-1200 for the second one until the 
> user removes the restrictions.  Unless they need to widen the buffer for 
> some (good) reason.
> 
> If they do widen, will the parsers get access to [400..1100] and 
> [1100..1500], or to the whole buffer?

The former.

> > The problem with ignoring it is that we can never know which code/user 
> > defined the restriction and for what purpose.  I hope that keeping the 
> > parser's restrictions as part of the parser itself will allow us to 
> > break free of that issue when we have to widen.
> 
> At least it's a possibility that seems worth investigating.

I think so, yes.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-30 17:47                                                                             ` Eli Zaretskii
@ 2023-03-30 20:14                                                                               ` Gregory Heytings
  2023-03-30 22:08                                                                                 ` Gregory Heytings
  0 siblings, 1 reply; 83+ messages in thread
From: Gregory Heytings @ 2023-03-30 20:14 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: wkirschbaum, casouri, 62333, dgutov


>>> The parsers _can_ have access to those ranges, if they need it for 
>>> some reason.  In general, everything in Emacs should honor the current 
>>> restriction, unless there's a good reason to ignore it.
>>
>> Okay, so in the above example by default the parsers will only have 
>> access to 1000-1100 for the first one, and 1100-1200 for the second one 
>> until the user removes the restrictions.  Unless they need to widen the 
>> buffer for some (good) reason.
>>
>> If they do widen, will the parsers get access to [400..1100] and 
>> [1100..1500], or to the whole buffer?
>
> The former.
>

Okay, thanks.  Now I think I understand what you want.  I'll think about 
it.






^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-30 20:14                                                                               ` Gregory Heytings
@ 2023-03-30 22:08                                                                                 ` Gregory Heytings
  2023-03-31  6:15                                                                                   ` Eli Zaretskii
  0 siblings, 1 reply; 83+ messages in thread
From: Gregory Heytings @ 2023-03-30 22:08 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: wkirschbaum, casouri, 62333, dgutov


>>>> The parsers _can_ have access to those ranges, if they need it for 
>>>> some reason.  In general, everything in Emacs should honor the 
>>>> current restriction, unless there's a good reason to ignore it.
>>> 
>>> Okay, so in the above example by default the parsers will only have 
>>> access to 1000-1100 for the first one, and 1100-1200 for the second 
>>> one until the user removes the restrictions.  Unless they need to 
>>> widen the buffer for some (good) reason.
>>> 
>>> If they do widen, will the parsers get access to [400..1100] and 
>>> [1100..1500], or to the whole buffer?
>> 
>> The former.
>
> Okay, thanks.  Now I think I understand what you want.  I'll think about 
> it.
>

Two other questions:

Should there exist a mechanism to give the parsers access to the whole 
buffer (IOW, to let them ignore both the bounds passed to 
'treesit-make-parser' and the restriction set by the user)?

And of course, the bounds given to 'treesit-make-parser' should become 
markers, right, that is, their position should change whenever the buffer 
contents change, right?






^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-29 11:08                                                                   ` Eli Zaretskii
@ 2023-03-31  1:10                                                                     ` Dmitry Gutov
  2023-03-31  1:27                                                                       ` Dmitry Gutov
  2023-03-31  6:19                                                                       ` Eli Zaretskii
  0 siblings, 2 replies; 83+ messages in thread
From: Dmitry Gutov @ 2023-03-31  1:10 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: wkirschbaum, gregory, casouri, 62333

On 29/03/2023 14:08, Eli Zaretskii wrote:
>> Date: Wed, 29 Mar 2023 00:08:53 +0300
>> Cc: wkirschbaum@gmail.com, gregory@heytings.org, casouri@gmail.com,
>>   62333@debbugs.gnu.org
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>>>> Is that because we don't think the user level narrowing is done purely
>>>> for visual effect?
>>>
>>> Indeed, it isn't always for visual effect.
>>
>> When isn't it? Is there a way to determine that from code?
> 
> I'm not sure I understand the question, but if I do, then narrowing to
> prevent search functions

If we're talking about isearch, then that seems like a natural 
consequence of visual effect (hiding the remainder of the buffer): even 
if isearch highlighted those other hits, they would not be visible.

> and commands from finding irrelevant hits is
> one example that comes to mind.

More or less the same, except we have the user option 
widen-automatically, which apparently (?) allows any command to "widen 
when they want to"?

Used by popular demand in e.g. xref--goto-char. And IIUC 'find-tag' just 
always calls 'widen' irrespective of this variable's value.

>>>> judging by regular user requests for make this or that command
>>>> ignore user-level narrowing, it seems like "purely visual" should be the
>>>> default interpretation.
>>>
>>> I think you base your judgment on feedback from users who are not used
>>> to take advantage of narrowing in editing.  I think most young people
>>> aren't, since this feature is more-or-less unique to Emacs.
>>
>> Either narrowing should be used to change lexical/grammatical/etc
>> context, or it should not. Do we have any documentation that says one or
>> the other way? That should affect how Lisp code deals with narrowing --
>> which interactive functions should widen, and so on.
> 
> I was talking about user commands that narrow, so I'm not sure I
> understand how documentation could help.  When the user types "C-x n n",
> there's nothing Emacs can do except obey.

There is really only one main user command that narrows, and that's 
narrow-to-region, bound to 'C-x n n'.

But none of that describes how other Emacs features should react to it.

Simple example: if the beginning of the narrowed region falls inside a 
(let's say multine) string, should the visible remainder of that string 
continue to be highlighted as a string? Or should the buffer contents 
after the string's closer now be highlighted as being inside a string?





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-29 11:17                                                                 ` Eli Zaretskii
  2023-03-30 15:50                                                                   ` Gregory Heytings
@ 2023-03-31  1:17                                                                   ` Dmitry Gutov
  1 sibling, 0 replies; 83+ messages in thread
From: Dmitry Gutov @ 2023-03-31  1:17 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: wkirschbaum, casouri, 62333

On 29/03/2023 14:17, Eli Zaretskii wrote:
>> Date: Wed, 29 Mar 2023 00:19:41 +0300
>> Cc: wkirschbaum@gmail.com, casouri@gmail.com, 62333@debbugs.gnu.org
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>>>> Like narrowing, but just for parsers? But parsers obey narrowing
>>>> already. Sounds a bit like conceptual duplication. How does this solve
>>>> blink-matching-paren issue anyway?
>>>
>>> We could widen without fearing that a parser will "invade" regions of
>>> buffer text that we don't want it to wander into.
>>
>> So any code that wants to restrict a "parser" based buffer, would need
>> to use a different primitive to narrow?
> 
> No, the idea is to create the parser with these restrictions to begin
> with.
> 
>> And vice versa, any code that uses a parser, will need to (widen)
>> first, to ensure that the parser is not affected by any restriction
>> set up by any code previously?
> 
> No, if the parser is restricted, there should be no need to "widen"
> it, at least not in most cases I could think about where a parser
> should be restricted to a part of the buffer.
> 
>> Anyway, I don't see why we should institute a special category for these
>> buffers.
> 
> Because IMO it's cleaner and simpler than using narrowing, and doesn't
> suffer from the problems we see in narrowing.

You are not describing anything that one couldn't do with a major mode 
before tree-sitter parsers (choose a region, apply font-lock keywords, 
etc), so that should give you an idea that the suggestion is probably 
not novel. And doesn't solve the existing problems in new ways.

Why would we apply that approach to "proper" parsers only?

>>>>>> The "grand unified theory of mixed major modes" has been attempted a few
>>>>>> times in the past, and never reached anything practical.
>>>>>
>>>>> But here we have a unique opportunity to maybe find a solution, at
>>>>> least for stuff based on tree-sitter and similar libraries.  That
>>>>> maybe not "grand", but certainly "respectable".
>>>>
>>>> tree-sitter has its own support for mixed languages.
>>>
>>> So your argument about mmm framework was a red herring, cause that
>>> problem doesn't exist wrt tree-sitter parsers?
>>
>> Nope, see the first paragraph of my previous reply (the "no relevance" one).
> 
> Which first paragraph is that?  In what "previous reply" should I look
> and where?  (And why couldn't you simply copy that here, to make
> following the discussion easier?)

The reply you answered with "I don't see the relevance". There is really 
no good way to continue the explanation after that. Copying it into 
multiple successive emails doesn't sound logical either.

>>>>>> My stance here is we shouldn't break it before we create a new one.
>>>>>
>>>>> No one broke anything.  We are just discussing ideas.  Please don't
>>>>> exaggerate.
>>>>
>>>> I never said anybody has broken anything already.
>>>
>>> You did say that my ideas break something, see above.  Ideas cannot
>>> break any code, so this argument shouldn't be brought up if you want a
>>> calm and rational discussion.
>>
>> Ideas cannot, but implementing them can. "This or that change will break
>> an existing convention" is a rational argument.
>>
>> Shall we stop quibbling over words?
> 
> I'm "quibbling" over words because your particular selection of words
> makes serious discussion nigh impossible.  Not the first time, either.
> As soon as there's some disagreement, sooner or later those words
> (like "quibbling") come out.  Whether it's because of some attitude or
> not, I don't know, but you may wish to reflect on that and perhaps try
> to express your disagreements using different words.

"Breaking a convention" is an industry term.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-30 16:04                                                                     ` Eli Zaretskii
  2023-03-30 16:28                                                                       ` Gregory Heytings
@ 2023-03-31  1:25                                                                       ` Dmitry Gutov
  2023-03-31  6:22                                                                         ` Eli Zaretskii
  1 sibling, 1 reply; 83+ messages in thread
From: Dmitry Gutov @ 2023-03-31  1:25 UTC (permalink / raw)
  To: Eli Zaretskii, Gregory Heytings; +Cc: wkirschbaum, casouri, 62333

On 30/03/2023 19:04, Eli Zaretskii wrote:
>> Date: Thu, 30 Mar 2023 15:50:31 +0000
>> From: Gregory Heytings <gregory@heytings.org>
>> cc: Dmitry Gutov <dgutov@yandex.ru>, wkirschbaum@gmail.com, casouri@gmail.com,
>>      62333@debbugs.gnu.org
>>
>>> No, the idea is to create the parser with these restrictions to begin
>>> with.
>>
>> Could you perhaps explain, with some fictitious code, what kind of
>> solution you imagine?  I'm not sure I understand (euphemism for: I'm sure
>> I don't understand) the problem statement.
> 
> Something like
> 
>    (treesit-make-parser LANGUAGE BUFFER nil START END)

What kind of code would be calling this?

What happens when the user types a character before START? What happens 
when they delete a character at START or END? Or a whole line?

> and
> 
>    (treesit-parser-set-included-ranges RANGES...)
> 
> (the latter already exists).

Indeed, a way to do this using tree-sitter indeed already exists, 
offloading the parsing of the regions to tree-sitter. OTOH, this way we 
only get tree-sitter features sorted into regions (parse tree, 
indentation, highlighting).

Whatever other Lisp-level features we wanted to behave differently 
between regions, we'd have do implement them the old way.

>> In what way would the restrictions you have in mind be different from
>> those of a regular narrowing?
> 
> User-defined narrowing will never contradict parser restrictions.

IOW, user-defined narrowing should be only for visual purposes, as 
described in another email. And perhaps to restrict movement (which is 
related: you can't move to where you can't see).





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-31  1:10                                                                     ` Dmitry Gutov
@ 2023-03-31  1:27                                                                       ` Dmitry Gutov
  2023-03-31  6:19                                                                       ` Eli Zaretskii
  1 sibling, 0 replies; 83+ messages in thread
From: Dmitry Gutov @ 2023-03-31  1:27 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: wkirschbaum, gregory, casouri, 62333

Sorry

On 31/03/2023 04:10, Dmitry Gutov wrote:
> Simple example: if the beginning of the narrowed region falls inside a 
> (let's say multine)
              ^
               multiline





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-30 22:08                                                                                 ` Gregory Heytings
@ 2023-03-31  6:15                                                                                   ` Eli Zaretskii
  0 siblings, 0 replies; 83+ messages in thread
From: Eli Zaretskii @ 2023-03-31  6:15 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: wkirschbaum, casouri, 62333, dgutov

> Date: Thu, 30 Mar 2023 22:08:10 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: wkirschbaum@gmail.com, casouri@gmail.com, 62333@debbugs.gnu.org, 
>     dgutov@yandex.ru
> 
> Should there exist a mechanism to give the parsers access to the whole 
> buffer (IOW, to let them ignore both the bounds passed to 
> 'treesit-make-parser' and the restriction set by the user)?

We already have that, I think: treesit-parser-set-included-ranges.
Although I wonder when and why would this be a good idea, given that a
parser should have full access to the entire text that is written in
the corresponding language.

> And of course, the bounds given to 'treesit-make-parser' should become 
> markers

Of course.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-31  1:10                                                                     ` Dmitry Gutov
  2023-03-31  1:27                                                                       ` Dmitry Gutov
@ 2023-03-31  6:19                                                                       ` Eli Zaretskii
  2023-03-31  7:46                                                                         ` Eli Zaretskii
  2023-03-31 12:46                                                                         ` Dmitry Gutov
  1 sibling, 2 replies; 83+ messages in thread
From: Eli Zaretskii @ 2023-03-31  6:19 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: wkirschbaum, gregory, casouri, 62333

> Date: Fri, 31 Mar 2023 04:10:54 +0300
> Cc: wkirschbaum@gmail.com, gregory@heytings.org, casouri@gmail.com,
>  62333@debbugs.gnu.org
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> On 29/03/2023 14:08, Eli Zaretskii wrote:
> >> Date: Wed, 29 Mar 2023 00:08:53 +0300
> >> Cc: wkirschbaum@gmail.com, gregory@heytings.org, casouri@gmail.com,
> >>   62333@debbugs.gnu.org
> >> From: Dmitry Gutov <dgutov@yandex.ru>
> >>
> >>>> Is that because we don't think the user level narrowing is done purely
> >>>> for visual effect?
> >>>
> >>> Indeed, it isn't always for visual effect.
> >>
> >> When isn't it? Is there a way to determine that from code?
> > 
> > I'm not sure I understand the question, but if I do, then narrowing to
> > prevent search functions
> 
> If we're talking about isearch, then that seems like a natural 
> consequence of visual effect (hiding the remainder of the buffer): even 
> if isearch highlighted those other hits, they would not be visible.

If you consider narrowing in this example to be "for visual effect",
then everything in Emacs is "for visual effect".  After all, Emacs is
a visual editor, showing the results of editing to the user at all
times.  But this POV makes this part of the discussion useless.

> > I was talking about user commands that narrow, so I'm not sure I
> > understand how documentation could help.  When the user types "C-x n n",
> > there's nothing Emacs can do except obey.
> 
> There is really only one main user command that narrows, and that's 
> narrow-to-region, bound to 'C-x n n'.

Any user command can narrow as part of its job.

> Simple example: if the beginning of the narrowed region falls inside a 
> (let's say multine) string, should the visible remainder of that string 
> continue to be highlighted as a string?

No.

> Or should the buffer contents after the string's closer now be
> highlighted as being inside a string?

Yes.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-31  1:25                                                                       ` Dmitry Gutov
@ 2023-03-31  6:22                                                                         ` Eli Zaretskii
  0 siblings, 0 replies; 83+ messages in thread
From: Eli Zaretskii @ 2023-03-31  6:22 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: wkirschbaum, gregory, casouri, 62333

> Date: Fri, 31 Mar 2023 04:25:41 +0300
> Cc: wkirschbaum@gmail.com, casouri@gmail.com, 62333@debbugs.gnu.org
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> On 30/03/2023 19:04, Eli Zaretskii wrote:
> >> Date: Thu, 30 Mar 2023 15:50:31 +0000
> >> From: Gregory Heytings <gregory@heytings.org>
> >> cc: Dmitry Gutov <dgutov@yandex.ru>, wkirschbaum@gmail.com, casouri@gmail.com,
> >>      62333@debbugs.gnu.org
> >>
> >>> No, the idea is to create the parser with these restrictions to begin
> >>> with.
> >>
> >> Could you perhaps explain, with some fictitious code, what kind of
> >> solution you imagine?  I'm not sure I understand (euphemism for: I'm sure
> >> I don't understand) the problem statement.
> > 
> > Something like
> > 
> >    (treesit-make-parser LANGUAGE BUFFER nil START END)
> 
> What kind of code would be calling this?
> 
> What happens when the user types a character before START? What happens 
> when they delete a character at START or END? Or a whole line?
> 
> > and
> > 
> >    (treesit-parser-set-included-ranges RANGES...)
> > 
> > (the latter already exists).
> 
> Indeed, a way to do this using tree-sitter indeed already exists, 
> offloading the parsing of the regions to tree-sitter. OTOH, this way we 
> only get tree-sitter features sorted into regions (parse tree, 
> indentation, highlighting).
> 
> Whatever other Lisp-level features we wanted to behave differently 
> between regions, we'd have do implement them the old way.
> 
> >> In what way would the restrictions you have in mind be different from
> >> those of a regular narrowing?
> > 
> > User-defined narrowing will never contradict parser restrictions.
> 
> IOW, user-defined narrowing should be only for visual purposes, as 
> described in another email. And perhaps to restrict movement (which is 
> related: you can't move to where you can't see).

I'm sorry, I cannot afford a discussion where you decided up front you
disagree, and just keep looking for arguments in favor of your
disagreement.  Such discussions are a waste of our time, and I have
very little of it to waste.  So I won't be responding to any further
messages here, unless they ask informative questions where I think I
can contribute something useful.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-31  6:19                                                                       ` Eli Zaretskii
@ 2023-03-31  7:46                                                                         ` Eli Zaretskii
  2023-03-31 12:38                                                                           ` Dmitry Gutov
  2023-03-31 12:46                                                                         ` Dmitry Gutov
  1 sibling, 1 reply; 83+ messages in thread
From: Eli Zaretskii @ 2023-03-31  7:46 UTC (permalink / raw)
  To: dgutov; +Cc: wkirschbaum, gregory, casouri, 62333

> Cc: wkirschbaum@gmail.com, gregory@heytings.org, casouri@gmail.com,
>  62333@debbugs.gnu.org
> Date: Fri, 31 Mar 2023 09:19:35 +0300
> From: Eli Zaretskii <eliz@gnu.org>
> 
> > Simple example: if the beginning of the narrowed region falls inside a 
> > (let's say multine) string, should the visible remainder of that string 
> > continue to be highlighted as a string?
> 
> No.
> 
> > Or should the buffer contents after the string's closer now be
> > highlighted as being inside a string?
> 
> Yes.

To clarify: these my answers are in the context of the current
handling of narrowing, not in the context of restricting the parser
(which you seem to reject as a useful idea anyway).





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-31  7:46                                                                         ` Eli Zaretskii
@ 2023-03-31 12:38                                                                           ` Dmitry Gutov
  2023-03-31 13:03                                                                             ` Eli Zaretskii
  0 siblings, 1 reply; 83+ messages in thread
From: Dmitry Gutov @ 2023-03-31 12:38 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: wkirschbaum, gregory, casouri, 62333

On 31/03/2023 10:46, Eli Zaretskii wrote:
>> Cc:wkirschbaum@gmail.com,gregory@heytings.org,casouri@gmail.com,
>>   62333@debbugs.gnu.org
>> Date: Fri, 31 Mar 2023 09:19:35 +0300
>> From: Eli Zaretskii<eliz@gnu.org>
>>
>>> Simple example: if the beginning of the narrowed region falls inside a
>>> (let's say multine) string, should the visible remainder of that string
>>> continue to be highlighted as a string?
>> No.
>>
>>> Or should the buffer contents after the string's closer now be
>>> highlighted as being inside a string?
>> Yes.
> To clarify: these my answers are in the context of the current
> handling of narrowing, not in the context of restricting the parser
> (which you seem to reject as a useful idea anyway).

Interesting.

You do realize that it doesn't work this way currently, right?





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-31  6:19                                                                       ` Eli Zaretskii
  2023-03-31  7:46                                                                         ` Eli Zaretskii
@ 2023-03-31 12:46                                                                         ` Dmitry Gutov
  2023-03-31 13:06                                                                           ` Eli Zaretskii
  2023-03-31 18:43                                                                           ` Yuan Fu
  1 sibling, 2 replies; 83+ messages in thread
From: Dmitry Gutov @ 2023-03-31 12:46 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: wkirschbaum, gregory, casouri, 62333

On 31/03/2023 09:19, Eli Zaretskii wrote:
>> If we're talking about isearch, then that seems like a natural
>> consequence of visual effect (hiding the remainder of the buffer): even
>> if isearch highlighted those other hits, they would not be visible.
> If you consider narrowing in this example to be "for visual effect",
> then everything in Emacs is "for visual effect".  After all, Emacs is
> a visual editor, showing the results of editing to the user at all
> times.  But this POV makes this part of the discussion useless.

Okay, let's rephrase that: instead of "visual effect", we can say it's 
for "visually hiding" parts of buffers. But not for changing their 
behaviors otherwise (e.g. changing syntax highlighting, etc).

In your other answer regarding the inside of a string, you seemed to 
have a different idea, though. Like, user narrowing would be able to 
affect all that stuff too.

>>> I was talking about user commands that narrow, so I'm not sure I
>>> understand how documentation could help.  When the user types "C-x n n",
>>> there's nothing Emacs can do except obey.
>> There is really only one main user command that narrows, and that's
>> narrow-to-region, bound to 'C-x n n'.
> Any user command can narrow as part of its job.

This subthread goes back to my complaint that commands don't know how to 
*interpret* the current narrowing, thus which effects it should have.

To repeat:

   Either narrowing should be used to change lexical/grammatical/etc
   context, or it should not. Do we have any documentation that says one
   or the other way? That should affect how Lisp code deals with
   narrowing -- which interactive functions should widen, and so on.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-31 12:38                                                                           ` Dmitry Gutov
@ 2023-03-31 13:03                                                                             ` Eli Zaretskii
  2023-03-31 13:26                                                                               ` Dmitry Gutov
  0 siblings, 1 reply; 83+ messages in thread
From: Eli Zaretskii @ 2023-03-31 13:03 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: wkirschbaum, gregory, casouri, 62333

> Date: Fri, 31 Mar 2023 15:38:33 +0300
> Cc: wkirschbaum@gmail.com, gregory@heytings.org, casouri@gmail.com,
>  62333@debbugs.gnu.org
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> On 31/03/2023 10:46, Eli Zaretskii wrote:
> >> Cc:wkirschbaum@gmail.com,gregory@heytings.org,casouri@gmail.com,
> >>   62333@debbugs.gnu.org
> >> Date: Fri, 31 Mar 2023 09:19:35 +0300
> >> From: Eli Zaretskii<eliz@gnu.org>
> >>
> >>> Simple example: if the beginning of the narrowed region falls inside a
> >>> (let's say multine) string, should the visible remainder of that string
> >>> continue to be highlighted as a string?
> >> No.
> >>
> >>> Or should the buffer contents after the string's closer now be
> >>> highlighted as being inside a string?
> >> Yes.
> > To clarify: these my answers are in the context of the current
> > handling of narrowing, not in the context of restricting the parser
> > (which you seem to reject as a useful idea anyway).
> 
> Interesting.
> 
> You do realize that it doesn't work this way currently, right?

Yes.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-31 12:46                                                                         ` Dmitry Gutov
@ 2023-03-31 13:06                                                                           ` Eli Zaretskii
  2023-03-31 18:43                                                                           ` Yuan Fu
  1 sibling, 0 replies; 83+ messages in thread
From: Eli Zaretskii @ 2023-03-31 13:06 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: wkirschbaum, gregory, casouri, 62333

> Date: Fri, 31 Mar 2023 15:46:58 +0300
> Cc: wkirschbaum@gmail.com, gregory@heytings.org, casouri@gmail.com,
>  62333@debbugs.gnu.org
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> On 31/03/2023 09:19, Eli Zaretskii wrote:
> >> If we're talking about isearch, then that seems like a natural
> >> consequence of visual effect (hiding the remainder of the buffer): even
> >> if isearch highlighted those other hits, they would not be visible.
> > If you consider narrowing in this example to be "for visual effect",
> > then everything in Emacs is "for visual effect".  After all, Emacs is
> > a visual editor, showing the results of editing to the user at all
> > times.  But this POV makes this part of the discussion useless.
> 
> Okay, let's rephrase that: instead of "visual effect", we can say it's 
> for "visually hiding" parts of buffers. But not for changing their 
> behaviors otherwise (e.g. changing syntax highlighting, etc).

I disagree that narrowing for, say, searching should be interpreted
like that.

> >>> I was talking about user commands that narrow, so I'm not sure I
> >>> understand how documentation could help.  When the user types "C-x n n",
> >>> there's nothing Emacs can do except obey.
> >> There is really only one main user command that narrows, and that's
> >> narrow-to-region, bound to 'C-x n n'.
> > Any user command can narrow as part of its job.
> 
> This subthread goes back to my complaint that commands don't know how to 
> *interpret* the current narrowing, thus which effects it should have.

We agree about that, at least.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-31 13:03                                                                             ` Eli Zaretskii
@ 2023-03-31 13:26                                                                               ` Dmitry Gutov
  0 siblings, 0 replies; 83+ messages in thread
From: Dmitry Gutov @ 2023-03-31 13:26 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: wkirschbaum, gregory, casouri, 62333

On 31/03/2023 16:03, Eli Zaretskii wrote:
>> Date: Fri, 31 Mar 2023 15:38:33 +0300
>> Cc: wkirschbaum@gmail.com, gregory@heytings.org, casouri@gmail.com,
>>   62333@debbugs.gnu.org
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>> On 31/03/2023 10:46, Eli Zaretskii wrote:
>>>> Cc:wkirschbaum@gmail.com,gregory@heytings.org,casouri@gmail.com,
>>>>    62333@debbugs.gnu.org
>>>> Date: Fri, 31 Mar 2023 09:19:35 +0300
>>>> From: Eli Zaretskii<eliz@gnu.org>
>>>>
>>>>> Simple example: if the beginning of the narrowed region falls inside a
>>>>> (let's say multine) string, should the visible remainder of that string
>>>>> continue to be highlighted as a string?
>>>> No.
>>>>
>>>>> Or should the buffer contents after the string's closer now be
>>>>> highlighted as being inside a string?
>>>> Yes.
>>> To clarify: these my answers are in the context of the current
>>> handling of narrowing, not in the context of restricting the parser
>>> (which you seem to reject as a useful idea anyway).
>>
>> Interesting.
>>
>> You do realize that it doesn't work this way currently, right?
> 
> Yes.

So... do you think we should flip font-lock-dont-widen's default to t? 
Then the behavior can be like you answered, and we could alter other 
features (e.g. indentation) too.

Note that that variable goes back to 2002, though.

And regarding indentation: with that kind of the change, narrowing 
region to a fragment of a function definition (cutting out its 
beginning) will usually make indentation shallower, when code outside of 
narrowing is considered absent.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-31 12:46                                                                         ` Dmitry Gutov
  2023-03-31 13:06                                                                           ` Eli Zaretskii
@ 2023-03-31 18:43                                                                           ` Yuan Fu
  2023-04-01  1:53                                                                             ` Dmitry Gutov
  2023-04-01  5:47                                                                             ` Eli Zaretskii
  1 sibling, 2 replies; 83+ messages in thread
From: Yuan Fu @ 2023-03-31 18:43 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: Wilhelm Kirschbaum, Eli Zaretskii, Gregory Heytings, 62333



> On Mar 31, 2023, at 5:46 AM, Dmitry Gutov <dgutov@yandex.ru> wrote:
> 
> On 31/03/2023 09:19, Eli Zaretskii wrote:
>>> If we're talking about isearch, then that seems like a natural
>>> consequence of visual effect (hiding the remainder of the buffer): even
>>> if isearch highlighted those other hits, they would not be visible.
>> If you consider narrowing in this example to be "for visual effect",
>> then everything in Emacs is "for visual effect".  After all, Emacs is
>> a visual editor, showing the results of editing to the user at all
>> times.  But this POV makes this part of the discussion useless.
> 
> Okay, let's rephrase that: instead of "visual effect", we can say it's for "visually hiding" parts of buffers. But not for changing their behaviors otherwise (e.g. changing syntax highlighting, etc).
> 
> In your other answer regarding the inside of a string, you seemed to have a different idea, though. Like, user narrowing would be able to affect all that stuff too.
> 
>>>> I was talking about user commands that narrow, so I'm not sure I
>>>> understand how documentation could help.  When the user types "C-x n n",
>>>> there's nothing Emacs can do except obey.
>>> There is really only one main user command that narrows, and that's
>>> narrow-to-region, bound to 'C-x n n'.
>> Any user command can narrow as part of its job.
> 
> This subthread goes back to my complaint that commands don't know how to *interpret* the current narrowing, thus which effects it should have.
> 
> To repeat:
> 
>  Either narrowing should be used to change lexical/grammatical/etc
>  context, or it should not. Do we have any documentation that says one
>  or the other way? That should affect how Lisp code deals with
>  narrowing -- which interactive functions should widen, and so on.

To maybe rephrase this in another way:

I think the distinction lies between “I want to narrow to this defun and work on it without distraction” vs “treat this region as an isolated buffer”. The former used by users, the latter used by lisp programs like Info and mmm-mode. The former still considers the visible region part of the whole buffer, just temporarily narrowed for convenience, the latter wants to make everything thinks the visible region _is_ the whole buffer.

 It might be good for tree-sitter or other parsers to be exempt from (but still acknowledges) the first kind of narrowing. This way the parser can avoid unnecessary re-parse, and always provide the optimal information. We just need to modify tree-sitter functions to check for this narrowing and don’t return anything beyond the boundaries. It’s probably going to be a lot of hair, but should be doable, I think?

This way, most lisp programs still obeys the narrowing, but specific things like tree-sitter can choose to secretly look around while still appear to obey the narrowing, when peeking around wouldn’t hurt. And when the narrowing is really indented, tree-sitter (or other parser) knows not to look around.


Yuan




^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-31 18:43                                                                           ` Yuan Fu
@ 2023-04-01  1:53                                                                             ` Dmitry Gutov
  2023-04-01  5:47                                                                             ` Eli Zaretskii
  1 sibling, 0 replies; 83+ messages in thread
From: Dmitry Gutov @ 2023-04-01  1:53 UTC (permalink / raw)
  To: Yuan Fu; +Cc: Wilhelm Kirschbaum, Eli Zaretskii, Gregory Heytings, 62333

On 31/03/2023 21:43, Yuan Fu wrote:
> I think the distinction lies between “I want to narrow to this defun and work on it without distraction” vs “treat this region as an isolated buffer”. The former used by users, the latter used by lisp programs like Info and mmm-mode. The former still considers the visible region part of the whole buffer, just temporarily narrowed for convenience, the latter wants to make everything thinks the visible region_is_  the whole buffer.

This distinction lies in how user-level features are implemented, 
though. E.g. for font-lock we have the variable font-lock-dont-widen 
which determines whether it will widen before getting the syntax 
information (calling syntax-ppss and so on) and acting on it.

>   It might be good for tree-sitter or other parsers to be exempt from (but still acknowledges) the first kind of narrowing. This way the parser can avoid unnecessary re-parse, and always provide the optimal information. We just need to modify tree-sitter functions to check for this narrowing and don’t return anything beyond the boundaries. It’s probably going to be a lot of hair, but should be doable, I think?
> 
> This way, most lisp programs still obeys the narrowing, but specific things like tree-sitter can choose to secretly look around while still appear to obey the narrowing, when peeking around wouldn’t hurt. And when the narrowing is really indented, tree-sitter (or other parser) knows not to look around.

I'm not sure this is different from the "regular" major modes which use 
syntax-ppss as their parser. They also call 'widen' in a lot of cases to 
"peek around".

So that was my point: the external requirements for tree-sitter modes' 
behavior don't seem that different from the "classic" modes.

Narrowing in blink-matching-paren, BTW, also should have a similar 
cache-busting effect on syntax-ppss, with the main difference that it 
keeps two caches around, so it might end up reparsing only once (the 
narrowed parse state), hence the performance impact, over the smaller 
range of text, would be limited.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-03-31 18:43                                                                           ` Yuan Fu
  2023-04-01  1:53                                                                             ` Dmitry Gutov
@ 2023-04-01  5:47                                                                             ` Eli Zaretskii
  2023-04-01 16:12                                                                               ` Dmitry Gutov
  2023-04-02 22:08                                                                               ` Yuan Fu
  1 sibling, 2 replies; 83+ messages in thread
From: Eli Zaretskii @ 2023-04-01  5:47 UTC (permalink / raw)
  To: Yuan Fu; +Cc: wkirschbaum, gregory, 62333, dgutov

> From: Yuan Fu <casouri@gmail.com>
> Date: Fri, 31 Mar 2023 11:43:49 -0700
> Cc: Eli Zaretskii <eliz@gnu.org>,
>  Wilhelm Kirschbaum <wkirschbaum@gmail.com>,
>  Gregory Heytings <gregory@heytings.org>,
>  62333@debbugs.gnu.org
> 
> I think the distinction lies between “I want to narrow to this defun and work on it without distraction” vs “treat this region as an isolated buffer”. The former used by users, the latter used by lisp programs like Info and mmm-mode. The former still considers the visible region part of the whole buffer, just temporarily narrowed for convenience, the latter wants to make everything thinks the visible region _is_ the whole buffer.

Users can do both, for whatever reasons.

>  It might be good for tree-sitter or other parsers to be exempt from (but still acknowledges) the first kind of narrowing. This way the parser can avoid unnecessary re-parse, and always provide the optimal information. We just need to modify tree-sitter functions to check for this narrowing and don’t return anything beyond the boundaries. It’s probably going to be a lot of hair, but should be doable, I think?

I don't see why it would be a lot of hair.  If a parser always has the
regions on which it is supposed to work, then a Lisp program using a
parser can simply widen the buffer when it needs to be sure a
narrowing doesn't get in the way.





^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-04-01  5:47                                                                             ` Eli Zaretskii
@ 2023-04-01 16:12                                                                               ` Dmitry Gutov
  2023-04-02 22:08                                                                               ` Yuan Fu
  1 sibling, 0 replies; 83+ messages in thread
From: Dmitry Gutov @ 2023-04-01 16:12 UTC (permalink / raw)
  To: Eli Zaretskii, Yuan Fu; +Cc: wkirschbaum, gregory, 62333

On 01/04/2023 08:47, Eli Zaretskii wrote:
>> From: Yuan Fu<casouri@gmail.com>
>> Date: Fri, 31 Mar 2023 11:43:49 -0700
>> Cc: Eli Zaretskii<eliz@gnu.org>,
>>   Wilhelm Kirschbaum<wkirschbaum@gmail.com>,
>>   Gregory Heytings<gregory@heytings.org>,
>>   62333@debbugs.gnu.org
>>
>> I think the distinction lies between “I want to narrow to this defun and work on it without distraction” vs “treat this region as an isolated buffer”. The former used by users, the latter used by lisp programs like Info and mmm-mode. The former still considers the visible region part of the whole buffer, just temporarily narrowed for convenience, the latter wants to make everything thinks the visible region_is_  the whole buffer.
> Users can do both, for whatever reasons.

Users can try to do both, but we interpret interactive narrowing (C-x n 
n) in a specific way, and currently, it's the former.






^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-04-01  5:47                                                                             ` Eli Zaretskii
  2023-04-01 16:12                                                                               ` Dmitry Gutov
@ 2023-04-02 22:08                                                                               ` Yuan Fu
  2023-04-03 12:31                                                                                 ` Eli Zaretskii
  1 sibling, 1 reply; 83+ messages in thread
From: Yuan Fu @ 2023-04-02 22:08 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Wilhelm Kirschbaum, Gregory Heytings, 62333, Dmitry Gutov



> On Mar 31, 2023, at 10:47 PM, Eli Zaretskii <eliz@gnu.org> wrote:
> 
>> From: Yuan Fu <casouri@gmail.com>
>> Date: Fri, 31 Mar 2023 11:43:49 -0700
>> Cc: Eli Zaretskii <eliz@gnu.org>,
>> Wilhelm Kirschbaum <wkirschbaum@gmail.com>,
>> Gregory Heytings <gregory@heytings.org>,
>> 62333@debbugs.gnu.org
>> 
>> I think the distinction lies between “I want to narrow to this defun and work on it without distraction” vs “treat this region as an isolated buffer”. The former used by users, the latter used by lisp programs like Info and mmm-mode. The former still considers the visible region part of the whole buffer, just temporarily narrowed for convenience, the latter wants to make everything thinks the visible region _is_ the whole buffer.
> 
> Users can do both, for whatever reasons.

Yeah, but it might be beneficial for lisp programs to be able to distinguish between the two types of narrowing, and act differently.

>> It might be good for tree-sitter or other parsers to be exempt from (but still acknowledges) the first kind of narrowing. This way the parser can avoid unnecessary re-parse, and always provide the optimal information. We just need to modify tree-sitter functions to check for this narrowing and don’t return anything beyond the boundaries. It’s probably going to be a lot of hair, but should be doable, I think?
> 
> I don't see why it would be a lot of hair.  If a parser always has the
> regions on which it is supposed to work, then a Lisp program using a
> parser can simply widen the buffer when it needs to be sure a
> narrowing doesn't get in the way.

Yes, the current situation is straightforward. I’m just saying that supporting what I described would require some work (let tree-sitter be able to peek outside the visible region but still pretend to respect narrowing).

Yuan




^ permalink raw reply	[flat|nested] 83+ messages in thread

* bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes
  2023-04-02 22:08                                                                               ` Yuan Fu
@ 2023-04-03 12:31                                                                                 ` Eli Zaretskii
  0 siblings, 0 replies; 83+ messages in thread
From: Eli Zaretskii @ 2023-04-03 12:31 UTC (permalink / raw)
  To: Yuan Fu; +Cc: wkirschbaum, gregory, 62333, dgutov

> From: Yuan Fu <casouri@gmail.com>
> Date: Sun, 2 Apr 2023 15:08:01 -0700
> Cc: Dmitry Gutov <dgutov@yandex.ru>,
>  Wilhelm Kirschbaum <wkirschbaum@gmail.com>,
>  Gregory Heytings <gregory@heytings.org>,
>  62333@debbugs.gnu.org
> 
> >> I think the distinction lies between “I want to narrow to this defun and work on it without distraction” vs “treat this region as an isolated buffer”. The former used by users, the latter used by lisp programs like Info and mmm-mode. The former still considers the visible region part of the whole buffer, just temporarily narrowed for convenience, the latter wants to make everything thinks the visible region _is_ the whole buffer.
> > 
> > Users can do both, for whatever reasons.
> 
> Yeah, but it might be beneficial for lisp programs to be able to distinguish between the two types of narrowing, and act differently.

I think we've found that to be impossible in practice.

> >> It might be good for tree-sitter or other parsers to be exempt from (but still acknowledges) the first kind of narrowing. This way the parser can avoid unnecessary re-parse, and always provide the optimal information. We just need to modify tree-sitter functions to check for this narrowing and don’t return anything beyond the boundaries. It’s probably going to be a lot of hair, but should be doable, I think?
> > 
> > I don't see why it would be a lot of hair.  If a parser always has the
> > regions on which it is supposed to work, then a Lisp program using a
> > parser can simply widen the buffer when it needs to be sure a
> > narrowing doesn't get in the way.
> 
> Yes, the current situation is straightforward. I’m just saying that supporting what I described would require some work (let tree-sitter be able to peek outside the visible region but still pretend to respect narrowing).

I don't understand where you see difficulties with that.  We have
already several features that widen the buffer momentarily, for
whatever reasons.  As long as the narrowing is restored after doing
whatever it needed to widen for, there's no reason to "pretend"
anything.





^ permalink raw reply	[flat|nested] 83+ messages in thread

end of thread, other threads:[~2023-04-03 12:31 UTC | newest]

Thread overview: 83+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-03-21 14:00 bug#62333: 30.0.50; Issue with tree-sitter syntax tree during certain changes Wilhelm Kirschbaum
2023-03-23  1:03 ` Dmitry Gutov
2023-03-23  3:03   ` Yuan Fu
2023-03-23  4:20     ` Dmitry Gutov
2023-03-23  7:13       ` Eli Zaretskii
2023-03-23 21:18         ` Yuan Fu
2023-03-23 21:30           ` Dmitry Gutov
2023-03-23 22:06           ` Dmitry Gutov
2023-03-23 23:59             ` Yuan Fu
2023-03-24  6:05               ` Eli Zaretskii
2023-03-24  7:34                 ` Yuan Fu
2023-03-25  1:51                   ` Dmitry Gutov
2023-03-25 12:34                     ` Eli Zaretskii
2023-03-25 13:00                       ` Dmitry Gutov
2023-03-25 13:14                         ` Eli Zaretskii
2023-03-25 13:44                           ` Dmitry Gutov
2023-03-25 14:09                             ` Eli Zaretskii
2023-03-25 14:18                               ` Dmitry Gutov
2023-03-25 14:41                                 ` Eli Zaretskii
2023-03-25 15:25                                   ` Dmitry Gutov
2023-03-25 15:57                                     ` Eli Zaretskii
2023-03-25 16:03                                       ` Dmitry Gutov
2023-03-25 16:24                                         ` Eli Zaretskii
2023-03-25 17:05                                           ` Dmitry Gutov
2023-03-25 17:40                                             ` Eli Zaretskii
2023-03-25 19:31                                               ` Yuan Fu
2023-03-25 23:29                                                 ` Dmitry Gutov
2023-03-26 22:52                                                   ` Yuan Fu
2023-03-27  1:29                                                     ` Dmitry Gutov
2023-03-26  4:28                                                 ` Eli Zaretskii
2023-03-26 22:57                                                   ` Yuan Fu
2023-03-27 13:32                                                     ` Eli Zaretskii
2023-03-27 18:43                                                       ` Yuan Fu
2023-03-25 22:57                                               ` Dmitry Gutov
2023-03-26  5:04                                                 ` Eli Zaretskii
2023-03-26  9:25                                                   ` Dmitry Gutov
2023-03-26 10:01                                                     ` Eli Zaretskii
2023-03-26 22:00                                                       ` Dmitry Gutov
2023-03-27  8:24                                                         ` Gregory Heytings
2023-03-27 13:39                                                           ` Eli Zaretskii
2023-03-27 20:05                                                             ` Gregory Heytings
2023-03-28 11:30                                                               ` Eli Zaretskii
2023-03-28 11:39                                                                 ` Gregory Heytings
2023-03-28 12:11                                                                   ` Eli Zaretskii
2023-03-28 12:25                                                                     ` Gregory Heytings
2023-03-28 12:36                                                                       ` Eli Zaretskii
2023-03-27 23:06                                                             ` Dmitry Gutov
2023-03-28 11:32                                                               ` Eli Zaretskii
2023-03-28 21:08                                                                 ` Dmitry Gutov
2023-03-29 11:08                                                                   ` Eli Zaretskii
2023-03-31  1:10                                                                     ` Dmitry Gutov
2023-03-31  1:27                                                                       ` Dmitry Gutov
2023-03-31  6:19                                                                       ` Eli Zaretskii
2023-03-31  7:46                                                                         ` Eli Zaretskii
2023-03-31 12:38                                                                           ` Dmitry Gutov
2023-03-31 13:03                                                                             ` Eli Zaretskii
2023-03-31 13:26                                                                               ` Dmitry Gutov
2023-03-31 12:46                                                                         ` Dmitry Gutov
2023-03-31 13:06                                                                           ` Eli Zaretskii
2023-03-31 18:43                                                                           ` Yuan Fu
2023-04-01  1:53                                                                             ` Dmitry Gutov
2023-04-01  5:47                                                                             ` Eli Zaretskii
2023-04-01 16:12                                                                               ` Dmitry Gutov
2023-04-02 22:08                                                                               ` Yuan Fu
2023-04-03 12:31                                                                                 ` Eli Zaretskii
2023-03-27 23:20                                                           ` Dmitry Gutov
2023-03-27 13:29                                                         ` Eli Zaretskii
2023-03-27 23:33                                                           ` Dmitry Gutov
2023-03-28 11:38                                                             ` Eli Zaretskii
2023-03-28 21:19                                                               ` Dmitry Gutov
2023-03-29 11:17                                                                 ` Eli Zaretskii
2023-03-30 15:50                                                                   ` Gregory Heytings
2023-03-30 16:04                                                                     ` Eli Zaretskii
2023-03-30 16:28                                                                       ` Gregory Heytings
2023-03-30 16:40                                                                         ` Eli Zaretskii
2023-03-30 17:27                                                                           ` Gregory Heytings
2023-03-30 17:47                                                                             ` Eli Zaretskii
2023-03-30 20:14                                                                               ` Gregory Heytings
2023-03-30 22:08                                                                                 ` Gregory Heytings
2023-03-31  6:15                                                                                   ` Eli Zaretskii
2023-03-31  1:25                                                                       ` Dmitry Gutov
2023-03-31  6:22                                                                         ` Eli Zaretskii
2023-03-31  1:17                                                                   ` Dmitry Gutov

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.