tree-sitter--tuple-to-struct-literal.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,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```