Skip to content

Commit 72cb248

Browse files
authored
Fix tree-sitter (#4857)
1 parent b0f4ea7 commit 72cb248

File tree

2 files changed

+135
-197
lines changed

2 files changed

+135
-197
lines changed
Lines changed: 43 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -1,136 +1,56 @@
11
// npx vitest services/tree-sitter/__tests__/languageParser.spec.ts
22

3+
import * as path from "path"
34
import { loadRequiredLanguageParsers } from "../languageParser"
45

5-
vi.mock("web-tree-sitter", () => {
6-
const mockParserInit = vi.fn().mockResolvedValue(undefined)
7-
const mockLanguageLoad = vi.fn().mockResolvedValue({
8-
query: vi.fn().mockReturnValue({ id: "mock-query" }),
9-
})
10-
const mockSetLanguage = vi.fn()
11-
12-
// Create a constructor function that also has static methods
13-
function MockParser() {
14-
return {
15-
setLanguage: mockSetLanguage,
16-
}
17-
}
18-
MockParser.init = mockParserInit
19-
20-
return {
21-
Parser: MockParser,
22-
Language: {
23-
load: mockLanguageLoad,
24-
},
25-
// Export the mocks so tests can access them
26-
__mocks: {
27-
mockParserInit,
28-
mockLanguageLoad,
29-
mockSetLanguage,
30-
},
31-
}
32-
})
33-
34-
// Import the mocked module to get access to the mock functions
35-
const { __mocks } = (await import("web-tree-sitter")) as any
36-
const { mockParserInit, mockLanguageLoad, mockSetLanguage } = __mocks
6+
// Path to the directory containing the WASM files.
7+
const WASM_DIR = path.join(__dirname, "../../../node_modules/tree-sitter-wasms/out")
378

38-
describe("Language Parser", () => {
39-
beforeEach(() => {
40-
vi.clearAllMocks()
9+
describe("loadRequiredLanguageParsers", () => {
10+
it("should load Python parser for .py files", async () => {
11+
const files = ["test.py"]
12+
const parsers = await loadRequiredLanguageParsers(files, WASM_DIR)
13+
expect(parsers.py).toBeDefined()
4114
})
4215

43-
describe("loadRequiredLanguageParsers", () => {
44-
it("should initialize parser only once", async () => {
45-
const files = ["test.js", "test2.js"]
46-
await loadRequiredLanguageParsers(files)
47-
await loadRequiredLanguageParsers(files)
48-
49-
expect(mockParserInit).toHaveBeenCalledTimes(1)
50-
})
51-
52-
it("should load JavaScript parser for .js and .jsx files", async () => {
53-
const files = ["test.js", "test.jsx"]
54-
const parsers = await loadRequiredLanguageParsers(files)
55-
56-
expect(mockLanguageLoad).toHaveBeenCalledWith(expect.stringContaining("tree-sitter-javascript.wasm"))
57-
expect(parsers.js).toBeDefined()
58-
expect(parsers.jsx).toBeDefined()
59-
expect(parsers.js.query).toBeDefined()
60-
expect(parsers.jsx.query).toBeDefined()
61-
})
62-
63-
it("should load TypeScript parser for .ts and .tsx files", async () => {
64-
const files = ["test.ts", "test.tsx"]
65-
const parsers = await loadRequiredLanguageParsers(files)
66-
67-
expect(mockLanguageLoad).toHaveBeenCalledWith(expect.stringContaining("tree-sitter-typescript.wasm"))
68-
expect(mockLanguageLoad).toHaveBeenCalledWith(expect.stringContaining("tree-sitter-tsx.wasm"))
69-
expect(parsers.ts).toBeDefined()
70-
expect(parsers.tsx).toBeDefined()
71-
})
72-
73-
it("should load Python parser for .py files", async () => {
74-
const files = ["test.py"]
75-
const parsers = await loadRequiredLanguageParsers(files)
76-
77-
expect(mockLanguageLoad).toHaveBeenCalledWith(expect.stringContaining("tree-sitter-python.wasm"))
78-
expect(parsers.py).toBeDefined()
79-
})
80-
81-
it("should load multiple language parsers as needed", async () => {
82-
const files = ["test.js", "test.py", "test.rs", "test.go"]
83-
const parsers = await loadRequiredLanguageParsers(files)
84-
85-
expect(mockLanguageLoad).toHaveBeenCalledTimes(4)
86-
expect(parsers.js).toBeDefined()
87-
expect(parsers.py).toBeDefined()
88-
expect(parsers.rs).toBeDefined()
89-
expect(parsers.go).toBeDefined()
90-
})
91-
92-
it("should handle C/C++ files correctly", async () => {
93-
const files = ["test.c", "test.h", "test.cpp", "test.hpp"]
94-
const parsers = await loadRequiredLanguageParsers(files)
95-
96-
expect(mockLanguageLoad).toHaveBeenCalledWith(expect.stringContaining("tree-sitter-c.wasm"))
97-
expect(mockLanguageLoad).toHaveBeenCalledWith(expect.stringContaining("tree-sitter-cpp.wasm"))
98-
expect(parsers.c).toBeDefined()
99-
expect(parsers.h).toBeDefined()
100-
expect(parsers.cpp).toBeDefined()
101-
expect(parsers.hpp).toBeDefined()
102-
})
103-
104-
it("should handle Kotlin files correctly", async () => {
105-
const files = ["test.kt", "test.kts"]
106-
const parsers = await loadRequiredLanguageParsers(files)
107-
108-
expect(mockLanguageLoad).toHaveBeenCalledWith(expect.stringContaining("tree-sitter-kotlin.wasm"))
109-
expect(parsers.kt).toBeDefined()
110-
expect(parsers.kts).toBeDefined()
111-
expect(parsers.kt.query).toBeDefined()
112-
expect(parsers.kts.query).toBeDefined()
113-
})
114-
115-
it("should throw error for unsupported file extensions", async () => {
116-
const files = ["test.unsupported"]
117-
118-
await expect(loadRequiredLanguageParsers(files)).rejects.toThrow("Unsupported language: unsupported")
119-
})
16+
it("should load JavaScript parser for .js and .jsx files", async () => {
17+
const files = ["test.js", "test.jsx"]
18+
const parsers = await loadRequiredLanguageParsers(files, WASM_DIR)
19+
expect(parsers.js).toBeDefined()
20+
expect(parsers.jsx).toBeDefined()
21+
expect(parsers.js.query).toBeDefined()
22+
expect(parsers.jsx.query).toBeDefined()
23+
})
12024

121-
it("should load each language only once for multiple files", async () => {
122-
const files = ["test1.js", "test2.js", "test3.js"]
123-
await loadRequiredLanguageParsers(files)
25+
it("should load multiple language parsers as needed", async () => {
26+
const files = ["test.js", "test.py", "test.rs", "test.go"]
27+
const parsers = await loadRequiredLanguageParsers(files, WASM_DIR)
28+
expect(parsers.js).toBeDefined()
29+
expect(parsers.py).toBeDefined()
30+
expect(parsers.rs).toBeDefined()
31+
expect(parsers.go).toBeDefined()
32+
})
12433

125-
expect(mockLanguageLoad).toHaveBeenCalledTimes(1)
126-
expect(mockLanguageLoad).toHaveBeenCalledWith(expect.stringContaining("tree-sitter-javascript.wasm"))
127-
})
34+
it("should handle C/C++ files correctly", async () => {
35+
const files = ["test.c", "test.h", "test.cpp", "test.hpp"]
36+
const parsers = await loadRequiredLanguageParsers(files, WASM_DIR)
37+
expect(parsers.c).toBeDefined()
38+
expect(parsers.h).toBeDefined()
39+
expect(parsers.cpp).toBeDefined()
40+
expect(parsers.hpp).toBeDefined()
41+
})
12842

129-
it("should set language for each parser instance", async () => {
130-
const files = ["test.js", "test.py"]
131-
await loadRequiredLanguageParsers(files)
43+
it("should handle Kotlin files correctly", async () => {
44+
const files = ["test.kt", "test.kts"]
45+
const parsers = await loadRequiredLanguageParsers(files, WASM_DIR)
46+
expect(parsers.kt).toBeDefined()
47+
expect(parsers.kts).toBeDefined()
48+
expect(parsers.kt.query).toBeDefined()
49+
expect(parsers.kts.query).toBeDefined()
50+
})
13251

133-
expect(mockSetLanguage).toHaveBeenCalledTimes(2)
134-
})
52+
it("should throw error for unsupported file extensions", async () => {
53+
const files = ["test.unsupported"]
54+
await expect(loadRequiredLanguageParsers(files, WASM_DIR)).rejects.toThrow("Unsupported language: unsupported")
13555
})
13656
})

0 commit comments

Comments
 (0)