Skip to content

Commit 32fcc22

Browse files
committed
TASK: Let ParserException carry only the affected range in source
...rather than the entire affected token.
1 parent 5df6f3d commit 32fcc22

4 files changed

Lines changed: 18 additions & 14 deletions

File tree

src/Language/Parser/ParserException.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,19 @@
2222

2323
namespace PackageFactory\ComponentEngine\Language\Parser;
2424

25-
use PackageFactory\ComponentEngine\Parser\Tokenizer\Token;
25+
use PackageFactory\ComponentEngine\Parser\Source\Range;
2626

2727
abstract class ParserException extends \Exception
2828
{
2929
protected function __construct(
3030
int $code,
3131
string $message,
32-
public readonly Token $affectedToken,
32+
public readonly Range $affectedRangeInSource,
3333
?\Exception $cause = null
3434
) {
3535
$message = sprintf(
3636
'[%s] %s',
37-
$affectedToken->boundaries->start->toDebugString(),
37+
$affectedRangeInSource->start->toDebugString(),
3838
$message
3939
);
4040

src/Language/Parser/TypeReference/TypeReferenceCouldNotBeParsed.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,21 +24,21 @@
2424

2525
use PackageFactory\ComponentEngine\Language\AST\Node\TypeReference\InvalidTypeReferenceNode;
2626
use PackageFactory\ComponentEngine\Language\Parser\ParserException;
27-
use PackageFactory\ComponentEngine\Parser\Tokenizer\Token;
27+
use PackageFactory\ComponentEngine\Parser\Source\Range;
2828

2929
final class TypeReferenceCouldNotBeParsed extends ParserException
3030
{
3131
public static function becauseOfInvalidTypeReferenceNode(
3232
InvalidTypeReferenceNode $cause,
33-
Token $affectedToken
33+
Range $affectedRangeInSource
3434
): self {
3535
return new self(
3636
code: 1690542466,
3737
message: sprintf(
3838
'TypeReferenceNode could not be parsed, because the result would be invalid: %s',
3939
$cause->getMessage()
4040
),
41-
affectedToken: $affectedToken,
41+
affectedRangeInSource: $affectedRangeInSource,
4242
cause: $cause
4343
);
4444
}

src/Language/Parser/TypeReference/TypeReferenceParser.php

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,16 @@ public function parse(\Iterator $tokens): TypeReferenceNode
5050
$closingArrayToken = $this->extractClosingArrayToken($tokens);
5151
$isArray = !is_null($closingArrayToken);
5252

53+
$rangeInSource = Range::from(
54+
$startingToken->boundaries->start,
55+
$closingArrayToken?->boundaries->end
56+
?? $typeNameNodes->getLast()->attributes->rangeInSource->end
57+
);
58+
5359
try {
5460
return new TypeReferenceNode(
5561
attributes: new NodeAttributes(
56-
rangeInSource: Range::from(
57-
$startingToken->boundaries->start,
58-
$closingArrayToken?->boundaries->end
59-
?? $typeNameNodes->getLast()->attributes->rangeInSource->end
60-
)
62+
rangeInSource: $rangeInSource
6163
),
6264
names: $typeNameNodes,
6365
isArray: $isArray,
@@ -66,7 +68,7 @@ public function parse(\Iterator $tokens): TypeReferenceNode
6668
} catch (InvalidTypeReferenceNode $e) {
6769
throw TypeReferenceCouldNotBeParsed::becauseOfInvalidTypeReferenceNode(
6870
cause: $e,
69-
affectedToken: $startingToken
71+
affectedRangeInSource: $rangeInSource
7072
);
7173
}
7274
}

test/Unit/Language/Parser/TypeReference/TypeReferenceParserTest.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,6 @@ public function throwsParserExceptionWhenInvalidTypeReferenceOccurs(): void
209209
{
210210
$typeReferenceParser = new TypeReferenceParser();
211211
$tokens = Tokenizer::fromSource(Source::fromString('?Foo[]'))->getIterator();
212-
$startingToken = $tokens->current();
213212

214213
$this->expectException(ParserException::class);
215214
$this->expectExceptionObject(
@@ -223,7 +222,10 @@ public function throwsParserExceptionWhenInvalidTypeReferenceOccurs(): void
223222
)
224223
),
225224
),
226-
affectedToken: $startingToken
225+
affectedRangeInSource: Range::from(
226+
new Position(0, 0),
227+
new Position(0, 4)
228+
)
227229
)
228230
);
229231

0 commit comments

Comments
 (0)