start = $start; $this->length = $length; $this->content = $content; } /** * Applies array of edits to the document, and returns the resulting text. * Supplied $edits must not overlap, and be ordered by increasing start position. * * Note that after applying edits, the original AST should be invalidated. * * @param TextEdit[] $edits * @param string $text * @return string */ public static function applyEdits(array $edits, string $text) : string { $prevEditStart = PHP_INT_MAX; for ($i = \count($edits) - 1; $i >= 0; $i--) { $edit = $edits[$i]; \assert( $prevEditStart > $edit->start && $prevEditStart > $edit->start + $edit->length, "Supplied TextEdit[] must not overlap, and be in increasing start position order." ); if ($edit->start < 0 || $edit->length < 0 || $edit->start + $edit->length > \strlen($text)) { throw new \OutOfBoundsException("Applied TextEdit range out of bounds."); } $prevEditStart = $edit->start; $head = \substr($text, 0, $edit->start); $tail = \substr($text, $edit->start + $edit->length); $text = $head . $edit->content . $tail; } return $text; } }