While checking a rule, we want to look up possible relation types. If we find several applicable ones, we return the feasible ones.
( pred ast.PredicateSym, args []ast.BaseTerm, varRanges map[ast.Variable]ast.BaseTerm, typeCtx map[ast.Variable]ast.BaseTerm)
| 1311 | // While checking a rule, we want to look up possible relation types. |
| 1312 | // If we find several applicable ones, we return the feasible ones. |
| 1313 | func (bc *BoundsAnalyzer) getOrInferRelTypes( |
| 1314 | pred ast.PredicateSym, |
| 1315 | args []ast.BaseTerm, |
| 1316 | varRanges map[ast.Variable]ast.BaseTerm, |
| 1317 | typeCtx map[ast.Variable]ast.BaseTerm) ([]ast.BaseTerm, error) { |
| 1318 | |
| 1319 | if relType, ok := bc.relTypeMap[pred]; ok { |
| 1320 | tpe, _, err := bc.feasibleAlternatives(pred, relType, args, varRanges, typeCtx) |
| 1321 | return tpe, err |
| 1322 | } |
| 1323 | |
| 1324 | if relType, ok := bc.inferred[pred]; ok { |
| 1325 | tpe, _, err := bc.feasibleAlternatives(pred, relType, args, varRanges, typeCtx) |
| 1326 | return tpe, err |
| 1327 | } |
| 1328 | |
| 1329 | if bc.visiting[pred] { |
| 1330 | // We are asking for pred in a recursive call. Use [any ... any] |
| 1331 | relType, err := symbols.RelTypeExprFromDecl(*bc.programInfo.Decls[pred]) |
| 1332 | if err != nil { |
| 1333 | return nil, err |
| 1334 | } |
| 1335 | return []ast.BaseTerm{relType}, nil |
| 1336 | } |
| 1337 | |
| 1338 | bc.visiting[pred] = true |
| 1339 | defer delete(bc.visiting, pred) |
| 1340 | |
| 1341 | relTypeExpr, err := bc.inferRelTypes(pred) |
| 1342 | if err != nil { |
| 1343 | return nil, err |
| 1344 | } |
| 1345 | bc.inferred[pred] = relTypeExpr |
| 1346 | tpe, _, err := bc.feasibleAlternatives(pred, relTypeExpr, args, varRanges, nil /*TODO map[ast.Variable]bool*/) |
| 1347 | return tpe, err |
| 1348 | |
| 1349 | } |
| 1350 | |
| 1351 | // inferRelType infers a relation type from rules when no decl is available. |
| 1352 | // inferRelType ensures that bc.inferred[pred] is populated with the inferred relation type. |
no test coverage detected