fspl/generator/function.go

41 lines
1.0 KiB
Go

package generator
import "github.com/llir/llvm/ir"
import "git.tebibyte.media/sashakoshka/fspl/entity"
func (this *generator) generateFunction (
function *entity.Function,
) (
*ir.Func,
error,
) {
params := make([]*ir.Param, len(function.Signature.Arguments))
ret, err := this.generateType(function.Signature.Return)
if err != nil { return nil, err }
for index, argument := range function.Signature.Arguments {
paramType, err := this.generateType(argument.Type())
if err != nil { return nil, err }
params[index] = ir.NewParam(argument.Name, paramType)
}
irFunc := this.module.NewFunc(function.Signature.Name, ret, params...)
if function.Body != nil {
this.blockManager = this.pushBlockManager(irFunc)
defer this.popBlockManager()
this.blockManager.addDeclarationsInFunction(function)
body, err := this.generateExpression(function.Body)
if err != nil { return nil, err }
if function.Signature.Return == nil {
this.blockManager.block.NewRet(nil)
} else {
this.blockManager.block.NewRet(body)
}
}
return irFunc, nil
}