Skip to content

Commit 8fea000

Browse files
committed
fix: improve ABL/DF WASM loading and handle FileSystemError gracefully
- Add multiple fallback strategies for loading ABL/DF WASM files - Try loading from dist directory first, then npm packages - Add better error handling for FileSystemError during file reads - Handle canceled file operations gracefully in scanner
1 parent 9acba0c commit 8fea000

File tree

2 files changed

+55
-13
lines changed

2 files changed

+55
-13
lines changed

src/services/code-index/processors/scanner.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,10 +134,21 @@ export class DirectoryScanner implements IDirectoryScanner {
134134
return
135135
}
136136

137-
// Read file content
138-
const content = await vscode.workspace.fs
139-
.readFile(vscode.Uri.file(filePath))
140-
.then((buffer) => Buffer.from(buffer).toString("utf-8"))
137+
// Read file content with better error handling
138+
let content: string
139+
try {
140+
const buffer = await vscode.workspace.fs.readFile(vscode.Uri.file(filePath))
141+
content = Buffer.from(buffer).toString("utf-8")
142+
} catch (readError: any) {
143+
// Handle FileSystemError specifically
144+
if (readError?.name === "Canceled (FileSystemError)" || readError?.code === "Unknown") {
145+
console.warn(`File read was canceled for ${filePath}, skipping file`)
146+
skippedCount++
147+
return
148+
}
149+
// Re-throw other errors
150+
throw readError
151+
}
141152

142153
// Calculate current hash
143154
const currentFileHash = createHash("sha256").update(content).digest("hex")

src/services/tree-sitter/languageParser.ts

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,26 +41,57 @@ export interface LanguageParser {
4141

4242
async function loadLanguage(langName: string, sourceDirectory?: string) {
4343
const baseDir = sourceDirectory || __dirname
44+
const { Language } = require("web-tree-sitter")
4445

45-
// Special handling for ABL and DF - load from node_modules
46+
// Special handling for ABL and DF - try multiple loading strategies
4647
if (langName === "abl" || langName === "df") {
48+
// Strategy 1: Try to load from dist directory (where build process copies them)
4749
try {
48-
const { Language } = require("web-tree-sitter")
49-
const packageName = `@usagi-coffee/tree-sitter-${langName}`
50-
const wasmPath = require.resolve(`${packageName}/tree-sitter-${langName}.wasm`)
50+
const wasmPath = path.join(baseDir, `tree-sitter-${langName}.wasm`)
5151
return await Language.load(wasmPath)
52-
} catch (error) {
53-
console.error(
54-
`Error loading ${langName} language from npm package: ${error instanceof Error ? error.message : error}`,
52+
} catch (distError) {
53+
console.warn(
54+
`Could not load ${langName} from dist directory, trying npm package: ${distError instanceof Error ? distError.message : distError}`,
5555
)
56-
throw error
56+
57+
// Strategy 2: Try to load from node_modules using require.resolve
58+
try {
59+
const packageName = `@usagi-coffee/tree-sitter-${langName}`
60+
const wasmPath = require.resolve(`${packageName}/tree-sitter-${langName}.wasm`)
61+
return await Language.load(wasmPath)
62+
} catch (npmError) {
63+
console.warn(
64+
`Could not load ${langName} from npm package, trying alternative path: ${npmError instanceof Error ? npmError.message : npmError}`,
65+
)
66+
67+
// Strategy 3: Try to load from node_modules with direct path
68+
try {
69+
const wasmPath = path.join(
70+
__dirname,
71+
"..",
72+
"..",
73+
"..",
74+
"node_modules",
75+
`@usagi-coffee/tree-sitter-${langName}`,
76+
`tree-sitter-${langName}.wasm`,
77+
)
78+
return await Language.load(wasmPath)
79+
} catch (fallbackError) {
80+
console.error(
81+
`Failed to load ${langName} language from all strategies: ${fallbackError instanceof Error ? fallbackError.message : fallbackError}`,
82+
)
83+
throw new Error(
84+
`Unable to load ${langName} language parser. Please ensure the extension is properly installed.`,
85+
)
86+
}
87+
}
5788
}
5889
}
5990

91+
// Standard loading for other languages
6092
const wasmPath = path.join(baseDir, `tree-sitter-${langName}.wasm`)
6193

6294
try {
63-
const { Language } = require("web-tree-sitter")
6495
return await Language.load(wasmPath)
6596
} catch (error) {
6697
console.error(`Error loading language: ${wasmPath}: ${error instanceof Error ? error.message : error}`)

0 commit comments

Comments
 (0)