diff --git a/CodeLanguages-Container/CodeLanguages-Container.xcodeproj/project.pbxproj b/CodeLanguages-Container/CodeLanguages-Container.xcodeproj/project.pbxproj index 2dae242..6639b04 100644 --- a/CodeLanguages-Container/CodeLanguages-Container.xcodeproj/project.pbxproj +++ b/CodeLanguages-Container/CodeLanguages-Container.xcodeproj/project.pbxproj @@ -34,6 +34,8 @@ 6CE117FC2CEA7CF80082D393 /* TreeSitterDart in Frameworks */ = {isa = PBXBuildFile; productRef = 6CE117FB2CEA7CF80082D393 /* TreeSitterDart */; }; 6CEC70FE29C3A85000B61C7A /* TreeSitterRegex in Frameworks */ = {isa = PBXBuildFile; productRef = 6CEC70FD29C3A85000B61C7A /* TreeSitterRegex */; }; 6CF2B8412CE978F100CBE5D1 /* TreeSitterDart in Frameworks */ = {isa = PBXBuildFile; productRef = 6CF2B8402CE978F100CBE5D1 /* TreeSitterDart */; }; + 76BC51E22F03A6D50030E59A /* TreeSitterR in Frameworks */ = {isa = PBXBuildFile; productRef = 76BC51E12F03A6D50030E59A /* TreeSitterR */; }; + 76BC51E52F03ACB50030E59A /* TreeSitterXML in Frameworks */ = {isa = PBXBuildFile; productRef = 76BC51E42F03ACB50030E59A /* TreeSitterXML */; }; 8E74B41D2A4C88ED003A9550 /* TreeSitterHTML in Frameworks */ = {isa = PBXBuildFile; productRef = 8E74B41C2A4C88ED003A9550 /* TreeSitterHTML */; }; 8E7B0EA92A5D9BB60040DDAB /* TreeSitterTOML in Frameworks */ = {isa = PBXBuildFile; productRef = 8E7B0EA82A5D9BB60040DDAB /* TreeSitterTOML */; }; 8E7B8ABD2A5D916F00CFC1A7 /* TreeSitterPython in Frameworks */ = {isa = PBXBuildFile; productRef = 8E7B8ABC2A5D916F00CFC1A7 /* TreeSitterPython */; }; @@ -67,6 +69,7 @@ 285BF67329AAA45B00641989 /* TreeSitterLua in Frameworks */, 8E87F9542A4B7DC1008C7E13 /* TreeSitterScala in Frameworks */, 6CE117F92CEA7BDC0082D393 /* TreeSitterDart in Frameworks */, + 76BC51E22F03A6D50030E59A /* TreeSitterR in Frameworks */, 2846B262296BA1CF005F60B6 /* TreeSitterDockerfile in Frameworks */, 9D73992A2A5A30A400CEF6E8 /* TreeSitterPerl in Frameworks */, 9D6E74512A2B9B2A0070701E /* TreeSitterOCaml in Frameworks */, @@ -80,6 +83,7 @@ 28B9F7AA290DDAC900245748 /* TreeSitterBash in Frameworks */, 28B3F030290C35F9000CD04D /* TreeSitterCPP in Frameworks */, 28B3F04E290C3698000CD04D /* TreeSitterJSON in Frameworks */, + 76BC51E52F03ACB50030E59A /* TreeSitterXML in Frameworks */, 28B3F033290C3608000CD04D /* TreeSitterCSharp in Frameworks */, 28B3F03F290C364D000CD04D /* TreeSitterGoMod in Frameworks */, 28B3F063290C372D000CD04D /* TreeSitterZig in Frameworks */, @@ -204,6 +208,8 @@ 6CF2B8402CE978F100CBE5D1 /* TreeSitterDart */, 6CE117F82CEA7BDC0082D393 /* TreeSitterDart */, 6CE117FB2CEA7CF80082D393 /* TreeSitterDart */, + 76BC51E12F03A6D50030E59A /* TreeSitterR */, + 76BC51E42F03ACB50030E59A /* TreeSitterXML */, ); productName = "CodeLanguages-Container"; productReference = 28B3F00C290C207D000CD04D /* CodeLanguages_Container.framework */; @@ -271,6 +277,8 @@ 6C0B93A62B5DD95500323006 /* XCRemoteSwiftPackageReference "tree-sitter-css" */, 6C7CA2AB2CE9743E006D9D9A /* XCRemoteSwiftPackageReference "tree-sitter-objc" */, 6CE117FA2CEA7CF80082D393 /* XCRemoteSwiftPackageReference "tree-sitter-dart" */, + 76BC51E02F03A6D50030E59A /* XCRemoteSwiftPackageReference "tree-sitter-r" */, + 76BC51E32F03ACB50030E59A /* XCRemoteSwiftPackageReference "tree-sitter-xml" */, ); productRefGroup = 28B3F00D290C207D000CD04D /* Products */; projectDirPath = ""; @@ -712,6 +720,22 @@ kind = branch; }; }; + 76BC51E02F03A6D50030E59A /* XCRemoteSwiftPackageReference "tree-sitter-r" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/r-lib/tree-sitter-r/"; + requirement = { + branch = main; + kind = branch; + }; + }; + 76BC51E32F03ACB50030E59A /* XCRemoteSwiftPackageReference "tree-sitter-xml" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/tree-sitter-grammars/tree-sitter-xml"; + requirement = { + branch = master; + kind = branch; + }; + }; 8E74B41B2A4C88ED003A9550 /* XCRemoteSwiftPackageReference "tree-sitter-html" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/tree-sitter/tree-sitter-html.git"; @@ -947,6 +971,16 @@ isa = XCSwiftPackageProductDependency; productName = TreeSitterDart; }; + 76BC51E12F03A6D50030E59A /* TreeSitterR */ = { + isa = XCSwiftPackageProductDependency; + package = 76BC51E02F03A6D50030E59A /* XCRemoteSwiftPackageReference "tree-sitter-r" */; + productName = TreeSitterR; + }; + 76BC51E42F03ACB50030E59A /* TreeSitterXML */ = { + isa = XCSwiftPackageProductDependency; + package = 76BC51E32F03ACB50030E59A /* XCRemoteSwiftPackageReference "tree-sitter-xml" */; + productName = TreeSitterXML; + }; 8E74B41C2A4C88ED003A9550 /* TreeSitterHTML */ = { isa = XCSwiftPackageProductDependency; package = 8E74B41B2A4C88ED003A9550 /* XCRemoteSwiftPackageReference "tree-sitter-html" */; diff --git a/CodeLanguages-Container/CodeLanguages-Container.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/CodeLanguages-Container/CodeLanguages-Container.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 43c7efd..6333578 100644 --- a/CodeLanguages-Container/CodeLanguages-Container.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/CodeLanguages-Container/CodeLanguages-Container.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "c940c7467f54711e27ceb0cef308954e1fdbcc20f3dd59d96d6efbe29d7a04ba", + "originHash" : "5e60d81c8d0e06861a13165c44b11a73cb723b4488da8e2c2bfb80f2a36fe37a", "pins" : [ { "identity" : "tree-sitter-agda", @@ -235,6 +235,15 @@ "revision" : "4bfdd9033a2225cc95032ce77066b7aeca9e2efc" } }, + { + "identity" : "tree-sitter-r", + "kind" : "remoteSourceControl", + "location" : "https://github.com/r-lib/tree-sitter-r/", + "state" : { + "branch" : "main", + "revision" : "0e6ef7741712c09dc3ee6e81c42e919820cc65ef" + } + }, { "identity" : "tree-sitter-regex", "kind" : "remoteSourceControl", @@ -316,6 +325,15 @@ "revision" : "902031343056bc0b11f3e47b33f036a9cf59f58d" } }, + { + "identity" : "tree-sitter-xml", + "kind" : "remoteSourceControl", + "location" : "https://github.com/tree-sitter-grammars/tree-sitter-xml", + "state" : { + "branch" : "master", + "revision" : "863dbc381f44f6c136a399e684383b977bb2beaa" + } + }, { "identity" : "tree-sitter-yaml", "kind" : "remoteSourceControl", diff --git a/CodeLanguages-Container/CodeLanguages-Container/CodeLanguages_Container.h b/CodeLanguages-Container/CodeLanguages-Container/CodeLanguages_Container.h index b27c35d..9243d99 100644 --- a/CodeLanguages-Container/CodeLanguages-Container/CodeLanguages_Container.h +++ b/CodeLanguages-Container/CodeLanguages-Container/CodeLanguages_Container.h @@ -50,6 +50,7 @@ extern TSLanguage *tree_sitter_ocaml_interface(); extern TSLanguage *tree_sitter_perl(); extern TSLanguage *tree_sitter_php(); extern TSLanguage *tree_sitter_python(); +extern TSLanguage *tree_sitter_r(); extern TSLanguage *tree_sitter_regex(); extern TSLanguage *tree_sitter_ruby(); extern TSLanguage *tree_sitter_rust(); @@ -60,6 +61,7 @@ extern TSLanguage *tree_sitter_toml(); extern TSLanguage *tree_sitter_tsx(); extern TSLanguage *tree_sitter_typescript(); extern TSLanguage *tree_sitter_verilog(); +extern TSLanguage *tree_sitter_xml(); extern TSLanguage *tree_sitter_yaml(); extern TSLanguage *tree_sitter_zig(); diff --git a/CodeLanguagesContainer.xcframework.zip b/CodeLanguagesContainer.xcframework.zip index 9904c2a..cd4cc34 100644 Binary files a/CodeLanguagesContainer.xcframework.zip and b/CodeLanguagesContainer.xcframework.zip differ diff --git a/README.md b/README.md index aafc036..1433d8c 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,7 @@ In order to add support for additional languages we have a complete guide on how | [Perl](https://github.com/ganezdragon/tree-sitter-perl) | ✅ | _not available_ | | [PHP](https://github.com/tree-sitter/tree-sitter-php) | ✅ | ✅ | | [Python](https://github.com/tree-sitter/tree-sitter-python) | ✅ | ✅ | +| [R](https://github.com/r-lib/tree-sitter-r) | ✅ | ✅ | | [Regex](https://github.com/tree-sitter/tree-sitter-regex) | ✅ | ✅ | | [Ruby](https://github.com/mattmassicotte/tree-sitter-ruby) | ✅ | ✅ | | [Rust](https://github.com/tree-sitter/tree-sitter-rust) | ✅ | ✅ | @@ -82,9 +83,28 @@ In order to add support for additional languages we have a complete guide on how | [TOML](https://github.com/cengelbart39/tree-sitter-toml/tree/feature/spm) | ✅ | ✅ | | [TypeScript/TSX](https://github.com/tree-sitter/tree-sitter-typescript) | ✅ | ✅ | | [Verilog](https://github.com/tree-sitter/tree-sitter-verilog) | ✅ | _not available_ | +| [XML](https://github.com/tree-sitter-grammars/tree-sitter-xml) | ✅ | ✅ | | [YAML](https://github.com/tree-sitter-grammars/tree-sitter-yaml.git) | ✅ | ✅ | | [Zig](https://github.com/tree-sitter-grammars/tree-sitter-zig.git) | ✅ | ✅ | +## Building the Framework + +When adding new languages, you need to rebuild the binary framework using `./build_framework.sh`. + +### Troubleshooting + +If the build script fails with: +``` +xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance +``` + +Run this command to point to your Xcode installation: +```bash +sudo xcode-select -s /Applications/Xcode.app/Contents/Developer +``` + +Then run `./build_framework.sh` again. + ## Related Repositories diff --git a/Sources/CodeEditLanguages/CodeLanguage+Definitions.swift b/Sources/CodeEditLanguages/CodeLanguage+Definitions.swift index 56ce3d4..66b5676 100644 --- a/Sources/CodeEditLanguages/CodeLanguage+Definitions.swift +++ b/Sources/CodeEditLanguages/CodeLanguage+Definitions.swift @@ -42,6 +42,7 @@ public extension CodeLanguage { .perl, .php, .python, + .r, .regex, .ruby, .rust, @@ -52,6 +53,7 @@ public extension CodeLanguage { .tsx, .typescript, .verilog, + .xml, .yaml, .zig ] @@ -354,6 +356,17 @@ public extension CodeLanguage { additionalIdentifiers: ["python2", "python3"] ) + /// A language structure for `R` + static let r: CodeLanguage = .init( + id: .r, + tsName: "r", + extensions: ["r", "R"], + lineCommentString: "#", + rangeCommentStrings: ("", ""), + documentationCommentStrings: [.single("#'")], + additionalIdentifiers: ["Rscript"] + ) + /// A language structure for `Regex` static let regex: CodeLanguage = .init( id: .regex, @@ -462,6 +475,15 @@ public extension CodeLanguage { highlights: ["folds", "injections"] ) + /// A language structure for `XML` + static let xml: CodeLanguage = .init( + id: .xml, + tsName: "xml", + extensions: ["xml", "xsl", "xslt", "xsd", "svg", "plist"], + lineCommentString: "", + rangeCommentStrings: ("") + ) + /// A language structure for `YAML` static let yaml: CodeLanguage = .init( id: .yaml, diff --git a/Sources/CodeEditLanguages/CodeLanguage.swift b/Sources/CodeEditLanguages/CodeLanguage.swift index f8b6681..6552a36 100644 --- a/Sources/CodeEditLanguages/CodeLanguage.swift +++ b/Sources/CodeEditLanguages/CodeLanguage.swift @@ -145,6 +145,8 @@ public struct CodeLanguage { return tree_sitter_php() case .python: return tree_sitter_python() + case .r: + return tree_sitter_r() case .regex: return tree_sitter_regex() case .ruby: @@ -165,6 +167,8 @@ public struct CodeLanguage { return tree_sitter_typescript() case .verilog: return tree_sitter_verilog() + case .xml: + return tree_sitter_xml() case .yaml: return tree_sitter_yaml() case .zig: diff --git a/Sources/CodeEditLanguages/Resources/tree-sitter-r/describe.scm b/Sources/CodeEditLanguages/Resources/tree-sitter-r/describe.scm new file mode 100644 index 0000000..bc5e6f6 --- /dev/null +++ b/Sources/CodeEditLanguages/Resources/tree-sitter-r/describe.scm @@ -0,0 +1,32 @@ +(call + function: [ + (identifier) @parent_function + (namespace_operator + lhs: (identifier) @parent_pkg (#eq? @parent_pkg "testthat") + rhs: (identifier) @parent_function + ) + ] (#eq? @parent_function "describe") + arguments: (arguments + (argument + value: (string) @parent_desc + ) + (argument + value: (braced_expression + body: (call + function: [ + (identifier) @function + (namespace_operator + lhs: (identifier) @pkg (#eq? @pkg "testthat") + rhs: (identifier) @function + ) + ] (#eq? @function "it") + arguments: (arguments + (argument + value: (string) @desc + ) + ) + ) @call + ) + ) + ) +) @parent_call diff --git a/Sources/CodeEditLanguages/Resources/tree-sitter-r/highlights.scm b/Sources/CodeEditLanguages/Resources/tree-sitter-r/highlights.scm new file mode 100644 index 0000000..c632d3e --- /dev/null +++ b/Sources/CodeEditLanguages/Resources/tree-sitter-r/highlights.scm @@ -0,0 +1,112 @@ +; highlights.scm + +; Literals + +(integer) @number +(float) @number +(complex) @number + +(string) @string +(string (string_content (escape_sequence) @string.escape)) + +; Comments + +(comment) @comment + +; Operators + +[ + "?" ":=" "=" "<-" "<<-" "->" "->>" + "~" "|>" "||" "|" "&&" "&" + "<" "<=" ">" ">=" "==" "!=" + "+" "-" "*" "/" "::" ":::" + "**" "^" "$" "@" ":" "!" + "special" +] @operator + +; Punctuation + +[ + "(" ")" + "{" "}" + "[" "]" + "[[" "]]" +] @punctuation.bracket + +(comma) @punctuation.delimiter + +; Variables + +(identifier) @variable + +; Functions + +(binary_operator + lhs: (identifier) @function + operator: "<-" + rhs: (function_definition) +) + +(binary_operator + lhs: (identifier) @function + operator: "=" + rhs: (function_definition) +) + +; Calls + +(call function: (identifier) @function) + +; Parameters + +(parameters (parameter name: (identifier) @variable.parameter)) +(arguments (argument name: (identifier) @variable.parameter)) + +; Namespace + +(namespace_operator lhs: (identifier) @namespace) + +(call + function: (namespace_operator rhs: (identifier) @function) +) + +; Keywords + +(function_definition name: "function" @keyword.function) +(function_definition name: "\\" @operator) + +[ + "in" + (return) + (next) + (break) +] @keyword + +[ + "if" + "else" +] @conditional + +[ + "while" + "repeat" + "for" +] @repeat + +[ + (true) + (false) +] @boolean + +[ + (null) + (inf) + (nan) + (na) + (dots) + (dot_dot_i) +] @constant.builtin + +; Error + +(ERROR) @error diff --git a/Sources/CodeEditLanguages/Resources/tree-sitter-r/locals.scm b/Sources/CodeEditLanguages/Resources/tree-sitter-r/locals.scm new file mode 100644 index 0000000..5d4697a --- /dev/null +++ b/Sources/CodeEditLanguages/Resources/tree-sitter-r/locals.scm @@ -0,0 +1,18 @@ +; locals.scm + +(function_definition) @local.scope + +(argument name: (identifier) @local.definition) +(parameter name: (identifier) @local.definition) + +(binary_operator + lhs: (identifier) @local.definition + operator: "<-") +(binary_operator + lhs: (identifier) @local.definition + operator: "=") +(binary_operator + operator: "->" + rhs: (identifier) @local.definition) + +(identifier) @local.reference diff --git a/Sources/CodeEditLanguages/Resources/tree-sitter-r/tags.scm b/Sources/CodeEditLanguages/Resources/tree-sitter-r/tags.scm new file mode 100644 index 0000000..35ca6c0 --- /dev/null +++ b/Sources/CodeEditLanguages/Resources/tree-sitter-r/tags.scm @@ -0,0 +1,33 @@ +(binary_operator + lhs: (identifier) @name + operator: "<-" + rhs: (function_definition) +) @definition.function + +(binary_operator + lhs: (identifier) @name + operator: "=" + rhs: (function_definition) +) @definition.function + +(binary_operator + lhs: (string) @name + operator: "<-" + rhs: (function_definition) +) @definition.function + +(binary_operator + lhs: (string) @name + operator: "=" + rhs: (function_definition) +) @definition.function + +(call + function: (identifier) @name +) @reference.call + +(call + function: (namespace_operator + rhs: (identifier) @name + ) +) @reference.call diff --git a/Sources/CodeEditLanguages/Resources/tree-sitter-r/test_that.scm b/Sources/CodeEditLanguages/Resources/tree-sitter-r/test_that.scm new file mode 100644 index 0000000..de73262 --- /dev/null +++ b/Sources/CodeEditLanguages/Resources/tree-sitter-r/test_that.scm @@ -0,0 +1,22 @@ +(call + function: [ + (identifier) @function + (namespace_operator + lhs: (identifier) @pkg (#eq? @pkg "testthat") + rhs: (identifier) @function + ) + ] (#eq? @function "test_that") + arguments: [ + (arguments + . (argument value: (string) @desc) . (comma) . (_) . + ) + (arguments + . (_) . (comma) . + (argument + name: (identifier) @param + value: (string) @desc + ) (#eq? @param "desc") + . + ) + ] +) @call diff --git a/Sources/CodeEditLanguages/Resources/tree-sitter-xml/highlights.scm b/Sources/CodeEditLanguages/Resources/tree-sitter-xml/highlights.scm new file mode 100644 index 0000000..9861eea --- /dev/null +++ b/Sources/CodeEditLanguages/Resources/tree-sitter-xml/highlights.scm @@ -0,0 +1,168 @@ +;; XML declaration + +"xml" @keyword + +[ "version" "encoding" "standalone" ] @property + +(EncName) @string.special + +(VersionNum) @number + +[ "yes" "no" ] @boolean + +;; Processing instructions + +(PI) @embedded + +(PI (PITarget) @keyword) + +;; Element declaration + +(elementdecl + "ELEMENT" @keyword + (Name) @tag) + +(contentspec + (_ (Name) @property)) + +"#PCDATA" @type.builtin + +[ "EMPTY" "ANY" ] @string.special.symbol + +[ "*" "?" "+" ] @operator + +;; Entity declaration + +(GEDecl + "ENTITY" @keyword + (Name) @constant) + +(GEDecl (EntityValue) @string) + +(NDataDecl + "NDATA" @keyword + (Name) @label) + +;; Parsed entity declaration + +(PEDecl + "ENTITY" @keyword + "%" @operator + (Name) @constant) + +(PEDecl (EntityValue) @string) + +;; Notation declaration + +(NotationDecl + "NOTATION" @keyword + (Name) @constant) + +(NotationDecl + (ExternalID + (SystemLiteral (URI) @string.special))) + +;; Attlist declaration + +(AttlistDecl + "ATTLIST" @keyword + (Name) @tag) + +(AttDef (Name) @property) + +(AttDef (Enumeration (Nmtoken) @string)) + +(DefaultDecl (AttValue) @string) + +[ + (StringType) + (TokenizedType) +] @type.builtin + +(NotationType "NOTATION" @type.builtin) + +[ + "#REQUIRED" + "#IMPLIED" + "#FIXED" +] @attribute + +;; Entities + +(EntityRef) @constant + +((EntityRef) @constant.builtin + (#any-of? @constant.builtin + "&" "<" ">" """ "'")) + +(CharRef) @constant + +(PEReference) @constant + +;; External references + +[ "PUBLIC" "SYSTEM" ] @keyword + +(PubidLiteral) @string.special + +(SystemLiteral (URI) @markup.link) + +;; Processing instructions + +(XmlModelPI "xml-model" @keyword) + +(StyleSheetPI "xml-stylesheet" @keyword) + +(PseudoAtt (Name) @property) + +(PseudoAtt (PseudoAttValue) @string) + +;; Doctype declaration + +(doctypedecl "DOCTYPE" @keyword) + +(doctypedecl (Name) @type) + +;; Tags + +(STag (Name) @tag) + +(ETag (Name) @tag) + +(EmptyElemTag (Name) @tag) + +;; Attributes + +(Attribute (Name) @property) + +(Attribute (AttValue) @string) + +;; Delimiters & punctuation + +[ + "" + "" + "<" ">" + "" +] @punctuation.delimiter + +[ "(" ")" "[" "]" ] @punctuation.bracket + +[ "\"" "'" ] @punctuation.delimiter + +[ "," "|" "=" ] @operator + +;; Text + +(CharData) @markup + +(CDSect + (CDStart) @markup.heading + (CData) @markup.raw + "]]>" @markup.heading) + +;; Misc + +(Comment) @comment + +(ERROR) @error diff --git a/Sources/CodeEditLanguages/Resources/tree-sitter-zig/test-query-injections.scm b/Sources/CodeEditLanguages/Resources/tree-sitter-zig/test-query-injections.scm new file mode 100644 index 0000000..f382edd --- /dev/null +++ b/Sources/CodeEditLanguages/Resources/tree-sitter-zig/test-query-injections.scm @@ -0,0 +1,27 @@ +; vim: ft=query +; format-ignore +(((symbol) @constant + (#not-lua-match? @constant "^_*[A-Z][A-Z0-9_]*$")) +; ^ @luap +) + +; format-ignore +(((tag + (attributes + (attribute + (attribute_name) @keyword))) + (#match? @keyword "^(:|v-bind|v-|\\@)")) +; ^ @regex +) + +((comment) @injection.language + . + [ + (string_expression + (string_fragment) @injection.content) + (indented_string_expression + (string_fragment) @injection.content) + ] + (#gsub! @injection.language "#%s*([%w%p]+)%s*" "%1") + ; ^ @luap + (#set! injection.combined)) diff --git a/Sources/CodeEditLanguages/Resources/tree-sitter-zig/test.scm b/Sources/CodeEditLanguages/Resources/tree-sitter-zig/test.scm new file mode 100644 index 0000000..56d7556 --- /dev/null +++ b/Sources/CodeEditLanguages/Resources/tree-sitter-zig/test.scm @@ -0,0 +1,50 @@ +; vim:ft=query +; format-ignore +(fenced_code_block (fenced_code_block_delimiter) @label + (info_string + (language) @_lang) + (#offset! @label 0 1 0 -1) + (#ft-conceal! @_lang)) + +([ + (list_marker_minus) + (list_marker_plus) + (list_marker_star) +] @markup.list + (#offset-first-n! @markup.list 1) + (#set! conceal "•")) + +(list + (list_item + (list + (list_item + ([ + (list_marker_minus) + (list_marker_plus) + (list_marker_star) + ] @markup.list + (#offset-first-n! @markup.list 1) + (#set! conceal "◦")))))) + +; comment +(while_statement + [ + "while" + "do" + ] @open.loop + "end" @close.loop) @scope.loop + +[ + "toplevel" + "list" +] @variable + +[ + (parent + (child))+ + (parent + (child))* + (parent + (child))? +] @cap +(( diff --git a/Sources/CodeEditLanguages/TreeSitterLanguage.swift b/Sources/CodeEditLanguages/TreeSitterLanguage.swift index 850d4f4..5238f64 100644 --- a/Sources/CodeEditLanguages/TreeSitterLanguage.swift +++ b/Sources/CodeEditLanguages/TreeSitterLanguage.swift @@ -38,6 +38,7 @@ public enum TreeSitterLanguage: String { case perl case php case python + case r case regex case ruby case rust @@ -48,6 +49,7 @@ public enum TreeSitterLanguage: String { case tsx case typescript case verilog + case xml case yaml case zig case plainText diff --git a/Sources/CodeEditLanguages/TreeSitterModel.swift b/Sources/CodeEditLanguages/TreeSitterModel.swift index 4ef8d58..8b5e460 100644 --- a/Sources/CodeEditLanguages/TreeSitterModel.swift +++ b/Sources/CodeEditLanguages/TreeSitterModel.swift @@ -78,6 +78,8 @@ public class TreeSitterModel { return phpQuery case .python: return pythonQuery + case .r: + return rQuery case .regex: return regexQuery case .ruby: @@ -98,6 +100,8 @@ public class TreeSitterModel { return typescriptQuery case .verilog: return nil + case .xml: + return xmlQuery case .yaml: return yamlQuery case .zig: @@ -237,6 +241,11 @@ public class TreeSitterModel { return queryFor(.python) }() + /// Query for `R` files. + public private(set) lazy var rQuery: Query? = { + return queryFor(.r) + }() + /// Query for `Regex` files. public private(set) lazy var regexQuery: Query? = { return queryFor(.regex) @@ -282,6 +291,11 @@ public class TreeSitterModel { return queryFor(.typescript) }() + /// Query for `XML` files. + public private(set) lazy var xmlQuery: Query? = { + return queryFor(.xml) + }() + /// Query for `YAML` files. public private(set) lazy var yamlQuery: Query? = { return queryFor(.yaml) diff --git a/Tests/CodeEditLanguagesTests/CodeEditLanguagesTests.swift b/Tests/CodeEditLanguagesTests/CodeEditLanguagesTests.swift index c2feda0..0aa5580 100644 --- a/Tests/CodeEditLanguagesTests/CodeEditLanguagesTests.swift +++ b/Tests/CodeEditLanguagesTests/CodeEditLanguagesTests.swift @@ -613,6 +613,32 @@ final class CodeEditLanguagesTests: XCTestCase { XCTAssertNotEqual(query?.patternCount, 0) } +// MARK: - R + + func test_CodeLanguageR() throws { + let url = URL(fileURLWithPath: "~/path/to/file.r") + let language = CodeLanguage.detectLanguageFrom(url: url) + + XCTAssertEqual(language.id, .r) + } + + func test_CodeLanguageR2() throws { + let url = URL(fileURLWithPath: "~/path/to/file.R") + let language = CodeLanguage.detectLanguageFrom(url: url) + + XCTAssertEqual(language.id, .r) + } + + func test_FetchQueryR() throws { + var language = CodeLanguage.r + language.resourceURL = bundleURL + + let data = try Data(contentsOf: language.queryURL!) + let query = try? Query(language: language.language!, data: data) + XCTAssertNotNil(query) + XCTAssertNotEqual(query?.patternCount, 0) + } + // MARK: - Ruby func test_CodeLanguageRuby() throws { @@ -782,6 +808,39 @@ final class CodeEditLanguagesTests: XCTestCase { XCTAssertEqual(language.id, .verilog) } +// MARK: - XML + + func test_CodeLanguageXML() throws { + let url = URL(fileURLWithPath: "~/path/to/file.xml") + let language = CodeLanguage.detectLanguageFrom(url: url) + + XCTAssertEqual(language.id, .xml) + } + + func test_CodeLanguageXML2() throws { + let url = URL(fileURLWithPath: "~/path/to/file.plist") + let language = CodeLanguage.detectLanguageFrom(url: url) + + XCTAssertEqual(language.id, .xml) + } + + func test_CodeLanguageXML3() throws { + let url = URL(fileURLWithPath: "~/path/to/file.svg") + let language = CodeLanguage.detectLanguageFrom(url: url) + + XCTAssertEqual(language.id, .xml) + } + + func test_FetchQueryXML() throws { + var language = CodeLanguage.xml + language.resourceURL = bundleURL + + let data = try Data(contentsOf: language.queryURL!) + let query = try? Query(language: language.language!, data: data) + XCTAssertNotNil(query) + XCTAssertNotEqual(query?.patternCount, 0) + } + // MARK: - YAML func test_CodeLanguageYAML() throws {