diff --git a/Cargo.toml b/Cargo.toml index d5eaca70..c87c5015 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,4 +37,4 @@ stdext = "0.3.1" walkdir = "2.3.3" [profile.test] -opt-level = 2 \ No newline at end of file +opt-level = 2 diff --git a/src/diagnostics.rs b/src/diagnostics.rs index 2387bd98..d93b4366 100644 --- a/src/diagnostics.rs +++ b/src/diagnostics.rs @@ -69,7 +69,7 @@ impl Info { pub fn display(&self, verbose: bool) -> impl Display + '_ { DisplayFn(move |f| { - write!(f, "{}", self.errs.iter().map(|err| err.display(verbose)).join("\n"))?; + writeln!(f, "{}", self.errs.iter().map(|err| err.display(verbose)).join("\n"))?; for (def_name, errs) in &self.errs_with_def { writeln!(f, "In definition '{def_name}':")?; diff --git a/src/term/check/shared_names.rs b/src/term/check/shared_names.rs index 94867ddd..ac87b729 100644 --- a/src/term/check/shared_names.rs +++ b/src/term/check/shared_names.rs @@ -1,4 +1,6 @@ -use std::{collections::HashMap, fmt::Display}; +use std::fmt::Display; + +use indexmap::IndexMap; use crate::term::{Ctx, Name}; @@ -14,7 +16,7 @@ impl Display for TopLevelErr { impl Ctx<'_> { /// Checks if exists shared names from definitions, adts and constructors. pub fn check_shared_names(&mut self) { - let mut checked = HashMap::<&Name, usize>::new(); + let mut checked = IndexMap::<&Name, usize>::new(); for adt_name in self.book.adts.keys() { *checked.entry(adt_name).or_default() += 1; diff --git a/tests/golden_tests/compile_file/error_messages.hvm b/tests/golden_tests/compile_file/error_messages.hvm new file mode 100644 index 00000000..22a2a83b --- /dev/null +++ b/tests/golden_tests/compile_file/error_messages.hvm @@ -0,0 +1,9 @@ +data A = (A) +data B = (B) + +Foo (C) = * +Foo (D) = * + +Foo2 (E) = * + +Main = * diff --git a/tests/snapshots/compile_file__error_messages.hvm.snap b/tests/snapshots/compile_file__error_messages.hvm.snap new file mode 100644 index 00000000..bd2661e7 --- /dev/null +++ b/tests/snapshots/compile_file__error_messages.hvm.snap @@ -0,0 +1,11 @@ +--- +source: tests/golden_tests.rs +input_file: tests/golden_tests/compile_file/error_messages.hvm +--- +Duplicated top-level name 'A'. +Duplicated top-level name 'B'. +In definition 'Foo': + Unbound constructor 'C'. + Unbound constructor 'D'. +In definition 'Foo2': + Unbound constructor 'E'.