MCPcopy Index your code
hub / github.com/google/mangle / checkFunApply

Function checkFunApply

analysis/validation.go:1383–1407  ·  view source on GitHub ↗
(z ast.ApplyFn, fnTpe ast.BaseTerm, varRanges map[ast.Variable]ast.BaseTerm, nameTrie symbols.NameTrie)

Source from the content-addressed store, hash-verified

1381}
1382
1383func checkFunApply(z ast.ApplyFn, fnTpe ast.BaseTerm, varRanges map[ast.Variable]ast.BaseTerm, nameTrie symbols.NameTrie) (ast.BaseTerm, error) {
1384 if fnTpe.Equals(symbols.EmptyType) {
1385 return nil, fmt.Errorf("type checking for %v not implemented", z)
1386 }
1387 argTypes, err := symbols.FunTypeArgs(fnTpe)
1388 if err != nil {
1389 return nil, fmt.Errorf("not a function type: %v", fnTpe)
1390 }
1391 if len(argTypes) != len(z.Args) {
1392 return nil, fmt.Errorf("wrong number of arguments: expected %d got %d", len(argTypes), len(z.Args))
1393 }
1394 actualTpes := make([]ast.BaseTerm, len(argTypes))
1395 for i, arg := range z.Args {
1396 actualTpes[i] = boundOfArg(arg, varRanges, nameTrie)
1397 }
1398 subst, err := unionfind.UnifyTypeExpr(actualTpes, argTypes)
1399 if err != nil {
1400 return nil, fmt.Errorf("could not unify %v and %v: %v", actualTpes, argTypes, err)
1401 }
1402 res, err := symbols.FunTypeResult(fnTpe)
1403 if err != nil {
1404 return nil, fmt.Errorf("not a function type: %v", fnTpe)
1405 }
1406 return res.ApplySubstBase(ast.SubstMap(subst)), nil
1407}
1408
1409func boundOfArg(x ast.BaseTerm, varRanges map[ast.Variable]ast.BaseTerm, nameTrie symbols.NameTrie) ast.BaseTerm {
1410 switch z := x.(type) {

Callers 2

boundOfArgFunction · 0.85
typeOfFnFunction · 0.85

Calls 7

FunTypeArgsFunction · 0.92
UnifyTypeExprFunction · 0.92
FunTypeResultFunction · 0.92
SubstMapTypeAlias · 0.92
boundOfArgFunction · 0.85
EqualsMethod · 0.65
ApplySubstBaseMethod · 0.65

Tested by

no test coverage detected