(z ast.ApplyFn, fnTpe ast.BaseTerm, varRanges map[ast.Variable]ast.BaseTerm, nameTrie symbols.NameTrie)
| 1381 | } |
| 1382 | |
| 1383 | func 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 | |
| 1409 | func boundOfArg(x ast.BaseTerm, varRanges map[ast.Variable]ast.BaseTerm, nameTrie symbols.NameTrie) ast.BaseTerm { |
| 1410 | switch z := x.(type) { |
no test coverage detected