// 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 eval

import (
	"fmt";
	"go/scanner";
	"go/token";
)


type positioned interface {
	Pos() token.Position;
}


// A compiler captures information used throughout an entire
// compilation.  Currently it includes only the error handler.
//
// TODO(austin) This might actually represent package level, in which
// case it should be package compiler.
type compiler struct {
	errors		scanner.ErrorHandler;
	numErrors	int;
	silentErrors	int;
}

func (a *compiler) diagAt(pos positioned, format string, args ...) {
	a.errors.Error(pos.Pos(), fmt.Sprintf(format, args));
	a.numErrors++;
}

func (a *compiler) numError() int	{ return a.numErrors + a.silentErrors }

// The universal scope
func newUniverse() *Scope {
	sc := &Scope{nil, 0};
	sc.block = &block{
		offset: 0,
		scope: sc,
		global: true,
		defs: make(map[string]Def),
	};
	return sc;
}

var universe *Scope = newUniverse()


// TODO(austin) These can all go in stmt.go now
type label struct {
	name	string;
	desc	string;
	// The PC goto statements should jump to, or nil if this label
	// cannot be goto'd (such as an anonymous for loop label).
	gotoPC	*uint;
	// The PC break statements should jump to, or nil if a break
	// statement is invalid.
	breakPC	*uint;
	// The PC continue statements should jump to, or nil if a
	// continue statement is invalid.
	continuePC	*uint;
	// The position where this label was resolved.  If it has not
	// been resolved yet, an invalid position.
	resolved	token.Position;
	// The position where this label was first jumped to.
	used	token.Position;
}

// A funcCompiler captures information used throughout the compilation
// of a single function body.
type funcCompiler struct {
	*compiler;
	fnType	*FuncType;
	// Whether the out variables are named.  This affects what
	// kinds of return statements are legal.
	outVarsNamed	bool;
	*codeBuf;
	flow	*flowBuf;
	labels	map[string]*label;
}

// A blockCompiler captures information used throughout the compilation
// of a single block within a function.
type blockCompiler struct {
	*funcCompiler;
	block	*block;
	// The label of this block, used for finding break and
	// continue labels.
	label	*label;
	// The blockCompiler for the block enclosing this one, or nil
	// for a function-level block.
	parent	*blockCompiler;
}
