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@@ -920,13 +926,17 @@
43 }
44
45 fn language_for_id(&self, id: usize) -> LoaderResult<Language> {
46- let (path, language, externals) = &self.languages_by_id[id];
47+ let LanguageEntry {
48+ path,
49+ language,
50+ external_files,
51+ } = &self.languages_by_id[id];
52 language
53 .get_or_try_init(|| {
54 let src_path = path.join("src");
55 self.load_language_at_path(CompileConfig::new(
56 &src_path,
57- externals.as_deref(),
58+ external_files.as_deref(),
59 None,
60 ))
61 })
62@@ -1532,10 +1542,9 @@
63 // Determine if a previous language configuration in this package.json file
64 // already uses the same language.
65 let mut language_id = None;
66- for (id, (path, _, _)) in
67- self.languages_by_id.iter().enumerate().skip(language_count)
68+ for (id, entry) in self.languages_by_id.iter().enumerate().skip(language_count)
69 {
70- if language_path == *path {
71+ if language_path == entry.path {
72 language_id = Some(id);
73 }
74 }
75--- a/tree-sitter/crates/loader/src/loader.rs
76+++ b/tree-sitter/crates/loader/src/loader.rs
77@@ -1553,10 +1553,10 @@
78 let language_id = if let Some(language_id) = language_id {
79 language_id
80 } else {
81- self.languages_by_id.push((
82- language_path,
83- OnceCell::new(),
84- grammar
85+ self.languages_by_id.push(LanguageEntry {
86+ path: language_path,
87+ language: OnceCell::new(),
88+ external_files: grammar
89 .external_files
90 .clone()
91 .into_vec()
92```
93
94## Cursor Position
95
96```tree-sitter/crates/loader/src/loader.rs
97 let language_id = if let Some(language_id) = language_id {
98 language_id
99 } else {
100 self.languages_by_id.push(LanguageEntry {
101 path: language_path,
102 language: OnceCell::new(),
103 external_files: grammar
104 .external_files
105 .clone()
106 .into_vec()
107 .map(|files| {
108 files
109 .into_iter()
110 .map(|path| {
111 let path = parser_path.join(path);
112 // prevent p being above/outside of parser_path
113 if path.starts_with(parser_path) {
114 Ok(path)
115 } else {
116 Err(LoaderError::ExternalFile(
117 path.to_string_lossy().to_string(),
118 parser_path.to_string_lossy().to_string(),
119 ))
120 }
121 })
122 .collect::<LoaderResult<Vec<_>>>()
123 })
124 .transpose()?,
125 // ^[CURSOR_POSITION]
126 ));
127 self.languages_by_id.len() - 1
128 };
129```
130
131## Expected Patch
132
133```diff
134--- a/tree-sitter/crates/loader/src/loader.rs
135+++ b/tree-sitter/crates/loader/src/loader.rs
136@@ -1578,7 +1578,7 @@
137 .collect::<LoaderResult<Vec<_>>>()
138 })
139 .transpose()?,
140- ));
141+ });
142 self.languages_by_id.len() - 1
143 };
144```