objective_rust_macros/
lib.rs1mod 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)] 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 None,
71 Immutable,
73 Mutable,
75 Owned,
77}
78enum Attribute {
79 Selector(String),
81}