xrcf 0.8.0

eXtensible and Reusable Compiler Framework
Documentation
extern crate xrcf;

use indoc::indoc;
use std::panic::Location;
use xrcf::dialect::func::FuncOp;
use xrcf::ir::Op;
use xrcf::shared::SharedExt;
use xrcf::tester::DefaultTester;

#[test]
fn parse_module() {
    DefaultTester::init_tracing();
    let src = indoc! {"
    module {
        func.func @main() -> i64 {
            %0 = arith.constant 2 : i64
            return %0 : i64
        }
    }
    "};
    let (_module, actual) = DefaultTester::parse(src);
    DefaultTester::check_lines_contain(&actual, src, Location::caller());
}

#[test]
fn parse_addi() {
    DefaultTester::init_tracing();
    let src = indoc! {"
    func.func @test_addi(%arg0 : i64) -> i64 {
        %0 = arith.constant 1 : i64
        %1 = arith.constant 2 : i64
        %2 = arith.addi %0, %1 : i64
        %3 = arith.addi %arg0, %2 : i64
        return %3 : i64
    }
    "};
    let expected = indoc! {"
    module {
        func.func @test_addi(%arg0 : i64) -> i64 {
            %0 = arith.constant 1 : i64
            %1 = arith.constant 2 : i64
            %2 = arith.addi %0, %1 : i64
            %3 = arith.addi %arg0, %2 : i64
            return %3 : i64
        }
    }
    "};
    let (module, actual) = DefaultTester::parse(src);
    DefaultTester::verify(module.clone());

    assert!(module.rd().operation().rd().parent().is_none());

    let ops = module.rd().ops();
    assert_eq!(ops.len(), 1);
    let func_op = ops[0].rd();
    let func_operation = func_op.operation().rd();
    assert_eq!(func_operation.name(), FuncOp::operation_name());
    let func_parent = func_operation.parent();
    assert!(func_parent.is_some());

    let func_op = ops[0].clone();
    let func_op = func_op.rd();
    let func_parent = func_op.parent_op();
    assert!(func_parent.is_some());
    let func_parent = func_parent.unwrap();
    let func_parent = func_parent.rd();
    assert_eq!(func_parent.name().to_string(), "module");

    DefaultTester::check_lines_contain(&actual, expected, Location::caller());
}