41 lines
1.0 KiB
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
|
||
|
}
|