public static function lint($query)
{
// Disabling lint for huge queries to save some resources.
if (mb_strlen($query) > 10000) {
return array(array('message' => __('Linting is disabled for this query because it exceeds the ' . 'maximum length.'), 'fromLine' => 0, 'fromColumn' => 0, 'toLine' => 0, 'toColumn' => 0, 'severity' => 'warning'));
}
/**
* Lexer used for tokenizing the query.
*
* @var Lexer
*/
$lexer = new Lexer($query);
/**
* Parsed used for analysing the query.
*
* @var Parser
*/
$parser = new Parser($lexer->list);
/**
* Array containing all errors.
*
* @var array
*/
$errors = ParserError::get(array($lexer, $parser));
/**
* The response containing of all errors.
*
* @var array
*/
$response = array();
/**
* The starting position for each line.
*
* CodeMirror requires relative position to line, but the parser stores
* only the absolute position of the character in string.
*
* @var array
*/
$lines = static::getLines($query);
// Building the response.
foreach ($errors as $idx => $error) {
// Starting position of the string that caused the error.
list($fromLine, $fromColumn) = static::findLineNumberAndColumn($lines, $error[3]);
// Ending position of the string that caused the error.
list($toLine, $toColumn) = static::findLineNumberAndColumn($lines, $error[3] + mb_strlen($error[2]));
// Building the response.
$response[] = array('message' => sprintf(__('%1$s (near <code>%2$s</code>)'), $error[0], $error[2]), 'fromLine' => $fromLine, 'fromColumn' => $fromColumn, 'toLine' => $toLine, 'toColumn' => $toColumn, 'severity' => 'error');
}
// Sending back the answer.
return $response;
}