Skip to content

Commit

Permalink
Throw if query is unsupported
Browse files Browse the repository at this point in the history
  • Loading branch information
mattmassicotte committed Sep 10, 2024
1 parent 46fc7e9 commit b31cf6f
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 12 deletions.
2 changes: 1 addition & 1 deletion Sources/SwiftTreeSitterLayer/LanguageLayer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import Foundation

import SwiftTreeSitter

public enum LanguageLayerError: Error {
public enum LanguageLayerError: Error, Hashable {
case noRootNode
case queryUnavailable(String, Query.Definition)
}
Expand Down
20 changes: 9 additions & 11 deletions Sources/SwiftTreeSitterLayer/Snapshots.swift
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@ public struct LanguageLayerSnapshot: Sendable {
return set
}

func queryTarget(for queryDef: Query.Definition) -> LanguageTreeQueryCursor.Target? {
func queryTarget(for queryDef: Query.Definition) throws -> LanguageTreeQueryCursor.Target {
guard let query = data.queries[queryDef] else {
return nil
throw LanguageLayerError.queryUnavailable(data.name, queryDef)
}

return (tree, query, depth, data.name)
Expand All @@ -47,9 +47,7 @@ public struct LanguageLayerSnapshot: Sendable {
extension LanguageLayerSnapshot: Queryable {
/// Run a query against the snapshot.
public func executeQuery(_ queryDef: Query.Definition, in set: IndexSet) throws -> LanguageLayerQueryCursor {
guard let target = queryTarget(for: queryDef) else {
throw LanguageLayerError.queryUnavailable(data.name, queryDef)
}
let target = try queryTarget(for: queryDef)

return LanguageLayerQueryCursor(target: target, set: set)
}
Expand Down Expand Up @@ -77,13 +75,13 @@ public struct LanguageLayerTreeSnapshot: Sendable {
}
}

private func queryTargets(in set: IndexSet, for queryDef: Query.Definition) -> [LanguageTreeQueryCursor.Target] {
private func queryTargets(in set: IndexSet, for queryDef: Query.Definition) throws -> [LanguageTreeQueryCursor.Target] {
var targets = [LanguageTreeQueryCursor.Target]()

enumerateSnapshots(in: set) { snapshot in
if let target = snapshot.queryTarget(for: queryDef) {
targets.append(target)
}
try enumerateSnapshots(in: set) { snapshot in
let target = try snapshot.queryTarget(for: queryDef)

targets.append(target)
}

return targets
Expand All @@ -92,7 +90,7 @@ public struct LanguageLayerTreeSnapshot: Sendable {

extension LanguageLayerTreeSnapshot: Queryable {
public func executeQuery(_ queryDef: Query.Definition, in set: IndexSet) throws -> LanguageTreeQueryCursor {
let targets = queryTargets(in: set, for: queryDef)
let targets = try queryTargets(in: set, for: queryDef)

return LanguageTreeQueryCursor(set: set, targets: targets)
}
Expand Down
26 changes: 26 additions & 0 deletions Tests/SwiftTreeSitterLayerTests/LanguageLayerTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,32 @@ let c = "var c = 1"

XCTAssertEqual(highlights3, expected3)
}

func testThrowsOnNoHighlightQuery() throws {
let language = Language(language: tree_sitter_swift())
let swiftConfig = LanguageConfiguration(
language,
name: "Swift",
queries: [:]
)

let config = LanguageLayer.Configuration(languageProvider: { name in
precondition(name == "swift")

return swiftConfig
})

let tree = try LanguageLayer(languageConfig: swiftConfig, configuration: config)

let text = """
let a = "var a = 1"
"""
tree.replaceContent(with: text)

XCTAssertThrowsError(try tree.highlights(in: NSRange(0..<10), provider: { _, _ in nil })) { error in
XCTAssertEqual(error as? LanguageLayerError, LanguageLayerError.queryUnavailable("Swift", .highlights))
}
}
}

#endif

0 comments on commit b31cf6f

Please sign in to comment.