-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathlanguages.py
More file actions
126 lines (97 loc) · 2.72 KB
/
languages.py
File metadata and controls
126 lines (97 loc) · 2.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
"""
Language detection and parser management for tree-sitter.
"""
import os
from typing import Dict, Optional
from tree_sitter import Language, Parser
from tree_sitter_language_pack import get_language, get_parser
# Supported languages mapping
LANGUAGE_EXTENSIONS = {
'.py': 'python',
'.js': 'javascript',
'.jsx': 'javascript',
'.ts': 'typescript',
'.tsx': 'typescript',
'.go': 'go',
'.rs': 'rust',
'.java': 'java',
'.c': 'c',
'.cpp': 'cpp',
'.cc': 'cpp',
'.cxx': 'cpp',
'.cs': 'c_sharp',
'.rb': 'ruby',
'.php': 'php',
'.swift': 'swift',
'.kt': 'kotlin',
'.scala': 'scala',
}
# Language aliases for consistency
LANGUAGE_ALIASES = {
'js': 'javascript',
'ts': 'typescript',
'py': 'python',
'rb': 'ruby',
'c++': 'cpp',
'csharp': 'c_sharp',
}
def get_language_for_file(file_path: str) -> str:
"""
Determine the programming language from file extension.
Args:
file_path: Path to the source file
Returns:
Language name or 'text' if unsupported
"""
if not file_path:
return 'text'
ext = os.path.splitext(file_path)[1].lower()
return LANGUAGE_EXTENSIONS.get(ext, 'text')
def normalize_language(language: str) -> str:
"""
Normalize language name using aliases.
Args:
language: Language name or alias
Returns:
Normalized language name
"""
return LANGUAGE_ALIASES.get(language.lower(), language.lower())
def get_tree_sitter_parser(language: str) -> Optional[Parser]:
"""
Get a tree-sitter parser for the specified language.
Args:
language: Programming language name
Returns:
Parser instance or None if unsupported
"""
normalized_lang = normalize_language(language)
if normalized_lang == 'text':
return None
try:
return get_parser(normalized_lang)
except Exception:
return None
def get_tree_sitter_language(language: str) -> Optional[Language]:
"""
Get a tree-sitter language for queries.
Args:
language: Programming language name
Returns:
Language instance or None if unsupported
"""
normalized_lang = normalize_language(language)
if normalized_lang == 'text':
return None
try:
return get_language(normalized_lang)
except Exception:
return None
def is_language_supported(language: str) -> bool:
"""
Check if a language is supported by tree-sitter.
Args:
language: Programming language name
Returns:
True if supported, False otherwise
"""
return get_tree_sitter_parser(language) is not None