Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Fix 3 parser test cases in parsing #2284

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion crates/noirc_errors/src/reporter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ impl CustomDiagnostic {
matches!(self.kind, DiagnosticKind::Error)
}

pub fn is_warrning(&self) -> bool {
pub fn is_warning(&self) -> bool {
matches!(self.kind, DiagnosticKind::Warning)
}
}
Expand Down
66 changes: 46 additions & 20 deletions crates/noirc_frontend/src/parser/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1468,16 +1468,33 @@ mod test {
{
vecmap(programs, move |program| {
let message = format!("Failed to parse:\n{}", program);
let (op_t, errors) = parse_recover(&parser, program);
for e in errors {
if !e.is_warrning() {
panic!("{}", &message);
let (op_t, diagnostics) = parse_recover(&parser, program);
diagnostics.iter().for_each(|diagnostic| {
if diagnostic.is_error() {
panic!("{} with error {}", &message, diagnostic);
}
}
});
op_t.expect(&message)
})
}

fn parse_all_warnings<P, T>(parser: P, programs: Vec<&str>) -> Vec<CustomDiagnostic>
where
P: NoirParser<T>,
T: std::fmt::Display,
{
programs
.into_iter()
.flat_map(|program| {
let (_expr, diagnostics) = parse_recover(&parser, program);
diagnostics.iter().for_each(|diagnostic| if diagnostic.is_error() {
unreachable!("Expected this input to pass with warning:\n{program}\nYet it failed with error:\n{diagnostic}")
});
diagnostics
})
.collect()
}

fn parse_all_failing<P, T>(parser: P, programs: Vec<&str>) -> Vec<CustomDiagnostic>
where
P: NoirParser<T>,
Expand All @@ -1486,11 +1503,21 @@ mod test {
programs
.into_iter()
.flat_map(|program| match parse_with(&parser, program) {
Ok(expr) => unreachable!(
"Expected this input to fail:\n{}\nYet it successfully parsed as:\n{}",
program, expr
),
Err(error) => error,
Ok(expr) => {
unreachable!(
"Expected this input to fail:\n{}\nYet it successfully parsed as:\n{}",
program, expr
)
}
Err(diagnostics) => {
if diagnostics.iter().all(|diagnostic: &CustomDiagnostic| diagnostic.is_warning()) {
unreachable!(
"Expected at least one error when parsing:\n{}\nYet it successfully parsed without errors:\n",
program
)
};
diagnostics
}
})
.collect()
}
Expand Down Expand Up @@ -1679,7 +1706,7 @@ mod test {
// The first (inner) `==` is a predicate which returns 0/1
// The outer layer is an infix `==` which is
// associated with the Constrain statement
let errors = parse_all_failing(
let errors = parse_all_warnings(
jfecher marked this conversation as resolved.
Show resolved Hide resolved
constrain(expression()),
vec![
"constrain ((x + y) == k) + z == y",
Expand All @@ -1690,7 +1717,9 @@ mod test {
],
);
assert_eq!(errors.len(), 5);
assert!(errors.iter().all(|err| { format!("{}", err).contains("deprecated") }));
assert!(errors
.iter()
.all(|err| { err.is_warning() && format!("{}", err).contains("deprecated") }))
}

/// This is the standard way to declare an assert statement
Expand Down Expand Up @@ -1784,6 +1813,8 @@ mod test {
"fn f(f: pub Field, y : Field, z : comptime Field) -> u8 { x + a }",
"fn f<T>(f: pub Field, y : T, z : comptime Field) -> u8 { x + a }",
"fn func_name<T>(f: Field, y : T) where T: SomeTrait {}",
// The following should produce compile error on later stage. From the parser's perspective it's fine
"fn func_name<A>(f: Field, y : Field, z : Field) where T: SomeTrait {}",
],
);

Expand All @@ -1798,9 +1829,6 @@ mod test {
"fn func_name<T>(f: Field, y : pub Field, z : pub [u8;5],) where SomeTrait {}",
"fn func_name<T>(f: Field, y : pub Field, z : pub [u8;5],) SomeTrait {}",
"fn func_name(f: Field, y : pub Field, z : pub [u8;5],) where T: SomeTrait {}",
// TODO(GenericParameterNotFoundInFunction)
// Consider making this a compilation error:
// "fn func_name<A>(f: Field, y : pub Field, z : pub [u8;5],) where T: SomeTrait {}",
],
);
}
Expand All @@ -1820,6 +1848,9 @@ mod test {
"trait TraitWithAssociatedType { type Element; fn item(self, index: Field) -> Self::Element; }",
"trait TraitWithAssociatedConstant { let Size: Field; }",
"trait TraitWithAssociatedConstantWithDefaultValue { let Size: Field = 10; }",
"trait GenericTrait<T> { fn elem(&mut self, index: Field) -> T; }",
"trait GenericTraitWithConstraints<T> where T: SomeTrait { fn elem(self, index: Field) -> T; }",
"trait TraitWithMultipleGenericParams<A, B, C> where A: SomeTrait, B: AnotherTrait<C> { let Size: Field; fn zero() -> Self; }",
],
);

Expand All @@ -1829,11 +1860,6 @@ mod test {
"trait MissingBody",
"trait WrongDelimiter { fn foo() -> u8, fn bar() -> u8 }",
"trait WhereClauseWithoutGenerics where A: SomeTrait { }",
// TODO: when implemnt generics in traits the following 3 should pass
"trait GenericTrait<T> { fn elem(&mut self, index: Field) -> T; }",
"trait GenericTraitWithConstraints<T> where T: SomeTrait { fn elem(self, index: Field) -> T; }",
"trait TraitWithMultipleGenericParams<A, B, C> where A: SomeTrait, B: AnotherTrait<C> { comptime Size: Field; fn zero() -> Self; }",

],
);
}
Expand Down