package analyzer

import "path/filepath"
import "git.tebibyte.media/arf/arf/file"
import "git.tebibyte.media/arf/arf/types"
import "git.tebibyte.media/arf/arf/infoerr"

// locatable allows a tree node to have a location.
type locatable struct {
	location file.Location
}

// Location returns the location of the node.
func (node locatable) Location () (location file.Location) {
	location = node.location
	return
}

// NewError creates a new error at the node's location.
func (node locatable) NewError (
	message string,
	kind    infoerr.ErrorKind,
) (
	err error,
) {
	err = infoerr.NewError(node.location, message, kind)
	return
}

// sectionBase is a struct that all sections must embed.
type sectionBase struct {
	where      locator
	complete   bool
	permission types.Permission
	locatable
}

// Name returns the name of the section.
func (section sectionBase) Name () (name string) {
	name = section.where.name
	return
}

// ModulePath returns the full path of the module the section came from.
func (section sectionBase) ModulePath () (path string) {
	path = section.where.modulePath
	return
}

// ModuleName returns the name of the module where the section came from.
func (section sectionBase) ModuleName () (name string) {
	name = filepath.Base(section.where.modulePath)
	return
}

// Complete returns wether the section has been completed.
func (section sectionBase) Complete () (complete bool) {
	complete = section.complete
	return
}

// Permission returns the permission of the section.
func (section sectionBase) Permission () (permission types.Permission) {
	permission = section.permission
	return
}

// locator returns the module path and name of the section.
func (section sectionBase) locator () (where locator) {
	where = section.where
	return
}

// phraseBase is a struct that all phrases must embed.
type phraseBase struct {
	locatable
	returnsTo []Argument
}
