diff --git a/crates/project/src/error.rs b/crates/project/src/error.rs index aa525388..d3883caa 100644 --- a/crates/project/src/error.rs +++ b/crates/project/src/error.rs @@ -5,7 +5,9 @@ use std::{ }; use aiken_lang::{ast::Span, parser::error::ParseError, tipo}; -use miette::{Diagnostic, EyreContext, LabeledSpan, MietteHandlerOpts, RgbColors, SourceCode}; +use miette::{ + Diagnostic, EyreContext, LabeledSpan, MietteHandlerOpts, NamedSource, RgbColors, SourceCode, +}; #[allow(dead_code)] #[derive(thiserror::Error)] @@ -39,6 +41,8 @@ pub enum Error { src: String, + named: NamedSource, + #[source] error: Box, }, @@ -47,6 +51,7 @@ pub enum Error { Type { path: PathBuf, src: String, + named: NamedSource, #[source] error: tipo::error::Error, }, @@ -55,6 +60,7 @@ pub enum Error { ValidatorMustReturnBool { path: PathBuf, src: String, + named: NamedSource, location: Span, }, @@ -65,6 +71,7 @@ pub enum Error { location: Span, path: PathBuf, src: String, + named: NamedSource, }, } @@ -94,6 +101,7 @@ impl Error { errors.push(Error::Parse { path: path.into(), src: src.to_string(), + named: NamedSource::new(path.display().to_string(), src.to_string()), error: error.into(), }); } @@ -245,22 +253,23 @@ impl Diagnostic for Error { Error::FileIo { .. } => None, Error::ImportCycle { .. } => None, Error::List(_) => None, - Error::Parse { src, .. } => Some(src), - Error::Type { src, .. } => Some(src), + Error::Parse { named, .. } => Some(named), + Error::Type { named, .. } => Some(named), Error::StandardIo(_) => None, Error::Format { .. } => None, - Error::ValidatorMustReturnBool { src, .. } => Some(src), - Error::WrongValidatorArity { src, .. } => Some(src), + Error::ValidatorMustReturnBool { named, .. } => Some(named), + Error::WrongValidatorArity { named, .. } => Some(named), } } } -#[derive(PartialEq, thiserror::Error)] +#[derive(thiserror::Error)] pub enum Warning { #[error("type checking")] Type { path: PathBuf, src: String, + named: NamedSource, #[source] warning: tipo::error::Warning, }, @@ -273,7 +282,7 @@ impl Diagnostic for Warning { fn source_code(&self) -> Option<&dyn SourceCode> { match self { - Warning::Type { src, .. } => Some(src), + Warning::Type { named, .. } => Some(named), } } fn labels(&self) -> Option + '_>> { @@ -291,7 +300,12 @@ impl Diagnostic for Warning { impl Warning { pub fn from_type_warning(warning: tipo::error::Warning, path: PathBuf, src: String) -> Warning { - Warning::Type { path, warning, src } + Warning::Type { + path: path.clone(), + warning, + src: src.clone(), + named: NamedSource::new(path.display().to_string(), src), + } } pub fn report(&self) { diff --git a/crates/project/src/lib.rs b/crates/project/src/lib.rs index 57a61f93..2086c37c 100644 --- a/crates/project/src/lib.rs +++ b/crates/project/src/lib.rs @@ -17,6 +17,7 @@ use aiken_lang::{ uplc::{CodeGenerator, DataTypeKey, FunctionAccessKey}, IdGenerator, }; +use miette::NamedSource; use pallas::{ codec::minicbor, ledger::{addresses::Address, primitives::babbage}, @@ -156,6 +157,7 @@ impl Project { errors.push(Error::Parse { path: path.clone(), src: code.clone(), + named: NamedSource::new(path.display().to_string(), code.clone()), error: Box::new(error), }) } @@ -201,6 +203,7 @@ impl Project { .map_err(|error| Error::Type { path: path.clone(), src: code.clone(), + named: NamedSource::new(path.display().to_string(), code.clone()), error, })?; @@ -251,6 +254,10 @@ impl Project { location: func_def.location, src: module.code.clone(), path: module.input_path.clone(), + named: NamedSource::new( + module.input_path.display().to_string(), + module.code.clone(), + ), }) } @@ -263,6 +270,10 @@ impl Project { location: func_def.location, src: module.code.clone(), path: module.input_path.clone(), + named: NamedSource::new( + module.input_path.display().to_string(), + module.code.clone(), + ), name: func_def.name.clone(), at_least: 2, }) @@ -273,6 +284,10 @@ impl Project { location: func_def.location, src: module.code.clone(), path: module.input_path.clone(), + named: NamedSource::new( + module.input_path.display().to_string(), + module.code.clone(), + ), name: func_def.name.clone(), at_least: 3, })