diff options
| -rw-r--r-- | queries/c/indents.scm | 8 | ||||
| -rw-r--r-- | tests/indent/c/issue-4525.c | 23 | ||||
| -rw-r--r-- | tests/indent/c_spec.lua | 16 |
3 files changed, 46 insertions, 1 deletions
diff --git a/queries/c/indents.scm b/queries/c/indents.scm index 71f47ced1..4d1ba3940 100644 --- a/queries/c/indents.scm +++ b/queries/c/indents.scm @@ -6,9 +6,15 @@ (compound_literal_expression) (initializer_list) (init_declarator) - (expression_statement) ] @indent.begin +; With current indent logic, if we capture expression_statement with @indent.begin +; It will be affected by _parent_ node with error subnodes deep down the tree +; So narrow indent capture to check for error inside expression statement only, +(expression_statement + (_) @indent.begin + ";" @indent.end) + ( ERROR "for" "(" @indent.begin ";" ";" ")" @indent.end) diff --git a/tests/indent/c/issue-4525.c b/tests/indent/c/issue-4525.c new file mode 100644 index 000000000..35feccedc --- /dev/null +++ b/tests/indent/c/issue-4525.c @@ -0,0 +1,23 @@ +#include <stdint.h> +#include <inttypes.h> +#include <stdio.h> + +char *a = "a" "b" "c" D; + +static int a, b, c; +a = b = c = 0; + +static int d = 0, e = 0, f = 0; + +int main(void) { + printf("String" PRIu64 "\n", (uint64_t)0); + printf("String" AND_ERROR_NODE "and string"); + fflush(stdout); + a = 0; b = 0; c = 0; + int x = 0; int y = 0; int z = 0; + foo(1, 2); + x++; + a = b + = c + = d; +} diff --git a/tests/indent/c_spec.lua b/tests/indent/c_spec.lua index 4fcdb3ebf..4e2826a54 100644 --- a/tests/indent/c_spec.lua +++ b/tests/indent/c_spec.lua @@ -73,5 +73,21 @@ describe("indent C:", function() for _, line in ipairs { 10, 12, 14 } do runner:new_line("if_else.c", { on_line = line, text = "{}", indent = 4 }) end + + for _, info in ipairs { + { 8, 0 }, + { 10, 0 }, + { 13, 4 }, + { 14, 4 }, + { 15, 4 }, + { 16, 4 }, + { 17, 4 }, + { 18, 4 }, + { 20, 8 }, + { 21, 8 }, + { 22, 4 }, + } do + runner:new_line("issue-4525.c", { on_line = info[1], text = "x++;", indent = info[2] }) + end end) end) |
