Attribute AST

This commit is contained in:
2026-05-05 02:32:06 +02:00
parent 7b6638d274
commit 0af357df97
3 changed files with 51 additions and 18 deletions
+22 -5
View File
@@ -17,6 +17,27 @@ pub enum TypePostfix {
RefMut, RefMut,
} }
#[derive(Debug, Clone, Serialize)]
pub struct Attribute {
pub path: StaticPath,
pub args: Vec<AttributeArg>,
}
#[derive(Debug, Clone, Serialize)]
pub enum AttributeArg {
Named(String, Literal),
Positional(Literal),
}
#[derive(Debug, Clone, Serialize)]
pub enum Literal {
String(String),
Int(i64),
Float(f64),
Bool(bool),
Tuple(Vec<Expression>),
}
#[derive(Debug, Clone, Serialize)] #[derive(Debug, Clone, Serialize)]
pub enum TypeExprKind { pub enum TypeExprKind {
Path(StaticPath), Path(StaticPath),
@@ -137,12 +158,8 @@ pub struct ForStmt {
#[derive(Debug, Clone, Serialize)] #[derive(Debug, Clone, Serialize)]
pub enum Expression { pub enum Expression {
Literal(Literal),
Path(StaticPath), Path(StaticPath),
IntLiteral(i64),
FloatLiteral(f64),
BoolLiteral(bool),
StringLiteral(String),
TupleLiteral(Vec<Expression>),
Fix { Fix {
initial: Box<Expression>, initial: Box<Expression>,
prefixes: Vec<Prefix>, prefixes: Vec<Prefix>,
+13 -5
View File
@@ -293,11 +293,19 @@ impl From<pest::iterators::Pair<'_, Rule>> for Expression {
} }
Rule::primary => Expression::from(inner.next().unwrap()), Rule::primary => Expression::from(inner.next().unwrap()),
Rule::static_path => Expression::Path(StaticPath::from(pair)), Rule::static_path => Expression::Path(StaticPath::from(pair)),
Rule::integer => Expression::IntLiteral(pair.as_str().parse::<i64>().unwrap()), Rule::integer => {
Rule::float => Expression::FloatLiteral(pair.as_str().parse::<f64>().unwrap()), Expression::Literal(Literal::Int(pair.as_str().parse::<i64>().unwrap()))
Rule::boolean => Expression::BoolLiteral(pair.as_str().parse::<bool>().unwrap()), }
Rule::string_lit => Expression::StringLiteral(inner.as_str().to_string()), Rule::float => {
Rule::tuple => Expression::TupleLiteral(inner.map(Expression::from).collect()), Expression::Literal(Literal::Float(pair.as_str().parse::<f64>().unwrap()))
}
Rule::boolean => {
Expression::Literal(Literal::Bool(pair.as_str().parse::<bool>().unwrap()))
}
Rule::string_lit => Expression::Literal(Literal::String(inner.as_str().to_string())),
Rule::tuple => {
Expression::Literal(Literal::Tuple(inner.map(Expression::from).collect()))
}
_ => unimplemented!("{rule:#?}"), _ => unimplemented!("{rule:#?}"),
} }
} }
+16 -8
View File
@@ -1,5 +1,5 @@
use parser::ast::{ use parser::ast::{
BinaryOp, Block, Expression, IfStmt, Postfix, Prefix, Statement, StaticPath, TopLevel, BinaryOp, Block, Expression, IfStmt, Literal, Postfix, Prefix, Statement, StaticPath, TopLevel,
TypeExpr, TypeExprKind, TypePostfix, VarAssignStmt, VarDecl, VarDeclStmt, WhileStmt, TypeExpr, TypeExprKind, TypePostfix, VarAssignStmt, VarDecl, VarDeclStmt, WhileStmt,
}; };
@@ -105,15 +105,14 @@ impl GetRust for TypeExprKind {
} }
} }
impl GetRust for Expression { impl GetRust for Literal {
fn get_rust(&self) -> String { fn get_rust(&self) -> String {
match self { match self {
Expression::Path(path) => path.get_rust(), Self::Int(n) => n.to_string(),
Expression::IntLiteral(n) => n.to_string(), Self::Float(n) => format!("{n:?}"),
Expression::FloatLiteral(n) => format!("{n:?}"), Self::Bool(b) => b.to_string(),
Expression::BoolLiteral(b) => b.to_string(), Self::String(s) => format!("\"{s}\""),
Expression::StringLiteral(s) => format!("\"{s}\""), Self::Tuple(t) => {
Expression::TupleLiteral(t) => {
format!( format!(
"({})", "({})",
t.iter() t.iter()
@@ -122,6 +121,15 @@ impl GetRust for Expression {
.join(", ") .join(", ")
) )
} }
}
}
}
impl GetRust for Expression {
fn get_rust(&self) -> String {
match self {
Expression::Path(path) => path.get_rust(),
Expression::Literal(literal) => literal.get_rust(),
Expression::Fix { Expression::Fix {
initial, initial,
prefixes, prefixes,