h1: make | operator work with anything other than syntactic calls (in which case it just calls the value)

in case you call a function to get a function, parenthesise it

    1 | getFunction ()   -- getFunction 1 ()
    1 | (getFunction ()) -- (getFunction ()) 1
This commit is contained in:
りき萌 2025-09-03 16:57:10 +02:00
parent ec7ee9626f
commit a4c18c37dc

View file

@ -460,36 +460,36 @@ fn compile_pipe_call<'a>(
left: NodeId, left: NodeId,
call: NodeId, call: NodeId,
) -> CompileResult { ) -> CompileResult {
if src.ast.kind(call) != NodeKind::Call { match src.ast.kind(call) {
c.emit(Diagnostic::error( NodeKind::Call => {
src.ast.span(call), let mut walk = src.ast.walk(call);
"the right side of a pipe `|` must be a function call", let Some(func) = walk.node() else {
)); return Ok(());
return Ok(()); };
compile_expr(c, src, left)?;
let mut argument_count = 1;
while let Some(arg) = walk.node() {
compile_expr(c, src, arg)?;
argument_count += 1;
}
let argument_count = u8::try_from(argument_count).unwrap_or_else(|_| {
c.emit(Diagnostic::error(
src.ast.span(call),
"function call has too many arguments",
));
0
});
emit_nary_call(c, src, func, argument_count)?;
}
_ => {
compile_expr(c, src, left)?;
emit_nary_call(c, src, call, 1)?;
}
} }
let mut walk = src.ast.walk(call);
let Some(func) = walk.node() else {
return Ok(());
};
compile_expr(c, src, left)?;
let mut argument_count = 1;
while let Some(arg) = walk.node() {
compile_expr(c, src, arg)?;
argument_count += 1;
}
let argument_count = u8::try_from(argument_count).unwrap_or_else(|_| {
c.emit(Diagnostic::error(
src.ast.span(call),
"function call has too many arguments",
));
0
});
emit_nary_call(c, src, func, argument_count)?;
Ok(()) Ok(())
} }