Add expression functions with context boundaries

This commit is contained in:
pavel 2026-08-27 23:05:49 +02:00
commit 773c34f3f4
18 changed files with 391 additions and 52 deletions

View file

@ -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
}