Skip to content

Commit 022b7e9

Browse files
committed
Added feature of template argument hints like "type<covariant T>"
1 parent 3c3301b commit 022b7e9

File tree

7 files changed

+198
-162
lines changed

7 files changed

+198
-162
lines changed

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
"phplrt/compiler": "^3.5",
2929
"phpunit/phpunit": "^10.5",
3030
"rector/rector": "^0.18",
31+
"symfony/var-dumper": "^5.6|^6.0|^7.0",
3132
"vimeo/psalm": "^5.18"
3233
},
3334
"autoload-dev": {

resources/grammar.php

Lines changed: 166 additions & 157 deletions
Large diffs are not rendered by default.

resources/grammar/common.pp2

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,14 @@ Identifier -> {
2020
return new Node\Identifier($children->getValue());
2121
}
2222
: <T_NAME>
23+
| <T_NAME_WITH_SPACE>
2324
| <T_EQ>
2425
| <T_BOOL_LITERAL>
2526
| <T_NULL_LITERAL>
2627
;
28+
29+
IdentifierWithExtraSpace -> {
30+
return new Node\Identifier($children->getValue());
31+
}
32+
: <T_NAME_WITH_SPACE>
33+
;

resources/grammar/lexemes.pp2

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
%token T_NEQ (?i)is\h+not(?![a-zA-Z0-9\-_\x80-\xff])
1919
%token T_EQ (?i)is(?![a-zA-Z0-9\-_\x80-\xff])
2020
%token T_VARIABLE \$[a-zA-Z_\x80-\xff][a-zA-Z0-9\-_\x80-\xff]*
21+
%token T_NAME_WITH_SPACE [a-zA-Z_\x80-\xff][a-zA-Z0-9\-_\x80-\xff]*\s+?
2122
%token T_NAME [a-zA-Z_\x80-\xff][a-zA-Z0-9\-_\x80-\xff]*
2223

2324
// Special Chars

resources/grammar/template-arguments.pp2

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,18 @@ TemplateArguments -> {
1111

1212
TemplateArgument -> {
1313
return new Node\Stmt\Template\ArgumentNode(
14-
\is_array($children) ? $children[0] : $children,
14+
\array_pop($children),
15+
$children[0] ?? null,
1516
);
1617
}
18+
: TemplateHintedArgument()
19+
| TemplateSimpleArgument()
20+
;
21+
22+
TemplateSimpleArgument
1723
: Type()
1824
;
25+
26+
TemplateHintedArgument
27+
: IdentifierWithExtraSpace() Type()
28+
;

src/Node/Identifier.php

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,20 @@ final class Identifier extends Node implements \Stringable
3535
'false',
3636
];
3737

38+
/**
39+
* @var non-empty-string
40+
*/
41+
public readonly string $value;
42+
3843
/**
3944
* @param non-empty-string $value
4045
*
4146
* @psalm-suppress RedundantCondition
4247
*/
43-
public function __construct(
44-
public readonly string $value,
45-
) {
48+
public function __construct(string $value)
49+
{
50+
$this->value = \trim($value);
51+
4652
assert($this->value !== '', new \InvalidArgumentException(
4753
'Identifier value cannot be empty',
4854
));

src/Node/Stmt/Template/ArgumentNode.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44

55
namespace TypeLang\Parser\Node\Stmt\Template;
66

7+
use TypeLang\Parser\Node\Identifier;
78
use TypeLang\Parser\Node\Node;
89
use TypeLang\Parser\Node\Stmt\TypeStatement;
910

1011
class ArgumentNode extends Node
1112
{
1213
public function __construct(
13-
public TypeStatement $value
14+
public TypeStatement $value,
15+
public ?Identifier $hint = null,
1416
) {}
1517

1618
public function toArray(): array

0 commit comments

Comments
 (0)