@@ -57,7 +57,7 @@ impl Highlighter {
57
57
pub fn add_document ( & mut self , document : & Document ) {
58
58
let parser = self . get_or_create_parser ( document. language ( ) ) ;
59
59
60
- let tree = parser. and_then ( |p| p. parse ( document. text ( ) . slice ( .. ) . to_string ( ) , None ) ) ;
60
+ let tree = parser. and_then ( |p| p. parse ( document. text ( ) . to_string ( ) , None ) ) ;
61
61
62
62
let mut syntax = Syntax {
63
63
language : document. language ( ) ,
@@ -67,9 +67,12 @@ impl Highlighter {
67
67
} ;
68
68
69
69
if let Some ( ref tree) = syntax. tree {
70
+ // let mut file = std::fs::File::create("tree.sexp").unwrap();
71
+ // print_highlights_sexp(tree, document.language(), &document.text().to_string(), &mut file).unwrap();
72
+
70
73
let mut cursor = tree_sitter:: QueryCursor :: new ( ) ;
71
74
let root = tree. root_node ( ) ;
72
- let language = self . get_ts_language ( document. language ( ) ) . unwrap ( ) ;
75
+ let language = get_ts_language ( document. language ( ) ) . unwrap ( ) ;
73
76
74
77
let query = self . queries . entry ( document. language ( ) ) . or_insert (
75
78
tree_sitter:: Query :: new ( & language. into ( ) , & get_ts_query ( document. language ( ) ) . unwrap ( ) ) . unwrap ( ) ,
@@ -143,7 +146,7 @@ impl Highlighter {
143
146
return self . parsers . get_mut ( & language) ;
144
147
}
145
148
146
- if let Some ( ts_language) = self . get_ts_language ( language) {
149
+ if let Some ( ts_language) = get_ts_language ( language) {
147
150
let mut parser = Parser :: new ( ) ;
148
151
parser. set_language ( & ts_language. into ( ) ) . ok ( ) ;
149
152
self . parsers . insert ( language, parser) ;
@@ -152,20 +155,70 @@ impl Highlighter {
152
155
153
156
None
154
157
}
158
+ }
155
159
156
- fn get_ts_language ( & self , language : LanguageId ) -> Option < impl Into < Language > > {
157
- match language {
158
- LanguageId :: Rust => Some ( tree_sitter_rust:: LANGUAGE ) ,
159
- LanguageId :: Lua => Some ( tree_sitter_lua:: LANGUAGE ) ,
160
- _ => None ,
161
- }
160
+ fn get_ts_language ( language : LanguageId ) -> Option < impl Into < Language > > {
161
+ match language {
162
+ LanguageId :: Rust => Some ( tree_sitter_rust:: LANGUAGE ) ,
163
+ LanguageId :: Lua => Some ( tree_sitter_lua:: LANGUAGE ) ,
164
+ _ => None ,
162
165
}
163
166
}
164
167
165
168
fn get_ts_query ( language : LanguageId ) -> Option < String > {
166
169
match language {
167
- LanguageId :: Rust => Some ( tree_sitter_rust:: HIGHLIGHTS_QUERY . to_string ( ) ) ,
170
+ LanguageId :: Rust => {
171
+ let highlights = include_str ! ( "../../languages/queries/rust/highlights.scm" ) ;
172
+ Some ( highlights. to_string ( ) )
173
+ }
168
174
LanguageId :: Lua => Some ( tree_sitter_lua:: HIGHLIGHTS_QUERY . to_string ( ) ) ,
169
175
_ => None ,
170
176
}
171
177
}
178
+
179
+ // fn print_highlights_sexp<W: std::io::Write>(
180
+ // tree: &Tree,
181
+ // language_id: LanguageId,
182
+ // source_code: &str,
183
+ // writer: &mut W,
184
+ // ) -> std::io::Result<()> {
185
+ // let Some(language) = get_ts_language(language_id) else {
186
+ // return Ok(());
187
+ // };
188
+ //
189
+ // let Some(query) = get_ts_query(language_id) else {
190
+ // return Ok(());
191
+ // };
192
+ //
193
+ // let Ok(query) = tree_sitter::Query::new(&language.into(), &query) else {
194
+ // return Ok(());
195
+ // };
196
+ //
197
+ // let mut query_cursor = tree_sitter::QueryCursor::new();
198
+ // let mut matches = query_cursor.matches(&query, tree.root_node(), source_code.as_bytes());
199
+ //
200
+ // let mut nodes_with_captures = Vec::new();
201
+ // while let Some(match_) = matches.next() {
202
+ // for capture in match_.captures {
203
+ // let node = capture.node;
204
+ // let capture_name = &query.capture_names()[capture.index as usize];
205
+ // nodes_with_captures.push((node, capture_name));
206
+ // }
207
+ // }
208
+ //
209
+ // nodes_with_captures.sort_by_key(|(node, _)| (node.start_position(), node.end_position()));
210
+ //
211
+ // for (node, capture_name) in nodes_with_captures {
212
+ // let text = &source_code[node.start_byte()..node.end_byte()];
213
+ // writeln!(
214
+ // writer,
215
+ // "({} \"{}\" @{})",
216
+ // node.kind(),
217
+ // text.replace('"', "\\\""),
218
+ // capture_name
219
+ // )?;
220
+ // //writeln!(writer, "@{}", capture_name)?;
221
+ // }
222
+ //
223
+ // Ok(())
224
+ // }
0 commit comments