1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
use crate::ast;
use crate::error::ParseError;
use crate::parser::Parser;
use crate::token::{Kind, Token};
use crate::traits::{Parse, Peek};
use runestick::unit::Span;
#[derive(Debug, Clone)]
pub struct DeclFn {
pub async_: Option<ast::Async>,
pub fn_: ast::Fn,
pub name: ast::Ident,
pub args: ast::Parenthesized<ast::FnArg, ast::Comma>,
pub body: ast::ExprBlock,
}
impl DeclFn {
pub fn span(&self) -> Span {
self.fn_.span().join(self.body.span())
}
pub fn is_instance(&self) -> bool {
match self.args.items.iter().next() {
Some((ast::FnArg::Self_(..), _)) => true,
_ => false,
}
}
}
impl Peek for DeclFn {
fn peek(t1: Option<Token>, _: Option<Token>) -> bool {
matches!(t1, Some(Token { kind: Kind::Fn, .. }))
}
}
impl Parse for DeclFn {
fn parse(parser: &mut Parser<'_>) -> Result<Self, ParseError> {
Ok(Self {
async_: parser.parse()?,
fn_: parser.parse()?,
name: parser.parse()?,
args: parser.parse()?,
body: parser.parse()?,
})
}
}