knave 0.12.6

A Lisp programming language for humans and agents that infers types and ownership and compiles to readable Rust
Documentation
mod callee_parameters;
mod expressions;
mod fragment;
mod fresh_lifetimes;
mod function_borrow;
mod generic_callees;
mod generic_positions;
mod items;
mod let_annotation;
mod literal_generics;
mod local_closures;
mod locals;
pub(crate) use knave_expand::mangle;
mod method_elisions;
mod mutable_locals;
mod opaque_borrows;
mod open_literals;
mod operator;
mod plan;
mod problems;
mod result_borrows;
mod reused_locals;
mod runtime;
mod rust_fallback;
mod signature_borrows;
mod store_sites;
mod stored_arguments;
mod stored_functions;
mod structural_impls;
mod template;
mod type_anchor;
mod types;
mod unsized_parameters;
mod untied_borrows;
mod writer;

pub use writer::SpanMap;

use crate::diagnostic::Diagnostics;
use crate::source::Span;
use crate::types::TypedProgram;
use items::ItemEmitter;
use plan::EmitPlan;
use unsized_parameters::UnsizedParameters;
use writer::RustWriter;

pub struct EmittedCrate {
    pub code: String,
    pub span_map: SpanMap,
    pub names: Vec<(String, String)>,
    pub emission: EmissionWork,
    pub formatting: Option<FormattingWork>,
}

#[derive(Clone, Copy, Default)]
pub struct EmissionWork {
    pub emitted_expressions: usize,
}

#[derive(Clone, Copy)]
pub struct FormattingWork {
    pub scanned_tokens: usize,
}

pub struct RustEmitter;

impl RustEmitter {
    #[inline(never)]
    pub fn emit(program: &TypedProgram, entry: Span) -> Result<EmittedCrate, Diagnostics> {
        let plan = EmitPlan::build(program, entry)?;
        let unsized_parameters = UnsizedParameters::of(program, &plan);
        let mut items = ItemEmitter::new(program, &plan, &unsized_parameters);
        let fragments = items.crate_fragments();
        let emission = items.emission();
        let mut problems = Diagnostics::default();
        items
            .problems
            .into_iter()
            .for_each(|problem| problems.push(problem));
        let mut writer = RustWriter::default();
        writer.write(&fragments);
        let (code, span_map) = writer.finish();
        let mut names = items.names;
        names.extend(
            plan.rust_names()
                .map(|(rust, user)| (rust.to_string(), user.to_string())),
        );
        problems.into_result(EmittedCrate {
            code,
            span_map,
            names,
            emission,
            formatting: None,
        })
    }
}