8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
# File 'lib/cel/extensions/string.rb', line 8
def __check(funcall, checker:)
var = funcall.var
func = funcall.func
args = funcall.args
case func
when :quote
checker.check_arity(func, args, 1)
arg = checker.call(args.first)
return TYPES[:string] if checker.find_match_all_types(i[string], arg)
when :indexOf, :lastIndexOf
if checker.call(var) == TYPES[:string]
checker.check_arity(func, args, 2, :>=)
arg, pos = args
arg = checker.call(arg)
if checker.find_match_all_types(i[string], arg)
return TYPES[:int] if pos.nil?
pos = checker.call(pos)
return TYPES[:int] if checker.find_match_all_types(i[int], pos)
end
end
when :split
if checker.call(var) == TYPES[:string]
checker.check_arity(func, args, 2, :>=)
arg, pos = args
arg = checker.call(arg)
if checker.find_match_all_types(i[string], arg)
return TYPES[:list, :string] if pos.nil?
pos = checker.call(pos)
return TYPES[:list, :string] if checker.find_match_all_types(i[int], pos)
end
end
when :substring
if checker.call(var) == TYPES[:string]
checker.check_arity(func, args, 2, :>=)
arg, pos = args
arg = checker.call(arg)
if checker.find_match_all_types(i[int], arg)
return TYPES[:string] if pos.nil?
pos = checker.call(pos)
return TYPES[:string] if checker.find_match_all_types(i[int], pos)
end
end
when :trim, :lowerAscii, :upperAscii, :reverse
if checker.call(var) == TYPES[:string]
checker.check_arity(func, args, 0)
return TYPES[:string]
end
when :format
if checker.call(var) == TYPES[:string]
checker.check_arity(func, args, 1)
arg = checker.call(args.first)
return TYPES[:string] if checker.find_match_all_types(i[list], arg)
end
when :charAt
if checker.call(var) == TYPES[:string]
checker.check_arity(func, args, 1)
arg = checker.call(args.first)
return TYPES[:string] if checker.find_match_all_types(i[int], arg)
end
when :replace
if checker.call(var) == TYPES[:string]
checker.check_arity(func, args, 2..3, :include?)
p, r, limit = args.map(&checker.method(:call))
if limit
return TYPES[:string] if checker.find_match_all_types(i[string], [p, r]) &&
checker.find_match_all_types(i[int], limit)
elsif checker.find_match_all_types(i[string], [p, r])
return TYPES[:string]
end
end
when :join
if checker.call(var) == TYPES[:list, :string] || checker.call(var) == TYPES[:list, :any]
checker.check_arity(func, args, 1, :>=)
arg = checker.call(args.first)
return TYPES[:string] unless arg
return TYPES[:string] if checker.find_match_all_types(i[string], arg)
end
end
checker.unsupported_operation(funcall)
end
|