1+++
2repository_url = "git@github.com:tree-sitter/tree-sitter"
3revision = "24007727d42b4caceda3095ac685c463fae1ba1a"
4+++
5
6## Edit History
7
8```diff
9--- a/tree-sitter/crates/loader/src/loader.rs
10+++ b/tree-sitter/crates/loader/src/loader.rs
11@@ -604,7 +604,7 @@
12
13 pub struct Loader {
14 pub parser_lib_path: PathBuf,
15- languages_by_id: Vec<(PathBuf, OnceCell<Language>, Option<Vec<PathBuf>>)>,
16+ languages_by_id: Vec<LanguageEntry>,
17 language_configurations: Vec<LanguageConfiguration<'static>>,
18 language_configuration_ids_by_file_type: HashMap<String, Vec<usize>>,
19 language_configuration_in_current_path: Option<usize>,
20@@ -619,6 +619,12 @@
21
22 #[cfg(feature = "wasm")]
23 wasm_store: Mutex<Option<tree_sitter::WasmStore>>,
24 }
25+
26+struct LanguageEntry {
27+ path: PathBuf,
28+ language: OnceCell<Language>,
29+ external_files: Option<Vec<PathBuf>>,
30+}
31
32 pub struct CompileConfig<'a> {
33@@ -767,7 +773,7 @@
34 pub fn get_all_language_configurations(&self) -> Vec<(&LanguageConfiguration, &Path)> {
35 self.language_configurations
36 .iter()
37- .map(|c| (c, self.languages_by_id[c.language_id].0.as_ref()))
38+ .map(|c| (c, self.languages_by_id[c.language_id].path.as_ref()))
39 .collect()
40 }
41
42```
43
44## Cursor Position
45
46```tree-sitter/crates/loader/src/loader.rs
47 fn language_for_id(&self, id: usize) -> LoaderResult<Language> {
48 let (path, language, externals) = &self.languages_by_id[id];
49 // ^[CURSOR_POSITION]
50 language
51 .get_or_try_init(|| {
52 let src_path = path.join("src");
53 self.load_language_at_path(CompileConfig::new(
54 &src_path,
55 externals.as_deref(),
56 None,
57 ))
58 })
59 .cloned()
60 }
61```
62
63## Expected Patch
64
65```diff
66--- a/tree-sitter/crates/loader/src/loader.rs
67+++ b/tree-sitter/crates/loader/src/loader.rs
68@@ -926,7 +926,11 @@
69 }
70
71 fn language_for_id(&self, id: usize) -> LoaderResult<Language> {
72- let (path, language, externals) = &self.languages_by_id[id];
73+ let LanguageEntry {
74+ path,
75+ language,
76+ external_files,
77+ } = &self.languages_by_id[id];
78 language
79 .get_or_try_init(|| {
80 let src_path = path.join("src");
81 self.load_language_at_path(CompileConfig::new(
82 &src_path,
83- externals.as_deref(),
84+ external_files.as_deref(),
85 None,
86 ))
87 })
88 .cloned()
89```
90
91```diff
92--- a/tree-sitter/crates/loader/src/loader.rs
93+++ b/tree-sitter/crates/loader/src/loader.rs
94@@ -926,7 +926,11 @@
95 }
96
97 fn language_for_id(&self, id: usize) -> LoaderResult<Language> {
98- let (path, language, externals) = &self.languages_by_id[id];
99+ let LanguageEntry {
100+ path,
101+ language,
102+ external_files: externals,
103+ } = &self.languages_by_id[id];
104 language
105 .get_or_try_init(|| {
106 let src_path = path.join("src");
107```
108
109```diff
110--- a/tree-sitter/crates/loader/src/loader.rs
111+++ b/tree-sitter/crates/loader/src/loader.rs
112@@ -926,13 +926,14 @@
113 }
114
115 fn language_for_id(&self, id: usize) -> LoaderResult<Language> {
116- let (path, language, externals) = &self.languages_by_id[id];
117- language
118+ let entry = &self.languages_by_id[id];
119+ entry
120+ .language
121 .get_or_try_init(|| {
122- let src_path = path.join("src");
123+ let src_path = entry.path.join("src");
124 self.load_language_at_path(CompileConfig::new(
125 &src_path,
126- externals.as_deref(),
127+ entry.external_files.as_deref(),
128 None,
129 ))
130 })
131```
132
133```diff
134--- a/tree-sitter/crates/loader/src/loader.rs
135+++ b/tree-sitter/crates/loader/src/loader.rs
136@@ -926,0 +926,0 @@
137 }
138
139 fn language_for_id(&self, id: usize) -> LoaderResult<Language> {
140- let (path, language, externals) = &self.languages_by_id[id];
141+ let LanguageEntry { path, language, external_files } = &self.languages_by_id[id];
142 language
143 .get_or_try_init(|| {
144 let src_path = path.join("src");
145 self.load_language_at_path(CompileConfig::new(
146 &src_path,
147- externals.as_deref(),
148+ external_files.as_deref(),
149 None,
150 ))
151 })
152 .cloned()
153```