@@ -1246,7 +1246,7 @@ class SubscriptExpr : public Expression {
12461246 }
12471247 return result;
12481248
1249- } else if (target_value.is_array ()) {
1249+ } else if (target_value.is_array ()) {
12501250 auto result = Value::array ();
12511251 for (int64_t i = start; step > 0 ? i < end : i > end; i += step) {
12521252 result.push_back (target_value.at (i));
@@ -1355,8 +1355,13 @@ class BinaryOpExpr : public Expression {
13551355 case Op::Gt: return l > r;
13561356 case Op::Le: return l <= r;
13571357 case Op::Ge: return l >= r;
1358- case Op::In: return (r.is_array () || r.is_object ()) && r.contains (l);
1359- case Op::NotIn: return !(r.is_array () && r.contains (l));
1358+ case Op::In: return (((r.is_array () || r.is_object ()) && r.contains (l)) ||
1359+ (l.is_string () && r.is_string () &&
1360+ r.to_str ().find (l.to_str ()) != std::string::npos));
1361+ case Op::NotIn:
1362+ return !(((r.is_array () || r.is_object ()) && r.contains (l)) ||
1363+ (l.is_string () && r.is_string () &&
1364+ r.to_str ().find (l.to_str ()) != std::string::npos));
13601365 default : break ;
13611366 }
13621367 throw std::runtime_error (" Unknown binary operator" );
@@ -1552,6 +1557,19 @@ class MethodCallExpr : public Expression {
15521557 else res[i] = std::tolower (res[i]);
15531558 }
15541559 return res;
1560+ } else if (method->get_name () == " replace" ) {
1561+ vargs.expectArgs (" replace method" , {2 , 3 }, {0 , 0 });
1562+ auto before = vargs.args [0 ].get <std::string>();
1563+ auto after = vargs.args [1 ].get <std::string>();
1564+ auto count = vargs.args .size () == 3 ? vargs.args [2 ].get <int64_t >()
1565+ : str.length ();
1566+ size_t start_pos = 0 ;
1567+ while ((start_pos = str.find (before, start_pos)) != std::string::npos &&
1568+ count-- > 0 ) {
1569+ str.replace (start_pos, before.length (), after);
1570+ start_pos += after.length ();
1571+ }
1572+ return str;
15551573 }
15561574 }
15571575 throw std::runtime_error (" Unknown method: " + method->get_name ());
@@ -2127,8 +2145,8 @@ class Parser {
21272145 }
21282146 }
21292147 }
2130-
2131- if ((has_first_colon || has_second_colon) && (start || end || step) ) {
2148+
2149+ if ((has_first_colon || has_second_colon)) {
21322150 index = std::make_shared<SliceExpr>(slice_loc, std::move (start), std::move (end), std::move (step));
21332151 } else {
21342152 index = std::move (start);
0 commit comments