diff --git a/CodeLanguages-Container/CodeLanguages-Container.xcodeproj/project.pbxproj b/CodeLanguages-Container/CodeLanguages-Container.xcodeproj/project.pbxproj index 2dae242..980d5c5 100644 --- a/CodeLanguages-Container/CodeLanguages-Container.xcodeproj/project.pbxproj +++ b/CodeLanguages-Container/CodeLanguages-Container.xcodeproj/project.pbxproj @@ -40,6 +40,7 @@ 8E87F9542A4B7DC1008C7E13 /* TreeSitterScala in Frameworks */ = {isa = PBXBuildFile; productRef = 8E87F9532A4B7DC1008C7E13 /* TreeSitterScala */; }; 8ED0560A2A4DBE6E00829B80 /* TreeSitterTypeScript in Frameworks */ = {isa = PBXBuildFile; productRef = 8ED056092A4DBE6E00829B80 /* TreeSitterTypeScript */; }; 8EFA0B742A559F4C00021CE9 /* TreeSitterSQL in Frameworks */ = {isa = PBXBuildFile; productRef = 8EFA0B732A559F4C00021CE9 /* TreeSitterSQL */; }; + 930A9C832CF76E3E002213D0 /* TreeSitterGlsl in Frameworks */ = {isa = PBXBuildFile; productRef = 930A9C822CF76E3E002213D0 /* TreeSitterGlsl */; }; 9D6E74512A2B9B2A0070701E /* TreeSitterOCaml in Frameworks */ = {isa = PBXBuildFile; productRef = 9D6E74502A2B9B2A0070701E /* TreeSitterOCaml */; }; 9D7399242A5A245000CEF6E8 /* TreeSitterAgda in Frameworks */ = {isa = PBXBuildFile; productRef = 9D7399232A5A245000CEF6E8 /* TreeSitterAgda */; }; 9D7399272A5A2B5300CEF6E8 /* TreeSitterJulia in Frameworks */ = {isa = PBXBuildFile; productRef = 9D7399262A5A2B5300CEF6E8 /* TreeSitterJulia */; }; @@ -86,6 +87,7 @@ 9D7399272A5A2B5300CEF6E8 /* TreeSitterJulia in Frameworks */, 8E74B41D2A4C88ED003A9550 /* TreeSitterHTML in Frameworks */, 8ED0560A2A4DBE6E00829B80 /* TreeSitterTypeScript in Frameworks */, + 930A9C832CF76E3E002213D0 /* TreeSitterGlsl in Frameworks */, 28B3F05A290C36E5000CD04D /* TreeSitterRust in Frameworks */, 6C7CA2AD2CE9743E006D9D9A /* TreeSitterObjc in Frameworks */, 28B3F048290C367C000CD04D /* TreeSitterJava in Frameworks */, @@ -204,6 +206,7 @@ 6CF2B8402CE978F100CBE5D1 /* TreeSitterDart */, 6CE117F82CEA7BDC0082D393 /* TreeSitterDart */, 6CE117FB2CEA7CF80082D393 /* TreeSitterDart */, + 930A9C822CF76E3E002213D0 /* TreeSitterGlsl */, ); productName = "CodeLanguages-Container"; productReference = 28B3F00C290C207D000CD04D /* CodeLanguages_Container.framework */; @@ -271,6 +274,7 @@ 6C0B93A62B5DD95500323006 /* XCRemoteSwiftPackageReference "tree-sitter-css" */, 6C7CA2AB2CE9743E006D9D9A /* XCRemoteSwiftPackageReference "tree-sitter-objc" */, 6CE117FA2CEA7CF80082D393 /* XCRemoteSwiftPackageReference "tree-sitter-dart" */, + 930A9C812CF76E3E002213D0 /* XCRemoteSwiftPackageReference "tree-sitter-glsl" */, ); productRefGroup = 28B3F00D290C207D000CD04D /* Products */; projectDirPath = ""; @@ -760,6 +764,14 @@ kind = branch; }; }; + 930A9C812CF76E3E002213D0 /* XCRemoteSwiftPackageReference "tree-sitter-glsl" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/tree-sitter-grammars/tree-sitter-glsl/"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 0.1.2; + }; + }; 9D6E744F2A2B9B2A0070701E /* XCRemoteSwiftPackageReference "tree-sitter-ocaml" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/tree-sitter/tree-sitter-ocaml.git"; @@ -977,6 +989,11 @@ package = 8EFA0B722A559F4C00021CE9 /* XCRemoteSwiftPackageReference "tree-sitter-sql" */; productName = TreeSitterSQL; }; + 930A9C822CF76E3E002213D0 /* TreeSitterGlsl */ = { + isa = XCSwiftPackageProductDependency; + package = 930A9C812CF76E3E002213D0 /* XCRemoteSwiftPackageReference "tree-sitter-glsl" */; + productName = TreeSitterGlsl; + }; 9D6E74502A2B9B2A0070701E /* TreeSitterOCaml */ = { isa = XCSwiftPackageProductDependency; package = 9D6E744F2A2B9B2A0070701E /* XCRemoteSwiftPackageReference "tree-sitter-ocaml" */; 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..1cd7735 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" : "c5a4c9df9e12427c65490647773b74b0dd4a4f88a96c00b82b50037d32e8376f", "pins" : [ { "identity" : "tree-sitter-agda", @@ -82,6 +82,15 @@ "revision" : "11426c5fd20eef360d5ecaf10729191f6bc5d715" } }, + { + "identity" : "tree-sitter-glsl", + "kind" : "remoteSourceControl", + "location" : "https://github.com/tree-sitter-grammars/tree-sitter-glsl/", + "state" : { + "revision" : "57b2fc3f8484900306cc0fed32a15d7b2a710193", + "version" : "0.1.9" + } + }, { "identity" : "tree-sitter-go", "kind" : "remoteSourceControl", diff --git a/CodeLanguages-Container/CodeLanguages-Container/CodeLanguages_Container.h b/CodeLanguages-Container/CodeLanguages-Container/CodeLanguages_Container.h index b27c35d..fbd181f 100644 --- a/CodeLanguages-Container/CodeLanguages-Container/CodeLanguages_Container.h +++ b/CodeLanguages-Container/CodeLanguages-Container/CodeLanguages_Container.h @@ -31,6 +31,7 @@ extern TSLanguage *tree_sitter_css(); extern TSLanguage *tree_sitter_dart(); extern TSLanguage *tree_sitter_dockerfile(); extern TSLanguage *tree_sitter_elixir(); +extern TSLanguage *tree_sitter_glsl(); extern TSLanguage *tree_sitter_go(); extern TSLanguage *tree_sitter_gomod(); extern TSLanguage *tree_sitter_haskell(); diff --git a/CodeLanguagesContainer.xcframework.zip b/CodeLanguagesContainer.xcframework.zip index 8d8d776..8d9540d 100644 Binary files a/CodeLanguagesContainer.xcframework.zip and b/CodeLanguagesContainer.xcframework.zip differ diff --git a/Sources/CodeEditLanguages/CodeLanguage+Definitions.swift b/Sources/CodeEditLanguages/CodeLanguage+Definitions.swift index 2ac6c00..3955274 100644 --- a/Sources/CodeEditLanguages/CodeLanguage+Definitions.swift +++ b/Sources/CodeEditLanguages/CodeLanguage+Definitions.swift @@ -22,6 +22,7 @@ public extension CodeLanguage { .dart, .dockerfile, .elixir, + .glsl, .go, .goMod, .haskell, @@ -141,6 +142,15 @@ public extension CodeLanguage { documentationCommentStrings: [.pair(("\"\"\"", "\"\"\""))], highlights: ["injections"] ) + + /// A language structure for `GLSL` + static let glsl: CodeLanguage = .init( + id: .glsl, + tsName: "glsl", + extensions: ["vsh", "fsh", "glsl", "vert", "frag", "tesc", "tese", "geom", "comp"], + lineCommentString: "//", + rangeCommentStrings: ("/*", "*/") + ) /// A language structure for `Go` static let go: CodeLanguage = .init( diff --git a/Sources/CodeEditLanguages/CodeLanguage.swift b/Sources/CodeEditLanguages/CodeLanguage.swift index f8b6681..9fa957d 100644 --- a/Sources/CodeEditLanguages/CodeLanguage.swift +++ b/Sources/CodeEditLanguages/CodeLanguage.swift @@ -105,6 +105,8 @@ public struct CodeLanguage { return tree_sitter_dockerfile() case .elixir: return tree_sitter_elixir() + case .glsl: + return tree_sitter_glsl() case .go: return tree_sitter_go() case .goMod: diff --git a/Sources/CodeEditLanguages/Documentation.docc/CodeLanguage.md b/Sources/CodeEditLanguages/Documentation.docc/CodeLanguage.md index a4f34ac..69de1d8 100644 --- a/Sources/CodeEditLanguages/Documentation.docc/CodeLanguage.md +++ b/Sources/CodeEditLanguages/Documentation.docc/CodeLanguage.md @@ -28,6 +28,7 @@ let language = CodeLanguage.detectLanguageFrom(url: fileURL) - Dart - Dockerfile - Elixir +- GLSL - Go - Go Mod - Haskell @@ -85,6 +86,7 @@ let language = CodeLanguage.detectLanguageFrom(url: fileURL) - ``dart`` - ``dockerfile`` - ``elixir`` +- ``glsl`` - ``go`` - ``goMod`` - ``haskell`` diff --git a/Sources/CodeEditLanguages/Documentation.docc/TreeSitterModel.md b/Sources/CodeEditLanguages/Documentation.docc/TreeSitterModel.md index e31f57f..d3b0559 100644 --- a/Sources/CodeEditLanguages/Documentation.docc/TreeSitterModel.md +++ b/Sources/CodeEditLanguages/Documentation.docc/TreeSitterModel.md @@ -40,6 +40,7 @@ let query = TreeSitterModel.shared.swiftQuery - ``dartQuery`` - ``dockerfileQuery`` - ``elixirQuery`` +- ``glslQuery`` - ``goQuery`` - ``goModQuery`` - ``haskellQuery`` diff --git a/Sources/CodeEditLanguages/Resources/tree-sitter-glsl/highlights.scm b/Sources/CodeEditLanguages/Resources/tree-sitter-glsl/highlights.scm new file mode 100644 index 0000000..fe59023 --- /dev/null +++ b/Sources/CodeEditLanguages/Resources/tree-sitter-glsl/highlights.scm @@ -0,0 +1,115 @@ +"break" @keyword +"case" @keyword +"const" @keyword +"continue" @keyword +"default" @keyword +"do" @keyword +"else" @keyword +"enum" @keyword +"extern" @keyword +"for" @keyword +"if" @keyword +"inline" @keyword +"return" @keyword +"sizeof" @keyword +"static" @keyword +"struct" @keyword +"switch" @keyword +"typedef" @keyword +"union" @keyword +"volatile" @keyword +"while" @keyword + +"#define" @keyword +"#elif" @keyword +"#else" @keyword +"#endif" @keyword +"#if" @keyword +"#ifdef" @keyword +"#ifndef" @keyword +"#include" @keyword +(preproc_directive) @keyword + +"--" @operator +"-" @operator +"-=" @operator +"->" @operator +"=" @operator +"!=" @operator +"*" @operator +"&" @operator +"&&" @operator +"+" @operator +"++" @operator +"+=" @operator +"<" @operator +"==" @operator +">" @operator +"||" @operator + +"." @delimiter +";" @delimiter + +(string_literal) @string +(system_lib_string) @string + +(null) @constant +(number_literal) @number +(char_literal) @number + +(call_expression + function: (identifier) @function) +(call_expression + function: (field_expression + field: (field_identifier) @function)) +(function_declarator + declarator: (identifier) @function) +(preproc_function_def + name: (identifier) @function.special) + +(field_identifier) @property +(statement_identifier) @label +(type_identifier) @type +(primitive_type) @type +(sized_type_specifier) @type + +((identifier) @constant + (#match? @constant "^[A-Z][A-Z\\d_]*$")) + +(identifier) @variable + +(comment) @comment +; inherits: c +[ + "in" + "out" + "inout" + "uniform" + "shared" + "layout" + "attribute" + "varying" + "buffer" + "coherent" + "readonly" + "writeonly" + "precision" + "highp" + "mediump" + "lowp" + "centroid" + "sample" + "patch" + "smooth" + "flat" + "noperspective" + "invariant" + "precise" +] @type.qualifier + +"subroutine" @keyword.function + +(extension_storage_class) @keyword.storage + +((identifier) @variable.builtin + (#lua-match? @variable.builtin "^gl_")) diff --git a/Sources/CodeEditLanguages/TreeSitterLanguage.swift b/Sources/CodeEditLanguages/TreeSitterLanguage.swift index 850d4f4..00fc22e 100644 --- a/Sources/CodeEditLanguages/TreeSitterLanguage.swift +++ b/Sources/CodeEditLanguages/TreeSitterLanguage.swift @@ -18,6 +18,7 @@ public enum TreeSitterLanguage: String { case dart case dockerfile case elixir + case glsl case go case goMod case haskell diff --git a/Sources/CodeEditLanguages/TreeSitterModel.swift b/Sources/CodeEditLanguages/TreeSitterModel.swift index 4ef8d58..7b37a21 100644 --- a/Sources/CodeEditLanguages/TreeSitterModel.swift +++ b/Sources/CodeEditLanguages/TreeSitterModel.swift @@ -38,6 +38,8 @@ public class TreeSitterModel { return dockerfileQuery case .elixir: return elixirQuery + case .glsl: + return glslQuery case .go: return goQuery case .goMod: @@ -146,6 +148,11 @@ public class TreeSitterModel { public private(set) lazy var elixirQuery: Query? = { return queryFor(.elixir) }() + + /// Query for `GLSL` files + public private(set) lazy var glslQuery: Query? = { + return queryFor(.glsl) + }() /// Query for `Go` files. public private(set) lazy var goQuery: Query? = { diff --git a/Tests/CodeEditLanguagesTests/CodeEditLanguagesTests.swift b/Tests/CodeEditLanguagesTests/CodeEditLanguagesTests.swift index c2feda0..ad47dfa 100644 --- a/Tests/CodeEditLanguagesTests/CodeEditLanguagesTests.swift +++ b/Tests/CodeEditLanguagesTests/CodeEditLanguagesTests.swift @@ -201,6 +201,81 @@ final class CodeEditLanguagesTests: XCTestCase { XCTAssertNotNil(query) XCTAssertNotEqual(query?.patternCount, 0) } + +// MARK: - GLSL + + func test_CodeLanguageGLSL() throws { + let url = URL(fileURLWithPath: "~/path/to/file.vsh") + let language = CodeLanguage.detectLanguageFrom(url: url) + + XCTAssertEqual(language.id, .glsl) + } + + func test_CodeLanguageGLSL2() throws { + let url = URL(fileURLWithPath: "~/path/to/file.fsh") + let language = CodeLanguage.detectLanguageFrom(url: url) + + XCTAssertEqual(language.id, .glsl) + } + + func test_CodeLanguageGLSL3() throws { + let url = URL(fileURLWithPath: "~/path/to/file.glsl") + let language = CodeLanguage.detectLanguageFrom(url: url) + + XCTAssertEqual(language.id, .glsl) + } + + func test_CodeLanguageGLSL4() throws { + let url = URL(fileURLWithPath: "~/path/to/file.vert") + let language = CodeLanguage.detectLanguageFrom(url: url) + + XCTAssertEqual(language.id, .glsl) + } + + func test_CodeLanguageGLSL5() throws { + let url = URL(fileURLWithPath: "~/path/to/file.frag") + let language = CodeLanguage.detectLanguageFrom(url: url) + + XCTAssertEqual(language.id, .glsl) + } + + func test_CodeLanguageGLSL6() throws { + let url = URL(fileURLWithPath: "~/path/to/file.tesc") + let language = CodeLanguage.detectLanguageFrom(url: url) + + XCTAssertEqual(language.id, .glsl) + } + + func test_CodeLanguageGLSL7() throws { + let url = URL(fileURLWithPath: "~/path/to/file.tese") + let language = CodeLanguage.detectLanguageFrom(url: url) + + XCTAssertEqual(language.id, .glsl) + } + + func test_CodeLanguageGLSL8() throws { + let url = URL(fileURLWithPath: "~/path/to/file.geom") + let language = CodeLanguage.detectLanguageFrom(url: url) + + XCTAssertEqual(language.id, .glsl) + } + + func test_CodeLanguageGLSL9() throws { + let url = URL(fileURLWithPath: "~/path/to/file.comp") + let language = CodeLanguage.detectLanguageFrom(url: url) + + XCTAssertEqual(language.id, .glsl) + } + + func test_FetchQueryGLSL() throws { + var language = CodeLanguage.glsl + 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: - Go