Skip to content

⬆️ Rust #5899

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Aug 27, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion crates/parser/src/grammar/expressions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -316,7 +316,7 @@ fn expr_bp(p: &mut Parser, mut r: Restrictions, bp: u8) -> (Option<CompletedMark
}

const LHS_FIRST: TokenSet =
atom::ATOM_EXPR_FIRST.union(token_set![T![&], T![*], T![!], T![.], T![-]]);
atom::ATOM_EXPR_FIRST.union(TokenSet::new(&[T![&], T![*], T![!], T![.], T![-]]));

fn lhs(p: &mut Parser, r: Restrictions) -> Option<(CompletedMarker, BlockLike)> {
let m;
Expand Down
12 changes: 6 additions & 6 deletions crates/parser/src/grammar/expressions/atom.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ use super::*;
// let _ = b"e";
// let _ = br"f";
// }
pub(crate) const LITERAL_FIRST: TokenSet = token_set![
pub(crate) const LITERAL_FIRST: TokenSet = TokenSet::new(&[
TRUE_KW,
FALSE_KW,
INT_NUMBER,
Expand All @@ -25,8 +25,8 @@ pub(crate) const LITERAL_FIRST: TokenSet = token_set![
STRING,
RAW_STRING,
BYTE_STRING,
RAW_BYTE_STRING
];
RAW_BYTE_STRING,
]);

pub(crate) fn literal(p: &mut Parser) -> Option<CompletedMarker> {
if !p.at_ts(LITERAL_FIRST) {
Expand All @@ -39,7 +39,7 @@ pub(crate) fn literal(p: &mut Parser) -> Option<CompletedMarker> {

// E.g. for after the break in `if break {}`, this should not match
pub(super) const ATOM_EXPR_FIRST: TokenSet =
LITERAL_FIRST.union(paths::PATH_FIRST).union(token_set![
LITERAL_FIRST.union(paths::PATH_FIRST).union(TokenSet::new(&[
T!['('],
T!['{'],
T!['['],
Expand All @@ -59,9 +59,9 @@ pub(super) const ATOM_EXPR_FIRST: TokenSet =
T![loop],
T![for],
LIFETIME,
]);
]));

const EXPR_RECOVERY_SET: TokenSet = token_set![LET_KW, R_DOLLAR];
const EXPR_RECOVERY_SET: TokenSet = TokenSet::new(&[LET_KW, R_DOLLAR]);

pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option<(CompletedMarker, BlockLike)> {
if let Some(m) = literal(p) {
Expand Down
4 changes: 2 additions & 2 deletions crates/parser/src/grammar/items.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ pub(super) fn mod_contents(p: &mut Parser, stop_on_r_curly: bool) {
}
}

pub(super) const ITEM_RECOVERY_SET: TokenSet = token_set![
pub(super) const ITEM_RECOVERY_SET: TokenSet = TokenSet::new(&[
FN_KW,
STRUCT_KW,
ENUM_KW,
Expand All @@ -41,7 +41,7 @@ pub(super) const ITEM_RECOVERY_SET: TokenSet = token_set![
USE_KW,
MACRO_KW,
T![;],
];
]);

pub(super) fn item_or_macro(p: &mut Parser, stop_on_r_curly: bool) {
let m = p.start();
Expand Down
2 changes: 1 addition & 1 deletion crates/parser/src/grammar/paths.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
use super::*;

pub(super) const PATH_FIRST: TokenSet =
token_set![IDENT, T![self], T![super], T![crate], T![:], T![<]];
TokenSet::new(&[IDENT, T![self], T![super], T![crate], T![:], T![<]]);

pub(super) fn is_path_start(p: &Parser) -> bool {
is_use_path_start(p) || p.at(T![<])
Expand Down
17 changes: 13 additions & 4 deletions crates/parser/src/grammar/patterns.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,18 @@

use super::*;

pub(super) const PATTERN_FIRST: TokenSet = expressions::LITERAL_FIRST
.union(paths::PATH_FIRST)
.union(token_set![T![box], T![ref], T![mut], T!['('], T!['['], T![&], T![_], T![-], T![.]]);
pub(super) const PATTERN_FIRST: TokenSet =
expressions::LITERAL_FIRST.union(paths::PATH_FIRST).union(TokenSet::new(&[
T![box],
T![ref],
T![mut],
T!['('],
T!['['],
T![&],
T![_],
T![-],
T![.],
]));

pub(crate) fn pattern(p: &mut Parser) {
pattern_r(p, PAT_RECOVERY_SET);
Expand Down Expand Up @@ -74,7 +83,7 @@ fn pattern_single_r(p: &mut Parser, recovery_set: TokenSet) {
}

const PAT_RECOVERY_SET: TokenSet =
token_set![LET_KW, IF_KW, WHILE_KW, LOOP_KW, MATCH_KW, R_PAREN, COMMA];
TokenSet::new(&[LET_KW, IF_KW, WHILE_KW, LOOP_KW, MATCH_KW, R_PAREN, COMMA]);

fn atom_pat(p: &mut Parser, recovery_set: TokenSet) -> Option<CompletedMarker> {
let m = match p.nth(0) {
Expand Down
8 changes: 4 additions & 4 deletions crates/parser/src/grammar/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

use super::*;

pub(super) const TYPE_FIRST: TokenSet = paths::PATH_FIRST.union(token_set![
pub(super) const TYPE_FIRST: TokenSet = paths::PATH_FIRST.union(TokenSet::new(&[
T!['('],
T!['['],
T![<],
Expand All @@ -16,16 +16,16 @@ pub(super) const TYPE_FIRST: TokenSet = paths::PATH_FIRST.union(token_set![
T![for],
T![impl],
T![dyn],
]);
]));

const TYPE_RECOVERY_SET: TokenSet = token_set![
const TYPE_RECOVERY_SET: TokenSet = TokenSet::new(&[
T![')'],
T![,],
L_DOLLAR,
// test_err struct_field_recover
// struct S { f pub g: () }
T![pub],
];
]);

pub(crate) fn type_(p: &mut Parser) {
type_with_bounds_cond(p, true);
Expand Down
20 changes: 10 additions & 10 deletions crates/parser/src/token_set.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,21 @@ pub(crate) struct TokenSet(u128);
impl TokenSet {
pub(crate) const EMPTY: TokenSet = TokenSet(0);

pub(crate) const fn singleton(kind: SyntaxKind) -> TokenSet {
TokenSet(mask(kind))
pub(crate) const fn new(kinds: &[SyntaxKind]) -> TokenSet {
let mut res = 0u128;
let mut i = 0;
while i < kinds.len() {
res |= mask(kinds[i]);
i += 1
}
TokenSet(res)
}

pub(crate) const fn union(self, other: TokenSet) -> TokenSet {
TokenSet(self.0 | other.0)
}

pub(crate) fn contains(&self, kind: SyntaxKind) -> bool {
pub(crate) const fn contains(&self, kind: SyntaxKind) -> bool {
self.0 & mask(kind) != 0
}
}
Expand All @@ -26,16 +32,10 @@ const fn mask(kind: SyntaxKind) -> u128 {
1u128 << (kind as usize)
}

#[macro_export]
macro_rules! token_set {
($($t:expr),*) => { TokenSet::EMPTY$(.union(TokenSet::singleton($t)))* };
($($t:expr),* ,) => { token_set!($($t),*) };
}

#[test]
fn token_set_works_for_tokens() {
use crate::SyntaxKind::*;
let ts = token_set![EOF, SHEBANG];
let ts = TokenSet::new(&[EOF, SHEBANG]);
assert!(ts.contains(EOF));
assert!(ts.contains(SHEBANG));
assert!(!ts.contains(PLUS));
Expand Down
2 changes: 1 addition & 1 deletion xtask/src/install.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use anyhow::{bail, format_err, Context, Result};
use crate::not_bash::{pushd, run};

// Latest stable, feel free to send a PR if this lags behind.
const REQUIRED_RUST_VERSION: u32 = 43;
const REQUIRED_RUST_VERSION: u32 = 46;

pub struct InstallCmd {
pub client: Option<ClientOpt>,
Expand Down