-
Notifications
You must be signed in to change notification settings - Fork 3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
svelte: Migrate to
tree-sitter-grammars/tree-sitter-svelte
(#17529)
> [!NOTE] > The https://github.com/tree-sitter-grammars/tree-sitter-svelte repository seems to be more well maintained, with higher quality code, and as per zed-extensions/svelte#1 it was suggested that we swap to this repository for Svelte grammars - Closes #17310 - Closes #10893 - Closes #12833 - Closes zed-extensions/svelte#1 - Closes #14943 - Closes zed-extensions/svelte#2 - Added: buffer/file symbol outlines for `.svelte` (`outlines.scm`) - Improved: Attribute directives & modifiers in `.svelte` files can be styled independently. - Fixed: issue where svelte expression inside quotes failed parsing - Improved: Svelte components in Markup are styled differently from tags. - Added: Support for Svelte 5 syntax (`{#snippet children()}`, `{@render foo()`) - Change: Svelte now using [tree-sitter-grammars/tree-sitter-svelte](https://github.com/tree-sitter-grammars/tree-sitter-svelte) for language highlighting - Added: Support for typescript syntax in svelte expressions ![image](https://github.com/user-attachments/assets/49d199ee-7550-49a7-912d-070cf691b029) ![image](https://github.com/user-attachments/assets/848ac5b6-62da-4c42-8e24-b7023504f8af) Release Notes: - N/A --- **tree-sitter-grammar things to improve** - [ ] snippet functions aren't being treated as JS code - [ ] we should be able to detect @component comments and treat them as markdown - [x] `foo:bar` style/class/prop directives - [x] `--foo="..."` var fields - [ ] snippet/if blocks's children may need to be indented a little further Will implement some of the rest of these in a separate PR --------- Co-authored-by: Marshall Bowers <[email protected]>
- Loading branch information
1 parent
27f0995
commit accff82
Showing
7 changed files
with
268 additions
and
110 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
("<" @open ">" @close) | ||
("{" @open "}" @close) | ||
("'" @open "'" @close) | ||
("\"" @open "\"" @close) | ||
("(" @open ")" @close) | ||
; ("[" @open "]" @close) | ||
; ("`" @open "`" @close) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,50 +1,107 @@ | ||
; Special identifiers | ||
;-------------------- | ||
|
||
; Treat capitalized tag names as constructors and types | ||
((tag_name) @type | ||
(#match? @type "^[A-Z]")) | ||
; comments | ||
(comment) @comment | ||
|
||
; Regular (lowercase) tag names | ||
((tag_name) @tag | ||
(#match? @tag "^[a-z]")) | ||
; property attribute | ||
(attribute_directive) @attribute.function | ||
(attribute_identifier) @attribute | ||
(attribute_modifier) @attribute.special | ||
|
||
; TODO: | ||
(attribute_name) @property | ||
(erroneous_end_tag_name) @keyword | ||
(comment) @comment | ||
; Style component attributes as @property | ||
(start_tag | ||
( | ||
(tag_name) @_tag_name | ||
(#match? @_tag_name "^[A-Z]") | ||
) | ||
(attribute | ||
(attribute_name | ||
(attribute_identifier) @tag.property | ||
) | ||
) | ||
) | ||
|
||
[ | ||
(attribute_value) | ||
(quoted_attribute_value) | ||
] @string | ||
(self_closing_tag | ||
( | ||
(tag_name) @_tag_name | ||
(#match? @_tag_name "^[A-Z]") | ||
) | ||
(attribute | ||
(attribute_name | ||
(attribute_identifier) @tag.property | ||
) | ||
) | ||
) | ||
|
||
[ | ||
(text) | ||
(raw_text_expr) | ||
(raw_text_each) | ||
] @none | ||
|
||
; style elements starting with lowercase letters as tags | ||
( | ||
(tag_name) @tag | ||
(#match? @tag "^[a-z]") | ||
) | ||
|
||
; style elements starting with uppercase letters as components (types) | ||
; Also valid might be to treat them as constructors | ||
( | ||
(tag_name) @tag @tag.component.type.constructor | ||
(#match? @tag "^[A-Z]") | ||
) | ||
|
||
[ | ||
(special_block_keyword) | ||
(then) | ||
(as) | ||
] @keyword | ||
"<" | ||
">" | ||
"</" | ||
"/>" | ||
] @tag.punctuation.bracket | ||
|
||
|
||
[ | ||
"{" | ||
"}" | ||
] @punctuation.bracket | ||
|
||
"=" @operator | ||
[ | ||
"|" | ||
] @punctuation.delimiter | ||
|
||
|
||
[ | ||
"<" | ||
">" | ||
"</" | ||
"/>" | ||
"@" | ||
"#" | ||
":" | ||
"/" | ||
"@" | ||
] @tag.delimiter | ||
] @tag.punctuation.special | ||
|
||
"=" @operator | ||
|
||
|
||
; Treating (if, each, ...) as a keyword inside of blocks | ||
; like {#if ...} or {#each ...} | ||
(block_start_tag | ||
tag: _ @tag.keyword | ||
) | ||
|
||
(block_tag | ||
tag: _ @tag.keyword | ||
) | ||
|
||
(block_end_tag | ||
tag: _ @tag.keyword | ||
) | ||
|
||
(expression_tag | ||
tag: _ @tag.keyword | ||
) | ||
|
||
; Style quoted string attribute values | ||
(quoted_attribute_value) @string | ||
|
||
|
||
; Highlight the `as` keyword in each blocks | ||
(each_start | ||
("as") @tag.keyword | ||
) | ||
|
||
|
||
; Highlight the snippet name as a function | ||
; (e.g. {#snippet foo(bar)} | ||
(snippet_name) @function |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,74 +1,86 @@ | ||
; injections.scm | ||
; -------------- | ||
; ; injections.scm | ||
; ; -------------- | ||
|
||
; match script tags without a lang tag | ||
((script_element | ||
(start_tag | ||
(attribute | ||
(attribute_name) @_name)*) | ||
(raw_text) @content) | ||
(#not-eq? @_name "lang") | ||
(#set! "language" "javascript")) | ||
; Match script tags with a lang attribute | ||
(script_element | ||
(start_tag | ||
(attribute | ||
(attribute_name) @_attr_name | ||
(#eq? @_attr_name "lang") | ||
(quoted_attribute_value | ||
(attribute_value) @language | ||
) | ||
) | ||
) | ||
(raw_text) @content | ||
) | ||
|
||
; match javascript | ||
((script_element | ||
(start_tag | ||
(attribute | ||
(attribute_name) @_name | ||
(quoted_attribute_value (attribute_value) @_value))) | ||
(raw_text) @content) | ||
(#eq? @_name "lang") | ||
(#eq? @_value "js") | ||
(#set! "language" "javascript")) | ||
; Match script tags without a lang attribute | ||
(script_element | ||
(start_tag | ||
(attribute | ||
(attribute_name) @_attr_name | ||
)* | ||
) | ||
(raw_text) @content | ||
(#not-any-of? @_attr_name "lang") | ||
(#set! language "javascript") | ||
) | ||
|
||
; match typescript | ||
((script_element | ||
(start_tag | ||
(attribute | ||
(attribute_name) @_name | ||
(quoted_attribute_value (attribute_value) @_value))) | ||
(raw_text) @content) | ||
(#eq? @_name "lang") | ||
(#eq? @_value "ts") | ||
(#set! "language" "typescript")) | ||
; Match the contents of the script's generics="T extends string" as typescript code | ||
; | ||
; Disabled for the time-being because tree-sitter is treating the generics | ||
; attribute as a top-level typescript statement, where `T extends string` is | ||
; not a valid top-level typescript statement. | ||
; | ||
; (script_element | ||
; (start_tag | ||
; (attribute | ||
; (attribute_name) @_attr_name | ||
; (#eq? @_attr_name "generics") | ||
; (quoted_attribute_value | ||
; (attribute_value) @content | ||
; ) | ||
; ) | ||
; ) | ||
; (#set! language "typescript") | ||
; ) | ||
|
||
(style_element | ||
(raw_text) @content | ||
(#set! "language" "css")) | ||
|
||
; match style tags without a lang tag | ||
((style_element | ||
(start_tag | ||
(attribute | ||
(attribute_name) @_name)*) | ||
(raw_text) @content) | ||
(#not-eq? @_name "lang") | ||
(#set! "language" "css")) | ||
; Mark everything as typescript because it's | ||
; a more generic superset of javascript | ||
; Not sure if it's possible to somehow refer to the | ||
; script's language attribute here. | ||
((svelte_raw_text) @content | ||
(#set! "language" "ts") | ||
) | ||
|
||
; match css | ||
((style_element | ||
(start_tag | ||
(attribute | ||
(attribute_name) @_name | ||
(quoted_attribute_value (attribute_value) @_value))) | ||
(raw_text) @content) | ||
(#eq? @_name "lang") | ||
(#eq? @_value "css") | ||
(#set! "language" "css")) | ||
; Match style tags with a lang attribute | ||
(style_element | ||
(start_tag | ||
(attribute | ||
(attribute_name) @_attr_name | ||
(#eq? @_attr_name "lang") | ||
(quoted_attribute_value | ||
(attribute_value) @language | ||
) | ||
) | ||
) | ||
(raw_text) @content | ||
) | ||
|
||
; match scss | ||
((style_element | ||
(start_tag | ||
(attribute | ||
(attribute_name) @_name | ||
(quoted_attribute_value (attribute_value) @_value))) | ||
(raw_text) @content) | ||
(#eq? @_name "lang") | ||
(#eq? @_value "scss") | ||
(#set! "language" "scss")) | ||
; Match style tags without a lang attribute | ||
(style_element | ||
(start_tag | ||
(attribute | ||
(attribute_name) @_attr_name | ||
)* | ||
) | ||
(raw_text) @content | ||
(#not-any-of? @_attr_name "lang") | ||
(#set! language "css") | ||
) | ||
|
||
((raw_text_expr) @content | ||
(#set! "language" "javascript")) | ||
|
||
((raw_text_each) @content | ||
(#set! "language" "javascript")) | ||
; Downstream TODO: Style highlighting for `style:background="red"` and `style="background: red"` strings | ||
; Downstream TODO: Style component comments as markdown |
Oops, something went wrong.