package sema import ( "fmt" "github.com/marzeq/qk/parser" "github.com/marzeq/qk/symbols" ) type Analyser struct { universe *symbols.Scope current *symbols.Scope modules map[string]*symbols.Module aliases map[string]*aliasInfo errors []error } func NewAnalyser() *Analyser { u := symbols.NewScope(nil) a := &Analyser{ universe: u, modules: make(map[string]*symbols.Module), aliases: make(map[string]*aliasInfo), } a.predefineBuiltins() return a } func (a *Analyser) Errors() []error { return a.errors } func (a *Analyser) errorf(node parser.Node, format string, args ...any) { msg := fmt.Sprintf(format, args...) a.errors = append(a.errors, fmt.Errorf("%s: %s", node.GetLoc(), msg)) } func (a *Analyser) AnalyseModule(root *parser.RootNode, name string) { modScope := symbols.NewScope(a.universe) mod := &symbols.Module{ Name: name, Scope: modScope, } a.modules[name] = mod a.current = modScope a.collectTopLevel(root) a.resolveBodies(root) }