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 }