about summary refs log tree commit diff
path: root/pkg/lang/compiler/scope/symbol.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/lang/compiler/scope/symbol.go')
-rw-r--r--pkg/lang/compiler/scope/symbol.go65
1 files changed, 65 insertions, 0 deletions
diff --git a/pkg/lang/compiler/scope/symbol.go b/pkg/lang/compiler/scope/symbol.go
new file mode 100644
index 0000000..df91899
--- /dev/null
+++ b/pkg/lang/compiler/scope/symbol.go
@@ -0,0 +1,65 @@
+package scope
+
+import "jinx/pkg/lang/vm/code"
+
+type SymbolID struct {
+	symbolKind   SymbolKind
+	scopeID      ScopeID
+	indexInScope int
+}
+
+func (id SymbolID) SymbolKind() SymbolKind {
+	return id.symbolKind
+}
+
+type SymbolKind int
+
+const (
+	SymbolKindVariable SymbolKind = iota
+	SymbolKindFunction
+)
+
+func (s SymbolKind) String() string {
+	switch s {
+	case SymbolKindVariable:
+		return "variable"
+	case SymbolKindFunction:
+		return "function"
+	default:
+		panic("unknown symbol kind")
+	}
+}
+
+type Symbol[D SymbolData] struct {
+	name string
+	data D
+}
+
+func (s Symbol[D]) Data() D {
+	return s.data
+}
+
+type SymbolData interface {
+	SymbolVariable | SymbolFunction
+}
+
+type SymbolVariable struct {
+	localIndex int
+}
+
+func (sv SymbolVariable) LocalIndex() int {
+	return sv.localIndex
+}
+
+type SymbolFunction struct {
+	marker code.Marker
+	args   uint
+}
+
+func (sf SymbolFunction) Marker() code.Marker {
+	return sf.marker
+}
+
+func (sf SymbolFunction) Args() uint {
+	return sf.args
+}