From 5641220986f584fbbdcf26793b64e789fcd02453 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Sun, 23 Oct 2022 01:16:40 -0400 Subject: [PATCH] Some stuff on the func sections babey --- analyzer/analyzer.go | 2 ++ analyzer/func-section.go | 46 +++++++++++++++++++++++++++++++++++ analyzer/func-section_test.go | 3 +-- 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/analyzer/analyzer.go b/analyzer/analyzer.go index 7f45479..08fe42e 100644 --- a/analyzer/analyzer.go +++ b/analyzer/analyzer.go @@ -131,6 +131,8 @@ func (analyzer *analysisOperation) fetchSection ( section, err = analyzer.analyzeDataSection() if err != nil { return} case parser.FuncSection: + section, err = analyzer.analyzeFuncSection() + if err != nil { return} } return diff --git a/analyzer/func-section.go b/analyzer/func-section.go index 9998dbf..c119000 100644 --- a/analyzer/func-section.go +++ b/analyzer/func-section.go @@ -1,14 +1,60 @@ package analyzer +import "git.tebibyte.media/arf/arf/types" +import "git.tebibyte.media/arf/arf/parser" +import "git.tebibyte.media/arf/arf/infoerr" + // FuncSection represents a type definition section. type FuncSection struct { sectionBase external bool } +// ToString returns all data stored within the function section, in string form. +func (section FuncSection) ToString (indent int) (output string) { + output += doIndent(indent, "funcSection ") + output += section.permission.ToString() + " " + output += section.where.ToString() + output += "\n" + + // TODO: arguments + // TODO: root block + return +} + +// analyzeFuncSection analyzes a function section. func (analyzer *analysisOperation) analyzeFuncSection () ( section Section, err error, ) { + outputSection := FuncSection { } + outputSection.where = analyzer.currentPosition + + section = &outputSection + analyzer.addSection(section) + + inputSection := analyzer.currentSection.(parser.FuncSection) + outputSection.location = analyzer.currentSection.Location() + + // TODO: do not do this if it is a method + if inputSection.Permission() == types.PermissionReadWrite { + err = inputSection.NewError ( + "read-write (rw) permission not understood in this " + + "context, try read-only (ro)", + infoerr.ErrorKindError) + return + } + + outputSection.permission = inputSection.Permission() + + // TODO: analyze inputs and outputs and reciever + + if inputSection.External() { + outputSection.external = true + + } else { + // TODO: analyze root block if not nil + } + return } diff --git a/analyzer/func-section_test.go b/analyzer/func-section_test.go index c9d5d9b..411dfc2 100644 --- a/analyzer/func-section_test.go +++ b/analyzer/func-section_test.go @@ -4,8 +4,7 @@ import "testing" func TestFuncSection (test *testing.T) { checkTree ("../tests/analyzer/funcSection", false, -` -typeSection ro ../tests/analyzer/funcSection.aCString +`typeSection ro ../tests/analyzer/funcSection.aCString type 1 pointer { type 1 basic U8 }