move macros to a separate crate

This commit is contained in:
Aleksey Kladov 2019-01-31 13:40:05 +03:00
parent 9a043a163c
commit ce3636798b
7 changed files with 50 additions and 23 deletions

8
Cargo.lock generated
View file

@ -940,6 +940,7 @@ dependencies = [
"parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
"ra_arena 0.1.0",
"ra_db 0.1.0",
"ra_macros 0.1.0",
"ra_syntax 0.1.0",
"relative-path 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
"rustc-hash 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
@ -1017,6 +1018,13 @@ dependencies = [
"walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "ra_macros"
version = "0.1.0"
dependencies = [
"smol_str 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "ra_syntax"
version = "0.1.0"

View file

@ -16,6 +16,7 @@ join_to_string = "0.1.3"
ra_syntax = { path = "../ra_syntax" }
ra_arena = { path = "../ra_arena" }
ra_db = { path = "../ra_db" }
ra_macros = { path = "../ra_macros" }
test_utils = { path = "../test_utils" }
[dev-dependencies]

View file

@ -1,8 +1,3 @@
#[allow(unused)]
mod tt;
#[allow(unused)]
mod mbe;
/// Machinery for macro expansion.
///
/// One of the more complicated things about macros is managing the source code
@ -19,6 +14,7 @@ use ra_syntax::{
SyntaxKind::*,
ast::{self, NameOwner},
};
use ra_macros::{tt, mbe};
use crate::{HirDatabase, MacroCallId};

View file

@ -0,0 +1,8 @@
[package]
edition = "2018"
name = "ra_macros"
version = "0.1.0"
authors = ["Aleksey Kladov <aleksey.kladov@gmail.com>"]
[dependencies]
smol_str = "0.1.9"

View file

@ -0,0 +1,14 @@
macro_rules! impl_froms {
($e:ident: $($v:ident), *) => {
$(
impl From<$v> for $e {
fn from(it: $v) -> $e {
$e::$v(it)
}
}
)*
}
}
pub mod tt;
pub mod mbe;

View file

@ -1,9 +1,9 @@
use ra_syntax::SmolStr;
use smol_str::SmolStr;
use crate::macros::tt::{self, Delimiter};
use crate::tt::{self, Delimiter};
#[derive(Debug)]
pub(crate) struct MacroRules {
pub struct MacroRules {
rules: Vec<Rule>,
}
@ -71,7 +71,7 @@ struct Var {
kind: Option<SmolStr>,
}
pub(crate) fn parse(tt: &tt::Subtree) -> Option<MacroRules> {
pub fn parse(tt: &tt::Subtree) -> Option<MacroRules> {
let mut parser = RulesParser::new(tt);
let mut rules = Vec::new();
while !parser.is_eof() {
@ -140,7 +140,7 @@ fn parse_var(p: &mut RulesParser) -> Option<Var> {
fn parse_repeat(p: &mut RulesParser) -> Option<Repeat> {
let subtree = p.eat_subtree().unwrap();
let subtree = parse_subtree(subtree)?;
let mut sep = p.eat_punct()?;
let sep = p.eat_punct()?;
let (separator, rep) = match sep.char {
'*' | '+' | '?' => (None, sep.char),
char => (Some(Punct { char }), p.eat_punct()?.char),

View file

@ -1,14 +1,14 @@
use ra_syntax::SmolStr;
use smol_str::SmolStr;
#[derive(Debug)]
pub(crate) enum TokenTree {
pub enum TokenTree {
Leaf(Leaf),
Subtree(Subtree),
}
impl_froms!(TokenTree: Leaf, Subtree);
#[derive(Debug)]
pub(crate) enum Leaf {
pub enum Leaf {
Literal(Literal),
Punct(Punct),
Ident(Ident),
@ -16,13 +16,13 @@ pub(crate) enum Leaf {
impl_froms!(Leaf: Literal, Punct, Ident);
#[derive(Debug)]
pub(crate) struct Subtree {
pub(crate) delimiter: Delimiter,
pub(crate) token_trees: Vec<TokenTree>,
pub struct Subtree {
pub delimiter: Delimiter,
pub token_trees: Vec<TokenTree>,
}
#[derive(Clone, Copy, Debug)]
pub(crate) enum Delimiter {
pub enum Delimiter {
Parenthesis,
Brace,
Bracket,
@ -30,16 +30,16 @@ pub(crate) enum Delimiter {
}
#[derive(Debug)]
pub(crate) struct Literal {
pub(crate) text: SmolStr,
pub struct Literal {
pub text: SmolStr,
}
#[derive(Debug)]
pub(crate) struct Punct {
pub(crate) char: char,
pub struct Punct {
pub char: char,
}
#[derive(Debug)]
pub(crate) struct Ident {
pub(crate) text: SmolStr,
pub struct Ident {
pub text: SmolStr,
}