in resolve/resolve.go [396:438]
func (r *resolver) useToplevel(use use) (bind *Binding) {
id := use.id
if prev, ok := r.file.bindings[id.Name]; ok {
// use of load-defined name in file block
bind = prev
} else if prev, ok := r.globals[id.Name]; ok {
// use of global declared by module
bind = prev
} else if r.isGlobal != nil && r.isGlobal(id.Name) {
// use of global defined in a previous REPL chunk
bind = &Binding{
First: id, // wrong: this is not even a binding use
Scope: Global,
Index: len(r.moduleGlobals),
}
r.globals[id.Name] = bind
r.moduleGlobals = append(r.moduleGlobals, bind)
} else if prev, ok := r.predeclared[id.Name]; ok {
// repeated use of predeclared or universal
bind = prev
} else if r.isPredeclared(id.Name) {
// use of pre-declared name
bind = &Binding{Scope: Predeclared}
r.predeclared[id.Name] = bind // save it
} else if r.isUniversal(id.Name) {
// use of universal name
if !AllowSet && id.Name == "set" {
r.errorf(id.NamePos, doesnt+"support sets")
}
bind = &Binding{Scope: Universal}
r.predeclared[id.Name] = bind // save it
} else {
bind = &Binding{Scope: Undefined}
var hint string
if n := r.spellcheck(use); n != "" {
hint = fmt.Sprintf(" (did you mean %s?)", n)
}
r.errorf(id.NamePos, "undefined: %s%s", id.Name, hint)
}
id.Binding = bind
return bind
}