From unknown Sat Sep 13 11:38:41 2025 X-Loop: help-debbugs@gnu.org Subject: bug#79374: [PATCH] eglot: add support for semantic tokens Resent-From: "Lua V. R." Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Wed, 03 Sep 2025 00:43:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 79374 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: 79374@debbugs.gnu.org Cc: =?UTF-8?Q?Jo=C3=A3o_?= =?UTF-8?Q?T=C3=A1vora?= X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Reply-To: me@lua.blog.br Received: via spool by submit@debbugs.gnu.org id=B.175686014728954 (code B ref -1); Wed, 03 Sep 2025 00:43:02 +0000 Received: (at submit) by debbugs.gnu.org; 3 Sep 2025 00:42:27 +0000 Received: from localhost ([127.0.0.1]:37287 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1utbZu-0007Wq-KO for submit@debbugs.gnu.org; Tue, 02 Sep 2025 20:42:27 -0400 Received: from lists.gnu.org ([2001:470:142::17]:52658) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1utaH6-0003DA-4W for submit@debbugs.gnu.org; Tue, 02 Sep 2025 19:18:53 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1utaH0-00041C-20 for bug-gnu-emacs@gnu.org; Tue, 02 Sep 2025 19:18:46 -0400 Received: from cyan.elm.relay.mailchannels.net ([23.83.212.47]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1utaGw-00073d-Fl for bug-gnu-emacs@gnu.org; Tue, 02 Sep 2025 19:18:45 -0400 X-Sender-Id: hostingeremailsmtpin|x-authuser|lua@lua.blog.br Received: from relay.mailchannels.net (localhost [127.0.0.1]) by relay.mailchannels.net (Postfix) with ESMTP id D27191A4CEC; Tue, 2 Sep 2025 23:18:38 +0000 (UTC) Received: from fr-int-smtpout13.hostinger.io (trex-blue-0.trex.outbound.svc.cluster.local [100.105.11.154]) (Authenticated sender: hostingeremailsmtpin) by relay.mailchannels.net (Postfix) with ESMTPA id DB8FF1A4D4D; Tue, 2 Sep 2025 23:18:37 +0000 (UTC) ARC-Seal: i=1; s=arc-2022; d=mailchannels.net; t=1756855118; a=rsa-sha256; cv=none; b=hZnBfCUmnFA9mllLSxk8xB/mH1ragEwDlynxNEe0KTG+4jt+iQJUG6pGSwOQ99P2SI14nJ WQ7GTEd5lwX/DeNsVyqdHUNEH83wSvTE2ZhYSC1ud5smfewpS+NycbAU+CxWLJwbPN6ovR Eg7UrN2q30GsZKGCNgJf02Rq4am9vuEiiD3gFLnbqeZKPXTD4R+vlPPxXxbbhbtAhbQ2OV 5tD2E2o2RrS2rG/dVNR+YxSG8N2wFbickEWDeC97/7VQK0EQP4nF554vmqhyDdLYdRo6hG ExgZl3OUNliveA0uKhzsBXkfeCfi7tlB8FZSCDmvQpPAlcRurDNaRdoKZjNapw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=mailchannels.net; s=arc-2022; t=1756855118; h=from:from:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:in-reply-to:in-reply-to: references:references:dkim-signature; bh=of1kYdQv3vHuixldY1+zJReEbTpqeXYwZ3wbCccRpK4=; b=RpVl+PrkTqSYqAmKTsVmfq4SOOlHhRrM2N0MJEA0l6FI7glJuxMoU07gF2y5QOiydDBAom n6Iy8naDhXLUcczWPf9MkuHAL17ZHh4CpLGHW2m5LcEiX60zQGoO3MbVgkWzOq1VHRndZE KqHuW7nEqe/YYzIMQ1OffWpNPG7d8grderupHFVQET3VY6zSMjOuENRNOn8zEVo82ZG/Qb 7uOGA1qHqW5iVt+JqgIs3/LDzRbnH9TmdkEvKGBBv+kI7BoIZ4eJEpKe0JeZMmWkvWOLhJ IPEd936n+u5tno0NvJ9tYYJrzFzH17yFiIlOwJ0XJSOUp3/DrjTnqJIT8K0wFA== ARC-Authentication-Results: i=1; rspamd-77486b5f64-ldpv4; auth=pass smtp.auth=hostingeremailsmtpin smtp.mailfrom=me@lua.blog.br X-Sender-Id: hostingeremailsmtpin|x-authuser|lua@lua.blog.br X-MC-Relay: Neutral X-MailChannels-SenderId: hostingeremailsmtpin|x-authuser|lua@lua.blog.br X-MailChannels-Auth-Id: hostingeremailsmtpin X-Glossy-Tank: 4fede0492a5fa425_1756855118692_3993190086 X-MC-Loop-Signature: 1756855118692:1911019864 X-MC-Ingress-Time: 1756855118691 Received: from fr-int-smtpout13.hostinger.io ([UNAVAILABLE]. [148.222.54.40]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384) by 100.105.11.154 (trex/7.1.3); Tue, 02 Sep 2025 23:18:38 +0000 Received: from [IPV6:2804:14d:8084:a662::5cb8] (unknown [IPv6:2804:14d:8084:a662::5cb8]) (Authenticated sender: lua@lua.blog.br) by smtp.hostinger.com (smtp.hostinger.com) with ESMTPSA id 4cGhWH4Xkjz10pb; Tue, 2 Sep 2025 23:18:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lua.blog.br; s=hostingermail-a; t=1756855116; h=from:from:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:in-reply-to:in-reply-to: references:references; bh=of1kYdQv3vHuixldY1+zJReEbTpqeXYwZ3wbCccRpK4=; b=LYuP3G2Te7H5RnMRKhiYfIcBKeSD3p6sUC7ztPM2mwOkNRChoxpBWewRtoW5KagejXFKpF 6Ox6VjPgUv/7gwOru9uBRJmVPvqsprPDWKG8pVrNks4BZ8amaGywnM4rPXNMz2oCrwFsUP Vu7pB3//eKwsTpPHGJe1NGh9q9dzBtl5jLrY1yxGMu/ofG0bSlUe8s7obrwEs0iYXwoeX6 Nf6R+1FN+lqqf6h5gFS0YoIbWyULqlm7qPWGEqZCZPBarZ7q+oR6V5gQaZTqpOcmE9H7bW EJu3WHofu2Mk9fCyMz/1N0q7dyXAhex816wR/2rAvuA2V/MUsb4rBy6nFQYJPA== Content-Type: multipart/mixed; boundary="------------g0J6nJdLcckbJYpGJXcUemsd" Message-ID: <2c03b490-5006-4ad4-a090-fafc8a18405d@lua.blog.br> MIME-Version: 1.0 User-Agent: Betterbird (Linux) Content-Language: en-US, pt-BR References: From: "Lua V. R." In-Reply-To: X-Forwarded-Message-Id: Date: Tue, 2 Sep 2025 23:18:35 +0000 (UTC) X-CM-Envelope: MS4xfCNCCU9iYzy4MelGm5bmqbPgBODhh7agFf87FP3WmczaDQoWu/hCFtdUltbKtJ5QjLE1V/DPBgWTid2x35DOb/VTL3ouc56K5zVLHoBCz3l6VUAIjFEx M00b/z2iTiK1le3nh3JTWQbopEQ5TZb6WzmzM+qTL922Nd4IBcB57tH8p6EitgoqlqBK07Im8Uwoe1+FK9lmIuB7ISB1MDagV5N8luIZ8WasUAtvK8ZFBT4O vuwukMXby4yFXRapEcnVRyCteb142xI0AVNrRhD9x+4= X-CM-Analysis: v=2.4 cv=DJTd4DNb c=1 sm=1 tr=0 ts=68b77b4c a=VfClAEUqrXadIs2MVknt0w==:617 a=xqWC_Br6kY4A:10 a=r77TgQKjGQsHNAKrUKIA:9 a=mDV3o1hIAAAA:8 a=pGLkceISAAAA:8 a=9oc3-6I5A5mP93_st9YA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 a=ufS1wz06LVvryDGfax4A:9 a=B2y7HmGcmWMA:10 X-AuthUser: lua@lua.blog.br Received-SPF: pass client-ip=23.83.212.47; envelope-from=me@lua.blog.br; helo=cyan.elm.relay.mailchannels.net X-Spam_score_int: 13 X-Spam_score: 1.3 X-Spam_bar: + X-Spam_report: (1.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_SBL_CSS=3.335, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-Spam-Score: 4.5 (++++) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: Oops. I guess I should have sent it to bug-gnu-emacs, so I'm forwarding that. -------- Mensagem encaminhada -------- Assunto: [PATCH] eglot: add support for semantic tokens Data: Tue, 2 Sep 2025 19:29:40 -0300 De: Lua V. R. Responder a: me@lua.blog.br Para: ema [...] Content analysis details: (4.5 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 3.6 RCVD_IN_SBL_CSS RBL: Received via a relay in Spamhaus SBL-CSS [2804:14d:8084:a662:0:0:0:5cb8 listed in] [zen.spamhaus.org] -0.0 SPF_HELO_PASS SPF: HELO matches SPF record 1.0 SPF_SOFTFAIL SPF: sender does not match SPF record (softfail) -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [2001:470:142:0:0:0:0:17 listed in] [list.dnswl.org] X-Mailman-Approved-At: Tue, 02 Sep 2025 20:42:19 -0400 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 3.5 (+++) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: Oops. I guess I should have sent it to bug-gnu-emacs, so I'm forwarding that. -------- Mensagem encaminhada -------- Assunto: [PATCH] eglot: add support for semantic tokens Data: Tue, 2 Sep 2025 19:29:40 -0300 De: Lua V. R. Responder a: me@lua.blog.br Para: ema [...] Content analysis details: (3.5 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 3.6 RCVD_IN_SBL_CSS RBL: Received via a relay in Spamhaus SBL-CSS [2804:14d:8084:a662:0:0:0:5cb8 listed in] [zen.spamhaus.org] -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [2001:470:142:0:0:0:0:17 listed in] [list.dnswl.org] -0.0 SPF_HELO_PASS SPF: HELO matches SPF record 1.0 SPF_SOFTFAIL SPF: sender does not match SPF record (softfail) -1.0 MAILING_LIST_MULTI Multiple indicators imply a widely-seen list manager This is a multi-part message in MIME format. --------------g0J6nJdLcckbJYpGJXcUemsd Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Oops. I guess I should have sent it to bug-gnu-emacs, so I'm forwarding that. -------- Mensagem encaminhada -------- Assunto: [PATCH] eglot: add support for semantic tokens Data: Tue, 2 Sep 2025 19:29:40 -0300 De: Lua V. R. Responder a: me@lua.blog.br Para: emacs-devel@gnu.org CC: João Távora Hi all, Here is my attempt at a patch for the semantic tokens (yesterday I proposed it as a nongnu package). I had the feeling that I was mentally involved with it to the point that if I did not work on it this afternoon, I would probably put it aside and not have the energy to go back to it later. As I said, overall it's based on the lsp-mode implementation, but at this point everything has been rewritten, including the eglot--semtok-fontify function. Please let me know if there would still be a problem with that. Now that there is a patch, I /will/ put this aside for other priorities, so please understand if I'm slow to respond :) kind regards, Lua --------------g0J6nJdLcckbJYpGJXcUemsd Content-Type: text/x-patch; charset=UTF-8; name="0001-add-semantic-tokens-support-for-eglot.patch" Content-Disposition: attachment; filename="0001-add-semantic-tokens-support-for-eglot.patch" Content-Transfer-Encoding: base64 RnJvbSAyMjAyYzY3MjMwOTgyZmY0N2Q3NmU5ZGE5ZDYzYjZlYmZkMGVkYTk3IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBMdWEgVmlhbmEgUmVpcyA8bWVAbHVhLmJsb2cuYnI+ CkRhdGU6IFR1ZSwgMiBTZXAgMjAyNSAxOTowMzo1MiAtMDMwMApTdWJqZWN0OiBbUEFUQ0hd IGFkZCBzZW1hbnRpYyB0b2tlbnMgc3VwcG9ydCBmb3IgZWdsb3QKCi0tLQogbGlzcC9wcm9n bW9kZXMvZWdsb3QuZWwgfCAzMjggKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrLQogMSBmaWxlIGNoYW5nZWQsIDMyNSBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9u cygtKQoKZGlmZiAtLWdpdCBhL2xpc3AvcHJvZ21vZGVzL2VnbG90LmVsIGIvbGlzcC9wcm9n bW9kZXMvZWdsb3QuZWwKaW5kZXggNDc1YjVlMTNmMS4uN2RkYzhiMGI1ZSAxMDA2NDQKLS0t IGEvbGlzcC9wcm9nbW9kZXMvZWdsb3QuZWwKKysrIGIvbGlzcC9wcm9nbW9kZXMvZWdsb3Qu ZWwKQEAgLTE0MSw2ICsxNDEsOCBAQAogKGRlZnZhciBjb21wYW55LXRvb2x0aXAtYWxpZ24t YW5ub3RhdGlvbnMpCiAoZGVmdmFyIHRyYW1wLXNzaC1jb250cm9sbWFzdGVyLW9wdGlvbnMp CiAoZGVmdmFyIHRyYW1wLXVzZS1zc2gtY29udHJvbG1hc3Rlci1vcHRpb25zKQorKGRlZnZh ciBlZ2xvdC1zZW1hbnRpYy10b2tlbnMtZmFjZXMpCisoZGVmdmFyIGVnbG90LXNlbWFudGlj LXRva2Vucy1tb2RpZmllci1mYWNlcykKIAogDAogOzs7IE9ic29sZXRlIGFsaWFzZXMKQEAg LTEwMTcsNiArMTAxOSw3IEBAIG9iamVjdC4iCiAgICAgICAgICAgICAgICAgICAgICAgICBg KDpkeW5hbWljUmVnaXN0cmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICwoaWYg KGVnbG90LS10cmFtcGlzaC1wIHMpIDpqc29uLWZhbHNlIHQpKQogICAgICAgICAgICAgICAg ICAgICAgICAgOnN5bWJvbCBgKDpkeW5hbWljUmVnaXN0cmF0aW9uIDpqc29uLWZhbHNlKQor ICAgICAgICAgICAgICAgICAgICAgICAgOnNlbWFudGljVG9rZW5zICcoOnJlZnJlc2hTdXBw b3J0IHQpCiAgICAgICAgICAgICAgICAgICAgICAgICA6Y29uZmlndXJhdGlvbiB0CiAgICAg ICAgICAgICAgICAgICAgICAgICA6d29ya3NwYWNlRm9sZGVycyB0KQogICAgICAgICAgICAg OnRleHREb2N1bWVudApAQCAtMTA3OSw2ICsxMDgyLDEzIEBAIG9iamVjdC4iCiAgICAgICAg ICAgICAgOmZvcm1hdHRpbmcgICAgICAgICBgKDpkeW5hbWljUmVnaXN0cmF0aW9uIDpqc29u LWZhbHNlKQogICAgICAgICAgICAgIDpyYW5nZUZvcm1hdHRpbmcgICAgYCg6ZHluYW1pY1Jl Z2lzdHJhdGlvbiA6anNvbi1mYWxzZSkKICAgICAgICAgICAgICA6cmVuYW1lICAgICAgICAg ICAgIGAoOmR5bmFtaWNSZWdpc3RyYXRpb24gOmpzb24tZmFsc2UpCisgICAgICAgICAgICAg OnNlbWFudGljVG9rZW5zICAgICBgKDpkeW5hbWljUmVnaXN0cmF0aW9uIDpqc29uLWZhbHNl CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpyZXF1ZXN0cyAnKDpyYW5n ZSB0IDpmdWxsIHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0b2tl bk1vZGlmaWVycyBbLEAobWFwY2FyICMnY2FyIGVnbG90LXNlbWFudGljLXRva2Vucy1tb2Rp Zmllci1mYWNlcyldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpvdmVy bGFwcGluZ1Rva2VuU3VwcG9ydCB0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIDptdWx0aWxpbmVUb2tlblN1cHBvcnQgdAorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICA6dG9rZW5UeXBlcyBbLEAobWFwY2FyICMnY2FyIGVnbG90LXNlbWFudGlj LXRva2Vucy1mYWNlcyldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpm b3JtYXRzIFsicmVsYXRpdmUiXSkKICAgICAgICAgICAgICA6aW5sYXlIaW50ICAgICAgICAg IGAoOmR5bmFtaWNSZWdpc3RyYXRpb24gOmpzb24tZmFsc2UpCiAgICAgICAgICAgICAgOmNh bGxIaWVyYXJjaHkgICAgICBgKDpkeW5hbWljUmVnaXN0cmF0aW9uIDpqc29uLWZhbHNlKQog ICAgICAgICAgICAgIDp0eXBlSGllcmFyY2h5ICAgICAgYCg6ZHluYW1pY1JlZ2lzdHJhdGlv biA6anNvbi1mYWxzZSkKQEAgLTExNDksNyArMTE1OSwxNiBAQCBvYmplY3QuIgogICAgIDph Y2Nlc3NvciBlZ2xvdC0tbWFuYWdlZC1idWZmZXJzKQogICAgKHNhdmVkLWluaXRhcmdzCiAg ICAgOmRvY3VtZW50YXRpb24gIlNhdmVkIGluaXRhcmdzIGZvciByZWNvbm5lY3Rpb24gcHVy cG9zZXMuIgotICAgIDphY2Nlc3NvciBlZ2xvdC0tc2F2ZWQtaW5pdGFyZ3MpKQorICAgIDph Y2Nlc3NvciBlZ2xvdC0tc2F2ZWQtaW5pdGFyZ3MpCisgICAoc2VtdG9rLWZhY2VzCisgICAg OmluaXRmb3JtIG5pbAorICAgIDpkb2N1bWVudGF0aW9uICJTZW1hbnRpYyB0b2tlbnMgZmFj ZXMuIikKKyAgIChzZW10b2stbW9kaWZpZXItZmFjZXMKKyAgICA6aW5pdGZvcm0gbmlsCisg ICAgOmRvY3VtZW50YXRpb24gIlNlbWFudGljIHRva2VucyBtb2RpZmllciBmYWNlcy4iKQor ICAgKHNlbXRvay1tb2RpZmllci1jYWNoZQorICAgIDppbml0Zm9ybSAobWFrZS1oYXNoLXRh YmxlKQorICAgIDpkb2N1bWVudGF0aW9uICJBIGhhc2htYXAgb2YgbW9kaWZpZXIgdmFsdWVz IHRvIHRoZSBzZWxlY3RlZCBmYWNlcy4iKSkKICAgOmRvY3VtZW50YXRpb24KICAgIlJlcHJl c2VudHMgYSBzZXJ2ZXIuIFdyYXBzIGEgcHJvY2VzcyBmb3IgTFNQIGNvbW11bmljYXRpb24u IikKIApAQCAtMTIxMSw2ICsxMjMwLDExIEBAIElmIG9wdGlvbmFsIE1BUktFUlMsIG1ha2Ug bWFya2VycyBpbnN0ZWFkLiIKICAgICAgICAgIChlbmQgKGVnbG90LS1sc3AtcG9zaXRpb24t dG8tcG9pbnQgKHBsaXN0LWdldCByYW5nZSA6ZW5kKSBtYXJrZXJzKSkpCiAgICAgKGNvbnMg YmVnIGVuZCkpKQogCisoZGVmdW4gZWdsb3QtcmVnaW9uLXJhbmdlIChiZWcgZW5kKQorICAi UmV0dXJuIGEgTFNQIHJhbmdlIHJlcHJlc2VudGluZyByZWdpb24gQkVHIHRvIEVORC4iCisg IChsaXN0IDpzdGFydCAoZWdsb3QtLXBvcy10by1sc3AtcG9zaXRpb24gYmVnKQorICAgICAg ICA6ZW5kIChlZ2xvdC0tcG9zLXRvLWxzcC1wb3NpdGlvbiBlbmQpKSkKKwogKGRlZnVuIGVn bG90LXNlcnZlci1jYXBhYmxlICgmcmVzdCBmZWF0cykKICAgIkRldGVybWluZSBpZiBjdXJy ZW50IHNlcnZlciBpcyBjYXBhYmxlIG9mIEZFQVRTLiIKICAgKHVubGVzcyAoY2wtc29tZSAo bGFtYmRhIChmZWF0KQpAQCAtMTU3Niw3ICsxNjAwLDggQEAgVXNlIGN1cnJlbnQgc2VydmVy J3Mgb3IgZmlyc3QgYXZhaWxhYmxlIEVnbG90IGV2ZW50cyBidWZmZXIuIgogICAoanNvbnJw Yy1mb3JnZXQtcGVuZGluZy1jb250aW51YXRpb25zIHNlcnZlcikpCiAKIChkZWZ2YXIgZWds b3QtY29ubmVjdC1ob29rCi0gICcoZWdsb3Qtc2lnbmFsLWRpZENoYW5nZUNvbmZpZ3VyYXRp b24pCisgICcoZWdsb3Qtc2lnbmFsLWRpZENoYW5nZUNvbmZpZ3VyYXRpb24KKyAgICBlZ2xv dC0tc2VtdG9rLWluaXRpYWxpemUpCiAgICJIb29rIHJ1biBhZnRlciBjb25uZWN0aW5nIHRv IGEgc2VydmVyLgogRWFjaCBmdW5jdGlvbiBpcyBwYXNzZWQgYW4gYGVnbG90LWxzcC1zZXJ2 ZXInIGluc3RhbmNlCiBhcyBhcmd1bWVudC4iKQpAQCAtMjI5MSw2ICsyMzE2LDcgQEAgSWYg aXQgaXMgYWN0aXZhdGVkLCBhbHNvIHNpZ25hbCB0ZXh0RG9jdW1lbnQvZGlkT3Blbi4iCiAg ICAgICA7OyBSdW4gdXNlciBob29rIGFmdGVyICd0ZXh0RG9jdW1lbnQvZGlkT3Blbicgc28g c2VydmVyIGtub3dzCiAgICAgICA7OyBhYm91dCB0aGUgYnVmZmVyLgogICAgICAgKGVnbG90 LWlubGF5LWhpbnRzLW1vZGUgMSkKKyAgICAgIChlZ2xvdC1zZW1hbnRpYy10b2tlbnMtbW9k ZSAxKQogICAgICAgKHJ1bi1ob29rcyAnZWdsb3QtbWFuYWdlZC1tb2RlLWhvb2spKSkpCiAK IChhZGQtaG9vayAnYWZ0ZXItY2hhbmdlLW1ham9yLW1vZGUtaG9vayAjJ2VnbG90LS1tYXli ZS1hY3RpdmF0ZS1lZGl0aW5nLW1vZGUpCkBAIC00NDk0LDYgKzQ1MjAsMzAwIEBAIElmIE5P RVJST1IsIHJldHVybiBwcmVkaWNhdGUsIGVsc2UgZXJyb3JpbmcgZnVuY3Rpb24uIgogICAg ICAgICAgKGppdC1sb2NrLXVucmVnaXN0ZXIgIydlZ2xvdC0tdXBkYXRlLWhpbnRzKQogICAg ICAgICAgKHJlbW92ZS1vdmVybGF5cyBuaWwgbmlsICdlZ2xvdC0taW5sYXktaGludCB0KSkp KQogCisMCis7OzsgU2VtYW50aWMgdG9rZW5zCisKKyhkZWZjdXN0b20gZWdsb3Qtc2VtYW50 aWMtdG9rZW5zLWZhY2VzCisgICcoKCJuYW1lc3BhY2UiIC4gZm9udC1sb2NrLWtleXdvcmQt ZmFjZSkKKyAgICAoInR5cGUiIC4gZm9udC1sb2NrLXR5cGUtZmFjZSkKKyAgICAoImNsYXNz IiAuIGZvbnQtbG9jay10eXBlLWZhY2UpCisgICAgKCJlbnVtIiAuIGZvbnQtbG9jay10eXBl LWZhY2UpCisgICAgKCJpbnRlcmZhY2UiIC4gZm9udC1sb2NrLXR5cGUtZmFjZSkKKyAgICAo InN0cnVjdCIgLiBmb250LWxvY2stdHlwZS1mYWNlKQorICAgICgidHlwZVBhcmFtZXRlciIg LiBmb250LWxvY2stdHlwZS1mYWNlKQorICAgICgicGFyYW1ldGVyIiAuIGZvbnQtbG9jay12 YXJpYWJsZS1uYW1lLWZhY2UpCisgICAgKCJ2YXJpYWJsZSIgLiBmb250LWxvY2stdmFyaWFi bGUtbmFtZS1mYWNlKQorICAgICgicHJvcGVydHkiIC4gZm9udC1sb2NrLXByb3BlcnR5LXVz ZS1mYWNlKQorICAgICgiZW51bU1lbWJlciIgLiBmb250LWxvY2stY29uc3RhbnQtZmFjZSkK KyAgICAoImV2ZW50IiAuIGZvbnQtbG9jay12YXJpYWJsZS1uYW1lLWZhY2UpCisgICAgKCJm dW5jdGlvbiIgLiBmb250LWxvY2stZnVuY3Rpb24tbmFtZS1mYWNlKQorICAgICgibWV0aG9k IiAuIGZvbnQtbG9jay1mdW5jdGlvbi1uYW1lLWZhY2UpCisgICAgKCJtYWNybyIgLiBmb250 LWxvY2stcHJlcHJvY2Vzc29yLWZhY2UpCisgICAgKCJrZXl3b3JkIiAuIGZvbnQtbG9jay1r ZXl3b3JkLWZhY2UpCisgICAgKCJtb2RpZmllciIgLiBmb250LWxvY2stZnVuY3Rpb24tbmFt ZS1mYWNlKQorICAgICgiY29tbWVudCIgLiBmb250LWxvY2stY29tbWVudC1mYWNlKQorICAg ICgic3RyaW5nIiAuIGZvbnQtbG9jay1zdHJpbmctZmFjZSkKKyAgICAoIm51bWJlciIgLiBm b250LWxvY2stY29uc3RhbnQtZmFjZSkKKyAgICAoInJlZ2V4cCIgLiBmb250LWxvY2stc3Ry aW5nLWZhY2UpCisgICAgKCJvcGVyYXRvciIgLiBmb250LWxvY2stZnVuY3Rpb24tbmFtZS1m YWNlKQorICAgICgiZGVjb3JhdG9yIiAuIGZvbnQtbG9jay10eXBlLWZhY2UpKQorICAiQWxp c3Qgb2YgZmFjZXMgdG8gdXNlIHRvIGhpZ2hsaWdodCBzZW1hbnRpYyB0b2tlbnMuCitFYWNo IGVsZW1lbnQgaXMgYSBjb25zIGNlbGwgd2hvc2UgY2FyIGlzIGEgdG9rZW4gdHlwZSBuYW1l IGFuZCBjZHIgaXMKK3RoZSBmYWNlIHRvIHVzZS4iCisgIDp0eXBlIGAoYWxpc3QgOmtleS10 eXBlIChzdHJpbmcgOnRhZyAiVG9rZW4gbmFtZSIpCisgICAgICAgICAgICAgICAgOnZhbHVl LXR5cGUgKGNob2ljZSAoZmFjZSA6dGFnICJGYWNlIikKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIChwbGlzdCA6dGFnICJGYWNlIEF0dHJpYnV0ZXMiCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmtleS10eXBlCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNob2ljZQorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsQChtYXBjYXIKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhbWJkYSAoY2VsbCkK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgKGNv bnN0IDp0YWcgLChjYXBpdGFsaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNkciBjZWxsKSkKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwoY2Fy IGNlbGwpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgZmFjZS1hdHRyaWJ1dGUtbmFtZS1hbGlzdCkpKSkpKQorCisoZGVmY3VzdG9tIGVnbG90 LXNlbWFudGljLXRva2Vucy1tb2RpZmllci1mYWNlcworICAnKCgiZGVjbGFyYXRpb24iIC4g Zm9udC1sb2NrLWZ1bmN0aW9uLW5hbWUtZmFjZSkKKyAgICAoImRlZmluaXRpb24iIC4gZm9u dC1sb2NrLWZ1bmN0aW9uLW5hbWUtZmFjZSkKKyAgICAoInJlYWRvbmx5IiAuIGZvbnQtbG9j ay1jb25zdGFudC1mYWNlKQorICAgICgic3RhdGljIiAuIGZvbnQtbG9jay1rZXl3b3JkLWZh Y2UpCisgICAgKCJkZXByZWNhdGVkIiAuIGVnbG90LWRpYWdub3N0aWMtdGFnLWRlcHJlY2F0 ZWQtZmFjZSkKKyAgICAoImFic3RyYWN0IiAuIGZvbnQtbG9jay1rZXl3b3JkLWZhY2UpCisg ICAgKCJhc3luYyIgLiBmb250LWxvY2stcHJlcHJvY2Vzc29yLWZhY2UpCisgICAgKCJtb2Rp ZmljYXRpb24iIC4gZm9udC1sb2NrLWZ1bmN0aW9uLW5hbWUtZmFjZSkKKyAgICAoImRvY3Vt ZW50YXRpb24iIC4gZm9udC1sb2NrLWRvYy1mYWNlKQorICAgICgiZGVmYXVsdExpYnJhcnki IC4gZm9udC1sb2NrLWJ1aWx0aW4tZmFjZSkpCisgICJMaXN0IG9mIGZhY2UgdG8gdXNlIHRv IGhpZ2hsaWdodCB0b2tlbnMgd2l0aCBtb2RpZmllcnMuCitFYWNoIGVsZW1lbnQgaXMgYSBj b25zIGNlbGwgd2hvc2UgY2FyIGlzIGEgbW9kaWZpZXIgbmFtZSBhbmQgY2RyIGlzCit0aGUg ZmFjZSB0byB1c2UuIgorICA6dHlwZSBgKGFsaXN0IDprZXktdHlwZSAoc3RyaW5nIDp0YWcg IlRva2VuIG5hbWUiKQorICAgICAgICAgICAgICAgIDp2YWx1ZS10eXBlIChjaG9pY2UgKGZh Y2UgOnRhZyAiRmFjZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo cGxpc3QgOnRhZyAiRmFjZSBBdHRyaWJ1dGVzIgorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIDprZXktdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIChjaG9pY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgLEAobWFwY2FyCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIChsYW1iZGEgKGNlbGwpCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYChjb25zdCA6dGFnICwoY2FwaXRh bGl6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIChjZHIgY2VsbCkpCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsKGNhciBjZWxsKSkpCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtYXR0cmlidXRl LW5hbWUtYWxpc3QpKSkpKSkKKworKGRlZnZhci1sb2NhbCBlZ2xvdC0tc2VtdG9rLWlkbGUt dGltZXIgbmlsCisgICJJZGxlIHRpbWVyIHRvIHJlcXVlc3QgZnVsbCBzZW1hbnRpYyB0b2tl bnMuIikKKworKGRlZnZhci1sb2NhbCBlZ2xvdC0tc2VtdG9rLWxhc3QtcmVxdWVzdC1oYXNo IG5pbAorICAiSGFzaCBvZiBsYXN0IHJlcXVlc3QgcGFyYW1ldGVycyBhbmQgZG9jdW1lbnQg dmVyc2lvbi4iKQorCisoZGVmdmFyLWxvY2FsIGVnbG90LS1zZW10b2stY2FjaGUgbmlsKQor CisoZGVmc3Vic3QgZWdsb3QtLXNlbXRvay1wdXQtY2FjaGUgKGsgdikKKyAgIlNldCBrZXkg SyBvZiBgZWdsb3Qtc2VtYW50aWMtdG9rZW5zLS1jYWNoZScgdG8gVi4iCisgIChzZXRxIGVn bG90LS1zZW10b2stY2FjaGUKKyAgICAgICAgKHBsaXN0LXB1dCBlZ2xvdC0tc2VtdG9rLWNh Y2hlIGsgdikpKQorCis7OyBQcm9jZXNzIHJlc3BvbnNlCisKKyhkZWZ1biBlZ2xvdC0tc2Vt dG9rLWluZ2VzdC1yYW5nZS1yZXNwb25zZSAocmVzcG9uc2UpCisgICJIYW5kbGUgUkVTUE9O U0UgdG8gc2VtYW50aWNUb2tlbnMvcmFuZ2UgcmVxdWVzdC4iCisgIChlZ2xvdC0tc2VtdG9r LXB1dC1jYWNoZSA6cmVzcG9uc2UgcmVzcG9uc2UpCisgIChjbC1hc3NlcnQgKHBsaXN0LWdl dCBlZ2xvdC0tc2VtdG9rLWNhY2hlIDpyZWdpb24pKSkKKworKGRlZnVuIGVnbG90LS1zZW10 b2staW5nZXN0LWZ1bGwtcmVzcG9uc2UgKHJlc3BvbnNlKQorICAiSGFuZGxlIFJFU1BPTlNF IHRvIHNlbWFudGljVG9rZW5zL2Z1bGwgcmVxdWVzdC4iCisgIChlZ2xvdC0tc2VtdG9rLXB1 dC1jYWNoZSA6cmVzcG9uc2UgcmVzcG9uc2UpCisgIChjbC1hc3NlcnQgKG5vdCAocGxpc3Qt Z2V0IGVnbG90LS1zZW10b2stY2FjaGUgOnJlZ2lvbikpKSkKKworKGRlZnN1YnN0IGVnbG90 LS1zZW10b2stYXBwbHktZGVsdGEtZWRpdHMgKG9sZC1kYXRhIGVkaXRzKQorICAiQXBwbHkg RURJVFMgb2J0YWluZWQgZnJvbSBmdWxsL2RlbHRhIHJlcXVlc3QgdG8gT0xELURBVEEuIgor ICAobGV0KiAoKG9sZC10b2tlbi1jb3VudCAobGVuZ3RoIG9sZC1kYXRhKSkKKyAgICAgICAg IChvbGQtdG9rZW4taW5kZXggMCkKKyAgICAgICAgIChzdWJzdHJpbmdzKSkKKyAgICAoY2wt bG9vcCBmb3IgZWRpdCBhY3Jvc3MgZWRpdHMgZG8KKyAgICAgKHdoZW4gKDwgb2xkLXRva2Vu LWluZGV4IChwbGlzdC1nZXQgZWRpdCA6c3RhcnQpKQorICAgICAgIChwdXNoIChzdWJzdHJp bmcgb2xkLWRhdGEgb2xkLXRva2VuLWluZGV4IChwbGlzdC1nZXQgZWRpdCA6c3RhcnQpKSBz dWJzdHJpbmdzKSkKKyAgICAgKHB1c2ggKHBsaXN0LWdldCBlZGl0IDpkYXRhKSBzdWJzdHJp bmdzKQorICAgICAoc2V0cSBvbGQtdG9rZW4taW5kZXggKCsgKHBsaXN0LWdldCBlZGl0IDpz dGFydCkgKHBsaXN0LWdldCBlZGl0IDpkZWxldGVDb3VudCkpKQorICAgICBmaW5hbGx5IGRv IChwdXNoIChzdWJzdHJpbmcgb2xkLWRhdGEgb2xkLXRva2VuLWluZGV4IG9sZC10b2tlbi1j b3VudCkgc3Vic3RyaW5ncykpCisgICAgKGFwcGx5ICMndmNvbmNhdCAobnJldmVyc2Ugc3Vi c3RyaW5ncykpKSkKKworKGRlZnVuIGVnbG90LS1zZW10b2staW5nZXN0LWZ1bGwvZGVsdGEt cmVzcG9uc2UgKHJlc3BvbnNlKQorICAiSGFuZGxlIFJFU1BPTlNFIHRvIHNlbWFudGljVG9r ZW5zL2Z1bGwvZGVsdGEgcmVxdWVzdC4iCisgIChpZi1sZXQqICgoZWRpdHMgKHBsaXN0LWdl dCByZXNwb25zZSA6ZWRpdHMpKSkKKyAgICAgIChjbC1hc3NlcnQgKG5vdCAocGxpc3QtZ2V0 IGVnbG90LS1zZW10b2stY2FjaGUgOnJlZ2lvbikpKQorICAgICAgKHdoZW4tbGV0KiAoKG9s ZC1kYXRhIChwbGlzdC1nZXQgKHBsaXN0LWdldCBlZ2xvdC0tc2VtdG9rLWNhY2hlIDpyZXNw b25zZSkgOmRhdGEpKSkKKyAgICAgICAgKGVnbG90LS1zZW10b2stcHV0LWNhY2hlCisgICAg ICAgICA6cmVzcG9uc2UKKyAgICAgICAgIChwbGlzdC1wdXQgcmVzcG9uc2UgOmRhdGEgKGVn bG90LS1zZW10b2stYXBwbHktZGVsdGEtZWRpdHMgb2xkLWRhdGEgZWRpdHMpKSkpCisgICAg Ozsgc2VydmVyIGRlY2lkZWQgdG8gc2VuZCBmdWxsIHJlc3BvbnNlIGluc3RlYWQKKyAgICAo ZWdsb3QtLXNlbXRvay1pbmdlc3QtZnVsbC1yZXNwb25zZSByZXNwb25zZSkpKQorCisoZGVm dW4gZWdsb3QtLXNlbXRvay1yZXF1ZXN0IChyZWdpb24gJm9wdGlvbmFsIGZvbnRpZnkpCisg ICJTZW5kIHNlbWFudGljIHRva2VucyByZXF1ZXN0IHRvIHRoZSBsYW5ndWFnZSBzZXJ2ZXIu CitBIGZ1bGwvZGVsdGEgcmVxdWVzdCB3aWxsIGJlIHNlbnQgaWYgZGVsdGEgcmVxdWVzdHMg YXJlIHN1cHBvcnRlZCBieSB0aGUKK2xhbmd1YWdlIHNlcnZlciBhbmQgYSBmdWxsIHNldCBv ZiB0b2tlbnMgaGFkIHByZXZpb3VzbHkgYmVlbiByZWNlaXZlZC4KK090aGVyd2lzZSwgYSBy YW5nZWQgcmVxdWVzdCB3aWxsIGJlIGRpc3BhdGNoZWQgaWYgUkVHSU9OIGlzIG5vbi1uaWwg YW5kCityYW5nZWQgcmVxdWVzdHMgYXJlIHN1cHBvcnRlZCBieSB0aGUgbGFuZ3VhZ2Ugc2Vy dmVyLiBJbiBhbGwgb3RoZXIKK2Nhc2VzLCBhIGZ1bGwgdG9rZW5zIHJlcXVlc3Qgd2lsbCBi ZSBkaXNwYXRjaGVkLgorCitJZiBGT05USUZZIGlzIG5vbi1uaWwsIHJlZm9udGlmeSBhZnRl ciB0aGUgcmVxdWVzdCBjb21wbGV0ZXMuIgorICAobGV0KiAoKG1ldGhvZCA6dGV4dERvY3Vt ZW50L3NlbWFudGljVG9rZW5zL2Z1bGwpCisgICAgICAgICAocGFyYW1zIChsaXN0IDp0ZXh0 RG9jdW1lbnQgKGVnbG90LS1UZXh0RG9jdW1lbnRJZGVudGlmaWVyKSkpCisgICAgICAgICAo cmVzcG9uc2UtaGFuZGxlciAjJ2VnbG90LS1zZW10b2staW5nZXN0LWZ1bGwtcmVzcG9uc2Up CisgICAgICAgICAobGFzdC1oYXNoIGVnbG90LS1zZW10b2stbGFzdC1yZXF1ZXN0LWhhc2gp CisgICAgICAgICAobGFzdC1yZWdpb24gKGNkciBsYXN0LWhhc2gpKQorICAgICAgICAgKGZp bmFsLXJlZ2lvbiBuaWwpCisgICAgICAgICAoYnVmIChjdXJyZW50LWJ1ZmZlcikpKQorICAg ICh3aGVuIChhbmQgcmVnaW9uIGxhc3QtcmVnaW9uKQorICAgICAgKHNldHEgcmVnaW9uIChj b25zIChtaW4gKGNhciByZWdpb24pIChjYXIgbGFzdC1yZWdpb24pKQorICAgICAgICAgICAg ICAgICAgICAgICAgIChtYXggKGNkciByZWdpb24pIChjZHIgbGFzdC1yZWdpb24pKSkpKQor ICAgIChjb25kCisgICAgICgoYW5kIChlZ2xvdC1zZXJ2ZXItY2FwYWJsZSA6c2VtYW50aWNU b2tlbnNQcm92aWRlciA6ZnVsbCA6ZGVsdGEpCisgICAgICAgICAgIChsZXQgKChyZXNwb25z ZSAocGxpc3QtZ2V0IGVnbG90LS1zZW10b2stY2FjaGUgOnJlc3BvbnNlKSkpCisgICAgICAg ICAgICAgKGFuZCAocGxpc3QtZ2V0IHJlc3BvbnNlIDpyZXN1bHRJZCkgKHBsaXN0LWdldCBy ZXNwb25zZSA6ZGF0YSkKKyAgICAgICAgICAgICAgICAgIChub3QgKHBsaXN0LWdldCBlZ2xv dC0tc2VtdG9rLWNhY2hlIDpyZWdpb24pKSkpKQorICAgICAgKHNldHEgbWV0aG9kIDp0ZXh0 RG9jdW1lbnQvc2VtYW50aWNUb2tlbnMvZnVsbC9kZWx0YSkKKyAgICAgIChzZXRxIHJlc3Bv bnNlLWhhbmRsZXIgIydlZ2xvdC0tc2VtdG9rLWluZ2VzdC1mdWxsL2RlbHRhLXJlc3BvbnNl KQorICAgICAgKHNldHEgcGFyYW1zCisgICAgICAgICAgICAocGxpc3QtcHV0IHBhcmFtcyA6 cHJldmlvdXNSZXN1bHRJZAorICAgICAgICAgICAgICAgICAgICAgICAocGxpc3QtZ2V0IChw bGlzdC1nZXQgZWdsb3QtLXNlbXRvay1jYWNoZSA6cmVzcG9uc2UpIDpyZXN1bHRJZCkpKSkK KyAgICAgKChhbmQgcmVnaW9uIChlZ2xvdC1zZXJ2ZXItY2FwYWJsZSA6c2VtYW50aWNUb2tl bnNQcm92aWRlciA6cmFuZ2UpKQorICAgICAgKHNldHEgbWV0aG9kIDp0ZXh0RG9jdW1lbnQv c2VtYW50aWNUb2tlbnMvcmFuZ2UpCisgICAgICAoc2V0cSBmaW5hbC1yZWdpb24gcmVnaW9u KQorICAgICAgKHNldHEgcGFyYW1zCisgICAgICAgICAgICAocGxpc3QtcHV0IHBhcmFtcyA6 cmFuZ2UgKGVnbG90LXJlZ2lvbi1yYW5nZQorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAoY2FyIGZpbmFsLXJlZ2lvbikgKGNkciBmaW5hbC1yZWdpb24pKSkpCisg ICAgICAoc2V0cSByZXNwb25zZS1oYW5kbGVyICMnZWdsb3QtLXNlbXRvay1pbmdlc3QtcmFu Z2UtcmVzcG9uc2UpKSkKKyAgICAobGV0KiAoKGhhc2ggKGNvbnMgZWdsb3QtLXZlcnNpb25l ZC1pZGVudGlmaWVyIGZpbmFsLXJlZ2lvbikpKQorICAgICAgKHVubGVzcyAoZXF1YWwgbGFz dC1oYXNoIGhhc2gpCisgICAgICAgIChzZXRxIGVnbG90LS1zZW10b2stbGFzdC1yZXF1ZXN0 LWhhc2ggaGFzaCkKKyAgICAgICAgKGVnbG90LS1hc3luYy1yZXF1ZXN0CisgICAgICAgICAo ZWdsb3QtLWN1cnJlbnQtc2VydmVyLW9yLWxvc2UpIG1ldGhvZCBwYXJhbXMKKyAgICAgICAg IDpzdWNjZXNzLWZuCisgICAgICAgICAobGFtYmRhIChyZXNwb25zZSkKKyAgICAgICAgICAg KGVnbG90LS13aGVuLWxpdmUtYnVmZmVyIGJ1ZgorICAgICAgICAgICAgICh3aGVuIChlcSBo YXNoIGVnbG90LS1zZW10b2stbGFzdC1yZXF1ZXN0LWhhc2gpCisgICAgICAgICAgICAgICAo c2V0cSBlZ2xvdC0tc2VtdG9rLWxhc3QtcmVxdWVzdC1oYXNoIG5pbCkpCisgICAgICAgICAg ICAgKGVnbG90LS1zZW10b2stcHV0LWNhY2hlIDpkb2N1bWVudFZlcnNpb24gZWdsb3QtLXZl cnNpb25lZC1pZGVudGlmaWVyKQorICAgICAgICAgICAgIChlZ2xvdC0tc2VtdG9rLXB1dC1j YWNoZSA6cmVnaW9uIGZpbmFsLXJlZ2lvbikKKyAgICAgICAgICAgICAoZnVuY2FsbCByZXNw b25zZS1oYW5kbGVyIHJlc3BvbnNlKQorICAgICAgICAgICAgICh3aGVuIGZvbnRpZnkgKGpp dC1sb2NrLXJlZm9udGlmeSAoY2FyLXNhZmUgcmVnaW9uKSAoY2RyLXNhZmUgcmVnaW9uKSkp CisgICAgICAgICAgICAgKHdoZW4gZmluYWwtcmVnaW9uIChlZ2xvdC0tc2VtdG9rLXJlcXVl c3QtZnVsbC1vbi1pZGxlKSkpKQorICAgICAgICAgOmhpbnQgIydlZ2xvdC0tc2VtdG9rLXJl cXVlc3QpKSkpKQorCisoZGVmdW4gZWdsb3QtLXNlbXRvay1mb250aWZ5IChiZWcgZW5kKQor ICAiQXBwbHkgdGhlIGNhY2hlZCBzZW1hbnRpYyB0b2tlbnMgZnJvbSBCRUcgdG8gRU5ELiIK KyAgKHdpdGgtc2xvdHMgKChtb2RpZmllci1jYWNoZSBzZW10b2stbW9kaWZpZXItY2FjaGUp CisgICAgICAgICAgICAgICAoZmFjZXMgc2VtdG9rLWZhY2VzKQorICAgICAgICAgICAgICAg KG1vZGlmaWVyLWZhY2VzIHNlbXRvay1tb2RpZmllci1mYWNlcykpCisgICAgICAoZWdsb3Qt Y3VycmVudC1zZXJ2ZXIpCisgICAgKGNvbmQKKyAgICAgKChub3QgKGFuZCBmYWNlcworICAg ICAgICAgICAgICAgIGVnbG90LS1zZW10b2stY2FjaGUKKyAgICAgICAgICAgICAgICAocGxp c3QtZ2V0IGVnbG90LS1zZW10b2stY2FjaGUgOnJlc3BvbnNlKQorICAgICAgICAgICAgICAg IChlcSBlZ2xvdC0tdmVyc2lvbmVkLWlkZW50aWZpZXIgKHBsaXN0LWdldCBlZ2xvdC0tc2Vt dG9rLWNhY2hlIDpkb2N1bWVudFZlcnNpb24pKSkpCisgICAgICAoZWdsb3QtLXNlbXRvay1y ZXF1ZXN0IChjb25zIGJlZyBlbmQpIHQpKQorICAgICAodAorICAgICAgOzsgaWYgd2UncmUg dXNpbmcgdGhlIHJlc3BvbnNlIHRvIGEgcmFuZ2VkIHJlcXVlc3QsIHdlJ2xsIG9ubHkgYmUg YWJsZSB0byBmb250aWZ5IHdpdGhpbgorICAgICAgOzsgdGhhdCByYW5nZSAoYW5kIGhlbmNl IHNob3VsZG4ndCBjbGVhciBhbnkgaGlnaGxpZ2h0cyBvdXRzaWRlIG9mIHRoYXQgcmFuZ2Up CisgICAgICAod2hlbi1sZXQqICgodG9rZW4tcmVnaW9uIChwbGlzdC1nZXQgZWdsb3QtLXNl bXRvay1jYWNoZSA6cmVnaW9uKSkpCisgICAgICAgIChwcm9nbgorICAgICAgICAgICh3aGVu IChvciAoPCBiZWcgKGNhciB0b2tlbi1yZWdpb24pKQorICAgICAgICAgICAgICAgICAgICAo PiBlbmQgKGNkciB0b2tlbi1yZWdpb24pKSkKKyAgICAgICAgICAgIDs7IHRydW5jYXRlZCEg Y29udGludWUsIGJ1dCByZXF1ZXN0IGFnYWluCisgICAgICAgICAgICAoZWdsb3QtLXNlbXRv ay1yZXF1ZXN0IChjb25zIGJlZyBlbmQpIHQpKQorICAgICAgICAgIChzZXRxIGJlZyAobWF4 IGJlZyAoY2FyIHRva2VuLXJlZ2lvbikpKQorICAgICAgICAgIChzZXRxIGVuZCAobWluIGVu ZCAoY2RyIHRva2VuLXJlZ2lvbikpKSkpCisgICAgICAoZWdsb3QtLXdpZGVuaW5nCisgICAg ICAgICh3aXRoLXNpbGVudC1tb2RpZmljYXRpb25zCisgICAgICAgICAgKHJlbW92ZS1saXN0 LW9mLXRleHQtcHJvcGVydGllcyBiZWcgZW5kICcoZm9udC1sb2NrLWZhY2UpKQorICAgICAg ICAgIChsZXQqICgoaW5oaWJpdC1maWVsZC10ZXh0LW1vdGlvbiB0KQorICAgICAgICAgICAg ICAgICAoZGF0YSAocGxpc3QtZ2V0IChwbGlzdC1nZXQgZWdsb3QtLXNlbXRvay1jYWNoZSA6 cmVzcG9uc2UpIDpkYXRhKSkKKyAgICAgICAgICAgICAgICAgKGktbWF4IChsZW5ndGggZGF0 YSkpCisgICAgICAgICAgICAgICAgIChiZWctYm9sIChhbmQgKGdvdG8tY2hhciBiZWcpIChs aW5lLWJlZ2lubmluZy1wb3NpdGlvbikpKQorICAgICAgICAgICAgICAgICAocHJvcGVydHkt YmVnKQorICAgICAgICAgICAgICAgICAocHJvcGVydHktZW5kKSkKKyAgICAgICAgICAgIChn b3RvLWNoYXIgKHBvaW50LW1pbikpCisgICAgICAgICAgICAoY2wtZG8qICgoaSAwICgrIGkg NSkpIChjb2x1bW4gMCkpICgoPj0gaSBpLW1heCkpCisgICAgICAgICAgICAgICh3aGVuICg+ IChhcmVmIGRhdGEgaSkgMCkKKyAgICAgICAgICAgICAgICAoc2V0cSBjb2x1bW4gMCkKKyAg ICAgICAgICAgICAgICAoZm9yd2FyZC1saW5lIChhcmVmIGRhdGEgaSkpKQorICAgICAgICAg ICAgICAodW5sZXNzICg8IChwb2ludCkgYmVnLWJvbCkKKyAgICAgICAgICAgICAgICAoc2V0 cSBjb2x1bW4gKCsgY29sdW1uIChhcmVmIGRhdGEgKCsgaSAxKSkpKQorICAgICAgICAgICAg ICAgIChmdW5jYWxsIGVnbG90LW1vdmUtdG8tbGluZXBvcy1mdW5jdGlvbiBjb2x1bW4pCisg ICAgICAgICAgICAgICAgKHdoZW4gKD4gKHBvaW50KSBlbmQpIChjbC1yZXR1cm4pKQorICAg ICAgICAgICAgICAgIChzZXRxIHByb3BlcnR5LWJlZyAocG9pbnQpKQorICAgICAgICAgICAg ICAgIChmdW5jYWxsIGVnbG90LW1vdmUtdG8tbGluZXBvcy1mdW5jdGlvbiAoKyBjb2x1bW4g KGFyZWYgZGF0YSAoKyBpIDIpKSkpCisgICAgICAgICAgICAgICAgKHNldHEgcHJvcGVydHkt ZW5kIChwb2ludCkpCisgICAgICAgICAgICAgICAgKHdoZW4tbGV0KiAoKGZhY2UgKGFyZWYg ZmFjZXMgKGFyZWYgZGF0YSAoKyBpIDMpKSkpKQorICAgICAgICAgICAgICAgICAgKHB1dC10 ZXh0LXByb3BlcnR5IHByb3BlcnR5LWJlZyBwcm9wZXJ0eS1lbmQgJ2ZvbnQtbG9jay1mYWNl IGZhY2UpKQorICAgICAgICAgICAgICAgIChsZXQqICgoY29kZSAoYXJlZiBkYXRhICgrIGkg NCkpKQorICAgICAgICAgICAgICAgICAgICAgICAoZmFjZXMgKGdldGhhc2ggY29kZSBtb2Rp Zmllci1jYWNoZSAnbm90LWZvdW5kKSkpCisgICAgICAgICAgICAgICAgICAod2hlbiAoZXEg ZmFjZXMgJ25vdC1mb3VuZCkKKyAgICAgICAgICAgICAgICAgICAgKHNldHEgZmFjZXMgbmls KQorICAgICAgICAgICAgICAgICAgICAoY2wtbG9vcCBmb3IgaiBmcm9tIDAgYmVsb3cgKGxl bmd0aCBtb2RpZmllci1mYWNlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYg KD4gKGxvZ2FuZCBjb2RlIChhc2ggMSBqKSkgMCkKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgaWYgKGFyZWYgbW9kaWZpZXItZmFjZXMgaikKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgY29sbGVjdCAoYXJlZiBtb2RpZmllci1mYWNlcyBqKSBpbnRvIGZhY2VzKQor ICAgICAgICAgICAgICAgICAgICAocHV0aGFzaCBjb2RlIGZhY2VzIG1vZGlmaWVyLWNhY2hl KSkKKyAgICAgICAgICAgICAgICAgIChkb2xpc3QgKGZhY2UgZmFjZXMpCisgICAgICAgICAg ICAgICAgICAgIChwdXQtdGV4dC1wcm9wZXJ0eSBwcm9wZXJ0eS1iZWcgcHJvcGVydHktZW5k ICdmb250LWxvY2stZmFjZSBmYWNlKSkpKSkpKSkKKyAgICAgIGAoaml0LWxvY2stYm91bmRz ICxiZWcgLiAsZW5kKSkpKSkKKworKGRlZnVuIGVnbG90LS1zZW10b2stcmVxdWVzdC1mdWxs LW9uLWlkbGUgKCkKKyAgIk1ha2UgYSBmdWxsIHNlbWFudGljIHRva2VucyByZXF1ZXN0IGFm dGVyIGFuIGlkbGUgdGltZXIuIgorICAobGV0KiAoKGJ1ZiAoY3VycmVudC1idWZmZXIpKQor ICAgICAgICAgKGZ1biAobGFtYmRhICgpCisgICAgICAgICAgICAgICAgKGVnbG90LS13aGVu LWxpdmUtYnVmZmVyIGJ1ZgorICAgICAgICAgICAgICAgICAgKGVnbG90LS1zZW10b2stcmVx dWVzdCBuaWwpKSkpKQorICAgICh3aGVuIGVnbG90LS1zZW10b2staWRsZS10aW1lciAoY2Fu Y2VsLXRpbWVyIGVnbG90LS1zZW10b2staWRsZS10aW1lcikpCisgICAgKHNldHEgZWdsb3Qt LXNlbXRvay1pZGxlLXRpbWVyIChydW4td2l0aC1pZGxlLXRpbWVyICgqIDMgZWdsb3Qtc2Vu ZC1jaGFuZ2VzLWlkbGUtdGltZSkgbmlsIGZ1bikpKSkKKworKGRlZnVuIGVnbG90LS1zZW10 b2stb24tcmVmcmVzaCAoc2VydmVyKQorICAiQ2xlYXIgc2VtYW50aWMgdG9rZW5zIHdpdGhp biBhbGwgYnVmZmVycyBvZiBTRVJWRVIuIgorICAoY2wtbG9vcCBmb3IgYnVmZmVyIGluIChl Z2xvdC0tbWFuYWdlZC1idWZmZXJzIHNlcnZlcikgZG8KKyAgICAgICAgICAgKHdpdGgtY3Vy cmVudC1idWZmZXIgYnVmZmVyCisgICAgICAgICAgICAgKHNldHEgZWdsb3QtLXNlbXRvay1j YWNoZSBuaWwpCisgICAgICAgICAgICAgKGppdC1sb2NrLXJlZm9udGlmeSkpKSkKKworKGxl dCAoKGRlYm91bmNlLXRpbWVyIG5pbCkpCisgIChjbC1kZWZtZXRob2QgZWdsb3QtaGFuZGxl LXJlcXVlc3QKKyAgICAoc2VydmVyIChfbWV0aG9kIChlcWwgd29ya3NwYWNlL3NlbWFudGlj VG9rZW5zL3JlZnJlc2gpKSkKKyAgICAiSGFuZGxlIGEgc2VtYW50aWNUb2tlbnMvcmVmcmVz aCByZXF1ZXN0IGZyb20gU0VSVkVSLiIKKyAgICAod2hlbiBkZWJvdW5jZS10aW1lciAoY2Fu Y2VsLXRpbWVyIGRlYm91bmNlLXRpbWVyKSkKKyAgICAoc2V0cSBkZWJvdW5jZS10aW1lciAo cnVuLXdpdGgtdGltZXIgNSBuaWwgIydlZ2xvdC0tc2VtdG9rLW9uLXJlZnJlc2ggc2VydmVy KSkKKyAgICBuaWwpKQorCis7OyBJbml0aWFsaXphdGlvbgorKGRlZnVuIGVnbG90LS1zZW10 b2stYnVpbGQtZmFjZS1tYXAgKGlkZW50aWZpZXJzIGZhY2VzIGNhdGVnb3J5IHZhcm5hbWUp CisgICJCdWlsZCBtYXAgb2YgRkFDRVMgZm9yIElERU5USUZJRVJTIHVzaW5nIENBVEVHT1JZ IGFuZCBWQVJOQU1FLiIKKyAgKHZjb25jYXQKKyAgIChtYXBjYXIgKGxhbWJkYSAoaWQpCisg ICAgICAgICAgICAgKGxldCAoKG1heWJlLWZhY2UgKGNkciAoYXNzb2MgaWQgZmFjZXMpKSkp CisgICAgICAgICAgICAgICAod2hlbiAobm90IG1heWJlLWZhY2UpCisgICAgICAgICAgICAg ICAgIChkaXNwbGF5LXdhcm5pbmcKKyAgICAgICAgICAgICAgICAgICdlZ2xvdC1zZW10b2sK KyAgICAgICAgICAgICAgICAgIChmb3JtYXQtbWVzc2FnZSAiTm8gZmFjZSBoYXMgYmVlbiBh c3NvY2lhdGVkIHRvIHRoZSAlcyBgJXMnOiBjb25zaWRlciBhZGRpbmcgYSBjb3JyZXNwb25k aW5nIGRlZmluaXRpb24gdG8gJXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgY2F0ZWdvcnkgaWQgdmFybmFtZSkpKQorICAgICAgICAgICAgICAgbWF5YmUtZmFjZSkp CisgICAgICAgICAgIGlkZW50aWZpZXJzKSkpCisKKyhkZWZ1biBlZ2xvdC0tc2VtdG9rLWlu aXRpYWxpemUgKHNlcnZlcikKKyAgIkluaXRpYWxpemUgU0VSVkVSIGZvciBzZW1hbnRpYyB0 b2tlbnMuIgorICAoY2wtZGVzdHJ1Y3R1cmluZy1iaW5kICgma2V5IHRva2VuVHlwZXMgdG9r ZW5Nb2RpZmllcnMgJmFsbG93LW90aGVyLWtleXMpCisgICAgICAocGxpc3QtZ2V0IChwbGlz dC1nZXQgKGVnbG90LS1jYXBhYmlsaXRpZXMgc2VydmVyKQorICAgICAgICAgICAgICAgICAg ICAgICAgICAgIDpzZW1hbnRpY1Rva2Vuc1Byb3ZpZGVyKQorICAgICAgICAgICAgICAgICA6 bGVnZW5kKQorICAgIChvc2V0IHNlcnZlciBzZW10b2stZmFjZXMKKyAgICAgICAgICAoZWds b3QtLXNlbXRvay1idWlsZC1mYWNlLW1hcAorICAgICAgICAgICB0b2tlblR5cGVzIGVnbG90 LXNlbWFudGljLXRva2Vucy1mYWNlcworICAgICAgICAgICAic2VtYW50aWMgdG9rZW4iICJl Z2xvdC0tc2VtdG9rZmFjZXMiKSkKKyAgICAob3NldCBzZXJ2ZXIgc2VtdG9rLW1vZGlmaWVy LWZhY2VzCisgICAgICAgICAgKGVnbG90LS1zZW10b2stYnVpbGQtZmFjZS1tYXAKKyAgICAg ICAgICAgdG9rZW5Nb2RpZmllcnMgZWdsb3Qtc2VtYW50aWMtdG9rZW5zLW1vZGlmaWVyLWZh Y2VzCisgICAgICAgICAgICJzZW1hbnRpYyB0b2tlbiBtb2RpZmllciIgImVnbG90LS1zZW10 b2ttb2RpZmllci1mYWNlcyIpKSkpCisKKyhkZWZpbmUtbWlub3ItbW9kZSBlZ2xvdC1zZW1h bnRpYy10b2tlbnMtbW9kZQorICAiTWlub3IgbW9kZSBmb3IgZm9udGlmeWluZyBidWZmZXIg d2l0aCBMU1Agc2VydmVyJ3Mgc2VtYW50aWMgdG9rZW5zLiIKKyAgOmdsb2JhbCBuaWwKKyAg KGNvbmQgKGVnbG90LXNlbWFudGljLXRva2Vucy1tb2RlCisgICAgICAgICAoaWYgKGVnbG90 LXNlcnZlci1jYXBhYmxlIDpzZW1hbnRpY1Rva2Vuc1Byb3ZpZGVyKQorICAgICAgICAgICAg IChqaXQtbG9jay1yZWdpc3RlciAjJ2VnbG90LS1zZW10b2stZm9udGlmeSAnY29udGV4dHVh bCkKKyAgICAgICAgICAgKGVnbG90LXNlbWFudGljLXRva2Vucy1tb2RlIC0xKSkpCisgICAg ICAgICh0CisgICAgICAgICAoaml0LWxvY2stdW5yZWdpc3RlciAjJ2VnbG90LS1zZW10b2st Zm9udGlmeSkKKyAgICAgICAgICh3aXRoLXNpbGVudC1tb2RpZmljYXRpb25zCisgICAgICAg ICAgIChyZW1vdmUtbGlzdC1vZi10ZXh0LXByb3BlcnRpZXMgKHBvaW50LW1pbikgKHBvaW50 LW1heCkgJyhmb250LWxvY2stZmFjZSkpKSkpKQorCiAMCiA7OzsgQ2FsbCBhbmQgdHlwZSBo aWVyYXJjaGllcwogKHJlcXVpcmUgJ2J1dHRvbikKQEAgLTQ3MjgsNyArNTA0OCw4IEBAIElm IE5PRVJST1IsIHJldHVybiBwcmVkaWNhdGUsIGVsc2UgZXJyb3JpbmcgZnVuY3Rpb24uIgog OzsgaGFyZGVyLiBGb3Igbm93LCB1c2UgYHdpdGgtZXZhbC1hZnRlci1sb2FkJy4gU2VlIGFs c28gZ2l0aHViIzExODMuCiAod2l0aC1ldmFsLWFmdGVyLWxvYWQgJ2Rlc2t0b3AKICAgKGFk ZC10by1saXN0ICdkZXNrdG9wLW1pbm9yLW1vZGUtaGFuZGxlcnMgJyhlZ2xvdC0tbWFuYWdl ZC1tb2RlIC4gaWdub3JlKSkKLSAgKGFkZC10by1saXN0ICdkZXNrdG9wLW1pbm9yLW1vZGUt aGFuZGxlcnMgJyhlZ2xvdC1pbmxheS1oaW50cy1tb2RlIC4gaWdub3JlKSkpCisgIChhZGQt dG8tbGlzdCAnZGVza3RvcC1taW5vci1tb2RlLWhhbmRsZXJzICcoZWdsb3QtaW5sYXktaGlu dHMtbW9kZSAuIGlnbm9yZSkpCisgIChhZGQtdG8tbGlzdCAnZGVza3RvcC1taW5vci1tb2Rl LWhhbmRsZXJzICcoZWdsb3Qtc2VtdG9rLW1vZGUgLiBpZ25vcmUpKSkKIAogDAogOzs7IE1p c2MKQEAgLTQ3NTcsNiArNTA3OCw3IEBAIElmIE5PRVJST1IsIHJldHVybiBwcmVkaWNhdGUs IGVsc2UgZXJyb3JpbmcgZnVuY3Rpb24uIgogICAgICAgICAgICAgICAgZWdsb3QtZm9ybWF0 CiAgICAgICAgICAgICAgICBlZ2xvdC1mb3JtYXQtYnVmZmVyCiAgICAgICAgICAgICAgICBl Z2xvdC1pbmxheS1oaW50cy1tb2RlCisgICAgICAgICAgICAgICBlZ2xvdC1zZW1hbnRpYy10 b2tlbnMtbW9kZQogICAgICAgICAgICAgICAgZWdsb3QtcmVjb25uZWN0CiAgICAgICAgICAg ICAgICBlZ2xvdC1yZW5hbWUKICAgICAgICAgICAgICAgIGVnbG90LXNpZ25hbC1kaWRDaGFu Z2VDb25maWd1cmF0aW9uCi0tIAoyLjUxLjAKCg== --------------g0J6nJdLcckbJYpGJXcUemsd-- From unknown Sat Sep 13 11:38:41 2025 X-Loop: help-debbugs@gnu.org Subject: bug#79374: [PATCH] eglot: add support for semantic tokens Resent-From: Philip Kaludercic Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Wed, 03 Sep 2025 08:02:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 79374 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: "Lua V. R." Cc: 79374@debbugs.gnu.org, =?UTF-8?Q?Jo=C3=A3o_?= =?UTF-8?Q?T=C3=A1vora?= Received: via spool by 79374-submit@debbugs.gnu.org id=B79374.175688648830226 (code B ref 79374); Wed, 03 Sep 2025 08:02:01 +0000 Received: (at 79374) by debbugs.gnu.org; 3 Sep 2025 08:01:28 +0000 Received: from localhost ([127.0.0.1]:38399 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1utiQp-0007rQ-Os for submit@debbugs.gnu.org; Wed, 03 Sep 2025 04:01:28 -0400 Received: from mout01.posteo.de ([185.67.36.65]:47515) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1utiQn-0007rA-4m for 79374@debbugs.gnu.org; Wed, 03 Sep 2025 04:01:26 -0400 Received: from submission (posteo.de [185.67.36.169]) by mout01.posteo.de (Postfix) with ESMTPS id 50F87240028 for <79374@debbugs.gnu.org>; Wed, 3 Sep 2025 10:01:18 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=posteo.net; s=2017; t=1756886478; bh=LTlgDZEuo9ngMOZobm+TSiDQrdSAqYUNV3zcoQDguzo=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version:Content-Type: From; b=eJfQJg9iZg9imNZO4CzBoj9APBiZcksF5Qk9zmXRujVm3r2e9i1QlOMidEclO+O6U pKWiCV+MNRnvzUWo3TiPgGwbPhXJQfFo/1fF4XlKB6yAR6/bUehuAplUWp6FLMtPOY B+WuFNqU/spmqhIKFlYWR7CGs8I/olv8z4ozTmmt0GMuKwguVT3XXhYOhGWT0PIUBX i6/65MzMmEsM+KwiMpWyobDmQjC2N+KhwYNLXtTqVO/aLEuGnZIRLkYxpjUEHCz3dK ZW/s3LEWwcxvwgA91+TQZpEe+NTTH6I3JLX8lGSwv2b21/S0F0H8fLrE6qs3Qj/Tz7 EppG5YLlJvTyA== Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 4cGw6P4cQ3z6tx5; Wed, 3 Sep 2025 10:01:17 +0200 (CEST) From: Philip Kaludercic In-Reply-To: <2c03b490-5006-4ad4-a090-fafc8a18405d@lua.blog.br> References: <2c03b490-5006-4ad4-a090-fafc8a18405d@lua.blog.br> Date: Wed, 03 Sep 2025 08:01:18 +0000 Message-ID: <87ecsoc6cz.fsf@posteo.net> MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -2.3 (--) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) "Lua V. R." writes: [...] > +(define-minor-mode eglot-semantic-tokens-mode > + "Minor mode for fontifying buffer with LSP server's semantic tokens." > + :global nil > + (cond (eglot-semantic-tokens-mode > + (if (eglot-server-capable :semanticTokensProvider) > + (jit-lock-register #'eglot--semtok-fontify 'contextual) > + (eglot-semantic-tokens-mode -1))) > + (t > + (jit-lock-unregister #'eglot--semtok-fontify) > + (with-silent-modifications > + (remove-list-of-text-properties (point-min) (point-max) '(font-lock-face)))))) > + > > ;;; Call and type hierarchies > (require 'button) > @@ -4728,7 +5048,8 @@ If NOERROR, return predicate, else erroring function." > ;; harder. For now, use `with-eval-after-load'. See also github#1183. > (with-eval-after-load 'desktop > (add-to-list 'desktop-minor-mode-handlers '(eglot--managed-mode . ignore)) > - (add-to-list 'desktop-minor-mode-handlers '(eglot-inlay-hints-mode . ignore))) > + (add-to-list 'desktop-minor-mode-handlers '(eglot-inlay-hints-mode . ignore)) > + (add-to-list 'desktop-minor-mode-handlers '(eglot-semtok-mode . ignore))) ^ As mentioned on Emacs-devel, shouldn't this be `eglot-semantic-tokens-mode'. (Also, this is of course not a detailed review I just skimmed over the code this morning, but for the most part it looks good!) [...] -- Philip Kaludercic From unknown Sat Sep 13 11:38:41 2025 X-Loop: help-debbugs@gnu.org Subject: bug#79374: [PATCH] eglot: add support for semantic tokens Resent-From: "Lua V. R." Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 04 Sep 2025 00:04:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 79374 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Philip Kaludercic Cc: 79374@debbugs.gnu.org, =?UTF-8?Q?Jo=C3=A3o_?= =?UTF-8?Q?T=C3=A1vora?= Reply-To: me@lua.blog.br Received: via spool by 79374-submit@debbugs.gnu.org id=B79374.17569441845096 (code B ref 79374); Thu, 04 Sep 2025 00:04:02 +0000 Received: (at 79374) by debbugs.gnu.org; 4 Sep 2025 00:03:04 +0000 Received: from localhost ([127.0.0.1]:43700 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1utxRO-0001Jr-1O for submit@debbugs.gnu.org; Wed, 03 Sep 2025 20:03:03 -0400 Received: from poodle.tulip.relay.mailchannels.net ([23.83.218.249]:60591) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1utxRJ-0001JU-NZ for 79374@debbugs.gnu.org; Wed, 03 Sep 2025 20:03:00 -0400 X-Sender-Id: hostingeremailsmtpin|x-authuser|lua@lua.blog.br Received: from relay.mailchannels.net (localhost [127.0.0.1]) by relay.mailchannels.net (Postfix) with ESMTP id 11925903CAE; Thu, 4 Sep 2025 00:02:55 +0000 (UTC) Received: from fr-int-smtpout27.hostinger.io (trex-blue-0.trex.outbound.svc.cluster.local [100.102.62.95]) (Authenticated sender: hostingeremailsmtpin) by relay.mailchannels.net (Postfix) with ESMTPA id D4EAC9045C8; Thu, 4 Sep 2025 00:02:53 +0000 (UTC) ARC-Seal: i=1; s=arc-2022; d=mailchannels.net; t=1756944174; a=rsa-sha256; cv=none; b=CEOpx0iBSyfAKPiNbiw0Gu7AyL6g5symnEnvLW1yN4JXsEYvvcUvt/6tE2cX8+Fj3f4/Ah ns2XETxuNtoUwBndgc8dRM07KskcnBo6+a62Ug+nQsGcinpJ6YEly2ynP7U1kkvqMSbyz3 fwtN5y+09yenB/tWqoCz/UpZ+9seD4jjef9FAhKP+6WBDX820N73p5NoF+mUiDiY8iroDD S/m1Fpy1lIgncTqZ+u6sPwk+LplLAlyQSEoUVabMyv0MkMqtQeaERr37SFAucrUkGxrill BN4PJfvbbBl88cpmp2qRJkOYO30SpJqeueU+DNWSS308TmU6y+xtISQ3w3Cerw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=mailchannels.net; s=arc-2022; t=1756944174; h=from:from:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:in-reply-to:in-reply-to: references:references:dkim-signature; bh=S9EqPSXjyRw+1qIzD8PXIoNnCd9Ex2F6h6Q72+x12rI=; b=CHxQtjRT2YWnRmrX6zPMOzK8jopytr0Ab5+Ta2e0PPEK4q9WG/dhAezMmotjA4I6C0hkmS zvZmJjSTt+kf/iXdIH0a+tPZQknnDxmatQIC+p9mKEAgI2SNGaEFaDEPV6LIoSmtkE40xO I3zHN6Gm3Mswi8PU68H1TnOYJdl64KgG0eESnujgxntCfRl/83fKTyk7AhGWK9f+MjbUMo c9zAyFsYMfotXXfrxpeXG76jafcQU0KTjUR/b3vBRNwiu2QB+WsvYSIjfjJYVuDv2StmDW f1FK0ntOw8Y43w4vrOG2lHdjK/07piipMeCrNvpqvxu2T52rpePcBdgUJ1ufPg== ARC-Authentication-Results: i=1; rspamd-8b9589799-sm6tm; auth=pass smtp.auth=hostingeremailsmtpin smtp.mailfrom=me@lua.blog.br X-Sender-Id: hostingeremailsmtpin|x-authuser|lua@lua.blog.br X-MC-Relay: Neutral X-MailChannels-SenderId: hostingeremailsmtpin|x-authuser|lua@lua.blog.br X-MailChannels-Auth-Id: hostingeremailsmtpin X-Chemical-Wide-Eyed: 16757e6d20a8499e_1756944174842_2169012794 X-MC-Loop-Signature: 1756944174842:3667252319 X-MC-Ingress-Time: 1756944174842 Received: from fr-int-smtpout27.hostinger.io ([UNAVAILABLE]. [148.222.54.8]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384) by 100.102.62.95 (trex/7.1.3); Thu, 04 Sep 2025 00:02:54 +0000 Received: from [IPV6:2804:14d:8084:a662::db8f] (unknown [IPv6:2804:14d:8084:a662::db8f]) (Authenticated sender: lua@lua.blog.br) by smtp.hostinger.com (smtp.hostinger.com) with ESMTPSA id 4cHKRv2hlgz2yhn; Thu, 4 Sep 2025 00:02:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lua.blog.br; s=hostingermail-a; t=1756944172; h=from:from:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:in-reply-to:in-reply-to: references:references; bh=S9EqPSXjyRw+1qIzD8PXIoNnCd9Ex2F6h6Q72+x12rI=; b=CKEt+dXwwOBzG+K7E1ODaVp8oU2FujWaAVFhZdeWw0BnPZeRZnC5oU25lT3xCf15pIXtRa wQpRheT3OMlmeO97WMenqT2KLdPubXmTaEMEmKrbutGCMFr+hpqSr24j/bUu4mIAm/gg+q vMitMvFon1PDxaTaoyZKChH72dn2dzB6FdjiN1Ds7Qr5BpbndnUwzeD5JeKf70nhlegOUG DhjZj0VMiYK81PpmkjAcyPM1A1r3MTcVy6Z9g8YP2ilYPOBh7d0HNrNSOzpnzwrZr/bXgN sb1JIDqAc0Acc79POB0DdBZSD/wgzco3UHJX78wlmsqgc+cx8gT7Bbp2hwRvQw== Content-Type: multipart/mixed; boundary="------------inAXX13i0ODSZQVny1l1Heua" Message-ID: MIME-Version: 1.0 User-Agent: Betterbird (Linux) References: <2c03b490-5006-4ad4-a090-fafc8a18405d@lua.blog.br> <87ecsoc6cz.fsf@posteo.net> Content-Language: en-US, pt-BR From: "Lua V. R." In-Reply-To: <87ecsoc6cz.fsf@posteo.net> Date: Thu, 4 Sep 2025 00:02:51 +0000 (UTC) X-CM-Analysis: v=2.4 cv=DJTd4DNb c=1 sm=1 tr=0 ts=68b8d72c a=AE7tfnPL9jKFtS+MZ9Z/2w==:617 a=xqWC_Br6kY4A:10 a=r77TgQKjGQsHNAKrUKIA:9 a=gOsM90wFzwEAMpLDgvgA:9 a=QEXdDO2ut3YA:10 a=ZXulRonScM0A:10 a=zZCYzV9kfG8A:10 a=YlruJXNrF_IqJ07b8VgA:9 a=B2y7HmGcmWMA:10 X-CM-Envelope: MS4xfGlW8yDnZvlwwUHvP063i6EvCn3OgT9l6uO0CHc5Wk4h7l9FPG7l2bwybyTVhAyd3anDedm3TqIAq3oZDuTRYO1YWFX1gRA6m/xZFl8CckIaMvamsFHH uuJdwGJRqp7fyjy0/1oJCI0keYd6xqPpi6WwaU3MCL5h+mw+7NhY5V5+xmP661muN3RJKbe17La69wlzbLZMGCQrbf6dlz6DGEgG5GoP94P5WTmSLujCXYlq bHY78vSpv3z7SLco9kJafxkuiJDwWJbpXVVodFFDg6ZPkHJagZhae0LBvvQeAiaV X-AuthUser: lua@lua.blog.br X-Spam-Score: 3.6 (+++) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: Hi Philip, Em 03/09/2025 05:01, Philip Kaludercic escreveu: > As mentioned on Emacs-devel, shouldn't this be `eglot-semantic-tokens-mode'. Thanks for catching this :) I fixed it among other things, and I apologi [...] Content analysis details: (3.6 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 3.6 RCVD_IN_SBL_CSS RBL: Received via a relay in Spamhaus SBL-CSS [2804:14d:8084:a662:0:0:0:db8f listed in] [zen.spamhaus.org] 0.0 RCVD_IN_VALIDITY_CERTIFIED_BLOCKED RBL: ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. [23.83.218.249 listed in sa-trusted.bondedsender.org] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record 0.0 RCVD_IN_MSPIKE_H2 RBL: Average reputation (+2) [23.83.218.249 listed in wl.mailspike.net] -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [23.83.218.249 listed in list.dnswl.org] 0.0 RCVD_IN_VALIDITY_RPBL_BLOCKED RBL: ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. [23.83.218.249 listed in bl.score.senderscore.com] X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 2.6 (++) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: Hi Philip, Em 03/09/2025 05:01, Philip Kaludercic escreveu: > As mentioned on Emacs-devel, shouldn't this be `eglot-semantic-tokens-mode'. Thanks for catching this :) I fixed it among other things, and I apologi [...] Content analysis details: (2.6 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 0.0 RCVD_IN_VALIDITY_CERTIFIED_BLOCKED RBL: ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. [23.83.218.249 listed in sa-accredit.habeas.com] -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [23.83.218.249 listed in list.dnswl.org] 3.6 RCVD_IN_SBL_CSS RBL: Received via a relay in Spamhaus SBL-CSS [2804:14d:8084:a662:0:0:0:db8f listed in] [zen.spamhaus.org] 0.0 RCVD_IN_VALIDITY_RPBL_BLOCKED RBL: ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. [23.83.218.249 listed in bl.score.senderscore.com] 0.0 RCVD_IN_MSPIKE_H2 RBL: Average reputation (+2) [23.83.218.249 listed in wl.mailspike.net] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -1.0 MAILING_LIST_MULTI Multiple indicators imply a widely-seen list manager This is a multi-part message in MIME format. --------------inAXX13i0ODSZQVny1l1Heua Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hi Philip, Em 03/09/2025 05:01, Philip Kaludercic escreveu: > As mentioned on Emacs-devel, shouldn't this be `eglot-semantic-tokens-mode'. Thanks for catching this :) I fixed it among other things, and I apologize for being unfamiliar with the e-mail git workflow. I don't know if I should send a patch on top of the previous patch, but I'm sending a squashed one. In this new patch I also removed a "hash" I used in attempt to avoid a burst of requests, because it was not working in some particular situations (I can explain if you want). Now, due to how jit-lock works, Eglot may send two requests after a didChange if the server does not support delta requests. But this was also the case in the version with the hash, so alas, it was just complicating things. --------------inAXX13i0ODSZQVny1l1Heua Content-Type: text/x-patch; charset=UTF-8; name="0001-add-semantic-tokens-support-for-eglot.patch" Content-Disposition: attachment; filename="0001-add-semantic-tokens-support-for-eglot.patch" Content-Transfer-Encoding: base64 RnJvbSAzMjQ3MWM0YTBmYzljYTgwYWU4ZDNjMjk5YTNiZDU1NTgxZjhjYjA0IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBMdWEgVmlhbmEgUmVpcyA8bWVAbHVhLmJsb2cuYnI+ CkRhdGU6IFR1ZSwgMiBTZXAgMjAyNSAxOTowMzo1MiAtMDMwMApTdWJqZWN0OiBbUEFUQ0hd IGFkZCBzZW1hbnRpYyB0b2tlbnMgc3VwcG9ydCBmb3IgZWdsb3QKCi0tLQogbGlzcC9wcm9n bW9kZXMvZWdsb3QuZWwgfCAzMTYgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrLQogMSBmaWxlIGNoYW5nZWQsIDMxMyBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9u cygtKQoKZGlmZiAtLWdpdCBhL2xpc3AvcHJvZ21vZGVzL2VnbG90LmVsIGIvbGlzcC9wcm9n bW9kZXMvZWdsb3QuZWwKaW5kZXggNDc1YjVlMTNmMS4uMWQ5ZmI3OTA1ZCAxMDA2NDQKLS0t IGEvbGlzcC9wcm9nbW9kZXMvZWdsb3QuZWwKKysrIGIvbGlzcC9wcm9nbW9kZXMvZWdsb3Qu ZWwKQEAgLTE0MSw2ICsxNDEsOCBAQAogKGRlZnZhciBjb21wYW55LXRvb2x0aXAtYWxpZ24t YW5ub3RhdGlvbnMpCiAoZGVmdmFyIHRyYW1wLXNzaC1jb250cm9sbWFzdGVyLW9wdGlvbnMp CiAoZGVmdmFyIHRyYW1wLXVzZS1zc2gtY29udHJvbG1hc3Rlci1vcHRpb25zKQorKGRlZnZh ciBlZ2xvdC1zZW1hbnRpYy10b2tlbnMtZmFjZXMpCisoZGVmdmFyIGVnbG90LXNlbWFudGlj LXRva2Vucy1tb2RpZmllci1mYWNlcykKIAogDAogOzs7IE9ic29sZXRlIGFsaWFzZXMKQEAg LTEwMTcsNiArMTAxOSw3IEBAIG9iamVjdC4iCiAgICAgICAgICAgICAgICAgICAgICAgICBg KDpkeW5hbWljUmVnaXN0cmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICwoaWYg KGVnbG90LS10cmFtcGlzaC1wIHMpIDpqc29uLWZhbHNlIHQpKQogICAgICAgICAgICAgICAg ICAgICAgICAgOnN5bWJvbCBgKDpkeW5hbWljUmVnaXN0cmF0aW9uIDpqc29uLWZhbHNlKQor ICAgICAgICAgICAgICAgICAgICAgICAgOnNlbWFudGljVG9rZW5zICcoOnJlZnJlc2hTdXBw b3J0IHQpCiAgICAgICAgICAgICAgICAgICAgICAgICA6Y29uZmlndXJhdGlvbiB0CiAgICAg ICAgICAgICAgICAgICAgICAgICA6d29ya3NwYWNlRm9sZGVycyB0KQogICAgICAgICAgICAg OnRleHREb2N1bWVudApAQCAtMTA3OSw2ICsxMDgyLDEzIEBAIG9iamVjdC4iCiAgICAgICAg ICAgICAgOmZvcm1hdHRpbmcgICAgICAgICBgKDpkeW5hbWljUmVnaXN0cmF0aW9uIDpqc29u LWZhbHNlKQogICAgICAgICAgICAgIDpyYW5nZUZvcm1hdHRpbmcgICAgYCg6ZHluYW1pY1Jl Z2lzdHJhdGlvbiA6anNvbi1mYWxzZSkKICAgICAgICAgICAgICA6cmVuYW1lICAgICAgICAg ICAgIGAoOmR5bmFtaWNSZWdpc3RyYXRpb24gOmpzb24tZmFsc2UpCisgICAgICAgICAgICAg OnNlbWFudGljVG9rZW5zICAgICBgKDpkeW5hbWljUmVnaXN0cmF0aW9uIDpqc29uLWZhbHNl CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpyZXF1ZXN0cyAnKDpyYW5n ZSB0IDpmdWxsICg6ZGVsdGEgdCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIDp0b2tlbk1vZGlmaWVycyBbLEAobWFwY2FyICMnY2FyIGVnbG90LXNlbWFudGljLXRv a2Vucy1tb2RpZmllci1mYWNlcyldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIDpvdmVybGFwcGluZ1Rva2VuU3VwcG9ydCB0CisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIDptdWx0aWxpbmVUb2tlblN1cHBvcnQgdAorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICA6dG9rZW5UeXBlcyBbLEAobWFwY2FyICMnY2FyIGVnbG90 LXNlbWFudGljLXRva2Vucy1mYWNlcyldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDpmb3JtYXRzIFsicmVsYXRpdmUiXSkKICAgICAgICAgICAgICA6aW5sYXlIaW50 ICAgICAgICAgIGAoOmR5bmFtaWNSZWdpc3RyYXRpb24gOmpzb24tZmFsc2UpCiAgICAgICAg ICAgICAgOmNhbGxIaWVyYXJjaHkgICAgICBgKDpkeW5hbWljUmVnaXN0cmF0aW9uIDpqc29u LWZhbHNlKQogICAgICAgICAgICAgIDp0eXBlSGllcmFyY2h5ICAgICAgYCg6ZHluYW1pY1Jl Z2lzdHJhdGlvbiA6anNvbi1mYWxzZSkKQEAgLTExNDksNyArMTE1OSwxNiBAQCBvYmplY3Qu IgogICAgIDphY2Nlc3NvciBlZ2xvdC0tbWFuYWdlZC1idWZmZXJzKQogICAgKHNhdmVkLWlu aXRhcmdzCiAgICAgOmRvY3VtZW50YXRpb24gIlNhdmVkIGluaXRhcmdzIGZvciByZWNvbm5l Y3Rpb24gcHVycG9zZXMuIgotICAgIDphY2Nlc3NvciBlZ2xvdC0tc2F2ZWQtaW5pdGFyZ3Mp KQorICAgIDphY2Nlc3NvciBlZ2xvdC0tc2F2ZWQtaW5pdGFyZ3MpCisgICAoc2VtdG9rLWZh Y2VzCisgICAgOmluaXRmb3JtIG5pbAorICAgIDpkb2N1bWVudGF0aW9uICJTZW1hbnRpYyB0 b2tlbnMgZmFjZXMuIikKKyAgIChzZW10b2stbW9kaWZpZXItZmFjZXMKKyAgICA6aW5pdGZv cm0gbmlsCisgICAgOmRvY3VtZW50YXRpb24gIlNlbWFudGljIHRva2VucyBtb2RpZmllciBm YWNlcy4iKQorICAgKHNlbXRvay1tb2RpZmllci1jYWNoZQorICAgIDppbml0Zm9ybSAobWFr ZS1oYXNoLXRhYmxlKQorICAgIDpkb2N1bWVudGF0aW9uICJBIGhhc2htYXAgb2YgbW9kaWZp ZXIgdmFsdWVzIHRvIHRoZSBzZWxlY3RlZCBmYWNlcy4iKSkKICAgOmRvY3VtZW50YXRpb24K ICAgIlJlcHJlc2VudHMgYSBzZXJ2ZXIuIFdyYXBzIGEgcHJvY2VzcyBmb3IgTFNQIGNvbW11 bmljYXRpb24uIikKIApAQCAtMTIxMSw2ICsxMjMwLDExIEBAIElmIG9wdGlvbmFsIE1BUktF UlMsIG1ha2UgbWFya2VycyBpbnN0ZWFkLiIKICAgICAgICAgIChlbmQgKGVnbG90LS1sc3At cG9zaXRpb24tdG8tcG9pbnQgKHBsaXN0LWdldCByYW5nZSA6ZW5kKSBtYXJrZXJzKSkpCiAg ICAgKGNvbnMgYmVnIGVuZCkpKQogCisoZGVmdW4gZWdsb3QtcmVnaW9uLXJhbmdlIChiZWcg ZW5kKQorICAiUmV0dXJuIGEgTFNQIHJhbmdlIHJlcHJlc2VudGluZyByZWdpb24gQkVHIHRv IEVORC4iCisgIChsaXN0IDpzdGFydCAoZWdsb3QtLXBvcy10by1sc3AtcG9zaXRpb24gYmVn KQorICAgICAgICA6ZW5kIChlZ2xvdC0tcG9zLXRvLWxzcC1wb3NpdGlvbiBlbmQpKSkKKwog KGRlZnVuIGVnbG90LXNlcnZlci1jYXBhYmxlICgmcmVzdCBmZWF0cykKICAgIkRldGVybWlu ZSBpZiBjdXJyZW50IHNlcnZlciBpcyBjYXBhYmxlIG9mIEZFQVRTLiIKICAgKHVubGVzcyAo Y2wtc29tZSAobGFtYmRhIChmZWF0KQpAQCAtMTU3Niw3ICsxNjAwLDggQEAgVXNlIGN1cnJl bnQgc2VydmVyJ3Mgb3IgZmlyc3QgYXZhaWxhYmxlIEVnbG90IGV2ZW50cyBidWZmZXIuIgog ICAoanNvbnJwYy1mb3JnZXQtcGVuZGluZy1jb250aW51YXRpb25zIHNlcnZlcikpCiAKIChk ZWZ2YXIgZWdsb3QtY29ubmVjdC1ob29rCi0gICcoZWdsb3Qtc2lnbmFsLWRpZENoYW5nZUNv bmZpZ3VyYXRpb24pCisgICcoZWdsb3Qtc2lnbmFsLWRpZENoYW5nZUNvbmZpZ3VyYXRpb24K KyAgICBlZ2xvdC0tc2VtdG9rLWluaXRpYWxpemUpCiAgICJIb29rIHJ1biBhZnRlciBjb25u ZWN0aW5nIHRvIGEgc2VydmVyLgogRWFjaCBmdW5jdGlvbiBpcyBwYXNzZWQgYW4gYGVnbG90 LWxzcC1zZXJ2ZXInIGluc3RhbmNlCiBhcyBhcmd1bWVudC4iKQpAQCAtMjI5MSw2ICsyMzE2 LDcgQEAgSWYgaXQgaXMgYWN0aXZhdGVkLCBhbHNvIHNpZ25hbCB0ZXh0RG9jdW1lbnQvZGlk T3Blbi4iCiAgICAgICA7OyBSdW4gdXNlciBob29rIGFmdGVyICd0ZXh0RG9jdW1lbnQvZGlk T3Blbicgc28gc2VydmVyIGtub3dzCiAgICAgICA7OyBhYm91dCB0aGUgYnVmZmVyLgogICAg ICAgKGVnbG90LWlubGF5LWhpbnRzLW1vZGUgMSkKKyAgICAgIChlZ2xvdC1zZW1hbnRpYy10 b2tlbnMtbW9kZSAxKQogICAgICAgKHJ1bi1ob29rcyAnZWdsb3QtbWFuYWdlZC1tb2RlLWhv b2spKSkpCiAKIChhZGQtaG9vayAnYWZ0ZXItY2hhbmdlLW1ham9yLW1vZGUtaG9vayAjJ2Vn bG90LS1tYXliZS1hY3RpdmF0ZS1lZGl0aW5nLW1vZGUpCkBAIC00NDk0LDYgKzQ1MjAsMjg4 IEBAIElmIE5PRVJST1IsIHJldHVybiBwcmVkaWNhdGUsIGVsc2UgZXJyb3JpbmcgZnVuY3Rp b24uIgogICAgICAgICAgKGppdC1sb2NrLXVucmVnaXN0ZXIgIydlZ2xvdC0tdXBkYXRlLWhp bnRzKQogICAgICAgICAgKHJlbW92ZS1vdmVybGF5cyBuaWwgbmlsICdlZ2xvdC0taW5sYXkt aGludCB0KSkpKQogCisMCis7OzsgU2VtYW50aWMgdG9rZW5zCisKKyhkZWZjdXN0b20gZWds b3Qtc2VtYW50aWMtdG9rZW5zLWZhY2VzCisgICcoKCJuYW1lc3BhY2UiIC4gZm9udC1sb2Nr LWtleXdvcmQtZmFjZSkKKyAgICAoInR5cGUiIC4gZm9udC1sb2NrLXR5cGUtZmFjZSkKKyAg ICAoImNsYXNzIiAuIGZvbnQtbG9jay10eXBlLWZhY2UpCisgICAgKCJlbnVtIiAuIGZvbnQt bG9jay10eXBlLWZhY2UpCisgICAgKCJpbnRlcmZhY2UiIC4gZm9udC1sb2NrLXR5cGUtZmFj ZSkKKyAgICAoInN0cnVjdCIgLiBmb250LWxvY2stdHlwZS1mYWNlKQorICAgICgidHlwZVBh cmFtZXRlciIgLiBmb250LWxvY2stdHlwZS1mYWNlKQorICAgICgicGFyYW1ldGVyIiAuIGZv bnQtbG9jay12YXJpYWJsZS1uYW1lLWZhY2UpCisgICAgKCJ2YXJpYWJsZSIgLiBmb250LWxv Y2stdmFyaWFibGUtbmFtZS1mYWNlKQorICAgICgicHJvcGVydHkiIC4gZm9udC1sb2NrLXBy b3BlcnR5LXVzZS1mYWNlKQorICAgICgiZW51bU1lbWJlciIgLiBmb250LWxvY2stY29uc3Rh bnQtZmFjZSkKKyAgICAoImV2ZW50IiAuIGZvbnQtbG9jay12YXJpYWJsZS1uYW1lLWZhY2Up CisgICAgKCJmdW5jdGlvbiIgLiBmb250LWxvY2stZnVuY3Rpb24tbmFtZS1mYWNlKQorICAg ICgibWV0aG9kIiAuIGZvbnQtbG9jay1mdW5jdGlvbi1uYW1lLWZhY2UpCisgICAgKCJtYWNy byIgLiBmb250LWxvY2stcHJlcHJvY2Vzc29yLWZhY2UpCisgICAgKCJrZXl3b3JkIiAuIGZv bnQtbG9jay1rZXl3b3JkLWZhY2UpCisgICAgKCJtb2RpZmllciIgLiBmb250LWxvY2stZnVu Y3Rpb24tbmFtZS1mYWNlKQorICAgICgiY29tbWVudCIgLiBmb250LWxvY2stY29tbWVudC1m YWNlKQorICAgICgic3RyaW5nIiAuIGZvbnQtbG9jay1zdHJpbmctZmFjZSkKKyAgICAoIm51 bWJlciIgLiBmb250LWxvY2stY29uc3RhbnQtZmFjZSkKKyAgICAoInJlZ2V4cCIgLiBmb250 LWxvY2stc3RyaW5nLWZhY2UpCisgICAgKCJvcGVyYXRvciIgLiBmb250LWxvY2stZnVuY3Rp b24tbmFtZS1mYWNlKQorICAgICgiZGVjb3JhdG9yIiAuIGZvbnQtbG9jay10eXBlLWZhY2Up KQorICAiQWxpc3Qgb2YgZmFjZXMgdG8gdXNlIHRvIGhpZ2hsaWdodCBzZW1hbnRpYyB0b2tl bnMuCitFYWNoIGVsZW1lbnQgaXMgYSBjb25zIGNlbGwgd2hvc2UgY2FyIGlzIGEgdG9rZW4g dHlwZSBuYW1lIGFuZCBjZHIgaXMKK3RoZSBmYWNlIHRvIHVzZS4iCisgIDp0eXBlIGAoYWxp c3QgOmtleS10eXBlIChzdHJpbmcgOnRhZyAiVG9rZW4gbmFtZSIpCisgICAgICAgICAgICAg ICAgOnZhbHVlLXR5cGUgKGNob2ljZSAoZmFjZSA6dGFnICJGYWNlIikKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIChwbGlzdCA6dGFnICJGYWNlIEF0dHJpYnV0ZXMi CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmtleS10eXBl CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNob2ljZQor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsQChtYXBjYXIK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhbWJk YSAoY2VsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBgKGNvbnN0IDp0YWcgLChjYXBpdGFsaXplCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNkciBjZWxsKSkK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICwoY2FyIGNlbGwpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgZmFjZS1hdHRyaWJ1dGUtbmFtZS1hbGlzdCkpKSkpKQorCisoZGVmY3Vz dG9tIGVnbG90LXNlbWFudGljLXRva2Vucy1tb2RpZmllci1mYWNlcworICAnKCgiZGVjbGFy YXRpb24iIC4gZm9udC1sb2NrLWZ1bmN0aW9uLW5hbWUtZmFjZSkKKyAgICAoImRlZmluaXRp b24iIC4gZm9udC1sb2NrLWZ1bmN0aW9uLW5hbWUtZmFjZSkKKyAgICAoInJlYWRvbmx5IiAu IGZvbnQtbG9jay1jb25zdGFudC1mYWNlKQorICAgICgic3RhdGljIiAuIGZvbnQtbG9jay1r ZXl3b3JkLWZhY2UpCisgICAgKCJkZXByZWNhdGVkIiAuIGVnbG90LWRpYWdub3N0aWMtdGFn LWRlcHJlY2F0ZWQtZmFjZSkKKyAgICAoImFic3RyYWN0IiAuIGZvbnQtbG9jay1rZXl3b3Jk LWZhY2UpCisgICAgKCJhc3luYyIgLiBmb250LWxvY2stcHJlcHJvY2Vzc29yLWZhY2UpCisg ICAgKCJtb2RpZmljYXRpb24iIC4gZm9udC1sb2NrLWZ1bmN0aW9uLW5hbWUtZmFjZSkKKyAg ICAoImRvY3VtZW50YXRpb24iIC4gZm9udC1sb2NrLWRvYy1mYWNlKQorICAgICgiZGVmYXVs dExpYnJhcnkiIC4gZm9udC1sb2NrLWJ1aWx0aW4tZmFjZSkpCisgICJMaXN0IG9mIGZhY2Ug dG8gdXNlIHRvIGhpZ2hsaWdodCB0b2tlbnMgd2l0aCBtb2RpZmllcnMuCitFYWNoIGVsZW1l bnQgaXMgYSBjb25zIGNlbGwgd2hvc2UgY2FyIGlzIGEgbW9kaWZpZXIgbmFtZSBhbmQgY2Ry IGlzCit0aGUgZmFjZSB0byB1c2UuIgorICA6dHlwZSBgKGFsaXN0IDprZXktdHlwZSAoc3Ry aW5nIDp0YWcgIlRva2VuIG5hbWUiKQorICAgICAgICAgICAgICAgIDp2YWx1ZS10eXBlIChj aG9pY2UgKGZhY2UgOnRhZyAiRmFjZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAocGxpc3QgOnRhZyAiRmFjZSBBdHRyaWJ1dGVzIgorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDprZXktdHlwZQorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaG9pY2UKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgLEAobWFwY2FyCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYW1iZGEgKGNlbGwpCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYChjb25zdCA6dGFn ICwoY2FwaXRhbGl6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIChjZHIgY2VsbCkpCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsKGNhciBjZWxsKSkp CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2Ut YXR0cmlidXRlLW5hbWUtYWxpc3QpKSkpKSkKKworKGRlZnZhci1sb2NhbCBlZ2xvdC0tc2Vt dG9rLWlkbGUtdGltZXIgbmlsCisgICJJZGxlIHRpbWVyIHRvIHJlcXVlc3QgZnVsbCBzZW1h bnRpYyB0b2tlbnMuIikKKworKGRlZnZhci1sb2NhbCBlZ2xvdC0tc2VtdG9rLWNhY2hlIG5p bCkKKworKGRlZnN1YnN0IGVnbG90LS1zZW10b2stcHV0LWNhY2hlIChrIHYpCisgICJTZXQg a2V5IEsgb2YgYGVnbG90LXNlbWFudGljLXRva2Vucy0tY2FjaGUnIHRvIFYuIgorICAoc2V0 cSBlZ2xvdC0tc2VtdG9rLWNhY2hlCisgICAgICAgIChwbGlzdC1wdXQgZWdsb3QtLXNlbXRv ay1jYWNoZSBrIHYpKSkKKworOzsgUHJvY2VzcyByZXNwb25zZQorCisoZGVmdW4gZWdsb3Qt LXNlbXRvay1pbmdlc3QtcmFuZ2UtcmVzcG9uc2UgKHJlc3BvbnNlKQorICAiSGFuZGxlIFJF U1BPTlNFIHRvIHNlbWFudGljVG9rZW5zL3JhbmdlIHJlcXVlc3QuIgorICAoZWdsb3QtLXNl bXRvay1wdXQtY2FjaGUgOnJlc3BvbnNlIHJlc3BvbnNlKQorICAoY2wtYXNzZXJ0IChwbGlz dC1nZXQgZWdsb3QtLXNlbXRvay1jYWNoZSA6cmVnaW9uKSkpCisKKyhkZWZ1biBlZ2xvdC0t c2VtdG9rLWluZ2VzdC1mdWxsLXJlc3BvbnNlIChyZXNwb25zZSkKKyAgIkhhbmRsZSBSRVNQ T05TRSB0byBzZW1hbnRpY1Rva2Vucy9mdWxsIHJlcXVlc3QuIgorICAoZWdsb3QtLXNlbXRv ay1wdXQtY2FjaGUgOnJlc3BvbnNlIHJlc3BvbnNlKQorICAoY2wtYXNzZXJ0IChub3QgKHBs aXN0LWdldCBlZ2xvdC0tc2VtdG9rLWNhY2hlIDpyZWdpb24pKSkpCisKKyhkZWZzdWJzdCBl Z2xvdC0tc2VtdG9rLWFwcGx5LWRlbHRhLWVkaXRzIChvbGQtZGF0YSBlZGl0cykKKyAgIkFw cGx5IEVESVRTIG9idGFpbmVkIGZyb20gZnVsbC9kZWx0YSByZXF1ZXN0IHRvIE9MRC1EQVRB LiIKKyAgKGxldCogKChvbGQtdG9rZW4tY291bnQgKGxlbmd0aCBvbGQtZGF0YSkpCisgICAg ICAgICAob2xkLXRva2VuLWluZGV4IDApCisgICAgICAgICAoc3Vic3RyaW5ncykpCisgICAg KGNsLWxvb3AgZm9yIGVkaXQgYWNyb3NzIGVkaXRzIGRvCisgICAgICh3aGVuICg8IG9sZC10 b2tlbi1pbmRleCAocGxpc3QtZ2V0IGVkaXQgOnN0YXJ0KSkKKyAgICAgICAocHVzaCAoc3Vi c3RyaW5nIG9sZC1kYXRhIG9sZC10b2tlbi1pbmRleCAocGxpc3QtZ2V0IGVkaXQgOnN0YXJ0 KSkgc3Vic3RyaW5ncykpCisgICAgIChwdXNoIChwbGlzdC1nZXQgZWRpdCA6ZGF0YSkgc3Vi c3RyaW5ncykKKyAgICAgKHNldHEgb2xkLXRva2VuLWluZGV4ICgrIChwbGlzdC1nZXQgZWRp dCA6c3RhcnQpIChwbGlzdC1nZXQgZWRpdCA6ZGVsZXRlQ291bnQpKSkKKyAgICAgZmluYWxs eSBkbyAocHVzaCAoc3Vic3RyaW5nIG9sZC1kYXRhIG9sZC10b2tlbi1pbmRleCBvbGQtdG9r ZW4tY291bnQpIHN1YnN0cmluZ3MpKQorICAgIChhcHBseSAjJ3Zjb25jYXQgKG5yZXZlcnNl IHN1YnN0cmluZ3MpKSkpCisKKyhkZWZ1biBlZ2xvdC0tc2VtdG9rLWluZ2VzdC1mdWxsL2Rl bHRhLXJlc3BvbnNlIChyZXNwb25zZSkKKyAgIkhhbmRsZSBSRVNQT05TRSB0byBzZW1hbnRp Y1Rva2Vucy9mdWxsL2RlbHRhIHJlcXVlc3QuIgorICAoaWYtbGV0KiAoKGVkaXRzIChwbGlz dC1nZXQgcmVzcG9uc2UgOmVkaXRzKSkpCisgICAgICAocHJvZ24KKyAgICAgICAgKGNsLWFz c2VydCAobm90IChwbGlzdC1nZXQgZWdsb3QtLXNlbXRvay1jYWNoZSA6cmVnaW9uKSkpCisg ICAgICAgICh3aGVuLWxldCogKChvbGQtZGF0YSAocGxpc3QtZ2V0IChwbGlzdC1nZXQgZWds b3QtLXNlbXRvay1jYWNoZSA6cmVzcG9uc2UpIDpkYXRhKSkpCisgICAgICAgICAgKGVnbG90 LS1zZW10b2stcHV0LWNhY2hlCisgICAgICAgICAgIDpyZXNwb25zZQorICAgICAgICAgICAo cGxpc3QtcHV0IHJlc3BvbnNlIDpkYXRhIChlZ2xvdC0tc2VtdG9rLWFwcGx5LWRlbHRhLWVk aXRzIG9sZC1kYXRhIGVkaXRzKSkpKSkKKyAgICA7OyBzZXJ2ZXIgZGVjaWRlZCB0byBzZW5k IGZ1bGwgcmVzcG9uc2UgaW5zdGVhZAorICAgIChlZ2xvdC0tc2VtdG9rLWluZ2VzdC1mdWxs LXJlc3BvbnNlIHJlc3BvbnNlKSkpCisKKyhkZWZ1biBlZ2xvdC0tc2VtdG9rLXJlcXVlc3Qg KHJlZ2lvbiAmb3B0aW9uYWwgZm9udGlmeSkKKyAgIlNlbmQgc2VtYW50aWMgdG9rZW5zIHJl cXVlc3QgdG8gdGhlIGxhbmd1YWdlIHNlcnZlci4KK0EgZnVsbC9kZWx0YSByZXF1ZXN0IHdp bGwgYmUgc2VudCBpZiBkZWx0YSByZXF1ZXN0cyBhcmUgc3VwcG9ydGVkIGJ5IHRoZQorbGFu Z3VhZ2Ugc2VydmVyIGFuZCBhIGZ1bGwgc2V0IG9mIHRva2VucyBoYWQgcHJldmlvdXNseSBi ZWVuIHJlY2VpdmVkLgorT3RoZXJ3aXNlLCBhIHJhbmdlZCByZXF1ZXN0IHdpbGwgYmUgZGlz cGF0Y2hlZCBpZiBSRUdJT04gaXMgbm9uLW5pbCBhbmQKK3JhbmdlZCByZXF1ZXN0cyBhcmUg c3VwcG9ydGVkIGJ5IHRoZSBsYW5ndWFnZSBzZXJ2ZXIuIEluIGFsbCBvdGhlcgorY2FzZXMs IGEgZnVsbCB0b2tlbnMgcmVxdWVzdCB3aWxsIGJlIGRpc3BhdGNoZWQuCisKK0lmIEZPTlRJ RlkgaXMgbm9uLW5pbCwgcmVmb250aWZ5IGFmdGVyIHRoZSByZXF1ZXN0IGNvbXBsZXRlcy4i CisgIChsZXQqICgobWV0aG9kIDp0ZXh0RG9jdW1lbnQvc2VtYW50aWNUb2tlbnMvZnVsbCkK KyAgICAgICAgIChwYXJhbXMgKGxpc3QgOnRleHREb2N1bWVudCAoZWdsb3QtLVRleHREb2N1 bWVudElkZW50aWZpZXIpKSkKKyAgICAgICAgIChyZXNwb25zZS1oYW5kbGVyICMnZWdsb3Qt LXNlbXRvay1pbmdlc3QtZnVsbC1yZXNwb25zZSkKKyAgICAgICAgIChmaW5hbC1yZWdpb24g bmlsKQorICAgICAgICAgKGJ1ZiAoY3VycmVudC1idWZmZXIpKSkKKyAgICAoY29uZAorICAg ICAoKGFuZCAoZWdsb3Qtc2VydmVyLWNhcGFibGUgOnNlbWFudGljVG9rZW5zUHJvdmlkZXIg OmZ1bGwgOmRlbHRhKQorICAgICAgICAgICAobGV0ICgocmVzcG9uc2UgKHBsaXN0LWdldCBl Z2xvdC0tc2VtdG9rLWNhY2hlIDpyZXNwb25zZSkpKQorICAgICAgICAgICAgIChhbmQgKHBs aXN0LWdldCByZXNwb25zZSA6cmVzdWx0SWQpIChwbGlzdC1nZXQgcmVzcG9uc2UgOmRhdGEp CisgICAgICAgICAgICAgICAgICAobm90IChwbGlzdC1nZXQgZWdsb3QtLXNlbXRvay1jYWNo ZSA6cmVnaW9uKSkpKSkKKyAgICAgIChzZXRxIG1ldGhvZCA6dGV4dERvY3VtZW50L3NlbWFu dGljVG9rZW5zL2Z1bGwvZGVsdGEpCisgICAgICAoc2V0cSByZXNwb25zZS1oYW5kbGVyICMn ZWdsb3QtLXNlbXRvay1pbmdlc3QtZnVsbC9kZWx0YS1yZXNwb25zZSkKKyAgICAgIChzZXRx IHBhcmFtcworICAgICAgICAgICAgKHBsaXN0LXB1dCBwYXJhbXMgOnByZXZpb3VzUmVzdWx0 SWQKKyAgICAgICAgICAgICAgICAgICAgICAgKHBsaXN0LWdldCAocGxpc3QtZ2V0IGVnbG90 LS1zZW10b2stY2FjaGUgOnJlc3BvbnNlKSA6cmVzdWx0SWQpKSkpCisgICAgICgoYW5kIHJl Z2lvbiAoZWdsb3Qtc2VydmVyLWNhcGFibGUgOnNlbWFudGljVG9rZW5zUHJvdmlkZXIgOnJh bmdlKSkKKyAgICAgIChzZXRxIG1ldGhvZCA6dGV4dERvY3VtZW50L3NlbWFudGljVG9rZW5z L3JhbmdlKQorICAgICAgKHNldHEgZmluYWwtcmVnaW9uIHJlZ2lvbikKKyAgICAgIChzZXRx IHBhcmFtcworICAgICAgICAgICAgKHBsaXN0LXB1dCBwYXJhbXMgOnJhbmdlIChlZ2xvdC1y ZWdpb24tcmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNh ciBmaW5hbC1yZWdpb24pIChjZHIgZmluYWwtcmVnaW9uKSkpKQorICAgICAgKHNldHEgcmVz cG9uc2UtaGFuZGxlciAjJ2VnbG90LS1zZW10b2staW5nZXN0LXJhbmdlLXJlc3BvbnNlKSkp CisgICAgKGVnbG90LS1hc3luYy1yZXF1ZXN0CisgICAgIChlZ2xvdC0tY3VycmVudC1zZXJ2 ZXItb3ItbG9zZSkgbWV0aG9kIHBhcmFtcworICAgICA6c3VjY2Vzcy1mbgorICAgICAobGFt YmRhIChyZXNwb25zZSkKKyAgICAgICAoZWdsb3QtLXdoZW4tbGl2ZS1idWZmZXIgYnVmCisg ICAgICAgICAoZWdsb3QtLXNlbXRvay1wdXQtY2FjaGUgOmRvY3VtZW50VmVyc2lvbiBlZ2xv dC0tdmVyc2lvbmVkLWlkZW50aWZpZXIpCisgICAgICAgICAoZWdsb3QtLXNlbXRvay1wdXQt Y2FjaGUgOnJlZ2lvbiBmaW5hbC1yZWdpb24pCisgICAgICAgICAoZnVuY2FsbCByZXNwb25z ZS1oYW5kbGVyIHJlc3BvbnNlKQorICAgICAgICAgKHdoZW4gZm9udGlmeSAoaml0LWxvY2st cmVmb250aWZ5IChjYXItc2FmZSByZWdpb24pIChjZHItc2FmZSByZWdpb24pKSkKKyAgICAg ICAgICh3aGVuIGZpbmFsLXJlZ2lvbiAoZWdsb3QtLXNlbXRvay1yZXF1ZXN0LWZ1bGwtb24t aWRsZSkpKSkKKyAgICAgOmhpbnQgIydlZ2xvdC0tc2VtdG9rLXJlcXVlc3QpKSkKKworKGRl ZnVuIGVnbG90LS1zZW10b2stZm9udGlmeSAoYmVnIGVuZCkKKyAgIkFwcGx5IHRoZSBjYWNo ZWQgc2VtYW50aWMgdG9rZW5zIGZyb20gQkVHIHRvIEVORC4iCisgICh3aXRoLXNsb3RzICgo bW9kaWZpZXItY2FjaGUgc2VtdG9rLW1vZGlmaWVyLWNhY2hlKQorICAgICAgICAgICAgICAg KGZhY2VzIHNlbXRvay1mYWNlcykKKyAgICAgICAgICAgICAgIChtb2RpZmllci1mYWNlcyBz ZW10b2stbW9kaWZpZXItZmFjZXMpKQorICAgICAgKGVnbG90LWN1cnJlbnQtc2VydmVyKQor ICAgIChjb25kCisgICAgICgobm90IChhbmQgZmFjZXMKKyAgICAgICAgICAgICAgICBlZ2xv dC0tc2VtdG9rLWNhY2hlCisgICAgICAgICAgICAgICAgKHBsaXN0LWdldCBlZ2xvdC0tc2Vt dG9rLWNhY2hlIDpyZXNwb25zZSkKKyAgICAgICAgICAgICAgICAoZXEgZWdsb3QtLXZlcnNp b25lZC1pZGVudGlmaWVyIChwbGlzdC1nZXQgZWdsb3QtLXNlbXRvay1jYWNoZSA6ZG9jdW1l bnRWZXJzaW9uKSkpKQorICAgICAgKGVnbG90LS1zZW10b2stcmVxdWVzdCAoY29ucyBiZWcg ZW5kKSB0KSkKKyAgICAgKHQKKyAgICAgIDs7IGlmIHdlJ3JlIHVzaW5nIHRoZSByZXNwb25z ZSB0byBhIHJhbmdlZCByZXF1ZXN0LCB3ZSdsbCBvbmx5IGJlIGFibGUgdG8gZm9udGlmeSB3 aXRoaW4KKyAgICAgIDs7IHRoYXQgcmFuZ2UgKGFuZCBoZW5jZSBzaG91bGRuJ3QgY2xlYXIg YW55IGhpZ2hsaWdodHMgb3V0c2lkZSBvZiB0aGF0IHJhbmdlKQorICAgICAgKHdoZW4tbGV0 KiAoKHRva2VuLXJlZ2lvbiAocGxpc3QtZ2V0IGVnbG90LS1zZW10b2stY2FjaGUgOnJlZ2lv bikpKQorICAgICAgICAocHJvZ24KKyAgICAgICAgICAod2hlbiAob3IgKDwgYmVnIChjYXIg dG9rZW4tcmVnaW9uKSkKKyAgICAgICAgICAgICAgICAgICAgKD4gZW5kIChjZHIgdG9rZW4t cmVnaW9uKSkpCisgICAgICAgICAgICA7OyB0cnVuY2F0ZWQhIGNvbnRpbnVlLCBidXQgcmVx dWVzdCBhZ2FpbgorICAgICAgICAgICAgKGVnbG90LS1zZW10b2stcmVxdWVzdCAoY29ucyBi ZWcgZW5kKSB0KSkKKyAgICAgICAgICAoc2V0cSBiZWcgKG1heCBiZWcgKGNhciB0b2tlbi1y ZWdpb24pKSkKKyAgICAgICAgICAoc2V0cSBlbmQgKG1pbiBlbmQgKGNkciB0b2tlbi1yZWdp b24pKSkpKQorICAgICAgKGVnbG90LS13aWRlbmluZworICAgICAgICAod2l0aC1zaWxlbnQt bW9kaWZpY2F0aW9ucworICAgICAgICAgIChyZW1vdmUtbGlzdC1vZi10ZXh0LXByb3BlcnRp ZXMgYmVnIGVuZCAnKGZvbnQtbG9jay1mYWNlKSkKKyAgICAgICAgICAobGV0KiAoKGluaGli aXQtZmllbGQtdGV4dC1tb3Rpb24gdCkKKyAgICAgICAgICAgICAgICAgKGRhdGEgKHBsaXN0 LWdldCAocGxpc3QtZ2V0IGVnbG90LS1zZW10b2stY2FjaGUgOnJlc3BvbnNlKSA6ZGF0YSkp CisgICAgICAgICAgICAgICAgIChpLW1heCAobGVuZ3RoIGRhdGEpKQorICAgICAgICAgICAg ICAgICAoYmVnLWJvbCAoYW5kIChnb3RvLWNoYXIgYmVnKSAobGluZS1iZWdpbm5pbmctcG9z aXRpb24pKSkKKyAgICAgICAgICAgICAgICAgKHByb3BlcnR5LWJlZykKKyAgICAgICAgICAg ICAgICAgKHByb3BlcnR5LWVuZCkpCisgICAgICAgICAgICAoZ290by1jaGFyIChwb2ludC1t aW4pKQorICAgICAgICAgICAgKGNsLWRvICgoaSAwICgrIGkgNSkpIChjb2x1bW4gMCkpICgo Pj0gaSBpLW1heCkpCisgICAgICAgICAgICAgICh3aGVuICg+IChhcmVmIGRhdGEgaSkgMCkK KyAgICAgICAgICAgICAgICAoc2V0cSBjb2x1bW4gMCkKKyAgICAgICAgICAgICAgICAoZm9y d2FyZC1saW5lIChhcmVmIGRhdGEgaSkpKQorICAgICAgICAgICAgICAodW5sZXNzICg8IChw b2ludCkgYmVnLWJvbCkKKyAgICAgICAgICAgICAgICAoc2V0cSBjb2x1bW4gKCsgY29sdW1u IChhcmVmIGRhdGEgKCsgaSAxKSkpKQorICAgICAgICAgICAgICAgIChmdW5jYWxsIGVnbG90 LW1vdmUtdG8tbGluZXBvcy1mdW5jdGlvbiBjb2x1bW4pCisgICAgICAgICAgICAgICAgKHdo ZW4gKD4gKHBvaW50KSBlbmQpIChjbC1yZXR1cm4pKQorICAgICAgICAgICAgICAgIChzZXRx IHByb3BlcnR5LWJlZyAocG9pbnQpKQorICAgICAgICAgICAgICAgIChmdW5jYWxsIGVnbG90 LW1vdmUtdG8tbGluZXBvcy1mdW5jdGlvbiAoKyBjb2x1bW4gKGFyZWYgZGF0YSAoKyBpIDIp KSkpCisgICAgICAgICAgICAgICAgKHNldHEgcHJvcGVydHktZW5kIChwb2ludCkpCisgICAg ICAgICAgICAgICAgKHdoZW4tbGV0KiAoKGZhY2UgKGFyZWYgZmFjZXMgKGFyZWYgZGF0YSAo KyBpIDMpKSkpKQorICAgICAgICAgICAgICAgICAgKHB1dC10ZXh0LXByb3BlcnR5IHByb3Bl cnR5LWJlZyBwcm9wZXJ0eS1lbmQgJ2ZvbnQtbG9jay1mYWNlIGZhY2UpKQorICAgICAgICAg ICAgICAgIChsZXQqICgoY29kZSAoYXJlZiBkYXRhICgrIGkgNCkpKQorICAgICAgICAgICAg ICAgICAgICAgICAoZmFjZXMgKGdldGhhc2ggY29kZSBtb2RpZmllci1jYWNoZSAnbm90LWZv dW5kKSkpCisgICAgICAgICAgICAgICAgICAod2hlbiAoZXEgZmFjZXMgJ25vdC1mb3VuZCkK KyAgICAgICAgICAgICAgICAgICAgKHNldHEgZmFjZXMgbmlsKQorICAgICAgICAgICAgICAg ICAgICAoY2wtbG9vcCBmb3IgaiBmcm9tIDAgYmVsb3cgKGxlbmd0aCBtb2RpZmllci1mYWNl cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKD4gKGxvZ2FuZCBjb2RlIChh c2ggMSBqKSkgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZWYgbW9k aWZpZXItZmFjZXMgaikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdCAo YXJlZiBtb2RpZmllci1mYWNlcyBqKSBpbnRvIGZhY2VzKQorICAgICAgICAgICAgICAgICAg ICAocHV0aGFzaCBjb2RlIGZhY2VzIG1vZGlmaWVyLWNhY2hlKSkKKyAgICAgICAgICAgICAg ICAgIChkb2xpc3QgKGZhY2UgZmFjZXMpCisgICAgICAgICAgICAgICAgICAgIChwdXQtdGV4 dC1wcm9wZXJ0eSBwcm9wZXJ0eS1iZWcgcHJvcGVydHktZW5kICdmb250LWxvY2stZmFjZSBm YWNlKSkpKSkpKSkKKyAgICAgIGAoaml0LWxvY2stYm91bmRzICxiZWcgLiAsZW5kKSkpKSkK KworKGRlZnVuIGVnbG90LS1zZW10b2stcmVxdWVzdC1mdWxsLW9uLWlkbGUgKCkKKyAgIk1h a2UgYSBmdWxsIHNlbWFudGljIHRva2VucyByZXF1ZXN0IGFmdGVyIGFuIGlkbGUgdGltZXIu IgorICAobGV0KiAoKGJ1ZiAoY3VycmVudC1idWZmZXIpKQorICAgICAgICAgKGZ1biAobGFt YmRhICgpCisgICAgICAgICAgICAgICAgKGVnbG90LS13aGVuLWxpdmUtYnVmZmVyIGJ1Zgor ICAgICAgICAgICAgICAgICAgKGVnbG90LS1zZW10b2stcmVxdWVzdCBuaWwpKSkpKQorICAg ICh3aGVuIGVnbG90LS1zZW10b2staWRsZS10aW1lciAoY2FuY2VsLXRpbWVyIGVnbG90LS1z ZW10b2staWRsZS10aW1lcikpCisgICAgKHNldHEgZWdsb3QtLXNlbXRvay1pZGxlLXRpbWVy IChydW4td2l0aC1pZGxlLXRpbWVyICgqIDMgZWdsb3Qtc2VuZC1jaGFuZ2VzLWlkbGUtdGlt ZSkgbmlsIGZ1bikpKSkKKworKGRlZnVuIGVnbG90LS1zZW10b2stb24tcmVmcmVzaCAoc2Vy dmVyKQorICAiQ2xlYXIgc2VtYW50aWMgdG9rZW5zIHdpdGhpbiBhbGwgYnVmZmVycyBvZiBT RVJWRVIuIgorICAoY2wtbG9vcCBmb3IgYnVmZmVyIGluIChlZ2xvdC0tbWFuYWdlZC1idWZm ZXJzIHNlcnZlcikgZG8KKyAgICAgICAgICAgKHdpdGgtY3VycmVudC1idWZmZXIgYnVmZmVy CisgICAgICAgICAgICAgKHNldHEgZWdsb3QtLXNlbXRvay1jYWNoZSBuaWwpCisgICAgICAg ICAgICAgKGppdC1sb2NrLXJlZm9udGlmeSkpKSkKKworKGxldCAoKGRlYm91bmNlLXRpbWVy IG5pbCkpCisgIChjbC1kZWZtZXRob2QgZWdsb3QtaGFuZGxlLXJlcXVlc3QKKyAgICAoc2Vy dmVyIChfbWV0aG9kIChlcWwgd29ya3NwYWNlL3NlbWFudGljVG9rZW5zL3JlZnJlc2gpKSkK KyAgICAiSGFuZGxlIGEgc2VtYW50aWNUb2tlbnMvcmVmcmVzaCByZXF1ZXN0IGZyb20gU0VS VkVSLiIKKyAgICAod2hlbiBkZWJvdW5jZS10aW1lciAoY2FuY2VsLXRpbWVyIGRlYm91bmNl LXRpbWVyKSkKKyAgICAoc2V0cSBkZWJvdW5jZS10aW1lciAocnVuLXdpdGgtdGltZXIgNSBu aWwgIydlZ2xvdC0tc2VtdG9rLW9uLXJlZnJlc2ggc2VydmVyKSkKKyAgICBuaWwpKQorCis7 OyBJbml0aWFsaXphdGlvbgorKGRlZnVuIGVnbG90LS1zZW10b2stYnVpbGQtZmFjZS1tYXAg KGlkZW50aWZpZXJzIGZhY2VzIGNhdGVnb3J5IHZhcm5hbWUpCisgICJCdWlsZCBtYXAgb2Yg RkFDRVMgZm9yIElERU5USUZJRVJTIHVzaW5nIENBVEVHT1JZIGFuZCBWQVJOQU1FLiIKKyAg KHZjb25jYXQKKyAgIChtYXBjYXIgKGxhbWJkYSAoaWQpCisgICAgICAgICAgICAgKGxldCAo KG1heWJlLWZhY2UgKGNkciAoYXNzb2MgaWQgZmFjZXMpKSkpCisgICAgICAgICAgICAgICAo d2hlbiAobm90IG1heWJlLWZhY2UpCisgICAgICAgICAgICAgICAgIChkaXNwbGF5LXdhcm5p bmcKKyAgICAgICAgICAgICAgICAgICdlZ2xvdC1zZW10b2sKKyAgICAgICAgICAgICAgICAg IChmb3JtYXQtbWVzc2FnZSAiTm8gZmFjZSBoYXMgYmVlbiBhc3NvY2lhdGVkIHRvIHRoZSAl cyBgJXMnOiBjb25zaWRlciBhZGRpbmcgYSBjb3JyZXNwb25kaW5nIGRlZmluaXRpb24gdG8g JXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnkgaWQgdmFy bmFtZSkpKQorICAgICAgICAgICAgICAgbWF5YmUtZmFjZSkpCisgICAgICAgICAgIGlkZW50 aWZpZXJzKSkpCisKKyhkZWZ1biBlZ2xvdC0tc2VtdG9rLWluaXRpYWxpemUgKHNlcnZlcikK KyAgIkluaXRpYWxpemUgU0VSVkVSIGZvciBzZW1hbnRpYyB0b2tlbnMuIgorICAoY2wtZGVz dHJ1Y3R1cmluZy1iaW5kICgma2V5IHRva2VuVHlwZXMgdG9rZW5Nb2RpZmllcnMgJmFsbG93 LW90aGVyLWtleXMpCisgICAgICAocGxpc3QtZ2V0IChwbGlzdC1nZXQgKGVnbG90LS1jYXBh YmlsaXRpZXMgc2VydmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpzZW1hbnRp Y1Rva2Vuc1Byb3ZpZGVyKQorICAgICAgICAgICAgICAgICA6bGVnZW5kKQorICAgIChvc2V0 IHNlcnZlciBzZW10b2stZmFjZXMKKyAgICAgICAgICAoZWdsb3QtLXNlbXRvay1idWlsZC1m YWNlLW1hcAorICAgICAgICAgICB0b2tlblR5cGVzIGVnbG90LXNlbWFudGljLXRva2Vucy1m YWNlcworICAgICAgICAgICAic2VtYW50aWMgdG9rZW4iICJlZ2xvdC0tc2VtdG9rZmFjZXMi KSkKKyAgICAob3NldCBzZXJ2ZXIgc2VtdG9rLW1vZGlmaWVyLWZhY2VzCisgICAgICAgICAg KGVnbG90LS1zZW10b2stYnVpbGQtZmFjZS1tYXAKKyAgICAgICAgICAgdG9rZW5Nb2RpZmll cnMgZWdsb3Qtc2VtYW50aWMtdG9rZW5zLW1vZGlmaWVyLWZhY2VzCisgICAgICAgICAgICJz ZW1hbnRpYyB0b2tlbiBtb2RpZmllciIgImVnbG90LS1zZW10b2ttb2RpZmllci1mYWNlcyIp KSkpCisKKyhkZWZpbmUtbWlub3ItbW9kZSBlZ2xvdC1zZW1hbnRpYy10b2tlbnMtbW9kZQor ICAiTWlub3IgbW9kZSBmb3IgZm9udGlmeWluZyBidWZmZXIgd2l0aCBMU1Agc2VydmVyJ3Mg c2VtYW50aWMgdG9rZW5zLiIKKyAgOmdsb2JhbCBuaWwKKyAgKGNvbmQgKGVnbG90LXNlbWFu dGljLXRva2Vucy1tb2RlCisgICAgICAgICAoaWYgKGVnbG90LXNlcnZlci1jYXBhYmxlIDpz ZW1hbnRpY1Rva2Vuc1Byb3ZpZGVyKQorICAgICAgICAgICAgIChqaXQtbG9jay1yZWdpc3Rl ciAjJ2VnbG90LS1zZW10b2stZm9udGlmeSAnY29udGV4dHVhbCkKKyAgICAgICAgICAgKGVn bG90LXNlbWFudGljLXRva2Vucy1tb2RlIC0xKSkpCisgICAgICAgICh0CisgICAgICAgICAo aml0LWxvY2stdW5yZWdpc3RlciAjJ2VnbG90LS1zZW10b2stZm9udGlmeSkKKyAgICAgICAg ICh3aXRoLXNpbGVudC1tb2RpZmljYXRpb25zCisgICAgICAgICAgIChyZW1vdmUtbGlzdC1v Zi10ZXh0LXByb3BlcnRpZXMgKHBvaW50LW1pbikgKHBvaW50LW1heCkgJyhmb250LWxvY2st ZmFjZSkpKSkpKQorCiAMCiA7OzsgQ2FsbCBhbmQgdHlwZSBoaWVyYXJjaGllcwogKHJlcXVp cmUgJ2J1dHRvbikKQEAgLTQ3MjgsNyArNTAzNiw4IEBAIElmIE5PRVJST1IsIHJldHVybiBw cmVkaWNhdGUsIGVsc2UgZXJyb3JpbmcgZnVuY3Rpb24uIgogOzsgaGFyZGVyLiBGb3Igbm93 LCB1c2UgYHdpdGgtZXZhbC1hZnRlci1sb2FkJy4gU2VlIGFsc28gZ2l0aHViIzExODMuCiAo d2l0aC1ldmFsLWFmdGVyLWxvYWQgJ2Rlc2t0b3AKICAgKGFkZC10by1saXN0ICdkZXNrdG9w LW1pbm9yLW1vZGUtaGFuZGxlcnMgJyhlZ2xvdC0tbWFuYWdlZC1tb2RlIC4gaWdub3JlKSkK LSAgKGFkZC10by1saXN0ICdkZXNrdG9wLW1pbm9yLW1vZGUtaGFuZGxlcnMgJyhlZ2xvdC1p bmxheS1oaW50cy1tb2RlIC4gaWdub3JlKSkpCisgIChhZGQtdG8tbGlzdCAnZGVza3RvcC1t aW5vci1tb2RlLWhhbmRsZXJzICcoZWdsb3QtaW5sYXktaGludHMtbW9kZSAuIGlnbm9yZSkp CisgIChhZGQtdG8tbGlzdCAnZGVza3RvcC1taW5vci1tb2RlLWhhbmRsZXJzICcoZWdsb3Qt c2VtYW50aWMtdG9rZW5zLW1vZGUgLiBpZ25vcmUpKSkKIAogDAogOzs7IE1pc2MKQEAgLTQ3 NTcsNiArNTA2Niw3IEBAIElmIE5PRVJST1IsIHJldHVybiBwcmVkaWNhdGUsIGVsc2UgZXJy b3JpbmcgZnVuY3Rpb24uIgogICAgICAgICAgICAgICAgZWdsb3QtZm9ybWF0CiAgICAgICAg ICAgICAgICBlZ2xvdC1mb3JtYXQtYnVmZmVyCiAgICAgICAgICAgICAgICBlZ2xvdC1pbmxh eS1oaW50cy1tb2RlCisgICAgICAgICAgICAgICBlZ2xvdC1zZW1hbnRpYy10b2tlbnMtbW9k ZQogICAgICAgICAgICAgICAgZWdsb3QtcmVjb25uZWN0CiAgICAgICAgICAgICAgICBlZ2xv dC1yZW5hbWUKICAgICAgICAgICAgICAgIGVnbG90LXNpZ25hbC1kaWRDaGFuZ2VDb25maWd1 cmF0aW9uCi0tIAoyLjUxLjAKCg== --------------inAXX13i0ODSZQVny1l1Heua-- From unknown Sat Sep 13 11:38:41 2025 X-Loop: help-debbugs@gnu.org Subject: bug#79374: [PATCH] eglot: add support for semantic tokens Resent-From: Philip Kaludercic Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 04 Sep 2025 08:37:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 79374 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: "Lua V. R." Cc: 79374@debbugs.gnu.org, =?UTF-8?Q?Jo=C3=A3o_?= =?UTF-8?Q?T=C3=A1vora?= Received: via spool by 79374-submit@debbugs.gnu.org id=B79374.175697502019587 (code B ref 79374); Thu, 04 Sep 2025 08:37:01 +0000 Received: (at 79374) by debbugs.gnu.org; 4 Sep 2025 08:37:00 +0000 Received: from localhost ([127.0.0.1]:45201 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uu5Sl-00055o-IJ for submit@debbugs.gnu.org; Thu, 04 Sep 2025 04:36:59 -0400 Received: from mout01.posteo.de ([185.67.36.65]:42813) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1uu5Sh-00055L-94 for 79374@debbugs.gnu.org; Thu, 04 Sep 2025 04:36:56 -0400 Received: from submission (posteo.de [185.67.36.169]) by mout01.posteo.de (Postfix) with ESMTPS id EB79E240027 for <79374@debbugs.gnu.org>; Thu, 4 Sep 2025 10:36:47 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=posteo.net; s=2017; t=1756975007; bh=879ybWXF05i87nxpv3migv7gZA71+fEMUb26fa9tVTU=; h=From:To:Cc:Subject:Autocrypt:OpenPGP:Date:Message-ID:MIME-Version: Content-Type:From; b=U7y7ga8UnfnTYFfbUEJsrRTYnhVW7fBXozXgfxXprmJZ4jssEk6ykdzMRXmhM6o7D kxxi6JwspifoUAc0ndOa0lL+l9VbJ6ER1JohXCPJb810nYD3fo5Maoa+zMa79Wspn1 m18wjrl+NKyj/TiYGriZgCTOzkcbApjT1sGiYVSo4mkr8D/vNEc3p+sutS49BD31aV Cg19Umf8oVz3rwKQx69kSVif4XxaD7IaDW3cOdNvJgvE8bs3mwZOpJiW6NYlhrPoKo uxI+m4q1VQokjn227XBAvLcfcAzQMb6otxjodeRTuhNZpZmmSwTs9uAk2TJEk8M374 D5pagj7/Vw/DA== Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 4cHXrt66Zkz9rxT; Thu, 4 Sep 2025 10:36:46 +0200 (CEST) From: Philip Kaludercic In-Reply-To: References: <2c03b490-5006-4ad4-a090-fafc8a18405d@lua.blog.br> <87ecsoc6cz.fsf@posteo.net> Autocrypt: addr=philipk@posteo.net; keydata= mDMEZBBQQhYJKwYBBAHaRw8BAQdAHJuofBrfqFh12uQu0Yi7mrl525F28eTmwUDflFNmdui0QlBo aWxpcCBLYWx1ZGVyY2ljIChnZW5lcmF0ZWQgYnkgYXV0b2NyeXB0LmVsKSA8cGhpbGlwa0Bwb3N0 ZW8ubmV0PoiWBBMWCAA+FiEEDg7HY17ghYlni8XN8xYDWXahwukFAmQQUEICGwMFCQHhM4AFCwkI BwIGFQoJCAsCBBYCAwECHgECF4AACgkQ8xYDWXahwulikAEA77hloUiSrXgFkUVJhlKBpLCHUjA0 mWZ9j9w5d08+jVwBAK6c4iGP7j+/PhbkxaEKa4V3MzIl7zJkcNNjHCXmvFcEuDgEZBBQQhIKKwYB BAGXVQEFAQEHQI5NLiLRjZy3OfSt1dhCmFyn+fN/QKELUYQetiaoe+MMAwEIB4h+BBgWCAAmFiEE Dg7HY17ghYlni8XN8xYDWXahwukFAmQQUEICGwwFCQHhM4AACgkQ8xYDWXahwukm+wEA8cml4JpK NeAu65rg+auKrPOP6TP/4YWRCTIvuYDm0joBALw98AMz7/qMHvSCeU/hw9PL6u6R2EScxtpKnWof z4oM OpenPGP: id=7126E1DE2F0CE35C770BED01F2C3CC513DB89F66; url="https://keys.openpgp.org/vks/v1/by-fingerprint/7126E1DE2F0CE35C770BED01F2C3CC513DB89F66"; preference=signencrypt Date: Thu, 04 Sep 2025 08:36:47 +0000 Message-ID: <87bjnqty02.fsf@posteo.net> MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -2.3 (--) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) "Lua V. R." writes: > Hi Philip, > > Em 03/09/2025 05:01, Philip Kaludercic escreveu: >> As mentioned on Emacs-devel, shouldn't this be `eglot-semantic-tokens-mode'. > Thanks for catching this :) I fixed it among other things, and I > apologize for being unfamiliar with the e-mail git workflow. FWIW I did not notice that you were doing anything wrong :) > I don't > know if I should send a patch on top of the previous patch, but I'm > sending a squashed one. That is the conventional approach. The idea is that we can apply a clean patch to emacs.git, while the mailing list is sort of the meta VCS over the patch (if that makes sense). > In this new patch I also removed a "hash" I used in attempt to avoid a > burst of requests, because it was not working in some particular > situations (I can explain if you want). Now, due to how jit-lock > works, Eglot may send two requests after a didChange if the server > does not support delta requests. But this was also the case in the > version with the hash, so alas, it was just complicating things. My experience with Eglot internals is limited so I cannot really comment on that part, sorry. From unknown Sat Sep 13 11:38:41 2025 X-Loop: help-debbugs@gnu.org Subject: bug#79374: [PATCH] eglot: add support for semantic tokens Resent-From: Eli Zaretskii Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 13 Sep 2025 07:59:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 79374 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: me@lua.blog.br, joaotavora@gmail.com Cc: philipk@posteo.net, 79374@debbugs.gnu.org Received: via spool by 79374-submit@debbugs.gnu.org id=B79374.17577502885933 (code B ref 79374); Sat, 13 Sep 2025 07:59:02 +0000 Received: (at 79374) by debbugs.gnu.org; 13 Sep 2025 07:58:08 +0000 Received: from localhost ([127.0.0.1]:53113 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uxL95-0001Xa-0x for submit@debbugs.gnu.org; Sat, 13 Sep 2025 03:58:08 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:40456) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1uxL8u-0001VI-2V for 79374@debbugs.gnu.org; Sat, 13 Sep 2025 03:58:05 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uxL8e-00039N-1U; Sat, 13 Sep 2025 03:57:48 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=MIME-version:References:Subject:In-Reply-To:To:From: Date; bh=QC2Jv026SfGdECT27endxgDSWKd0FbDw8VWZfIMsl5k=; b=V/c3Eh+I9jsL34kqluQ3 TuQSdecoHe7TojJzSF5P1YP08IvNQUjMGErcgbzK/Jc4B87l4n2rJQvEcrBpAQX2LuAyqFkYUzeAm Q+PkBp1vLCEB6z5Noqcw7hqaSEyzR+rZK4WbpNogKnf9GSjUSgmt3MGIkuG7fP662UsQGjyli4QE1 PWhey2UDhiqWka0lVEe2iuavmQaBohjsowrBNakYJmriddoQ3l4MeJrQYQKbw76QT7aMY6S/v9NFz UIIQY5TElP0zs46GEosjGFcKq0ewMDrO0JBCKLgjxdJgtFX4Sn/88kNstL0LpbTgd+lzPvR0ByxAm 1+38Te5huTNH+Q==; Date: Sat, 13 Sep 2025 10:57:35 +0300 Message-Id: <86348qss28.fsf@gnu.org> From: Eli Zaretskii In-Reply-To: (me@lua.blog.br) References: <2c03b490-5006-4ad4-a090-fafc8a18405d@lua.blog.br> <87ecsoc6cz.fsf@posteo.net> MIME-version: 1.0 Content-type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -2.3 (--) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) João, any comments on the patch? Should I install it? > Cc: 79374@debbugs.gnu.org, > João Távora > From: "Lua V. R." > Date: Thu, 4 Sep 2025 00:02:51 +0000 (UTC) > > Hi Philip, > > Em 03/09/2025 05:01, Philip Kaludercic escreveu: > > As mentioned on Emacs-devel, shouldn't this be `eglot-semantic-tokens-mode'. > Thanks for catching this :) I fixed it among other things, and I > apologize for being unfamiliar with the e-mail git workflow. I don't > know if I should send a patch on top of the previous patch, but I'm > sending a squashed one. > > In this new patch I also removed a "hash" I used in attempt to avoid a > burst of requests, because it was not working in some particular > situations (I can explain if you want). Now, due to how jit-lock works, > Eglot may send two requests after a didChange if the server does not > support delta requests. But this was also the case in the version with > the hash, so alas, it was just complicating things. > > From 32471c4a0fc9ca80ae8d3c299a3bd55581f8cb04 Mon Sep 17 00:00:00 2001 > From: Lua Viana Reis > Date: Tue, 2 Sep 2025 19:03:52 -0300 > Subject: [PATCH] add semantic tokens support for eglot > > --- > lisp/progmodes/eglot.el | 316 +++++++++++++++++++++++++++++++++++++++- > 1 file changed, 313 insertions(+), 3 deletions(-) > > diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el > index 475b5e13f1..1d9fb7905d 100644 > --- a/lisp/progmodes/eglot.el > +++ b/lisp/progmodes/eglot.el > @@ -141,6 +141,8 @@ > (defvar company-tooltip-align-annotations) > (defvar tramp-ssh-controlmaster-options) > (defvar tramp-use-ssh-controlmaster-options) > +(defvar eglot-semantic-tokens-faces) > +(defvar eglot-semantic-tokens-modifier-faces) > > > ;;; Obsolete aliases > @@ -1017,6 +1019,7 @@ object." > `(:dynamicRegistration > ,(if (eglot--trampish-p s) :json-false t)) > :symbol `(:dynamicRegistration :json-false) > + :semanticTokens '(:refreshSupport t) > :configuration t > :workspaceFolders t) > :textDocument > @@ -1079,6 +1082,13 @@ object." > :formatting `(:dynamicRegistration :json-false) > :rangeFormatting `(:dynamicRegistration :json-false) > :rename `(:dynamicRegistration :json-false) > + :semanticTokens `(:dynamicRegistration :json-false > + :requests '(:range t :full (:delta t)) > + :tokenModifiers [,@(mapcar #'car eglot-semantic-tokens-modifier-faces)] > + :overlappingTokenSupport t > + :multilineTokenSupport t > + :tokenTypes [,@(mapcar #'car eglot-semantic-tokens-faces)] > + :formats ["relative"]) > :inlayHint `(:dynamicRegistration :json-false) > :callHierarchy `(:dynamicRegistration :json-false) > :typeHierarchy `(:dynamicRegistration :json-false) > @@ -1149,7 +1159,16 @@ object." > :accessor eglot--managed-buffers) > (saved-initargs > :documentation "Saved initargs for reconnection purposes." > - :accessor eglot--saved-initargs)) > + :accessor eglot--saved-initargs) > + (semtok-faces > + :initform nil > + :documentation "Semantic tokens faces.") > + (semtok-modifier-faces > + :initform nil > + :documentation "Semantic tokens modifier faces.") > + (semtok-modifier-cache > + :initform (make-hash-table) > + :documentation "A hashmap of modifier values to the selected faces.")) > :documentation > "Represents a server. Wraps a process for LSP communication.") > > @@ -1211,6 +1230,11 @@ If optional MARKERS, make markers instead." > (end (eglot--lsp-position-to-point (plist-get range :end) markers))) > (cons beg end))) > > +(defun eglot-region-range (beg end) > + "Return a LSP range representing region BEG to END." > + (list :start (eglot--pos-to-lsp-position beg) > + :end (eglot--pos-to-lsp-position end))) > + > (defun eglot-server-capable (&rest feats) > "Determine if current server is capable of FEATS." > (unless (cl-some (lambda (feat) > @@ -1576,7 +1600,8 @@ Use current server's or first available Eglot events buffer." > (jsonrpc-forget-pending-continuations server)) > > (defvar eglot-connect-hook > - '(eglot-signal-didChangeConfiguration) > + '(eglot-signal-didChangeConfiguration > + eglot--semtok-initialize) > "Hook run after connecting to a server. > Each function is passed an `eglot-lsp-server' instance > as argument.") > @@ -2291,6 +2316,7 @@ If it is activated, also signal textDocument/didOpen." > ;; Run user hook after 'textDocument/didOpen' so server knows > ;; about the buffer. > (eglot-inlay-hints-mode 1) > + (eglot-semantic-tokens-mode 1) > (run-hooks 'eglot-managed-mode-hook)))) > > (add-hook 'after-change-major-mode-hook #'eglot--maybe-activate-editing-mode) > @@ -4494,6 +4520,288 @@ If NOERROR, return predicate, else erroring function." > (jit-lock-unregister #'eglot--update-hints) > (remove-overlays nil nil 'eglot--inlay-hint t)))) > > + > +;;; Semantic tokens > + > +(defcustom eglot-semantic-tokens-faces > + '(("namespace" . font-lock-keyword-face) > + ("type" . font-lock-type-face) > + ("class" . font-lock-type-face) > + ("enum" . font-lock-type-face) > + ("interface" . font-lock-type-face) > + ("struct" . font-lock-type-face) > + ("typeParameter" . font-lock-type-face) > + ("parameter" . font-lock-variable-name-face) > + ("variable" . font-lock-variable-name-face) > + ("property" . font-lock-property-use-face) > + ("enumMember" . font-lock-constant-face) > + ("event" . font-lock-variable-name-face) > + ("function" . font-lock-function-name-face) > + ("method" . font-lock-function-name-face) > + ("macro" . font-lock-preprocessor-face) > + ("keyword" . font-lock-keyword-face) > + ("modifier" . font-lock-function-name-face) > + ("comment" . font-lock-comment-face) > + ("string" . font-lock-string-face) > + ("number" . font-lock-constant-face) > + ("regexp" . font-lock-string-face) > + ("operator" . font-lock-function-name-face) > + ("decorator" . font-lock-type-face)) > + "Alist of faces to use to highlight semantic tokens. > +Each element is a cons cell whose car is a token type name and cdr is > +the face to use." > + :type `(alist :key-type (string :tag "Token name") > + :value-type (choice (face :tag "Face") > + (plist :tag "Face Attributes" > + :key-type > + (choice > + ,@(mapcar > + (lambda (cell) > + `(const :tag ,(capitalize > + (cdr cell)) > + ,(car cell))) > + face-attribute-name-alist)))))) > + > +(defcustom eglot-semantic-tokens-modifier-faces > + '(("declaration" . font-lock-function-name-face) > + ("definition" . font-lock-function-name-face) > + ("readonly" . font-lock-constant-face) > + ("static" . font-lock-keyword-face) > + ("deprecated" . eglot-diagnostic-tag-deprecated-face) > + ("abstract" . font-lock-keyword-face) > + ("async" . font-lock-preprocessor-face) > + ("modification" . font-lock-function-name-face) > + ("documentation" . font-lock-doc-face) > + ("defaultLibrary" . font-lock-builtin-face)) > + "List of face to use to highlight tokens with modifiers. > +Each element is a cons cell whose car is a modifier name and cdr is > +the face to use." > + :type `(alist :key-type (string :tag "Token name") > + :value-type (choice (face :tag "Face") > + (plist :tag "Face Attributes" > + :key-type > + (choice > + ,@(mapcar > + (lambda (cell) > + `(const :tag ,(capitalize > + (cdr cell)) > + ,(car cell))) > + face-attribute-name-alist)))))) > + > +(defvar-local eglot--semtok-idle-timer nil > + "Idle timer to request full semantic tokens.") > + > +(defvar-local eglot--semtok-cache nil) > + > +(defsubst eglot--semtok-put-cache (k v) > + "Set key K of `eglot-semantic-tokens--cache' to V." > + (setq eglot--semtok-cache > + (plist-put eglot--semtok-cache k v))) > + > +;; Process response > + > +(defun eglot--semtok-ingest-range-response (response) > + "Handle RESPONSE to semanticTokens/range request." > + (eglot--semtok-put-cache :response response) > + (cl-assert (plist-get eglot--semtok-cache :region))) > + > +(defun eglot--semtok-ingest-full-response (response) > + "Handle RESPONSE to semanticTokens/full request." > + (eglot--semtok-put-cache :response response) > + (cl-assert (not (plist-get eglot--semtok-cache :region)))) > + > +(defsubst eglot--semtok-apply-delta-edits (old-data edits) > + "Apply EDITS obtained from full/delta request to OLD-DATA." > + (let* ((old-token-count (length old-data)) > + (old-token-index 0) > + (substrings)) > + (cl-loop for edit across edits do > + (when (< old-token-index (plist-get edit :start)) > + (push (substring old-data old-token-index (plist-get edit :start)) substrings)) > + (push (plist-get edit :data) substrings) > + (setq old-token-index (+ (plist-get edit :start) (plist-get edit :deleteCount))) > + finally do (push (substring old-data old-token-index old-token-count) substrings)) > + (apply #'vconcat (nreverse substrings)))) > + > +(defun eglot--semtok-ingest-full/delta-response (response) > + "Handle RESPONSE to semanticTokens/full/delta request." > + (if-let* ((edits (plist-get response :edits))) > + (progn > + (cl-assert (not (plist-get eglot--semtok-cache :region))) > + (when-let* ((old-data (plist-get (plist-get eglot--semtok-cache :response) :data))) > + (eglot--semtok-put-cache > + :response > + (plist-put response :data (eglot--semtok-apply-delta-edits old-data edits))))) > + ;; server decided to send full response instead > + (eglot--semtok-ingest-full-response response))) > + > +(defun eglot--semtok-request (region &optional fontify) > + "Send semantic tokens request to the language server. > +A full/delta request will be sent if delta requests are supported by the > +language server and a full set of tokens had previously been received. > +Otherwise, a ranged request will be dispatched if REGION is non-nil and > +ranged requests are supported by the language server. In all other > +cases, a full tokens request will be dispatched. > + > +If FONTIFY is non-nil, refontify after the request completes." > + (let* ((method :textDocument/semanticTokens/full) > + (params (list :textDocument (eglot--TextDocumentIdentifier))) > + (response-handler #'eglot--semtok-ingest-full-response) > + (final-region nil) > + (buf (current-buffer))) > + (cond > + ((and (eglot-server-capable :semanticTokensProvider :full :delta) > + (let ((response (plist-get eglot--semtok-cache :response))) > + (and (plist-get response :resultId) (plist-get response :data) > + (not (plist-get eglot--semtok-cache :region))))) > + (setq method :textDocument/semanticTokens/full/delta) > + (setq response-handler #'eglot--semtok-ingest-full/delta-response) > + (setq params > + (plist-put params :previousResultId > + (plist-get (plist-get eglot--semtok-cache :response) :resultId)))) > + ((and region (eglot-server-capable :semanticTokensProvider :range)) > + (setq method :textDocument/semanticTokens/range) > + (setq final-region region) > + (setq params > + (plist-put params :range (eglot-region-range > + (car final-region) (cdr final-region)))) > + (setq response-handler #'eglot--semtok-ingest-range-response))) > + (eglot--async-request > + (eglot--current-server-or-lose) method params > + :success-fn > + (lambda (response) > + (eglot--when-live-buffer buf > + (eglot--semtok-put-cache :documentVersion eglot--versioned-identifier) > + (eglot--semtok-put-cache :region final-region) > + (funcall response-handler response) > + (when fontify (jit-lock-refontify (car-safe region) (cdr-safe region))) > + (when final-region (eglot--semtok-request-full-on-idle)))) > + :hint #'eglot--semtok-request))) > + > +(defun eglot--semtok-fontify (beg end) > + "Apply the cached semantic tokens from BEG to END." > + (with-slots ((modifier-cache semtok-modifier-cache) > + (faces semtok-faces) > + (modifier-faces semtok-modifier-faces)) > + (eglot-current-server) > + (cond > + ((not (and faces > + eglot--semtok-cache > + (plist-get eglot--semtok-cache :response) > + (eq eglot--versioned-identifier (plist-get eglot--semtok-cache :documentVersion)))) > + (eglot--semtok-request (cons beg end) t)) > + (t > + ;; if we're using the response to a ranged request, we'll only be able to fontify within > + ;; that range (and hence shouldn't clear any highlights outside of that range) > + (when-let* ((token-region (plist-get eglot--semtok-cache :region))) > + (progn > + (when (or (< beg (car token-region)) > + (> end (cdr token-region))) > + ;; truncated! continue, but request again > + (eglot--semtok-request (cons beg end) t)) > + (setq beg (max beg (car token-region))) > + (setq end (min end (cdr token-region))))) > + (eglot--widening > + (with-silent-modifications > + (remove-list-of-text-properties beg end '(font-lock-face)) > + (let* ((inhibit-field-text-motion t) > + (data (plist-get (plist-get eglot--semtok-cache :response) :data)) > + (i-max (length data)) > + (beg-bol (and (goto-char beg) (line-beginning-position))) > + (property-beg) > + (property-end)) > + (goto-char (point-min)) > + (cl-do ((i 0 (+ i 5)) (column 0)) ((>= i i-max)) > + (when (> (aref data i) 0) > + (setq column 0) > + (forward-line (aref data i))) > + (unless (< (point) beg-bol) > + (setq column (+ column (aref data (+ i 1)))) > + (funcall eglot-move-to-linepos-function column) > + (when (> (point) end) (cl-return)) > + (setq property-beg (point)) > + (funcall eglot-move-to-linepos-function (+ column (aref data (+ i 2)))) > + (setq property-end (point)) > + (when-let* ((face (aref faces (aref data (+ i 3))))) > + (put-text-property property-beg property-end 'font-lock-face face)) > + (let* ((code (aref data (+ i 4))) > + (faces (gethash code modifier-cache 'not-found))) > + (when (eq faces 'not-found) > + (setq faces nil) > + (cl-loop for j from 0 below (length modifier-faces) > + if (> (logand code (ash 1 j)) 0) > + if (aref modifier-faces j) > + collect (aref modifier-faces j) into faces) > + (puthash code faces modifier-cache)) > + (dolist (face faces) > + (put-text-property property-beg property-end 'font-lock-face face)))))))) > + `(jit-lock-bounds ,beg . ,end))))) > + > +(defun eglot--semtok-request-full-on-idle () > + "Make a full semantic tokens request after an idle timer." > + (let* ((buf (current-buffer)) > + (fun (lambda () > + (eglot--when-live-buffer buf > + (eglot--semtok-request nil))))) > + (when eglot--semtok-idle-timer (cancel-timer eglot--semtok-idle-timer)) > + (setq eglot--semtok-idle-timer (run-with-idle-timer (* 3 eglot-send-changes-idle-time) nil fun)))) > + > +(defun eglot--semtok-on-refresh (server) > + "Clear semantic tokens within all buffers of SERVER." > + (cl-loop for buffer in (eglot--managed-buffers server) do > + (with-current-buffer buffer > + (setq eglot--semtok-cache nil) > + (jit-lock-refontify)))) > + > +(let ((debounce-timer nil)) > + (cl-defmethod eglot-handle-request > + (server (_method (eql workspace/semanticTokens/refresh))) > + "Handle a semanticTokens/refresh request from SERVER." > + (when debounce-timer (cancel-timer debounce-timer)) > + (setq debounce-timer (run-with-timer 5 nil #'eglot--semtok-on-refresh server)) > + nil)) > + > +;; Initialization > +(defun eglot--semtok-build-face-map (identifiers faces category varname) > + "Build map of FACES for IDENTIFIERS using CATEGORY and VARNAME." > + (vconcat > + (mapcar (lambda (id) > + (let ((maybe-face (cdr (assoc id faces)))) > + (when (not maybe-face) > + (display-warning > + 'eglot-semtok > + (format-message "No face has been associated to the %s `%s': consider adding a corresponding definition to %s" > + category id varname))) > + maybe-face)) > + identifiers))) > + > +(defun eglot--semtok-initialize (server) > + "Initialize SERVER for semantic tokens." > + (cl-destructuring-bind (&key tokenTypes tokenModifiers &allow-other-keys) > + (plist-get (plist-get (eglot--capabilities server) > + :semanticTokensProvider) > + :legend) > + (oset server semtok-faces > + (eglot--semtok-build-face-map > + tokenTypes eglot-semantic-tokens-faces > + "semantic token" "eglot--semtokfaces")) > + (oset server semtok-modifier-faces > + (eglot--semtok-build-face-map > + tokenModifiers eglot-semantic-tokens-modifier-faces > + "semantic token modifier" "eglot--semtokmodifier-faces")))) > + > +(define-minor-mode eglot-semantic-tokens-mode > + "Minor mode for fontifying buffer with LSP server's semantic tokens." > + :global nil > + (cond (eglot-semantic-tokens-mode > + (if (eglot-server-capable :semanticTokensProvider) > + (jit-lock-register #'eglot--semtok-fontify 'contextual) > + (eglot-semantic-tokens-mode -1))) > + (t > + (jit-lock-unregister #'eglot--semtok-fontify) > + (with-silent-modifications > + (remove-list-of-text-properties (point-min) (point-max) '(font-lock-face)))))) > + > > ;;; Call and type hierarchies > (require 'button) > @@ -4728,7 +5036,8 @@ If NOERROR, return predicate, else erroring function." > ;; harder. For now, use `with-eval-after-load'. See also github#1183. > (with-eval-after-load 'desktop > (add-to-list 'desktop-minor-mode-handlers '(eglot--managed-mode . ignore)) > - (add-to-list 'desktop-minor-mode-handlers '(eglot-inlay-hints-mode . ignore))) > + (add-to-list 'desktop-minor-mode-handlers '(eglot-inlay-hints-mode . ignore)) > + (add-to-list 'desktop-minor-mode-handlers '(eglot-semantic-tokens-mode . ignore))) > > > ;;; Misc > @@ -4757,6 +5066,7 @@ If NOERROR, return predicate, else erroring function." > eglot-format > eglot-format-buffer > eglot-inlay-hints-mode > + eglot-semantic-tokens-mode > eglot-reconnect > eglot-rename > eglot-signal-didChangeConfiguration > -- > 2.51.0 > From unknown Sat Sep 13 11:38:41 2025 X-Loop: help-debbugs@gnu.org Subject: bug#79374: [PATCH] eglot: add support for semantic tokens Resent-From: =?UTF-8?Q?Jo=C3=A3o_?= =?UTF-8?Q?T=C3=A1vora?= Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 13 Sep 2025 09:12:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 79374 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Eli Zaretskii Cc: me@lua.blog.br, philipk@posteo.net, 79374@debbugs.gnu.org Received: via spool by 79374-submit@debbugs.gnu.org id=B79374.175775471330820 (code B ref 79374); Sat, 13 Sep 2025 09:12:02 +0000 Received: (at 79374) by debbugs.gnu.org; 13 Sep 2025 09:11:53 +0000 Received: from localhost ([127.0.0.1]:53467 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uxMIQ-00080t-Kl for submit@debbugs.gnu.org; Sat, 13 Sep 2025 05:11:52 -0400 Received: from mail-ot1-x333.google.com ([2607:f8b0:4864:20::333]:53529) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from ) id 1uxMIK-00080M-V2 for 79374@debbugs.gnu.org; Sat, 13 Sep 2025 05:11:48 -0400 Received: by mail-ot1-x333.google.com with SMTP id 46e09a7af769-74542b1b2bcso2946381a34.3 for <79374@debbugs.gnu.org>; Sat, 13 Sep 2025 02:11:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1757754698; x=1758359498; darn=debbugs.gnu.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=HEDRX0W6eL1TPCOWlcnQCFTzXoeHUqymXd3YwPb4+4c=; b=OoujEUzQMY6tp/+HfNnmgrTcfbu/fAJDYDW0wrY28e3OorUMMi6fxhL+S52/ZvQLXE KZbs3R8t29CfOzKAkBFphHF00QVTu2mL+DhvC3/XzBg3miWAYouykKpV56qjFXQKVGPW NyFUMTHZ9dgHLS76wUmVipZjAy0Z8Aksq32AeYoEI8ttEe2DOptIAQQBaCpRWoOsRhEF XWcpBMULuodDQB7wXeYEaR/KgLMmQzdTA11T+Ta4iEeN3CjHHpfcosFYhf+H4XafHDt3 GzwB1OdgZUalrj2P5ozIeuyThPK2rL7jIHQ9u2pR9DzuSpU6PSMYRjEX7YgT3zoceIM6 pK+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757754698; x=1758359498; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=HEDRX0W6eL1TPCOWlcnQCFTzXoeHUqymXd3YwPb4+4c=; b=lwsNtctpyj/qgGCr9zztwWkboY0nviWxn0Iv5ZT3ZSeOj9ERe0kUPELRO57iLifG4o EhGhLaEILEGl2KK31q5/1ydjdnb8lv3bWB0vSndUT1FxFrzTh2wMlALuc5t/RwABhvK0 9PFVaKUITDO/sPnKoVCwbZYbEA2PdSyBA09Z4MTVw3zr8hAKaWZZQx2dG8SLwi19eS6a hJoRXNNkKSl7qVfW2QEH8mJdPh/QeB4cend/XZKDj1OFdUu2W0zcB9Mc9+ppk/xlCnrz iSpinlDhdYFXj1eMFkkF8jJ+CgMhygUxXmOdDaWRBXhXd5wk62og5q7/vmXHI+JkivL8 ofxg== X-Forwarded-Encrypted: i=1; AJvYcCXz0byugG1hzICXx9AUFfkfwTFGqdu5LCLOWO47xXgATnzygIZNN5BjV520jkeckL0AABXofQ==@debbugs.gnu.org X-Gm-Message-State: AOJu0Yx+XChR1oCU5cwCeyz4XPDj2O5ov6lAsZNs6JCELlhyUv3Nvo3t ruQFipA0HIu/aMC3eU8cSRXad76JMOLgapxgiKiM9t6zAHog6B0r4PQibM46WD3BoOkMMu+7J3t XpKZjNrZHrMBvufUAZ2y+MAYYbGidIK4= X-Gm-Gg: ASbGncsJ/Qrpb3+AYXf9+Az5pUuWM072z4Z1Vnz+gJeQMH8bMNZTtB8R75Xn4nMX9zy Y/Q9ToAjUq8AN8ufrLy8ms1XzwCtwCZyVsikWJY9bqbujyTUjJSgbjZ/XmJVciYNbWHvIRyb7ga XVmsoX9ynWlWjau5HgyJo/iPJUE6ERDQ5pha6zNwwxt7aeFdxm4db68wa38pMcTL+9p6teFZujD 2jONU4xXxpjyWSx0Q== X-Google-Smtp-Source: AGHT+IE1fS0Goohsd0vv/dggZocJU38sIyLea4DTVQwfB4/d4FqSQoczgCUe4Laa4fBrgRhCwX1XvySMXhFux+6FgT4= X-Received: by 2002:a05:6830:698e:b0:745:6528:3d52 with SMTP id 46e09a7af769-75353875b51mr3408872a34.14.1757754698332; Sat, 13 Sep 2025 02:11:38 -0700 (PDT) MIME-Version: 1.0 References: <2c03b490-5006-4ad4-a090-fafc8a18405d@lua.blog.br> <87ecsoc6cz.fsf@posteo.net> <86348qss28.fsf@gnu.org> In-Reply-To: <86348qss28.fsf@gnu.org> From: =?UTF-8?Q?Jo=C3=A3o_?= =?UTF-8?Q?T=C3=A1vora?= Date: Sat, 13 Sep 2025 10:12:38 +0100 X-Gm-Features: Ac12FXxYn004JjrojK3ievJhePUwURb0Jeyu-Uo7oOs16UGFfUOb3EJUeU_-TB8 Message-ID: Content-Type: multipart/alternative; boundary="000000000000657d5a063eab28d8" X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --000000000000657d5a063eab28d8 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Sat, Sep 13, 2025 at 8:57=E2=80=AFAM Eli Zaretskii wrote: > Jo=C3=A3o, any comments on the patch? Should I install it? > No, don't . This is a significant feature which is missing testing, documentations and a much more thorough review. I don't have time for that right now. I can say that, from a very cursory review, it is the best version of this feature ever proposed to Eglot. Jo=C3=A3o > > Cc: 79374@debbugs.gnu.org, > > Jo=C3=A3o T=C3=A1vora > > From: "Lua V. R." > > Date: Thu, 4 Sep 2025 00:02:51 +0000 (UTC) > > > > Hi Philip, > > > > Em 03/09/2025 05:01, Philip Kaludercic escreveu: > > > As mentioned on Emacs-devel, shouldn't this be > `eglot-semantic-tokens-mode'. > > Thanks for catching this :) I fixed it among other things, and I > > apologize for being unfamiliar with the e-mail git workflow. I don't > > know if I should send a patch on top of the previous patch, but I'm > > sending a squashed one. > > > > In this new patch I also removed a "hash" I used in attempt to avoid a > > burst of requests, because it was not working in some particular > > situations (I can explain if you want). Now, due to how jit-lock works, > > Eglot may send two requests after a didChange if the server does not > > support delta requests. But this was also the case in the version with > > the hash, so alas, it was just complicating things. > > > > From 32471c4a0fc9ca80ae8d3c299a3bd55581f8cb04 Mon Sep 17 00:00:00 2001 > > From: Lua Viana Reis > > Date: Tue, 2 Sep 2025 19:03:52 -0300 > > Subject: [PATCH] add semantic tokens support for eglot > > > > --- > > lisp/progmodes/eglot.el | 316 +++++++++++++++++++++++++++++++++++++++- > > 1 file changed, 313 insertions(+), 3 deletions(-) > > > > diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el > > index 475b5e13f1..1d9fb7905d 100644 > > --- a/lisp/progmodes/eglot.el > > +++ b/lisp/progmodes/eglot.el > > @@ -141,6 +141,8 @@ > > (defvar company-tooltip-align-annotations) > > (defvar tramp-ssh-controlmaster-options) > > (defvar tramp-use-ssh-controlmaster-options) > > +(defvar eglot-semantic-tokens-faces) > > +(defvar eglot-semantic-tokens-modifier-faces) > > > > > > ;;; Obsolete aliases > > @@ -1017,6 +1019,7 @@ object." > > `(:dynamicRegistration > > ,(if (eglot--trampish-p s) :json-false t)) > > :symbol `(:dynamicRegistration :json-false) > > + :semanticTokens '(:refreshSupport t) > > :configuration t > > :workspaceFolders t) > > :textDocument > > @@ -1079,6 +1082,13 @@ object." > > :formatting `(:dynamicRegistration :json-false) > > :rangeFormatting `(:dynamicRegistration :json-false) > > :rename `(:dynamicRegistration :json-false) > > + :semanticTokens `(:dynamicRegistration :json-false > > + :requests '(:range t :full (:delta > t)) > > + :tokenModifiers [,@(mapcar #'car > eglot-semantic-tokens-modifier-faces)] > > + :overlappingTokenSupport t > > + :multilineTokenSupport t > > + :tokenTypes [,@(mapcar #'car > eglot-semantic-tokens-faces)] > > + :formats ["relative"]) > > :inlayHint `(:dynamicRegistration :json-false) > > :callHierarchy `(:dynamicRegistration :json-false) > > :typeHierarchy `(:dynamicRegistration :json-false) > > @@ -1149,7 +1159,16 @@ object." > > :accessor eglot--managed-buffers) > > (saved-initargs > > :documentation "Saved initargs for reconnection purposes." > > - :accessor eglot--saved-initargs)) > > + :accessor eglot--saved-initargs) > > + (semtok-faces > > + :initform nil > > + :documentation "Semantic tokens faces.") > > + (semtok-modifier-faces > > + :initform nil > > + :documentation "Semantic tokens modifier faces.") > > + (semtok-modifier-cache > > + :initform (make-hash-table) > > + :documentation "A hashmap of modifier values to the selected > faces.")) > > :documentation > > "Represents a server. Wraps a process for LSP communication.") > > > > @@ -1211,6 +1230,11 @@ If optional MARKERS, make markers instead." > > (end (eglot--lsp-position-to-point (plist-get range :end) > markers))) > > (cons beg end))) > > > > +(defun eglot-region-range (beg end) > > + "Return a LSP range representing region BEG to END." > > + (list :start (eglot--pos-to-lsp-position beg) > > + :end (eglot--pos-to-lsp-position end))) > > + > > (defun eglot-server-capable (&rest feats) > > "Determine if current server is capable of FEATS." > > (unless (cl-some (lambda (feat) > > @@ -1576,7 +1600,8 @@ Use current server's or first available Eglot > events buffer." > > (jsonrpc-forget-pending-continuations server)) > > > > (defvar eglot-connect-hook > > - '(eglot-signal-didChangeConfiguration) > > + '(eglot-signal-didChangeConfiguration > > + eglot--semtok-initialize) > > "Hook run after connecting to a server. > > Each function is passed an `eglot-lsp-server' instance > > as argument.") > > @@ -2291,6 +2316,7 @@ If it is activated, also signal > textDocument/didOpen." > > ;; Run user hook after 'textDocument/didOpen' so server knows > > ;; about the buffer. > > (eglot-inlay-hints-mode 1) > > + (eglot-semantic-tokens-mode 1) > > (run-hooks 'eglot-managed-mode-hook)))) > > > > (add-hook 'after-change-major-mode-hook > #'eglot--maybe-activate-editing-mode) > > @@ -4494,6 +4520,288 @@ If NOERROR, return predicate, else erroring > function." > > (jit-lock-unregister #'eglot--update-hints) > > (remove-overlays nil nil 'eglot--inlay-hint t)))) > > > > + > > +;;; Semantic tokens > > + > > +(defcustom eglot-semantic-tokens-faces > > + '(("namespace" . font-lock-keyword-face) > > + ("type" . font-lock-type-face) > > + ("class" . font-lock-type-face) > > + ("enum" . font-lock-type-face) > > + ("interface" . font-lock-type-face) > > + ("struct" . font-lock-type-face) > > + ("typeParameter" . font-lock-type-face) > > + ("parameter" . font-lock-variable-name-face) > > + ("variable" . font-lock-variable-name-face) > > + ("property" . font-lock-property-use-face) > > + ("enumMember" . font-lock-constant-face) > > + ("event" . font-lock-variable-name-face) > > + ("function" . font-lock-function-name-face) > > + ("method" . font-lock-function-name-face) > > + ("macro" . font-lock-preprocessor-face) > > + ("keyword" . font-lock-keyword-face) > > + ("modifier" . font-lock-function-name-face) > > + ("comment" . font-lock-comment-face) > > + ("string" . font-lock-string-face) > > + ("number" . font-lock-constant-face) > > + ("regexp" . font-lock-string-face) > > + ("operator" . font-lock-function-name-face) > > + ("decorator" . font-lock-type-face)) > > + "Alist of faces to use to highlight semantic tokens. > > +Each element is a cons cell whose car is a token type name and cdr is > > +the face to use." > > + :type `(alist :key-type (string :tag "Token name") > > + :value-type (choice (face :tag "Face") > > + (plist :tag "Face Attributes" > > + :key-type > > + (choice > > + ,@(mapcar > > + (lambda (cell) > > + `(const :tag > ,(capitalize > > + (cdr > cell)) > > + ,(car cell))) > > + > face-attribute-name-alist)))))) > > + > > +(defcustom eglot-semantic-tokens-modifier-faces > > + '(("declaration" . font-lock-function-name-face) > > + ("definition" . font-lock-function-name-face) > > + ("readonly" . font-lock-constant-face) > > + ("static" . font-lock-keyword-face) > > + ("deprecated" . eglot-diagnostic-tag-deprecated-face) > > + ("abstract" . font-lock-keyword-face) > > + ("async" . font-lock-preprocessor-face) > > + ("modification" . font-lock-function-name-face) > > + ("documentation" . font-lock-doc-face) > > + ("defaultLibrary" . font-lock-builtin-face)) > > + "List of face to use to highlight tokens with modifiers. > > +Each element is a cons cell whose car is a modifier name and cdr is > > +the face to use." > > + :type `(alist :key-type (string :tag "Token name") > > + :value-type (choice (face :tag "Face") > > + (plist :tag "Face Attributes" > > + :key-type > > + (choice > > + ,@(mapcar > > + (lambda (cell) > > + `(const :tag > ,(capitalize > > + (cdr > cell)) > > + ,(car cell))) > > + > face-attribute-name-alist)))))) > > + > > +(defvar-local eglot--semtok-idle-timer nil > > + "Idle timer to request full semantic tokens.") > > + > > +(defvar-local eglot--semtok-cache nil) > > + > > +(defsubst eglot--semtok-put-cache (k v) > > + "Set key K of `eglot-semantic-tokens--cache' to V." > > + (setq eglot--semtok-cache > > + (plist-put eglot--semtok-cache k v))) > > + > > +;; Process response > > + > > +(defun eglot--semtok-ingest-range-response (response) > > + "Handle RESPONSE to semanticTokens/range request." > > + (eglot--semtok-put-cache :response response) > > + (cl-assert (plist-get eglot--semtok-cache :region))) > > + > > +(defun eglot--semtok-ingest-full-response (response) > > + "Handle RESPONSE to semanticTokens/full request." > > + (eglot--semtok-put-cache :response response) > > + (cl-assert (not (plist-get eglot--semtok-cache :region)))) > > + > > +(defsubst eglot--semtok-apply-delta-edits (old-data edits) > > + "Apply EDITS obtained from full/delta request to OLD-DATA." > > + (let* ((old-token-count (length old-data)) > > + (old-token-index 0) > > + (substrings)) > > + (cl-loop for edit across edits do > > + (when (< old-token-index (plist-get edit :start)) > > + (push (substring old-data old-token-index (plist-get edit > :start)) substrings)) > > + (push (plist-get edit :data) substrings) > > + (setq old-token-index (+ (plist-get edit :start) (plist-get edit > :deleteCount))) > > + finally do (push (substring old-data old-token-index > old-token-count) substrings)) > > + (apply #'vconcat (nreverse substrings)))) > > + > > +(defun eglot--semtok-ingest-full/delta-response (response) > > + "Handle RESPONSE to semanticTokens/full/delta request." > > + (if-let* ((edits (plist-get response :edits))) > > + (progn > > + (cl-assert (not (plist-get eglot--semtok-cache :region))) > > + (when-let* ((old-data (plist-get (plist-get eglot--semtok-cach= e > :response) :data))) > > + (eglot--semtok-put-cache > > + :response > > + (plist-put response :data (eglot--semtok-apply-delta-edits > old-data edits))))) > > + ;; server decided to send full response instead > > + (eglot--semtok-ingest-full-response response))) > > + > > +(defun eglot--semtok-request (region &optional fontify) > > + "Send semantic tokens request to the language server. > > +A full/delta request will be sent if delta requests are supported by t= he > > +language server and a full set of tokens had previously been received. > > +Otherwise, a ranged request will be dispatched if REGION is non-nil an= d > > +ranged requests are supported by the language server. In all other > > +cases, a full tokens request will be dispatched. > > + > > +If FONTIFY is non-nil, refontify after the request completes." > > + (let* ((method :textDocument/semanticTokens/full) > > + (params (list :textDocument (eglot--TextDocumentIdentifier))) > > + (response-handler #'eglot--semtok-ingest-full-response) > > + (final-region nil) > > + (buf (current-buffer))) > > + (cond > > + ((and (eglot-server-capable :semanticTokensProvider :full :delta) > > + (let ((response (plist-get eglot--semtok-cache :response))) > > + (and (plist-get response :resultId) (plist-get response > :data) > > + (not (plist-get eglot--semtok-cache :region))))) > > + (setq method :textDocument/semanticTokens/full/delta) > > + (setq response-handler #'eglot--semtok-ingest-full/delta-respons= e) > > + (setq params > > + (plist-put params :previousResultId > > + (plist-get (plist-get eglot--semtok-cache > :response) :resultId)))) > > + ((and region (eglot-server-capable :semanticTokensProvider :range= )) > > + (setq method :textDocument/semanticTokens/range) > > + (setq final-region region) > > + (setq params > > + (plist-put params :range (eglot-region-range > > + (car final-region) (cdr > final-region)))) > > + (setq response-handler #'eglot--semtok-ingest-range-response))) > > + (eglot--async-request > > + (eglot--current-server-or-lose) method params > > + :success-fn > > + (lambda (response) > > + (eglot--when-live-buffer buf > > + (eglot--semtok-put-cache :documentVersion > eglot--versioned-identifier) > > + (eglot--semtok-put-cache :region final-region) > > + (funcall response-handler response) > > + (when fontify (jit-lock-refontify (car-safe region) (cdr-safe > region))) > > + (when final-region (eglot--semtok-request-full-on-idle)))) > > + :hint #'eglot--semtok-request))) > > + > > +(defun eglot--semtok-fontify (beg end) > > + "Apply the cached semantic tokens from BEG to END." > > + (with-slots ((modifier-cache semtok-modifier-cache) > > + (faces semtok-faces) > > + (modifier-faces semtok-modifier-faces)) > > + (eglot-current-server) > > + (cond > > + ((not (and faces > > + eglot--semtok-cache > > + (plist-get eglot--semtok-cache :response) > > + (eq eglot--versioned-identifier (plist-get > eglot--semtok-cache :documentVersion)))) > > + (eglot--semtok-request (cons beg end) t)) > > + (t > > + ;; if we're using the response to a ranged request, we'll only b= e > able to fontify within > > + ;; that range (and hence shouldn't clear any highlights outside > of that range) > > + (when-let* ((token-region (plist-get eglot--semtok-cache > :region))) > > + (progn > > + (when (or (< beg (car token-region)) > > + (> end (cdr token-region))) > > + ;; truncated! continue, but request again > > + (eglot--semtok-request (cons beg end) t)) > > + (setq beg (max beg (car token-region))) > > + (setq end (min end (cdr token-region))))) > > + (eglot--widening > > + (with-silent-modifications > > + (remove-list-of-text-properties beg end '(font-lock-face)) > > + (let* ((inhibit-field-text-motion t) > > + (data (plist-get (plist-get eglot--semtok-cache > :response) :data)) > > + (i-max (length data)) > > + (beg-bol (and (goto-char beg) > (line-beginning-position))) > > + (property-beg) > > + (property-end)) > > + (goto-char (point-min)) > > + (cl-do ((i 0 (+ i 5)) (column 0)) ((>=3D i i-max)) > > + (when (> (aref data i) 0) > > + (setq column 0) > > + (forward-line (aref data i))) > > + (unless (< (point) beg-bol) > > + (setq column (+ column (aref data (+ i 1)))) > > + (funcall eglot-move-to-linepos-function column) > > + (when (> (point) end) (cl-return)) > > + (setq property-beg (point)) > > + (funcall eglot-move-to-linepos-function (+ column (are= f > data (+ i 2)))) > > + (setq property-end (point)) > > + (when-let* ((face (aref faces (aref data (+ i 3))))) > > + (put-text-property property-beg property-end > 'font-lock-face face)) > > + (let* ((code (aref data (+ i 4))) > > + (faces (gethash code modifier-cache 'not-found)= )) > > + (when (eq faces 'not-found) > > + (setq faces nil) > > + (cl-loop for j from 0 below (length modifier-faces= ) > > + if (> (logand code (ash 1 j)) 0) > > + if (aref modifier-faces j) > > + collect (aref modifier-faces j) into face= s) > > + (puthash code faces modifier-cache)) > > + (dolist (face faces) > > + (put-text-property property-beg property-end > 'font-lock-face face)))))))) > > + `(jit-lock-bounds ,beg . ,end))))) > > + > > +(defun eglot--semtok-request-full-on-idle () > > + "Make a full semantic tokens request after an idle timer." > > + (let* ((buf (current-buffer)) > > + (fun (lambda () > > + (eglot--when-live-buffer buf > > + (eglot--semtok-request nil))))) > > + (when eglot--semtok-idle-timer (cancel-timer > eglot--semtok-idle-timer)) > > + (setq eglot--semtok-idle-timer (run-with-idle-timer (* 3 > eglot-send-changes-idle-time) nil fun)))) > > + > > +(defun eglot--semtok-on-refresh (server) > > + "Clear semantic tokens within all buffers of SERVER." > > + (cl-loop for buffer in (eglot--managed-buffers server) do > > + (with-current-buffer buffer > > + (setq eglot--semtok-cache nil) > > + (jit-lock-refontify)))) > > + > > +(let ((debounce-timer nil)) > > + (cl-defmethod eglot-handle-request > > + (server (_method (eql workspace/semanticTokens/refresh))) > > + "Handle a semanticTokens/refresh request from SERVER." > > + (when debounce-timer (cancel-timer debounce-timer)) > > + (setq debounce-timer (run-with-timer 5 nil > #'eglot--semtok-on-refresh server)) > > + nil)) > > + > > +;; Initialization > > +(defun eglot--semtok-build-face-map (identifiers faces category varnam= e) > > + "Build map of FACES for IDENTIFIERS using CATEGORY and VARNAME." > > + (vconcat > > + (mapcar (lambda (id) > > + (let ((maybe-face (cdr (assoc id faces)))) > > + (when (not maybe-face) > > + (display-warning > > + 'eglot-semtok > > + (format-message "No face has been associated to the > %s `%s': consider adding a corresponding definition to %s" > > + category id varname))) > > + maybe-face)) > > + identifiers))) > > + > > +(defun eglot--semtok-initialize (server) > > + "Initialize SERVER for semantic tokens." > > + (cl-destructuring-bind (&key tokenTypes tokenModifiers > &allow-other-keys) > > + (plist-get (plist-get (eglot--capabilities server) > > + :semanticTokensProvider) > > + :legend) > > + (oset server semtok-faces > > + (eglot--semtok-build-face-map > > + tokenTypes eglot-semantic-tokens-faces > > + "semantic token" "eglot--semtokfaces")) > > + (oset server semtok-modifier-faces > > + (eglot--semtok-build-face-map > > + tokenModifiers eglot-semantic-tokens-modifier-faces > > + "semantic token modifier" "eglot--semtokmodifier-faces")))) > > + > > +(define-minor-mode eglot-semantic-tokens-mode > > + "Minor mode for fontifying buffer with LSP server's semantic tokens.= " > > + :global nil > > + (cond (eglot-semantic-tokens-mode > > + (if (eglot-server-capable :semanticTokensProvider) > > + (jit-lock-register #'eglot--semtok-fontify 'contextual) > > + (eglot-semantic-tokens-mode -1))) > > + (t > > + (jit-lock-unregister #'eglot--semtok-fontify) > > + (with-silent-modifications > > + (remove-list-of-text-properties (point-min) (point-max) > '(font-lock-face)))))) > > + > > > > ;;; Call and type hierarchies > > (require 'button) > > @@ -4728,7 +5036,8 @@ If NOERROR, return predicate, else erroring > function." > > ;; harder. For now, use `with-eval-after-load'. See also github#1183. > > (with-eval-after-load 'desktop > > (add-to-list 'desktop-minor-mode-handlers '(eglot--managed-mode . > ignore)) > > - (add-to-list 'desktop-minor-mode-handlers '(eglot-inlay-hints-mode . > ignore))) > > + (add-to-list 'desktop-minor-mode-handlers '(eglot-inlay-hints-mode . > ignore)) > > + (add-to-list 'desktop-minor-mode-handlers > '(eglot-semantic-tokens-mode . ignore))) > > > > > > ;;; Misc > > @@ -4757,6 +5066,7 @@ If NOERROR, return predicate, else erroring > function." > > eglot-format > > eglot-format-buffer > > eglot-inlay-hints-mode > > + eglot-semantic-tokens-mode > > eglot-reconnect > > eglot-rename > > eglot-signal-didChangeConfiguration > > -- > > 2.51.0 > > > --=20 Jo=C3=A3o T=C3=A1vora --000000000000657d5a063eab28d8 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
On Sat, Sep 13, 2025 at 8:57=E2=80=AFAM Eli Z= aretskii <eliz@gnu.org> wrote:
Jo=C3=A3o, any comments on the patch?= =C2=A0 Should I install it?

No, don'= ;t . This is a significant feature which is missing testing,=C2=A0
documentations and a much more thorough review.=C2=A0 I don't
have time for that right now.

I can say that, f= rom a very cursory review, it is the best version=C2=A0
of this= =C2=A0 feature ever proposed to Eglot.

Jo=C3=A3o



> Cc: 79374@d= ebbugs.gnu.org,
>=C2=A0 Jo=C3=A3o T=C3=A1vora <joaotavora@gmail.com>
> From: "Lua V. R." <me@lua.blog.br>
> Date: Thu,=C2=A0 4 Sep 2025 00:02:51 +0000 (UTC)
>
> Hi Philip,
>
> Em 03/09/2025 05:01, Philip Kaludercic escreveu:
> > As mentioned on Emacs-devel, shouldn't this be `eglot-semanti= c-tokens-mode'.
> Thanks for catching this :) I fixed it among other things, and I
> apologize for being unfamiliar with the e-mail git workflow. I don'= ;t
> know if I should send a patch on top of the previous patch, but I'= m
> sending a squashed one.
>
> In this new patch I also removed a "hash" I used in attempt = to avoid a
> burst of requests, because it was not working in some particular
> situations (I can explain if you want). Now, due to how jit-lock works= ,
> Eglot may send two requests after a didChange if the server does not <= br> > support delta requests. But this was also the case in the version with=
> the hash, so alas, it was just complicating things.
>
> From 32471c4a0fc9ca80ae8d3c299a3bd55581f8cb04 Mon Sep 17 00:00:00 2001=
> From: Lua Viana Reis <me@lua.blog.br>
> Date: Tue, 2 Sep 2025 19:03:52 -0300
> Subject: [PATCH] add semantic tokens support for eglot
>
> ---
>=C2=A0 lisp/progmodes/eglot.el | 316 ++++++++++++++++++++++++++++++++++= +++++-
>=C2=A0 1 file changed, 313 insertions(+), 3 deletions(-)
>
> diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el
> index 475b5e13f1..1d9fb7905d 100644
> --- a/lisp/progmodes/eglot.el
> +++ b/lisp/progmodes/eglot.el
> @@ -141,6 +141,8 @@
>=C2=A0 (defvar company-tooltip-align-annotations)
>=C2=A0 (defvar tramp-ssh-controlmaster-options)
>=C2=A0 (defvar tramp-use-ssh-controlmaster-options)
> +(defvar eglot-semantic-tokens-faces)
> +(defvar eglot-semantic-tokens-modifier-faces)
>=C2=A0
>=C2=A0
>=C2=A0 ;;; Obsolete aliases
> @@ -1017,6 +1019,7 @@ object."
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 `(:dynamicRegistration
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 ,(if (eglot--trampish-p s) :json-false t))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 :symbol `(:dynamicRegistration :json-false)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 :semanticTokens '(:refreshSupport t)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 :configuration t
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 :workspaceFolders t)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 :textDocument
> @@ -1079,6 +1082,13 @@ object."
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:formatting=C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0`(:dynamicRegistration :json-false)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:rangeFormatting= =C2=A0 =C2=A0 `(:dynamicRegistration :json-false)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:rename=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0`(:dynamicRegistration :json-false= )
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:semanticTokens=C2=A0= =C2=A0 =C2=A0`(:dynamicRegistration :json-false
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:requests '(:ra= nge t :full (:delta t))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:tokenModifiers [,@= (mapcar #'car eglot-semantic-tokens-modifier-faces)]
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:overlappingTokenSu= pport t
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:multilineTokenSupp= ort t
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:tokenTypes [,@(map= car #'car eglot-semantic-tokens-faces)]
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:formats ["rel= ative"])
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:inlayHint=C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 `(:dynamicRegistration :json-false)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:callHierarchy= =C2=A0 =C2=A0 =C2=A0 `(:dynamicRegistration :json-false)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:typeHierarchy= =C2=A0 =C2=A0 =C2=A0 `(:dynamicRegistration :json-false)
> @@ -1149,7 +1159,16 @@ object."
>=C2=A0 =C2=A0 =C2=A0 :accessor eglot--managed-buffers)
>=C2=A0 =C2=A0 =C2=A0(saved-initargs
>=C2=A0 =C2=A0 =C2=A0 :documentation "Saved initargs for reconnecti= on purposes."
> -=C2=A0 =C2=A0 :accessor eglot--saved-initargs))
> +=C2=A0 =C2=A0 :accessor eglot--saved-initargs)
> +=C2=A0 =C2=A0(semtok-faces
> +=C2=A0 =C2=A0 :initform nil
> +=C2=A0 =C2=A0 :documentation "Semantic tokens faces.")
> +=C2=A0 =C2=A0(semtok-modifier-faces
> +=C2=A0 =C2=A0 :initform nil
> +=C2=A0 =C2=A0 :documentation "Semantic tokens modifier faces.&qu= ot;)
> +=C2=A0 =C2=A0(semtok-modifier-cache
> +=C2=A0 =C2=A0 :initform (make-hash-table)
> +=C2=A0 =C2=A0 :documentation "A hashmap of modifier values to th= e selected faces."))
>=C2=A0 =C2=A0 :documentation
>=C2=A0 =C2=A0 "Represents a server. Wraps a process for LSP commun= ication.")
>=C2=A0
> @@ -1211,6 +1230,11 @@ If optional MARKERS, make markers instead."= ;
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(end (eglot--lsp-position-to-p= oint (plist-get range :end) markers)))
>=C2=A0 =C2=A0 =C2=A0 (cons beg end)))
>=C2=A0
> +(defun eglot-region-range (beg end)
> +=C2=A0 "Return a LSP range representing region BEG to END."=
> +=C2=A0 (list :start (eglot--pos-to-lsp-position beg)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 :end (eglot--pos-to-lsp-position end))) > +
>=C2=A0 (defun eglot-server-capable (&rest feats)
>=C2=A0 =C2=A0 "Determine if current server is capable of FEATS.&qu= ot;
>=C2=A0 =C2=A0 (unless (cl-some (lambda (feat)
> @@ -1576,7 +1600,8 @@ Use current server's or first available Eglo= t events buffer."
>=C2=A0 =C2=A0 (jsonrpc-forget-pending-continuations server))
>=C2=A0
>=C2=A0 (defvar eglot-connect-hook
> -=C2=A0 '(eglot-signal-didChangeConfiguration)
> +=C2=A0 '(eglot-signal-didChangeConfiguration
> +=C2=A0 =C2=A0 eglot--semtok-initialize)
>=C2=A0 =C2=A0 "Hook run after connecting to a server.
>=C2=A0 Each function is passed an `eglot-lsp-server' instance
>=C2=A0 as argument.")
> @@ -2291,6 +2316,7 @@ If it is activated, also signal textDocument/did= Open."
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; Run user hook after 'textDocument/di= dOpen' so server knows
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; about the buffer.
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 (eglot-inlay-hints-mode 1)
> +=C2=A0 =C2=A0 =C2=A0 (eglot-semantic-tokens-mode 1)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 (run-hooks 'eglot-managed-mode-hook))))=
>=C2=A0
>=C2=A0 (add-hook 'after-change-major-mode-hook #'eglot--maybe-a= ctivate-editing-mode)
> @@ -4494,6 +4520,288 @@ If NOERROR, return predicate, else erroring fu= nction."
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(jit-lock-unregister #'egl= ot--update-hints)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(remove-overlays nil nil '= eglot--inlay-hint t))))
>=C2=A0
> +=0C
> +;;; Semantic tokens
> +
> +(defcustom eglot-semantic-tokens-faces
> +=C2=A0 '(("namespace" . font-lock-keyword-face)
> +=C2=A0 =C2=A0 ("type" . font-lock-type-face)
> +=C2=A0 =C2=A0 ("class" . font-lock-type-face)
> +=C2=A0 =C2=A0 ("enum" . font-lock-type-face)
> +=C2=A0 =C2=A0 ("interface" . font-lock-type-face)
> +=C2=A0 =C2=A0 ("struct" . font-lock-type-face)
> +=C2=A0 =C2=A0 ("typeParameter" . font-lock-type-face)
> +=C2=A0 =C2=A0 ("parameter" . font-lock-variable-name-face)<= br> > +=C2=A0 =C2=A0 ("variable" . font-lock-variable-name-face) > +=C2=A0 =C2=A0 ("property" . font-lock-property-use-face) > +=C2=A0 =C2=A0 ("enumMember" . font-lock-constant-face)
> +=C2=A0 =C2=A0 ("event" . font-lock-variable-name-face)
> +=C2=A0 =C2=A0 ("function" . font-lock-function-name-face) > +=C2=A0 =C2=A0 ("method" . font-lock-function-name-face)
> +=C2=A0 =C2=A0 ("macro" . font-lock-preprocessor-face)
> +=C2=A0 =C2=A0 ("keyword" . font-lock-keyword-face)
> +=C2=A0 =C2=A0 ("modifier" . font-lock-function-name-face) > +=C2=A0 =C2=A0 ("comment" . font-lock-comment-face)
> +=C2=A0 =C2=A0 ("string" . font-lock-string-face)
> +=C2=A0 =C2=A0 ("number" . font-lock-constant-face)
> +=C2=A0 =C2=A0 ("regexp" . font-lock-string-face)
> +=C2=A0 =C2=A0 ("operator" . font-lock-function-name-face) > +=C2=A0 =C2=A0 ("decorator" . font-lock-type-face))
> +=C2=A0 "Alist of faces to use to highlight semantic tokens.
> +Each element is a cons cell whose car is a token type name and cdr is=
> +the face to use."
> +=C2=A0 :type `(alist :key-type (string :tag "Token name") > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 :value-type (= choice (face :tag "Face")
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (plist :tag "= Face Attributes"
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0:key-type
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0(choice
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 ,@(mapcar
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0(lambda (cell)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0`(const :tag ,(capitalize
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 (cdr cell))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0,(car cell))) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0face-attribute-name-alist))))))
> +
> +(defcustom eglot-semantic-tokens-modifier-faces
> +=C2=A0 '(("declaration" . font-lock-function-name-face)=
> +=C2=A0 =C2=A0 ("definition" . font-lock-function-name-face)=
> +=C2=A0 =C2=A0 ("readonly" . font-lock-constant-face)
> +=C2=A0 =C2=A0 ("static" . font-lock-keyword-face)
> +=C2=A0 =C2=A0 ("deprecated" . eglot-diagnostic-tag-deprecat= ed-face)
> +=C2=A0 =C2=A0 ("abstract" . font-lock-keyword-face)
> +=C2=A0 =C2=A0 ("async" . font-lock-preprocessor-face)
> +=C2=A0 =C2=A0 ("modification" . font-lock-function-name-fac= e)
> +=C2=A0 =C2=A0 ("documentation" . font-lock-doc-face)
> +=C2=A0 =C2=A0 ("defaultLibrary" . font-lock-builtin-face))<= br> > +=C2=A0 "List of face to use to highlight tokens with modifiers.<= br> > +Each element is a cons cell whose car is a modifier name and cdr is > +the face to use."
> +=C2=A0 :type `(alist :key-type (string :tag "Token name") > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 :value-type (= choice (face :tag "Face")
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (plist :tag "= Face Attributes"
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0:key-type
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0(choice
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 ,@(mapcar
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0(lambda (cell)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0`(const :tag ,(capitalize
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 (cdr cell))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0,(car cell))) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0face-attribute-name-alist))))))
> +
> +(defvar-local eglot--semtok-idle-timer nil
> +=C2=A0 "Idle timer to request full semantic tokens.")
> +
> +(defvar-local eglot--semtok-cache nil)
> +
> +(defsubst eglot--semtok-put-cache (k v)
> +=C2=A0 "Set key K of `eglot-semantic-tokens--cache' to V.&qu= ot;
> +=C2=A0 (setq eglot--semtok-cache
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (plist-put eglot--semtok-cache k v)))
> +
> +;; Process response
> +
> +(defun eglot--semtok-ingest-range-response (response)
> +=C2=A0 "Handle RESPONSE to semanticTokens/range request." > +=C2=A0 (eglot--semtok-put-cache :response response)
> +=C2=A0 (cl-assert (plist-get eglot--semtok-cache :region)))
> +
> +(defun eglot--semtok-ingest-full-response (response)
> +=C2=A0 "Handle RESPONSE to semanticTokens/full request." > +=C2=A0 (eglot--semtok-put-cache :response response)
> +=C2=A0 (cl-assert (not (plist-get eglot--semtok-cache :region))))
> +
> +(defsubst eglot--semtok-apply-delta-edits (old-data edits)
> +=C2=A0 "Apply EDITS obtained from full/delta request to OLD-DATA= ."
> +=C2=A0 (let* ((old-token-count (length old-data))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(old-token-index 0)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(substrings))
> +=C2=A0 =C2=A0 (cl-loop for edit across edits do
> +=C2=A0 =C2=A0 =C2=A0(when (< old-token-index (plist-get edit :star= t))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0(push (substring old-data old-token-index = (plist-get edit :start)) substrings))
> +=C2=A0 =C2=A0 =C2=A0(push (plist-get edit :data) substrings)
> +=C2=A0 =C2=A0 =C2=A0(setq old-token-index (+ (plist-get edit :start) = (plist-get edit :deleteCount)))
> +=C2=A0 =C2=A0 =C2=A0finally do (push (substring old-data old-token-in= dex old-token-count) substrings))
> +=C2=A0 =C2=A0 (apply #'vconcat (nreverse substrings))))
> +
> +(defun eglot--semtok-ingest-full/delta-response (response)
> +=C2=A0 "Handle RESPONSE to semanticTokens/full/delta request.&qu= ot;
> +=C2=A0 (if-let* ((edits (plist-get response :edits)))
> +=C2=A0 =C2=A0 =C2=A0 (progn
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (cl-assert (not (plist-get eglot--semtok-= cache :region)))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (when-let* ((old-data (plist-get (plist-g= et eglot--semtok-cache :response) :data)))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (eglot--semtok-put-cache
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:response
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(plist-put response :data (e= glot--semtok-apply-delta-edits old-data edits)))))
> +=C2=A0 =C2=A0 ;; server decided to send full response instead
> +=C2=A0 =C2=A0 (eglot--semtok-ingest-full-response response)))
> +
> +(defun eglot--semtok-request (region &optional fontify)
> +=C2=A0 "Send semantic tokens request to the language server.
> +A full/delta request will be sent if delta requests are supported by = the
> +language server and a full set of tokens had previously been received= .
> +Otherwise, a ranged request will be dispatched if REGION is non-nil a= nd
> +ranged requests are supported by the language server. In all other > +cases, a full tokens request will be dispatched.
> +
> +If FONTIFY is non-nil, refontify after the request completes." > +=C2=A0 (let* ((method :textDocument/semanticTokens/full)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(params (list :textDocument (eglot-= -TextDocumentIdentifier)))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(response-handler #'eglot--semt= ok-ingest-full-response)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(final-region nil)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(buf (current-buffer)))
> +=C2=A0 =C2=A0 (cond
> +=C2=A0 =C2=A0 =C2=A0((and (eglot-server-capable :semanticTokensProvid= er :full :delta)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(let ((response (plist-get e= glot--semtok-cache :response)))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(and (plist-get respo= nse :resultId) (plist-get response :data)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (not (= plist-get eglot--semtok-cache :region)))))
> +=C2=A0 =C2=A0 =C2=A0 (setq method :textDocument/semanticTokens/full/d= elta)
> +=C2=A0 =C2=A0 =C2=A0 (setq response-handler #'eglot--semtok-inges= t-full/delta-response)
> +=C2=A0 =C2=A0 =C2=A0 (setq params
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (plist-put params :previous= ResultId
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0(plist-get (plist-get eglot--semtok-cache :response) :resultI= d))))
> +=C2=A0 =C2=A0 =C2=A0((and region (eglot-server-capable :semanticToken= sProvider :range))
> +=C2=A0 =C2=A0 =C2=A0 (setq method :textDocument/semanticTokens/range)=
> +=C2=A0 =C2=A0 =C2=A0 (setq final-region region)
> +=C2=A0 =C2=A0 =C2=A0 (setq params
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (plist-put params :range (e= glot-region-range
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (car final-= region) (cdr final-region))))
> +=C2=A0 =C2=A0 =C2=A0 (setq response-handler #'eglot--semtok-inges= t-range-response)))
> +=C2=A0 =C2=A0 (eglot--async-request
> +=C2=A0 =C2=A0 =C2=A0(eglot--current-server-or-lose) method params
> +=C2=A0 =C2=A0 =C2=A0:success-fn
> +=C2=A0 =C2=A0 =C2=A0(lambda (response)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0(eglot--when-live-buffer buf
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(eglot--semtok-put-cache :documentV= ersion eglot--versioned-identifier)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(eglot--semtok-put-cache :region fi= nal-region)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(funcall response-handler response)=
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(when fontify (jit-lock-refontify (= car-safe region) (cdr-safe region)))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(when final-region (eglot--semtok-r= equest-full-on-idle))))
> +=C2=A0 =C2=A0 =C2=A0:hint #'eglot--semtok-request)))
> +
> +(defun eglot--semtok-fontify (beg end)
> +=C2=A0 "Apply the cached semantic tokens from BEG to END."<= br> > +=C2=A0 (with-slots ((modifier-cache semtok-modifier-cache)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(faces semtok-= faces)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(modifier-face= s semtok-modifier-faces))
> +=C2=A0 =C2=A0 =C2=A0 (eglot-current-server)
> +=C2=A0 =C2=A0 (cond
> +=C2=A0 =C2=A0 =C2=A0((not (and faces
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 eglot--semtok= -cache
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (plist-get eg= lot--semtok-cache :response)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (eq eglot--ve= rsioned-identifier (plist-get eglot--semtok-cache :documentVersion))))
> +=C2=A0 =C2=A0 =C2=A0 (eglot--semtok-request (cons beg end) t))
> +=C2=A0 =C2=A0 =C2=A0(t
> +=C2=A0 =C2=A0 =C2=A0 ;; if we're using the response to a ranged r= equest, we'll only be able to fontify within
> +=C2=A0 =C2=A0 =C2=A0 ;; that range (and hence shouldn't clear any= highlights outside of that range)
> +=C2=A0 =C2=A0 =C2=A0 (when-let* ((token-region (plist-get eglot--semt= ok-cache :region)))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (progn
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (when (or (< beg (car token-reg= ion))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= (> end (cdr token-region)))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; truncated! continue, but= request again
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (eglot--semtok-request (con= s beg end) t))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setq beg (max beg (car token-regi= on)))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setq end (min end (cdr token-regi= on)))))
> +=C2=A0 =C2=A0 =C2=A0 (eglot--widening
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (with-silent-modifications
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (remove-list-of-text-properties be= g end '(font-lock-face))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (let* ((inhibit-field-text-motion = t)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(data (= plist-get (plist-get eglot--semtok-cache :response) :data))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(i-max = (length data))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(beg-bo= l (and (goto-char beg) (line-beginning-position)))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(proper= ty-beg)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(proper= ty-end))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (goto-char (point-min))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (cl-do ((i 0 (+ i 5)) (colu= mn 0)) ((>=3D i i-max))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (when (> (aref da= ta i) 0)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setq column = 0)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (forward-line= (aref data i)))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (unless (< (point= ) beg-bol)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setq column = (+ column (aref data (+ i 1))))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (funcall eglo= t-move-to-linepos-function column)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (when (> (= point) end) (cl-return))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setq propert= y-beg (point))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (funcall eglo= t-move-to-linepos-function (+ column (aref data (+ i 2))))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setq propert= y-end (point))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (when-let* ((= face (aref faces (aref data (+ i 3)))))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (put-t= ext-property property-beg property-end 'font-lock-face face))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (let* ((code = (aref data (+ i 4)))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0(faces (gethash code modifier-cache 'not-found)))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (when = (eq faces 'not-found)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= (setq faces nil)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= (cl-loop for j from 0 below (length modifier-faces)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (> (logand code (ash 1 j)) 0)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (aref modifier-faces j)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0collect (aref modifier-faces j) into fac= es)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= (puthash code faces modifier-cache))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (dolis= t (face faces)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= (put-text-property property-beg property-end 'font-lock-face face)))))= )))
> +=C2=A0 =C2=A0 =C2=A0 `(jit-lock-bounds ,beg . ,end)))))
> +
> +(defun eglot--semtok-request-full-on-idle ()
> +=C2=A0 "Make a full semantic tokens request after an idle timer.= "
> +=C2=A0 (let* ((buf (current-buffer))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(fun (lambda ()
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (eglot--when-= live-buffer buf
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (eglot= --semtok-request nil)))))
> +=C2=A0 =C2=A0 (when eglot--semtok-idle-timer (cancel-timer eglot--sem= tok-idle-timer))
> +=C2=A0 =C2=A0 (setq eglot--semtok-idle-timer (run-with-idle-timer (* = 3 eglot-send-changes-idle-time) nil fun))))
> +
> +(defun eglot--semtok-on-refresh (server)
> +=C2=A0 "Clear semantic tokens within all buffers of SERVER."= ;
> +=C2=A0 (cl-loop for buffer in (eglot--managed-buffers server) do
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(with-current-buffer buffer<= br> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(setq eglot--semtok-c= ache nil)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(jit-lock-refontify))= ))
> +
> +(let ((debounce-timer nil))
> +=C2=A0 (cl-defmethod eglot-handle-request
> +=C2=A0 =C2=A0 (server (_method (eql workspace/semanticTokens/refresh)= ))
> +=C2=A0 =C2=A0 "Handle a semanticTokens/refresh request from SERV= ER."
> +=C2=A0 =C2=A0 (when debounce-timer (cancel-timer debounce-timer))
> +=C2=A0 =C2=A0 (setq debounce-timer (run-with-timer 5 nil #'eglot-= -semtok-on-refresh server))
> +=C2=A0 =C2=A0 nil))
> +
> +;; Initialization
> +(defun eglot--semtok-build-face-map (identifiers faces category varna= me)
> +=C2=A0 "Build map of FACES for IDENTIFIERS using CATEGORY and VA= RNAME."
> +=C2=A0 (vconcat
> +=C2=A0 =C2=A0(mapcar (lambda (id)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(let ((maybe-face (cd= r (assoc id faces))))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(when (not may= be-face)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(displa= y-warning
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'e= glot-semtok
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (forma= t-message "No face has been associated to the %s `%s': consider ad= ding a corresponding definition to %s"
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 category id varname))) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0maybe-face)) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0identifiers)))
> +
> +(defun eglot--semtok-initialize (server)
> +=C2=A0 "Initialize SERVER for semantic tokens."
> +=C2=A0 (cl-destructuring-bind (&key tokenTypes tokenModifiers &am= p;allow-other-keys)
> +=C2=A0 =C2=A0 =C2=A0 (plist-get (plist-get (eglot--capabilities serve= r)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 :semanticTokensProvider)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:legend= )
> +=C2=A0 =C2=A0 (oset server semtok-faces
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (eglot--semtok-build-face-map
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0tokenTypes eglot-semantic-to= kens-faces
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"semantic token" &= quot;eglot--semtokfaces"))
> +=C2=A0 =C2=A0 (oset server semtok-modifier-faces
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (eglot--semtok-build-face-map
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0tokenModifiers eglot-semanti= c-tokens-modifier-faces
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"semantic token modifie= r" "eglot--semtokmodifier-faces"))))
> +
> +(define-minor-mode eglot-semantic-tokens-mode
> +=C2=A0 "Minor mode for fontifying buffer with LSP server's s= emantic tokens."
> +=C2=A0 :global nil
> +=C2=A0 (cond (eglot-semantic-tokens-mode
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(if (eglot-server-capable :semantic= TokensProvider)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(jit-lock-register #&= #39;eglot--semtok-fontify 'contextual)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(eglot-semantic-tokens-mode = -1)))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (t
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(jit-lock-unregister #'eglot--s= emtok-fontify)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(with-silent-modifications
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(remove-list-of-text-propert= ies (point-min) (point-max) '(font-lock-face))))))
> +
>=C2=A0
>=C2=A0 ;;; Call and type hierarchies
>=C2=A0 (require 'button)
> @@ -4728,7 +5036,8 @@ If NOERROR, return predicate, else erroring func= tion."
>=C2=A0 ;; harder. For now, use `with-eval-after-load'. See also git= hub#1183.
>=C2=A0 (with-eval-after-load 'desktop
>=C2=A0 =C2=A0 (add-to-list 'desktop-minor-mode-handlers '(eglot= --managed-mode . ignore))
> -=C2=A0 (add-to-list 'desktop-minor-mode-handlers '(eglot-inla= y-hints-mode . ignore)))
> +=C2=A0 (add-to-list 'desktop-minor-mode-handlers '(eglot-inla= y-hints-mode . ignore))
> +=C2=A0 (add-to-list 'desktop-minor-mode-handlers '(eglot-sema= ntic-tokens-mode . ignore)))
>=C2=A0
>=C2=A0
>=C2=A0 ;;; Misc
> @@ -4757,6 +5066,7 @@ If NOERROR, return predicate, else erroring func= tion."
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0eglot-for= mat
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0eglot-for= mat-buffer
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0eglot-inl= ay-hints-mode
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0eglot-semantic= -tokens-mode
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0eglot-rec= onnect
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0eglot-ren= ame
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0eglot-sig= nal-didChangeConfiguration
> --
> 2.51.0
>


--
Jo=C3=A3o T=C3=A1vora
--000000000000657d5a063eab28d8-- From unknown Sat Sep 13 11:38:41 2025 X-Loop: help-debbugs@gnu.org Subject: bug#79374: [PATCH] eglot: add support for semantic tokens Resent-From: Eli Zaretskii Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 13 Sep 2025 10:57:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 79374 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: =?UTF-8?Q?Jo=C3=A3o_?= =?UTF-8?Q?T=C3=A1vora?= Cc: me@lua.blog.br, philipk@posteo.net, 79374@debbugs.gnu.org Received: via spool by 79374-submit@debbugs.gnu.org id=B79374.17577609787673 (code B ref 79374); Sat, 13 Sep 2025 10:57:01 +0000 Received: (at 79374) by debbugs.gnu.org; 13 Sep 2025 10:56:18 +0000 Received: from localhost ([127.0.0.1]:53927 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uxNvW-0001ze-1I for submit@debbugs.gnu.org; Sat, 13 Sep 2025 06:56:18 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57044) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1uxNvU-0001yq-5B for 79374@debbugs.gnu.org; Sat, 13 Sep 2025 06:56:16 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uxNvN-0000VW-JX; Sat, 13 Sep 2025 06:56:09 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=MIME-version:References:Subject:In-Reply-To:To:From: Date; bh=l3OumHPs+PI43Tw2owbpMgZgWVZygzttjftg+t6SJ4w=; b=ouXA4tDLVhdD8yt7MiiA gzNnfFzx570h3BuZXhLnMoxH+8qb6TJEINHoSyWU08lDLwwX2TGtN87gWunBXbPGt/R1hNPDxYYqH 5cxsNx48KKO0EiCM6zSk6m/fiq4vwDkTEidFnnmhAJyntUrFheoKVnKQGIVFyOkNmN+P9Bjai+Irc TbgACtDcaaog4gV8PPY+6awyKr16bfO0HhpYSE1SBAPAtP0dfKsSoXELE/JBbF1R0KyRoqjRGHkbw H+jAl9aCi5N4/gg/OzQasIl6S5MN3TZsxYaq0dcZbKu/jZpJr/uL5NDvkYsRL9ZxO7xtU2LHmhxbr +2vqpOex3EdZSA==; Date: Sat, 13 Sep 2025 13:56:07 +0300 Message-Id: <864it6r588.fsf@gnu.org> From: Eli Zaretskii In-Reply-To: (message from =?UTF-8?Q?Jo=C3=A3o_?= =?UTF-8?Q?T=C3=A1vora?= on Sat, 13 Sep 2025 10:12:38 +0100) References: <2c03b490-5006-4ad4-a090-fafc8a18405d@lua.blog.br> <87ecsoc6cz.fsf@posteo.net> <86348qss28.fsf@gnu.org> MIME-version: 1.0 Content-type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -2.3 (--) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > From: João Távora > Date: Sat, 13 Sep 2025 10:12:38 +0100 > Cc: me@lua.blog.br, philipk@posteo.net, 79374@debbugs.gnu.org > > On Sat, Sep 13, 2025 at 8:57 AM Eli Zaretskii wrote: > > João, any comments on the patch? Should I install it? > > No, don't . This is a significant feature which is missing testing, > documentations and a much more thorough review. I don't > have time for that right now. > > I can say that, from a very cursory review, it is the best version > of this feature ever proposed to Eglot. OK, thanks. Should I ping you about this at some later date? From unknown Sat Sep 13 11:38:41 2025 X-Loop: help-debbugs@gnu.org Subject: bug#79374: [PATCH] eglot: add support for semantic tokens Resent-From: =?UTF-8?Q?Jo=C3=A3o_?= =?UTF-8?Q?T=C3=A1vora?= Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 13 Sep 2025 11:18:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 79374 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Eli Zaretskii Cc: me@lua.blog.br, philipk@posteo.net, 79374@debbugs.gnu.org Received: via spool by 79374-submit@debbugs.gnu.org id=B79374.175776225314846 (code B ref 79374); Sat, 13 Sep 2025 11:18:01 +0000 Received: (at 79374) by debbugs.gnu.org; 13 Sep 2025 11:17:33 +0000 Received: from localhost ([127.0.0.1]:54022 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uxOG5-0003rN-33 for submit@debbugs.gnu.org; Sat, 13 Sep 2025 07:17:33 -0400 Received: from mail-ot1-x331.google.com ([2607:f8b0:4864:20::331]:57468) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from ) id 1uxOG1-0003qx-9b for 79374@debbugs.gnu.org; Sat, 13 Sep 2025 07:17:30 -0400 Received: by mail-ot1-x331.google.com with SMTP id 46e09a7af769-750b77699b4so2186476a34.2 for <79374@debbugs.gnu.org>; Sat, 13 Sep 2025 04:17:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1757762243; x=1758367043; darn=debbugs.gnu.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=RaqjOMNfQd8B8FPtEiHmF+xaqEV9gM0GwfSsVkCDY64=; b=KXh8f+vgh88WxObo1RIIIW6ymek1zgE6JUHPadwWkfqqUBJ/PVmvb31FQf4EHYqW05 ukLnrkAOOlWMWexdpuqFVQXzOcaRA5EgX83gwCnNWDndwDNdrWCr2ZAAzgCVQIS/CqRF ez9pNHPcOT7vuFCf2vsroarhPIDox3pKhO3mtfUwP7KVk1ajrkcocZ5QgZTE9ewncWqs gm1SxxtGleo0vqPvNdDQJ6u78UfuiZqwyzWmXE6Wju2lLyQxv2MvSoQGeoKu5YvtYOvV 4STTxTrkIsykN0IHvDOIu5GWVdodROqDlrnJGiS8EGPY1FcevYscEonBlDQxN0Kws8gb n8tg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757762243; x=1758367043; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=RaqjOMNfQd8B8FPtEiHmF+xaqEV9gM0GwfSsVkCDY64=; b=NmDrCVZHsE1dxR+obZZyNqlgAGDYwQL0hPKycA1t5aw/kX6WzuuqJi2jNwYorvg13l Ou/LYvHMLKS7ozOPALo9ezVxoAsvaUaZcd7+fu9dhbppCTHpmO/b+Lkpy5nJpE0wcd4b YdPLOcK2RtiISRIPDLYpd+hJ81IfozebiuuOpC7VlLsRBXrT60ntJqJq+ANWjS/SltMH aNfXyWOsASMDdOIG/xhrmm3zgd35VnX1SlLBaj9QhnICDkQN6SiiSxwZPlrVhlvGj70o LzGLZXYHhzZiBKcJ+DLEBYFrI2vaQIVDEVH8K6JKdrR6yB+EGaFiOcdpK81HFp4ZQxFp stIw== X-Forwarded-Encrypted: i=1; AJvYcCXZvS3T3QAtt08S9dQXtqrnAYT3w1kWWTfjtp0xzxdOhIuJl1Q7D7cIOUlU8/Jz9AwExUA8cQ==@debbugs.gnu.org X-Gm-Message-State: AOJu0YyOns4iUTFIDF/RrJboDQ9nT2FC7wh/JYJdNxaxhCgTruwv3fhB tCoTfjftt/1AWpf5kqoRPBwvg6r3tMAmN5auGk/r/4GKRFjulI0Rg0j+CJ8TbMh8usJL4xjc1MJ lxnufmjokYabywG3LyatqNRo3xFfKJjw= X-Gm-Gg: ASbGncslj9u1a5Ftz5ikOUrtjMDmTspS9UmQgSQB6c11dpmbeZ5fnIwQTdwQmxBYdjK eNNvWFpcKsYsgYh/S4NWuFoWc3vTKElhPT3tIyf7pDnSbGkjmVeVQCaXfRQVXKOhOvAbDBeSz/3 Le9T6AnpQ6uz0+nZD9sHpXOyiW+LhObkw5ez/vhj9NASYaD620YIo1iZS6AF+JXfeVYcU4MioVQ HZVyns= X-Google-Smtp-Source: AGHT+IH6XBDr8Ne+/D10CZYRMXef2ZU7K1R/5G47Cnxld8Ath2GxLhUG5N1RXhi40Fvas6e02+VXbH40EWOCdpV7c0U= X-Received: by 2002:a05:6830:4d93:10b0:756:a322:2f8 with SMTP id 46e09a7af769-756a32206a2mr259813a34.5.1757762243264; Sat, 13 Sep 2025 04:17:23 -0700 (PDT) MIME-Version: 1.0 References: <2c03b490-5006-4ad4-a090-fafc8a18405d@lua.blog.br> <87ecsoc6cz.fsf@posteo.net> <86348qss28.fsf@gnu.org> <864it6r588.fsf@gnu.org> In-Reply-To: <864it6r588.fsf@gnu.org> From: =?UTF-8?Q?Jo=C3=A3o_?= =?UTF-8?Q?T=C3=A1vora?= Date: Sat, 13 Sep 2025 12:18:23 +0100 X-Gm-Features: Ac12FXwVVTUJrBCo75QIFCZ2f0m1NMUD9JXNXsX6DnKe57raEUFLg5rWi7FyQkE Message-ID: Content-Type: multipart/alternative; boundary="0000000000001c0703063eacea1a" X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --0000000000001c0703063eacea1a Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Sat, Sep 13, 2025 at 11:56=E2=80=AFAM Eli Zaretskii wrote= : > > From: Jo=C3=A3o T=C3=A1vora > > Date: Sat, 13 Sep 2025 10:12:38 +0100 > > Cc: me@lua.blog.br, philipk@posteo.net, 79374@debbugs.gnu.org > > > > On Sat, Sep 13, 2025 at 8:57=E2=80=AFAM Eli Zaretskii wr= ote: > > > > Jo=C3=A3o, any comments on the patch? Should I install it? > > > > No, don't . This is a significant feature which is missing testing, > > documentations and a much more thorough review. I don't > > have time for that right now. > > > > I can say that, from a very cursory review, it is the best version > > of this feature ever proposed to Eglot. > > OK, thanks. Should I ping you about this at some later date? > Yes, that is fine. I'll try to take a look at it this week. --0000000000001c0703063eacea1a Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
On Sat, Sep 13, 2025 at 11:56=E2=80=AFAM Eli = Zaretskii <eliz@gnu.org> wrote:
> From: Jo=C3= =A3o T=C3=A1vora <joaotavora@gmail.com>
> Date: Sat, 13 Sep 2025 10:12:38 +0100
> Cc: me@lua.blog.br= , philipk@poste= o.net, 79374= @debbugs.gnu.org
>
> On Sat, Sep 13, 2025 at 8:57=E2=80=AFAM Eli Zaretskii <eliz@gnu.org> wrote:
>
>=C2=A0 Jo=C3=A3o, any comments on the patch?=C2=A0 Should I install it?=
>
> No, don't . This is a significant feature which is missing testing= ,
> documentations and a much more thorough review.=C2=A0 I don't
> have time for that right now.
>
> I can say that, from a very cursory review, it is the best version > of this=C2=A0 feature ever proposed to Eglot.

OK, thanks.=C2=A0 Should I ping you about this at some later date?

Yes, that is fine.=C2=A0 I&= #39;ll try to take a look at it this week.
--0000000000001c0703063eacea1a--