Skip to main content

clr_assembler/formats/msil/
mod.rs

1use gaia_types::Result;
2use oak_core::{source::ToSource, Builder, ParseSession};
3pub use oak_msil::{ast::*, builder::MsilBuilder, language::MsilLanguage, parser::MsilParser};
4
5/// MSIL format converter module.
6pub mod converter;
7
8/// MSIL read configuration options.
9#[derive(Debug, Clone, Copy, Default)]
10pub struct MsilReadConfig {
11    /// Whether to include debug information.
12    pub include_debug_info: bool,
13}
14
15/// Parses MSIL source code into an AST root.
16pub fn parse(source: &str) -> Result<MsilRoot> {
17    let language = MsilLanguage::default();
18    let builder = MsilBuilder::new(&language);
19    let mut session_cache = ParseSession::<MsilLanguage>::default();
20    let session = builder.build(source, &[], &mut session_cache);
21    if session.has_errors() {
22        return Err(gaia_types::GaiaError::custom_error("MSIL parse error"));
23    }
24    Ok(session.result.unwrap())
25}
26
27/// Converts an MSIL AST root to source code string.
28pub fn to_source(root: &MsilRoot) -> String {
29    root.to_source_string()
30}
31
32/// Converts a CLR program to MSIL source code string.
33pub fn program_to_source(program: &crate::program::ClrProgram) -> String {
34    let root = converter::ClrToMsilConverter::convert(program);
35    to_source(&root)
36}
37
38/// Converts an MSIL AST root to a formatted document string.
39pub fn to_doc(root: &MsilRoot) -> String {
40    use oak_pretty_print::{AsDocument, FormatConfig};
41    let doc = root.as_document();
42    let config = FormatConfig::default();
43    doc.render(config)
44}