Add expression functions with context boundaries
This commit is contained in:
parent
5085ae51aa
commit
773c34f3f4
18 changed files with 391 additions and 52 deletions
|
|
@ -471,18 +471,28 @@ func (p *parser) parseFunction() (FunctionDecl, error) {
|
|||
if err != nil {
|
||||
return FunctionDecl{}, err
|
||||
}
|
||||
function := FunctionDecl{
|
||||
Name: signature.Name,
|
||||
TypeParams: signature.TypeParams,
|
||||
Params: signature.Params,
|
||||
ReturnType: signature.ReturnType,
|
||||
ReturnExplicit: signature.ReturnExplicit,
|
||||
}
|
||||
if p.match(tokenAssign) {
|
||||
expression, err := p.parseExpr(0)
|
||||
if err != nil {
|
||||
return FunctionDecl{}, err
|
||||
}
|
||||
function.ExpressionBody = expression
|
||||
function.InferReturn = !signature.ReturnExplicit
|
||||
return function, nil
|
||||
}
|
||||
body, err := p.parseBlock()
|
||||
if err != nil {
|
||||
return FunctionDecl{}, err
|
||||
}
|
||||
|
||||
return FunctionDecl{
|
||||
Name: signature.Name,
|
||||
TypeParams: signature.TypeParams,
|
||||
Params: signature.Params,
|
||||
ReturnType: signature.ReturnType,
|
||||
Body: body,
|
||||
}, nil
|
||||
function.Body = body
|
||||
return function, nil
|
||||
}
|
||||
|
||||
func (p *parser) parseFunctionSignature() (FunctionSignature, error) {
|
||||
|
|
@ -509,7 +519,9 @@ func (p *parser) parseFunctionSignature() (FunctionSignature, error) {
|
|||
}
|
||||
|
||||
returnType := "Unit"
|
||||
returnExplicit := false
|
||||
if p.match(tokenColon) {
|
||||
returnExplicit = true
|
||||
typ, err := p.parseTypeRef()
|
||||
if err != nil {
|
||||
return FunctionSignature{}, err
|
||||
|
|
@ -518,10 +530,11 @@ func (p *parser) parseFunctionSignature() (FunctionSignature, error) {
|
|||
}
|
||||
|
||||
return FunctionSignature{
|
||||
Name: name.lexeme,
|
||||
TypeParams: typeParams,
|
||||
Params: params,
|
||||
ReturnType: returnType,
|
||||
Name: name.lexeme,
|
||||
TypeParams: typeParams,
|
||||
Params: params,
|
||||
ReturnType: returnType,
|
||||
ReturnExplicit: returnExplicit,
|
||||
}, nil
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue