aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPham Huy Hoang <hoangtun0810@gmail.com>2023-01-10 14:04:27 +0900
committerStephan Seitz <stephan.seitz@fau.de>2023-01-14 04:52:21 -0800
commit2f5deed45628e4960fabfe28735d73a82eb59d98 (patch)
treeec34faafb04329337a6aed57d1eb651bbeb3f4ed
parenthighlights(kotlin): package keyword and declaration (diff)
downloadnvim-treesitter-2f5deed45628e4960fabfe28735d73a82eb59d98.tar
nvim-treesitter-2f5deed45628e4960fabfe28735d73a82eb59d98.tar.gz
nvim-treesitter-2f5deed45628e4960fabfe28735d73a82eb59d98.tar.bz2
nvim-treesitter-2f5deed45628e4960fabfe28735d73a82eb59d98.tar.lz
nvim-treesitter-2f5deed45628e4960fabfe28735d73a82eb59d98.tar.xz
nvim-treesitter-2f5deed45628e4960fabfe28735d73a82eb59d98.tar.zst
nvim-treesitter-2f5deed45628e4960fabfe28735d73a82eb59d98.zip
indents(c): Refactor indent queries
-rw-r--r--queries/c/indents.scm86
-rw-r--r--tests/indent/c/if_else.c60
-rw-r--r--tests/indent/c/issue-4079.c7
-rw-r--r--tests/indent/c/issue-4117.c6
-rw-r--r--tests/indent/c/no_braces.c1
-rw-r--r--tests/indent/c_spec.lua32
6 files changed, 178 insertions, 14 deletions
diff --git a/queries/c/indents.scm b/queries/c/indents.scm
index 661ae8228..185ace10c 100644
--- a/queries/c/indents.scm
+++ b/queries/c/indents.scm
@@ -1,28 +1,92 @@
[
- (compound_statement)
- (preproc_arg)
+ (compound_statement)
(field_declaration_list)
(case_statement)
(enumerator_list)
- (struct_specifier)
(compound_literal_expression)
(initializer_list)
- (while_statement)
- (for_statement)
- (switch_statement)
+ (init_declarator)
(expression_statement)
] @indent
-(if_statement condition: (_) @indent)
-((if_statement
+
+(
+ if_statement
+ condition: (_) @indent
+)
+(
+ (if_statement
+ consequence: (_ ";" @indent_end) @_consequence
+ ) @indent
+ (#not-has-type? @_consequence compound_statement)
+)
+
+;; if-else case,
+;; with else that is not if/compound statement
+(
+ (if_statement
+ consequence: (_ ";" @indent_end) @_consequence
+ "else" @branch
+ alternative: (_) @_alternative
+ )@indent
+ (#not-has-type? @_consequence compound_statement)
+ (#not-has-type? @_alternative compound_statement)
+)
+
+;; if-elseif-else case
+(
+ if_statement
consequence: (_) @_consequence
+ alternative:
+ (if_statement "else" @branch)
(#not-has-type? @_consequence compound_statement)
- ) @indent)
-(init_declarator) @indent
+)
+
+;; if- else case
+;; The alternative should be one of the cases below
+;; because the alternative is a nested tree inside the original if
+;; dedent to offset the indent it should have gotten
+;; Does not support multi chained bare ifs
+(
+ (if_statement
+ consequence: (_ ";" @indent_end) @_consequence
+ "else" @branch
+ alternative:
+ [
+ (compound_statement) @dedent
+ (if_statement
+ consequence: (_) @_consequence (#not-has-type? @_consequence compound_statement)
+ ) @dedent
+ (if_statement consequence: (compound_statement) @dedent)
+ ]
+ )@indent
+ (#not-has-type? @_consequence compound_statement)
+)
+
+(
+ ERROR
+ "for" "(" @indent ";" ";" ")" @indent_end)
+(
+ (for_statement
+ body: (_) @_body
+ ) @indent
+ (#not-has-type? @_body compound_statement)
+)
+
+(
+ while_statement
+ condition: (_) @indent
+)
+(
+ (while_statement
+ body: (_) @_body
+ ) @indent
+ (#not-has-type? @_body compound_statement)
+)
+
(compound_statement "}" @indent_end)
[
- "else"
")"
"}"
(statement_identifier)
diff --git a/tests/indent/c/if_else.c b/tests/indent/c/if_else.c
new file mode 100644
index 000000000..0a81b3594
--- /dev/null
+++ b/tests/indent/c/if_else.c
@@ -0,0 +1,60 @@
+int foo(int x){
+ if (x > 10)
+ return 10;
+
+ if (x > 10)
+ return 10;
+ else
+ return 10;
+
+ if (x > 20)
+ return 20;
+ else if (x > 15)
+ return 15;
+ else
+ return 10;
+}
+
+int bar(int x){
+ if (x > 20)
+ return 10;
+ else {
+ return 10;
+ }
+
+ if (x > 20)
+ return 10;
+ else if (x > 10) {
+ return 10;
+ }
+}
+
+int baz(int x){
+ if (x > 20)
+ return x;
+ else if(x > 10) {
+ if(x > 10) {
+ if(x > 10)
+ return 10;
+ if(x > 5) {
+ return 5;
+ }
+ }
+ }
+
+ if (x > 20)
+ if (x > 19)
+ if(x > 18)
+ return x;
+
+ if (x > 20)
+ return x;
+ else if (x > 19) {
+ if (x > 18)
+ return x;
+ else
+ x++;
+ }
+ else
+ return x;
+}
diff --git a/tests/indent/c/issue-4079.c b/tests/indent/c/issue-4079.c
new file mode 100644
index 000000000..fd1490c8f
--- /dev/null
+++ b/tests/indent/c/issue-4079.c
@@ -0,0 +1,7 @@
+int main(){
+ for(;;)
+}
+
+int foo(){
+ while(1)
+}
diff --git a/tests/indent/c/issue-4117.c b/tests/indent/c/issue-4117.c
new file mode 100644
index 000000000..12e05c63d
--- /dev/null
+++ b/tests/indent/c/issue-4117.c
@@ -0,0 +1,6 @@
+int main(){
+ if(1){
+ }
+ else {
+ }
+}
diff --git a/tests/indent/c/no_braces.c b/tests/indent/c/no_braces.c
index 544ac01d0..9cc63989d 100644
--- a/tests/indent/c/no_braces.c
+++ b/tests/indent/c/no_braces.c
@@ -10,3 +10,4 @@ int foo(int x) {
for (int i = 0; i < 3; ++i)
x--;
}
+
diff --git a/tests/indent/c_spec.lua b/tests/indent/c_spec.lua
index 040ca9a23..6d5db4aab 100644
--- a/tests/indent/c_spec.lua
+++ b/tests/indent/c_spec.lua
@@ -38,9 +38,35 @@ describe("indent C:", function()
runner:new_line("ternary.c", { on_line = 4, text = ": (x == 0) : 0", indent = 8 })
runner:new_line("issue-1568.c", { on_line = 4, text = "x++;", indent = 8 })
runner:new_line("issue-2086.c", { on_line = 3, text = "}", indent = 0 })
+ runner:new_line("issue-4079.c", { on_line = 2, text = "return;", indent = 8 })
+ runner:new_line("issue-4079.c", { on_line = 2, text = "{", indent = 4 })
+ runner:new_line("issue-4079.c", { on_line = 6, text = "{", indent = 4 })
-- the line after inserted one will be left with wrong indent but we only care about the inserted one
- runner:new_line("no_braces.c", { on_line = 4, text = "x++;", indent = 8 })
- runner:new_line("no_braces.c", { on_line = 7, text = "x++;", indent = 8 })
- runner:new_line("no_braces.c", { on_line = 10, text = "x++;", indent = 8 })
+ for _, line in ipairs { 2, 4, 7, 10 } do
+ runner:new_line("no_braces.c", { on_line = line, text = "x++;", indent = 8 })
+ end
+ for _, line in ipairs { 2, 5, 7, 10, 12, 14, 20, 22, 25, 27, 28, 33 } do
+ runner:new_line("if_else.c", { on_line = line, text = "x++;", indent = 8 })
+ end
+ for _, line in ipairs { 3, 6, 8, 13, 15, 20, 23 } do
+ runner:new_line("if_else.c", { on_line = line, text = "else", indent = 4 })
+ end
+ for _, info in ipairs {
+ { 36, 12 },
+ { 37, 16 },
+ { 38, 12 },
+ { 39, 16 },
+ { 41, 12 },
+ { 42, 8 },
+ { 45, 8 },
+ { 46, 12 },
+ { 47, 16 },
+ { 48, 4 },
+ { 52, 8 },
+ { 53, 12 },
+ { 54, 12 },
+ } do
+ runner:new_line("if_else.c", { on_line = info[1], text = "x++;", indent = info[2] })
+ end
end)
end)