From 85c4fd83bc91d89bb407926ce6b93d61c64373d9 Mon Sep 17 00:00:00 2001 From: Lukas Pistrol Date: Sat, 29 Oct 2022 00:42:18 +0200 Subject: [PATCH 1/2] outsource tree-sitter languages to binary framework in 'CodeEditLanguages' --- Package.resolved | 189 +------- Package.swift | 45 +- .../CodeEditTextView/CodeEditTextView.swift | 1 + .../CodeLanguage/CodeLanguage.swift | 247 ----------- .../CodeLanguage/TreeSitterLanguage.swift | 34 -- .../CodeLanguage/TreeSitterModel.swift | 201 --------- .../Documentation.docc/Add-Languages.md | 210 --------- .../Documentation.docc/CodeLanguage.md | 89 ---- .../Documentation.docc/Documentation.md | 12 +- .../Documentation.docc/TreeSitterModel.md | 55 --- .../Highlighting/Highlighter.swift | 1 + .../STTextViewController.swift | 1 + .../TreeSitter/TreeSitterClient.swift | 1 + .../CodeEditTextViewTests.swift | 414 ------------------ 14 files changed, 17 insertions(+), 1483 deletions(-) delete mode 100644 Sources/CodeEditTextView/CodeLanguage/CodeLanguage.swift delete mode 100644 Sources/CodeEditTextView/CodeLanguage/TreeSitterLanguage.swift delete mode 100644 Sources/CodeEditTextView/CodeLanguage/TreeSitterModel.swift delete mode 100644 Sources/CodeEditTextView/Documentation.docc/Add-Languages.md delete mode 100644 Sources/CodeEditTextView/Documentation.docc/CodeLanguage.md delete mode 100644 Sources/CodeEditTextView/Documentation.docc/TreeSitterModel.md diff --git a/Package.resolved b/Package.resolved index 9165612cf..7c1ed6e3f 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,14 @@ { "pins" : [ + { + "identity" : "codeeditlanguages", + "kind" : "remoteSourceControl", + "location" : "https://github.com/CodeEditApp/CodeEditLanguages.git", + "state" : { + "branch" : "main", + "revision" : "bb97af51b7c384fbb8e2cc2837d87a553eb88c8c" + } + }, { "identity" : "sttextview", "kind" : "remoteSourceControl", @@ -26,186 +35,6 @@ "revision" : "3b1599ba9f466d8269cea2474beb5c9f0a3d7a5e", "version" : "0.7.0" } - }, - { - "identity" : "tree-sitter-bash", - "kind" : "remoteSourceControl", - "location" : "https://github.com/lukepistrol/tree-sitter-bash.git", - "state" : { - "branch" : "feature/spm", - "revision" : "13af3b5b2c40d560aefeac28361d64f525d1869f" - } - }, - { - "identity" : "tree-sitter-c", - "kind" : "remoteSourceControl", - "location" : "https://github.com/tree-sitter/tree-sitter-c.git", - "state" : { - "branch" : "master", - "revision" : "7175a6dd5fc1cee660dce6fe23f6043d75af424a" - } - }, - { - "identity" : "tree-sitter-c-sharp", - "kind" : "remoteSourceControl", - "location" : "https://github.com/tree-sitter/tree-sitter-c-sharp.git", - "state" : { - "branch" : "master", - "revision" : "5b60f99545fea00a33bbfae5be956f684c4c69e2" - } - }, - { - "identity" : "tree-sitter-cpp", - "kind" : "remoteSourceControl", - "location" : "https://github.com/tree-sitter/tree-sitter-cpp.git", - "state" : { - "branch" : "master", - "revision" : "d5e90fba898f320db48d81ddedd78d52c67c1fed" - } - }, - { - "identity" : "tree-sitter-css", - "kind" : "remoteSourceControl", - "location" : "https://github.com/lukepistrol/tree-sitter-css.git", - "state" : { - "branch" : "feature/spm", - "revision" : "baf1fadcac4f7b7c0f0f273feec4ad68864bc783" - } - }, - { - "identity" : "tree-sitter-elixir", - "kind" : "remoteSourceControl", - "location" : "https://github.com/elixir-lang/tree-sitter-elixir.git", - "state" : { - "branch" : "main", - "revision" : "3b8eb02597599ee38cfcc2c0fea76dc37a7472eb" - } - }, - { - "identity" : "tree-sitter-go", - "kind" : "remoteSourceControl", - "location" : "https://github.com/tree-sitter/tree-sitter-go.git", - "state" : { - "branch" : "master", - "revision" : "aeb2f33b366fd78d5789ff104956ce23508b85db" - } - }, - { - "identity" : "tree-sitter-go-mod", - "kind" : "remoteSourceControl", - "location" : "https://github.com/camdencheek/tree-sitter-go-mod.git", - "state" : { - "branch" : "main", - "revision" : "4a65743dbc2bb3094114dd2b43da03c820aa5234" - } - }, - { - "identity" : "tree-sitter-haskell", - "kind" : "remoteSourceControl", - "location" : "https://github.com/tree-sitter/tree-sitter-haskell.git", - "state" : { - "branch" : "master", - "revision" : "bee6b49543e34c2967c6294a4b05e8bd2bf2da59" - } - }, - { - "identity" : "tree-sitter-html", - "kind" : "remoteSourceControl", - "location" : "https://github.com/mattmassicotte/tree-sitter-html.git", - "state" : { - "branch" : "feature/spm", - "revision" : "68b8bed0c1ebecbaf1919d0a7ae4b27592e6cc45" - } - }, - { - "identity" : "tree-sitter-java", - "kind" : "remoteSourceControl", - "location" : "https://github.com/tree-sitter/tree-sitter-java.git", - "state" : { - "branch" : "master", - "revision" : "09d650def6cdf7f479f4b78f595e9ef5b58ce31e" - } - }, - { - "identity" : "tree-sitter-javascript", - "kind" : "remoteSourceControl", - "location" : "https://github.com/tree-sitter/tree-sitter-javascript.git", - "state" : { - "branch" : "master", - "revision" : "936d976a782e75395d9b1c8c7c7bf4ba6fe0d86b" - } - }, - { - "identity" : "tree-sitter-json", - "kind" : "remoteSourceControl", - "location" : "https://github.com/tree-sitter/tree-sitter-json.git", - "state" : { - "branch" : "master", - "revision" : "73076754005a460947cafe8e03a8cf5fa4fa2938" - } - }, - { - "identity" : "tree-sitter-php", - "kind" : "remoteSourceControl", - "location" : "https://github.com/tree-sitter/tree-sitter-php.git", - "state" : { - "branch" : "master", - "revision" : "ab2e72179ceb8bb0b249c8ac9162a148e911b3dc" - } - }, - { - "identity" : "tree-sitter-python", - "kind" : "remoteSourceControl", - "location" : "https://github.com/lukepistrol/tree-sitter-python.git", - "state" : { - "branch" : "feature/spm", - "revision" : "6a74b1a2de12c90218cbace9c6b896d137cd5201" - } - }, - { - "identity" : "tree-sitter-ruby", - "kind" : "remoteSourceControl", - "location" : "https://github.com/tree-sitter/tree-sitter-ruby.git", - "state" : { - "branch" : "master", - "revision" : "252ca18be76b0918fb6b34c302292b6931876c25" - } - }, - { - "identity" : "tree-sitter-rust", - "kind" : "remoteSourceControl", - "location" : "https://github.com/tree-sitter/tree-sitter-rust.git", - "state" : { - "branch" : "master", - "revision" : "47b061c1e1ba3a7e9c2f450363a50e87de3f7c61" - } - }, - { - "identity" : "tree-sitter-swift", - "kind" : "remoteSourceControl", - "location" : "https://github.com/alex-pinkus/tree-sitter-swift.git", - "state" : { - "branch" : "with-generated-files", - "revision" : "50b8c5e61c29fa30e760c7a1cbf24b59970e6233" - } - }, - { - "identity" : "tree-sitter-yaml", - "kind" : "remoteSourceControl", - "location" : "https://github.com/mattmassicotte/tree-sitter-yaml.git", - "state" : { - "branch" : "feature/spm", - "revision" : "bd633dc67bd71934961610ca8bd832bf2153883e" - } - }, - { - "identity" : "tree-sitter-zig", - "kind" : "remoteSourceControl", - "location" : "https://github.com/maxxnino/tree-sitter-zig.git", - "state" : { - "branch" : "main", - "revision" : "433574f2a086a13cb30463f1f9c72a9be4f88a57" - } } ], "version" : 2 diff --git a/Package.swift b/Package.swift index 2466ff545..40c4f4407 100644 --- a/Package.swift +++ b/Package.swift @@ -14,59 +14,20 @@ let package = Package( dependencies: [ .package(url: "https://github.com/apple/swift-docc-plugin.git", from: "1.0.0"), .package(url: "https://github.com/krzyzanowskim/STTextView.git", exact: "0.1.0"), - .package(url: "https://github.com/ChimeHQ/SwiftTreeSitter.git", exact: "0.7.0"), - .package(url: "https://github.com/lukepistrol/tree-sitter-bash.git", branch: "feature/spm"), // non-official - .package(url: "https://github.com/tree-sitter/tree-sitter-c.git", branch: "master"), - .package(url: "https://github.com/tree-sitter/tree-sitter-cpp.git", branch: "master"), - .package(url: "https://github.com/tree-sitter/tree-sitter-c-sharp.git", branch: "master"), - .package(url: "https://github.com/lukepistrol/tree-sitter-css.git", branch: "feature/spm"), // non-official - .package(url: "https://github.com/elixir-lang/tree-sitter-elixir.git", branch: "main"), - .package(url: "https://github.com/tree-sitter/tree-sitter-go.git", branch: "master"), - .package(url: "https://github.com/camdencheek/tree-sitter-go-mod.git", branch: "main"), - .package(url: "https://github.com/tree-sitter/tree-sitter-haskell.git", branch: "master"), - .package(url: "https://github.com/mattmassicotte/tree-sitter-html.git", branch: "feature/spm"), // non-official - .package(url: "https://github.com/tree-sitter/tree-sitter-java.git", branch: "master"), - .package(url: "https://github.com/tree-sitter/tree-sitter-javascript.git", branch: "master"), - .package(url: "https://github.com/tree-sitter/tree-sitter-json.git", branch: "master"), - .package(url: "https://github.com/tree-sitter/tree-sitter-php.git", branch: "master"), - .package(url: "https://github.com/lukepistrol/tree-sitter-python.git", branch: "feature/spm"), // non-official - .package(url: "https://github.com/tree-sitter/tree-sitter-ruby.git", branch: "master"), - .package(url: "https://github.com/tree-sitter/tree-sitter-rust.git", branch: "master"), - .package(url: "https://github.com/alex-pinkus/tree-sitter-swift.git", branch: "with-generated-files"), - .package(url: "https://github.com/mattmassicotte/tree-sitter-yaml.git", branch: "feature/spm"), // non-official - .package(url: "https://github.com/maxxnino/tree-sitter-zig.git", branch: "main"), + .package(url: "https://github.com/CodeEditApp/CodeEditLanguages.git", branch: "main"), ], targets: [ .target( name: "CodeEditTextView", dependencies: [ "STTextView", - "SwiftTreeSitter", - .product(name: "TreeSitterBash", package: "tree-sitter-bash"), - .product(name: "TreeSitterC", package: "tree-sitter-c"), - .product(name: "TreeSitterCPP", package: "tree-sitter-cpp"), - .product(name: "TreeSitterCSharp", package: "tree-sitter-c-sharp"), - .product(name: "TreeSitterCSS", package: "tree-sitter-css"), - .product(name: "TreeSitterElixir", package: "tree-sitter-elixir"), - .product(name: "TreeSitterGo", package: "tree-sitter-go"), - .product(name: "TreeSitterGoMod", package: "tree-sitter-go-mod"), - .product(name: "TreeSitterHaskell", package: "tree-sitter-haskell"), - .product(name: "TreeSitterHTML", package: "tree-sitter-html"), - .product(name: "TreeSitterJava", package: "tree-sitter-java"), - .product(name: "TreeSitterJS", package: "tree-sitter-javascript"), - .product(name: "TreeSitterJSON", package: "tree-sitter-json"), - .product(name: "TreeSitterPHP", package: "tree-sitter-php"), - .product(name: "TreeSitterPython", package: "tree-sitter-python"), - .product(name: "TreeSitterRuby", package: "tree-sitter-ruby"), - .product(name: "TreeSitterRust", package: "tree-sitter-rust"), - .product(name: "TreeSitterSwift", package: "tree-sitter-swift"), - .product(name: "TreeSitterYAML", package: "tree-sitter-yaml"), - .product(name: "TreeSitterZig", package: "tree-sitter-zig"), + "CodeEditLanguages", ]), .testTarget( name: "CodeEditTextViewTests", dependencies: [ "CodeEditTextView", + "CodeEditLanguages", ]), ] ) diff --git a/Sources/CodeEditTextView/CodeEditTextView.swift b/Sources/CodeEditTextView/CodeEditTextView.swift index 4934687ce..9376ca71d 100644 --- a/Sources/CodeEditTextView/CodeEditTextView.swift +++ b/Sources/CodeEditTextView/CodeEditTextView.swift @@ -7,6 +7,7 @@ import SwiftUI import STTextView +import CodeEditLanguages /// A `SwiftUI` wrapper for a ``STTextViewController``. public struct CodeEditTextView: NSViewControllerRepresentable { diff --git a/Sources/CodeEditTextView/CodeLanguage/CodeLanguage.swift b/Sources/CodeEditTextView/CodeLanguage/CodeLanguage.swift deleted file mode 100644 index bd2833a5e..000000000 --- a/Sources/CodeEditTextView/CodeLanguage/CodeLanguage.swift +++ /dev/null @@ -1,247 +0,0 @@ -// -// CodeLanguage.swift -// CodeEditTextView/CodeLanguage -// -// Created by Lukas Pistrol on 25.05.22. -// - -import Foundation -import tree_sitter -import SwiftTreeSitter - -import TreeSitterBash -import TreeSitterC -import TreeSitterCPP -import TreeSitterCSharp -import TreeSitterCSS -import TreeSitterElixir -import TreeSitterGo -import TreeSitterGoMod -import TreeSitterHaskell -import TreeSitterHTML -import TreeSitterJava -import TreeSitterJS -import TreeSitterJSON -import TreeSitterPHP -import TreeSitterPython -import TreeSitterRuby -import TreeSitterRust -import TreeSitterSwift -import TreeSitterYAML -import TreeSitterZig - -/// A structure holding metadata for code languages -public struct CodeLanguage { - private init( - id: TreeSitterLanguage, - tsName: String, - extensions: Set, - parentURL: URL? = nil, - highlights: Set? = nil - ) { - self.id = id - self.tsName = tsName - self.extensions = extensions - self.parentQueryURL = parentURL - self.additionalHighlights = highlights - } - - /// The ID of the language - public let id: TreeSitterLanguage - - /// The display name of the language - public let tsName: String - - /// A set of file extensions for the language - public let extensions: Set - - /// The query URL of a language this language inherits from. (e.g.: C for C++) - public let parentQueryURL: URL? - - /// Additional highlight file names (e.g.: JSX for JavaScript) - public let additionalHighlights: Set? - - /// The query URL for the language if available - public var queryURL: URL? { - queryURL() - } - - /// The bundle's resource URL - internal var resourceURL: URL? = Bundle.main.resourceURL - - /// The tree-sitter language for the language if available - public var language: Language? { - guard let tsLanguage = tsLanguage else { return nil } - return Language(language: tsLanguage) - } - - internal func queryURL(for highlights: String = "highlights") -> URL? { - resourceURL? - .appendingPathComponent("TreeSitter\(tsName)_TreeSitter\(tsName).bundle") - .appendingPathComponent("Contents/Resources/queries/\(highlights).scm") - } - - /// Gets the TSLanguage from `tree-sitter` - private var tsLanguage: UnsafeMutablePointer? { - switch id { - case .bash: - return tree_sitter_bash() - case .c: - return tree_sitter_c() - case .cpp: - return tree_sitter_cpp() - case .cSharp: - return tree_sitter_c_sharp() - case .css: - return tree_sitter_css() - case .elixir: - return tree_sitter_elixir() - case .go: - return tree_sitter_go() - case .goMod: - return tree_sitter_gomod() - case .haskell: - return tree_sitter_haskell() - case .html: - return tree_sitter_html() - case .java: - return tree_sitter_java() - case .javascript: - return tree_sitter_javascript() - case .json: - return tree_sitter_json() - case .jsx: - return tree_sitter_javascript() - case .php: - return tree_sitter_php() - case .python: - return tree_sitter_python() - case .ruby: - return tree_sitter_ruby() - case .rust: - return tree_sitter_rust() - case .swift: - return tree_sitter_swift() - case .yaml: - return tree_sitter_yaml() - case .zig: - return tree_sitter_zig() - case .plainText: - return nil - } - } -} - -public extension CodeLanguage { - - /// Gets the corresponding language for the given file URL - /// - /// Uses the `pathExtension` URL component to detect the language - /// - Parameter url: The URL to get the language for. - /// - Returns: A language structure - static func detectLanguageFrom(url: URL) -> CodeLanguage { - let fileExtension = url.pathExtension.lowercased() - let fileName = url.pathComponents.last?.lowercased() - // This is to handle special file types without an extension (e.g., Makefile, Dockerfile) - let fileNameOrExtension = fileExtension.isEmpty ? (fileName != nil ? fileName! : "") : fileExtension - if let lang = allLanguages.first(where: { lang in lang.extensions.contains(fileNameOrExtension)}) { - return lang - } else { - return .default - } - } - - /// An array of all language structures. - static let allLanguages: [CodeLanguage] = [ - .bash, - .c, - .cpp, - .cSharp, - .css, - .elixir, - .go, - .goMod, - .haskell, - .html, - .java, - .javascript, - .json, - .jsx, - .php, - .python, - .ruby, - .rust, - .swift, - .yaml, - .zig - ] - - /// A language structure for `Bash` - static let bash: CodeLanguage = .init(id: .bash, tsName: "Bash", extensions: ["sh"]) - - /// A language structure for `C` - static let c: CodeLanguage = .init(id: .c, tsName: "C", extensions: ["c", "h", "o"]) - - /// A language structure for `C++` - static let cpp: CodeLanguage = .init(id: .cpp, - tsName: "CPP", - extensions: ["cpp", "h", "cc"], - parentURL: CodeLanguage.c.queryURL) - - /// A language structure for `C#` - static let cSharp: CodeLanguage = .init(id: .cSharp, tsName: "CSharp", extensions: ["cs"]) - - /// A language structure for `CSS` - static let css: CodeLanguage = .init(id: .css, tsName: "CSS", extensions: ["css"]) - - /// A language structure for `Elixir` - static let elixir: CodeLanguage = .init(id: .elixir, tsName: "Elixir", extensions: ["ex", "exs"]) - - /// A language structure for `Go` - static let go: CodeLanguage = .init(id: .go, tsName: "Go", extensions: ["go"]) - - /// A language structure for `GoMod` - static let goMod: CodeLanguage = .init(id: .goMod, tsName: "GoMod", extensions: ["mod"]) - - /// A language structure for `Haskell` - static let haskell: CodeLanguage = .init(id: .haskell, tsName: "Haskell", extensions: ["hs"]) - - /// A language structure for `HTML` - static let html: CodeLanguage = .init(id: .html, tsName: "HTML", extensions: ["html", "htm"]) - - /// A language structure for `Java` - static let java: CodeLanguage = .init(id: .java, tsName: "Java", extensions: ["java"]) - - /// A language structure for `JavaScript` - static let javascript: CodeLanguage = .init(id: .javascript, tsName: "JS", extensions: ["js"]) - - /// A language structure for `JSON` - static let json: CodeLanguage = .init(id: .json, tsName: "JSON", extensions: ["json"]) - - /// A language structure for `JSX` - static let jsx: CodeLanguage = .init(id: .jsx, tsName: "JS", extensions: ["jsx"], highlights: ["highlights-jsx"]) - - /// A language structure for `PHP` - static let php: CodeLanguage = .init(id: .php, tsName: "PHP", extensions: ["php"]) - - /// A language structure for `Python` - static let python: CodeLanguage = .init(id: .python, tsName: "Python", extensions: ["py"]) - - /// A language structure for `Ruby` - static let ruby: CodeLanguage = .init(id: .ruby, tsName: "Ruby", extensions: ["rb"]) - - /// A language structure for `Rust` - static let rust: CodeLanguage = .init(id: .rust, tsName: "Rust", extensions: ["rs"]) - - /// A language structure for `Swift` - static let swift: CodeLanguage = .init(id: .swift, tsName: "Swift", extensions: ["swift"]) - - /// A language structure for `YAML` - static let yaml: CodeLanguage = .init(id: .yaml, tsName: "YAML", extensions: ["yml", "yaml"]) - - /// A language structure for `Zig` - static let zig: CodeLanguage = .init(id: .zig, tsName: "Zig", extensions: ["zig"]) - - /// The default language (plain text) - static let `default`: CodeLanguage = .init(id: .plainText, tsName: "Plain Text", extensions: ["txt"]) -} diff --git a/Sources/CodeEditTextView/CodeLanguage/TreeSitterLanguage.swift b/Sources/CodeEditTextView/CodeLanguage/TreeSitterLanguage.swift deleted file mode 100644 index cc3673043..000000000 --- a/Sources/CodeEditTextView/CodeLanguage/TreeSitterLanguage.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// TreeSitterLanguage.swift -// CodeEditTextView/CodeLanguage -// -// Created by Lukas Pistrol on 25.05.22. -// - -import Foundation - -/// A collection of languages that are supported by `tree-sitter` -public enum TreeSitterLanguage: String { - case bash - case c - case cpp - case cSharp - case css - case elixir - case go - case goMod - case haskell - case html - case java - case javascript - case json - case jsx - case php - case python - case ruby - case rust - case swift - case yaml - case zig - case plainText -} diff --git a/Sources/CodeEditTextView/CodeLanguage/TreeSitterModel.swift b/Sources/CodeEditTextView/CodeLanguage/TreeSitterModel.swift deleted file mode 100644 index 75c81db5e..000000000 --- a/Sources/CodeEditTextView/CodeLanguage/TreeSitterModel.swift +++ /dev/null @@ -1,201 +0,0 @@ -// -// TreeSitterModel.swift -// CodeEditTextView/CodeLanguage -// -// Created by Lukas Pistrol on 25.05.22. -// - -import Foundation -import SwiftTreeSitter - -/// A singleton class to manage `tree-sitter` queries and keep them in memory. -public class TreeSitterModel { - - /// The singleton/shared instance of ``TreeSitterModel``. - public static let shared: TreeSitterModel = .init() - - /// Get a query for a specific language - /// - Parameter language: The language to request the query for. - /// - Returns: A Query if available. Returns `nil` for not implemented languages - // swiftlint:disable:next cyclomatic_complexity function_body_length - public func query(for language: TreeSitterLanguage) -> Query? { - switch language { - case .bash: - return bashQuery - case .c: - return cQuery - case .cpp: - return cppQuery - case .cSharp: - return cSharpQuery - case .css: - return cssQuery - case .elixir: - return elixirQuery - case .go: - return goQuery - case .goMod: - return goModQuery - case .haskell: - return haskellQuery - case .html: - return htmlQuery - case .java: - return javaQuery - case .javascript: - return javascriptQuery - case .json: - return jsonQuery - case .jsx: - return jsxQuery - case .php: - return phpQuery - case .python: - return pythonQuery - case .ruby: - return rubyQuery - case .rust: - return rustQuery - case .swift: - return swiftQuery - case .yaml: - return yamlQuery - case .zig: - return zigQuery - case .plainText: - return nil - } - } - - /// Query for `Bash` files. - public private(set) lazy var bashQuery: Query? = { - return queryFor(.bash) - }() - - /// Query for `C` files. - public private(set) lazy var cQuery: Query? = { - return queryFor(.c) - }() - - /// Query for `C++` files. - public private(set) lazy var cppQuery: Query? = { - return queryFor(.cpp) - }() - - /// Query for `C#` files. - public private(set) lazy var cSharpQuery: Query? = { - return queryFor(.cSharp) - }() - - /// Query for `CSS` files. - public private(set) lazy var cssQuery: Query? = { - return queryFor(.css) - }() - - /// Query for `Elixir` files. - public private(set) lazy var elixirQuery: Query? = { - return queryFor(.elixir) - }() - - /// Query for `Go` files. - public private(set) lazy var goQuery: Query? = { - return queryFor(.go) - }() - - /// Query for `GoMod` files. - public private(set) lazy var goModQuery: Query? = { - return queryFor(.goMod) - }() - - /// Query for `Haskell` files. - public private(set) lazy var haskellQuery: Query? = { - return queryFor(.haskell) - }() - - /// Query for `HTML` files. - public private(set) lazy var htmlQuery: Query? = { - return queryFor(.html) - }() - - /// Query for `Java` files. - public private(set) lazy var javaQuery: Query? = { - return queryFor(.java) - }() - - /// Query for `JavaScript` files. - public private(set) lazy var javascriptQuery: Query? = { - return queryFor(.javascript) - }() - - /// Query for `JSX` files. - public private(set) lazy var jsxQuery: Query? = { - return queryFor(.jsx) - }() - - /// Query for `JSON` files. - public private(set) lazy var jsonQuery: Query? = { - return queryFor(.json) - }() - - /// Query for `PHP` files. - public private(set) lazy var phpQuery: Query? = { - return queryFor(.php) - }() - - /// Query for `Python` files. - public private(set) lazy var pythonQuery: Query? = { - return queryFor(.python) - }() - - /// Query for `Ruby` files. - public private(set) lazy var rubyQuery: Query? = { - return queryFor(.ruby) - }() - - /// Query for `Rust` files. - public private(set) lazy var rustQuery: Query? = { - return queryFor(.rust) - }() - - /// Query for `Swift` files. - public private(set) lazy var swiftQuery: Query? = { - return queryFor(.swift) - }() - - /// Query for `YAML` files. - public private(set) lazy var yamlQuery: Query? = { - return queryFor(.yaml) - }() - - /// Query for `Zig` files. - public private(set) lazy var zigQuery: Query? = { - return queryFor(.zig) - }() - - private func queryFor(_ codeLanguage: CodeLanguage) -> Query? { - guard let language = codeLanguage.language, - let url = codeLanguage.queryURL else { return nil } - if let parentURL = codeLanguage.parentQueryURL, - let data = combinedQueryData(for: [url, parentURL]) { - return try? Query(language: language, data: data) - } else if let additionalHighlights = codeLanguage.additionalHighlights { - var addURLs = additionalHighlights.compactMap({ codeLanguage.queryURL(for: $0) }) - addURLs.append(url) - guard let data = combinedQueryData(for: addURLs) else { return nil } - return try? Query(language: language, data: data) - } else { - return try? language.query(contentsOf: url) - } - } - - private func combinedQueryData(for fileURLs: [URL]) -> Data? { - let rawQuery = fileURLs.compactMap { try? String(contentsOf: $0) }.joined(separator: "\n") - if !rawQuery.isEmpty { - return rawQuery.data(using: .utf8) - } else { - return nil - } - } - - private init() {} -} diff --git a/Sources/CodeEditTextView/Documentation.docc/Add-Languages.md b/Sources/CodeEditTextView/Documentation.docc/Add-Languages.md deleted file mode 100644 index 35627eb37..000000000 --- a/Sources/CodeEditTextView/Documentation.docc/Add-Languages.md +++ /dev/null @@ -1,210 +0,0 @@ -# Add Languages - -This article is a writedown on how to add support for more languages to ``CodeLanguage``. - -## Overview - -First of all have a look at the corresponding [GitHub Issue](https://github.com/CodeEditApp/CodeEditTextView/issues/15) to see which languages still need implementation. - -## Add SPM support - -If you find one you want to add, fork and clone the linked repo and create a new branch `feature/spm`. - -> In the following code samples replace `{LANG}` or `{lang}` with the language you add (e.g.: `Swift` or `CPP` and `swift` or `cpp` respectively) - -### .gitignore - -Edit the `.gitignore` file to exclude the `.build/` directory from git. - -### Package.swift - -Create a new file `Package.swift` in the `root` directory of the repository and add the following configuration. - -> Make sure to remove the comment in 'sources'. - -```swift -// swift-tools-version:5.3 -import PackageDescription - -let package = Package( - name: "TreeSitter{LANG}", - platforms: [.macOS(.v10_13), .iOS(.v11)], - products: [ - .library(name: "TreeSitter{LANG}", targets: ["TreeSitter{LANG}"]), - ], - dependencies: [], - targets: [ - .target(name: "TreeSitter{LANG}", - path: ".", - exclude: [ - "binding.gyp", - "bindings", - "Cargo.toml", - "corpus", - "examples", - "grammar.js", - "LICENSE", - "Makefile", - "package.json", - "README.md", - "src/grammar.json", - "src/node-types.json", - // any additional files to exclude - ], - sources: [ - "src/parser.c", - "src/scanner.cc", // this might be `scanner.c` or not present at all - ], - resources: [ - .copy("queries") - ], - publicHeadersPath: "bindings/swift", - cSettings: [.headerSearchPath("src")]) - ] -) -``` - -### Swift Bindings - -Now you need to create the Swift bindings which are a `header` file exposing the `tree_sitter_{lang}()` function. - -First of all create the following directories inside the `bindings/` directory: - -`./bindings/swift/TreeSitter{LANG}/` - -Inside that folder create a new header file called `{lang}.h`. - -```cpp -#ifndef TREE_SITTER_{LANG}_H_ -#define TREE_SITTER_{LANG}_H_ - -typedef struct TSLanguage TSLanguage; - -#ifdef __cplusplus -extern "C" { -#endif - -extern TSLanguage *tree_sitter_{lang}(); - -#ifdef __cplusplus -} -#endif - -#endif // TREE_SITTER_{LANG}_H_ -``` - -## Add it to CodeLanguage - -After you added the files you can add the package to ``CodeEditTextView`` locally by adding it to the `Package.swift` file's dependecies inside ``CodeEditTextView``. - -```swift -dependencies: [ - // other package dependencies - .package(name: "TreeSitter{LANG}", path: "/PATH/TO/LOCAL/PACKAGE"), -], -targets: [ - .target( - name: "CodeEditTextView", - dependencies: [ - // other dependencies - .product(name: "TreeSitter{LANG}", package: "tree-sitter-{lang}"), - ]), -] -``` - -Now move over to the `CodeLanguage` folder where 3 files need to be updated. - -### TreeSitterLanguage.swift - -Add a case for your language to ``TreeSitterLanguage``: - -```swift -public enum TreeSitterLanguage: String { - // other cases - case {lang} -} -``` - -### CodeLanguage.swift - -On top add an `import` statement: - -```swift -import TreeSitter{LANG} -``` - -Find the `tsLanguage` computed property and add a `case` to it: - -```swift -private var tsLanguage: UnsafeMutablePointer? { - switch id { - // other cases - case .{lang}: - return tree_sitter_{lang}() - } - // other cases -} -``` - -On the bottom of the file add a new `static` constant: - -```swift -static let {lang}: CodeLanguage = .init(id: .{lang}, tsName: {LANG}, extensions: [...]) -``` - -> in 'extensions' add the proper file extensions your language uses. - -Now find the static constant ``CodeLanguage/allLanguages`` and add your language to it: - -```swift -static let allLanguages: [CodeLanguage] = [ - // other languages - .{lang}, - // other languages -] -``` - -### TreeSitterModel.swift - -Create a new query like so: - -```swift -public private(set) lazy var {lang}Query: Query? = { - return queryFor(.{lang}) -}() -``` - -Find the ``TreeSitterModel/query(for:)`` method and add a `case` for your language: - -```swift -public func query(for language: TreeSitterLanguage) -> Query? { - switch language { - // other cases - case .{lang}: - return {lang}Query - // other cases - } -} -``` - -## Test it! - -In order to test whether is working or not, add ``CodeEditTextView`` as a local dependency to `CodeEdit`. - -In order to do that close ``CodeEditTextView`` in Xcode and open `CodeEdit`. Then inside `CodeEditModules` replace the `CodeEditTextView` dependency with: - -```swift -.package(name: "CodeEditTextView", path: "/PATH/TO/CodeEditTextView") -``` - -After that, you may need to reset packages caches but then it should compile and run. - -When everything is working correctly push your `tree-sitter-{lang}` changes to `origin` and also create a Pull Request to the official repository. - -> Take [this PR description](https://github.com/tree-sitter/tree-sitter-javascript/pull/223) as a template and cross-reference it with your Pull Request. - -Now you can remove the local dependencies and replace it with the actual package URLs and submit a Pull Request for ``CodeEditTextView``. - -## Documentation - -Please make sure to add the newly created properties to the documentation `*.md` files. diff --git a/Sources/CodeEditTextView/Documentation.docc/CodeLanguage.md b/Sources/CodeEditTextView/Documentation.docc/CodeLanguage.md deleted file mode 100644 index bcc6b3fb5..000000000 --- a/Sources/CodeEditTextView/Documentation.docc/CodeLanguage.md +++ /dev/null @@ -1,89 +0,0 @@ -# ``CodeEditTextView/CodeLanguage`` - -## Overview - -If the language required is known they can be accessed by using the type properties below. - -```swift -let language = CodeLanguage.swift -``` - -If the language needs to be discovered by the file extension this can be done by calling ``detectLanguageFrom(url:)``. - -```swift -let fileURL = URL(fileURLWithPath: "/path/to/file.swift") -let language = CodeLanguage.detectLanguageFrom(url: fileURL) -``` - -> In case the language is not supported yet, the resulting ``CodeLanguage`` will be ``default`` (plain text). - -### Supported Languages - -- Bash -- C -- C++ -- C# -- CSS -- Elixir -- Go -- Go Mod -- Haskell -- HTML -- Java -- JavaScript -- JSON -- JSX -- PHP -- Python -- Ruby -- Rust -- Swift -- YAML -- Zig - -## Topics - -### Guides - -- - -### Instance Properties - -- ``id`` -- ``tsName`` -- ``extensions`` -- ``parentQueryURL`` -- ``tsName`` -- ``queryURL`` -- ``language`` -- ``additionalHighlights`` - -### Type Properties - -- ``allLanguages`` -- ``default`` -- ``bash`` -- ``c`` -- ``cpp`` -- ``cSharp`` -- ``css`` -- ``elixir`` -- ``go`` -- ``goMod`` -- ``haskell`` -- ``html`` -- ``java`` -- ``javascript`` -- ``json`` -- ``jsx`` -- ``php`` -- ``python`` -- ``ruby`` -- ``rust`` -- ``swift`` -- ``yaml`` -- ``zig`` - -### Type Methods - -- ``detectLanguageFrom(url:)`` diff --git a/Sources/CodeEditTextView/Documentation.docc/Documentation.md b/Sources/CodeEditTextView/Documentation.docc/Documentation.md index 490111d8d..e42c43b28 100644 --- a/Sources/CodeEditTextView/Documentation.docc/Documentation.md +++ b/Sources/CodeEditTextView/Documentation.docc/Documentation.md @@ -4,7 +4,7 @@ A code editor with syntax highlighting powered by tree-sitter. ## Overview -This package includes both `AppKit` and `SwiftUI` components. It also relies on the `CodeLanguage` and `Theme` module. +This package includes both `AppKit` and `SwiftUI` components. It also relies on the `CodeEditLanguages` and `Theme` module. ## Dependencies @@ -17,21 +17,11 @@ Special thanks to both [Marcin Krzyzanowski](https://twitter.com/krzyzanowskim) ## Topics -### Guides - -- - ### Text View - ``CodeEditTextView/CodeEditTextView`` - ``CodeEditTextView/STTextViewController`` -### Code Language - -- ``CodeLanguage`` -- ``TreeSitterLanguage`` -- ``TreeSitterModel`` - ### Theme - ``EditorTheme`` diff --git a/Sources/CodeEditTextView/Documentation.docc/TreeSitterModel.md b/Sources/CodeEditTextView/Documentation.docc/TreeSitterModel.md deleted file mode 100644 index 4c2036c06..000000000 --- a/Sources/CodeEditTextView/Documentation.docc/TreeSitterModel.md +++ /dev/null @@ -1,55 +0,0 @@ -# ``CodeEditTextView/TreeSitterModel`` - -## Overview - -Since fetching queries *can* be expensive the queries are fetched lazily and kept in memory for the entire session. - -> Be aware that running the application in `Debug` configuration will lead to worse performance. Make sure to run it in `Release` configuration. - -## Usage - -```swift -let language = CodeLanguage.swift - -// this call might be expensive -let query = TreeSitterModel.shared.query(for: language.id) -``` -Or access it directly -```swift -// this call might be expensive -let query = TreeSitterModel.shared.swiftQuery -``` - -## Topics - -### Type Properties - -- ``shared`` - -### Instance Methods - -- ``query(for:)`` - -### Instance Properties - -- ``bashQuery`` -- ``cQuery`` -- ``cppQuery`` -- ``cSharpQuery`` -- ``cssQuery`` -- ``elixirQuery`` -- ``goQuery`` -- ``goModQuery`` -- ``haskellQuery`` -- ``htmlQuery`` -- ``javaQuery`` -- ``javascriptQuery`` -- ``jsonQuery`` -- ``jsxQuery`` -- ``phpQuery`` -- ``pythonQuery`` -- ``rubyQuery`` -- ``rustQuery`` -- ``swiftQuery`` -- ``yamlQuery`` -- ``zigQuery`` diff --git a/Sources/CodeEditTextView/Highlighting/Highlighter.swift b/Sources/CodeEditTextView/Highlighting/Highlighter.swift index 27dd6ef48..3e2e07e2d 100644 --- a/Sources/CodeEditTextView/Highlighting/Highlighter.swift +++ b/Sources/CodeEditTextView/Highlighting/Highlighter.swift @@ -9,6 +9,7 @@ import Foundation import AppKit import STTextView import SwiftTreeSitter +import CodeEditLanguages /// Classes conforming to this protocol can provide attributes for text given a capture type. public protocol ThemeAttributesProviding { diff --git a/Sources/CodeEditTextView/STTextViewController.swift b/Sources/CodeEditTextView/STTextViewController.swift index 3b9d9078e..2bed7250a 100644 --- a/Sources/CodeEditTextView/STTextViewController.swift +++ b/Sources/CodeEditTextView/STTextViewController.swift @@ -9,6 +9,7 @@ import AppKit import SwiftUI import STTextView import SwiftTreeSitter +import CodeEditLanguages /// A View Controller managing and displaying a `STTextView` public class STTextViewController: NSViewController, STTextViewDelegate, ThemeAttributesProviding { diff --git a/Sources/CodeEditTextView/TreeSitter/TreeSitterClient.swift b/Sources/CodeEditTextView/TreeSitter/TreeSitterClient.swift index 008ee5781..250cb8f39 100644 --- a/Sources/CodeEditTextView/TreeSitter/TreeSitterClient.swift +++ b/Sources/CodeEditTextView/TreeSitter/TreeSitterClient.swift @@ -6,6 +6,7 @@ // import Foundation +import CodeEditLanguages import SwiftTreeSitter /// `TreeSitterClient` is a class that manages applying edits for and querying captures for a syntax tree. diff --git a/Tests/CodeEditTextViewTests/CodeEditTextViewTests.swift b/Tests/CodeEditTextViewTests/CodeEditTextViewTests.swift index 31bf5f708..0936556d6 100644 --- a/Tests/CodeEditTextViewTests/CodeEditTextViewTests.swift +++ b/Tests/CodeEditTextViewTests/CodeEditTextViewTests.swift @@ -1,6 +1,5 @@ import XCTest @testable import CodeEditTextView -import SwiftTreeSitter // swiftlint:disable all final class CodeEditTextViewTests: XCTestCase { @@ -40,417 +39,4 @@ final class CodeEditTextViewTests: XCTestCase { let expected = "World" XCTAssertEqual(result, expected) } - - // MARK: Bash - - func test_CodeLanguageBash() throws { - let url = URL(fileURLWithPath: "~/path/to/file.sh") - let language = CodeLanguage.detectLanguageFrom(url: url) - - XCTAssertEqual(language.id, .bash) - } - - // MARK: C - - func test_CodeLanguageC() throws { - let url = URL(fileURLWithPath: "~/path/to/file.c") - let language = CodeLanguage.detectLanguageFrom(url: url) - - XCTAssertEqual(language.id, .c) - } - - func test_CodeLanguageC2() throws { - let url = URL(fileURLWithPath: "~/path/to/file.o") - let language = CodeLanguage.detectLanguageFrom(url: url) - - XCTAssertEqual(language.id, .c) - } - - func test_CodeLanguageC3() throws { - let url = URL(fileURLWithPath: "~/path/to/file.h") - let language = CodeLanguage.detectLanguageFrom(url: url) - - XCTAssertEqual(language.id, .c) - } - - // MARK: C++ - - func test_CodeLanguageCPP() throws { - let url = URL(fileURLWithPath: "~/path/to/file.cc") - let language = CodeLanguage.detectLanguageFrom(url: url) - - XCTAssertEqual(language.id, .cpp) - } - - func test_CodeLanguageCPP2() throws { - let url = URL(fileURLWithPath: "~/path/to/file.cpp") - let language = CodeLanguage.detectLanguageFrom(url: url) - - XCTAssertEqual(language.id, .cpp) - } - - // MARK: C# - - func test_CodeLanguageCSharp() throws { - let url = URL(fileURLWithPath: "~/path/to/file.cs") - let language = CodeLanguage.detectLanguageFrom(url: url) - - XCTAssertEqual(language.id, .cSharp) - } - - // MARK: CSS - - func test_CodeLanguageCSS() throws { - let url = URL(fileURLWithPath: "~/path/to/file.css") - let language = CodeLanguage.detectLanguageFrom(url: url) - - XCTAssertEqual(language.id, .css) - } - - // MARK: Elixir - - func test_CodeLanguageElixir() throws { - let url = URL(fileURLWithPath: "~/path/to/file.ex") - let language = CodeLanguage.detectLanguageFrom(url: url) - - XCTAssertEqual(language.id, .elixir) - } - - func test_CodeLanguageElixir2() throws { - let url = URL(fileURLWithPath: "~/path/to/file.exs") - let language = CodeLanguage.detectLanguageFrom(url: url) - - XCTAssertEqual(language.id, .elixir) - } - - // MARK: Go - - func test_CodeLanguageGo() throws { - let url = URL(fileURLWithPath: "~/path/to/file.go") - let language = CodeLanguage.detectLanguageFrom(url: url) - - XCTAssertEqual(language.id, .go) - } - - // MARK: Go Mod - - func test_CodeLanguageGoMod() throws { - let url = URL(fileURLWithPath: "~/path/to/file.mod") - let language = CodeLanguage.detectLanguageFrom(url: url) - - XCTAssertEqual(language.id, .goMod) - } - - // MARK: Haskell - - func test_CodeLanguageHaskell() throws { - let url = URL(fileURLWithPath: "~/path/to/file.hs") - let language = CodeLanguage.detectLanguageFrom(url: url) - - XCTAssertEqual(language.id, .haskell) - } - - // MARK: HTML - - func test_CodeLanguageHTML() throws { - let url = URL(fileURLWithPath: "~/path/to/file.html") - let language = CodeLanguage.detectLanguageFrom(url: url) - - XCTAssertEqual(language.id, .html) - } - - func test_CodeLanguageHTML2() throws { - let url = URL(fileURLWithPath: "~/path/to/file.htm") - let language = CodeLanguage.detectLanguageFrom(url: url) - - XCTAssertEqual(language.id, .html) - } - - // MARK: Java - - func test_CodeLanguageJava() throws { - let url = URL(fileURLWithPath: "~/path/to/file.java") - let language = CodeLanguage.detectLanguageFrom(url: url) - - XCTAssertEqual(language.id, .java) - } - - // MARK: JavaScript - - func test_CodeLanguageJavaScript() throws { - let url = URL(fileURLWithPath: "~/path/to/file.js") - let language = CodeLanguage.detectLanguageFrom(url: url) - - XCTAssertEqual(language.id, .javascript) - } - - // MARK: JSON - - func test_CodeLanguageJSON() throws { - let url = URL(fileURLWithPath: "~/path/to/file.json") - let language = CodeLanguage.detectLanguageFrom(url: url) - - XCTAssertEqual(language.id, .json) - } - - // MARK: JSX - - func test_CodeLanguageJSX() throws { - let url = URL(fileURLWithPath: "~/path/to/file.jsx") - let language = CodeLanguage.detectLanguageFrom(url: url) - - XCTAssertEqual(language.id, .jsx) - } - - // MARK: PHP - - func test_CodeLanguagePHP() throws { - let url = URL(fileURLWithPath: "~/path/to/file.php") - let language = CodeLanguage.detectLanguageFrom(url: url) - - XCTAssertEqual(language.id, .php) - } - - // MARK: Python - - func test_CodeLanguagePython() throws { - let url = URL(fileURLWithPath: "~/path/to/file.py") - let language = CodeLanguage.detectLanguageFrom(url: url) - - XCTAssertEqual(language.id, .python) - } - - // MARK: Ruby - - func test_CodeLanguageRuby() throws { - let url = URL(fileURLWithPath: "~/path/to/file.rb") - let language = CodeLanguage.detectLanguageFrom(url: url) - - XCTAssertEqual(language.id, .ruby) - } - - // MARK: Rust - - func test_CodeLanguageRust() throws { - let url = URL(fileURLWithPath: "~/path/to/file.rs") - let language = CodeLanguage.detectLanguageFrom(url: url) - - XCTAssertEqual(language.id, .rust) - } - - // MARK: Swift - - func test_CodeLanguageSwift() throws { - let url = URL(fileURLWithPath: "~/path/to/file.swift") - let language = CodeLanguage.detectLanguageFrom(url: url) - - XCTAssertEqual(language.id, .swift) - } - - // MARK: YAML - - func test_CodeLanguageYAML() throws { - let url = URL(fileURLWithPath: "~/path/to/file.yml") - let language = CodeLanguage.detectLanguageFrom(url: url) - - XCTAssertEqual(language.id, .yaml) - } - - func test_CodeLanguageYAML2() throws { - let url = URL(fileURLWithPath: "~/path/to/file.yaml") - let language = CodeLanguage.detectLanguageFrom(url: url) - - XCTAssertEqual(language.id, .yaml) - } - - // MARK: Zig - - func test_CodeLanguageZig() throws { - let url = URL(fileURLWithPath: "~/path/to/file.zig") - let language = CodeLanguage.detectLanguageFrom(url: url) - - XCTAssertEqual(language.id, .zig) - } - - // MARK: Unsupported - - func test_CodeLanguageUnsupported() throws { - let url = URL(fileURLWithPath: "~/path/to/file.abc") - let language = CodeLanguage.detectLanguageFrom(url: url) - - XCTAssertEqual(language.id, .plainText) - } - - let bundleURL = Bundle(for: TreeSitterModel.self).resourceURL - - func test_FetchQueryBash() throws { - var language = CodeLanguage.bash - 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) - } - - func test_FetchQueryC() throws { - var language = CodeLanguage.c - 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) - } - - func test_FetchQueryCPP() throws { - var language = CodeLanguage.cpp - 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) - } - - func test_FetchQueryCSharp() throws { - var language = CodeLanguage.cSharp - 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) - } - - func test_FetchQueryCSS() throws { - var language = CodeLanguage.css - 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) - } - - func test_FetchQueryGo() throws { - var language = CodeLanguage.go - 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) - } - - func test_FetchQueryGoMod() throws { - var language = CodeLanguage.goMod - 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) - } - - func test_FetchQueryHTML() throws { - var language = CodeLanguage.html - 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) - } - - func test_FetchQueryJava() throws { - var language = CodeLanguage.java - 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) - } - - func test_FetchQueryJavaScript() throws { - var language = CodeLanguage.javascript - 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) - } - - func test_FetchQueryJSON() throws { - var language = CodeLanguage.json - 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) - } - - func test_FetchQueryJSX() throws { - var language = CodeLanguage.jsx - 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) - } - - func test_FetchQueryPHP() throws { - var language = CodeLanguage.php - 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) - } - - func test_FetchQueryPython() throws { - var language = CodeLanguage.python - 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) - } - - func test_FetchQueryRuby() throws { - var language = CodeLanguage.ruby - 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) - } - - func test_FetchQueryRust() throws { - var language = CodeLanguage.rust - 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) - } - - func test_FetchQuerySwift() throws { - var language = CodeLanguage.swift - 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) - } - } From 84b2e7d2177f218af2706881eddf285653b6d588 Mon Sep 17 00:00:00 2001 From: Lukas Pistrol Date: Sat, 29 Oct 2022 01:12:17 +0200 Subject: [PATCH 2/2] update packages, remove caching from build and test scripts --- .github/workflows/build-documentation.yml | 6 ------ .github/workflows/tests.yml | 6 ------ Package.resolved | 2 +- 3 files changed, 1 insertion(+), 13 deletions(-) diff --git a/.github/workflows/build-documentation.yml b/.github/workflows/build-documentation.yml index afe8ac2cc..ad882a150 100644 --- a/.github/workflows/build-documentation.yml +++ b/.github/workflows/build-documentation.yml @@ -11,12 +11,6 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v1 - - uses: actions/cache@v3 - with: - path: '.build' - key: ${{ runner.os }}-spm-${{ hashFiles('**/Package.resolved') }} - restore-keys: | - ${{ runner.os }}-spm- - uses: fwcd/swift-docc-action@v1.0.2 with: target: CodeEditTextView diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 699cd59c1..518291e4b 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -16,12 +16,6 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v1 - - uses: actions/cache@v3 - with: - path: '.build' - key: ${{ runner.os }}-spm-${{ hashFiles('**/Package.resolved') }} - restore-keys: | - ${{ runner.os }}-spm- - name: Make executeable run: chmod +x ./.github/scripts/tests.sh - name: Testing Package diff --git a/Package.resolved b/Package.resolved index 7c1ed6e3f..b6b335e1f 100644 --- a/Package.resolved +++ b/Package.resolved @@ -6,7 +6,7 @@ "location" : "https://github.com/CodeEditApp/CodeEditLanguages.git", "state" : { "branch" : "main", - "revision" : "bb97af51b7c384fbb8e2cc2837d87a553eb88c8c" + "revision" : "81e0bdfb6b09f6856a8867600a98dcecfe50ad19" } }, {