Commit Graph

41797 Commits

Author SHA1 Message Date
Andrew Dupont
2e36a24fc6 [language-php] Remove firstLineRegex and contentRegex
They don’t gain us anything, and in fact actually cause this grammar to be ranked _below_ the TextMate PHP grammar when they fail.
2024-01-29 18:51:35 -08:00
Andrew Dupont
94d41ce82b [language-(java|type)script] Highlight array-destructured variables…
…no matter how deeply they’re nested.

Also highlight `?` in an incomplete ternary.

(Also fix a lot of final segments in the TypeScript highlights file; I’ve been lazily copying-and-pasting and forgetting to change them.)
2024-01-28 11:45:36 -08:00
Andrew Dupont
e49b919703 [language-(java|type)script] Add exhaustive indentation configuration
We are crossing the Rubicon.

https://github.com/orgs/pulsar-edit/discussions/249 is a discussion of specific ways that indentation is different in JavaScript because of the new grammar. We intentionally didn’t try to preserve the indentation decisions in the old TextMate grammar, but this is (predictably) disruptive to some people. We don’t want to punt like legacy Tree-sitter did and rely on the TextMate grammar’s coarse regexes to decide what gets indented, but we can at least make the new indentation system granularly configurable.

This commit makes practically every indentation decision configurable in JavaScript and TypeScript. It groups these settings under a new “Indentation” section in each package’s settings.

I might decide that this goes too far and roll back the granular settings for `{`, `[`, and `(`, but the other indentation hints are absolutely matters of taste, so it’s only proper that users can choose to disable them.

In the long run, we could _consider_ allowing users to swap in another indentation engine altogther, much like #895 proposes for folds. That would let us legitimately offer users a way to opt into “the way the TextMate grammar does it” without affecting other users.

Another stopgap option would be to add a way for a user to disable indentation hinting altogether for a given grammar.
2024-01-28 11:21:59 -08:00
Andrew Dupont
5855241698 Fix issue with looking up objects in atom.config
…when a project-specific config is present.

Most people don't use a project-specific config, which is why this bug has been present for ages. Read the new spec for an explanation.
2024-01-28 00:47:32 -08:00
Andrew Dupont
f691cfce28 Allow for any number of @_IGNORE_ capture names in a query…
…by namespacing them as `@_IGNORE_.foo`, `@_IGNORE_.bar`, etc.

It's sometimes necessary to define a capture in a query not because you want to apply a scope name, but because you need to use it as the argument to a predicate. `@_IGNORE_` was intended for that purpose, but it was the _only_ capture name with that special effect.

Now, you can specify any number of captures that don't apply scope names. As long as it equals `@_IGNORE_` or _starts with_ `@_IGNORE_.`, it'll have the same effect. This lets you target two or more nodes and use them all in predicates in the same query without any of them applying a scope name.
2024-01-27 23:11:41 -08:00
Andrew Dupont
e547ace81c [language-css] Highlighting fixes:
* Style `*` (universal selector)
* Add support for namespaced tags and attributes (now that `tree-sitter-css` supports them)
2024-01-27 20:23:42 -08:00
Andrew Dupont
a8215f107c [language-java] Add highlights for variables…
…when assigning, reassigning, or incrementing.

Also add `++` and `--` as operators.
2024-01-27 18:13:42 -08:00
Andrew Dupont
1f9ab2008b [language-javascript] Highlight public fields in class bodies 2024-01-27 11:31:25 -08:00
Andrew Dupont
6767cda288 Fix indentation bug in suggestedIndentForBufferRow
A leading space was being accounted for when doing some math to compute indent level… but not on both sides of the equation.
2024-01-27 01:32:44 -08:00
Andrew Dupont
adfdd05472 Allow “half-covering” of scopes at the edges of injections
There's a hard-to-grok setting for language injections that allows a deeper layer to monopolize the scope application for a range. In most cases, an injection is placed into a node that the parser doesn't know much about (like a `script` block in HTML); but Rust and C parsers needed a way to inject themselves _into themselves_ so that they could add syntax highlighting to macros. Because they were applying highlighting to a range that the base layer _already_ had plans to highlight, they needed a way to block the shallower layer from acting.

This mode has never worked briliantly, but it's been made smarter in several ways since the invention of modern Tree-sitter. And here's another one: if the highlight iterator is at a position where an injection range is _about_ to begin, it shouldn't be able to stop any other layer from _closing_ a scope; and if the highlight iterator is at a position where an injection range has just _finished_, it shouldn't be able to stop any other layer from _opening_ a scope.

Because of this, we can now fix a bug that I think might've been present for a while in the application of scopes to rust macros like `println!` — the position after the exclamation point is one of those injection-layer boundaries, to the effect that a scope name was opened that would persist until at least the end of the screen line.
2024-01-27 00:41:41 -08:00
Andrew Dupont
5728b7fe5e [language-javascript] Update to latest tree-sitter-jsdoc 2024-01-26 23:12:02 -08:00
Andrew Dupont
483870d701 [language-rust] Scope &s in references as operators 2024-01-26 23:11:11 -08:00
Andrew Dupont
312f627cc1 [language-yaml] Scope unquoted strings as, well, string.unquoted 2024-01-26 23:10:37 -08:00
Andrew Dupont
ecf4fa3917 Revert change to indentLevelForLine
…which locked its return values to integers.

The other language modes allow this method to return a non-integer, hence so should we. If this breaks something, it can be addressed some other way.
2024-01-26 18:33:15 -08:00
Andrew Dupont
ff030d896c [language-javascript] Missed these renames 2024-01-26 18:19:48 -08:00
Andrew Dupont
476e784005 [language-javascript] Two highlighting fixes…
* Revert JSDoc tags to use the `keyword` namespace
* Ensure we always apply `meta.tag.jsx.js` to the area surrounding a JSX opening/closing/self-closing tag element and its punctuation.
2024-01-26 17:26:37 -08:00
Andrew Dupont
11910a11aa [language-gfm] Change markup.code to markup.raw
…and apply it only to the content _inside_ the fence when handling fenced code blocks.
2024-01-26 17:22:04 -08:00
Andrew Dupont
edf19b2af2 [language-php] Stop scoping all tokens LIKE_THIS as constant 2024-01-24 17:11:47 -08:00
Andrew Dupont
9265e5eb3e [language-css] Fix failure to scope the foo in .div foo
…and other descendant combinators.
2024-01-24 17:10:38 -08:00
Andrew Dupont
f1ce722f33 [language-typescript] Various highlighting fixes…
* Declared namespaces should be `entity` only, not `support`
* `<` and `>` in type parameters should always have the proper `punctuation` scopes applied
* All TSX tags should have the surrounding `meta.tag.ts.tsx` scope applied
* TSX fragments (`<>`) should be highlighted
2024-01-24 17:09:42 -08:00
Andrew Dupont
a0595b275d [language-typescript] Use proper comment delimiters in TypeScript…
…when inside of a TS block within a TSX interpolation.

Some mixing of TS and TSX is too ambiguous for the “Toggle Line Comments” command, but in this case we've got a brace-delimited block inside of a TSX interpolation. That's practically guaranteed to mean we've got a line with _only_ TypeScript on it, so we should use an ordinary TS line comment.
2024-01-23 16:17:06 -08:00
Andrew Dupont
1b2163f1ad Stop ESLint from complaining about require('atom') 2024-01-22 23:32:35 -08:00
Andrew Dupont
995196a138 [language-c] Support declarations of pointers-of-pointers 2024-01-22 17:43:25 -08:00
Andrew Dupont
6466d25928 Upload videos unless task is cancelled 2024-01-21 20:48:13 -08:00
Andrew Dupont
5fdcf62ea1 Revert inadvertent change 2024-01-21 20:47:00 -08:00
Andrew Dupont
317679e0b5 Attempt to get video of integration test failure 2024-01-21 20:03:57 -08:00
Andrew Dupont
e0015218b7 A vain attempt to get the integration testing working for PHP 2024-01-21 16:11:34 -08:00
Andrew Dupont
6b89902761 [language-php] Update parserSource field for internal PHP grammar 2024-01-21 13:32:01 -08:00
Andrew Dupont
2aa0cea8a4 [language-gfm] Actually change the scope name for a horizontal rule…
…instead of forgetting to add the file.
2024-01-21 13:22:36 -08:00
Andrew Dupont
ee220dd6ef [language-gfm] Change scope for a horizontal rule…
to `markup.horizontal-rule.gfm` and add styles to all eight built-in syntax themes to account for it.

All the old GFM scopes are just named however they needed to be named in order to produce syntax highlighting to the grammar author, semantics be damned. Instead, we're making sure the semantics are correct, then adapting the syntax themes accordingly.
2024-01-21 13:20:56 -08:00
Andrew Dupont
4c0e7dda9f Highlight JSON keys in the other six builtin syntax themes…
…always using the color that was already used to highlight YAML keys.
2024-01-21 13:07:16 -08:00
Andrew Dupont
e0009ce188 Highlight JSON keys in one-(dark|light)-ui
Upon suggestion, `@hue-5` was chosen for consistency because the same color is used for keys in YAML.
2024-01-21 12:56:34 -08:00
Andrew Dupont
1e7e1351d8 [language-javascript] Ensure object properties are scoped as entity
…instead of `variable` when a function is on the right-hand side of an assignment.
2024-01-21 12:53:44 -08:00
Andrew Dupont
8525a3f622 [language-php] Move value type usages into support.storage.type 2024-01-21 12:51:47 -08:00
Andrew Dupont
cc2785b59f Log context when a parser fails to load
Previously this just put a bunch of `web-tree-sitter` errors in the console without telling you which thing failed. This is a marginal improvement.
2024-01-21 11:22:30 -08:00
Andrew Dupont
8766102edc Clip injection ranges to the bounds of the buffer when needed 2024-01-21 11:20:43 -08:00
Andrew Dupont
33f193cd60 [language-php] Update tree-sitter-php to latest 2024-01-21 11:16:51 -08:00
Andrew Dupont
aeeb03a824 Adopt the support.storage compromise found in legacy Tree-sitter…
…in which all _value types_ are scoped under `support.storage`. The goal is to avoid drawing an arbitrary distinction between, say, `int` and `SomeCustomCType` — those things are different, but not _so_ different that they belong in separate root scope namespaces.

`storage.type` can be used for core language constructs — `var`, `class`, `function`, `struct`, `enum`, `namespace`, and so on. `support.storage.type` should be used for any _recognized_ value type — certainly core language types like `int`, but also other things if they make sense. `support.other.storage.type` can be used for user-defined types, or any other types that we don't recognize. (Using the `support.other` ordering here adheres to our new convention of reserving all of `support.other` for user-defined things.)

The point of this compromise is that both the `syntax--storage` and `syntax--support` class names are present so that many themes will still highlight these tokens as though they were in the root `storage` namespace.

This commit changes the C/C++ and TypeScript `highlights.scm` files. The results appear to be satisfactory to my eye after testing on two of the builtin themes.

I’ve updated the taxonomy document to reflect this new proposal:
https://gist.github.com/savetheclocktower/c9607b97477d4817911e4f2f8db89679#file-scope-taxonomy-md
2024-01-21 10:33:01 -08:00
Andrew Dupont
e48ac62ea5 Correct the PHP delimiters in the integration test 2024-01-20 21:27:08 -08:00
Andrew Dupont
46877b05ff [language-php] Add meta.embedded.block/meta.embedded.line
…to each PHP section in order to match the functionality of the TextMate grammar.

This was a gigantic endeavor and involved doing several things that were on my “ugh, I’ll get around to it” list:

* To make some of this stuff work, we were using two different PHP parser layers. The root one did the syntax highlighting and separated the HTML from the rest, and the deeper injection was there just so we could scope some ranges as `source.php`.

  That doesn’t work because of rules we have about shallower layers acting before deeper layers when iterating through syntax highlighting boundaries. I was trying to be too clever. Now the _root_ layer is the one that does no highlighting, and the _deeper_ layer is the one that exists to apply `source.php` _and then_ perform highlighting and indentation hinting and folding and whatnot.

  If we need to, we can move some of the queries to the root layer for whatever reason; maybe we come across a bug six months from now that could be fixed if we made the root layer in charge of folding. We have options.

* All boundaries for `HighlightIterator`s now _either_ open one or more scopes _or_ close one or more scopes. If one boundary can close some scopes and open others, then boundaries on different layers that share a buffer position cannot possibly close/open in the correct order because they can't intermingle. This needed to happen and this was as good of an excuse as any to do it.
* We needed to present sane PHP opening/closing ranges to the injection. Ironically, `tree-sitter-php` itself makes this nearly impossible because of how the tree is structured; it tries to hide the `<?php` and `?>` tags from the PHP layer and treat them as text, despite the fact that PHP is the thing that knows how to parse that.

  The best way to do this — at least until I encounter a reason why it can’t work — is to find all the `<?php`s and `?>`s, sort them, group them, and build fake node ranges. This is fine! I mean, it’s ridiculous, but it’s fine! The ranges that we hand off to another parser are allowed to be completely arbitrary!

  This lets us do what we were only approximating before: have _one_ PHP injection layer with _any number of_ content ranges, each of which begins with `<?php` and ends with `?>` without trying to claim any surrounding whitespace. This would be worth it even if we didn’t have to do any of this other stuff.

* Each content range of the injection needs _either_ `meta.embedded.line.php` _or_ `meta.embedded.block.php` depending on whether the range begins and ends on the same line. This is not something I was willing to regress on because it's _hard_ to distinguish between PHP and non-PHP unless your editor helps you out, and because I wasn't going to go into a bunch of themes and tell them to treat `source.php` like `meta.embedded`.

  This also meant that we needed to be able to add _multiple_ “root” scope names per content range. But we already had a mode in which the `languageScope` injection option could be a callback, so it wasn't hard to make it a callback that could take extra parameters for the buffer and range.

  This isn't a feature that I'm eager for other grammars to use, or even necessarily know about, but it was what we needed to deliver feature parity here. And none of it would have been necessary if `tree-sitter-php` made more sensible choices. (Whatever. Maybe what I want isn't possible for some strange reason.)

All existing tests pass. Tests have been written for the new `languageScope` features. Tests need to be written for PHP just like for all other language grammars, but that was on the to-do list anyway. If any of this turns out to be catastrophic, it’s easy to roll back, but tests are passing on my machine and I expect them to pass in CI.
2024-01-20 20:49:17 -08:00
Andrew Dupont
2a0ebacf62 An injection with no highlights query should still apply its root scope 2024-01-20 13:50:31 -08:00
Andrew Dupont
4d8a7219c3 [language-c] Highlight struct designated initializers 2024-01-20 12:07:22 -08:00
Andrew Dupont
c2fb3075df [language-php] Small fixes…
* Properly highlight comments like `/***/`
* Add `intdiv` as a builtin function
* Change PHPDoc tags back to a `keyword` scope rather than an `entity.name.tag` scope
* Highlight more PHPDoc types
2024-01-20 10:34:48 -08:00
Andrew Dupont
7130f77f27 [language-typescript] Highlight the wildcard import symbol 2024-01-19 23:25:23 -08:00
Andrew Dupont
65de46faa1 [language-html] Update tree-sitter-embedded-template to latest…
…which will make EJS and ERB much more pleasant to use, and which I should've done ages ago.

Most notably: empty tags like `<% %>` are now valid, so the highlighting won't go nuts before you've typed anything.
2024-01-19 23:16:15 -08:00
Andrew Dupont
88ffe7838b Fix issue where suggestedIndentForBufferRow uses the wrong tree…
…because it makes a different judgment about which layer should own the indent decision than `suggestedIndentForBufferRows`, plural, did.
2024-01-19 22:17:30 -08:00
Andrew Dupont
e1e12ff5ba [language-gfm] Test for undetected URLs in paragraphs…
…and inject `hyperlink` into them for auto-linking.
2024-01-19 21:25:00 -08:00
Andrew Dupont
054b067ff2 Update highlights for all regex injections…
…and add a distinct copy for TypeScript so that it works even if `language-javascript` is disabled or replaced.

(We might want to just make `language-regex` and have it export a service.)
2024-01-19 21:01:07 -08:00
Andrew Dupont
81ca97e0c7 [language-ruby] Tweak scope name for regex injections 2024-01-19 20:47:00 -08:00
Andrew Dupont
c01099323f (forgot to change this spec) 2024-01-19 20:45:48 -08:00