// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package ast

// A Scope maintains the set of identifiers visible
// in the scope and a link to the immediately surrounding
// (outer) scope.
//
//	NOTE: WORK IN PROGRESS
//
type Scope struct {
	Outer	*Scope;
	Names	map[string]*Ident;
}


// NewScope creates a new scope nested in the outer scope.
func NewScope(outer *Scope) *Scope	{ return &Scope{outer, make(map[string]*Ident)} }


// Declare inserts an identifier into the scope s. If the
// declaration succeeds, the result is true, if the identifier
// exists already in the scope, the result is false.
//
func (s *Scope) Declare(ident *Ident) bool {
	if _, found := s.Names[ident.Value]; found {
		return false
	}
	s.Names[ident.Value] = ident;
	return true;
}


// Lookup looks up an identifier in the current scope chain.
// If the identifier is found, it is returned; otherwise the
// result is nil.
//
func (s *Scope) Lookup(name string) *Ident {
	for ; s != nil; s = s.Outer {
		if ident, found := s.Names[name]; found {
			return ident
		}
	}
	return nil;
}


// TODO(gri) Uncomment once this code is needed.
/*
var Universe = Scope {
	Names: map[string]*Ident {
		// basic types
		"bool": nil,
		"byte": nil,
		"int8": nil,
		"int16": nil,
		"int32": nil,
		"int64": nil,
		"uint8": nil,
		"uint16": nil,
		"uint32": nil,
		"uint64": nil,
		"float32": nil,
		"float64": nil,
		"string": nil,

		// convenience types
		"int": nil,
		"uint": nil,
		"uintptr": nil,
		"float": nil,

		// constants
		"false": nil,
		"true": nil,
		"iota": nil,
		"nil": nil,

		// functions
		"cap": nil,
		"len": nil,
		"new": nil,
		"make": nil,
		"panic": nil,
		"panicln": nil,
		"print": nil,
		"println": nil,
	}
}
*/