Skip to content

Commit 884d65a

Browse files
committed
feat: add relative_name
1 parent d7d1578 commit 884d65a

File tree

5 files changed

+230
-23
lines changed

5 files changed

+230
-23
lines changed

common/define-grammar.js

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -216,20 +216,29 @@ module.exports = function defineGrammar(dialect) {
216216

217217
namespace_use_clause: $ => seq(
218218
field('type', optional($._namespace_use_type)),
219-
$._name,
219+
choice($.name, $.qualified_name),
220220
optional(seq(keyword('as'), field('alias', $.name))),
221221
),
222222

223223
_namespace_use_type: _ => choice(keyword('function'), keyword('const')),
224224

225225
qualified_name: $ => seq(
226-
field('prefix', seq(optional($.namespace_name), '\\')),
226+
field('prefix', seq(optional('\\'), optional($.namespace_name), '\\')),
227+
$.name,
228+
),
229+
230+
relative_name: $ => seq(
231+
field('prefix', seq(
232+
keyword('namespace'),
233+
optional(seq('\\', $.namespace_name)),
234+
'\\',
235+
)),
227236
$.name,
228237
),
229238

230-
_name: $ => choice($._identifier, $.qualified_name),
239+
_name: $ => choice($._identifier, $.qualified_name, $.relative_name),
231240

232-
namespace_name: $ => seq(optional('\\'), $.name, repeat(seq('\\', $.name))),
241+
namespace_name: $ => seq($.name, repeat(seq('\\', $.name))),
233242

234243
_namespace_use_group: $ => seq(
235244
field('type', optional($._namespace_use_type)),
@@ -538,7 +547,7 @@ module.exports = function defineGrammar(dialect) {
538547
$.primitive_type,
539548
),
540549

541-
named_type: $ => choice($.name, $.qualified_name),
550+
named_type: $ => choice($.name, $.qualified_name, $.relative_name),
542551

543552
optional_type: $ => seq(
544553
'?',
@@ -935,6 +944,7 @@ module.exports = function defineGrammar(dialect) {
935944
$.literal,
936945
$.class_constant_access_expression,
937946
$.qualified_name,
947+
$.relative_name,
938948
$.name,
939949
$.array_creation_expression,
940950
$.print_intrinsic,

queries/highlights.scm

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@
105105
alias: (name) @constant
106106
])
107107

108+
(relative_name "namespace" @module.builtin)
109+
108110
; Variables
109111

110112
(relative_scope) @variable.builtin
@@ -117,6 +119,7 @@
117119
(object_creation_expression [
118120
(name) @constructor
119121
(qualified_name (name) @constructor)
122+
(relative_name (name) @constructor)
120123
])
121124

122125
((name) @constant
@@ -132,10 +135,18 @@
132135
(named_type [
133136
(name) @type
134137
(qualified_name (name) @type)
138+
(relative_name (name) @type)
135139
]) @type
136140
(named_type (name) @type.builtin
137141
(#any-of? @type.builtin "static" "self"))
138142

143+
(scoped_call_expression
144+
scope: [
145+
(name) @type
146+
(qualified_name (name) @type)
147+
(relative_name (name) @type)
148+
])
149+
139150
; Functions
140151

141152
(array_creation_expression "array" @function.builtin)
@@ -146,7 +157,11 @@
146157
name: (name) @function.method)
147158

148159
(function_call_expression
149-
function: [(qualified_name (name)) (name)] @function)
160+
function: [
161+
(qualified_name (name))
162+
(relative_name (name))
163+
(name)
164+
] @function)
150165

151166
(scoped_call_expression
152167
name: (name) @function)

test/corpus/declarations.txt

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,62 @@ namespace Be \ ta {
281281
name: (name)
282282
body: (declaration_list)))))
283283

284+
==========================
285+
Relative namespace names
286+
==========================
287+
288+
<?php
289+
290+
namespace Foo\Bar\Baz;
291+
292+
function test() {
293+
$a = namespace\CONSTANT;
294+
$a = namespace\sub\CONSTANT;
295+
new namespace\Qux();
296+
new namespace\sub\Qux();
297+
}
298+
299+
---
300+
301+
(program
302+
(php_tag)
303+
(namespace_definition
304+
(namespace_name
305+
(name)
306+
(name)
307+
(name)))
308+
(function_definition
309+
(name)
310+
(formal_parameters)
311+
(compound_statement
312+
(expression_statement
313+
(assignment_expression
314+
(variable_name
315+
(name))
316+
(relative_name
317+
(name))))
318+
(expression_statement
319+
(assignment_expression
320+
(variable_name
321+
(name))
322+
(relative_name
323+
(namespace_name
324+
(name))
325+
(name))))
326+
(expression_statement
327+
(object_creation_expression
328+
(relative_name
329+
(name))
330+
(arguments)))
331+
(expression_statement
332+
(object_creation_expression
333+
(relative_name
334+
(namespace_name
335+
(name))
336+
(name))
337+
(arguments))))))
338+
339+
284340
==============================
285341
Class declarations
286342
==============================

test/highlight/keywords.php

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,39 +13,25 @@
1313
require_once "file.php";
1414
// <- @keyword
1515

16-
namespace A\B;
16+
namespace A;
1717
//^^^^^^^ @keyword
18-
// ^ @module
19-
// ^ @module
2018

2119
use Foo\Baz as Baaz;
2220
//^ @keyword
23-
// ^^^ @module
24-
// ^^^ @type
2521
// ^^ @keyword
26-
// ^^^^ @type
2722

2823
use function Foo\foo as fooo;
2924
// ^^^^^^^^ @keyword
30-
// ^^^ @function
31-
// ^^^^ @function
3225

3326
use const Foo\FOO as FOOO;
3427
// ^^^^^ @keyword
35-
// ^^^ @constant
36-
// ^^^^ @constant
3728

3829
use Foo\Baz\{
39-
// ^^^ @module
40-
// ^^^ @module
41-
Bar,
42-
//^^^ @type
43-
function foo,
30+
function foo as fooo,
4431
//^^^^^^^^ @keyword
45-
// ^^^ @function
32+
// ^^ @keyword
4633
const FOO,
4734
//^^^^^ @keyword
48-
// ^^^ @constant
4935
};
5036

5137
if ($a and $b or $c xor $d) {} elseif ($b) {} else {}

test/highlight/namespaces.php

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
<?php
2+
3+
namespace A\B;
4+
// ^ @module
5+
// ^ @module
6+
7+
use Baz as Baaz;
8+
// ^^^ @type
9+
// ^^^^ @type
10+
use Foo\Baz as Baaz;
11+
// ^^^ @module
12+
// ^^^ @type
13+
// ^^^^ @type
14+
15+
use Foo\{Bar, Baz as Baaz};
16+
// ^^^ @type
17+
// ^^^ @type
18+
// ^^^^ @type
19+
20+
use function foo as fooo;
21+
// ^^^ @function
22+
// ^^^^ @function
23+
//
24+
use function Foo\foo as fooo;
25+
// ^^^ @module
26+
// ^^^ @function
27+
// ^^^^ @function
28+
29+
// TODO
30+
use function Foo\{bar, foo as fooo};
31+
32+
use const FOO as FOOO;
33+
// ^^^ @constant
34+
// ^^^^ @constant
35+
use const Foo\FOO as FOOO;
36+
// ^^^ @module
37+
// ^^^ @constant
38+
// ^^^^ @constant
39+
40+
// TODO
41+
use const Foo\{FOO as FOOO, BAR};
42+
43+
use Foo\Baz\{
44+
// ^^^ @module
45+
// ^^^ @module
46+
Bar as Barr,
47+
//^^^ @type
48+
// ^^^^ @type
49+
Foo\Bar as Barr,
50+
//^^^ @module
51+
// ^^^ @type
52+
// ^^^^ @type
53+
function foo as fooo,
54+
// ^^^ @function
55+
// ^^^^ @function
56+
function Foo\foo as fooo,
57+
// ^^^ @module
58+
// ^^^ @function
59+
// ^^^^ @function
60+
const FOO as FOOO,
61+
// ^^^ @constant
62+
// ^^^^ @constant
63+
const Foo\FOO as FOOO,
64+
// ^^^ @module
65+
// ^^^ @constant
66+
// ^^^^ @constant
67+
};
68+
69+
class Foo {
70+
public function foo() {
71+
Bar::foo();
72+
// ^^^ @type
73+
\Bar::foo();
74+
// ^^^ @type
75+
Foo\Bar::foo();
76+
// ^^^ @module
77+
// ^^^ @type
78+
\Foo\Bar::foo();
79+
// ^^^ @module
80+
// ^^^ @type
81+
namespace\Bar::foo();
82+
// ^^^^^^^^^ @module.builtin
83+
// ^^^ @type
84+
namespace\Foo\Bar::foo();
85+
// ^^^^^^^^^ @module.builtin
86+
// ^^^ @module
87+
// ^^^ @type
88+
new Bar();
89+
// ^^^ @constructor
90+
new \Bar();
91+
// ^^^ @constructor
92+
new Foo\Bar();
93+
// ^^^ @module
94+
// ^^^ @constructor
95+
new \Foo\Bar();
96+
// ^^^ @module
97+
// ^^^ @constructor
98+
new namespace\Bar();
99+
// ^^^^^^^^^ @module.builtin
100+
// ^^^ @constructor
101+
new namespace\Foo\Bar();
102+
// ^^^^^^^^^ @module.builtin
103+
// ^^^ @module
104+
// ^^^ @constructor
105+
BAZ;
106+
// ^^^ @constant
107+
\BAZ;
108+
// ^^^ @constant
109+
Foo\BAZ;
110+
// ^^^ @module
111+
// ^^^ @constant
112+
\Foo\BAZ;
113+
// ^^^ @module
114+
// ^^^ @constant
115+
namespace\BAZ;
116+
// ^^^^^^^^^ @module.builtin
117+
// ^^^ @constant
118+
namespace\Foo\BAZ;
119+
// ^^^^^^^^^ @module.builtin
120+
// ^^^ @module
121+
// ^^^ @constant
122+
foo();
123+
// ^^^ @function
124+
\foo();
125+
// ^^^ @function
126+
Foo\foo();
127+
// ^^^ @module
128+
// ^^^ @function
129+
\Foo\foo();
130+
// ^^^ @module
131+
// ^^^ @function
132+
namespace\foo();
133+
// ^^^^^^^^^ @module.builtin
134+
// ^^^ @function
135+
namespace\Foo\foo();
136+
// ^^^^^^^^^ @module.builtin
137+
// ^^^ @module
138+
// ^^^ @function
139+
}
140+
}

0 commit comments

Comments
 (0)