summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Roden-Corrent <ryan@rcorre.net>2022-01-23 13:44:36 -0500
committerChristian Clason <christian.clason@uni-due.de>2022-01-24 13:11:01 +0100
commitf67eb83be5f8c49f1a7621553458227b786b1b0c (patch)
tree9fc4e598687766013c479d8c360d92688b4f3839
parent674df40120d8e8451eff69271fc6de887f779f27 (diff)
feat(indent): Implement basic indent for gdscript.
Indent is not handled correctly when adding new lines. It seems that functions/loops/etc. are not recognized until they have at least one indented block. For example, if you enter a newline after `func foo():`, the cursor will not be indented. If you manually indent and add a line like `pass`, e.g.: ``` func foo(): pass ``` now any insertions above or below `pass` will be indented correctly. This might be an issue with the grammar, as it seems to apply to highlights as well. The following will not be highligted ``` func foo(): ``` However, the following will be: ``` func foo(): pass ```
-rw-r--r--queries/gdscript/indents.scm24
-rw-r--r--tests/indent/gdscript/basic_blocks.gd16
-rw-r--r--tests/indent/gdscript_spec.lua20
3 files changed, 60 insertions, 0 deletions
diff --git a/queries/gdscript/indents.scm b/queries/gdscript/indents.scm
new file mode 100644
index 00000000..80b78234
--- /dev/null
+++ b/queries/gdscript/indents.scm
@@ -0,0 +1,24 @@
+[
+ (if_statement)
+
+ (for_statement)
+ (while_statement)
+
+ (parenthesized_expression)
+
+ (function_definition)
+ (class_definition)
+] @indent
+
+((argument_list) @aligned_indent
+ (#set! "delimiter" "()"))
+((parameters) @aligned_indent
+ (#set! "delimiter" "()"))
+
+[
+ ")"
+ "]"
+ "}"
+ (elif_clause)
+ (else_clause)
+] @branch
diff --git a/tests/indent/gdscript/basic_blocks.gd b/tests/indent/gdscript/basic_blocks.gd
new file mode 100644
index 00000000..3bc04854
--- /dev/null
+++ b/tests/indent/gdscript/basic_blocks.gd
@@ -0,0 +1,16 @@
+extends Node
+
+func _ready():
+ var x := 2
+ for i in range(x):
+ prints(i)
+
+ while x > 0:
+ print(x)
+
+ if x > 0:
+ print("if test")
+ elif x < 0:
+ print("if test")
+ else:
+ print("if test")
diff --git a/tests/indent/gdscript_spec.lua b/tests/indent/gdscript_spec.lua
new file mode 100644
index 00000000..c1770f41
--- /dev/null
+++ b/tests/indent/gdscript_spec.lua
@@ -0,0 +1,20 @@
+local Runner = require("tests.indent.common").Runner
+
+local run = Runner:new(it, "tests/indent/gdscript", {
+ tabstop = 4,
+ shiftwidth = 4,
+ softtabstop = 0,
+ expandtab = false,
+})
+
+describe("indent GDScript:", function()
+ describe("whole file:", function()
+ run:whole_file(".", {
+ expected_failures = {},
+ })
+ end)
+
+ describe("new line:", function()
+ run:new_line("basic_blocks.gd", { on_line = 1, text = "var member := 0", indent = 0 })
+ end)
+end)