Slight tweak of php token handling
This commit is contained in:
parent
9c23194feb
commit
99799e1d5a
@ -7,7 +7,7 @@ due to requiring the `FFI` extension.
|
|||||||
|
|
||||||
* The `editor` prefix has been removed from all the relevant functions, instead they are methods on the `Editor` class.
|
* The `editor` prefix has been removed from all the relevant functions, instead they are methods on the `Editor` class.
|
||||||
* Enums are faked with class constants
|
* Enums are faked with class constants
|
||||||
* Basic PHP class auto-loading is used
|
* Composer is used for autoloading
|
||||||
* Properties that must be manually updated in the C version (like counts/string length) are implemented with magic methods,
|
* Properties that must be manually updated in the C version (like counts/string length) are implemented with magic methods,
|
||||||
so they are essentially calculated on read.
|
so they are essentially calculated on read.
|
||||||
* Generally, if a function exists in PHP, with the same name as the C function, the PHP version will be used.
|
* Generally, if a function exists in PHP, with the same name as the C function, the PHP version will be used.
|
@ -43,14 +43,13 @@ class Termios {
|
|||||||
// Make sure to restore normal mode on exit/die/crash
|
// Make sure to restore normal mode on exit/die/crash
|
||||||
register_shutdown_function([static::class, 'disableRawMode']);
|
register_shutdown_function([static::class, 'disableRawMode']);
|
||||||
|
|
||||||
// So, the only thing that seems to really matter here is that c_oflag is 0...
|
|
||||||
$termios = clone $instance->originalTermios;
|
$termios = clone $instance->originalTermios;
|
||||||
// $termios->c_iflag &= ~(C::BRKINT | C::ICRNL | C::INPCK | C::ISTRIP | C::IXON);
|
// $termios->c_iflag &= ~(C::BRKINT | C::ICRNL | C::INPCK | C::ISTRIP | C::IXON);
|
||||||
// $termios->c_oflag &= ~(C::OPOST);
|
// $termios->c_oflag &= ~(C::OPOST);
|
||||||
$termios->c_iflag = 0;
|
$termios->c_iflag = 0;
|
||||||
$termios->c_oflag = 0;
|
$termios->c_oflag = 0;
|
||||||
$termios->c_cflag |= (C::CS8);
|
$termios->c_cflag |= (C::CS8);
|
||||||
$termios->c_lflag = $termios->c_lflag & ~( C::ECHO | C::ICANON | C::IEXTEN | C::ISIG );
|
$termios->c_lflag &= ~( C::ECHO | C::ICANON | C::IEXTEN | C::ISIG );
|
||||||
$termios->c_cc[C::VMIN] = 0;
|
$termios->c_cc[C::VMIN] = 0;
|
||||||
$termios->c_cc[C::VTIME] = 1;
|
$termios->c_cc[C::VTIME] = 1;
|
||||||
|
|
||||||
|
@ -294,74 +294,75 @@ function get_php_tokens(string $code): array
|
|||||||
$line = [];
|
$line = [];
|
||||||
foreach($rawTokens as $t)
|
foreach($rawTokens as $t)
|
||||||
{
|
{
|
||||||
// Simple characters, usually delimiters or single character operators
|
if (is_array($t))
|
||||||
if ( ! is_array($t))
|
|
||||||
{
|
{
|
||||||
|
[$type, $rawChar, $currentLine] = $t;
|
||||||
|
$char = tabs_to_spaces($rawChar);
|
||||||
|
|
||||||
|
$current = [
|
||||||
|
'type' => $type,
|
||||||
|
'typeName' => token_name($type),
|
||||||
|
'char' => $char,
|
||||||
|
'line' => $currentLine,
|
||||||
|
];
|
||||||
|
|
||||||
|
if ($char === "\n")
|
||||||
|
{
|
||||||
|
$line[] = $current;
|
||||||
|
$tokens[$lineNum] = $line;
|
||||||
|
$lineNum++;
|
||||||
|
$line = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only return the first line of a multi-line token for this line array
|
||||||
|
if ($char !== "\n" && strpos($char, "\n") !== FALSE)
|
||||||
|
{
|
||||||
|
$chars = explode("\n", $char);
|
||||||
|
$current['original'] = [
|
||||||
|
'string' => $char,
|
||||||
|
'lines' => $chars,
|
||||||
|
];
|
||||||
|
$current['char'] = array_shift($chars);
|
||||||
|
|
||||||
|
// Add new lines for additional newline characters
|
||||||
|
$nextLine = $currentLine;
|
||||||
|
foreach ($chars as $char)
|
||||||
|
{
|
||||||
|
$nextLine++;
|
||||||
|
|
||||||
|
if ( ! array_key_exists($nextLine, $tokens))
|
||||||
|
{
|
||||||
|
$tokens[$nextLine] = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$tokens[$nextLine][] = [
|
||||||
|
'type' => -1,
|
||||||
|
'typeName' => 'RAW',
|
||||||
|
'char' => $char,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($currentLine !== $lineNum)
|
||||||
|
{
|
||||||
|
$existing = $tokens[$lineNum] ?? [];
|
||||||
|
$tokens[$lineNum] = array_merge($existing, $line);
|
||||||
|
|
||||||
|
$lineNum = $currentLine;
|
||||||
|
$line = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$line[] = $current;
|
||||||
|
}
|
||||||
|
else if (is_string($t))
|
||||||
|
{
|
||||||
|
// Simple characters, usually delimiters or single character operators
|
||||||
$line[] = [
|
$line[] = [
|
||||||
'type' => -1,
|
'type' => -1,
|
||||||
'typeName' => 'RAW',
|
'typeName' => 'RAW',
|
||||||
'char' => tabs_to_spaces($t),
|
'char' => tabs_to_spaces($t),
|
||||||
];
|
];
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[$type, $rawChar, $currentLine] = $t;
|
|
||||||
$char = tabs_to_spaces($rawChar);
|
|
||||||
|
|
||||||
$current = [
|
|
||||||
'type' => $type,
|
|
||||||
'typeName' => token_name($type),
|
|
||||||
'char' => $char,
|
|
||||||
'line' => $currentLine,
|
|
||||||
];
|
|
||||||
|
|
||||||
if ($char === "\n")
|
|
||||||
{
|
|
||||||
$line[] = $current;
|
|
||||||
$tokens[$lineNum] = $line;
|
|
||||||
$lineNum++;
|
|
||||||
$line = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Only return the first line of a multi-line token for this line array
|
|
||||||
if ($char !== "\n" && strpos($char, "\n") !== FALSE)
|
|
||||||
{
|
|
||||||
$chars = explode("\n", $char);
|
|
||||||
$current['original'] = [
|
|
||||||
'string' => $char,
|
|
||||||
'lines' => $chars,
|
|
||||||
];
|
|
||||||
$current['char'] = array_shift($chars);
|
|
||||||
|
|
||||||
// Add new lines for additional newline characters
|
|
||||||
$nextLine = $currentLine;
|
|
||||||
foreach ($chars as $char)
|
|
||||||
{
|
|
||||||
$nextLine++;
|
|
||||||
|
|
||||||
if ( ! array_key_exists($nextLine, $tokens))
|
|
||||||
{
|
|
||||||
$tokens[$nextLine] = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
$tokens[$nextLine][] = [
|
|
||||||
'type' => -1,
|
|
||||||
'typeName' => 'RAW',
|
|
||||||
'char' => $char,
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($currentLine !== $lineNum)
|
|
||||||
{
|
|
||||||
$existing = $tokens[$lineNum] ?? [];
|
|
||||||
$tokens[$lineNum] = array_merge($existing, $line);
|
|
||||||
|
|
||||||
$lineNum = $currentLine;
|
|
||||||
$line = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
$line[] = $current;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$tokens[$lineNum] = array_merge($tokens[$lineNum] ?? [], $line);
|
$tokens[$lineNum] = array_merge($tokens[$lineNum] ?? [], $line);
|
||||||
|
Loading…
Reference in New Issue
Block a user