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 { ...@@ -115,10 +115,11 @@ pub enum IpTo {
} }
/// `$($Ident: Ident ($Ty) -> $Ty )*` /// `$($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,)*` /// `$($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! { .. }` /// `cro! { .. }`
#[derive(Debug)] #[derive(Debug)]
......
...@@ -498,6 +498,7 @@ fn ips(tts: &mut Peekable<Iter<TokenTree>>) -> Result<Ips> { ...@@ -498,6 +498,7 @@ fn ips(tts: &mut Peekable<Iter<TokenTree>>) -> Result<Ips> {
let mut ty_arg = None; let mut ty_arg = None;
let mut ty_ret = syn::parse_type(&"()")?; let mut ty_ret = syn::parse_type(&"()")?;
let mut op_sync = None;
let _ = ::parse::delimited(&mut tts, DelimToken::Brace, |tts| { let _ = ::parse::delimited(&mut tts, DelimToken::Brace, |tts| {
fields(&tts, |key, mut tts| { fields(&tts, |key, mut tts| {
match key.as_ref() { match key.as_ref() {
...@@ -524,7 +525,22 @@ fn ips(tts: &mut Peekable<Iter<TokenTree>>) -> Result<Ips> { ...@@ -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" => (), "async" => (),
_ => bail!("unknown field: `{}`", key), _ => bail!("unknown field: `{}`", key),
}; };
...@@ -539,7 +555,7 @@ fn ips(tts: &mut Peekable<Iter<TokenTree>>) -> Result<Ips> { ...@@ -539,7 +555,7 @@ fn ips(tts: &mut Peekable<Iter<TokenTree>>) -> Result<Ips> {
_ => bail!("expected Comma, found {:?}", tt), _ => 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) Ok(ips)
...@@ -570,20 +586,41 @@ fn ops(tts: &mut Peekable<Iter<TokenTree>>) -> Result<Ops> { ...@@ -570,20 +586,41 @@ fn ops(tts: &mut Peekable<Iter<TokenTree>>) -> Result<Ops> {
bail!("expected Colon, found {:?}", tt); bail!("expected Colon, found {:?}", tt);
} }
let ty = ::parse::ty(&TokenTree::Token(Token::Eq), &mut tts) let tt = tts.next();
.chain_err(|| format!("parsing `type` for {:?}", ident))?; if let Some(&TokenTree::Token(Token::Ident(ref id))) = tt {
ensure!(id.as_ref() == "fn", "expected `fn` Ident, found {:?}", tt);
} else {
let expr = ::parse::expr(&TokenTree::Token(Token::Lt), &mut tts) bail!("expected `fn` Ident, found {:?}", tt);
.chain_err(|| format!("parsing `type` for {:?}", ident))?; }
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(); 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) Ok(ops)
}) })
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment