-
Notifications
You must be signed in to change notification settings - Fork 486
Expand file tree
/
Copy pathlanguages.ts
More file actions
123 lines (115 loc) · 3.07 KB
/
languages.ts
File metadata and controls
123 lines (115 loc) · 3.07 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
import * as fs from 'fs'
import * as path from 'path'
import Parser from 'tree-sitter'
import { Query } from 'tree-sitter'
import { DEBUG_PARSING } from './parse'
interface LanguageConfig {
language: any
extensions: string[]
packageName: string
queryFile: string
parser: Parser
query: Query
}
const languageConfigs: Omit<LanguageConfig, 'parser' | 'query' | 'language'>[] =
[
{
extensions: ['.ts'],
queryFile: 'tree-sitter-typescript-tags.scm',
packageName: 'tree-sitter-typescript',
},
{
extensions: ['.tsx'],
queryFile: 'tree-sitter-typescript-tags.scm',
packageName: 'tree-sitter-typescript',
},
{
extensions: ['.js', '.jsx'],
queryFile: 'tree-sitter-javascript-tags.scm',
packageName: 'tree-sitter-javascript',
},
{
extensions: ['.py'],
queryFile: 'tree-sitter-python-tags.scm',
packageName: 'tree-sitter-python',
},
{
extensions: ['.java'],
queryFile: 'tree-sitter-java-tags.scm',
packageName: 'tree-sitter-java',
},
{
extensions: ['.cs'],
queryFile: 'tree-sitter-c_sharp-tags.scm',
packageName: 'tree-sitter-c-sharp',
},
{
extensions: ['.c', '.h'],
queryFile: 'tree-sitter-c-tags.scm',
packageName: 'tree-sitter-c',
},
{
extensions: ['.cpp', '.hpp'],
queryFile: 'tree-sitter-cpp-tags.scm',
packageName: 'tree-sitter-cpp',
},
{
extensions: ['.rs'],
queryFile: 'tree-sitter-rust-tags.scm',
packageName: 'tree-sitter-rust',
},
{
extensions: ['.rb'],
queryFile: 'tree-sitter-ruby-tags.scm',
packageName: 'tree-sitter-ruby',
},
{
extensions: ['.go'],
queryFile: 'tree-sitter-go-tags.scm',
packageName: 'tree-sitter-go',
},
{
extensions: ['.php'],
queryFile: 'tree-sitter-php-tags.scm',
packageName: 'tree-sitter-php',
},
]
export async function getLanguageConfig(
filePath: string
): Promise<LanguageConfig | undefined> {
const extension = path.extname(filePath)
const config = languageConfigs.find((config) =>
config.extensions.includes(extension)
) as LanguageConfig | undefined
if (!config) return undefined
if (!config.parser) {
const parser = new Parser()
try {
const languageModule = await import(config.packageName)
const language =
extension === '.ts'
? languageModule.typescript
: extension === '.tsx'
? languageModule.tsx
: extension === '.php'
? languageModule.php
: languageModule
parser.setLanguage(language)
const queryFilePath = path.join(
__dirname,
'tree-sitter-queries',
config.queryFile
)
const queryString = fs.readFileSync(queryFilePath, 'utf8')
config.query = new Query(parser.getLanguage(), queryString)
config.parser = parser
config.language = language
} catch (e) {
if (DEBUG_PARSING) {
console.log('error', filePath, e)
}
return undefined
}
}
return config
}