68 lines
2.5 KiB
Rust
Raw Normal View History

//! Applies structured search replace rules from the command line.
use crate::cli::{
load_cargo::{load_cargo, LoadCargoConfig},
Result,
};
2020-08-13 16:45:10 +02:00
use ssr::{MatchFinder, SsrPattern, SsrRule};
pub fn apply_ssr_rules(rules: Vec<SsrRule>) -> Result<()> {
2020-10-24 11:39:57 +03:00
use ide_db::base_db::SourceDatabaseExt;
let load_cargo_config = LoadCargoConfig {
cargo_config: Default::default(),
load_out_dirs_from_check: true,
with_proc_macro: true,
};
let (host, vfs) = load_cargo(&std::env::current_dir()?, &load_cargo_config)?;
let db = host.raw_database();
let mut match_finder = MatchFinder::at_first_file(db)?;
for rule in rules {
match_finder.add_rule(rule)?;
}
let edits = match_finder.edits();
for (file_id, edit) in edits {
2021-01-14 18:35:22 +01:00
if let Some(path) = vfs.file_path(file_id).as_path() {
let mut contents = db.file_text(file_id).to_string();
edit.apply(&mut contents);
std::fs::write(path, contents)?;
}
}
Ok(())
}
2020-06-30 15:55:20 +10:00
/// Searches for `patterns`, printing debug information for any nodes whose text exactly matches
/// `debug_snippet`. This is intended for debugging and probably isn't in it's current form useful
/// for much else.
pub fn search_for_patterns(patterns: Vec<SsrPattern>, debug_snippet: Option<String>) -> Result<()> {
2020-10-24 11:39:57 +03:00
use ide_db::base_db::SourceDatabaseExt;
2020-08-13 16:39:16 +02:00
use ide_db::symbol_index::SymbolsDatabase;
let load_cargo_config = LoadCargoConfig {
cargo_config: Default::default(),
load_out_dirs_from_check: true,
with_proc_macro: true,
};
let (host, _vfs) = load_cargo(&std::env::current_dir()?, &load_cargo_config)?;
2020-06-30 15:55:20 +10:00
let db = host.raw_database();
let mut match_finder = MatchFinder::at_first_file(db)?;
2020-06-30 15:55:20 +10:00
for pattern in patterns {
match_finder.add_search_pattern(pattern)?;
2020-06-30 15:55:20 +10:00
}
if let Some(debug_snippet) = &debug_snippet {
for &root in db.local_roots().iter() {
let sr = db.source_root(root);
for file_id in sr.iter() {
2020-06-30 15:55:20 +10:00
for debug_info in match_finder.debug_where_text_equal(file_id, debug_snippet) {
println!("{:#?}", debug_info);
}
}
}
} else {
for m in match_finder.matches().flattened().matches {
// We could possibly at some point do something more useful than just printing
// the matched text. For now though, that's the easiest thing to do.
println!("{}", m.matched_text());
}
2020-06-30 15:55:20 +10:00
}
Ok(())
}