From a5203b95793b1260e8a6d57f9238f64e54259e2e Mon Sep 17 00:00:00 2001 From: Andrew Dupont Date: Wed, 27 Sep 2023 08:47:50 -0700 Subject: [PATCH 1/4] [blog] Add Modern Tree-sitter (part 2) post --- ...theclocktower-modern-tree-sitter-part-2.md | 182 ++++++++++++++++++ .../assets/tree-sitter-log-cursor-scope.png | Bin 0 -> 44754 bytes .../tree-sitter-string-scopes-diagram.png | Bin 0 -> 47217 bytes 3 files changed, 182 insertions(+) create mode 100644 docs/blog/20230927-savetheclocktower-modern-tree-sitter-part-2.md create mode 100644 docs/blog/assets/tree-sitter-log-cursor-scope.png create mode 100644 docs/blog/assets/tree-sitter-string-scopes-diagram.png diff --git a/docs/blog/20230927-savetheclocktower-modern-tree-sitter-part-2.md b/docs/blog/20230927-savetheclocktower-modern-tree-sitter-part-2.md new file mode 100644 index 000000000..88053ac36 --- /dev/null +++ b/docs/blog/20230927-savetheclocktower-modern-tree-sitter-part-2.md @@ -0,0 +1,182 @@ +--- +title: "Modern Tree-sitter, part 2: why scopes matter" +author: savetheclocktower +date: 2023-09-27 +category: + - dev +tag: + - modernization + - tree-sitter +--- + +In [the last post](/blog/20230925-savetheclocktower-modern-tree-sitter-part-1.html), I tried to explain why the new Tree-sitter integration was worth writing about in the first place: because we needed to integrate it into a system defined by TextMate grammars, and we had to solve some challenging problems along the way. + +Today I’ll try to illustrate what that system looks like and why it’s important. + + + +When I first started getting involved with Pulsar back in January, [@maurício](https://github.com/mauricioszabo/) had just begun the process of migrating us to the `web-tree-sitter` bindings, and seemed to be dreading the enormity of the task. + +He noticed that most Tree-sitter parsers had [their own built-in query files](https://github.com/tree-sitter/tree-sitter-javascript/blob/master/queries/highlights.scm) for syntax highlighting. These `highlights.scm` files act like a sort of stylesheet for a Tree-sitter tree: they’re used when you run [`tree-sitter highlight`](https://tree-sitter.github.io/tree-sitter/syntax-highlighting) from the command line, and they’re what GitHub uses when it highlights code in a web browser. + +_Couldn’t we just use these files and save ourselves a lot of hassle?_, he asked. + +I said no. And I realized that, in saying no, I was volunteering myself to do some hard work. + +## How TextMate grammars work + +You may not have ever used [TextMate](https://macromates.com/), but you’ve probably used an editor that benefited from its existence. Several widely used editors — first [Sublime Text](https://www.sublimetext.com/), then Atom, and now [Visual Studio Code](https://code.visualstudio.com/) — all based their grammar systems on TextMate’s. + +A [TextMate grammar](https://en.wikipedia.org/wiki/TextMate#Language_Grammars) doesn’t aim to understand your code entirely. It uses regular expressions — pattern-matching — to describe rules that identify the important parts of your code. It knows that some rules apply broadly and others are valid only in certain contexts, so it allows you to nest rules inside other rules. + +Here’s a very simple example of what a TextMate grammar looks like: + +```json +{ + "name": "JavaScript", + "scopeName": "source.js", + "fileTypes": ["js", "jsx", "mjs", "cjs"], + + "patterns": [ + { + "name": "string.quoted.double.js", + "match": "\\\"(.*?)\\\"" + } + ] +} +``` + +It’ll feel overwhelming to consider _all_ of the things a grammar does, so for this example I’ve removed all of its rules except for one: the one that highlights double-quoted strings `"like this"`. You can see that it looks for a particular pattern and, when it matches, assigns the name `string.quoted.double.js` to that range. That’s called a **scope name**. + +When you load a JavaScript file in Pulsar — or VSCode, or Sublime Text — this grammar will find all your strings and mark them with scope names. In turn, your editor’s syntax theme will hook into that scope name to make that string a special color. (It will most likely target `string`, rather than something more specific, but that’s why scope names are divided into segments; targeting `string` will also match `string.quoted.double.js`.) + +Let’s make our grammar a bit more complex: + +```json +{ + "name": "JavaScript", + "scopeName": "source.js", + "fileTypes": ["js", "jsx", "mjs", "cjs"], + + "patterns": [ + { + "name": "string.quoted.double.js", + "begin": "\"", + "beginCaptures": { + "0": { "name": "punctuation.definition.string.begin.js" } + }, + "end": "\"", + "endCaptures": { + "0": { "name": "punctuation.definition.string.end.js" } + }, + "patterns": [ + { + "include": "#string_escapes" + } + ] + } + ] +} +``` + +This is practically the exact rule for double-quoted strings from Pulsar’s built-in TextMate grammar for JavaScript. It introduces some more advanced concepts: + +- Instead of a single pattern, we’ve now got `begin` and `end` patterns. If it can identify a buffer range that starts with a `begin` match and ends with an `end` match, it can scope the entire range that way, and can create a new context in which only certain patterns are applied — in this case, escape sequences. +- The entire string will still be scoped `string.quoted.double.js`, but now we’re also applying `punctuation` scope names to the quote characters themselves. + +Here’s a better way to visualize this: + +![string scopes](./assets/tree-sitter-string-scopes-diagram.png) + +If you were to put your cursor anywhere within a buffer and run the **Editor: Log Cursor Scope** command, you’d see a list of scope names that are active at that buffer position, moving from broadest to narrowest: + +![log cursor scopes](./assets/tree-sitter-log-cursor-scope.png) + +Why is it choosing those specific names? Because of [naming conventions established by TextMate](https://macromates.com/manual/en/language_grammars#naming_conventions) many years ago. When different language grammars try to abide by the same conventions for naming their scopes, it makes it easier to write syntax themes without constantly checking how they look in every possible language. + +Still, you’d be forgiven if you felt like this was overkill. All we’re doing here is applying some syntax highlighting, right? Do you need this much information just to make a string green? + +## How TextMate uses scope names + +TextMate has a good reason for wanting such verbose scope names, and for sprinkling them so liberally throughout your source code: they aren’t used _just_ for syntax highlighting. + +It’s better to think of scope names as intelligent annotations for your source code. The idea isn’t that you’ll want to make single-quoted strings a different color from double-quoted strings — though you could! — but rather that other editor features could benefit from knowing _whether_ you were inside a string, and _what kind_ of string you were inside. + +Because in TextMate, most editor actions — commands, snippets, and macros — can be made contextually aware. + +Let’s use commands as an example. Here are some commands you can write in TextMate: + +- If the cursor is within a string, pressing Ctrl-Shift-’ should convert the string between single-quoted and double-quoted delimiters. +- If the cursor is in the middle of `{}`, pressing Return should insert two newlines, put the cursor between the two newlines, and indent the cursor’s line by one level. +- If the cursor is within a URL, pressing Enter on the number pad should open that URL in a web browser. + +In fact, all of these are real examples that are enabled by default in TextMate. And because they target generic scope names that are shared across a number of grammars, they’ll work in nearly any language. + +Did you notice how our grammar file defined a `scopeName` of `source.js`? That’s a _root_ scope name, and it applies to the entire file. And it means that commands can restrict themselves to certain languages just like any other context. + +For instance: to beautify your JavaScript, you might want to run it through `prettier`. To beautify your HTML, you might want to run it through [HTML Tidy](https://www.html-tidy.org/). And to beautify your JSON, you might want to run it through `jq`. + +In TextMate, file beautification commands canonically use the hotkey Ctrl-Shift-H. By applying the right scope selector for each of these three commands, you can assign them _all_ to Ctrl-Shift-H, and they won’t get in each other’s way. + +## How Pulsar uses scope names + +There are a number of reasons why TextMate isn’t widely used anymore: it’s a macOS-only editor, its releases are frustratingly sporadic, and it’s never had support for crucial features like split editor panes. But TextMate was a major influence on how Atom was built. + +It’s not widely known, but **Atom and Pulsar offer nearly as much flexibility with scope names as TextMate does**: + +- Any snippet can be defined to run in an arbitrary scope context. For instance, you could write a snippet that will only expand if you’re inside of a JavaScript block comment; if you try to invoke it elsewhere, it’ll act as though that snippet doesn’t exist. + + Built-in packages use this system. For instance, the `language-html` package defines snippets for most common tag names, but then redefines each one to do nothing if the cursor is inside a context where HTML would be invalid, like a `style` or `script` element. + +- Pulsar’s configuration system allows for scope-specific overrides. For instance, a user can set `editor.softWrap` to `false` globally, but set it to `true` for Markdown files. + + Built-in packages use this system. Scopes can be used to set config values that aren’t exposed in the UI — like what to use for comment delimiters in a given language, or which non-letter characters should be considered to be part of a “word” for the purposes of cursor navigation. + +- In Pulsar, commands can be invoked anywhere, whether the user is in a text editor or not; hence there’s no strong system for enforcing that commands be invoked only in certain scope contexts. + + But it’s possible! I’ve got several commands in my `init.js` whose only purpose is to inspect the scope list of the active text editor’s cursor, then delegate to one of several other commands depending on where the cursor is. It’s not as easy as it could be, but the bones are there. + +But that’s not all. If you use Pulsar, chances are very good that you use a package — built-in or third-party — that inspects scope names for contextual information. Here are just a few of _many_ examples: + +- `autocomplete-plus` inspects scopes to decide whether it should offer suggestions at the cursor; it declines to do so whenever any of the current scopes matches a user-configurable list. (This is how it decides _not_ to offer suggestions if you’re typing within a comment, for instance.) +- `autocomplete-css` decides which suggestions to offer based on the scope name of the closest token. +- `bracket-matcher` uses scope names to locate and highlight paired tokens like brackets and matching HTML tags. +- [`emmet`](https://web.pulsar-edit.dev/packages/emmet), the eighth-most-downloaded community package, relies on scope descriptors to decide whether it should try to expand an abbreviation into HTML. + +## What would break? + +Let’s go back to those built-in query files and consider our string example. In [`tree-sitter-javascript/queries/highlights.scm`](https://github.com/tree-sitter/tree-sitter-javascript/blob/master/queries/highlights.scm#L85-L88) we can see how strings are treated: + +```scm +[ + (string) + (template_string) +] @string +``` + +This rule treates three different kinds of strings — single-quoted, double-quoted, and backtick-quoted — identically. If we used this rule as written, we’d be applying a scope name of `string` to all JavaScript strings. Not `string.quoted.double.js` and the like; just `string`. And there’s no rule in that file that applies scope names to string delimiters, either. + +If we embraced a system that used names like `string` and `comment` instead of `string.quoted.double.js` and `comment.block.documentation.js`, the editing experience would be worse in a number of ways ways — some tiny, some large. + +To drive it home for you, let’s think of all the things that would break from this change alone: + +- Any community syntax theme that chose to style double-quoted strings differently from single quoted strings would suddenly behave differently. (Far-fetched? Consider a language like PHP or Ruby in which single-quoted strings have different semantics from double-quoted strings.) +- Any community syntax theme that chose to style string delimiters in a certain way — with a bolder weight, perhaps — would suddenly behave differently, because the `punctuation` scopes would no longer be present on the delimiters. +- Any user-defined snippet that is scoped specifically to `string.quoted.double` — or even `string.quoted` — would break. +- Any user-defined commands that looked for the presence of a `punctuation` scope to detect whether the cursor is adjacent to a string delimiter would break. + +I think Atom learned this lesson rather well during the original rollout of Tree-sitter grammars. After updating, users were defaulted to the new grammars. Sometimes things looked different, or behaved differently. When users reported these differences, they learned that they could work around those bugs in the short term by unchecking the “Use Tree-Sitter Grammars” setting and restoring the original behavior. I wonder how many did, and how many of them ever re-enabled Tree-sitter grammars in the future. + +A lot of code has been written that presumes the existence of TextMate-style scopes. I think this is fine. The fact that we have a new system doesn’t mean that we should leave scopes behind. For one thing, it’d be a jarring experience for users — we’d be bragging about a new feature that was likely to break customizations that users had been relying upon for years. + +But I also think that TextMate-style scopes function as an elegant [middleware](https://en.wikipedia.org/wiki/Middleware). They allow us to change an underlying implementation without the user needing to know or care — except, perhaps, to notice downstream benefits, like faster syntax highlighting and new editor features. + +## The challenge + +So that’s why I volunteered to do this. I knew that we couldn’t just reuse some syntax highlighting query files that were written with different assumptions in place. And I knew that I couldn’t reasonably ask _someone else_ to do a bunch of work just because _I_ felt like it was important. + +My goal was to create a set of grammars that had the performance and accuracy upsides of the Tree-sitter experience _and_ the rich scope name annotations that TextMate grammars provided. + +For that to be possible, Tree-sitter grammars should apply scope names **as similarly as possible to TextMate grammars**. There may be reasons that we _choose_ not to do something the way that the TextMate grammar does it, but we don’t want to be _unable_ to do something the way that the TextMate grammar does it. + +Syntax highlighting was the first, and hardest, task. Next time I’ll talk about how we solved it. diff --git a/docs/blog/assets/tree-sitter-log-cursor-scope.png b/docs/blog/assets/tree-sitter-log-cursor-scope.png new file mode 100644 index 0000000000000000000000000000000000000000..efde6ba222ccfca44356c984aa6d2235a897cc57 GIT binary patch literal 44754 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 literal 0 HcmV?d00001 diff --git a/docs/blog/assets/tree-sitter-string-scopes-diagram.png b/docs/blog/assets/tree-sitter-string-scopes-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..ad85e6bb37748033415a3f82199976f7d33fa8bc GIT binary patch literal 47217 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 L>@A8 Date: Wed, 27 Sep 2023 09:25:25 -0700 Subject: [PATCH 2/4] Fix reference to @mauricio's username --- .../20230927-savetheclocktower-modern-tree-sitter-part-2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/blog/20230927-savetheclocktower-modern-tree-sitter-part-2.md b/docs/blog/20230927-savetheclocktower-modern-tree-sitter-part-2.md index 88053ac36..02e4a2778 100644 --- a/docs/blog/20230927-savetheclocktower-modern-tree-sitter-part-2.md +++ b/docs/blog/20230927-savetheclocktower-modern-tree-sitter-part-2.md @@ -15,7 +15,7 @@ Today I’ll try to illustrate what that system looks like and why it’s import -When I first started getting involved with Pulsar back in January, [@maurício](https://github.com/mauricioszabo/) had just begun the process of migrating us to the `web-tree-sitter` bindings, and seemed to be dreading the enormity of the task. +When I first started getting involved with Pulsar back in January, [@mauricioszabo](https://github.com/mauricioszabo/) had just begun the process of migrating us to the `web-tree-sitter` bindings, and seemed to be dreading the enormity of the task. He noticed that most Tree-sitter parsers had [their own built-in query files](https://github.com/tree-sitter/tree-sitter-javascript/blob/master/queries/highlights.scm) for syntax highlighting. These `highlights.scm` files act like a sort of stylesheet for a Tree-sitter tree: they’re used when you run [`tree-sitter highlight`](https://tree-sitter.github.io/tree-sitter/syntax-highlighting) from the command line, and they’re what GitHub uses when it highlights code in a web browser. From e16a692370958409f191784ea861b7ecd48fd546 Mon Sep 17 00:00:00 2001 From: Andrew Dupont Date: Wed, 27 Sep 2023 09:48:01 -0700 Subject: [PATCH 3/4] Make a clearer transition --- .../20230927-savetheclocktower-modern-tree-sitter-part-2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/blog/20230927-savetheclocktower-modern-tree-sitter-part-2.md b/docs/blog/20230927-savetheclocktower-modern-tree-sitter-part-2.md index 02e4a2778..64f2c25a6 100644 --- a/docs/blog/20230927-savetheclocktower-modern-tree-sitter-part-2.md +++ b/docs/blog/20230927-savetheclocktower-modern-tree-sitter-part-2.md @@ -145,7 +145,7 @@ But that’s not all. If you use Pulsar, chances are very good that you use a pa ## What would break? -Let’s go back to those built-in query files and consider our string example. In [`tree-sitter-javascript/queries/highlights.scm`](https://github.com/tree-sitter/tree-sitter-javascript/blob/master/queries/highlights.scm#L85-L88) we can see how strings are treated: +With this in mind, let’s go back to those built-in Tree-sitter query files and consider our string example. In [`tree-sitter-javascript/queries/highlights.scm`](https://github.com/tree-sitter/tree-sitter-javascript/blob/master/queries/highlights.scm#L85-L88) we can see how strings are treated: ```scm [ From 4778c9f5d2de98621031ac9ea2c3a5c703bb4c3b Mon Sep 17 00:00:00 2001 From: Andrew Dupont Date: Wed, 27 Sep 2023 09:50:27 -0700 Subject: [PATCH 4/4] Typo --- .../20230927-savetheclocktower-modern-tree-sitter-part-2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/blog/20230927-savetheclocktower-modern-tree-sitter-part-2.md b/docs/blog/20230927-savetheclocktower-modern-tree-sitter-part-2.md index 64f2c25a6..f59efc90d 100644 --- a/docs/blog/20230927-savetheclocktower-modern-tree-sitter-part-2.md +++ b/docs/blog/20230927-savetheclocktower-modern-tree-sitter-part-2.md @@ -154,7 +154,7 @@ With this in mind, let’s go back to those built-in Tree-sitter query files and ] @string ``` -This rule treates three different kinds of strings — single-quoted, double-quoted, and backtick-quoted — identically. If we used this rule as written, we’d be applying a scope name of `string` to all JavaScript strings. Not `string.quoted.double.js` and the like; just `string`. And there’s no rule in that file that applies scope names to string delimiters, either. +This rule treats three different kinds of strings — single-quoted, double-quoted, and backtick-quoted — identically. If we used this rule as written, we’d be applying a scope name of `string` to all JavaScript strings. Not `string.quoted.double.js` and the like; just `string`. And there’s no rule in that file that applies scope names to string delimiters, either. If we embraced a system that used names like `string` and `comment` instead of `string.quoted.double.js` and `comment.block.documentation.js`, the editing experience would be worse in a number of ways ways — some tiny, some large.