diff --git a/phpunit.xml b/phpunit.xml index 29337b8..3313bbd 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -14,7 +14,7 @@ - tests + tests diff --git a/src/Document.php b/src/Document.php index 4484646..b0c5167 100644 --- a/src/Document.php +++ b/src/Document.php @@ -105,12 +105,12 @@ class Document { if ($c === KeyType::ENTER || $c === RawKeyCode::CARRIAGE_RETURN) { $this->insertNewline($at); + $this->dirty = true; return; } - $this->dirty = true; - $this->rows[$at->y]->insert($at->x, $c); + $this->dirty = true; } public function delete(Point $at): void @@ -120,7 +120,6 @@ class Document { return; } - $this->dirty = true; $row =& $this->rows[$at->y]; if ($at->x === $this->rows[$at->y]->size && $at->y + 1 < $this->numRows) @@ -132,6 +131,8 @@ class Document { { $row->delete($at->x); } + + $this->dirty = true; } public function insertRow(int $at, string $s, bool $updateSyntax = TRUE): void @@ -171,6 +172,8 @@ class Document { { $this->refreshPHPSyntax(); } + + $this->dirty = true; } protected function deleteRow(int $at): void @@ -228,6 +231,8 @@ class Document { // Add a new row with the contents of the previous row at the point of the split $this->insertRow($at->y + 1, substr($chars, $at->x)); } + + $this->dirty = true; } protected function selectSyntaxHighlight(): void diff --git a/src/Row.php b/src/Row.php index 58ba1b3..88b8711 100644 --- a/src/Row.php +++ b/src/Row.php @@ -8,7 +8,7 @@ use Aviat\Kilo\Enum\RawKeyCode; /** * @property-read int $size * @property-read int $rsize - * @property string $chars + * @property-read string $chars */ class Row { // use Traits\MagicProperties; @@ -28,8 +28,6 @@ class Row { */ private bool $hlOpenComment = FALSE; - private const T_RAW = -1; - /** * Create a row in the current document * @@ -143,8 +141,6 @@ class Row { // Safely insert into arbitrary position in the existing string $this->chars = substr($this->chars, 0, $at) . $c . substr($this->chars, $at); $this->update(); - - $this->parent->dirty = true; } /** @@ -156,8 +152,6 @@ class Row { { $this->chars .= $s; $this->update(); - - $this->parent->dirty = true; } /** @@ -174,8 +168,6 @@ class Row { $this->chars = substr_replace($this->chars, '', $at, 1); $this->update(); - - $this->parent->dirty = true; } public function setChars(string $chars): void @@ -226,7 +218,7 @@ class Row { while ($i < $this->rsize) { // Multi-line comments - if ($mcsLen > 0 && $mceLen > 0 && $inString === '') + if ($syntax->mlComments() && $inString === '') { if ($inComment) { @@ -254,15 +246,14 @@ class Row { if ( $this->highlightComment($i, $syntax) - || $this->highlightMultilineComments($i, $syntax) || $this->highlightPrimaryKeywords($i, $syntax) || $this->highlightSecondaryKeywords($i, $syntax) - || $this->highlightOperators($i, $syntax) - || $this->highlightCommonOperators($i) - || $this->highlightCommonDelimeters($i) || $this->highlightCharacter($i, $syntax) || $this->highlightString($i, $syntax) || $this->highlightNumber($i, $syntax) + || $this->highlightOperators($i, $syntax) + || $this->highlightCommonOperators($i) + || $this->highlightCommonDelimeters($i) ) { $i++; continue; @@ -398,6 +389,11 @@ class Row { protected function highlightCharacter(int &$i, Syntax $opts): bool { + if (($i + 1) >= $this->rsize) + { + return false; + } + $char = $this->render[$i]; $nextChar = $this->render[$i + 1]; @@ -444,35 +440,6 @@ class Row { return false; } - protected function highlightMultilineComments(int &$i, Syntax $opts): bool - { - if ( ! $opts->mlComments()) - { - return false; - } - - $mcs = $opts->multiLineCommentStart; - $mce = $opts->multiLineCommentEnd; - - $mcsLen = strlen($mcs); - $mceLen = strlen($mce); - - if ($i + $mcsLen < $this->rsize && \str_contains($this->render, $mcs)) - { - $endix = strpos($this->render, $mcs); - $closingIndex = ($endix !== false) - ? $i + $endix + $mcsLen + $mceLen - : $this->rsize; - - array_replace_range($this->hl, $i, $closingIndex, Highlight::ML_COMMENT); - $i += $closingIndex; - - return true; - } - - return false; - } - protected function highlightString(int &$i, Syntax $opts): bool { $char = $this->render[$i]; @@ -622,17 +589,12 @@ class Row { $highlight = match(true) { // Matches a predefined PHP token - $token['type'] !== self::T_RAW && $tokenHighlight !== Highlight::NORMAL + $token['type'] !== T_RAW && $tokenHighlight !== Highlight::NORMAL => $tokenHighlight, // Matches a specific syntax character $charHighlight !== Highlight::NORMAL => $charHighlight, - // Types/identifiers/keywords that don't have their own token, but are - // defined as keywords - in_array($token['char'], $this->parent->fileType->syntax->keywords2, TRUE) - => Highlight::KEYWORD2, - default => Highlight::NORMAL, }; diff --git a/src/Tokens/PHP8.php b/src/Tokens/PHP8.php index 6d3bf7f..45d14e9 100644 --- a/src/Tokens/PHP8.php +++ b/src/Tokens/PHP8.php @@ -6,6 +6,7 @@ use PhpToken; use function Aviat\Kilo\str_contains; use function Aviat\Kilo\tabs_to_spaces; +use const Aviat\Kilo\T_RAW; class PHP8 extends PhpToken { private array $rawLines = []; @@ -119,7 +120,7 @@ class PHP8 extends PhpToken { // Simple characters, usually delimiters or single character operators $this->tokens[$lineNumber][] = [ - 'type' => -1, + 'type' => T_RAW, 'typeName' => 'RAW', 'char' => tabs_to_spaces($token), 'line' => $lineNumber, diff --git a/src/constants.php b/src/constants.php index b3318e6..39fe79b 100644 --- a/src/constants.php +++ b/src/constants.php @@ -10,3 +10,4 @@ const KILO_TAB_STOP = 4; const KILO_QUIT_TIMES = 3; const NO_MATCH = -1; +const T_RAW = -1; \ No newline at end of file diff --git a/tests/RowTest.php b/tests/RowTest.php index 103dfc3..d97e888 100644 --- a/tests/RowTest.php +++ b/tests/RowTest.php @@ -33,16 +33,13 @@ class RowTest extends TestCase { public function testSetRunsUpdate(): void { - // $this->markTestSkipped('Hangs'); $this->row->setChars('abcde'); - // $this->assertNotEmpty($this->row->chars); - // $this->assertEquals('abcde', $this->row->render); + $this->assertNotEmpty($this->row->chars); + $this->assertEquals('abcde', $this->row->render); } public function test__toString(): void { - $this->markTestSkipped('Hangs'); - $this->row->setChars('abcde'); $this->assertEquals("abcde\n", (string)$this->row); } @@ -64,8 +61,6 @@ class RowTest extends TestCase { public function testInsert(): void { - $this->markTestSkipped('Hangs'); - $this->row->setChars('abde'); $this->row->insert(2, 'c'); @@ -76,8 +71,6 @@ class RowTest extends TestCase { public function testInsertBadOffset(): void { - $this->markTestSkipped('Hangs'); - $this->row->setChars('ab'); $this->row->insert(5, 'c'); @@ -88,8 +81,6 @@ class RowTest extends TestCase { public function testDelete(): void { - $this->markTestSkipped('Hangs'); - $this->row->setChars('abcdef'); $this->row->delete(5); @@ -100,12 +91,9 @@ class RowTest extends TestCase { public function testDeleteBadOffset(): void { - $this->markTestSkipped('Hangs'); - $this->row->setChars('ab'); $this->row->delete(5); $this->assertEquals('ab', $this->row->chars); - $this->assertEquals(false, $this->document->dirty); } } \ No newline at end of file diff --git a/tests/__snapshots__/EditorTest__testOpen__1.json b/tests/__snapshots__/EditorTest__testOpen__1.json index 5fa747a..a0a3b45 100644 --- a/tests/__snapshots__/EditorTest__testOpen__1.json +++ b/tests/__snapshots__/EditorTest__testOpen__1.json @@ -654,7 +654,7 @@ 5, 5, 5, - 7 + 0 ], "idx": 16 }, @@ -678,7 +678,7 @@ 13, 13, 13, - 7 + 0 ], "idx": 17 }, @@ -1218,29 +1218,8 @@ { "render": " \/* Input modes. *\/", "hl": [ - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, + 0, + 0, 2, 2, 2, @@ -1296,28 +1275,8 @@ { "render": " \/* Output modes. *\/", "hl": [ - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, + 0, + 0, 2, 2, 2, @@ -1374,27 +1333,8 @@ { "render": " \/* Control modes. *\/", "hl": [ - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, + 0, + 0, 2, 2, 2, @@ -1452,29 +1392,8 @@ { "render": " \/* Local modes. *\/", "hl": [ - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, + 0, + 0, 2, 2, 2, @@ -1530,22 +1449,8 @@ { "render": " \/* Control characters. *\/", "hl": [ - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, + 0, + 0, 2, 2, 2, @@ -1590,10 +1495,10 @@ 0, 0, 9, - 6, - 6, + 0, + 0, 9, - 7 + 0 ], "idx": 49 }, @@ -1605,13 +1510,8 @@ { "render": " \/* Input and output baud rates. *\/", "hl": [ - 2, - 2, - 2, - 2, - 2, - 2, - 2, + 0, + 0, 2, 2, 2, @@ -1689,7 +1589,7 @@ "render": "};", "hl": [ 9, - 7 + 0 ], "idx": 53 }, @@ -1716,9 +1616,9 @@ 0, 0, 9, - 4, - 4, - 4, + 0, + 0, + 0, 0, 0, 0, @@ -1750,7 +1650,7 @@ 0, 0, 9, - 7 + 0 ], "idx": 55 }, @@ -1772,9 +1672,9 @@ 0, 0, 9, - 4, - 4, - 4, + 0, + 0, + 0, 0, 0, 0, @@ -1834,7 +1734,7 @@ 0, 0, 9, - 7 + 0 ], "idx": 56 }, @@ -2198,7 +2098,7 @@ "render": "};", "hl": [ 9, - 7 + 0 ], "idx": 66 }, @@ -2216,9 +2116,9 @@ 0, 0, 9, - 4, - 4, - 4, + 0, + 0, + 0, 7, 0, 4, @@ -2230,7 +2130,7 @@ 0, 0, 9, - 7 + 0 ], "idx": 67 }