add tracing crate for logging
This commit is contained in:
parent
5336ffb91e
commit
dd79541ae9
|
@ -30,7 +30,8 @@ getset = "0.1.2"
|
|||
mlua = { version = "0.9.7", features = ["lua54", "vendored"], optional = true }
|
||||
path-absolutize = "3.1.1"
|
||||
serde = { version = "1.0.197", features = ["derive", "rc"], optional = true }
|
||||
shulkerbox = { git = "https://github.com/moritz-hoelting/shulkerbox", default-features = false, optional = true, rev = "b79c9ecd6d45f9319c9083a8103ef0186839b0c0" }
|
||||
shulkerbox = { git = "https://github.com/moritz-hoelting/shulkerbox", default-features = false, optional = true, rev = "e31f9f904a5f5905e912907d988c189ffc8cf313" }
|
||||
strum = { version = "0.26.2", features = ["derive"] }
|
||||
strum_macros = "0.26.2"
|
||||
thiserror = "1.0.58"
|
||||
tracing = "0.1.40"
|
||||
|
|
|
@ -45,6 +45,7 @@ impl TokenStream {
|
|||
/// A tuple containing the stream of successfully tokenized tokens and a list of lexical errors
|
||||
/// encountered during tokenization.
|
||||
#[must_use]
|
||||
#[tracing::instrument(level = "debug", skip_all, fields(source_file = %source_file.path().display()))]
|
||||
pub fn tokenize(source_file: &Arc<SourceFile>, handler: &impl Handler<error::Error>) -> Self {
|
||||
// The list of token trees that will be returned.
|
||||
let mut tokens = Vec::new();
|
||||
|
@ -57,13 +58,17 @@ impl TokenStream {
|
|||
Err(TokenizeError::EndOfSourceCodeIteratorArgument) => {
|
||||
break;
|
||||
}
|
||||
Err(TokenizeError::FatalLexicalError) => (),
|
||||
Err(TokenizeError::FatalLexicalError) => {
|
||||
tracing::error!("Fatal lexical error encountered while tokenizing source code");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// reverse to use pop() instead of remove(0)
|
||||
tokens.reverse();
|
||||
|
||||
tracing::debug!("Structuring tokens into trees");
|
||||
|
||||
// stucture the tokens into a token stream
|
||||
let mut token_trees = Vec::new();
|
||||
while let Some(token_tree) = Self::handle_token(&mut tokens, handler) {
|
||||
|
|
|
@ -15,6 +15,8 @@ use shulkerbox::{datapack::Datapack, util::compile::CompileOptions, virtual_fs::
|
|||
|
||||
/// Tokenizes the source code at the given path.
|
||||
pub fn tokenize(printer: &Printer, path: &Path) -> Result<TokenStream> {
|
||||
tracing::info!("Tokenizing the source code at path: {}", path.display());
|
||||
|
||||
let source_file = SourceFile::load(path)?;
|
||||
|
||||
Ok(TokenStream::tokenize(&source_file, printer))
|
||||
|
@ -30,6 +32,8 @@ pub fn parse(printer: &Printer, path: &Path) -> Result<ProgramFile> {
|
|||
));
|
||||
}
|
||||
|
||||
tracing::info!("Parsing the source code at path: {}", path.display());
|
||||
|
||||
let mut parser = Parser::new(&tokens);
|
||||
let program = parser.parse_program(printer).ok_or(Error::Other(
|
||||
"An error occured while parsing the source code.",
|
||||
|
@ -67,6 +71,8 @@ where
|
|||
.filter_map(Result::ok)
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
tracing::info!("Transpiling the source code.");
|
||||
|
||||
let mut transpiler = Transpiler::new(27);
|
||||
transpiler.transpile(&programs, printer)?;
|
||||
let datapack = transpiler.into_datapack();
|
||||
|
@ -88,5 +94,7 @@ where
|
|||
{
|
||||
let datapack = transpile(printer, script_paths)?;
|
||||
|
||||
tracing::info!("Compiling the source code.");
|
||||
|
||||
Ok(datapack.compile(&CompileOptions::default()))
|
||||
}
|
||||
|
|
|
@ -278,6 +278,7 @@ impl<'a> Parser<'a> {
|
|||
}
|
||||
}
|
||||
|
||||
#[tracing::instrument(level = "trace", skip_all)]
|
||||
pub fn parse_declaration(&mut self, handler: &impl Handler<Error>) -> Option<Declaration> {
|
||||
match self.stop_at_significant() {
|
||||
Reading::Atomic(Token::Keyword(function_keyword))
|
||||
|
@ -285,6 +286,8 @@ impl<'a> Parser<'a> {
|
|||
{
|
||||
let function = self.parse_function(handler)?;
|
||||
|
||||
tracing::trace!("Parsed function '{:?}'", function.identifier.span.str());
|
||||
|
||||
Some(Declaration::Function(function))
|
||||
}
|
||||
|
||||
|
@ -361,6 +364,8 @@ impl<'a> Parser<'a> {
|
|||
if let Some(items) = items {
|
||||
let semicolon = self.parse_punctuation(';', true, handler)?;
|
||||
|
||||
tracing::trace!("Parsed import from '{:?}'", module.str_content());
|
||||
|
||||
Some(Declaration::Import(Import {
|
||||
from_keyword,
|
||||
module,
|
||||
|
|
|
@ -78,7 +78,10 @@ impl Namespace {
|
|||
|
||||
impl<'a> Parser<'a> {
|
||||
/// Parses a [`ProgramFile`].
|
||||
#[tracing::instrument(level = "debug", skip_all)]
|
||||
pub fn parse_program(&mut self, handler: &impl Handler<Error>) -> Option<ProgramFile> {
|
||||
tracing::debug!("Parsing program");
|
||||
|
||||
let namespace = match self.stop_at_significant() {
|
||||
Reading::Atomic(Token::Keyword(namespace_keyword))
|
||||
if namespace_keyword.keyword == KeywordKind::Namespace =>
|
||||
|
@ -110,6 +113,11 @@ impl<'a> Parser<'a> {
|
|||
}
|
||||
}?;
|
||||
|
||||
tracing::debug!(
|
||||
"Found namespace '{}', parsing declarations",
|
||||
namespace.namespace_name.str_content()
|
||||
);
|
||||
|
||||
let mut declarations = Vec::new();
|
||||
|
||||
while !self.is_exhausted() {
|
||||
|
|
|
@ -249,11 +249,13 @@ impl<'a> Parser<'a> {
|
|||
}
|
||||
|
||||
/// Parses a [`Statement`].
|
||||
#[tracing::instrument(level = "trace", skip_all)]
|
||||
pub fn parse_statement(&mut self, handler: &impl Handler<Error>) -> Option<Statement> {
|
||||
match self.stop_at_significant() {
|
||||
// variable declaration
|
||||
Reading::Atomic(Token::CommandLiteral(command)) => {
|
||||
self.forward();
|
||||
tracing::trace!("Parsed literal command '{}'", command.clean_command());
|
||||
Some(Statement::LiteralCommand(command))
|
||||
}
|
||||
// block statement
|
||||
|
@ -286,6 +288,8 @@ impl<'a> Parser<'a> {
|
|||
|
||||
let block = self.parse_block(handler)?;
|
||||
|
||||
tracing::trace!("Parsed group command");
|
||||
|
||||
Some(Statement::Grouping(Grouping {
|
||||
group_keyword,
|
||||
block,
|
||||
|
@ -302,6 +306,8 @@ impl<'a> Parser<'a> {
|
|||
let expression = self.parse_expression(handler)?;
|
||||
let semicolon = self.parse_punctuation(';', true, handler)?;
|
||||
|
||||
tracing::trace!("Parsed run statement: {:?}", expression);
|
||||
|
||||
Some(Statement::Run(Run {
|
||||
run_keyword,
|
||||
expression,
|
||||
|
@ -314,6 +320,8 @@ impl<'a> Parser<'a> {
|
|||
let expression = self.parse_expression(handler)?;
|
||||
let semicolon = self.parse_punctuation(';', true, handler)?;
|
||||
|
||||
tracing::trace!("Parsed semicolon statement: {:?}", expression);
|
||||
|
||||
Some(Statement::Semicolon(Semicolon {
|
||||
expression,
|
||||
semicolon,
|
||||
|
|
|
@ -15,10 +15,13 @@ mod enabled {
|
|||
///
|
||||
/// # Errors
|
||||
/// - If Lua code evaluation is disabled.
|
||||
#[tracing::instrument(level = "debug", name = "eval_lua", skip_all, ret)]
|
||||
pub fn eval_string(
|
||||
&self,
|
||||
handler: &impl Handler<TranspileError>,
|
||||
) -> TranspileResult<String> {
|
||||
tracing::debug!("Evaluating Lua code");
|
||||
|
||||
let lua = Lua::new();
|
||||
|
||||
let name = {
|
||||
|
@ -89,6 +92,7 @@ mod disabled {
|
|||
handler: &impl Handler<TranspileError>,
|
||||
) -> TranspileResult<String> {
|
||||
handler.receive(TranspileError::LuaDisabled);
|
||||
tracing::error!("Lua code evaluation is disabled");
|
||||
Err(TranspileError::LuaDisabled)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -60,6 +60,7 @@ impl Transpiler {
|
|||
///
|
||||
/// # Errors
|
||||
/// - [`TranspileError::MissingFunctionDeclaration`] If a called function is missing
|
||||
#[tracing::instrument(level = "trace", skip_all)]
|
||||
pub fn transpile<Ident>(
|
||||
&mut self,
|
||||
programs: &[(Ident, ProgramFile)],
|
||||
|
@ -68,6 +69,8 @@ impl Transpiler {
|
|||
where
|
||||
Ident: AsRef<str>,
|
||||
{
|
||||
tracing::trace!("Transpiling program declarations");
|
||||
|
||||
for (identifier, program) in programs {
|
||||
self.transpile_program_declarations(program, identifier.as_ref(), handler);
|
||||
}
|
||||
|
@ -87,6 +90,11 @@ impl Transpiler {
|
|||
}
|
||||
}
|
||||
|
||||
tracing::trace!(
|
||||
"Transpiling functions requested by user: {:?}",
|
||||
always_transpile_functions
|
||||
);
|
||||
|
||||
for (program_identifier, name) in always_transpile_functions {
|
||||
self.get_or_transpile_function(&name, &program_identifier, handler)?;
|
||||
}
|
||||
|
@ -171,6 +179,7 @@ impl Transpiler {
|
|||
/// Gets the function at the given path, or transpiles it if it hasn't been transpiled yet.
|
||||
/// Returns the location of the function or None if the function does not exist.
|
||||
#[allow(clippy::significant_drop_tightening)]
|
||||
#[tracing::instrument(level = "trace", skip(self, handler))]
|
||||
fn get_or_transpile_function(
|
||||
&mut self,
|
||||
name: &str,
|
||||
|
@ -194,6 +203,8 @@ impl Transpiler {
|
|||
.is_some()
|
||||
};
|
||||
if !already_transpiled {
|
||||
tracing::trace!("Function not transpiled yet, transpiling.");
|
||||
|
||||
let statements = {
|
||||
let functions = self.functions.read().unwrap();
|
||||
let function_data = functions
|
||||
|
|
Loading…
Reference in New Issue