package analyzer
// locator uniquely identifies a section in the section table.
type locator struct {
modulePath string
name string
}
func (where locator) ToString () (output string) {
output += where.modulePath + "." + where.name
return
// SectionTable stores a list of semantically analized sections from one module,
// and all sections that it requires from other modules.
type SectionTable map[locator] Section
// ToString returns the data stored in the table as a string.
func (table SectionTable) ToString (indent int) (output string) {
for _, section := range table {
output += section.ToString(indent)
// SectionKind differentiates Section interfaces.
type SectionKind int
const (
SectionKindType SectionKind = iota
SectionKindObjt
SectionKindEnum
SectionKindFace
SectionKindData
SectionKindFunc
)
// Section is a semantically analyzed section.
type Section interface {
Kind () (kind SectionKind)
Name () (name string)
ToString (indent int) (output string)
Complete () (complete bool)
// sectionBase is a struct that all sections must embed.
type sectionBase struct {
where locator
complete bool
// Name returns the name of the section.
func (section sectionBase) Name () (name string) {
name = section.where.name
// ModulePath returns the full path of the module the section came from.
func (section sectionBase) ModulePath () (name string) {
name = section.where.modulePath
// TODO: ModuleName returns the name of the module where the section came from.
// Complete returns wether the section has been completed.
func (section sectionBase) Complete () (complete bool) {
complete = section.complete