Add a --dump-ts debug option

ida_star
Wilfred Hughes 2021-08-28 11:24:29 +07:00
parent 72640815b1
commit 2eb2f8b67d
3 changed files with 52 additions and 9 deletions

@ -62,7 +62,8 @@ delimiter over a delimiter that gave contiguous changes.
Removed the `--width` argument.
Added a debug option `--dump-syntax`.
Added debug options `--dump-syntax` and `--dump-ts` for viewing parse
trees. The output of these files may change without notice.
## 0.6

@ -39,6 +39,9 @@ enum Mode {
lhs_path: String,
rhs_path: String,
},
DumpTreeSitter {
path: String,
},
DumpSyntax {
path: String,
},
@ -53,17 +56,34 @@ fn parse_args() -> Mode {
.arg(Arg::with_name("dump-syntax").long("dump-syntax").help(
"Parse a single file with tree-sitter and display the difftastic syntax tree.",
))
.arg(Arg::with_name("dump-ts").long("dump-ts").help(
"Parse a single file with tree-sitter and display the tree-sitter parse tree.",
))
.arg(Arg::with_name("positional_args").multiple(true))
.setting(AppSettings::ArgRequiredElseHelp)
.get_matches();
let args: Vec<_> = matches.values_of_lossy("positional_args").unwrap();
if matches.is_present("dump-tree-sitter") {
if matches.is_present("dump-syntax") {
if args.len() == 1 {
return Mode::DumpSyntax {
path: args[0].clone(),
};
} else {
// TODO: delegate this parsing to clap.
panic!(
"Error: --dump-syntax takes one argument, but got: {}",
args.len()
);
}
}
if matches.is_present("dump-ts") {
if args.len() == 1 {
return Mode::DumpTreeSitter {
path: args[0].clone(),
};
} else {
// TODO: delegate this parsing to clap.
panic!(
@ -119,6 +139,22 @@ fn main() {
let mode = parse_args();
let (display_path, lhs_path, rhs_path) = match mode {
Mode::DumpTreeSitter { path } => {
let extension = Path::new(&path).extension();
let extension = extension.unwrap_or_else(|| OsStr::new(""));
match tsp::from_extension(extension) {
Some(ts_lang) => {
let bytes = read_or_die(&path);
let src = String::from_utf8_lossy(&bytes).to_string();
let tree = tsp::parse_to_tree(&src, &ts_lang);
println!("{:#?}", tree.root_node());
}
None => {
println!("No tree-sitter parser for extension: {:?}", extension);
}
}
return;
}
Mode::DumpSyntax { path } => {
let extension = Path::new(&path).extension();
let extension = extension.unwrap_or_else(|| OsStr::new(""));
@ -127,7 +163,7 @@ fn main() {
let bytes = read_or_die(&path);
let src = String::from_utf8_lossy(&bytes).to_string();
let ast = tsp::parse(&arena, &src, &ts_lang);
dbg!(ast);
println!("{:#?}", ast);
}
None => {
println!("No tree-sitter parser for extension: {:?}", extension);

@ -102,17 +102,23 @@ pub fn from_extension(extension: &OsStr) -> Option<TreeSitterConfig> {
}
}
pub fn parse<'a>(
arena: &'a Arena<Syntax<'a>>,
src: &str,
config: &TreeSitterConfig,
) -> Vec<&'a Syntax<'a>> {
/// Parse `src` with tree-sitter.
pub fn parse_to_tree(src: &str, config: &TreeSitterConfig) -> tree_sitter::Tree {
let mut parser = Parser::new();
parser
.set_language(config.language)
.expect("Incompatible tree-sitter version");
let tree = parser.parse(src, None).unwrap();
parser.parse(src, None).unwrap()
}
/// Parse `src` with tree-sitter and convert to difftastic Syntax.
pub fn parse<'a>(
arena: &'a Arena<Syntax<'a>>,
src: &str,
config: &TreeSitterConfig,
) -> Vec<&'a Syntax<'a>> {
let tree = parse_to_tree(src, config);
let nl_pos = NewlinePositions::from(src);
let mut cursor = tree.walk();