Skip to content

Commit a4ecbb3

Browse files
committed
feat: better fn fault tolerate
1 parent 31068a7 commit a4ecbb3

File tree

8 files changed

+215
-23
lines changed

8 files changed

+215
-23
lines changed

src/ast/ctx/completion.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,11 +222,12 @@ impl Ctx<'_> {
222222
pub(crate) fn get_keyword_completions(&self, vmap: &mut FxHashMap<Ustr, CompletionItem>) {
223223
let keywords = vec![
224224
"if", "else", "while", "for", "return", "struct", "let", "true", "false", "as", "is",
225-
"gen", "yield", "match",
225+
"gen", "yield", "match", "async", "await",
226226
];
227227
let loopkeys = vec!["break", "continue"];
228228
let toplevel = vec![
229229
"fn", "struct", "const", "var", "use", "impl", "trait", "pub", "type", "gen", "where",
230+
"async",
230231
];
231232
if self.parent.is_none() {
232233
for k in toplevel {

src/ast/diag.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ define_diag!(
180180
ONLY_TASK_CAN_BE_AWAIT = "only Task can be awaited",
181181
GENERATOR_FUNCTION_CANNOT_RETURN_VOID = "generator function cannot return void",
182182
MACRO_EXPANSION_FAILED = "macro expansion failed",
183+
SYNTAX_ERROR_FUNC_PARAM = "syntax error: function parameter",
183184
);
184185

185186
define_diag! {

src/ast/expects/match_diag.pi.expect

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,7 @@
5050
code: Err(
5151
SYNTAX_ERROR_UNEXPECTED_TOKEN,
5252
),
53-
help: Some(
54-
"",
55-
),
53+
help: None,
5654
labels: [],
5755
source: None,
5856
range: Range {
@@ -74,9 +72,7 @@
7472
code: Err(
7573
SYNTAX_ERROR_UNEXPECTED_TOKEN,
7674
),
77-
help: Some(
78-
"",
79-
),
75+
help: None,
8076
labels: [],
8177
source: None,
8278
range: Range {

src/ast/expects/test_diag.pi.expect

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,72 @@
473473
},
474474
},
475475
},
476+
PLDiag {
477+
raw: PLDiagRaw {
478+
code: Err(
479+
SYNTAX_ERROR_UNEXPECTED_TOKEN,
480+
),
481+
help: None,
482+
labels: [],
483+
source: None,
484+
range: Range {
485+
start: Pos {
486+
line: 153,
487+
column: 17,
488+
offset: 1616,
489+
},
490+
end: Pos {
491+
line: 153,
492+
column: 18,
493+
offset: 1617,
494+
},
495+
},
496+
},
497+
},
498+
PLDiag {
499+
raw: PLDiagRaw {
500+
code: Err(
501+
SYNTAX_ERROR_UNEXPECTED_TOKEN,
502+
),
503+
help: None,
504+
labels: [],
505+
source: None,
506+
range: Range {
507+
start: Pos {
508+
line: 158,
509+
column: 17,
510+
offset: 1663,
511+
},
512+
end: Pos {
513+
line: 158,
514+
column: 17,
515+
offset: 1663,
516+
},
517+
},
518+
},
519+
},
520+
PLDiag {
521+
raw: PLDiagRaw {
522+
code: Err(
523+
SYNTAX_ERROR_UNEXPECTED_TOKEN,
524+
),
525+
help: None,
526+
labels: [],
527+
source: None,
528+
range: Range {
529+
start: Pos {
530+
line: 163,
531+
column: 17,
532+
offset: 1709,
533+
},
534+
end: Pos {
535+
line: 163,
536+
column: 18,
537+
offset: 1710,
538+
},
539+
},
540+
},
541+
},
476542
PLDiag {
477543
raw: PLDiagRaw {
478544
code: Err(
@@ -1046,6 +1112,30 @@
10461112
},
10471113
},
10481114
},
1115+
PLDiag {
1116+
raw: PLDiagRaw {
1117+
code: Err(
1118+
SYNTAX_ERROR_REDUNDENT_SYMBOL,
1119+
),
1120+
help: Some(
1121+
"remove this redundant symbol",
1122+
),
1123+
labels: [],
1124+
source: None,
1125+
range: Range {
1126+
start: Pos {
1127+
line: 158,
1128+
column: 17,
1129+
offset: 1663,
1130+
},
1131+
end: Pos {
1132+
line: 158,
1133+
column: 18,
1134+
offset: 1664,
1135+
},
1136+
},
1137+
},
1138+
},
10491139
PLDiag {
10501140
raw: PLDiagRaw {
10511141
code: Err(
@@ -1116,6 +1206,30 @@
11161206
},
11171207
},
11181208
},
1209+
PLDiag {
1210+
raw: PLDiagRaw {
1211+
code: Err(
1212+
SYNTAX_ERROR_FUNC_PARAM,
1213+
),
1214+
help: Some(
1215+
"cannot recognize function parameters",
1216+
),
1217+
labels: [],
1218+
source: None,
1219+
range: Range {
1220+
start: Pos {
1221+
line: 153,
1222+
column: 17,
1223+
offset: 1616,
1224+
},
1225+
end: Pos {
1226+
line: 153,
1227+
column: 19,
1228+
offset: 1618,
1229+
},
1230+
},
1231+
},
1232+
},
11191233
PLDiag {
11201234
raw: PLDiagRaw {
11211235
code: Warn(
@@ -1392,6 +1506,52 @@
13921506
},
13931507
},
13941508
},
1509+
PLDiag {
1510+
raw: PLDiagRaw {
1511+
code: Warn(
1512+
UNUSED_VARIABLE,
1513+
),
1514+
help: None,
1515+
labels: [
1516+
PLLabel {
1517+
file: u!(""),
1518+
txt: Some(
1519+
(
1520+
u!("Unused variable `{}`"),
1521+
[
1522+
u!("b"),
1523+
],
1524+
),
1525+
),
1526+
range: Range {
1527+
start: Pos {
1528+
line: 163,
1529+
column: 20,
1530+
offset: 1712,
1531+
},
1532+
end: Pos {
1533+
line: 163,
1534+
column: 21,
1535+
offset: 1713,
1536+
},
1537+
},
1538+
},
1539+
],
1540+
source: None,
1541+
range: Range {
1542+
start: Pos {
1543+
line: 163,
1544+
column: 20,
1545+
offset: 1712,
1546+
},
1547+
end: Pos {
1548+
line: 163,
1549+
column: 21,
1550+
offset: 1713,
1551+
},
1552+
},
1553+
},
1554+
},
13951555
PLDiag {
13961556
raw: PLDiagRaw {
13971557
code: Warn(

src/ast/node/function.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1512,9 +1512,6 @@ impl Node for ClosureNode {
15121512
let mut ori_v = *ori_v;
15131513
if ctx.generator_data.is_some() && !*prev_gen {
15141514
// load it before store it
1515-
if *k == "sadasdasdas" {
1516-
eprintln!("load_generator_data {}", prev_gen);
1517-
}
15181515
ori_v = builder.build_load(
15191516
ori_v,
15201517
&format!("load_generator_data{}", k),

src/nomparser/function.rs

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
1+
use error::{err_tolerable_seplist0, match_paired_until};
12
use nom::{
23
branch::alt,
3-
combinator::{map_res, opt},
4+
combinator::{map, map_res, opt, peek},
45
multi::{many0, separated_list0},
5-
sequence::{preceded, tuple},
6+
sequence::{preceded, terminated, tuple},
67
IResult,
78
};
89

9-
use crate::{ast::node::function::FuncDefNode, ast::tokens::TokenType};
10+
use crate::ast::{diag::ErrorCode, node::function::FuncDefNode, tokens::TokenType};
1011
use crate::{ast::node::function::GeneratorType, nomparser::Span};
1112

1213
use internal_macro::{test_parser, test_parser_error};
1314

1415
use super::*;
1516

17+
#[test_parser("fn f(a,) int;")]
1618
#[test_parser(
1719
"
1820
/// this is a comment
@@ -90,21 +92,36 @@ pub fn function_def(input: Span) -> IResult<Span, Box<TopLevel>> {
9092
identifier,
9193
opt(generic_type_def),
9294
tag_token_symbol(TokenType::LPAREN),
93-
del_newline_or_space!(separated_list0(
94-
tag_token_symbol(TokenType::COMMA),
95-
del_newline_or_space!(typed_identifier),
95+
alt((
96+
terminated(
97+
del_newline_or_space!(err_tolerable_seplist0(
98+
del_newline_or_space!(typed_identifier),
99+
del_newline_or_space!(typed_identifier),
100+
TokenType::COMMA,
101+
)),
102+
peek(tag_token_symbol(TokenType::RPAREN)),
103+
),
104+
map(
105+
match_paired_until(
106+
")",
107+
ErrorCode::SYNTAX_ERROR_FUNC_PARAM,
108+
"cannot recognize function parameters",
109+
),
110+
|_| vec![],
111+
),
96112
)),
97113
tag_token_symbol(TokenType::RPAREN),
98114
type_name,
99115
opt(del_newline_or_space!(preceded(
100116
tag_token_symbol(TokenType::WHERE),
101-
separated_list0(
102-
tag_token_symbol(TokenType::COMMA),
117+
err_tolerable_seplist0(
103118
del_newline_or_space!(trait_bound),
104-
),
119+
del_newline_or_space!(trait_bound),
120+
TokenType::COMMA
121+
)
105122
))),
106123
alt((
107-
map_res(statement_block, |b| Ok::<_, ()>((Some(b.clone()), b.range))),
124+
map(statement_block, |b| (Some(b.clone()), b.range)),
108125
map_res(tag_token_symbol(TokenType::SEMI), |(_, range)| {
109126
Ok::<_, ()>((None, range))
110127
}),

src/nomparser/mod.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,12 @@ impl State {
4444
}
4545

4646
pub fn raise_error(&self, err: ErrorNode) {
47-
self.errors
48-
.borrow_mut()
49-
.push(err.range.new_err(err.code).add_help(&err.msg).clone());
47+
let e = if !err.msg.is_empty() {
48+
err.range.new_err(err.code).add_help(&err.msg).clone()
49+
} else {
50+
err.range.new_err(err.code).clone()
51+
};
52+
self.errors.borrow_mut().push(e);
5053
}
5154
}
5255

test/lsp_diag/test_diag.pi

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,3 +148,20 @@ use std::task::Task;
148148
async fn async_f1() Task<()> {
149149
return 1;
150150
}
151+
152+
153+
fn test_f_diag1(a,) void {
154+
155+
return;
156+
}
157+
158+
fn test_f_diag2(,) void {
159+
160+
return;
161+
}
162+
163+
fn test_f_diag3(a, b:i64) void {
164+
165+
return;
166+
}
167+

0 commit comments

Comments
 (0)