Implement unsafe attribute parsing

This commit is contained in:
Lukas Wirth 2024-05-06 12:09:31 +02:00
parent c4618fe14d
commit e1aeed3aed
8 changed files with 534 additions and 11 deletions

View file

@ -36,8 +36,33 @@ fn attr(p: &mut Parser<'_>, inner: bool) {
attr.complete(p, ATTR);
}
// test metas
// #![simple_ident]
// #![simple::path]
// #![simple_ident_expr = ""]
// #![simple::path::Expr = ""]
// #![simple_ident_tt(a b c)]
// #![simple_ident_tt[a b c]]
// #![simple_ident_tt{a b c}]
// #![simple::path::tt(a b c)]
// #![simple::path::tt[a b c]]
// #![simple::path::tt{a b c}]
// #![unsafe(simple_ident)]
// #![unsafe(simple::path)]
// #![unsafe(simple_ident_expr = "")]
// #![unsafe(simple::path::Expr = "")]
// #![unsafe(simple_ident_tt(a b c))]
// #![unsafe(simple_ident_tt[a b c])]
// #![unsafe(simple_ident_tt{a b c})]
// #![unsafe(simple::path::tt(a b c))]
// #![unsafe(simple::path::tt[a b c])]
// #![unsafe(simple::path::tt{a b c})]
pub(super) fn meta(p: &mut Parser<'_>) {
let meta = p.start();
let is_unsafe = p.eat(T![unsafe]);
if is_unsafe {
p.expect(T!['(']);
}
paths::use_path(p);
match p.current() {
@ -50,6 +75,9 @@ pub(super) fn meta(p: &mut Parser<'_>) {
T!['('] | T!['['] | T!['{'] => items::token_tree(p),
_ => {}
}
if is_unsafe {
p.expect(T![')']);
}
meta.complete(p, META);
}

View file

@ -0,0 +1,457 @@
SOURCE_FILE
ATTR
POUND "#"
BANG "!"
L_BRACK "["
META
PATH
PATH_SEGMENT
NAME_REF
IDENT "simple_ident"
R_BRACK "]"
WHITESPACE "\n"
ATTR
POUND "#"
BANG "!"
L_BRACK "["
META
PATH
PATH
PATH_SEGMENT
NAME_REF
IDENT "simple"
COLON2 "::"
PATH_SEGMENT
NAME_REF
IDENT "path"
R_BRACK "]"
WHITESPACE "\n"
ATTR
POUND "#"
BANG "!"
L_BRACK "["
META
PATH
PATH_SEGMENT
NAME_REF
IDENT "simple_ident_expr"
WHITESPACE " "
EQ "="
WHITESPACE " "
LITERAL
STRING "\"\""
R_BRACK "]"
WHITESPACE "\n"
ATTR
POUND "#"
BANG "!"
L_BRACK "["
META
PATH
PATH
PATH
PATH_SEGMENT
NAME_REF
IDENT "simple"
COLON2 "::"
PATH_SEGMENT
NAME_REF
IDENT "path"
COLON2 "::"
PATH_SEGMENT
NAME_REF
IDENT "Expr"
WHITESPACE " "
EQ "="
WHITESPACE " "
LITERAL
STRING "\"\""
R_BRACK "]"
WHITESPACE "\n"
ATTR
POUND "#"
BANG "!"
L_BRACK "["
META
PATH
PATH_SEGMENT
NAME_REF
IDENT "simple_ident_tt"
TOKEN_TREE
L_PAREN "("
IDENT "a"
WHITESPACE " "
IDENT "b"
WHITESPACE " "
IDENT "c"
R_PAREN ")"
R_BRACK "]"
WHITESPACE "\n"
ATTR
POUND "#"
BANG "!"
L_BRACK "["
META
PATH
PATH_SEGMENT
NAME_REF
IDENT "simple_ident_tt"
TOKEN_TREE
L_BRACK "["
IDENT "a"
WHITESPACE " "
IDENT "b"
WHITESPACE " "
IDENT "c"
R_BRACK "]"
R_BRACK "]"
WHITESPACE "\n"
ATTR
POUND "#"
BANG "!"
L_BRACK "["
META
PATH
PATH_SEGMENT
NAME_REF
IDENT "simple_ident_tt"
TOKEN_TREE
L_CURLY "{"
IDENT "a"
WHITESPACE " "
IDENT "b"
WHITESPACE " "
IDENT "c"
R_CURLY "}"
R_BRACK "]"
WHITESPACE "\n"
ATTR
POUND "#"
BANG "!"
L_BRACK "["
META
PATH
PATH
PATH
PATH_SEGMENT
NAME_REF
IDENT "simple"
COLON2 "::"
PATH_SEGMENT
NAME_REF
IDENT "path"
COLON2 "::"
PATH_SEGMENT
NAME_REF
IDENT "tt"
TOKEN_TREE
L_PAREN "("
IDENT "a"
WHITESPACE " "
IDENT "b"
WHITESPACE " "
IDENT "c"
R_PAREN ")"
R_BRACK "]"
WHITESPACE "\n"
ATTR
POUND "#"
BANG "!"
L_BRACK "["
META
PATH
PATH
PATH
PATH_SEGMENT
NAME_REF
IDENT "simple"
COLON2 "::"
PATH_SEGMENT
NAME_REF
IDENT "path"
COLON2 "::"
PATH_SEGMENT
NAME_REF
IDENT "tt"
TOKEN_TREE
L_BRACK "["
IDENT "a"
WHITESPACE " "
IDENT "b"
WHITESPACE " "
IDENT "c"
R_BRACK "]"
R_BRACK "]"
WHITESPACE "\n"
ATTR
POUND "#"
BANG "!"
L_BRACK "["
META
PATH
PATH
PATH
PATH_SEGMENT
NAME_REF
IDENT "simple"
COLON2 "::"
PATH_SEGMENT
NAME_REF
IDENT "path"
COLON2 "::"
PATH_SEGMENT
NAME_REF
IDENT "tt"
TOKEN_TREE
L_CURLY "{"
IDENT "a"
WHITESPACE " "
IDENT "b"
WHITESPACE " "
IDENT "c"
R_CURLY "}"
R_BRACK "]"
WHITESPACE "\n"
ATTR
POUND "#"
BANG "!"
L_BRACK "["
META
UNSAFE_KW "unsafe"
L_PAREN "("
PATH
PATH_SEGMENT
NAME_REF
IDENT "simple_ident"
R_PAREN ")"
R_BRACK "]"
WHITESPACE "\n"
ATTR
POUND "#"
BANG "!"
L_BRACK "["
META
UNSAFE_KW "unsafe"
L_PAREN "("
PATH
PATH
PATH_SEGMENT
NAME_REF
IDENT "simple"
COLON2 "::"
PATH_SEGMENT
NAME_REF
IDENT "path"
R_PAREN ")"
R_BRACK "]"
WHITESPACE "\n"
ATTR
POUND "#"
BANG "!"
L_BRACK "["
META
UNSAFE_KW "unsafe"
L_PAREN "("
PATH
PATH_SEGMENT
NAME_REF
IDENT "simple_ident_expr"
WHITESPACE " "
EQ "="
WHITESPACE " "
LITERAL
STRING "\"\""
R_PAREN ")"
R_BRACK "]"
WHITESPACE "\n"
ATTR
POUND "#"
BANG "!"
L_BRACK "["
META
UNSAFE_KW "unsafe"
L_PAREN "("
PATH
PATH
PATH
PATH_SEGMENT
NAME_REF
IDENT "simple"
COLON2 "::"
PATH_SEGMENT
NAME_REF
IDENT "path"
COLON2 "::"
PATH_SEGMENT
NAME_REF
IDENT "Expr"
WHITESPACE " "
EQ "="
WHITESPACE " "
LITERAL
STRING "\"\""
R_PAREN ")"
R_BRACK "]"
WHITESPACE "\n"
ATTR
POUND "#"
BANG "!"
L_BRACK "["
META
UNSAFE_KW "unsafe"
L_PAREN "("
PATH
PATH_SEGMENT
NAME_REF
IDENT "simple_ident_tt"
TOKEN_TREE
L_PAREN "("
IDENT "a"
WHITESPACE " "
IDENT "b"
WHITESPACE " "
IDENT "c"
R_PAREN ")"
R_PAREN ")"
R_BRACK "]"
WHITESPACE "\n"
ATTR
POUND "#"
BANG "!"
L_BRACK "["
META
UNSAFE_KW "unsafe"
L_PAREN "("
PATH
PATH_SEGMENT
NAME_REF
IDENT "simple_ident_tt"
TOKEN_TREE
L_BRACK "["
IDENT "a"
WHITESPACE " "
IDENT "b"
WHITESPACE " "
IDENT "c"
R_BRACK "]"
R_PAREN ")"
R_BRACK "]"
WHITESPACE "\n"
ATTR
POUND "#"
BANG "!"
L_BRACK "["
META
UNSAFE_KW "unsafe"
L_PAREN "("
PATH
PATH_SEGMENT
NAME_REF
IDENT "simple_ident_tt"
TOKEN_TREE
L_CURLY "{"
IDENT "a"
WHITESPACE " "
IDENT "b"
WHITESPACE " "
IDENT "c"
R_CURLY "}"
R_PAREN ")"
R_BRACK "]"
WHITESPACE "\n"
ATTR
POUND "#"
BANG "!"
L_BRACK "["
META
UNSAFE_KW "unsafe"
L_PAREN "("
PATH
PATH
PATH
PATH_SEGMENT
NAME_REF
IDENT "simple"
COLON2 "::"
PATH_SEGMENT
NAME_REF
IDENT "path"
COLON2 "::"
PATH_SEGMENT
NAME_REF
IDENT "tt"
TOKEN_TREE
L_PAREN "("
IDENT "a"
WHITESPACE " "
IDENT "b"
WHITESPACE " "
IDENT "c"
R_PAREN ")"
R_PAREN ")"
R_BRACK "]"
WHITESPACE "\n"
ATTR
POUND "#"
BANG "!"
L_BRACK "["
META
UNSAFE_KW "unsafe"
L_PAREN "("
PATH
PATH
PATH
PATH_SEGMENT
NAME_REF
IDENT "simple"
COLON2 "::"
PATH_SEGMENT
NAME_REF
IDENT "path"
COLON2 "::"
PATH_SEGMENT
NAME_REF
IDENT "tt"
TOKEN_TREE
L_BRACK "["
IDENT "a"
WHITESPACE " "
IDENT "b"
WHITESPACE " "
IDENT "c"
R_BRACK "]"
R_PAREN ")"
R_BRACK "]"
WHITESPACE "\n"
ATTR
POUND "#"
BANG "!"
L_BRACK "["
META
UNSAFE_KW "unsafe"
L_PAREN "("
PATH
PATH
PATH
PATH_SEGMENT
NAME_REF
IDENT "simple"
COLON2 "::"
PATH_SEGMENT
NAME_REF
IDENT "path"
COLON2 "::"
PATH_SEGMENT
NAME_REF
IDENT "tt"
TOKEN_TREE
L_CURLY "{"
IDENT "a"
WHITESPACE " "
IDENT "b"
WHITESPACE " "
IDENT "c"
R_CURLY "}"
R_PAREN ")"
R_BRACK "]"
WHITESPACE "\n"

View file

@ -0,0 +1,20 @@
#![simple_ident]
#![simple::path]
#![simple_ident_expr = ""]
#![simple::path::Expr = ""]
#![simple_ident_tt(a b c)]
#![simple_ident_tt[a b c]]
#![simple_ident_tt{a b c}]
#![simple::path::tt(a b c)]
#![simple::path::tt[a b c]]
#![simple::path::tt{a b c}]
#![unsafe(simple_ident)]
#![unsafe(simple::path)]
#![unsafe(simple_ident_expr = "")]
#![unsafe(simple::path::Expr = "")]
#![unsafe(simple_ident_tt(a b c))]
#![unsafe(simple_ident_tt[a b c])]
#![unsafe(simple_ident_tt{a b c})]
#![unsafe(simple::path::tt(a b c))]
#![unsafe(simple::path::tt[a b c])]
#![unsafe(simple::path::tt{a b c})]