tree-sitter--tuple-to-struct-destructuring.md

  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```