Skip to content

Commit

Permalink
Merge #59
Browse files Browse the repository at this point in the history
59: Moved TokenSet into it's own file. r=matklad a=Plasticcaz

As discussed in Issue #11, the only thing left in that issue that hasn't been fixed appears to be that TokenSet is not in it's own file. This pull request pulls TokenSet, it's macros and it's test into it's own file.

Co-authored-by: Zac Winter <plasticcaz@gmail.com>
  • Loading branch information
bors[bot] and Plasticcaz committed Sep 6, 2018
2 parents 751562d + 518cc87 commit ba7b3c2
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 37 deletions.
3 changes: 2 additions & 1 deletion crates/libsyntax2/src/grammar/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ mod type_params;
mod types;

use {
parser_api::{Marker, CompletedMarker, Parser, TokenSet},
token_set::TokenSet,
parser_api::{Marker, CompletedMarker, Parser},
SyntaxKind::{self, *},
};
pub(crate) use self::{
Expand Down
1 change: 1 addition & 0 deletions crates/libsyntax2/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ pub mod algo;
pub mod ast;
mod lexer;
#[macro_use]
mod token_set;
mod parser_api;
mod grammar;
mod parser_impl;
Expand Down
37 changes: 1 addition & 36 deletions crates/libsyntax2/src/parser_api.rs
Original file line number Diff line number Diff line change
@@ -1,45 +1,10 @@
use {
token_set::TokenSet,
parser_impl::ParserImpl,
SyntaxKind::{self, ERROR},
drop_bomb::DropBomb,
};

#[derive(Clone, Copy)]
pub(crate) struct TokenSet(pub(crate) u128);

fn mask(kind: SyntaxKind) -> u128 {
1u128 << (kind as usize)
}

impl TokenSet {
pub const EMPTY: TokenSet = TokenSet(0);

pub fn contains(&self, kind: SyntaxKind) -> bool {
self.0 & mask(kind) != 0
}
}

#[macro_export]
macro_rules! token_set {
($($t:ident),*) => { TokenSet($(1u128 << ($t as usize))|*) };
($($t:ident),* ,) => { token_set!($($t),*) };
}

#[macro_export]
macro_rules! token_set_union {
($($ts:expr),*) => { TokenSet($($ts.0)|*) };
($($ts:expr),* ,) => { token_set_union!($($ts),*) };
}

#[test]
fn token_set_works_for_tokens() {
use SyntaxKind::*;
let ts = token_set! { EOF, SHEBANG };
assert!(ts.contains(EOF));
assert!(ts.contains(SHEBANG));
assert!(!ts.contains(PLUS));
}

/// `Parser` struct provides the low-level API for
/// navigating through the stream of tokens and
/// constructing the parse tree. The actual parsing
Expand Down
37 changes: 37 additions & 0 deletions crates/libsyntax2/src/token_set.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
use SyntaxKind;

#[derive(Clone, Copy)]
pub(crate) struct TokenSet(pub(crate) u128);

fn mask(kind: SyntaxKind) -> u128 {
1u128 << (kind as usize)
}

impl TokenSet {
pub const EMPTY: TokenSet = TokenSet(0);

pub fn contains(&self, kind: SyntaxKind) -> bool {
self.0 & mask(kind) != 0
}
}

#[macro_export]
macro_rules! token_set {
($($t:ident),*) => { TokenSet($(1u128 << ($t as usize))|*) };
($($t:ident),* ,) => { token_set!($($t),*) };
}

#[macro_export]
macro_rules! token_set_union {
($($ts:expr),*) => { TokenSet($($ts.0)|*) };
($($ts:expr),* ,) => { token_set_union!($($ts),*) };
}

#[test]
fn token_set_works_for_tokens() {
use SyntaxKind::*;
let ts = token_set! { EOF, SHEBANG };
assert!(ts.contains(EOF));
assert!(ts.contains(SHEBANG));
assert!(!ts.contains(PLUS));
}

0 comments on commit ba7b3c2

Please sign in to comment.