Skip to content

Commit ad414fa

Browse files
authored
Merge pull request #229 from calebdw/feat-keywords
feat: add exit_statement and fix highlights
2 parents 2128072 + b359211 commit ad414fa

15 files changed

+191712
-192190
lines changed

common/define-grammar.js

+8-2
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ module.exports = function defineGrammar(dialect) {
169169
$.try_statement,
170170
$.declare_statement,
171171
$.echo_statement,
172+
$.exit_statement,
172173
$.unset_statement,
173174
$.const_declaration,
174175
$.function_definition,
@@ -563,7 +564,6 @@ module.exports = function defineGrammar(dialect) {
563564
'string',
564565
'void',
565566
'mixed',
566-
'static', // only legal as a return type
567567
'false',
568568
'null',
569569
'true',
@@ -594,6 +594,12 @@ module.exports = function defineGrammar(dialect) {
594594
keyword('echo'), $._expressions, $._semicolon,
595595
),
596596

597+
exit_statement: $ => seq(
598+
keyword('exit'),
599+
optional(seq('(', optional($._expression), ')')),
600+
$._semicolon,
601+
),
602+
597603
unset_statement: $ => seq(
598604
'unset', '(', commaSep1($._variable), ')', $._semicolon,
599605
),
@@ -1506,7 +1512,7 @@ module.exports = function defineGrammar(dialect) {
15061512
['*', PREC.TIMES],
15071513
['/', PREC.TIMES],
15081514
['%', PREC.TIMES],
1509-
// @ts-ignore
1515+
// @ts-ignore
15101516
].map(([op, p]) => prec.left(p, seq(
15111517
field('left', $._expression),
15121518
// @ts-ignore

common/test/corpus/expressions.txt

+23
Original file line numberDiff line numberDiff line change
@@ -1521,3 +1521,26 @@ $漢字;
15211521
(nowdoc_body
15221522
(nowdoc_string))
15231523
(heredoc_end))))
1524+
1525+
===============================================
1526+
Yield expressions
1527+
===============================================
1528+
1529+
<?php
1530+
1531+
yield;
1532+
yield $a;
1533+
yield from $a;
1534+
1535+
---
1536+
1537+
(program
1538+
(php_tag)
1539+
(expression_statement
1540+
(yield_expression))
1541+
(expression_statement
1542+
(yield_expression
1543+
(array_element_initializer
1544+
(variable_name (name)))))
1545+
(expression_statement
1546+
(yield_expression (variable_name (name)))))

common/test/corpus/statements.txt

+20
Original file line numberDiff line numberDiff line change
@@ -443,3 +443,23 @@ goto foo;
443443
(php_tag)
444444
(named_label_statement (name))
445445
(goto_statement (name)))
446+
447+
=========================================
448+
Exit statements
449+
=========================================
450+
451+
<?php
452+
453+
exit;
454+
exit();
455+
exit(1);
456+
exit('Goodbye');
457+
458+
---
459+
460+
(program
461+
(php_tag)
462+
(exit_statement)
463+
(exit_statement)
464+
(exit_statement (integer))
465+
(exit_statement (string (string_value))))

common/test/corpus/types.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ function a(string $var) : static {
340340
(variable_name (name))
341341
)
342342
)
343-
(primitive_type)
343+
(named_type (name))
344344
(compound_statement)
345345
)
346346
)

common/test/highlight/keywords.php

+79-68
Original file line numberDiff line numberDiff line change
@@ -1,133 +1,144 @@
11
<?php
2-
// <- tag
2+
// <- @tag
33

44
declare(strict_types=1);
5-
// <- keyword
5+
// <- @keyword
66

77
include "file.php";
8-
// <- keyword
8+
// <- @keyword
99
include_once "file.php";
10-
// <- keyword
11-
10+
// <- @keyword
1211
require "file.php";
13-
// <- keyword
12+
// <- @keyword
1413
require_once "file.php";
15-
// <- keyword
14+
// <- @keyword
1615

1716
namespace A\B;
18-
// <- keyword
17+
// <- @keyword
1918

20-
if ($a) {} elseif ($b) {} else {}
21-
// ^ keyword
22-
// ^ keyword
23-
if ($a and $b or $c xor $d) {}
24-
// ^ keyword
25-
// ^ keyword
26-
// ^ keyword
19+
if ($a and $b or $c xor $d) {} elseif ($b) {} else {}
20+
// <- @keyword
21+
// ^^^ @keyword
22+
// ^^ @keyword
23+
// ^^^ @keyword
24+
// ^^^^^^ @keyword
25+
// ^^^^ @keyword
2726

2827
for ($i = 0; $i < 1; $i++) { continue; }
29-
// <- keyword
30-
// ^ keyword
28+
// <- @keyword
29+
// ^^^^^^^^ @keyword
3130

3231
while ($b) {}
33-
// <- keyword
32+
// <- @keyword
3433

3534
WHILE ($b) {}
36-
// <- keyword
35+
// <- @keyword
3736

3837
do { } while ($c);
39-
// <- keyword
40-
// ^ keyword
38+
// <- @keyword
39+
// ^^^^^ @keyword
4140

4241
foreach ($foos as $foo) {}
43-
// <- keyword
44-
// ^ keyword
42+
// <- @keyword
43+
// ^^ @keyword
4544

4645
try {} catch (Exception $e) {} finally {}
47-
// <- keyword
48-
// ^ keyword
49-
// ^ keyword
46+
// <- @keyword
47+
// ^^^^^ @keyword
48+
// ^^^^^^^ @keyword
5049

5150
function a() {}
52-
// <- keyword
51+
// <- @keyword
5352

5453
abstract class A
55-
// <- keyword
56-
// ^ keyword
54+
// <- @keyword
55+
// ^^^^^ @keyword
5756
{
5857
private const BAR = 1;
59-
// <- keyword
60-
// ^ keyword
58+
//^^^^^^^ @keyword
59+
// ^^^^^ @keyword
6160
protected readonly static $a;
62-
// <- keyword
63-
// ^ keyword
64-
// ^ keyword
61+
//^^^^^^^^^ @keyword
62+
// ^^^^^^^^ @keyword
63+
// ^^^^^^ @keyword
6564
final public $b;
66-
// <- keyword
67-
public function foo(): static {}
68-
// <- keyword
69-
// ^ keyword
65+
//^^^^^ @keyword
66+
public static function foo(): static {}
67+
//^^^^^^ @keyword
68+
// ^^^^^^ @keyword
69+
// ^^^^^^^^ @keyword
7070
}
7171

7272
class B extends A implements T
73-
// ^ keyword
74-
// ^ keyword
73+
// ^^^^^^^ @keyword
74+
// ^^^^^^^^^^ @keyword
7575
{
7676
use T, U {
77-
// <- keyword
77+
//^^^ @keyword
7878
U::small insteadof T;
79-
// ^ keyword
79+
// ^^^^^^^^^ @keyword
8080
}
8181
public function foo(callable $call): self
8282
{
8383
$call instanceof Closure;
84-
// ^ keyword
84+
// ^^^^^^^^^^ @keyword
8585
fn ($a, $b) => $a + $b;
86-
// <- keyword
86+
// ^^ @keyword
8787
static $a;
88-
// <- keyword
88+
// ^^^^^^ @keyword
8989
global $a;
90-
// <- keyword
90+
// ^^^^^^ @keyword
9191
clone $call;
92-
// <- keyword
92+
// ^^^^^ @keyword
9393
match ($a) {
94-
// <- keyword
94+
// ^^^^^ @keyword
9595
default => "other",
96-
// <- keyword
96+
// ^^^^^^^ @keyword
9797
};
9898

9999
switch ($a) {
100-
// <- keyword
100+
// ^^^^^^ @keyword
101101
case 'value':
102-
// <- keyword
102+
// ^^^^ @keyword
103103
break;
104-
// <- keyword
104+
// ^^^^^ @keyword
105105
default:
106-
// <- keyword
106+
// ^^^^^^^ @keyword
107107
}
108-
109108
yield $a;
110-
// <- keyword
111-
109+
// ^^^^^ @keyword
110+
yield from $a;
111+
// ^^^^ @keyword
112112
return $a;
113-
// <- keyword
113+
// ^^^^^^ @keyword
114+
goto a;
115+
// ^^^^ @keyword
116+
echo "a";
117+
// ^^^^ @keyword
118+
print "a";
119+
// ^^^^^ @keyword
120+
print("a");
121+
// ^^^^^ @keyword
122+
exit;
123+
// ^^^^ @keyword
124+
exit();
125+
// ^^^^ @function.builtin
126+
exit(1);
127+
// ^^^^ @function.builtin
114128
}
115129
}
116130

117131
throw new Exception("oh");
118-
// <- keyword
119-
// ^ keyword
132+
// <- @keyword
133+
// ^^^ @keyword
120134

121135
interface T {}
122-
// <- keyword
136+
// <- @keyword
123137

124138
trait T { public function small(): void {} }
125-
// <- keyword
139+
// <- @keyword
126140
trait U { public function small(): void {} }
127-
// <- keyword
128-
129-
goto a;
130-
// <- keyword
131-
132-
echo "a";
133-
// <- keyword
141+
// <- @keyword
142+
enum Foo { case Bar; }
143+
//^^ @keyword
144+
// ^^^^ @keyword

common/test/highlight/literals.php

+7-7
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@
44
echo <<<OMG
55
something
66
OMG;
7-
// <- string
7+
// <- @string
88

99
echo true, TRUE, false, FALSE;
10-
// ^ constant.builtin
11-
// ^ constant.builtin
12-
// ^ constant.builtin
13-
// ^ constant.builtin
10+
// ^^^^ @constant.builtin
11+
// ^^^^ @constant.builtin
12+
// ^^^^^ @constant.builtin
13+
// ^^^^^ @constant.builtin
1414

1515
echo PI_314;
16-
// ^ constant
16+
// ^^^^^^ @constant
1717

1818
echo __DIR__;
19-
// ^ constant.builtin
19+
// ^^^^^^^ @constant.builtin

common/test/highlight/types.php

+12-18
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,21 @@
11
<?php
22

3+
function b(int $a, string $b, Person $e): Dog {}
4+
// ^^^ @type.builtin
5+
// ^^^^^^ @type.builtin
6+
// ^^^^^^ @type
7+
// ^^^ @type
38

4-
function b(
5-
int $a,
6-
// <- type.builtin
7-
8-
string $b,
9-
// <- type.builtin
10-
11-
Person $e
12-
// <- type
13-
): Dog {}
14-
// ^ type
15-
16-
function a(array $b, Something $c) {
17-
// ^ type.builtin
18-
// ^ type
9+
function a(array $b) {
10+
// ^^^^^ @type.builtin
1911
echo (int) $foo;
20-
// ^ type.builtin
12+
// ^^^ @type.builtin
2113
}
2214

2315
class A {
24-
public function foo(): self {}
25-
// ^ type
16+
public function foo(self $a): self {}
17+
// ^^^^ @type.builtin
18+
// ^^^^ @type.builtin
2619
private function baz(): static {}
20+
// ^^^^^^ @type.builtin
2721
}

common/test/highlight/variables.php

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
class A {
4+
public function foo(self $a): self {
5+
// ^ @variable
6+
new self();
7+
// ^^^^ @constructor
8+
new static();
9+
// ^^^^^^ @constructor
10+
new parent();
11+
// ^^^^^^ @constructor
12+
$this->foo();
13+
// ^^^^ @variable.builtin
14+
self::foo();
15+
// ^^^^ @variable.builtin
16+
static::foo();
17+
// ^^^^^^ @variable.builtin
18+
parent::foo();
19+
// ^^^^^^ @variable.builtin
20+
}
21+
}

0 commit comments

Comments
 (0)