objective_rust_macros/
lib.rs

1mod codegen;
2mod error;
3mod parser;
4
5use {
6    error::*,
7    proc_macro::{Span, TokenStream},
8};
9
10#[proc_macro_attribute]
11pub fn objrs(_: TokenStream, src: TokenStream) -> TokenStream {
12    let tokens = src.into_iter().peekable();
13
14    match parser::parse_macro_input(tokens) {
15        Ok(output) => match codegen::generate(output) {
16            Ok(result) => result,
17            Err(err) => err.into(),
18        },
19        Err(err) => err.into(),
20    }
21}
22
23struct Class {
24    name: String,
25    methods: Vec<Function>,
26}
27impl Class {
28    pub fn new(name: String) -> Self {
29        Self {
30            name,
31            methods: Vec::new(),
32        }
33    }
34}
35struct Function {
36    name: String,
37    return_type: Option<Type>,
38    args: Vec<Argument>,
39    self_reference: SelfReference,
40    selector: Option<String>,
41}
42struct Argument {
43    name: String,
44    ty: Type,
45}
46enum Type {
47    Pointer(Mutability, Box<Self>, Span),
48    #[allow(dead_code)] // TODO: Support borrows. Need to think through safety.
49    Borrow(Mutability, Box<Self>, Span),
50    Absolute(String, Span),
51    Tuple(Vec<Self>, Span),
52}
53impl Type {
54    pub fn span(&self) -> Span {
55        match self {
56            Self::Pointer(_, _, span) => *span,
57            Self::Borrow(_, _, span) => *span,
58            Self::Absolute(_, span) => *span,
59            Self::Tuple(_, span) => *span,
60        }
61    }
62}
63enum Mutability {
64    Mut,
65    Immut,
66}
67#[derive(PartialEq)]
68enum SelfReference {
69    /// Static/class method
70    None,
71    /// &self
72    Immutable,
73    /// &mut self
74    Mutable,
75    /// self
76    Owned,
77}
78enum Attribute {
79    /// Sets the name objective-rust will use to find a method's selector.
80    Selector(String),
81}