This repository has been archived on 2024-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
arf/analyzer/type-section.go

98 lines
2.6 KiB
Go
Raw Normal View History

package analyzer
2022-09-18 00:41:06 -06:00
import "git.tebibyte.media/arf/arf/types"
import "git.tebibyte.media/arf/arf/parser"
import "git.tebibyte.media/arf/arf/infoerr"
// TypeSection represents a type definition section.
type TypeSection struct {
sectionBase
2022-09-18 00:41:06 -06:00
what Type
complete bool
argument Argument
2022-09-29 15:34:51 -06:00
// TODO: do not add members from parent type. instead have a member
// function to discern whether this type contains a particular member,
// and have it recurse all the way up the family tree. it will be the
// translator's job to worry about what members are placed where.
members []ObjectMember
}
// ObjectMember is a member of an object type.
type ObjectMember struct {
name string
// even if there is a private permission in another module, we still
// need to include it in the semantic analysis because we need to know
2022-10-01 15:12:43 -06:00
// what members objects have.
2022-09-29 15:34:51 -06:00
permission types.Permission
what Type
}
func (member ObjectMember) ToString (indent int) (output string) {
output += doIndent (
indent,
member.name, " ",
member.permission.ToString(),
"\n")
output += member.what.ToString(indent + 1)
return
}
// ToString returns all data stored within the type section, in string form.
func (section TypeSection) ToString (indent int) (output string) {
2022-10-01 15:21:17 -06:00
output += doIndent(indent, "typeSection ")
output += section.permission.ToString() + " "
output += section.where.ToString()
output += "\n"
2022-09-18 00:41:06 -06:00
output += section.what.ToString(indent + 1)
if section.argument != nil {
output += section.argument.ToString(indent + 1)
}
2022-09-18 00:41:06 -06:00
return
}
// analyzeTypeSection analyzes a type section.
2022-10-11 21:53:38 -06:00
func (analyzer analysisOperation) analyzeTypeSection () (
2022-09-18 00:41:06 -06:00
section Section,
err error,
) {
2022-09-29 16:09:52 -06:00
outputSection := TypeSection { }
outputSection.where = analyzer.currentPosition
section = &outputSection
2022-09-29 16:09:52 -06:00
analyzer.addSection(section)
2022-09-18 00:41:06 -06:00
inputSection := analyzer.currentSection.(parser.TypeSection)
2022-10-11 16:31:37 -06:00
outputSection.location = analyzer.currentSection.Location()
2022-09-18 00:41:06 -06:00
if inputSection.Permission() == types.PermissionReadWrite {
err = inputSection.NewError (
2022-09-29 15:34:51 -06:00
"read-write (rw) permission not understood in this " +
"context, try read-only (ro)",
2022-09-18 00:41:06 -06:00
infoerr.ErrorKindError)
}
2022-10-01 15:21:17 -06:00
outputSection.permission = inputSection.Permission()
2022-09-18 00:41:06 -06:00
outputSection.what, err = analyzer.analyzeType(inputSection.Type())
2022-09-20 09:01:56 -06:00
if err != nil { return }
if !inputSection.Argument().Nil() {
outputSection.argument,
err = analyzer.analyzeArgument(inputSection.Argument())
if err != nil { return }
// type check default value
err = analyzer.typeCheck (
outputSection.argument,
outputSection.what)
if err != nil { return }
}
// TODO: analyze members
2022-09-18 00:41:06 -06:00
outputSection.complete = true
return
}