mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-10 20:36:23 +00:00
Enable parsing of attributes inside a match block
We allow invalid inner attributes to be parsed, e.g. inner attributes that are not directly after the opening brace of the match block. Instead we run validation on `MatchArmList` to allow better reporting of errors.
This commit is contained in:
parent
982f72c022
commit
1c97c1ac11
16 changed files with 589 additions and 1 deletions
|
@ -153,6 +153,20 @@ impl FnDef {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Attr {
|
impl Attr {
|
||||||
|
pub fn is_inner(&self) -> bool {
|
||||||
|
let tt = match self.value() {
|
||||||
|
None => return false,
|
||||||
|
Some(tt) => tt,
|
||||||
|
};
|
||||||
|
|
||||||
|
let prev = match tt.syntax().prev_sibling() {
|
||||||
|
None => return false,
|
||||||
|
Some(prev) => prev,
|
||||||
|
};
|
||||||
|
|
||||||
|
prev.kind() == EXCL
|
||||||
|
}
|
||||||
|
|
||||||
pub fn as_atom(&self) -> Option<SmolStr> {
|
pub fn as_atom(&self) -> Option<SmolStr> {
|
||||||
let tt = self.value()?;
|
let tt = self.value()?;
|
||||||
let (_bra, attr, _ket) = tt.syntax().children().collect_tuple()?;
|
let (_bra, attr, _ket) = tt.syntax().children().collect_tuple()?;
|
||||||
|
|
|
@ -1946,6 +1946,7 @@ impl ToOwned for MatchArm {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
impl ast::AttrsOwner for MatchArm {}
|
||||||
impl MatchArm {
|
impl MatchArm {
|
||||||
pub fn pats(&self) -> impl Iterator<Item = &Pat> {
|
pub fn pats(&self) -> impl Iterator<Item = &Pat> {
|
||||||
super::children(self)
|
super::children(self)
|
||||||
|
@ -1986,6 +1987,7 @@ impl ToOwned for MatchArmList {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
impl ast::AttrsOwner for MatchArmList {}
|
||||||
impl MatchArmList {
|
impl MatchArmList {
|
||||||
pub fn arms(&self) -> impl Iterator<Item = &MatchArm> {
|
pub fn arms(&self) -> impl Iterator<Item = &MatchArm> {
|
||||||
super::children(self)
|
super::children(self)
|
||||||
|
|
|
@ -413,13 +413,15 @@ Grammar(
|
||||||
),
|
),
|
||||||
"MatchArmList": (
|
"MatchArmList": (
|
||||||
collections: [ ["arms", "MatchArm"] ],
|
collections: [ ["arms", "MatchArm"] ],
|
||||||
|
traits: [ "AttrsOwner" ]
|
||||||
),
|
),
|
||||||
"MatchArm": (
|
"MatchArm": (
|
||||||
options: [
|
options: [
|
||||||
[ "guard", "MatchGuard" ],
|
[ "guard", "MatchGuard" ],
|
||||||
"Expr",
|
"Expr",
|
||||||
],
|
],
|
||||||
collections: [ [ "pats", "Pat" ] ]
|
collections: [ [ "pats", "Pat" ] ],
|
||||||
|
traits: [ "AttrsOwner" ]
|
||||||
),
|
),
|
||||||
"MatchGuard": (options: ["Expr"]),
|
"MatchGuard": (options: ["Expr"]),
|
||||||
"StructLit": (options: ["Path", "NamedFieldList", ["spread", "Expr"]]),
|
"StructLit": (options: ["Path", "NamedFieldList", ["spread", "Expr"]]),
|
||||||
|
|
|
@ -1,5 +1,15 @@
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
/// Parses both inner & outer attributes.
|
||||||
|
///
|
||||||
|
/// Allowing to run validation for reporting errors
|
||||||
|
/// regarding attributes
|
||||||
|
pub(super) fn all_attributes(p: &mut Parser) {
|
||||||
|
while p.at(POUND) {
|
||||||
|
attribute(p, p.nth(1) == EXCL)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub(super) fn inner_attributes(p: &mut Parser) {
|
pub(super) fn inner_attributes(p: &mut Parser) {
|
||||||
while p.current() == POUND && p.nth(1) == EXCL {
|
while p.current() == POUND && p.nth(1) == EXCL {
|
||||||
attribute(p, true)
|
attribute(p, true)
|
||||||
|
|
|
@ -313,11 +313,44 @@ pub(crate) fn match_arm_list(p: &mut Parser) {
|
||||||
assert!(p.at(L_CURLY));
|
assert!(p.at(L_CURLY));
|
||||||
let m = p.start();
|
let m = p.start();
|
||||||
p.eat(L_CURLY);
|
p.eat(L_CURLY);
|
||||||
|
|
||||||
|
// test match_arms_inner_attribute
|
||||||
|
// fn foo() {
|
||||||
|
// match () {
|
||||||
|
// #![doc("Inner attribute")]
|
||||||
|
// #![doc("Can be")]
|
||||||
|
// #![doc("Stacked")]
|
||||||
|
// _ => (),
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
attributes::inner_attributes(p);
|
||||||
|
|
||||||
while !p.at(EOF) && !p.at(R_CURLY) {
|
while !p.at(EOF) && !p.at(R_CURLY) {
|
||||||
if p.at(L_CURLY) {
|
if p.at(L_CURLY) {
|
||||||
error_block(p, "expected match arm");
|
error_block(p, "expected match arm");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This may result in invalid attributes
|
||||||
|
// if there are inner attributes mixed in together
|
||||||
|
// with the outer attributes, but we allow parsing
|
||||||
|
// those so we can run validation and report better errors
|
||||||
|
|
||||||
|
// test match_arms_outer_attributes
|
||||||
|
// fn foo() {
|
||||||
|
// match () {
|
||||||
|
// #[cfg(feature = "some")]
|
||||||
|
// _ => (),
|
||||||
|
// #[cfg(feature = "other")]
|
||||||
|
// _ => (),
|
||||||
|
// #[cfg(feature = "many")]
|
||||||
|
// #[cfg(feature = "attributes")]
|
||||||
|
// #[cfg(feature = "before")]
|
||||||
|
// _ => (),
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
attributes::all_attributes(p);
|
||||||
|
|
||||||
// test match_arms_commas
|
// test match_arms_commas
|
||||||
// fn foo() {
|
// fn foo() {
|
||||||
// match () {
|
// match () {
|
||||||
|
|
|
@ -92,6 +92,7 @@ pub enum SyntaxErrorKind {
|
||||||
UnclosedString,
|
UnclosedString,
|
||||||
InvalidSuffix,
|
InvalidSuffix,
|
||||||
InvalidBlockAttr,
|
InvalidBlockAttr,
|
||||||
|
InvalidMatchInnerAttr,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
||||||
|
@ -136,6 +137,9 @@ impl fmt::Display for SyntaxErrorKind {
|
||||||
InvalidBlockAttr => {
|
InvalidBlockAttr => {
|
||||||
write!(f, "A block in this position cannot accept inner attributes")
|
write!(f, "A block in this position cannot accept inner attributes")
|
||||||
}
|
}
|
||||||
|
InvalidMatchInnerAttr => {
|
||||||
|
write!(f, "Inner attributes are only allowed directly after the opening brace of the match expression")
|
||||||
|
}
|
||||||
ParseError(msg) => write!(f, "{}", msg.0),
|
ParseError(msg) => write!(f, "{}", msg.0),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ mod byte_string;
|
||||||
mod char;
|
mod char;
|
||||||
mod string;
|
mod string;
|
||||||
mod block;
|
mod block;
|
||||||
|
mod match_armlist;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
SourceFile, syntax_node::SyntaxError, AstNode,
|
SourceFile, syntax_node::SyntaxError, AstNode,
|
||||||
|
@ -19,6 +20,7 @@ pub(crate) fn validate(file: &SourceFile) -> Vec<SyntaxError> {
|
||||||
.visit::<ast::Char, _>(self::char::validate_char_node)
|
.visit::<ast::Char, _>(self::char::validate_char_node)
|
||||||
.visit::<ast::String, _>(self::string::validate_string_node)
|
.visit::<ast::String, _>(self::string::validate_string_node)
|
||||||
.visit::<ast::Block, _>(self::block::validate_block_node)
|
.visit::<ast::Block, _>(self::block::validate_block_node)
|
||||||
|
.visit::<ast::MatchArmList, _>(self::match_armlist::validate_match_armlist)
|
||||||
.accept(node);
|
.accept(node);
|
||||||
}
|
}
|
||||||
errors
|
errors
|
||||||
|
|
28
crates/ra_syntax/src/validation/match_armlist.rs
Normal file
28
crates/ra_syntax/src/validation/match_armlist.rs
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
use crate::{
|
||||||
|
ast::{self, AttrsOwner, AstNode},
|
||||||
|
syntax_node::{
|
||||||
|
SyntaxError,
|
||||||
|
SyntaxErrorKind::*,
|
||||||
|
Direction,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
pub(crate) fn validate_match_armlist(node: &ast::MatchArmList, errors: &mut Vec<SyntaxError>) {
|
||||||
|
// Report errors for any inner attribute
|
||||||
|
// which has a preceding matcharm or an outer attribute
|
||||||
|
for inner_attr in node.attrs().filter(|s| s.is_inner()) {
|
||||||
|
let any_errors = inner_attr.syntax().siblings(Direction::Prev).any(|s| {
|
||||||
|
match (ast::MatchArm::cast(s), ast::Attr::cast(s)) {
|
||||||
|
(Some(_), _) => true,
|
||||||
|
// Outer attributes which preceed an inner attribute are not allowed
|
||||||
|
(_, Some(a)) if !a.is_inner() => true,
|
||||||
|
(_, Some(_)) => false,
|
||||||
|
(None, None) => false,
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if any_errors {
|
||||||
|
errors.push(SyntaxError::new(InvalidMatchInnerAttr, inner_attr.syntax().range()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
fn foo() {
|
||||||
|
match () {
|
||||||
|
_ => (),
|
||||||
|
#![doc("Not allowed here")]
|
||||||
|
_ => (),
|
||||||
|
}
|
||||||
|
|
||||||
|
match () {
|
||||||
|
_ => (),
|
||||||
|
_ => (),
|
||||||
|
#![doc("Nor here")]
|
||||||
|
}
|
||||||
|
|
||||||
|
match () {
|
||||||
|
#[cfg(test)]
|
||||||
|
#![doc("Nor here")]
|
||||||
|
_ => (),
|
||||||
|
_ => (),
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,173 @@
|
||||||
|
SOURCE_FILE@[0; 293)
|
||||||
|
FN_DEF@[0; 292)
|
||||||
|
FN_KW@[0; 2)
|
||||||
|
WHITESPACE@[2; 3)
|
||||||
|
NAME@[3; 6)
|
||||||
|
IDENT@[3; 6) "foo"
|
||||||
|
PARAM_LIST@[6; 8)
|
||||||
|
L_PAREN@[6; 7)
|
||||||
|
R_PAREN@[7; 8)
|
||||||
|
WHITESPACE@[8; 9)
|
||||||
|
BLOCK@[9; 292)
|
||||||
|
L_CURLY@[9; 10)
|
||||||
|
WHITESPACE@[10; 15)
|
||||||
|
EXPR_STMT@[15; 101)
|
||||||
|
MATCH_EXPR@[15; 101)
|
||||||
|
MATCH_KW@[15; 20)
|
||||||
|
WHITESPACE@[20; 21)
|
||||||
|
TUPLE_EXPR@[21; 23)
|
||||||
|
L_PAREN@[21; 22)
|
||||||
|
R_PAREN@[22; 23)
|
||||||
|
WHITESPACE@[23; 24)
|
||||||
|
MATCH_ARM_LIST@[24; 101)
|
||||||
|
L_CURLY@[24; 25)
|
||||||
|
WHITESPACE@[25; 34)
|
||||||
|
MATCH_ARM@[34; 41)
|
||||||
|
PLACEHOLDER_PAT@[34; 35)
|
||||||
|
UNDERSCORE@[34; 35)
|
||||||
|
WHITESPACE@[35; 36)
|
||||||
|
FAT_ARROW@[36; 38)
|
||||||
|
WHITESPACE@[38; 39)
|
||||||
|
TUPLE_EXPR@[39; 41)
|
||||||
|
L_PAREN@[39; 40)
|
||||||
|
R_PAREN@[40; 41)
|
||||||
|
COMMA@[41; 42)
|
||||||
|
WHITESPACE@[42; 51)
|
||||||
|
err: `Inner attributes are only allowed directly after the opening brace of the match expression`
|
||||||
|
ATTR@[51; 78)
|
||||||
|
POUND@[51; 52)
|
||||||
|
EXCL@[52; 53)
|
||||||
|
TOKEN_TREE@[53; 78)
|
||||||
|
L_BRACK@[53; 54)
|
||||||
|
IDENT@[54; 57) "doc"
|
||||||
|
TOKEN_TREE@[57; 77)
|
||||||
|
L_PAREN@[57; 58)
|
||||||
|
STRING@[58; 76)
|
||||||
|
R_PAREN@[76; 77)
|
||||||
|
R_BRACK@[77; 78)
|
||||||
|
WHITESPACE@[78; 87)
|
||||||
|
MATCH_ARM@[87; 94)
|
||||||
|
PLACEHOLDER_PAT@[87; 88)
|
||||||
|
UNDERSCORE@[87; 88)
|
||||||
|
WHITESPACE@[88; 89)
|
||||||
|
FAT_ARROW@[89; 91)
|
||||||
|
WHITESPACE@[91; 92)
|
||||||
|
TUPLE_EXPR@[92; 94)
|
||||||
|
L_PAREN@[92; 93)
|
||||||
|
R_PAREN@[93; 94)
|
||||||
|
COMMA@[94; 95)
|
||||||
|
WHITESPACE@[95; 100)
|
||||||
|
R_CURLY@[100; 101)
|
||||||
|
WHITESPACE@[101; 107)
|
||||||
|
EXPR_STMT@[107; 185)
|
||||||
|
MATCH_EXPR@[107; 185)
|
||||||
|
MATCH_KW@[107; 112)
|
||||||
|
WHITESPACE@[112; 113)
|
||||||
|
TUPLE_EXPR@[113; 115)
|
||||||
|
L_PAREN@[113; 114)
|
||||||
|
R_PAREN@[114; 115)
|
||||||
|
WHITESPACE@[115; 116)
|
||||||
|
MATCH_ARM_LIST@[116; 185)
|
||||||
|
L_CURLY@[116; 117)
|
||||||
|
WHITESPACE@[117; 126)
|
||||||
|
MATCH_ARM@[126; 133)
|
||||||
|
PLACEHOLDER_PAT@[126; 127)
|
||||||
|
UNDERSCORE@[126; 127)
|
||||||
|
WHITESPACE@[127; 128)
|
||||||
|
FAT_ARROW@[128; 130)
|
||||||
|
WHITESPACE@[130; 131)
|
||||||
|
TUPLE_EXPR@[131; 133)
|
||||||
|
L_PAREN@[131; 132)
|
||||||
|
R_PAREN@[132; 133)
|
||||||
|
COMMA@[133; 134)
|
||||||
|
WHITESPACE@[134; 143)
|
||||||
|
MATCH_ARM@[143; 150)
|
||||||
|
PLACEHOLDER_PAT@[143; 144)
|
||||||
|
UNDERSCORE@[143; 144)
|
||||||
|
WHITESPACE@[144; 145)
|
||||||
|
FAT_ARROW@[145; 147)
|
||||||
|
WHITESPACE@[147; 148)
|
||||||
|
TUPLE_EXPR@[148; 150)
|
||||||
|
L_PAREN@[148; 149)
|
||||||
|
R_PAREN@[149; 150)
|
||||||
|
COMMA@[150; 151)
|
||||||
|
WHITESPACE@[151; 160)
|
||||||
|
err: `Inner attributes are only allowed directly after the opening brace of the match expression`
|
||||||
|
ATTR@[160; 179)
|
||||||
|
POUND@[160; 161)
|
||||||
|
EXCL@[161; 162)
|
||||||
|
TOKEN_TREE@[162; 179)
|
||||||
|
L_BRACK@[162; 163)
|
||||||
|
IDENT@[163; 166) "doc"
|
||||||
|
TOKEN_TREE@[166; 178)
|
||||||
|
L_PAREN@[166; 167)
|
||||||
|
STRING@[167; 177)
|
||||||
|
R_PAREN@[177; 178)
|
||||||
|
R_BRACK@[178; 179)
|
||||||
|
WHITESPACE@[179; 184)
|
||||||
|
err: `expected pattern`
|
||||||
|
err: `expected FAT_ARROW`
|
||||||
|
err: `expected expression`
|
||||||
|
MATCH_ARM@[184; 184)
|
||||||
|
R_CURLY@[184; 185)
|
||||||
|
WHITESPACE@[185; 191)
|
||||||
|
MATCH_EXPR@[191; 290)
|
||||||
|
MATCH_KW@[191; 196)
|
||||||
|
WHITESPACE@[196; 197)
|
||||||
|
TUPLE_EXPR@[197; 199)
|
||||||
|
L_PAREN@[197; 198)
|
||||||
|
R_PAREN@[198; 199)
|
||||||
|
WHITESPACE@[199; 200)
|
||||||
|
MATCH_ARM_LIST@[200; 290)
|
||||||
|
L_CURLY@[200; 201)
|
||||||
|
WHITESPACE@[201; 210)
|
||||||
|
ATTR@[210; 222)
|
||||||
|
POUND@[210; 211)
|
||||||
|
TOKEN_TREE@[211; 222)
|
||||||
|
L_BRACK@[211; 212)
|
||||||
|
IDENT@[212; 215) "cfg"
|
||||||
|
TOKEN_TREE@[215; 221)
|
||||||
|
L_PAREN@[215; 216)
|
||||||
|
IDENT@[216; 220) "test"
|
||||||
|
R_PAREN@[220; 221)
|
||||||
|
R_BRACK@[221; 222)
|
||||||
|
WHITESPACE@[222; 231)
|
||||||
|
err: `Inner attributes are only allowed directly after the opening brace of the match expression`
|
||||||
|
ATTR@[231; 250)
|
||||||
|
POUND@[231; 232)
|
||||||
|
EXCL@[232; 233)
|
||||||
|
TOKEN_TREE@[233; 250)
|
||||||
|
L_BRACK@[233; 234)
|
||||||
|
IDENT@[234; 237) "doc"
|
||||||
|
TOKEN_TREE@[237; 249)
|
||||||
|
L_PAREN@[237; 238)
|
||||||
|
STRING@[238; 248)
|
||||||
|
R_PAREN@[248; 249)
|
||||||
|
R_BRACK@[249; 250)
|
||||||
|
WHITESPACE@[250; 259)
|
||||||
|
MATCH_ARM@[259; 266)
|
||||||
|
PLACEHOLDER_PAT@[259; 260)
|
||||||
|
UNDERSCORE@[259; 260)
|
||||||
|
WHITESPACE@[260; 261)
|
||||||
|
FAT_ARROW@[261; 263)
|
||||||
|
WHITESPACE@[263; 264)
|
||||||
|
TUPLE_EXPR@[264; 266)
|
||||||
|
L_PAREN@[264; 265)
|
||||||
|
R_PAREN@[265; 266)
|
||||||
|
COMMA@[266; 267)
|
||||||
|
WHITESPACE@[267; 276)
|
||||||
|
MATCH_ARM@[276; 283)
|
||||||
|
PLACEHOLDER_PAT@[276; 277)
|
||||||
|
UNDERSCORE@[276; 277)
|
||||||
|
WHITESPACE@[277; 278)
|
||||||
|
FAT_ARROW@[278; 280)
|
||||||
|
WHITESPACE@[280; 281)
|
||||||
|
TUPLE_EXPR@[281; 283)
|
||||||
|
L_PAREN@[281; 282)
|
||||||
|
R_PAREN@[282; 283)
|
||||||
|
COMMA@[283; 284)
|
||||||
|
WHITESPACE@[284; 289)
|
||||||
|
R_CURLY@[289; 290)
|
||||||
|
WHITESPACE@[290; 291)
|
||||||
|
R_CURLY@[291; 292)
|
||||||
|
WHITESPACE@[292; 293)
|
|
@ -0,0 +1,7 @@
|
||||||
|
fn foo() {
|
||||||
|
match () {
|
||||||
|
_ => (),
|
||||||
|
_ => (),
|
||||||
|
#[cfg(test)]
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,64 @@
|
||||||
|
SOURCE_FILE@[0; 89)
|
||||||
|
FN_DEF@[0; 88)
|
||||||
|
FN_KW@[0; 2)
|
||||||
|
WHITESPACE@[2; 3)
|
||||||
|
NAME@[3; 6)
|
||||||
|
IDENT@[3; 6) "foo"
|
||||||
|
PARAM_LIST@[6; 8)
|
||||||
|
L_PAREN@[6; 7)
|
||||||
|
R_PAREN@[7; 8)
|
||||||
|
WHITESPACE@[8; 9)
|
||||||
|
BLOCK@[9; 88)
|
||||||
|
L_CURLY@[9; 10)
|
||||||
|
WHITESPACE@[10; 15)
|
||||||
|
MATCH_EXPR@[15; 86)
|
||||||
|
MATCH_KW@[15; 20)
|
||||||
|
WHITESPACE@[20; 21)
|
||||||
|
TUPLE_EXPR@[21; 23)
|
||||||
|
L_PAREN@[21; 22)
|
||||||
|
R_PAREN@[22; 23)
|
||||||
|
WHITESPACE@[23; 24)
|
||||||
|
MATCH_ARM_LIST@[24; 86)
|
||||||
|
L_CURLY@[24; 25)
|
||||||
|
WHITESPACE@[25; 34)
|
||||||
|
MATCH_ARM@[34; 41)
|
||||||
|
PLACEHOLDER_PAT@[34; 35)
|
||||||
|
UNDERSCORE@[34; 35)
|
||||||
|
WHITESPACE@[35; 36)
|
||||||
|
FAT_ARROW@[36; 38)
|
||||||
|
WHITESPACE@[38; 39)
|
||||||
|
TUPLE_EXPR@[39; 41)
|
||||||
|
L_PAREN@[39; 40)
|
||||||
|
R_PAREN@[40; 41)
|
||||||
|
COMMA@[41; 42)
|
||||||
|
WHITESPACE@[42; 51)
|
||||||
|
MATCH_ARM@[51; 58)
|
||||||
|
PLACEHOLDER_PAT@[51; 52)
|
||||||
|
UNDERSCORE@[51; 52)
|
||||||
|
WHITESPACE@[52; 53)
|
||||||
|
FAT_ARROW@[53; 55)
|
||||||
|
WHITESPACE@[55; 56)
|
||||||
|
TUPLE_EXPR@[56; 58)
|
||||||
|
L_PAREN@[56; 57)
|
||||||
|
R_PAREN@[57; 58)
|
||||||
|
COMMA@[58; 59)
|
||||||
|
WHITESPACE@[59; 68)
|
||||||
|
ATTR@[68; 80)
|
||||||
|
POUND@[68; 69)
|
||||||
|
TOKEN_TREE@[69; 80)
|
||||||
|
L_BRACK@[69; 70)
|
||||||
|
IDENT@[70; 73) "cfg"
|
||||||
|
TOKEN_TREE@[73; 79)
|
||||||
|
L_PAREN@[73; 74)
|
||||||
|
IDENT@[74; 78) "test"
|
||||||
|
R_PAREN@[78; 79)
|
||||||
|
R_BRACK@[79; 80)
|
||||||
|
WHITESPACE@[80; 85)
|
||||||
|
err: `expected pattern`
|
||||||
|
err: `expected FAT_ARROW`
|
||||||
|
err: `expected expression`
|
||||||
|
MATCH_ARM@[85; 85)
|
||||||
|
R_CURLY@[85; 86)
|
||||||
|
WHITESPACE@[86; 87)
|
||||||
|
R_CURLY@[87; 88)
|
||||||
|
WHITESPACE@[88; 89)
|
|
@ -0,0 +1,8 @@
|
||||||
|
fn foo() {
|
||||||
|
match () {
|
||||||
|
#![doc("Inner attribute")]
|
||||||
|
#![doc("Can be")]
|
||||||
|
#![doc("Stacked")]
|
||||||
|
_ => (),
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,74 @@
|
||||||
|
SOURCE_FILE@[0; 139)
|
||||||
|
FN_DEF@[0; 138)
|
||||||
|
FN_KW@[0; 2)
|
||||||
|
WHITESPACE@[2; 3)
|
||||||
|
NAME@[3; 6)
|
||||||
|
IDENT@[3; 6) "foo"
|
||||||
|
PARAM_LIST@[6; 8)
|
||||||
|
L_PAREN@[6; 7)
|
||||||
|
R_PAREN@[7; 8)
|
||||||
|
WHITESPACE@[8; 9)
|
||||||
|
BLOCK@[9; 138)
|
||||||
|
L_CURLY@[9; 10)
|
||||||
|
WHITESPACE@[10; 15)
|
||||||
|
MATCH_EXPR@[15; 136)
|
||||||
|
MATCH_KW@[15; 20)
|
||||||
|
WHITESPACE@[20; 21)
|
||||||
|
TUPLE_EXPR@[21; 23)
|
||||||
|
L_PAREN@[21; 22)
|
||||||
|
R_PAREN@[22; 23)
|
||||||
|
WHITESPACE@[23; 24)
|
||||||
|
MATCH_ARM_LIST@[24; 136)
|
||||||
|
L_CURLY@[24; 25)
|
||||||
|
WHITESPACE@[25; 34)
|
||||||
|
ATTR@[34; 60)
|
||||||
|
POUND@[34; 35)
|
||||||
|
EXCL@[35; 36)
|
||||||
|
TOKEN_TREE@[36; 60)
|
||||||
|
L_BRACK@[36; 37)
|
||||||
|
IDENT@[37; 40) "doc"
|
||||||
|
TOKEN_TREE@[40; 59)
|
||||||
|
L_PAREN@[40; 41)
|
||||||
|
STRING@[41; 58)
|
||||||
|
R_PAREN@[58; 59)
|
||||||
|
R_BRACK@[59; 60)
|
||||||
|
WHITESPACE@[60; 69)
|
||||||
|
ATTR@[69; 86)
|
||||||
|
POUND@[69; 70)
|
||||||
|
EXCL@[70; 71)
|
||||||
|
TOKEN_TREE@[71; 86)
|
||||||
|
L_BRACK@[71; 72)
|
||||||
|
IDENT@[72; 75) "doc"
|
||||||
|
TOKEN_TREE@[75; 85)
|
||||||
|
L_PAREN@[75; 76)
|
||||||
|
STRING@[76; 84)
|
||||||
|
R_PAREN@[84; 85)
|
||||||
|
R_BRACK@[85; 86)
|
||||||
|
WHITESPACE@[86; 95)
|
||||||
|
ATTR@[95; 113)
|
||||||
|
POUND@[95; 96)
|
||||||
|
EXCL@[96; 97)
|
||||||
|
TOKEN_TREE@[97; 113)
|
||||||
|
L_BRACK@[97; 98)
|
||||||
|
IDENT@[98; 101) "doc"
|
||||||
|
TOKEN_TREE@[101; 112)
|
||||||
|
L_PAREN@[101; 102)
|
||||||
|
STRING@[102; 111)
|
||||||
|
R_PAREN@[111; 112)
|
||||||
|
R_BRACK@[112; 113)
|
||||||
|
WHITESPACE@[113; 122)
|
||||||
|
MATCH_ARM@[122; 129)
|
||||||
|
PLACEHOLDER_PAT@[122; 123)
|
||||||
|
UNDERSCORE@[122; 123)
|
||||||
|
WHITESPACE@[123; 124)
|
||||||
|
FAT_ARROW@[124; 126)
|
||||||
|
WHITESPACE@[126; 127)
|
||||||
|
TUPLE_EXPR@[127; 129)
|
||||||
|
L_PAREN@[127; 128)
|
||||||
|
R_PAREN@[128; 129)
|
||||||
|
COMMA@[129; 130)
|
||||||
|
WHITESPACE@[130; 135)
|
||||||
|
R_CURLY@[135; 136)
|
||||||
|
WHITESPACE@[136; 137)
|
||||||
|
R_CURLY@[137; 138)
|
||||||
|
WHITESPACE@[138; 139)
|
|
@ -0,0 +1,12 @@
|
||||||
|
fn foo() {
|
||||||
|
match () {
|
||||||
|
#[cfg(feature = "some")]
|
||||||
|
_ => (),
|
||||||
|
#[cfg(feature = "other")]
|
||||||
|
_ => (),
|
||||||
|
#[cfg(feature = "many")]
|
||||||
|
#[cfg(feature = "attributes")]
|
||||||
|
#[cfg(feature = "before")]
|
||||||
|
_ => (),
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,135 @@
|
||||||
|
SOURCE_FILE@[0; 259)
|
||||||
|
FN_DEF@[0; 258)
|
||||||
|
FN_KW@[0; 2)
|
||||||
|
WHITESPACE@[2; 3)
|
||||||
|
NAME@[3; 6)
|
||||||
|
IDENT@[3; 6) "foo"
|
||||||
|
PARAM_LIST@[6; 8)
|
||||||
|
L_PAREN@[6; 7)
|
||||||
|
R_PAREN@[7; 8)
|
||||||
|
WHITESPACE@[8; 9)
|
||||||
|
BLOCK@[9; 258)
|
||||||
|
L_CURLY@[9; 10)
|
||||||
|
WHITESPACE@[10; 15)
|
||||||
|
MATCH_EXPR@[15; 256)
|
||||||
|
MATCH_KW@[15; 20)
|
||||||
|
WHITESPACE@[20; 21)
|
||||||
|
TUPLE_EXPR@[21; 23)
|
||||||
|
L_PAREN@[21; 22)
|
||||||
|
R_PAREN@[22; 23)
|
||||||
|
WHITESPACE@[23; 24)
|
||||||
|
MATCH_ARM_LIST@[24; 256)
|
||||||
|
L_CURLY@[24; 25)
|
||||||
|
WHITESPACE@[25; 34)
|
||||||
|
ATTR@[34; 58)
|
||||||
|
POUND@[34; 35)
|
||||||
|
TOKEN_TREE@[35; 58)
|
||||||
|
L_BRACK@[35; 36)
|
||||||
|
IDENT@[36; 39) "cfg"
|
||||||
|
TOKEN_TREE@[39; 57)
|
||||||
|
L_PAREN@[39; 40)
|
||||||
|
IDENT@[40; 47) "feature"
|
||||||
|
WHITESPACE@[47; 48)
|
||||||
|
EQ@[48; 49)
|
||||||
|
WHITESPACE@[49; 50)
|
||||||
|
STRING@[50; 56)
|
||||||
|
R_PAREN@[56; 57)
|
||||||
|
R_BRACK@[57; 58)
|
||||||
|
WHITESPACE@[58; 67)
|
||||||
|
MATCH_ARM@[67; 74)
|
||||||
|
PLACEHOLDER_PAT@[67; 68)
|
||||||
|
UNDERSCORE@[67; 68)
|
||||||
|
WHITESPACE@[68; 69)
|
||||||
|
FAT_ARROW@[69; 71)
|
||||||
|
WHITESPACE@[71; 72)
|
||||||
|
TUPLE_EXPR@[72; 74)
|
||||||
|
L_PAREN@[72; 73)
|
||||||
|
R_PAREN@[73; 74)
|
||||||
|
COMMA@[74; 75)
|
||||||
|
WHITESPACE@[75; 84)
|
||||||
|
ATTR@[84; 109)
|
||||||
|
POUND@[84; 85)
|
||||||
|
TOKEN_TREE@[85; 109)
|
||||||
|
L_BRACK@[85; 86)
|
||||||
|
IDENT@[86; 89) "cfg"
|
||||||
|
TOKEN_TREE@[89; 108)
|
||||||
|
L_PAREN@[89; 90)
|
||||||
|
IDENT@[90; 97) "feature"
|
||||||
|
WHITESPACE@[97; 98)
|
||||||
|
EQ@[98; 99)
|
||||||
|
WHITESPACE@[99; 100)
|
||||||
|
STRING@[100; 107)
|
||||||
|
R_PAREN@[107; 108)
|
||||||
|
R_BRACK@[108; 109)
|
||||||
|
WHITESPACE@[109; 118)
|
||||||
|
MATCH_ARM@[118; 125)
|
||||||
|
PLACEHOLDER_PAT@[118; 119)
|
||||||
|
UNDERSCORE@[118; 119)
|
||||||
|
WHITESPACE@[119; 120)
|
||||||
|
FAT_ARROW@[120; 122)
|
||||||
|
WHITESPACE@[122; 123)
|
||||||
|
TUPLE_EXPR@[123; 125)
|
||||||
|
L_PAREN@[123; 124)
|
||||||
|
R_PAREN@[124; 125)
|
||||||
|
COMMA@[125; 126)
|
||||||
|
WHITESPACE@[126; 135)
|
||||||
|
ATTR@[135; 159)
|
||||||
|
POUND@[135; 136)
|
||||||
|
TOKEN_TREE@[136; 159)
|
||||||
|
L_BRACK@[136; 137)
|
||||||
|
IDENT@[137; 140) "cfg"
|
||||||
|
TOKEN_TREE@[140; 158)
|
||||||
|
L_PAREN@[140; 141)
|
||||||
|
IDENT@[141; 148) "feature"
|
||||||
|
WHITESPACE@[148; 149)
|
||||||
|
EQ@[149; 150)
|
||||||
|
WHITESPACE@[150; 151)
|
||||||
|
STRING@[151; 157)
|
||||||
|
R_PAREN@[157; 158)
|
||||||
|
R_BRACK@[158; 159)
|
||||||
|
WHITESPACE@[159; 168)
|
||||||
|
ATTR@[168; 198)
|
||||||
|
POUND@[168; 169)
|
||||||
|
TOKEN_TREE@[169; 198)
|
||||||
|
L_BRACK@[169; 170)
|
||||||
|
IDENT@[170; 173) "cfg"
|
||||||
|
TOKEN_TREE@[173; 197)
|
||||||
|
L_PAREN@[173; 174)
|
||||||
|
IDENT@[174; 181) "feature"
|
||||||
|
WHITESPACE@[181; 182)
|
||||||
|
EQ@[182; 183)
|
||||||
|
WHITESPACE@[183; 184)
|
||||||
|
STRING@[184; 196)
|
||||||
|
R_PAREN@[196; 197)
|
||||||
|
R_BRACK@[197; 198)
|
||||||
|
WHITESPACE@[198; 207)
|
||||||
|
ATTR@[207; 233)
|
||||||
|
POUND@[207; 208)
|
||||||
|
TOKEN_TREE@[208; 233)
|
||||||
|
L_BRACK@[208; 209)
|
||||||
|
IDENT@[209; 212) "cfg"
|
||||||
|
TOKEN_TREE@[212; 232)
|
||||||
|
L_PAREN@[212; 213)
|
||||||
|
IDENT@[213; 220) "feature"
|
||||||
|
WHITESPACE@[220; 221)
|
||||||
|
EQ@[221; 222)
|
||||||
|
WHITESPACE@[222; 223)
|
||||||
|
STRING@[223; 231)
|
||||||
|
R_PAREN@[231; 232)
|
||||||
|
R_BRACK@[232; 233)
|
||||||
|
WHITESPACE@[233; 242)
|
||||||
|
MATCH_ARM@[242; 249)
|
||||||
|
PLACEHOLDER_PAT@[242; 243)
|
||||||
|
UNDERSCORE@[242; 243)
|
||||||
|
WHITESPACE@[243; 244)
|
||||||
|
FAT_ARROW@[244; 246)
|
||||||
|
WHITESPACE@[246; 247)
|
||||||
|
TUPLE_EXPR@[247; 249)
|
||||||
|
L_PAREN@[247; 248)
|
||||||
|
R_PAREN@[248; 249)
|
||||||
|
COMMA@[249; 250)
|
||||||
|
WHITESPACE@[250; 255)
|
||||||
|
R_CURLY@[255; 256)
|
||||||
|
WHITESPACE@[256; 257)
|
||||||
|
R_CURLY@[257; 258)
|
||||||
|
WHITESPACE@[258; 259)
|
Loading…
Add table
Add a link
Reference in a new issue