Add expression functions with context boundaries
This commit is contained in:
parent
5085ae51aa
commit
773c34f3f4
18 changed files with 391 additions and 52 deletions
|
|
@ -22,7 +22,11 @@ func inferCoroutineEffects(semantic *SemanticProgram) {
|
|||
decl := &semantic.Syntax.Functions[index]
|
||||
symbol, _ := semantic.Global.Lookup(decl.Name)
|
||||
node := &effectNode{key: decl.Name, symbol: symbol}
|
||||
collectFunctionEffects(decl.Body, node)
|
||||
if decl.ExpressionBody != nil {
|
||||
collectExpressionEffects(decl.ExpressionBody, node)
|
||||
} else {
|
||||
collectFunctionEffects(decl.Body, node)
|
||||
}
|
||||
nodes = append(nodes, node)
|
||||
}
|
||||
for classIndex := range semantic.Syntax.Classes {
|
||||
|
|
@ -31,7 +35,11 @@ func inferCoroutineEffects(semantic *SemanticProgram) {
|
|||
for methodIndex := range class.Methods {
|
||||
method := &class.Methods[methodIndex]
|
||||
node := &effectNode{key: class.Name + "." + method.Name, symbol: classSymbol.Methods[method.Name]}
|
||||
collectFunctionEffects(method.Body, node)
|
||||
if method.ExpressionBody != nil {
|
||||
collectExpressionEffects(method.ExpressionBody, node)
|
||||
} else {
|
||||
collectFunctionEffects(method.Body, node)
|
||||
}
|
||||
nodes = append(nodes, node)
|
||||
}
|
||||
}
|
||||
|
|
@ -112,6 +120,12 @@ func collectExpressionEffects(expression Expr, node *effectNode) {
|
|||
if ident.Name == "runBlocking" {
|
||||
return
|
||||
}
|
||||
if ident.Name == "withContext" {
|
||||
if len(value.Args) > 0 {
|
||||
collectExpressionEffects(value.Args[0], node)
|
||||
}
|
||||
return
|
||||
}
|
||||
if coroutineBuiltins[ident.Name] {
|
||||
node.direct |= CoroutineEffect
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue