mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-26 13:03:31 +00:00
fix labled expressions
This commit is contained in:
parent
127814d9a7
commit
44334f6f56
9 changed files with 313 additions and 14 deletions
|
@ -62,16 +62,26 @@ pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option<CompletedMark
|
||||||
LOOP_KW => loop_expr(p, Some(m)),
|
LOOP_KW => loop_expr(p, Some(m)),
|
||||||
FOR_KW => for_expr(p, Some(m)),
|
FOR_KW => for_expr(p, Some(m)),
|
||||||
WHILE_KW => while_expr(p, Some(m)),
|
WHILE_KW => while_expr(p, Some(m)),
|
||||||
|
L_CURLY => block_expr(p, Some(m)),
|
||||||
_ => {
|
_ => {
|
||||||
|
// test misplaced_label_err
|
||||||
|
// fn main() {
|
||||||
|
// 'loop: impl
|
||||||
|
// }
|
||||||
p.error("expected a loop");
|
p.error("expected a loop");
|
||||||
|
m.complete(p, ERROR);
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MATCH_KW => match_expr(p),
|
MATCH_KW => match_expr(p),
|
||||||
UNSAFE_KW if la == L_CURLY => block_expr(p),
|
UNSAFE_KW if la == L_CURLY => {
|
||||||
L_CURLY => block_expr(p),
|
let m = p.start();
|
||||||
|
p.bump();
|
||||||
|
block_expr(p, Some(m))
|
||||||
|
},
|
||||||
|
L_CURLY => block_expr(p, None),
|
||||||
RETURN_KW => return_expr(p),
|
RETURN_KW => return_expr(p),
|
||||||
CONTINUE_KW => continue_expr(p),
|
CONTINUE_KW => continue_expr(p),
|
||||||
BREAK_KW => break_expr(p),
|
BREAK_KW => break_expr(p),
|
||||||
|
@ -323,11 +333,11 @@ fn match_arm(p: &mut Parser) -> BlockLike {
|
||||||
// fn foo() {
|
// fn foo() {
|
||||||
// {};
|
// {};
|
||||||
// unsafe {};
|
// unsafe {};
|
||||||
|
// 'label: {};
|
||||||
// }
|
// }
|
||||||
pub(super) fn block_expr(p: &mut Parser) -> CompletedMarker {
|
fn block_expr(p: &mut Parser, m: Option<Marker>) -> CompletedMarker {
|
||||||
assert!(p.at(L_CURLY) || p.at(UNSAFE_KW) && p.nth(1) == L_CURLY);
|
assert!(p.at(L_CURLY));
|
||||||
let m = p.start();
|
let m = m.unwrap_or_else(|| p.start());
|
||||||
p.eat(UNSAFE_KW);
|
|
||||||
block(p);
|
block(p);
|
||||||
m.complete(p, BLOCK_EXPR)
|
m.complete(p, BLOCK_EXPR)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
fn foo() {
|
fn foo() {
|
||||||
{};
|
{};
|
||||||
unsafe {};
|
unsafe {};
|
||||||
|
'label: {};
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
ROOT@[0; 36)
|
ROOT@[0; 52)
|
||||||
FN_DEF@[0; 35)
|
FN_DEF@[0; 51)
|
||||||
FN_KW@[0; 2)
|
FN_KW@[0; 2)
|
||||||
WHITESPACE@[2; 3)
|
WHITESPACE@[2; 3)
|
||||||
NAME@[3; 6)
|
NAME@[3; 6)
|
||||||
|
@ -8,7 +8,7 @@ ROOT@[0; 36)
|
||||||
L_PAREN@[6; 7)
|
L_PAREN@[6; 7)
|
||||||
R_PAREN@[7; 8)
|
R_PAREN@[7; 8)
|
||||||
WHITESPACE@[8; 9)
|
WHITESPACE@[8; 9)
|
||||||
BLOCK@[9; 35)
|
BLOCK@[9; 51)
|
||||||
L_CURLY@[9; 10)
|
L_CURLY@[9; 10)
|
||||||
WHITESPACE@[10; 15)
|
WHITESPACE@[10; 15)
|
||||||
EXPR_STMT@[15; 18)
|
EXPR_STMT@[15; 18)
|
||||||
|
@ -26,6 +26,17 @@ ROOT@[0; 36)
|
||||||
L_CURLY@[30; 31)
|
L_CURLY@[30; 31)
|
||||||
R_CURLY@[31; 32)
|
R_CURLY@[31; 32)
|
||||||
SEMI@[32; 33)
|
SEMI@[32; 33)
|
||||||
WHITESPACE@[33; 34)
|
WHITESPACE@[33; 38)
|
||||||
R_CURLY@[34; 35)
|
EXPR_STMT@[38; 49)
|
||||||
WHITESPACE@[35; 36)
|
BLOCK_EXPR@[38; 48)
|
||||||
|
LABEL@[38; 45)
|
||||||
|
LIFETIME@[38; 44) "'label"
|
||||||
|
COLON@[44; 45)
|
||||||
|
WHITESPACE@[45; 46)
|
||||||
|
BLOCK@[46; 48)
|
||||||
|
L_CURLY@[46; 47)
|
||||||
|
R_CURLY@[47; 48)
|
||||||
|
SEMI@[48; 49)
|
||||||
|
WHITESPACE@[49; 50)
|
||||||
|
R_CURLY@[50; 51)
|
||||||
|
WHITESPACE@[51; 52)
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
fn main() {
|
||||||
|
'loop: impl
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
ROOT@[0; 30)
|
||||||
|
FN_DEF@[0; 29)
|
||||||
|
FN_KW@[0; 2)
|
||||||
|
WHITESPACE@[2; 3)
|
||||||
|
NAME@[3; 7)
|
||||||
|
IDENT@[3; 7) "main"
|
||||||
|
PARAM_LIST@[7; 9)
|
||||||
|
L_PAREN@[7; 8)
|
||||||
|
R_PAREN@[8; 9)
|
||||||
|
WHITESPACE@[9; 10)
|
||||||
|
BLOCK@[10; 29)
|
||||||
|
L_CURLY@[10; 11)
|
||||||
|
WHITESPACE@[11; 16)
|
||||||
|
EXPR_STMT@[16; 22)
|
||||||
|
ERROR@[16; 22)
|
||||||
|
LABEL@[16; 22)
|
||||||
|
LIFETIME@[16; 21) "'loop"
|
||||||
|
COLON@[21; 22)
|
||||||
|
err: `expected a loop`
|
||||||
|
err: `expected SEMI`
|
||||||
|
WHITESPACE@[22; 23)
|
||||||
|
IMPL_ITEM@[23; 27)
|
||||||
|
IMPL_KW@[23; 27)
|
||||||
|
err: `expected type`
|
||||||
|
err: `expected `{``
|
||||||
|
WHITESPACE@[27; 28)
|
||||||
|
R_CURLY@[28; 29)
|
||||||
|
WHITESPACE@[29; 30)
|
28
crates/libsyntax2/tests/data/parser/ok/0033_label_break.rs
Normal file
28
crates/libsyntax2/tests/data/parser/ok/0033_label_break.rs
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
// format with label break value.
|
||||||
|
fn main() {
|
||||||
|
'empty_block: {}
|
||||||
|
|
||||||
|
'block: {
|
||||||
|
do_thing();
|
||||||
|
if condition_not_met() {
|
||||||
|
break 'block;
|
||||||
|
}
|
||||||
|
do_next_thing();
|
||||||
|
if condition_not_met() {
|
||||||
|
break 'block;
|
||||||
|
}
|
||||||
|
do_last_thing();
|
||||||
|
}
|
||||||
|
|
||||||
|
let result = 'block: {
|
||||||
|
if foo() {
|
||||||
|
// comment
|
||||||
|
break 'block 1;
|
||||||
|
}
|
||||||
|
if bar() {
|
||||||
|
/* comment */
|
||||||
|
break 'block 2;
|
||||||
|
}
|
||||||
|
3
|
||||||
|
};
|
||||||
|
}
|
215
crates/libsyntax2/tests/data/parser/ok/0033_label_break.txt
Normal file
215
crates/libsyntax2/tests/data/parser/ok/0033_label_break.txt
Normal file
|
@ -0,0 +1,215 @@
|
||||||
|
ROOT@[0; 506)
|
||||||
|
COMMENT@[0; 33)
|
||||||
|
WHITESPACE@[33; 34)
|
||||||
|
FN_DEF@[34; 505)
|
||||||
|
FN_KW@[34; 36)
|
||||||
|
WHITESPACE@[36; 37)
|
||||||
|
NAME@[37; 41)
|
||||||
|
IDENT@[37; 41) "main"
|
||||||
|
PARAM_LIST@[41; 43)
|
||||||
|
L_PAREN@[41; 42)
|
||||||
|
R_PAREN@[42; 43)
|
||||||
|
WHITESPACE@[43; 44)
|
||||||
|
BLOCK@[44; 505)
|
||||||
|
L_CURLY@[44; 45)
|
||||||
|
WHITESPACE@[45; 50)
|
||||||
|
EXPR_STMT@[50; 66)
|
||||||
|
BLOCK_EXPR@[50; 66)
|
||||||
|
LABEL@[50; 63)
|
||||||
|
LIFETIME@[50; 62) "'empty_block"
|
||||||
|
COLON@[62; 63)
|
||||||
|
WHITESPACE@[63; 64)
|
||||||
|
BLOCK@[64; 66)
|
||||||
|
L_CURLY@[64; 65)
|
||||||
|
R_CURLY@[65; 66)
|
||||||
|
WHITESPACE@[66; 72)
|
||||||
|
EXPR_STMT@[72; 295)
|
||||||
|
BLOCK_EXPR@[72; 295)
|
||||||
|
LABEL@[72; 79)
|
||||||
|
LIFETIME@[72; 78) "'block"
|
||||||
|
COLON@[78; 79)
|
||||||
|
WHITESPACE@[79; 80)
|
||||||
|
BLOCK@[80; 295)
|
||||||
|
L_CURLY@[80; 81)
|
||||||
|
WHITESPACE@[81; 90)
|
||||||
|
EXPR_STMT@[90; 101)
|
||||||
|
CALL_EXPR@[90; 100)
|
||||||
|
PATH_EXPR@[90; 98)
|
||||||
|
PATH@[90; 98)
|
||||||
|
PATH_SEGMENT@[90; 98)
|
||||||
|
NAME_REF@[90; 98)
|
||||||
|
IDENT@[90; 98) "do_thing"
|
||||||
|
ARG_LIST@[98; 100)
|
||||||
|
L_PAREN@[98; 99)
|
||||||
|
R_PAREN@[99; 100)
|
||||||
|
SEMI@[100; 101)
|
||||||
|
WHITESPACE@[101; 110)
|
||||||
|
EXPR_STMT@[110; 170)
|
||||||
|
IF_EXPR@[110; 170)
|
||||||
|
IF_KW@[110; 112)
|
||||||
|
WHITESPACE@[112; 113)
|
||||||
|
CONDITION@[113; 132)
|
||||||
|
CALL_EXPR@[113; 132)
|
||||||
|
PATH_EXPR@[113; 130)
|
||||||
|
PATH@[113; 130)
|
||||||
|
PATH_SEGMENT@[113; 130)
|
||||||
|
NAME_REF@[113; 130)
|
||||||
|
IDENT@[113; 130) "condition_not_met"
|
||||||
|
ARG_LIST@[130; 132)
|
||||||
|
L_PAREN@[130; 131)
|
||||||
|
R_PAREN@[131; 132)
|
||||||
|
WHITESPACE@[132; 133)
|
||||||
|
BLOCK@[133; 170)
|
||||||
|
L_CURLY@[133; 134)
|
||||||
|
WHITESPACE@[134; 147)
|
||||||
|
EXPR_STMT@[147; 160)
|
||||||
|
BREAK_EXPR@[147; 159)
|
||||||
|
BREAK_KW@[147; 152)
|
||||||
|
WHITESPACE@[152; 153)
|
||||||
|
LIFETIME@[153; 159) "'block"
|
||||||
|
SEMI@[159; 160)
|
||||||
|
WHITESPACE@[160; 169)
|
||||||
|
R_CURLY@[169; 170)
|
||||||
|
WHITESPACE@[170; 179)
|
||||||
|
EXPR_STMT@[179; 195)
|
||||||
|
CALL_EXPR@[179; 194)
|
||||||
|
PATH_EXPR@[179; 192)
|
||||||
|
PATH@[179; 192)
|
||||||
|
PATH_SEGMENT@[179; 192)
|
||||||
|
NAME_REF@[179; 192)
|
||||||
|
IDENT@[179; 192) "do_next_thing"
|
||||||
|
ARG_LIST@[192; 194)
|
||||||
|
L_PAREN@[192; 193)
|
||||||
|
R_PAREN@[193; 194)
|
||||||
|
SEMI@[194; 195)
|
||||||
|
WHITESPACE@[195; 204)
|
||||||
|
EXPR_STMT@[204; 264)
|
||||||
|
IF_EXPR@[204; 264)
|
||||||
|
IF_KW@[204; 206)
|
||||||
|
WHITESPACE@[206; 207)
|
||||||
|
CONDITION@[207; 226)
|
||||||
|
CALL_EXPR@[207; 226)
|
||||||
|
PATH_EXPR@[207; 224)
|
||||||
|
PATH@[207; 224)
|
||||||
|
PATH_SEGMENT@[207; 224)
|
||||||
|
NAME_REF@[207; 224)
|
||||||
|
IDENT@[207; 224) "condition_not_met"
|
||||||
|
ARG_LIST@[224; 226)
|
||||||
|
L_PAREN@[224; 225)
|
||||||
|
R_PAREN@[225; 226)
|
||||||
|
WHITESPACE@[226; 227)
|
||||||
|
BLOCK@[227; 264)
|
||||||
|
L_CURLY@[227; 228)
|
||||||
|
WHITESPACE@[228; 241)
|
||||||
|
EXPR_STMT@[241; 254)
|
||||||
|
BREAK_EXPR@[241; 253)
|
||||||
|
BREAK_KW@[241; 246)
|
||||||
|
WHITESPACE@[246; 247)
|
||||||
|
LIFETIME@[247; 253) "'block"
|
||||||
|
SEMI@[253; 254)
|
||||||
|
WHITESPACE@[254; 263)
|
||||||
|
R_CURLY@[263; 264)
|
||||||
|
WHITESPACE@[264; 273)
|
||||||
|
EXPR_STMT@[273; 289)
|
||||||
|
CALL_EXPR@[273; 288)
|
||||||
|
PATH_EXPR@[273; 286)
|
||||||
|
PATH@[273; 286)
|
||||||
|
PATH_SEGMENT@[273; 286)
|
||||||
|
NAME_REF@[273; 286)
|
||||||
|
IDENT@[273; 286) "do_last_thing"
|
||||||
|
ARG_LIST@[286; 288)
|
||||||
|
L_PAREN@[286; 287)
|
||||||
|
R_PAREN@[287; 288)
|
||||||
|
SEMI@[288; 289)
|
||||||
|
WHITESPACE@[289; 294)
|
||||||
|
R_CURLY@[294; 295)
|
||||||
|
WHITESPACE@[295; 301)
|
||||||
|
LET_STMT@[301; 503)
|
||||||
|
LET_KW@[301; 304)
|
||||||
|
WHITESPACE@[304; 305)
|
||||||
|
BIND_PAT@[305; 311)
|
||||||
|
NAME@[305; 311)
|
||||||
|
IDENT@[305; 311) "result"
|
||||||
|
WHITESPACE@[311; 312)
|
||||||
|
EQ@[312; 313)
|
||||||
|
WHITESPACE@[313; 314)
|
||||||
|
BLOCK_EXPR@[314; 502)
|
||||||
|
LABEL@[314; 321)
|
||||||
|
LIFETIME@[314; 320) "'block"
|
||||||
|
COLON@[320; 321)
|
||||||
|
WHITESPACE@[321; 322)
|
||||||
|
BLOCK@[322; 502)
|
||||||
|
L_CURLY@[322; 323)
|
||||||
|
WHITESPACE@[323; 332)
|
||||||
|
EXPR_STMT@[332; 403)
|
||||||
|
IF_EXPR@[332; 403)
|
||||||
|
IF_KW@[332; 334)
|
||||||
|
WHITESPACE@[334; 335)
|
||||||
|
CONDITION@[335; 340)
|
||||||
|
CALL_EXPR@[335; 340)
|
||||||
|
PATH_EXPR@[335; 338)
|
||||||
|
PATH@[335; 338)
|
||||||
|
PATH_SEGMENT@[335; 338)
|
||||||
|
NAME_REF@[335; 338)
|
||||||
|
IDENT@[335; 338) "foo"
|
||||||
|
ARG_LIST@[338; 340)
|
||||||
|
L_PAREN@[338; 339)
|
||||||
|
R_PAREN@[339; 340)
|
||||||
|
WHITESPACE@[340; 341)
|
||||||
|
BLOCK@[341; 403)
|
||||||
|
L_CURLY@[341; 342)
|
||||||
|
WHITESPACE@[342; 355)
|
||||||
|
COMMENT@[355; 365)
|
||||||
|
WHITESPACE@[365; 378)
|
||||||
|
EXPR_STMT@[378; 393)
|
||||||
|
BREAK_EXPR@[378; 392)
|
||||||
|
BREAK_KW@[378; 383)
|
||||||
|
WHITESPACE@[383; 384)
|
||||||
|
LIFETIME@[384; 390) "'block"
|
||||||
|
WHITESPACE@[390; 391)
|
||||||
|
LITERAL@[391; 392)
|
||||||
|
INT_NUMBER@[391; 392) "1"
|
||||||
|
SEMI@[392; 393)
|
||||||
|
WHITESPACE@[393; 402)
|
||||||
|
R_CURLY@[402; 403)
|
||||||
|
WHITESPACE@[403; 412)
|
||||||
|
EXPR_STMT@[412; 486)
|
||||||
|
IF_EXPR@[412; 486)
|
||||||
|
IF_KW@[412; 414)
|
||||||
|
WHITESPACE@[414; 415)
|
||||||
|
CONDITION@[415; 420)
|
||||||
|
CALL_EXPR@[415; 420)
|
||||||
|
PATH_EXPR@[415; 418)
|
||||||
|
PATH@[415; 418)
|
||||||
|
PATH_SEGMENT@[415; 418)
|
||||||
|
NAME_REF@[415; 418)
|
||||||
|
IDENT@[415; 418) "bar"
|
||||||
|
ARG_LIST@[418; 420)
|
||||||
|
L_PAREN@[418; 419)
|
||||||
|
R_PAREN@[419; 420)
|
||||||
|
WHITESPACE@[420; 421)
|
||||||
|
BLOCK@[421; 486)
|
||||||
|
L_CURLY@[421; 422)
|
||||||
|
WHITESPACE@[422; 435)
|
||||||
|
COMMENT@[435; 448)
|
||||||
|
WHITESPACE@[448; 461)
|
||||||
|
EXPR_STMT@[461; 476)
|
||||||
|
BREAK_EXPR@[461; 475)
|
||||||
|
BREAK_KW@[461; 466)
|
||||||
|
WHITESPACE@[466; 467)
|
||||||
|
LIFETIME@[467; 473) "'block"
|
||||||
|
WHITESPACE@[473; 474)
|
||||||
|
LITERAL@[474; 475)
|
||||||
|
INT_NUMBER@[474; 475) "2"
|
||||||
|
SEMI@[475; 476)
|
||||||
|
WHITESPACE@[476; 485)
|
||||||
|
R_CURLY@[485; 486)
|
||||||
|
WHITESPACE@[486; 495)
|
||||||
|
LITERAL@[495; 496)
|
||||||
|
INT_NUMBER@[495; 496) "3"
|
||||||
|
WHITESPACE@[496; 501)
|
||||||
|
R_CURLY@[501; 502)
|
||||||
|
SEMI@[502; 503)
|
||||||
|
WHITESPACE@[503; 504)
|
||||||
|
R_CURLY@[504; 505)
|
||||||
|
WHITESPACE@[505; 506)
|
|
@ -11,7 +11,8 @@ use gen_lsp_server::{run_server, stdio_transport};
|
||||||
use m::Result;
|
use m::Result;
|
||||||
|
|
||||||
fn main() -> Result<()> {
|
fn main() -> Result<()> {
|
||||||
Logger::with_env_or_str("m=error")
|
::std::env::set_var("RUST_BACKTRACE", "short");
|
||||||
|
Logger::with_env_or_str("error")
|
||||||
.duplicate_to_stderr(Duplicate::All)
|
.duplicate_to_stderr(Duplicate::All)
|
||||||
.log_to_file()
|
.log_to_file()
|
||||||
.directory("log")
|
.directory("log")
|
||||||
|
|
|
@ -38,7 +38,9 @@ pub fn main_loop(
|
||||||
msg_sender: &mut Sender<RawMessage>,
|
msg_sender: &mut Sender<RawMessage>,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let pool = rayon::ThreadPoolBuilder::new()
|
let pool = rayon::ThreadPoolBuilder::new()
|
||||||
.num_threads(4).build()
|
.num_threads(4)
|
||||||
|
.panic_handler(|_| error!("thread panicked :("))
|
||||||
|
.build()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let (task_sender, task_receiver) = unbounded::<Task>();
|
let (task_sender, task_receiver) = unbounded::<Task>();
|
||||||
let (fs_sender, fs_receiver, fs_watcher) = vfs::roots_loader();
|
let (fs_sender, fs_receiver, fs_watcher) = vfs::roots_loader();
|
||||||
|
|
Loading…
Reference in a new issue