diff --git a/cli/src/main.rs b/cli/src/main.rs index 0bbf6b25..c5c0e0e0 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -267,35 +267,7 @@ fn run() -> error::Result<()> { } else if let Some(matches) = matches.subcommand_matches("tags") { loader.find_all_languages(&config.parser_directories)?; let paths = collect_paths(matches.values_of("inputs").unwrap())?; - - let mut lang = None; - if let Some(scope) = matches.value_of("scope") { - lang = loader.language_configuration_for_scope(scope)?; - if lang.is_none() { - return Error::err(format!("Unknown scope '{}'", scope)); - } - } - - for path in paths { - let path = Path::new(&path); - let (language, language_config) = match lang { - Some(v) => v, - None => match loader.language_configuration_for_file_name(path)? { - Some(v) => v, - None => { - eprintln!("No language found for path {:?}", path); - continue; - } - }, - }; - - if let Some(tags_config) = language_config.tags_config(language)? { - let source = fs::read(path)?; - tags::generate_tags(tags_config, &source)?; - } else { - eprintln!("No tags config found for path {:?}", path); - } - } + tags::generate_tags(&loader, matches.value_of("scope"), &paths)?; } else if let Some(matches) = matches.subcommand_matches("highlight") { loader.configure_highlights(&config.theme.highlight_names); loader.find_all_languages(&config.parser_directories)?; diff --git a/cli/src/tags.rs b/cli/src/tags.rs index 23d448fc..8cf0d611 100644 --- a/cli/src/tags.rs +++ b/cli/src/tags.rs @@ -1,15 +1,45 @@ -use crate::error::Result; -use std::io; -use tree_sitter_tags::{TagsConfiguration, TagsContext}; +use super::loader::Loader; +use crate::error::{Error, Result}; +use std::fs; +use std::io::{self, Write}; +use std::path::Path; +use tree_sitter_tags::TagsContext; + +pub fn generate_tags(loader: &Loader, scope: Option<&str>, paths: &[String]) -> Result<()> { + let mut lang = None; + if let Some(scope) = scope { + lang = loader.language_configuration_for_scope(scope)?; + if lang.is_none() { + return Error::err(format!("Unknown scope '{}'", scope)); + } + } -pub fn generate_tags(config: &TagsConfiguration, source: &[u8]) -> Result<()> { let mut context = TagsContext::new(); - let stdout = io::stdout(); let mut stdout = stdout.lock(); - for tag in context.generate_tags(config, source) { - serde_json::to_writer(&mut stdout, &tag)?; + for path in paths { + let path = Path::new(&path); + let (language, language_config) = match lang { + Some(v) => v, + None => match loader.language_configuration_for_file_name(path)? { + Some(v) => v, + None => { + eprintln!("No language found for path {:?}", path); + continue; + } + }, + }; + + if let Some(tags_config) = language_config.tags_config(language)? { + let source = fs::read(path)?; + for tag in context.generate_tags(tags_config, &source) { + serde_json::to_writer(&mut stdout, &tag)?; + stdout.write(b"\n")?; + } + } else { + eprintln!("No tags config found for path {:?}", path); + } } Ok(()) diff --git a/tags/src/lib.rs b/tags/src/lib.rs index 0fb2d174..e90352a0 100644 --- a/tags/src/lib.rs +++ b/tags/src/lib.rs @@ -58,10 +58,10 @@ pub enum TagKind { #[derive(Debug, Serialize, Clone)] pub struct Tag<'a> { pub kind: TagKind, - pub loc: Loc, pub name: &'a str, - pub line: &'a str, pub docs: Option, + pub loc: Loc, + pub line: &'a str, } #[derive(Debug)]