From e03010582036e4671221982ac2434f071b8bf07a Mon Sep 17 00:00:00 2001 From: Andrew Dupont Date: Sat, 9 Mar 2024 10:33:01 -0800 Subject: [PATCH] [language-ruby] Enhancements for percent-array notation in Ruby Fixes #945. --- .../grammars/tree-sitter-ruby/folds.scm | 2 ++ .../grammars/tree-sitter-ruby/highlights.scm | 26 +++++++++++++++++++ .../grammars/tree-sitter-ruby/indents.scm | 6 ++++- 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/packages/language-ruby/grammars/tree-sitter-ruby/folds.scm b/packages/language-ruby/grammars/tree-sitter-ruby/folds.scm index 99810d788..1caba48dc 100644 --- a/packages/language-ruby/grammars/tree-sitter-ruby/folds.scm +++ b/packages/language-ruby/grammars/tree-sitter-ruby/folds.scm @@ -9,6 +9,8 @@ (lambda) (hash) (array) + (string_array) + (symbol_array) ] @fold diff --git a/packages/language-ruby/grammars/tree-sitter-ruby/highlights.scm b/packages/language-ruby/grammars/tree-sitter-ruby/highlights.scm index 0d9b19784..57a1ed3f7 100644 --- a/packages/language-ruby/grammars/tree-sitter-ruby/highlights.scm +++ b/packages/language-ruby/grammars/tree-sitter-ruby/highlights.scm @@ -515,6 +515,32 @@ "[" @punctuation.definition.begin.array.bracket.square.ruby "]" @punctuation.definition.end.array.bracket.square.ruby +; Some array delimiters don't use the correct anonymous nodes, so we have to test their content. +; +; Handle `%w[` and `%i[`. +(["%w(" "%i("] @punctuation.definition.begin.array.bracket.square.ruby + (#match? @punctuation.definition.begin.array.bracket.square.ruby "%[a-z]\\[")) + +; Handle `%w(` and `%i(`. +(["%w(" "%i("] @punctuation.definition.begin.array.bracket.round.ruby + (#match? @punctuation.definition.begin.array.bracket.round.ruby "^%[a-z]\\(")) + +; Handle ending delimiter of `%w(`. +((string_array ")" @punctuation.definition.end.array.bracket.round.ruby) + (#eq? @punctuation.definition.end.array.bracket.round.ruby ")")) + +; Handle ending delimiter of `%i(`. +((symbol_array ")" @punctuation.definition.end.array.bracket.round.ruby) + (#eq? @punctuation.definition.end.array.bracket.round.ruby ")")) + +; Any character can be used as the delimiter for a special percent-something! For the rest we can define catch-alls. +(["%w(" "%i("] @punctuation.definition.begin.array.ruby + (#set! capture.shy true)) +((string_array ")" @punctuation.definition.end.array.ruby) + (#set! capture.shy true)) +((symbol_array ")" @punctuation.definition.end.array.ruby) + (#set! capture.shy true)) + (parenthesized_statements "(" @punctuation.definition.expression.begin.bracket.round.ruby ")" @punctuation.definition.expression.end.bracket.round.ruby) diff --git a/packages/language-ruby/grammars/tree-sitter-ruby/indents.scm b/packages/language-ruby/grammars/tree-sitter-ruby/indents.scm index adcc60b40..5743c8e6b 100644 --- a/packages/language-ruby/grammars/tree-sitter-ruby/indents.scm +++ b/packages/language-ruby/grammars/tree-sitter-ruby/indents.scm @@ -25,7 +25,6 @@ "while" "until" "for" - ; (for) "begin" "do" "rescue" @@ -33,6 +32,11 @@ "(" "{" "[" + ; “Special” array notations. (Currently, they all have the same anonymous + ; node, even if they’re delimited with another character pair instead of + ; parentheses.) + "%w(" + "%i(" ] @indent [