Add macro call convention
This commit is contained in:
parent
67a5fcd002
commit
33ed1fd813
3
examples/macro_easy.reid
Normal file
3
examples/macro_easy.reid
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
fn main() -> u32 {
|
||||||
|
return test_macro!();
|
||||||
|
}
|
@ -159,7 +159,12 @@ impl BinaryOperator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct FunctionCallExpression(pub String, pub Vec<Expression>, pub TokenRange);
|
pub struct FunctionCallExpression {
|
||||||
|
pub name: String,
|
||||||
|
pub params: Vec<Expression>,
|
||||||
|
pub range: TokenRange,
|
||||||
|
pub is_macro: bool,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct IfExpression(
|
pub struct IfExpression(
|
||||||
|
@ -537,8 +537,20 @@ impl Parse for BinaryOperator {
|
|||||||
impl Parse for FunctionCallExpression {
|
impl Parse for FunctionCallExpression {
|
||||||
fn parse(mut stream: TokenStream) -> Result<Self, Error> {
|
fn parse(mut stream: TokenStream) -> Result<Self, Error> {
|
||||||
if let Some(Token::Identifier(name)) = stream.next() {
|
if let Some(Token::Identifier(name)) = stream.next() {
|
||||||
|
let is_macro = if let Some(Token::Exclamation) = stream.peek() {
|
||||||
|
stream.next(); // Consume !
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
};
|
||||||
|
|
||||||
let args = stream.parse::<FunctionArgs>()?;
|
let args = stream.parse::<FunctionArgs>()?;
|
||||||
Ok(FunctionCallExpression(name, args.0, stream.get_range().unwrap()))
|
Ok(FunctionCallExpression {
|
||||||
|
name,
|
||||||
|
params: args.0,
|
||||||
|
range: stream.get_range().unwrap(),
|
||||||
|
is_macro,
|
||||||
|
})
|
||||||
} else {
|
} else {
|
||||||
Err(stream.expected_err("identifier")?)
|
Err(stream.expected_err("identifier")?)
|
||||||
}
|
}
|
||||||
@ -894,11 +906,12 @@ impl Parse for DotIndexKind {
|
|||||||
stream.expect(Token::Dot)?;
|
stream.expect(Token::Dot)?;
|
||||||
if let Some(Token::Identifier(name)) = stream.next() {
|
if let Some(Token::Identifier(name)) = stream.next() {
|
||||||
if let Ok(args) = stream.parse::<FunctionArgs>() {
|
if let Ok(args) = stream.parse::<FunctionArgs>() {
|
||||||
Ok(Self::FunctionCall(FunctionCallExpression(
|
Ok(Self::FunctionCall(FunctionCallExpression {
|
||||||
name,
|
name,
|
||||||
args.0,
|
params: args.0,
|
||||||
stream.get_range_prev().unwrap(),
|
range: stream.get_range_prev().unwrap(),
|
||||||
)))
|
is_macro: false,
|
||||||
|
}))
|
||||||
} else {
|
} else {
|
||||||
Ok(Self::StructValueIndex(name))
|
Ok(Self::StructValueIndex(name))
|
||||||
}
|
}
|
||||||
|
@ -340,10 +340,11 @@ impl ast::Expression {
|
|||||||
mir::TypeKind::Vague(mir::VagueType::Unknown),
|
mir::TypeKind::Vague(mir::VagueType::Unknown),
|
||||||
),
|
),
|
||||||
ast::ExpressionKind::FunctionCall(fn_call_expr) => mir::ExprKind::FunctionCall(mir::FunctionCall {
|
ast::ExpressionKind::FunctionCall(fn_call_expr) => mir::ExprKind::FunctionCall(mir::FunctionCall {
|
||||||
name: fn_call_expr.0.clone(),
|
name: fn_call_expr.name.clone(),
|
||||||
return_type: mir::TypeKind::Vague(mir::VagueType::Unknown),
|
return_type: mir::TypeKind::Vague(mir::VagueType::Unknown),
|
||||||
parameters: fn_call_expr.1.iter().map(|e| e.process(module_id)).collect(),
|
parameters: fn_call_expr.params.iter().map(|e| e.process(module_id)).collect(),
|
||||||
meta: fn_call_expr.2.as_meta(module_id),
|
meta: fn_call_expr.range.as_meta(module_id),
|
||||||
|
is_macro: fn_call_expr.is_macro,
|
||||||
}),
|
}),
|
||||||
ast::ExpressionKind::BlockExpr(block) => mir::ExprKind::Block(block.into_mir(module_id)),
|
ast::ExpressionKind::BlockExpr(block) => mir::ExprKind::Block(block.into_mir(module_id)),
|
||||||
ast::ExpressionKind::IfExpr(if_expression) => {
|
ast::ExpressionKind::IfExpr(if_expression) => {
|
||||||
@ -427,14 +428,15 @@ impl ast::Expression {
|
|||||||
ast::ExpressionKind::AssociatedFunctionCall(ty, fn_call_expr) => mir::ExprKind::AssociatedFunctionCall(
|
ast::ExpressionKind::AssociatedFunctionCall(ty, fn_call_expr) => mir::ExprKind::AssociatedFunctionCall(
|
||||||
ty.0.into_mir(module_id),
|
ty.0.into_mir(module_id),
|
||||||
mir::FunctionCall {
|
mir::FunctionCall {
|
||||||
name: fn_call_expr.0.clone(),
|
name: fn_call_expr.name.clone(),
|
||||||
return_type: mir::TypeKind::Vague(mir::VagueType::Unknown),
|
return_type: mir::TypeKind::Vague(mir::VagueType::Unknown),
|
||||||
parameters: fn_call_expr.1.iter().map(|e| e.process(module_id)).collect(),
|
parameters: fn_call_expr.params.iter().map(|e| e.process(module_id)).collect(),
|
||||||
meta: fn_call_expr.2.as_meta(module_id),
|
meta: fn_call_expr.range.as_meta(module_id),
|
||||||
|
is_macro: fn_call_expr.is_macro,
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
ast::ExpressionKind::AccessCall(expression, fn_call_expr) => {
|
ast::ExpressionKind::AccessCall(expression, fn_call_expr) => {
|
||||||
let mut params: Vec<_> = fn_call_expr.1.iter().map(|e| e.process(module_id)).collect();
|
let mut params: Vec<_> = fn_call_expr.params.iter().map(|e| e.process(module_id)).collect();
|
||||||
params.insert(
|
params.insert(
|
||||||
0,
|
0,
|
||||||
mir::Expression(
|
mir::Expression(
|
||||||
@ -442,13 +444,18 @@ impl ast::Expression {
|
|||||||
expression.1.as_meta(module_id),
|
expression.1.as_meta(module_id),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
if fn_call_expr.is_macro {
|
||||||
|
panic!("Macros aren't supported as access-calls!");
|
||||||
|
};
|
||||||
|
|
||||||
mir::ExprKind::AssociatedFunctionCall(
|
mir::ExprKind::AssociatedFunctionCall(
|
||||||
mir::TypeKind::Vague(mir::VagueType::Unknown),
|
mir::TypeKind::Vague(mir::VagueType::Unknown),
|
||||||
mir::FunctionCall {
|
mir::FunctionCall {
|
||||||
name: fn_call_expr.0.clone(),
|
name: fn_call_expr.name.clone(),
|
||||||
return_type: mir::TypeKind::Vague(mir::VagueType::Unknown),
|
return_type: mir::TypeKind::Vague(mir::VagueType::Unknown),
|
||||||
parameters: params,
|
parameters: params,
|
||||||
meta: fn_call_expr.2.as_meta(module_id),
|
meta: fn_call_expr.range.as_meta(module_id),
|
||||||
|
is_macro: fn_call_expr.is_macro,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -16,13 +16,13 @@ pub struct MacroPass {
|
|||||||
macros: HashMap<String, Box<dyn MacroFunction>>,
|
macros: HashMap<String, Box<dyn MacroFunction>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
type LinkerPassState<'st, 'sc> = PassState<'st, 'sc, (), ErrorKind>;
|
type MacroPassState<'st, 'sc> = PassState<'st, 'sc, (), ErrorKind>;
|
||||||
|
|
||||||
impl Pass for MacroPass {
|
impl Pass for MacroPass {
|
||||||
type Data = ();
|
type Data = ();
|
||||||
type TError = ErrorKind;
|
type TError = ErrorKind;
|
||||||
|
|
||||||
fn expr(&mut self, expr: &mut super::Expression, state: PassState<Self::Data, Self::TError>) -> PassResult {
|
fn expr(&mut self, expr: &mut super::Expression, state: MacroPassState) -> PassResult {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -285,6 +285,7 @@ pub struct FunctionCall {
|
|||||||
pub name: String,
|
pub name: String,
|
||||||
pub return_type: TypeKind,
|
pub return_type: TypeKind,
|
||||||
pub parameters: Vec<Expression>,
|
pub parameters: Vec<Expression>,
|
||||||
|
pub is_macro: bool,
|
||||||
pub meta: Metadata,
|
pub meta: Metadata,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user