Compute byte ranges of comment and string nodes using tree-sitter.
(source: &str, language: Language)
| 209 | |
| 210 | /// Compute byte ranges of comment and string nodes using tree-sitter. |
| 211 | fn compute_non_code_ranges(source: &str, language: Language) -> Vec<(usize, usize)> { |
| 212 | use tree_sitter::StreamingIterator; |
| 213 | |
| 214 | let config = match queries::get_language_config(language) { |
| 215 | Some(c) => c, |
| 216 | None => return Vec::new(), |
| 217 | }; |
| 218 | |
| 219 | let mut parser = tree_sitter::Parser::new(); |
| 220 | if parser.set_language(&config.language).is_err() { |
| 221 | return Vec::new(); |
| 222 | } |
| 223 | |
| 224 | let tree = match parser.parse(source, None) { |
| 225 | Some(t) => t, |
| 226 | None => return Vec::new(), |
| 227 | }; |
| 228 | |
| 229 | // Query for comment and string nodes |
| 230 | let query_str = match language { |
| 231 | Language::Rust => r#" |
| 232 | (line_comment) @skip |
| 233 | (block_comment) @skip |
| 234 | (string_literal) @skip |
| 235 | (raw_string_literal) @skip |
| 236 | "#, |
| 237 | Language::Python => r#" |
| 238 | (comment) @skip |
| 239 | (string) @skip |
| 240 | "#, |
| 241 | Language::TypeScript | Language::JavaScript => r#" |
| 242 | (comment) @skip |
| 243 | (string) @skip |
| 244 | (template_string) @skip |
| 245 | "#, |
| 246 | Language::Go => r#" |
| 247 | (comment) @skip |
| 248 | (raw_string_literal) @skip |
| 249 | (interpreted_string_literal) @skip |
| 250 | "#, |
| 251 | Language::Java => r#" |
| 252 | (line_comment) @skip |
| 253 | (block_comment) @skip |
| 254 | (string_literal) @skip |
| 255 | "#, |
| 256 | Language::Scala => r#" |
| 257 | (comment) @skip |
| 258 | (block_comment) @skip |
| 259 | (string) @skip |
| 260 | (interpolated_string_expression) @skip |
| 261 | "#, |
| 262 | Language::Ruby => r#" |
| 263 | (comment) @skip |
| 264 | (string) @skip |
| 265 | (heredoc_body) @skip |
| 266 | (regex) @skip |
| 267 | "#, |
| 268 | Language::Php => r#" |
no test coverage detected