Skip to content

Commit

Permalink
feat: add lambda expression and parameter error recovery (#692)
Browse files Browse the repository at this point in the history
  • Loading branch information
Peefy authored Sep 1, 2023
1 parent 9d07ce9 commit 442a34e
Show file tree
Hide file tree
Showing 9 changed files with 346 additions and 0 deletions.
4 changes: 4 additions & 0 deletions kclvm/parser/src/parser/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1928,6 +1928,8 @@ impl<'a> Parser<'a> {
};

loop {
let marker = self.mark();

if matches!(
self.token.kind,
TokenKind::CloseDelim(DelimToken::Brace) | TokenKind::Dedent | TokenKind::Eof
Expand All @@ -1940,6 +1942,8 @@ impl<'a> Parser<'a> {
} else {
self.bump();
}

self.drop(marker);
}

// _DEDENT
Expand Down
4 changes: 4 additions & 0 deletions kclvm/parser/src/parser/stmt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -792,6 +792,8 @@ impl<'a> Parser<'a> {
};

loop {
let marker = self.mark();

let mut has_close_token = false;
for token in close_tokens {
if *token == self.token.kind {
Expand Down Expand Up @@ -846,6 +848,8 @@ impl<'a> Parser<'a> {
if let TokenKind::Comma = self.token.kind {
self.bump();
}

self.drop(marker);
}

self.skip_newlines();
Expand Down
6 changes: 6 additions & 0 deletions kclvm/parser/src/tests/error_recovery.rs
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,12 @@ parse_expr_snapshot! { joined_string_recovery_2, r#"'${(a +}'"# }
parse_expr_snapshot! { joined_string_recovery_3, r#"'${a'"# }
parse_expr_snapshot! { joined_string_recovery_5, r#"'${a + 1 = }'"# }
parse_expr_snapshot! { joined_string_recovery_6, r#"'${a: json}'"# }
parse_expr_snapshot! { lambda_recovery_0, r#"lambda"# }
parse_expr_snapshot! { lambda_recovery_1, r#"lambda {"# }
parse_expr_snapshot! { lambda_recovery_2, r#"lambda {}"# }
parse_expr_snapshot! { lambda_recovery_3, r#"{lambda}"# }
parse_expr_snapshot! { lambda_recovery_4, r#"{lambda{}"# }
parse_expr_snapshot! { lambda_recovery_5, r#"{lambda a{}"# }

/* Stmt error recovery */

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
---
source: parser/src/tests/error_recovery.rs
assertion_line: 158
expression: "crate::tests::parsing_expr_string(r#\"lambda\"#)"
---
Node {
node: Lambda(
LambdaExpr {
args: Some(
Node {
node: Arguments {
args: [],
defaults: [],
type_annotation_list: [],
ty_list: [],
},
filename: "",
line: 1,
column: 6,
end_line: 1,
end_column: 6,
},
),
return_type_str: None,
body: [],
return_ty: None,
},
),
filename: "",
line: 1,
column: 0,
end_line: 1,
end_column: 6,
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
---
source: parser/src/tests/error_recovery.rs
assertion_line: 159
expression: "crate::tests::parsing_expr_string(r#\"lambda {\"#)"
---
Node {
node: Lambda(
LambdaExpr {
args: None,
return_type_str: None,
body: [],
return_ty: None,
},
),
filename: "",
line: 1,
column: 0,
end_line: 1,
end_column: 8,
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
---
source: parser/src/tests/error_recovery.rs
assertion_line: 160
expression: "crate::tests::parsing_expr_string(r#\"lambda {}\"#)"
---
Node {
node: Lambda(
LambdaExpr {
args: None,
return_type_str: None,
body: [],
return_ty: None,
},
),
filename: "",
line: 1,
column: 0,
end_line: 1,
end_column: 9,
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
---
source: parser/src/tests/error_recovery.rs
assertion_line: 161
expression: "crate::tests::parsing_expr_string(r#\"{lambda}\"#)"
---
Node {
node: Config(
ConfigExpr {
items: [
Node {
node: ConfigEntry {
key: Some(
Node {
node: Lambda(
LambdaExpr {
args: Some(
Node {
node: Arguments {
args: [
Node {
node: Identifier {
names: [
Node {
node: "",
filename: "",
line: 1,
column: 7,
end_line: 1,
end_column: 7,
},
],
pkgpath: "",
ctx: Load,
},
filename: "",
line: 1,
column: 7,
end_line: 1,
end_column: 7,
},
],
defaults: [
None,
],
type_annotation_list: [
None,
],
ty_list: [
None,
],
},
filename: "",
line: 1,
column: 7,
end_line: 1,
end_column: 8,
},
),
return_type_str: None,
body: [],
return_ty: None,
},
),
filename: "",
line: 1,
column: 1,
end_line: 1,
end_column: 8,
},
),
value: Node {
node: Missing(
MissingExpr,
),
filename: "",
line: 1,
column: 8,
end_line: 1,
end_column: 8,
},
operation: Override,
insert_index: -1,
},
filename: "",
line: 1,
column: 1,
end_line: 1,
end_column: 8,
},
],
},
),
filename: "",
line: 1,
column: 0,
end_line: 1,
end_column: 8,
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
---
source: parser/src/tests/error_recovery.rs
assertion_line: 162
expression: "crate::tests::parsing_expr_string(r#\"{lambda{}\"#)"
---
Node {
node: Config(
ConfigExpr {
items: [
Node {
node: ConfigEntry {
key: Some(
Node {
node: Lambda(
LambdaExpr {
args: None,
return_type_str: None,
body: [],
return_ty: None,
},
),
filename: "",
line: 1,
column: 1,
end_line: 1,
end_column: 9,
},
),
value: Node {
node: Missing(
MissingExpr,
),
filename: "",
line: 1,
column: 9,
end_line: 1,
end_column: 9,
},
operation: Override,
insert_index: -1,
},
filename: "",
line: 1,
column: 1,
end_line: 1,
end_column: 9,
},
],
},
),
filename: "",
line: 1,
column: 0,
end_line: 1,
end_column: 9,
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
---
source: parser/src/tests/error_recovery.rs
assertion_line: 163
expression: "crate::tests::parsing_expr_string(r#\"{lambda a{}\"#)"
---
Node {
node: Config(
ConfigExpr {
items: [
Node {
node: ConfigEntry {
key: Some(
Node {
node: Lambda(
LambdaExpr {
args: Some(
Node {
node: Arguments {
args: [
Node {
node: Identifier {
names: [
Node {
node: "a",
filename: "",
line: 1,
column: 8,
end_line: 1,
end_column: 9,
},
],
pkgpath: "",
ctx: Load,
},
filename: "",
line: 1,
column: 8,
end_line: 1,
end_column: 9,
},
],
defaults: [
None,
],
type_annotation_list: [
None,
],
ty_list: [
None,
],
},
filename: "",
line: 1,
column: 8,
end_line: 1,
end_column: 9,
},
),
return_type_str: None,
body: [],
return_ty: None,
},
),
filename: "",
line: 1,
column: 1,
end_line: 1,
end_column: 11,
},
),
value: Node {
node: Missing(
MissingExpr,
),
filename: "",
line: 1,
column: 11,
end_line: 1,
end_column: 11,
},
operation: Override,
insert_index: -1,
},
filename: "",
line: 1,
column: 1,
end_line: 1,
end_column: 11,
},
],
},
),
filename: "",
line: 1,
column: 0,
end_line: 1,
end_column: 11,
}

0 comments on commit 442a34e

Please sign in to comment.