Skip to content

Commit 4f93099

Browse files
authored
Merge pull request #281 from DevanshuNEU/fix/graceful-ts-parser-import
HOTFIX: graceful fallback when tree-sitter-typescript not installed
2 parents 36a235a + 603cfcf commit 4f93099

2 files changed

Lines changed: 37 additions & 6 deletions

File tree

backend/services/dependency_analyzer.py

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@
99
# Tree-sitter
1010
import tree_sitter_python as tspython
1111
import tree_sitter_javascript as tsjavascript
12-
import tree_sitter_typescript as tstypescript
12+
try:
13+
import tree_sitter_typescript as tstypescript
14+
_HAS_TS_PARSER = True
15+
except ModuleNotFoundError:
16+
_HAS_TS_PARSER = False
1317
from tree_sitter import Language, Parser
1418

1519
from services.observability import logger, metrics
@@ -19,14 +23,24 @@ class DependencyAnalyzer:
1923
"""Analyze code dependencies and build dependency graph"""
2024

2125
def __init__(self):
22-
# Initialize parsers
26+
js_lang = Language(tsjavascript.language())
27+
# Use proper TS parser if available, fall back to JS parser
28+
if _HAS_TS_PARSER:
29+
ts_lang = Language(tstypescript.language_typescript())
30+
tsx_lang = Language(tstypescript.language_tsx())
31+
else:
32+
logger.warning("tree-sitter-typescript not installed, falling back to JS parser for TS/TSX")
33+
ts_lang = js_lang
34+
tsx_lang = js_lang
35+
36+
self.has_ts_parser = _HAS_TS_PARSER
2337
self.parsers = {
2438
'python': Parser(Language(tspython.language())),
25-
'javascript': Parser(Language(tsjavascript.language())),
26-
'typescript': Parser(Language(tstypescript.language_typescript())),
27-
'tsx': Parser(Language(tstypescript.language_tsx())),
39+
'javascript': Parser(js_lang),
40+
'typescript': Parser(ts_lang),
41+
'tsx': Parser(tsx_lang),
2842
}
29-
logger.info("DependencyAnalyzer initialized")
43+
logger.info("DependencyAnalyzer initialized", ts_parser=self.has_ts_parser)
3044

3145
def _detect_language(self, file_path: str) -> str:
3246
"""Detect language from file extension"""

backend/tests/test_dependency_analyzer.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,23 @@ def test_ts_parser_is_not_js(self, analyzer):
103103
# They should be different Language objects
104104
assert ts_parser is not js_parser
105105

106+
def test_has_ts_parser_flag(self, analyzer):
107+
assert analyzer.has_ts_parser is True
108+
109+
def test_fallback_when_ts_parser_missing(self, monkeypatch, tmp_path):
110+
"""App must not crash if tree-sitter-typescript is missing"""
111+
import services.dependency_analyzer as mod
112+
monkeypatch.setattr(mod, '_HAS_TS_PARSER', False)
113+
from services.dependency_analyzer import DependencyAnalyzer
114+
fallback = DependencyAnalyzer()
115+
# Should initialize without error
116+
assert fallback.has_ts_parser is False
117+
# Should still parse TS files (using JS fallback)
118+
ts_file = tmp_path / "test.ts"
119+
ts_file.write_text('import { foo } from "./bar"')
120+
result = fallback.analyze_file_dependencies(str(ts_file))
121+
assert './bar' in result['imports']
122+
106123

107124
class TestLanguageDetection:
108125
"""Verify file extension to language mapping"""

0 commit comments

Comments
 (0)