Skip to content
Snippets Groups Projects
Commit aa372b23 authored by Per Lindgren's avatar Per Lindgren
Browse files

parse fn

parent 5dc775d9
No related branches found
No related tags found
No related merge requests found
......@@ -115,10 +115,11 @@ pub enum IpTo {
}
/// `$($Ident: Ident ($Ty) -> $Ty )*`
pub type Ips = HashMap<Ident, (Option<Ty>, Ty)>;
pub type Ips = HashMap<Ident, (Option<Ty>, Ty, Option<Resources>)>;
/// `$($Ident: $Ty = $Expr < $Path,)*`
pub type Ops = HashMap<Ident, (Ty, Expr, Path)>;
//pub type Ops = HashMap<Ident, (Ty, Expr, Path)>;
pub type Ops = HashMap<Ident, (Option<Ty>, Ty)>;
/// `cro! { .. }`
#[derive(Debug)]
......
......@@ -498,6 +498,7 @@ fn ips(tts: &mut Peekable<Iter<TokenTree>>) -> Result<Ips> {
let mut ty_arg = None;
let mut ty_ret = syn::parse_type(&"()")?;
let mut op_sync = None;
let _ = ::parse::delimited(&mut tts, DelimToken::Brace, |tts| {
fields(&tts, |key, mut tts| {
match key.as_ref() {
......@@ -524,7 +525,22 @@ fn ips(tts: &mut Peekable<Iter<TokenTree>>) -> Result<Ips> {
};
}
"sync" => (),
"sync" => {
op_sync = Some(::parse::resources(&mut tts)?);
// let sync =
// Some(::parse::delimited(&mut tts, DelimToken::Bracket, |tts| {
// let mut tts = tts.iter().peekable();
// let mut idents = Vec::new();
// while let Some(tt) = tts.next() {
// if tts.peek().is_none() {
// break;
// }
// }
// Ok(())
// }));
}
"async" => (),
_ => bail!("unknown field: `{}`", key),
};
......@@ -539,7 +555,7 @@ fn ips(tts: &mut Peekable<Iter<TokenTree>>) -> Result<Ips> {
_ => bail!("expected Comma, found {:?}", tt),
}
ips.insert(ident.clone(), (ty_arg, ty_ret));
ips.insert(ident.clone(), (ty_arg, ty_ret, op_sync));
}
Ok(ips)
......@@ -570,20 +586,41 @@ fn ops(tts: &mut Peekable<Iter<TokenTree>>) -> Result<Ops> {
bail!("expected Colon, found {:?}", tt);
}
let ty = ::parse::ty(&TokenTree::Token(Token::Eq), &mut tts)
.chain_err(|| format!("parsing `type` for {:?}", ident))?;
let expr = ::parse::expr(&TokenTree::Token(Token::Lt), &mut tts)
.chain_err(|| format!("parsing `type` for {:?}", ident))?;
let tt = tts.next();
if let Some(&TokenTree::Token(Token::Ident(ref id))) = tt {
ensure!(id.as_ref() == "fn", "expected `fn` Ident, found {:?}", tt);
} else {
bail!("expected `fn` Ident, found {:?}", tt);
}
let ty_arg = Some(::parse::delimited(
&mut tts,
DelimToken::Paren,
|tts| if tts.is_empty() {
Ok(Ty::Tup(vec![]))
} else {
Ok(syn::parse_type(&format!("{}", quote!(#(#tts)*)))?)
},
)?);
let path = ::parse::path(&mut tts).chain_err(|| "parsing `path`")?;
let tt = tts.peek().cloned();
let ty_ret: Result<Ty> = match tt {
Some(&TokenTree::Token(Token::Comma)) => Ok(syn::parse_type(&"()")?),
Some(&TokenTree::Token(Token::RArrow)) => {
tts.next();
::parse::ty(&TokenTree::Token(Token::Comma), &mut tts)
}
_ => bail!("expected `-> Type,' or `,` found {:?}", tt),
};
let tt = tts.next();
match tt {
None |
Some(&TokenTree::Token(Token::Comma)) => {}
_ => bail!("expected Comma, found {:?}", tt),
}
ops.insert(ident.clone(), (ty, expr, path));
ops.insert(ident.clone(), (ty_arg, ty_ret?));
}
Ok(ops)
})
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment