use rustpython_parser::Parse;
use crate::error::{Error, Result};
use crate::ir::TaintGraph;
use crate::labels::LabelSet;
mod expr;
mod labels_default;
mod scope;
mod visitor;
use labels_default::{apply_labels, default_label_set};
use visitor::PythonParser;
pub fn parse_python_with_labels(
source: &str,
filename: &str,
labels: Option<&LabelSet>,
) -> Result<TaintGraph> {
let suite = rustpython_parser::ast::Suite::parse(source, filename)
.map_err(|e| Error::Analysis(e.to_string()))?;
let mut parser = PythonParser::new();
parser.parse_suite(&suite);
let mut graph = parser.into_graph();
let label_set = labels.map_or_else(default_label_set, Clone::clone);
apply_labels(&mut graph, &label_set);
graph.set_label_set(label_set);
Ok(graph)
}
pub fn parse_python(source: &str, filename: &str) -> Result<TaintGraph> {
parse_python_with_labels(source, filename, None)
}