From 864b4171de82772323ab97d1fd9a9dbfcf53c002 Mon Sep 17 00:00:00 2001 From: Pham Huy Hoang Date: Mon, 8 May 2023 14:53:31 +0900 Subject: [PATCH] feat: add swift indents (#4756) --- queries/swift/indents.scm | 87 +++++++++++++++++++++++++++ tests/indent/swift/declarations.swift | 51 ++++++++++++++++ tests/indent/swift/expressions.swift | 17 ++++++ tests/indent/swift/statements.swift | 34 +++++++++++ tests/indent/swift_spec.lua | 21 +++++++ 5 files changed, 210 insertions(+) create mode 100644 queries/swift/indents.scm create mode 100644 tests/indent/swift/declarations.swift create mode 100644 tests/indent/swift/expressions.swift create mode 100644 tests/indent/swift/statements.swift create mode 100644 tests/indent/swift_spec.lua diff --git a/queries/swift/indents.scm b/queries/swift/indents.scm new file mode 100644 index 000000000..4207a788b --- /dev/null +++ b/queries/swift/indents.scm @@ -0,0 +1,87 @@ +[ + (protocol_body) + (class_body) + (function_declaration) + (computed_property) + (subscript_declaration) + + (computed_getter) + (computed_setter) + + (assignment) + + (control_transfer_statement) ; return ... + (for_statement) + (while_statement) + (repeat_while_statement) + (do_statement) + (if_statement) + (switch_statement) + (guard_statement) + + (type_parameters) ; x + (tuple_type) ; (...) + (array_type) ; [String] + (dictionary_type); [Foo: Bar] + + (call_expression) + (tuple_expression) + (array_literal) + (dictionary_literal) + (lambda_literal) +] @indent.begin + +; @something(...) +((modifiers + (attribute) @indent.begin)) + +(function_declaration + (modifiers + . + (attribute) + (_)* @indent.branch) + . + _ @indent.branch + (#not-has-type? @indent.branch type_parameters parameter)) + + +(ERROR + [ + "<" + "{" + "(" + "[" + ] +) @indent.begin + + +; if-elseif +(if_statement + (if_statement) @indent.dedent) + +(switch_entry . _ @indent.branch) + +(function_declaration ")" @indent.branch) + +(type_parameters ">" @indent.branch @indent.end .) +(tuple_expression ")" @indent.branch @indent.end) +(value_arguments ")" @indent.branch @indent.end) +(tuple_type ")" @indent.branch @indent.end) +(modifiers + (attribute ")" @indent.branch @indent.end)) + +[ + "}" + "]" +] @indent.branch @indent.end + + +[ + ; (ERROR) + (comment) + (multiline_comment) + (raw_str_part) + (multi_line_string_literal) +] @indent.auto + +(directive) @indent.ignore diff --git a/tests/indent/swift/declarations.swift b/tests/indent/swift/declarations.swift new file mode 100644 index 000000000..a6f576ef2 --- /dev/null +++ b/tests/indent/swift/declarations.swift @@ -0,0 +1,51 @@ +@wrapper +@modifier( + * +) +class EquilateralTriangle: NamedShape { + var sideLength: Double = 0.0 + + @attr + init( + sideLength: Double, + name: String + ) { + self.sideLength = sideLength + } + + var perimeter: Double { + willSet { + } + } + + @funcattr + override func simpleDescription(a: int, b: int) -> String { + return "An equilateral triangle with sides of length \(sideLength)." + } +} + +@attr +protocol ExampleProtocol { + var simpleDescription: String { get } + mutating func adjust() +} + +@available(*) +func test() { + +} + +@attr(*) +typealias Foo = Bar + +@attr +struct Foo< + Bar +> { + @Provider + var test = 1 + + subscript(index: Int) -> Int { + var foo = 2 + } +} diff --git a/tests/indent/swift/expressions.swift b/tests/indent/swift/expressions.swift new file mode 100644 index 000000000..4f7292a69 --- /dev/null +++ b/tests/indent/swift/expressions.swift @@ -0,0 +1,17 @@ +func Test() { + (1 + 2) + + [ + 1, + 2, + 3, + 4, + 5 + ].split() + + let x = [ + 1: 2, + 3: 4, + ] + +} diff --git a/tests/indent/swift/statements.swift b/tests/indent/swift/statements.swift new file mode 100644 index 000000000..df6e46c94 --- /dev/null +++ b/tests/indent/swift/statements.swift @@ -0,0 +1,34 @@ +func Test() { + if true { + return + } else if true { + return + } + + switch x { + case "1": + print("x") + default: + print("y") + @unknown default: + print("z") + } + + for a in b { + } + + while true{ + } + + repeat { + + } while (true) + + guard let name = person["name"] else { + return + } + + return ( + x + 1 + ) +} diff --git a/tests/indent/swift_spec.lua b/tests/indent/swift_spec.lua new file mode 100644 index 000000000..6ba0d2cf0 --- /dev/null +++ b/tests/indent/swift_spec.lua @@ -0,0 +1,21 @@ +local Runner = require("tests.indent.common").Runner + +local run = Runner:new(it, "tests/indent/swift", { + tabstop = 2, + shiftwidth = 2, + softtabstop = 2, + expandtab = true, +}) + +describe("indent Swift:", function() + describe("whole file:", function() + run:whole_file(".", {}) + end) + describe("new line:", function() + run:new_line("declarations.swift", { on_line = 6, text = "var x = 1", indent = 2 }) + run:new_line("declarations.swift", { on_line = 12, text = "var textInsideInit = true", indent = 4 }) + run:new_line("declarations.swift", { on_line = 17, text = "var textInsideWillSet = 1", indent = 6 }) + run:new_line("declarations.swift", { on_line = 22, text = "var textInsideOverrideFunc", indent = 4 }) + run:new_line("declarations.swift", { on_line = 28, text = "var InsideProtocol: String { get }", indent = 2 }) + end) +end)