Generating body

This commit is contained in:
2026-06-06 23:50:40 +02:00
parent 7229cfd9f5
commit 330beaea75
5 changed files with 82 additions and 10 deletions
+60 -1
View File
@@ -112,7 +112,66 @@ pub fn class_decl(
{ {
let body = method.item.body; let body = method.item.body;
method.item.body = Some(Block(Vec::new(), None)); method.item.body = Some(Block {
is_unsafe: false,
statements: Vec::new(),
soft_return: Some(Spanned {
line: 1,
column: 1,
item: Expression::Statement(Box::new(Statement::Block(Block {
is_unsafe: true,
statements: vec![Spanned {
line: 1,
column: 1,
item: Expression::Statement(Box::new(Statement::VarDecl(
VarDeclStmt {
decl: VarDecl {
name: Pattern::Path(
false,
Path(vec![Identifier(String::from("func_ptr"))]),
),
type_: None,
},
init: Some(Expression::Fix {
initial: Box::new(Expression::Path(ExprPath(vec![
ExprPathSegment {
ident: Identifier(String::from("self")),
generics: None,
},
]))),
prefixes: vec![Prefix::Deref],
postfixes: vec![
Postfix::FieldAccess(
Identifier(String::from("_m_oop")),
None,
),
Postfix::TupleFieldAccess(0, None),
Postfix::FieldAccess(
Identifier(String::from("add")),
None,
),
Postfix::Call(vec![Expression::Path(ExprPath(vec![
ExprPathSegment {
ident: Identifier(String::from("Self")),
generics: None,
},
ExprPathSegment {
ident: Identifier(format!(
"__FN_{}",
method.item.name.0.to_uppercase()
)),
generics: None,
},
]))]),
],
}),
},
))),
}],
soft_return: None,
}))),
}),
});
method.gen_rust(ctx, cg); method.gen_rust(ctx, cg);
method.item.body = body; method.item.body = body;
+6 -2
View File
@@ -6,16 +6,20 @@ use crate::{GenRust, GetRust, RustCodegen};
impl GenRust for Block { impl GenRust for Block {
fn gen_rust(&self, ctx: &mut Context, cg: &mut RustCodegen) { fn gen_rust(&self, ctx: &mut Context, cg: &mut RustCodegen) {
if self.is_unsafe {
cg.add("unsafe ");
}
cg.addln("{"); cg.addln("{");
cg.indent += 1; cg.indent += 1;
for stmt in &self.0 { for stmt in &self.statements {
ctx.expr_ensure_semicolon = true; ctx.expr_ensure_semicolon = true;
stmt.gen_rust(ctx, cg); stmt.gen_rust(ctx, cg);
cg.addln(""); cg.addln("");
} }
if let Some(soft_return) = &self.1 { if let Some(soft_return) = &self.soft_return {
ctx.expr_ensure_semicolon = false; ctx.expr_ensure_semicolon = false;
soft_return.gen_rust(ctx, cg); soft_return.gen_rust(ctx, cg);
cg.addln(""); cg.addln("");
+6 -4
View File
@@ -3,10 +3,12 @@ use serde::Serialize;
use super::*; use super::*;
#[derive(Debug, Clone, Serialize, Default)] #[derive(Debug, Clone, Serialize, Default)]
pub struct Block( pub struct Block {
pub Vec<Spanned<Expression>>, pub is_unsafe: bool,
pub Option<Spanned<Expression>>,
); pub statements: Vec<Spanned<Expression>>,
pub soft_return: Option<Spanned<Expression>>,
}
#[derive(Debug, Clone, Serialize)] #[derive(Debug, Clone, Serialize)]
pub enum StatementBody { pub enum StatementBody {
+3 -1
View File
@@ -63,6 +63,8 @@ static_path = {
identifier ~ ("::" ~ identifier)* identifier ~ ("::" ~ identifier)*
} }
unsafe_kw = { "unsafe" }
// ====================================================== // ======================================================
// PROGRAM // PROGRAM
// ====================================================== // ======================================================
@@ -340,7 +342,7 @@ top_level = {
// ====================================================== // ======================================================
block = { block = {
"{" ~ statement_list ~ expr? ~ "}" unsafe_kw? ~ "{" ~ statement_list ~ expr? ~ "}"
} }
statement_list = { statement_list = {
+7 -2
View File
@@ -2,7 +2,8 @@ use crate::{
Rule, Rule,
ast::*, ast::*,
ast_ensure, ast_expr, ast_ensure, ast_expr,
error::{AstError, IntoErr, collect_recovered}, error::{AstError, AstResult, IntoErr, collect_recovered},
parser::listen_rule,
}; };
impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for Block { impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for Block {
@@ -12,7 +13,11 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for Block {
let mut inner = pair.clone().into_inner(); let mut inner = pair.clone().into_inner();
ast_ensure!(pair, Rule::block => { ast_ensure!(pair, Rule::block => {
ast_expr!(Block(collect_recovered(inner.next().unwrap().into_inner()), inner.next().map(Spanned::try_from).transpose())) ast_expr!(Block {
is_unsafe: Ok(listen_rule(&mut inner, Rule::unsafe_kw)) as AstResult<bool>,
statements: collect_recovered(inner.next().unwrap().into_inner()),
soft_return: inner.next().map(Spanned::try_from).transpose(),
})
}) })
} }
} }