tree-sitter--tuple-to-struct-for-loop.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@@ -920,7 +926,11 @@
 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```
 56
 57## Cursor Position
 58
 59```tree-sitter/crates/loader/src/loader.rs
 60                    let mut language_id = None;
 61                    for (id, (path, _, _)) in
 62                    //       ^[CURSOR_POSITION]
 63                        self.languages_by_id.iter().enumerate().skip(language_count)
 64                    {
 65                        if language_path == *path {
 66                            language_id = Some(id);
 67                        }
 68                    }
 69```
 70
 71## Expected Patch
 72
 73```diff
 74--- a/tree-sitter/crates/loader/src/loader.rs
 75+++ b/tree-sitter/crates/loader/src/loader.rs
 76@@ -1542,8 +1542,7 @@
 77                     // Determine if a previous language configuration in this package.json file
 78                     // already uses the same language.
 79                     let mut language_id = None;
 80-                    for (id, (path, _, _)) in
 81-                        self.languages_by_id.iter().enumerate().skip(language_count)
 82+                    for (id, entry) in self.languages_by_id.iter().enumerate().skip(language_count)
 83                     {
 84-                        if language_path == *path {
 85+                        if language_path == entry.path {
 86                             language_id = Some(id);
 87                         }
 88                     }
 89```
 90
 91```diff
 92--- a/tree-sitter/crates/loader/src/loader.rs
 93+++ b/tree-sitter/crates/loader/src/loader.rs
 94@@ -1542,8 +1542,7 @@
 95                     // Determine if a previous language configuration in this package.json file
 96                     // already uses the same language.
 97                     let mut language_id = None;
 98-                    for (id, (path, _, _)) in
 99+                    for (id, LanguageEntry { path, .. }) in
100                         self.languages_by_id.iter().enumerate().skip(language_count)
101                     {
102                         if language_path == *path {
103                             language_id = Some(id);
104                         }
105                     }
106```