body = $body; $this->length = mb_strlen($body, 'UTF-8'); $this->name = $name ?: 'GraphQL request'; $this->locationOffset = $location ?: new SourceLocation(1, 1); Utils::invariant( $this->locationOffset->line > 0, 'line in locationOffset is 1-indexed and must be positive' ); Utils::invariant( $this->locationOffset->column > 0, 'column in locationOffset is 1-indexed and must be positive' ); } /** * @param $position * @return SourceLocation */ public function getLocation($position) { $line = 1; $column = $position + 1; $utfChars = json_decode('"\u2028\u2029"'); $lineRegexp = '/\r\n|[\n\r'.$utfChars.']/su'; $matches = []; preg_match_all($lineRegexp, mb_substr($this->body, 0, $position, 'UTF-8'), $matches, PREG_OFFSET_CAPTURE); foreach ($matches[0] as $index => $match) { $line += 1; $column = $position + 1 - ($match[1] + mb_strlen($match[0], 'UTF-8')); } return new SourceLocation($line, $column); } }