5 // name-binding environment
7 entries map[string]*envEntry
11 type envEntry struct {
14 c *Contract // if t == contractType
20 roleKeyword role = 1 + iota
31 var roleDesc = map[role]string{
32 roleKeyword: "keyword",
33 roleBuiltin: "built-in function",
34 roleContract: "contract",
35 roleContractParam: "contract parameter",
36 roleContractValue: "contract value",
38 roleClauseParam: "clause parameter",
39 roleClauseValue: "clause value",
40 roleClauseVariable: "clause variable",
43 func newEnviron(parent *environ) *environ {
45 entries: make(map[string]*envEntry),
50 func (e *environ) add(name string, t typeDesc, r role) error {
51 if entry := e.lookup(name); entry != nil {
52 return fmt.Errorf("%s \"%s\" conflicts with %s", roleDesc[r], name, roleDesc[entry.r])
54 e.entries[name] = &envEntry{t: t, r: r}
58 func (e *environ) addContract(contract *Contract) error {
59 if entry := e.lookup(contract.Name); entry != nil {
60 return fmt.Errorf("%s \"%s\" conflicts with %s", roleDesc[roleContract], contract.Name, roleDesc[entry.r])
62 e.entries[contract.Name] = &envEntry{t: contractType, r: roleContract, c: contract}
66 func (e environ) lookup(name string) *envEntry {
67 if res, ok := e.entries[name]; ok {
71 return e.parent.lookup(name)