about summary refs log tree commit diff
path: root/pkg/lang/compiler/compiler.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/lang/compiler/compiler.go')
-rw-r--r--pkg/lang/compiler/compiler.go33
1 files changed, 17 insertions, 16 deletions
diff --git a/pkg/lang/compiler/compiler.go b/pkg/lang/compiler/compiler.go
index 728dec1..ad37ded 100644
--- a/pkg/lang/compiler/compiler.go
+++ b/pkg/lang/compiler/compiler.go
@@ -3,6 +3,7 @@ package compiler
 import (
 	"fmt"
 	"jinx/pkg/lang/ast"
+	"jinx/pkg/lang/compiler/scope"
 	"jinx/pkg/lang/vm/code"
 )
 
@@ -11,14 +12,14 @@ type Compiler struct {
 
 	funcs []*code.Builder
 
-	scopes ScopeChain
+	scopes scope.ScopeChain
 }
 
 func New(ast ast.Program) *Compiler {
 	return &Compiler{
 		ast:    ast,
 		funcs:  make([]*code.Builder, 0),
-		scopes: NewScopeChain(),
+		scopes: scope.NewScopeChain(),
 	}
 }
 
@@ -114,7 +115,7 @@ func (comp *Compiler) compileFnDeclStmt(t *code.Builder, fnDeclStmt ast.StmtFnDe
 
 			symbol := comp.scopes.GetFunction(symbolID)
 
-			marker = symbol.data.marker
+			marker = symbol.Data().Marker()
 		} else {
 			return fmt.Errorf("function %s already declared", fnDeclStmt.Name.Value)
 		}
@@ -382,8 +383,8 @@ func (comp *Compiler) compileForInStmt(t *code.Builder, forInStmt ast.StmtForIn)
 func (comp *Compiler) compileReturnStmt(t *code.Builder, returnStmt ast.StmtReturn) error {
 	// Check that we are in fact in a function
 	functionScope := comp.scopes.CurrentFunction()
-	if functionScope.data.(ScopeFunction).IsRootScope() {
-		return fmt.Errorf("can't return when not inside a function" + functionScope.data.(ScopeFunction).unit.String())
+	if functionScope.IsRootScope() {
+		return fmt.Errorf("can't return when not inside a function")
 	}
 
 	if returnStmt.Value.IsEmpty() {
@@ -491,8 +492,8 @@ func (comp *Compiler) compileAssignExpr(t *code.Builder, expr ast.ExprBinary) er
 		return fmt.Errorf("variable %s not declared", name)
 	}
 
-	if symbolId.symbolKind != SymbolKindVariable {
-		return fmt.Errorf("can't assign to a %v", symbolId.symbolKind)
+	if symbolId.SymbolKind() != scope.SymbolKindVariable {
+		return fmt.Errorf("can't assign to a %v", symbolId.SymbolKind())
 	}
 
 	symbol := comp.scopes.GetVariable(symbolId)
@@ -502,7 +503,7 @@ func (comp *Compiler) compileAssignExpr(t *code.Builder, expr ast.ExprBinary) er
 	}
 
 	t.AppendOp(code.OpSetLocal)
-	t.AppendInt(int64(symbol.data.localIndex))
+	t.AppendInt(int64(symbol.Data().LocalIndex()))
 
 	return nil
 }
@@ -587,24 +588,24 @@ func (comp *Compiler) compileIdentExpr(t *code.Builder, expr ast.ExprIdent) erro
 	}
 
 	// TODO: Add other ways how the symbol should be fetched. (local, env, global, etc.)
-	switch symbolId.symbolKind {
-	case SymbolKindVariable:
+	switch symbolId.SymbolKind() {
+	case scope.SymbolKindVariable:
 		symbol := comp.scopes.GetVariable(symbolId)
 
 		t.AppendOp(code.OpGetLocal)
-		t.AppendInt(int64(symbol.data.localIndex))
-	case SymbolKindFunction:
+		t.AppendInt(int64(symbol.Data().LocalIndex()))
+	case scope.SymbolKindFunction:
 		symbol := comp.scopes.GetFunction(symbolId)
 
 		t.AppendOp(code.OpPushFunction)
-		t.AppendMarkerReference(symbol.data.marker)
+		t.AppendMarkerReference(symbol.Data().Marker())
 
-		if symbol.data.args != 0 {
+		if symbol.Data().Args() != 0 {
 			t.AppendOp(code.OpSetArgCount)
-			t.AppendInt(int64(symbol.data.args))
+			t.AppendInt(int64(symbol.Data().Args()))
 		}
 	default:
-		panic(fmt.Errorf("unknown symbol kind: %v", symbolId.symbolKind))
+		panic(fmt.Errorf("unknown symbol kind: %v", symbolId.SymbolKind()))
 	}
 
 	return nil