| 1407 | } |
| 1408 | |
| 1409 | func boundOfArg(x ast.BaseTerm, varRanges map[ast.Variable]ast.BaseTerm, nameTrie symbols.NameTrie) ast.BaseTerm { |
| 1410 | switch z := x.(type) { |
| 1411 | case ast.Variable: |
| 1412 | if bound, ok := varRanges[z]; ok { |
| 1413 | return bound |
| 1414 | } |
| 1415 | return ast.AnyBound |
| 1416 | |
| 1417 | case ast.Constant: |
| 1418 | switch z.Type { |
| 1419 | case ast.NumberType: |
| 1420 | return ast.NumberBound |
| 1421 | case ast.Float64Type: |
| 1422 | return ast.Float64Bound |
| 1423 | case ast.StringType: |
| 1424 | return ast.StringBound |
| 1425 | case ast.TimeType: |
| 1426 | return ast.TimeBound |
| 1427 | case ast.DurationType: |
| 1428 | return ast.DurationBound |
| 1429 | case ast.NameType: |
| 1430 | // Find a name prefix type, or fall back to /name. |
| 1431 | return nameTrie.PrefixName(z.Symbol) |
| 1432 | case ast.ListShape: |
| 1433 | var args []ast.BaseTerm |
| 1434 | z.ListValues(func(arg ast.Constant) error { |
| 1435 | args = append(args, arg) |
| 1436 | return nil |
| 1437 | }, func() error { |
| 1438 | return nil |
| 1439 | }) |
| 1440 | |
| 1441 | return boundOfArg(ast.ApplyFn{symbols.List, args}, varRanges, nameTrie) |
| 1442 | case ast.MapShape: |
| 1443 | var args []ast.BaseTerm |
| 1444 | z.MapValues(func(keyArg, valArg ast.Constant) error { |
| 1445 | args = append(args, keyArg) |
| 1446 | args = append(args, valArg) |
| 1447 | return nil |
| 1448 | }, func() error { |
| 1449 | return nil |
| 1450 | }) |
| 1451 | return boundOfArg(ast.ApplyFn{symbols.Map, args}, varRanges, nameTrie) |
| 1452 | case ast.StructShape: |
| 1453 | var args []ast.BaseTerm |
| 1454 | z.StructValues(func(fieldArg, valArg ast.Constant) error { |
| 1455 | args = append(args, fieldArg) |
| 1456 | args = append(args, valArg) |
| 1457 | return nil |
| 1458 | }, func() error { |
| 1459 | return nil |
| 1460 | }) |
| 1461 | return boundOfArg(ast.ApplyFn{symbols.Struct, args}, varRanges, nameTrie) |
| 1462 | |
| 1463 | default: |
| 1464 | return ast.AnyBound // This cannot happen |
| 1465 | } |
| 1466 | |