add source code display to UnexpectedExpression, LuaRuntimeError errors
This commit is contained in:
		
							parent
							
								
									6e019fb3ac
								
							
						
					
					
						commit
						6f3c152e73
					
				| 
						 | 
					@ -1,20 +1,20 @@
 | 
				
			||||||
/// An error that occurred during compilation.
 | 
					/// An error that occurred during compilation.
 | 
				
			||||||
#[allow(missing_docs)]
 | 
					#[allow(missing_docs)]
 | 
				
			||||||
#[derive(Debug, thiserror::Error)]
 | 
					#[derive(Debug, thiserror::Error, Clone, PartialEq, Eq)]
 | 
				
			||||||
pub enum Error {
 | 
					pub enum Error {
 | 
				
			||||||
    #[error("An error occurred while working with Input/Output: {0}")]
 | 
					    #[error("An error occurred while working with Input/Output: {0}")]
 | 
				
			||||||
    IoError(String),
 | 
					    IoError(String),
 | 
				
			||||||
    #[error(transparent)]
 | 
					    #[error(transparent)]
 | 
				
			||||||
    Utf8Error(#[from] std::str::Utf8Error),
 | 
					    Utf8Error(#[from] std::str::Utf8Error),
 | 
				
			||||||
    #[error("An error occurred while lexing the source code.")]
 | 
					    #[error("An error occurred while lexing the source code: {0}")]
 | 
				
			||||||
    LexicalError(#[from] crate::lexical::Error),
 | 
					    LexicalError(#[from] crate::lexical::Error),
 | 
				
			||||||
    #[error("An error occured while tokenizing the source code.")]
 | 
					    #[error("An error occured while tokenizing the source code: {0}")]
 | 
				
			||||||
    TokenizeError(#[from] crate::lexical::token::TokenizeError),
 | 
					    TokenizeError(#[from] crate::lexical::token::TokenizeError),
 | 
				
			||||||
    #[error(transparent)]
 | 
					    #[error(transparent)]
 | 
				
			||||||
    ParseError(#[from] crate::syntax::error::Error),
 | 
					    ParseError(#[from] crate::syntax::error::Error),
 | 
				
			||||||
    #[error(transparent)]
 | 
					    #[error(transparent)]
 | 
				
			||||||
    TranspileError(#[from] crate::transpile::TranspileError),
 | 
					    TranspileError(#[from] crate::transpile::TranspileError),
 | 
				
			||||||
    #[error("An error occurred")]
 | 
					    #[error("An error occurred: {0}")]
 | 
				
			||||||
    Other(&'static str),
 | 
					    Other(&'static str),
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,16 +17,16 @@ use super::transpiler::FunctionData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Errors that can occur during transpilation.
 | 
					/// Errors that can occur during transpilation.
 | 
				
			||||||
#[allow(clippy::module_name_repetitions, missing_docs)]
 | 
					#[allow(clippy::module_name_repetitions, missing_docs)]
 | 
				
			||||||
#[derive(Debug, thiserror::Error, Clone)]
 | 
					#[derive(Debug, thiserror::Error, Clone, PartialEq, Eq)]
 | 
				
			||||||
pub enum TranspileError {
 | 
					pub enum TranspileError {
 | 
				
			||||||
    #[error(transparent)]
 | 
					    #[error(transparent)]
 | 
				
			||||||
    MissingFunctionDeclaration(#[from] MissingFunctionDeclaration),
 | 
					    MissingFunctionDeclaration(#[from] MissingFunctionDeclaration),
 | 
				
			||||||
    #[error("Unexpected expression: {}", .0.span().str())]
 | 
					    #[error(transparent)]
 | 
				
			||||||
    UnexpectedExpression(Expression),
 | 
					    UnexpectedExpression(#[from] UnexpectedExpression),
 | 
				
			||||||
    #[error("Lua code evaluation is disabled.")]
 | 
					    #[error("Lua code evaluation is disabled.")]
 | 
				
			||||||
    LuaDisabled,
 | 
					    LuaDisabled,
 | 
				
			||||||
    #[error("Lua runtime error: {}", .0)]
 | 
					    #[error(transparent)]
 | 
				
			||||||
    LuaRuntimeError(String),
 | 
					    LuaRuntimeError(#[from] LuaRuntimeError),
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// The result of a transpilation operation.
 | 
					/// The result of a transpilation operation.
 | 
				
			||||||
| 
						 | 
					@ -101,3 +101,51 @@ impl Display for MissingFunctionDeclaration {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl std::error::Error for MissingFunctionDeclaration {}
 | 
					impl std::error::Error for MissingFunctionDeclaration {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// An error that occurs when a function declaration is missing.
 | 
				
			||||||
 | 
					#[allow(clippy::module_name_repetitions)]
 | 
				
			||||||
 | 
					#[derive(Debug, Clone, PartialEq, Eq)]
 | 
				
			||||||
 | 
					pub struct LuaRuntimeError {
 | 
				
			||||||
 | 
					    pub code_block: Span,
 | 
				
			||||||
 | 
					    pub error_message: String,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl Display for LuaRuntimeError {
 | 
				
			||||||
 | 
					    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 | 
				
			||||||
 | 
					        let message = format!(
 | 
				
			||||||
 | 
					            r#"error during lua code execution: "{}""#,
 | 
				
			||||||
 | 
					            self.error_message
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        write!(f, "{}", Message::new(Severity::Error, message))?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        write!(
 | 
				
			||||||
 | 
					            f,
 | 
				
			||||||
 | 
					            "\n{}",
 | 
				
			||||||
 | 
					            SourceCodeDisplay::new(&self.code_block, Option::<u8>::None)
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl std::error::Error for LuaRuntimeError {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// An error that occurs when a function declaration is missing.
 | 
				
			||||||
 | 
					#[derive(Debug, Clone, PartialEq, Eq)]
 | 
				
			||||||
 | 
					pub struct UnexpectedExpression(pub Expression);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl Display for UnexpectedExpression {
 | 
				
			||||||
 | 
					    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 | 
				
			||||||
 | 
					        write!(
 | 
				
			||||||
 | 
					            f,
 | 
				
			||||||
 | 
					            "{}",
 | 
				
			||||||
 | 
					            Message::new(Severity::Error, "encountered unexpected expression")
 | 
				
			||||||
 | 
					        )?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        write!(
 | 
				
			||||||
 | 
					            f,
 | 
				
			||||||
 | 
					            "\n{}",
 | 
				
			||||||
 | 
					            SourceCodeDisplay::new(&self.0.span(), Option::<u8>::None)
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl std::error::Error for UnexpectedExpression {}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,7 +7,7 @@ mod enabled {
 | 
				
			||||||
    use crate::{
 | 
					    use crate::{
 | 
				
			||||||
        base::{self, source_file::SourceElement, Handler},
 | 
					        base::{self, source_file::SourceElement, Handler},
 | 
				
			||||||
        syntax::syntax_tree::expression::LuaCode,
 | 
					        syntax::syntax_tree::expression::LuaCode,
 | 
				
			||||||
        transpile::error::{TranspileError, TranspileResult},
 | 
					        transpile::error::{LuaRuntimeError, TranspileError, TranspileResult},
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    impl LuaCode {
 | 
					    impl LuaCode {
 | 
				
			||||||
| 
						 | 
					@ -48,26 +48,21 @@ mod enabled {
 | 
				
			||||||
                .set_name(name)
 | 
					                .set_name(name)
 | 
				
			||||||
                .eval::<String>()
 | 
					                .eval::<String>()
 | 
				
			||||||
                .map_err(|err| {
 | 
					                .map_err(|err| {
 | 
				
			||||||
                    let err = TranspileError::from(err);
 | 
					                    let err_string = err.to_string();
 | 
				
			||||||
                    handler.receive(err.clone());
 | 
					                    let err = TranspileError::from(LuaRuntimeError {
 | 
				
			||||||
 | 
					                        error_message: err_string
 | 
				
			||||||
 | 
					                            .strip_prefix("runtime error: ")
 | 
				
			||||||
 | 
					                            .unwrap_or(&err_string)
 | 
				
			||||||
 | 
					                            .to_string(),
 | 
				
			||||||
 | 
					                        code_block: self.span(),
 | 
				
			||||||
 | 
					                    });
 | 
				
			||||||
 | 
					                    handler.receive(crate::Error::from(err.clone()));
 | 
				
			||||||
                    err
 | 
					                    err
 | 
				
			||||||
                })?;
 | 
					                })?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Ok(lua_result)
 | 
					            Ok(lua_result)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    impl From<mlua::Error> for TranspileError {
 | 
					 | 
				
			||||||
        fn from(value: mlua::Error) -> Self {
 | 
					 | 
				
			||||||
            let string = value.to_string();
 | 
					 | 
				
			||||||
            Self::LuaRuntimeError(
 | 
					 | 
				
			||||||
                string
 | 
					 | 
				
			||||||
                    .strip_prefix("runtime error: ")
 | 
					 | 
				
			||||||
                    .unwrap_or(&string)
 | 
					 | 
				
			||||||
                    .to_string(),
 | 
					 | 
				
			||||||
            )
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[cfg(not(feature = "lua"))]
 | 
					#[cfg(not(feature = "lua"))]
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,7 +23,7 @@ use crate::{
 | 
				
			||||||
    transpile::error::MissingFunctionDeclaration,
 | 
					    transpile::error::MissingFunctionDeclaration,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use super::error::{TranspileError, TranspileResult};
 | 
					use super::error::{TranspileError, TranspileResult, UnexpectedExpression};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// A transpiler for `ShulkerScript`.
 | 
					/// A transpiler for `ShulkerScript`.
 | 
				
			||||||
#[derive(Debug)]
 | 
					#[derive(Debug)]
 | 
				
			||||||
| 
						 | 
					@ -396,7 +396,9 @@ impl Transpiler {
 | 
				
			||||||
                    self.transpile_function_call(func, handler).map(Some)
 | 
					                    self.transpile_function_call(func, handler).map(Some)
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                unexpected => {
 | 
					                unexpected => {
 | 
				
			||||||
                    let error = TranspileError::UnexpectedExpression(unexpected.clone());
 | 
					                    let error = TranspileError::UnexpectedExpression(UnexpectedExpression(
 | 
				
			||||||
 | 
					                        unexpected.clone(),
 | 
				
			||||||
 | 
					                    ));
 | 
				
			||||||
                    handler.receive(error.clone());
 | 
					                    handler.receive(error.clone());
 | 
				
			||||||
                    Err(error)
 | 
					                    Err(error)
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue