idk?
This commit is contained in:
parent
32b8e84891
commit
ae2cf5f9d3
3
Cargo.lock
generated
3
Cargo.lock
generated
|
|
@ -34,3 +34,6 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
|
|||
[[package]]
|
||||
name = "typeck"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"libcompiler",
|
||||
]
|
||||
|
|
|
|||
|
|
@ -587,4 +587,26 @@ mod display {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[repr(transparent)]
|
||||
pub struct Displayed<T: core::fmt::Display>(pub T);
|
||||
impl<T: core::fmt::Display> core::fmt::Debug for Displayed<T> {
|
||||
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
|
||||
write!(f, "{}", self.0)
|
||||
}
|
||||
}
|
||||
|
||||
pub trait DisplayedSliceExt {
|
||||
type Displayed: core::fmt::Debug;
|
||||
fn displayed(self) -> Self::Displayed;
|
||||
}
|
||||
|
||||
impl<'a, T: core::fmt::Display> DisplayedSliceExt for &'a [T] {
|
||||
type Displayed = &'a [Displayed<T>];
|
||||
fn displayed(self) -> Self::Displayed {
|
||||
unsafe { core::mem::transmute(self) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub use display::{Displayed, DisplayedSliceExt};
|
||||
|
|
|
|||
|
|
@ -62,6 +62,7 @@ section .text
|
|||
|
||||
;; rdi: pointer to buffer
|
||||
;; rsi: length of buffer
|
||||
;; define-fn: fn tokeniser_init_buf(buf: *const u8, buf_len: usize)
|
||||
tokeniser_init_buf:
|
||||
push rbp
|
||||
mov rbp, rsp
|
||||
|
|
|
|||
|
|
@ -4,3 +4,4 @@ version = "0.1.0"
|
|||
edition = "2024"
|
||||
|
||||
[dependencies]
|
||||
libcompiler = { path = "../libcompiler" }
|
||||
|
|
@ -1,14 +1,40 @@
|
|||
pub fn add(left: u64, right: u64) -> u64 {
|
||||
left + right
|
||||
fn init() {
|
||||
unsafe {
|
||||
libcompiler::ffi::bump_init();
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use libcompiler::ffi::Ast;
|
||||
|
||||
use crate::init;
|
||||
|
||||
#[test]
|
||||
fn it_works() {
|
||||
let result = add(2, 2);
|
||||
assert_eq!(result, 4);
|
||||
fn type_graph() {
|
||||
init();
|
||||
|
||||
let src = b"fn my-fun(a: u32, b: u32) -> void {
|
||||
let x: i64 = a as i64 + b as i64;
|
||||
}";
|
||||
unsafe {
|
||||
libcompiler::ffi::tokeniser_init_buf(src.as_ptr(), src.len());
|
||||
|
||||
let mut ast = Ast {
|
||||
nodes: libcompiler::vec::Vec::default(),
|
||||
};
|
||||
let func_id = libcompiler::ffi::parse_func(&mut ast);
|
||||
let mut symtable = core::mem::MaybeUninit::<libcompiler::ffi::SymbolTable>::uninit();
|
||||
libcompiler::ffi::ast_build_symtable(&mut ast, func_id, &mut symtable);
|
||||
let mut symtable = symtable.assume_init();
|
||||
|
||||
use libcompiler::DisplayedSliceExt;
|
||||
println!(
|
||||
"Symbol Table: {:#?}",
|
||||
symtable.symtable.as_slice().displayed()
|
||||
);
|
||||
|
||||
libcompiler::ffi::ast_resolve_var_refs(&mut ast, &mut symtable, func_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue