Skip to content

Commit 0b3dbb2

Browse files
committed
TypeParser: add support for $this type
1 parent 85464aa commit 0b3dbb2

File tree

4 files changed

+26
-3
lines changed

4 files changed

+26
-3
lines changed

doc/grammars/type.ebnf

+5-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ Nullable
1313

1414
Atomic
1515
::= Identifier (Generic | Array)?
16+
| ThisType
1617
| '(' Type ')' Array?
1718

1819
Generic
@@ -21,8 +22,11 @@ Generic
2122
Array
2223
::= ('[' ']')+
2324

25+
ThisType
26+
::= '$this'
27+
2428
Identifier
25-
::= ('\'? Word)+
29+
::= ('\\'? Word)+
2630

2731
Word
2832
::= [a-zA-Z_#x7F-#x10FFFF][0-9a-zA-Z_#x7F-#x10FFFF]*

doc/grammars/type.peg

+6-2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ Nullable
1313

1414
Atomic
1515
= Identifier (Generic / Array)?
16+
/ ThisType
1617
/ '(' Type ')' Array?
1718

1819
Generic
@@ -21,8 +22,11 @@ Generic
2122
Array
2223
= ('[' ']')+
2324

25+
ThisType
26+
= '$this'
27+
2428
Identifier
25-
= ('\'? Word)+
29+
= ('\\'? Word)+
2630

2731
Word
28-
= [a-zA-Z_\127-\255\\][a-zA-Z0-9_\127-\255\\]*
32+
= [a-zA-Z_\\127-\\255][a-zA-Z0-9_\\127-\\255]*

src/Ast/Type/ThisTypeNode.php

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace PHPStan\PhpDocParser\Ast\Type;
4+
5+
6+
class ThisTypeNode implements TypeNode
7+
{
8+
public function __toString(): string
9+
{
10+
return '$this';
11+
}
12+
}

src/Parser/TypeParser.php

+3
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ private function parseAtomic(TokenIterator $tokens): Ast\Type\TypeNode
3838
$type = $this->parseArray($tokens, $type);
3939
}
4040

41+
} elseif ($tokens->tryConsumeTokenType(Lexer::TOKEN_THIS_VARIABLE)) {
42+
return new Ast\Type\ThisTypeNode();
43+
4144
} else {
4245
$type = new Ast\Type\IdentifierTypeNode($tokens->currentTokenValue());
4346
$tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER);

0 commit comments

Comments
 (0)