summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2022-05-04 23:26:15 +0200
committerLaurenz <laurmaedje@gmail.com>2022-05-04 23:26:15 +0200
commit1bca9ccecb9edb583a0a94bd3611147b66909ab9 (patch)
treec9068332196eb754d65c6b51f124e39e91d3cd1a /src
parent2a45650dcc87c3bf047adaf030fd392bbe9fbb5e (diff)
Improve diagnostics
Diffstat (limited to 'src')
-rw-r--r--src/parse/mod.rs12
-rw-r--r--src/parse/parser.rs8
-rw-r--r--src/syntax/ast.rs2
-rw-r--r--src/syntax/mod.rs4
4 files changed, 18 insertions, 8 deletions
diff --git a/src/parse/mod.rs b/src/parse/mod.rs
index 8bf7b1c5..b473c9af 100644
--- a/src/parse/mod.rs
+++ b/src/parse/mod.rs
@@ -604,6 +604,7 @@ fn collection(p: &mut Parser, keyed: bool) -> (CollectionKind, usize) {
missing_coma = Some(p.trivia_start());
}
} else {
+ p.eat_if(NodeKind::Comma);
kind = Some(CollectionKind::Group);
}
}
@@ -638,11 +639,15 @@ fn item(p: &mut Parser, keyed: bool) -> ParseResult<NodeKind> {
p.eat();
marker.perform(p, NodeKind::Keyed, expr)?;
}
- _ => {
+ kind => {
let mut msg = EcoString::from("expected identifier");
if keyed {
msg.push_str(" or string");
}
+ if let Some(kind) = kind {
+ msg.push_str(", found ");
+ msg.push_str(kind.as_str());
+ }
let error = NodeKind::Error(ErrorPos::Full, msg);
marker.end(p, error);
p.eat();
@@ -661,8 +666,7 @@ fn item(p: &mut Parser, keyed: bool) -> ParseResult<NodeKind> {
/// expressions.
fn array(p: &mut Parser, marker: Marker) {
marker.filter_children(p, |x| match x.kind() {
- NodeKind::Named => Err("expected expression, found named pair"),
- NodeKind::Keyed => Err("expected expression, found keyed pair"),
+ NodeKind::Named | NodeKind::Keyed => Err("expected expression"),
_ => Ok(()),
});
marker.end(p, NodeKind::ArrayExpr);
@@ -685,7 +689,7 @@ fn dict(p: &mut Parser, marker: Marker) {
Ok(())
}
NodeKind::Spread | NodeKind::Comma | NodeKind::Colon => Ok(()),
- _ => Err("expected named or keyed pair, found expression"),
+ _ => Err("expected named or keyed pair"),
});
marker.end(p, NodeKind::DictExpr);
}
diff --git a/src/parse/parser.rs b/src/parse/parser.rs
index 50bb5711..f3a3ffd1 100644
--- a/src/parse/parser.rs
+++ b/src/parse/parser.rs
@@ -4,6 +4,7 @@ use std::ops::Range;
use super::{TokenMode, Tokens};
use crate::syntax::{ErrorPos, Green, GreenData, GreenNode, NodeKind};
+use crate::util::EcoString;
/// A convenient token-based parser.
pub struct Parser<'s> {
@@ -474,7 +475,12 @@ impl Marker {
}
if let Err(msg) = f(child) {
- let error = NodeKind::Error(ErrorPos::Full, msg.into());
+ let mut msg = EcoString::from(msg);
+ if msg.starts_with("expected") {
+ msg.push_str(", found ");
+ msg.push_str(child.kind().as_str());
+ }
+ let error = NodeKind::Error(ErrorPos::Full, msg);
let inner = mem::take(child);
*child = GreenNode::with_child(error, inner).into();
}
diff --git a/src/syntax/ast.rs b/src/syntax/ast.rs
index 1add2fd6..95421213 100644
--- a/src/syntax/ast.rs
+++ b/src/syntax/ast.rs
@@ -964,7 +964,7 @@ pub enum ClosureParam {
Pos(Ident),
/// A named parameter with a default value: `draw: false`.
Named(Named),
- /// A parameter sink: `..args`.
+ /// An argument sink: `..args`.
Sink(Ident),
}
diff --git a/src/syntax/mod.rs b/src/syntax/mod.rs
index 09d7265d..abe541b8 100644
--- a/src/syntax/mod.rs
+++ b/src/syntax/mod.rs
@@ -662,7 +662,7 @@ pub enum NodeKind {
MethodCall,
/// A function call's argument list: `(x, y)`.
CallArgs,
- /// Spreaded arguments or a parameter sink: `..x`.
+ /// Spreaded arguments or a argument sink: `..x`.
Spread,
/// A closure expression: `(x, y) => z`.
ClosureExpr,
@@ -906,7 +906,7 @@ impl NodeKind {
Self::FuncCall => "function call",
Self::MethodCall => "method call",
Self::CallArgs => "call arguments",
- Self::Spread => "parameter sink",
+ Self::Spread => "spread",
Self::ClosureExpr => "closure",
Self::ClosureParams => "closure parameters",
Self::LetExpr => "`let` expression",