Slight tweak of php token handling

This commit is contained in:
Timothy Warren 2019-11-13 16:26:19 -05:00
parent 9c23194feb
commit 99799e1d5a
3 changed files with 64 additions and 64 deletions

View File

@ -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.

View File

@ -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;

View File

@ -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);