diff --git a/book/src/generated/lang-support.md b/book/src/generated/lang-support.md index b9aadc69efe1..5afde0972b54 100644 --- a/book/src/generated/lang-support.md +++ b/book/src/generated/lang-support.md @@ -190,7 +190,7 @@ | supercollider | ✓ | | | | | svelte | ✓ | | ✓ | `svelteserver` | | sway | ✓ | ✓ | ✓ | `forc` | -| swift | ✓ | | | `sourcekit-lsp` | +| swift | ✓ | ✓ | | `sourcekit-lsp` | | t32 | ✓ | | | | | tablegen | ✓ | ✓ | ✓ | | | tact | ✓ | ✓ | ✓ | | diff --git a/languages.toml b/languages.toml index 19c5cf9fe625..1888e8f4e39a 100644 --- a/languages.toml +++ b/languages.toml @@ -1908,16 +1908,17 @@ language-servers = [ "r" ] name = "swift" scope = "source.swift" injection-regex = "swift" -file-types = ["swift"] +file-types = ["swift", "swiftinterface"] roots = [ "Package.swift" ] comment-token = "//" block-comment-tokens = { start = "/*", end = "*/" } +formatter = { command = "swift-format", args = [ "--configuration", ".swift-format"] } auto-format = true language-servers = [ "sourcekit-lsp" ] [[grammar]] name = "swift" -source = { git = "https://github.com/alex-pinkus/tree-sitter-swift", rev = "b1b66955d420d5cf5ff268ae552f0d6e43ff66e1" } +source = { git = "https://github.com/alex-pinkus/tree-sitter-swift", rev = "57c1c6d6ffa1c44b330182d41717e6fe37430704" } [[language]] name = "erb" diff --git a/runtime/queries/swift/highlights.scm b/runtime/queries/swift/highlights.scm index e7610e38dd42..42411d907a44 100644 --- a/runtime/queries/swift/highlights.scm +++ b/runtime/queries/swift/highlights.scm @@ -1,4 +1,4 @@ -; Upstream: https://github.com/alex-pinkus/tree-sitter-swift/blob/1c586339fb00014b23d6933f2cc32b588a226f3b/queries/highlights.scm +; Upstream: https://github.com/alex-pinkus/tree-sitter-swift/blob/57c1c6d6ffa1c44b330182d41717e6fe37430704/queries/highlights.scm (line_string_literal ["\\(" ")"] @punctuation.special) @@ -10,6 +10,7 @@ (attribute) @variable (type_identifier) @type (self_expression) @variable.builtin +(user_type (type_identifier) @variable.builtin (#eq? @variable.builtin "Self")) ; Declarations "func" @keyword.function @@ -23,7 +24,9 @@ ] @keyword (function_declaration (simple_identifier) @function.method) -(function_declaration "init" @constructor) +(init_declaration ["init" @constructor]) +(deinit_declaration ["deinit" @constructor]) + (throws) @keyword "async" @keyword "await" @keyword @@ -48,10 +51,23 @@ "override" "convenience" "required" - "some" + "mutating" + "associatedtype" + "package" "any" ] @keyword +(opaque_type ["some" @keyword]) +(existential_type ["any" @keyword]) + +(precedence_group_declaration + ["precedencegroup" @keyword] + (simple_identifier) @type) +(precedence_group_attribute + (simple_identifier) @keyword + [(simple_identifier) @type + (boolean_literal) @constant.builtin.boolean]) + [ (getter_specifier) (setter_specifier) @@ -73,6 +89,10 @@ ((navigation_expression (simple_identifier) @type) ; SomeType.method(): highlight SomeType as a type (#match? @type "^[A-Z]")) +(call_expression (simple_identifier) @keyword (#eq? @keyword "defer")) ; defer { ... } + +(try_operator) @operator +(try_operator ["try" @keyword]) (directive) @function.macro (diagnostic) @function.macro @@ -136,10 +156,8 @@ ; Operators [ - "try" - "try?" - "try!" "!" + "?" "+" "-" "*" @@ -171,3 +189,8 @@ "..." (custom_operator) ] @operator + +(value_parameter_pack ["each" @keyword]) +(value_pack_expansion ["repeat" @keyword]) +(type_parameter_pack ["each" @keyword]) +(type_pack_expansion ["repeat" @keyword]) diff --git a/runtime/queries/swift/injections.scm b/runtime/queries/swift/injections.scm new file mode 100644 index 000000000000..0ac6cddfedde --- /dev/null +++ b/runtime/queries/swift/injections.scm @@ -0,0 +1,6 @@ +; Upstream: https://github.com/alex-pinkus/tree-sitter-swift/blob/57c1c6d6ffa1c44b330182d41717e6fe37430704/queries/injections.scm + +; Parse regex syntax within regex literals + +((regex_literal) @injection.content + (#set! injection.language "regex")) diff --git a/runtime/queries/swift/locals.scm b/runtime/queries/swift/locals.scm index 59cd4c0010eb..31bc9abf177b 100644 --- a/runtime/queries/swift/locals.scm +++ b/runtime/queries/swift/locals.scm @@ -1,7 +1,19 @@ +; Upstream: https://github.com/alex-pinkus/tree-sitter-swift/blob/57c1c6d6ffa1c44b330182d41717e6fe37430704/queries/locals.scm +(import_declaration (identifier) @definition.import) +(function_declaration name: (simple_identifier) @definition.function) + +; Scopes [ + (for_statement) + (while_statement) + (repeat_while_statement) + (do_statement) + (if_statement) + (guard_statement) + (switch_statement) + (property_declaration) (function_declaration) + (class_declaration) + (protocol_declaration) + (lambda_literal) ] @local.scope - -(parameter name: (simple_identifier) @local.definition) - -(simple_identifier) @local.reference diff --git a/runtime/queries/swift/textobjects.scm b/runtime/queries/swift/textobjects.scm new file mode 100644 index 000000000000..2a9938bf81a2 --- /dev/null +++ b/runtime/queries/swift/textobjects.scm @@ -0,0 +1,23 @@ +(class_declaration + body: (_) @class.inside) @class.around + +(protocol_declaration + body: (_) @class.inside) @class.around + +(function_declaration + body: (_) @function.inside) @function.around + +(parameter + (_) @parameter.inside) @parameter.around + +(lambda_parameter + (_) @parameter.inside) @parameter.around + +[ + (comment) + (multiline_comment) +] @comment.inside + +(comment)+ @comment.around + +(multiline_comment) @comment.around