### Install jq Dependency Source: https://github.com/codeeditapp/codeeditlanguages/blob/main/Sources/CodeEditLanguages/Documentation.docc/Update-Languages.md Install the required jq utility via Homebrew. ```bash $ brew install jq ``` -------------------------------- ### Build Tree-sitter Framework Source: https://github.com/codeeditapp/codeeditlanguages/blob/main/Sources/CodeEditLanguages/Documentation.docc/Add-Languages.md Executes a shell script to build the xcframework for the Tree-sitter language parser. Debugging can be enabled with the `--debug` flag. Ensure `jq` is installed. ```bash $ ./build_framework.sh ``` ```bash $ brew install jq ``` ```bash $ ./build_framework.sh --debug ``` -------------------------------- ### Get Tree-sitter Query for Swift Source: https://github.com/codeeditapp/codeeditlanguages/blob/main/Sources/CodeEditLanguages/Documentation.docc/TreeSitterModel.md Fetches the Tree-sitter query for a specific language ID. This operation can be expensive. ```swift let language = CodeLanguage.swift // this call might be expensive let query = TreeSitterModel.shared.query(for: language.id) ``` -------------------------------- ### GET /detectLanguageFrom Source: https://github.com/codeeditapp/codeeditlanguages/blob/main/Sources/CodeEditLanguages/Documentation.docc/CodeLanguage.md Detects the programming language of a file based on its URL extension. ```APIDOC ## GET detectLanguageFrom(url:) ### Description Detects the appropriate CodeLanguage for a given file URL based on its extension. If the language is not supported, it returns the default (plain text) language. ### Method Static Method ### Parameters #### Path Parameters - **url** (URL) - Required - The file system URL of the file to analyze. ### Response - **CodeLanguage** - The detected language object. ``` -------------------------------- ### Access Swift Tree-sitter Query Directly Source: https://github.com/codeeditapp/codeeditlanguages/blob/main/Sources/CodeEditLanguages/Documentation.docc/TreeSitterModel.md Directly accesses the cached Tree-sitter query for Swift. This is a convenient way to get the query if you know the language. ```swift // this call might be expensive let query = TreeSitterModel.shared.swiftQuery ``` -------------------------------- ### Navigate to Project Directory Source: https://github.com/codeeditapp/codeeditlanguages/blob/main/Sources/CodeEditLanguages/Documentation.docc/Update-Languages.md Set the working directory to the CodeEditLanguages project path. ```bash $ cd path/to/CodeEditLanguages ``` -------------------------------- ### Use Tree-sitter Queries for Parsing Source: https://context7.com/codeeditapp/codeeditlanguages/llms.txt Shows how to use a Tree-sitter query with a parser to analyze code. This involves setting up the parser, parsing source code, and iterating through query matches. ```swift let language = CodeLanguage.swift if let treeSitterLang = language.language, let query = TreeSitterModel.shared.query(for: language.id) { let parser = Parser() try parser.setLanguage(treeSitterLang) let source = """ func greet(name: String) { print("Hello, \(name)!") } """ if let tree = parser.parse(source) { let cursor = query.execute(node: tree.rootNode!, in: tree) while let match = cursor.next() { for capture in match.captures { print("Capture: \(capture.name ?? "unnamed") at \(capture.node.range)") } } } } ``` -------------------------------- ### Implementing unit tests for a new language Source: https://github.com/codeeditapp/codeeditlanguages/blob/main/Sources/CodeEditLanguages/Documentation.docc/Add-Languages.md Create test cases to verify language detection and query loading. ```swift // MARK: - Swift // create as many test cases as there are file extensions func test_CodeLanguageSwift() throws { let url = URL(fileURLWithPath: "~/path/to/file.swift") let language = CodeLanguage.detectLanguageFrom(url: url) XCTAssertEqual(language.id, .swift) } 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) } ``` -------------------------------- ### Build Framework Source: https://github.com/codeeditapp/codeeditlanguages/blob/main/Sources/CodeEditLanguages/Documentation.docc/Update-Languages.md Execute the build script to update artifacts, optionally with debug logging. ```bash $ ./build_framework.sh ``` ```bash $ ./build_framework.sh --debug ``` -------------------------------- ### Implement Syntax Highlighting with SwiftTreeSitter Source: https://context7.com/codeeditapp/codeeditlanguages/llms.txt Use the TreeSitterModel singleton to parse source code and extract syntax highlights based on detected language. ```swift import CodeEditLanguages import SwiftTreeSitter import Foundation class SyntaxHighlighter { private let model = TreeSitterModel.shared func highlight(source: String, fileURL: URL) -> [(range: Range, capture: String)] { var highlights: [(range: Range, capture: String)] = [] // Detect language from file URL let codeLanguage = CodeLanguage.detectLanguageFrom(url: fileURL) // Skip if plain text or no language support guard codeLanguage.id != .plainText, let language = codeLanguage.language, let query = model.query(for: codeLanguage.id) else { return highlights } // Create parser and parse source let parser = Parser() do { try parser.setLanguage(language) } catch { print("Failed to set language: \(error)") return highlights } guard let tree = parser.parse(source) else { return highlights } // Execute query and collect captures let cursor = query.execute(node: tree.rootNode!, in: tree) while let match = cursor.next() { for capture in match.captures { let startIndex = source.index(source.startIndex, offsetBy: Int(capture.node.startByte)) let endIndex = source.index(source.startIndex, offsetBy: Int(capture.node.endByte)) if let captureName = capture.name { highlights.append((range: startIndex.. Query? { switch language { // other cases case .{lang}: return {lang}Query // other cases } } ``` -------------------------------- ### CodeLanguage.detectLanguageFrom Source: https://context7.com/codeeditapp/codeeditlanguages/llms.txt Automatically detects the programming language from a file URL, optionally using file content for shebang or modeline detection. ```APIDOC ## CodeLanguage.detectLanguageFrom(url:prefixBuffer:suffixBuffer:) ### Description This static method automatically detects the programming language from a file URL, optionally using file content for shebang or modeline detection. It first attempts to match by file extension, then falls back to shebang parsing and modeline detection. ### Parameters #### Path Parameters - **url** (URL) - Required - The URL of the file to detect the language for. - **prefixBuffer** (String?) - Optional - The content of the file to use for shebang or modeline detection. - **suffixBuffer** (String?) - Optional - Additional content for detection (less common). ### Request Example ```swift import CodeEditLanguages import Foundation // Basic detection from file extension let swiftURL = URL(fileURLWithPath: "/path/to/file.swift") let language = CodeLanguage.detectLanguageFrom(url: swiftURL) print(language.id) // .swift // Detection for files without extension (e.g., Dockerfile) let dockerURL = URL(fileURLWithPath: "/path/to/Dockerfile") let dockerLang = CodeLanguage.detectLanguageFrom(url: dockerURL) print(dockerLang.id) // .dockerfile // Detection from shebang (useful for extensionless scripts) let unknownURL = URL(fileURLWithPath: "/path/to/script") let shebangContent = "#!/usr/bin/env python3\nimport sys\n" let pythonLang = CodeLanguage.detectLanguageFrom( url: unknownURL, prefixBuffer: shebangContent ) print(pythonLang.id) // .python // Detection from Vim modeline let fileContent = "// vim: ft=swift ts=4 sw=4 et:\nlet x = 1" let vimLang = CodeLanguage.detectLanguageFrom( url: URL(fileURLWithPath: "/path/to/file"), prefixBuffer: fileContent ) print(vimLang.id) // .swift // Detection from Emacs modeline let emacsContent = "-*- mode: javascript; indent-tabs-mode: nil -*-" let emacsLang = CodeLanguage.detectLanguageFrom( url: URL(fileURLWithPath: "/path/to/file"), prefixBuffer: emacsContent ) print(emacsLang.id) // .javascript // Fallback to plain text for unsupported files let unknownFile = URL(fileURLWithPath: "/path/to/file.xyz") let fallbackLang = CodeLanguage.detectLanguageFrom(url: unknownFile) print(fallbackLang.id) // .plainText ``` ### Response Example ``` .swift .dockerfile .python .swift .javascript .plainText ``` ``` -------------------------------- ### Declare Tree-sitter Function in Header Source: https://github.com/codeeditapp/codeeditlanguages/blob/main/Sources/CodeEditLanguages/Documentation.docc/Add-Languages.md Adds an external declaration for the tree-sitter language function to the main header file. Ensure alphabetical order. ```c++ extern TSLanguage *tree_sitter_{lang}(); ``` -------------------------------- ### Registering a new language in CodeLanguage.swift Source: https://github.com/codeeditapp/codeeditlanguages/blob/main/Sources/CodeEditLanguages/Documentation.docc/Add-Languages.md Add the language to the tsLanguage computed property to link the Tree-sitter pointer. ```swift private var tsLanguage: UnsafeMutablePointer? { switch id { // other cases case .{lang}: return tree_sitter_{lang}() } // other cases } ``` -------------------------------- ### Type-Safe Language Identification with TreeSitterLanguage Source: https://context7.com/codeeditapp/codeeditlanguages/llms.txt Illustrates using the `TreeSitterLanguage` enum for type-safe language identification and comparison. It provides enum cases for all supported languages. ```swift import CodeEditLanguages // Use enum cases for type-safe language identification let languageId: TreeSitterLanguage = .swift // Compare language IDs let detectedLanguage = CodeLanguage.detectLanguageFrom( url: URL(fileURLWithPath: "main.rs") ) switch detectedLanguage.id { case .rust: print("Rust file detected") case .swift: print("Swift file detected") case .python: print("Python file detected") case .plainText: print("Unknown file type") default: print("Other language: \(detectedLanguage.id)") } ``` -------------------------------- ### Add Language Case to TreeSitterLanguage Enum Source: https://github.com/codeeditapp/codeeditlanguages/blob/main/Sources/CodeEditLanguages/Documentation.docc/Add-Languages.md Extends the `TreeSitterLanguage` enum in Swift to include a case for the newly added language. Replace `{lang}` with the language identifier. ```swift // other cases case {lang} ``` === COMPLETE CONTENT === This response contains all available snippets from this library. No additional content exists. Do not make further requests.