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

@ -65,7 +65,13 @@ func BuildPackageMetadata(program *Program, importPath string) (*PackageMetadata
}
for methodIndex := range class.Methods {
method := &class.Methods[methodIndex]
item.Methods = append(item.Methods, metadataFunction(method, semantic.FunctionEffects[class.Name+"."+method.Name]))
result := Type(nil)
if symbol := semantic.ClassInfo[class.Name].Method(method.Name); symbol != nil {
if signature, ok := symbol.Type.(FunctionType); ok {
result = signature.Result
}
}
item.Methods = append(item.Methods, metadataFunction(method, semantic.FunctionEffects[class.Name+"."+method.Name], result))
}
metadata.Classes = append(metadata.Classes, item)
}
@ -78,13 +84,23 @@ func BuildPackageMetadata(program *Program, importPath string) (*PackageMetadata
}
for index := range program.Functions {
function := &program.Functions[index]
metadata.Functions = append(metadata.Functions, metadataFunction(function, semantic.FunctionEffects[function.Name]))
result := Type(nil)
if symbol, ok := semantic.Global.Lookup(function.Name); ok {
if signature, ok := symbol.Type.(FunctionType); ok {
result = signature.Result
}
}
metadata.Functions = append(metadata.Functions, metadataFunction(function, semantic.FunctionEffects[function.Name], result))
}
return metadata, nil
}
func metadataFunction(function *FunctionDecl, effects Effect) FunctionMetadata {
item := FunctionMetadata{Name: function.Name, TypeParams: function.TypeParams, Result: function.ReturnType, Effects: effects}
func metadataFunction(function *FunctionDecl, effects Effect, result Type) FunctionMetadata {
resultName := function.ReturnType
if result != nil && !isUnknownType(result) {
resultName = result.String()
}
item := FunctionMetadata{Name: function.Name, TypeParams: function.TypeParams, Result: resultName, Effects: effects}
for _, param := range function.Params {
item.Params = append(item.Params, ParamMetadata{Name: param.Name, Type: param.Type})
}