function spliceNamedCallsWithin(Source $s, $begin, $end, array $names, array $aliases) { foreach ($s->within(T_STRING, $begin, $end) as $string) { $original = strtolower($s->read($string)); if (isset($names[$original]) || isset($aliases[$original])) { $previous = $s->skipBack(Source::junk(), $string); $hadBackslash = false; if ($s->is(T_NS_SEPARATOR, $previous)) { if (!isset($names[$original])) { # use-aliased name cannot have a leading backslash continue; } $s->splice('', $previous, 1); $previous = $s->skipBack(Source::junk(), $previous); $hadBackslash = true; } if ($s->is([T_FUNCTION, T_OBJECT_OPERATOR, T_DOUBLE_COLON, T_STRING, T_NEW], $previous)) { continue; } $next = $s->skip(Source::junk(), $string); if (!$s->is(Generic\LEFT_ROUND, $next)) { continue; } if (isset($aliases[$original])) { $original = $aliases[$original]; } $secondNext = $s->skip(Source::junk(), $next); $splice = '\\' . CallRerouting\INTERNAL_REDEFINITION_NAMESPACE . '\\'; $splice .= $original . Generic\LEFT_ROUND; # prepend a namespace-of-origin argument to handle cases like Acme\time() vs time() $splice .= !$hadBackslash ? '__NAMESPACE__' : '""'; if (!$s->is(Generic\RIGHT_ROUND, $secondNext)) { # right parenthesis doesn't follow immediately => there are arguments $splice .= ', '; } $s->splice($splice, $string, $secondNext - $string); } } }