From ad85abc2db9ed35a2e3cf6ab18573de135ee9a5c Mon Sep 17 00:00:00 2001 From: nic-gaffney Date: Thu, 27 Jul 2023 23:03:20 -0500 Subject: [PATCH] Made error messages less terrible --- build.sh | 2 +- sloth/src/analysis/setup.rs | 41 ++++++++++++++++++++++--------------- sloth/src/codegen/mod.rs | 9 +++++--- sloth/src/parser/graph.rs | 2 +- 4 files changed, 32 insertions(+), 22 deletions(-) diff --git a/build.sh b/build.sh index 812a732..653604d 100755 --- a/build.sh +++ b/build.sh @@ -2,7 +2,7 @@ cargo build FILENAME="$1" # Compile standard library -./target/release/sloth std/stdio.sloth std/stdlib.sloth std/stdmath.sloth $FILENAME +./target/debug/sloth std/extern.sloth std/stdmath.sloth std/stdio.sloth $FILENAME # Generate binary clang -lm output.o std/stdio.c std/stdlib.c std/stdmath.c -o "${FILENAME%.sloth}" diff --git a/sloth/src/analysis/setup.rs b/sloth/src/analysis/setup.rs index 165051a..9ce518e 100644 --- a/sloth/src/analysis/setup.rs +++ b/sloth/src/analysis/setup.rs @@ -112,12 +112,18 @@ impl Populator { .iter() .map(|it| table.get_type(&it.typ)) .collect::>>() - .ok_or(AnalysisError::UnknownIdentifier(line, "0xOwO".to_owned()))?; + .ok_or(AnalysisError::UnknownIdentifier( + line, + "Error creating function inputs".to_owned(), + ))?; let output = output .map(|it| table.get_type(it)) .unwrap_or(Some(Type::Void)) - .ok_or(AnalysisError::UnknownIdentifier(line, "0xUwU".to_owned()))?; + .ok_or(AnalysisError::UnknownIdentifier( + line, + "Error creating function output".to_owned(), + ))?; Ok(Symbol::Value(ValueSymbol { typ: Type::Function { @@ -185,7 +191,7 @@ pub(super) fn propagate_types(node: &mut Expr) -> Result<(), AnalysisError> { child .typ .clone() - .ok_or(AnalysisError::Unknown(node.line, "owo choco"))? + .ok_or(AnalysisError::Unknown(node.line, "Error at grouping"))? } ExprKind::Literal(lit) => match lit { Literal::Integer(_) => Type::Integer, @@ -203,7 +209,7 @@ pub(super) fn propagate_types(node: &mut Expr) -> Result<(), AnalysisError> { last = Some(member.typ.clone().unwrap()); } - last.expect("need 1 element in literal im sozzy") + last.expect("Literal requires 1 element") } Literal::String(_) => Type::String, _ => todo!(), @@ -232,7 +238,7 @@ pub(super) fn propagate_types(node: &mut Expr) -> Result<(), AnalysisError> { | BinaryOp::Mod => lhs .typ .clone() - .ok_or(AnalysisError::Unknown(node.line, "owo?? choco???"))?, + .ok_or(AnalysisError::Unknown(node.line, "Error propagating type"))?, BinaryOp::Lt | BinaryOp::Gt | BinaryOp::LtEq @@ -242,23 +248,24 @@ pub(super) fn propagate_types(node: &mut Expr) -> Result<(), AnalysisError> { BinaryOp::LogicalAnd | BinaryOp::LogicalOr => lhs .typ .clone() - .ok_or(AnalysisError::Unknown(node.line, "owo?? choco???"))?, - BinaryOp::Range => Type::Iterator { - typ: Box::new( - lhs.typ - .clone() - .ok_or(AnalysisError::Unknown(node.line, "skill issue"))?, - ), - }, + .ok_or(AnalysisError::Unknown(node.line, "Error popagating type"))?, + BinaryOp::Range => { + Type::Iterator { + typ: Box::new(lhs.typ.clone().ok_or(AnalysisError::Unknown( + node.line, + "Error popagating type", + ))?), + } + } } } ExprKind::UnaryOp { value, .. } => { propagate_types(value)?; - value.typ.clone().ok_or(AnalysisError::Unknown( - node.line, - "YOU'RE WRONG... SULFURIC ACID!", - ))? + value + .typ + .clone() + .ok_or(AnalysisError::Unknown(node.line, "Error propagating type"))? } ExprKind::Call { callee, args } => { propagate_types(callee)?; diff --git a/sloth/src/codegen/mod.rs b/sloth/src/codegen/mod.rs index 0452b03..3e34227 100644 --- a/sloth/src/codegen/mod.rs +++ b/sloth/src/codegen/mod.rs @@ -177,7 +177,7 @@ impl<'ctx> Codegen<'ctx> { let current_ptr = self .builder .build_struct_gep(range_type, range_ptr, 0, "current") - .expect("Butter corn salt!"); + .expect("Error creating current_ptr at for loop."); let table = body.symtable.clone(); let symbol = table.get_value(identifier).unwrap(); @@ -186,7 +186,7 @@ impl<'ctx> Codegen<'ctx> { let end_ptr = self .builder .build_struct_gep(range_type, range_ptr, 1, "end") - .expect("❌🧢"); + .expect("Error creating end_ptr at for loop."); self.builder.build_unconditional_branch(loop_bb); @@ -464,7 +464,10 @@ impl<'ctx> Codegen<'ctx> { // extracting an identifier to it. Change this // so you can do for example `fn(){}()`. let ExprKind::Identifier(ident) = &callee.kind else { panic!() }; - let function = self.module.get_function(ident).expect("oh nooos"); + let function = self + .module + .get_function(ident) + .unwrap_or_else(|| panic!("Function not found: {}", ident)); let args = args .iter() diff --git a/sloth/src/parser/graph.rs b/sloth/src/parser/graph.rs index 3d0dca5..29dd66c 100644 --- a/sloth/src/parser/graph.rs +++ b/sloth/src/parser/graph.rs @@ -1,4 +1,4 @@ -use std::fmt::{Error, Write}; +us estd::fmt::{Error, Write}; use super::ast::{Expr, ExprKind, Function, FunctionKind, Stmt, StmtKind};