about summary refs log tree commit diff
path: root/pkg/lang/compiler/compiler.go
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2022-08-18 19:49:01 +0000
committerMel <einebeere@gmail.com>2022-08-18 19:49:01 +0000
commit73ac132294f3e659f1d769c961aa45bafdd19b45 (patch)
tree927ccf9f89209c2884ceef366322301a9b0065cf /pkg/lang/compiler/compiler.go
parent0b06db39b833099bc6683abff176b13a1c97ca93 (diff)
downloadjinx-73ac132294f3e659f1d769c961aa45bafdd19b45.tar.zst
jinx-73ac132294f3e659f1d769c961aa45bafdd19b45.zip
Ad-hoc error location for compiler errors
Diffstat (limited to 'pkg/lang/compiler/compiler.go')
-rw-r--r--pkg/lang/compiler/compiler.go54
1 files changed, 40 insertions, 14 deletions
diff --git a/pkg/lang/compiler/compiler.go b/pkg/lang/compiler/compiler.go
index 193cd90..b08a215 100644
--- a/pkg/lang/compiler/compiler.go
+++ b/pkg/lang/compiler/compiler.go
@@ -118,6 +118,15 @@ func (comp *Compiler) compileStmt(t *code.Builder, stmt ast.Stmt) error {
 		panic(fmt.Errorf("unknown statement kind: %d", stmt.Kind))
 	}
 
+	// Wrap errors in a compiler error, if it's not already one.
+	if err != nil && !isCompilerError(err) {
+		err = Error{
+			Module: comp.name,
+			Loc:    stmt.At,
+			Err:    err,
+		}
+	}
+
 	return err
 }
 
@@ -636,41 +645,53 @@ func (comp *Compiler) compileExprStmt(t *code.Builder, exprStmt ast.StmtExpr) er
 }
 
 func (comp *Compiler) compileExpr(t *code.Builder, expr ast.Expr) error {
+	var err error
 	switch expr.Kind {
 	case ast.ExprKindBinary:
-		return comp.compileBinaryExpr(t, expr.Value.(ast.ExprBinary))
+		err = comp.compileBinaryExpr(t, expr.Value.(ast.ExprBinary))
 	case ast.ExprKindUnary:
-		return comp.compileUnaryExpr(t, expr.Value.(ast.ExprUnary))
+		err = comp.compileUnaryExpr(t, expr.Value.(ast.ExprUnary))
 	case ast.ExprKindCall:
-		return comp.compileCallExpr(t, expr.Value.(ast.ExprCall))
+		err = comp.compileCallExpr(t, expr.Value.(ast.ExprCall))
 	case ast.ExprKindSubscription:
-		return comp.compileSubscriptionExpr(t, expr.Value.(ast.ExprSubscription))
+		err = comp.compileSubscriptionExpr(t, expr.Value.(ast.ExprSubscription))
 	case ast.ExprKindMember:
-		return comp.compileMemberExpr(t, expr.Value.(ast.ExprMember))
+		err = comp.compileMemberExpr(t, expr.Value.(ast.ExprMember))
 
 	case ast.ExprKindGroup:
-		return comp.compileGroupExpr(t, expr.Value.(ast.ExprGroup))
+		err = comp.compileGroupExpr(t, expr.Value.(ast.ExprGroup))
 	case ast.ExprKindFnLit:
 		panic("not implemented")
 	case ast.ExprKindArrayLit:
-		return comp.compileArrayLitExpr(t, expr.Value.(ast.ExprArrayLit))
+		err = comp.compileArrayLitExpr(t, expr.Value.(ast.ExprArrayLit))
 	case ast.ExprKindIdent:
-		return comp.compileIdentExpr(t, expr.Value.(ast.ExprIdent))
+		err = comp.compileIdentExpr(t, expr.Value.(ast.ExprIdent))
 	case ast.ExprKindIntLit:
-		return comp.compileIntLitExpr(t, expr.Value.(ast.ExprIntLit))
+		err = comp.compileIntLitExpr(t, expr.Value.(ast.ExprIntLit))
 	case ast.ExprKindFloatLit:
-		return comp.compileFloatLitExpr(t, expr.Value.(ast.ExprFloatLit))
+		err = comp.compileFloatLitExpr(t, expr.Value.(ast.ExprFloatLit))
 	case ast.ExprKindStringLit:
-		return comp.compileStringLitExpr(t, expr.Value.(ast.ExprStringLit))
+		err = comp.compileStringLitExpr(t, expr.Value.(ast.ExprStringLit))
 	case ast.ExprKindBoolLit:
-		return comp.compileBoolLitExpr(t, expr.Value.(ast.ExprBoolLit))
+		err = comp.compileBoolLitExpr(t, expr.Value.(ast.ExprBoolLit))
 	case ast.ExprKindNullLit:
-		return comp.compileNullLitExpr(t, expr.Value.(ast.ExprNullLit))
+		err = comp.compileNullLitExpr(t, expr.Value.(ast.ExprNullLit))
 	case ast.ExprKindThis:
-		return comp.compileThisExpr(t, expr.Value.(ast.ExprThis))
+		err = comp.compileThisExpr(t, expr.Value.(ast.ExprThis))
 	default:
 		panic("unknown expression kind")
 	}
+
+	// If the error was not a compiler error, we need to wrap it in one.
+	if err != nil && !isCompilerError(err) {
+		err = Error{
+			Module: comp.name,
+			Loc:    expr.At,
+			Err:    err,
+		}
+	}
+
+	return err
 }
 
 func (comp *Compiler) compileBinaryExpr(t *code.Builder, expr ast.ExprBinary) error {
@@ -1027,3 +1048,8 @@ func (comp *Compiler) exitScopeAndCleanStack(t *code.Builder) {
 func (comp *Compiler) areWeCompilingCore() bool {
 	return modules.NewRef(comp.author, comp.name) == modules.CoreModuleRef
 }
+
+func isCompilerError(err error) bool {
+	_, ok := err.(Error)
+	return ok
+}