Update: Function #65
This commit is contained in:
@@ -88,8 +88,11 @@ impl GenRust for FunctionDecl {
|
||||
param.gen_rust(ctx, cg);
|
||||
}
|
||||
|
||||
cg.add(") -> ");
|
||||
cg.add(&self.return_type.get_rust());
|
||||
cg.add(") ");
|
||||
if let Some(return_type) = &self.return_type {
|
||||
cg.add("-> ");
|
||||
cg.add(&return_type.get_rust());
|
||||
}
|
||||
|
||||
if let Some(body) = &self.body {
|
||||
cg.add(" ");
|
||||
@@ -254,7 +257,7 @@ impl GenRust for (&Vec<Spanned<FieldDeclStmt>>, &Spanned<ClassConstructor>) {
|
||||
name: Identifier(String::from("constructor")),
|
||||
generics: self.1.item.generics.clone(),
|
||||
params: ParamList(constructor_params),
|
||||
return_type: TypeExpr::Tuple(Vec::new()),
|
||||
return_type: Some(TypeExpr::Tuple(Vec::new())),
|
||||
body: Some(self.1.item.body.clone()),
|
||||
},
|
||||
}
|
||||
|
||||
@@ -97,7 +97,7 @@ pub struct FunctionDecl {
|
||||
pub name: Identifier,
|
||||
pub generics: GenericsDecl,
|
||||
pub params: ParamList,
|
||||
pub return_type: TypeExpr,
|
||||
pub return_type: Option<TypeExpr>,
|
||||
pub body: Option<Block>,
|
||||
}
|
||||
|
||||
|
||||
@@ -192,7 +192,7 @@ attributes = {
|
||||
// DECLARATION HELPERS
|
||||
// ======================================================
|
||||
var_decl = {
|
||||
"let" ~ WHITESPACE ~ pattern ~ type_expr?
|
||||
"let" ~ pattern ~ type_expr?
|
||||
}
|
||||
|
||||
field = {
|
||||
@@ -323,7 +323,7 @@ trait_decl = {
|
||||
// ======================================================
|
||||
|
||||
function_decl = {
|
||||
visibility? ~ type_expr ~ identifier ~ generics_decl? ~ "(" ~ method_args ~ ")" ~ (block | semicolon)
|
||||
visibility? ~ "fn" ~ identifier ~ generics_decl? ~ "(" ~ method_args ~ ")" ~ type_expr? ~ (block | semicolon)
|
||||
}
|
||||
|
||||
// ======================================================
|
||||
|
||||
@@ -13,7 +13,6 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for FunctionDecl {
|
||||
ast_ensure!(pair, Rule::function_decl => {
|
||||
let mut inner = pair.into_inner();
|
||||
let visibility = Visibility::try_from(&mut inner);
|
||||
let return_type = TypeExpr::try_from(inner.next().unwrap());
|
||||
let name = Identifier::try_from(inner.next().unwrap());
|
||||
|
||||
let generics = consume_rule(&mut inner, Rule::generics_decl)
|
||||
@@ -51,6 +50,10 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for FunctionDecl {
|
||||
})
|
||||
.unwrap_or_else(|| Ok(ParamList(self_param.into_iter().collect())));
|
||||
|
||||
let return_type = consume_rule(&mut inner, Rule::type_expr)
|
||||
.map(TypeExpr::try_from)
|
||||
.transpose();
|
||||
|
||||
let body = inner.next().map(Block::try_from).transpose();
|
||||
|
||||
ast_expr!(Self {
|
||||
|
||||
Reference in New Issue
Block a user