diff --git a/packages/view/src/Parser/TempestViewLexer.php b/packages/view/src/Parser/TempestViewLexer.php index 83ee0ff78..238cfe0b8 100644 --- a/packages/view/src/Parser/TempestViewLexer.php +++ b/packages/view/src/Parser/TempestViewLexer.php @@ -88,12 +88,18 @@ private function consume(int $length = 1): string if ($length === 1) { $char = $this->html[$this->position++] ?? null; + + if ($char === "\n") { + $this->line++; + } + $this->current = $this->html[$this->position] ?? null; return $char ?? ''; } $buffer = substr($this->html, $this->position, $length); $this->position += $length; + $this->line += substr_count($buffer, "\n"); $this->current = $this->html[$this->position] ?? null; return $buffer; diff --git a/packages/view/tests/TempestViewLexerTest.php b/packages/view/tests/TempestViewLexerTest.php index cd1c555cd..7e7d19401 100644 --- a/packages/view/tests/TempestViewLexerTest.php +++ b/packages/view/tests/TempestViewLexerTest.php @@ -393,6 +393,31 @@ public function test_single_quote_attributes(): void ); } + public function test_source_mapping_line_count(): void + { + $tokens = iterator_to_array( + new TempestViewLexer("
\n\n
")->lex(), + ); + + $this->assertSame(1, $tokens[0]->line); + $this->assertSame(1, $tokens[1]->line); + $this->assertSame(1, $tokens[2]->line); + $this->assertSame(2, $tokens[3]->line); + $this->assertSame(2, $tokens[4]->line); + $this->assertSame(2, $tokens[5]->line); + $this->assertSame(2, $tokens[6]->line); + $this->assertSame(3, $tokens[7]->line); + } + + public function test_source_mapping_line_count_with_indentation(): void + { + $tokens = iterator_to_array( + new TempestViewLexer("
\n \n
")->lex(), + ); + + $this->assertSame(2, $tokens[3]->line); + } + private function assertTokens(array $expected, TokenCollection $actual): void { $this->assertCount(count($expected), $actual);