about summary refs log tree commit diff
path: root/pkg/lang/compiler/scope/symbol.go
blob: df91899c25ae60dffa7a35e2104d7858fae09332 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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
}