|
|
@ -198,8 +198,9 @@ pub(crate) fn parse_query(
|
|
|
|
algo_impl.process_options(&mut options, span)?;
|
|
|
|
algo_impl.process_options(&mut options, span)?;
|
|
|
|
let arity = algo_impl.arity(&options, &head, span)?;
|
|
|
|
let arity = algo_impl.arity(&options, &head, span)?;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ensure!(arity != 0, EmptyRowForConstRule(span));
|
|
|
|
ensure!(
|
|
|
|
ensure!(
|
|
|
|
arity == 0 || head.is_empty() || arity == head.len(),
|
|
|
|
head.is_empty() || arity == head.len(),
|
|
|
|
FixedRuleHeadArityMismatch(arity, head.len(), span)
|
|
|
|
FixedRuleHeadArityMismatch(arity, head.len(), span)
|
|
|
|
);
|
|
|
|
);
|
|
|
|
progs.insert(
|
|
|
|
progs.insert(
|
|
|
@ -764,6 +765,11 @@ fn parse_algo_rule(
|
|
|
|
#[diagnostic(help("Expected arity: {0}, number of arguments given: {1}"))]
|
|
|
|
#[diagnostic(help("Expected arity: {0}, number of arguments given: {1}"))]
|
|
|
|
struct FixedRuleHeadArityMismatch(usize, usize, #[label] SourceSpan);
|
|
|
|
struct FixedRuleHeadArityMismatch(usize, usize, #[label] SourceSpan);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Error, Diagnostic)]
|
|
|
|
|
|
|
|
#[error("Encountered empty row for constant rule")]
|
|
|
|
|
|
|
|
#[diagnostic(code(parser::const_rule_empty_row))]
|
|
|
|
|
|
|
|
struct EmptyRowForConstRule(#[label] SourceSpan);
|
|
|
|
|
|
|
|
|
|
|
|
fn make_empty_const_rule(prog: &mut InputProgram, bindings: &[Symbol]) {
|
|
|
|
fn make_empty_const_rule(prog: &mut InputProgram, bindings: &[Symbol]) {
|
|
|
|
let entry_symbol = Symbol::new(PROG_ENTRY, Default::default());
|
|
|
|
let entry_symbol = Symbol::new(PROG_ENTRY, Default::default());
|
|
|
|
let mut options = BTreeMap::new();
|
|
|
|
let mut options = BTreeMap::new();
|
|
|
|