Skip to content

Commit 51f2183

Browse files
committed
Add USE_* and MAGIC_* flag constants
This drops the effective dependency on tokenizer. Also replace token numbers with %d as these are unstable.
1 parent d89c303 commit 51f2183

File tree

5 files changed

+83
-31
lines changed

5 files changed

+83
-31
lines changed

README.md

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ ast\flags\BINARY_IS_GREATER // since version 20
245245
ast\flags\BINARY_IS_GREATER_OR_EQUAL // since version 20
246246
ast\flags\BINARY_SPACESHIP
247247
248-
// Used by ast\AST_ASSIGN_OP in version 10 (exclusive)
248+
// Used by ast\AST_ASSIGN_OP in versions before 20 (exclusive)
249249
ast\flags\ASSIGN_BITWISE_OR
250250
ast\flags\ASSIGN_BITWISE_AND
251251
ast\flags\ASSIGN_BITWISE_XOR
@@ -260,21 +260,19 @@ ast\flags\ASSIGN_SHIFT_LEFT
260260
ast\flags\ASSIGN_SHIFT_RIGHT
261261
262262
// Used by ast\AST_MAGIC_CONST (exclusive)
263-
// (Constants defined by ext\tokenizer)
264-
T_LINE
265-
T_FILE
266-
T_DIR
267-
T_TRAIT_C
268-
T_METHOD_C
269-
T_FUNC_C
270-
T_NS_C
271-
T_CLASS_C
263+
ast\flags\MAGIC_LINE
264+
ast\flags\MAGIC_FILE
265+
ast\flags\MAGIC_DIR
266+
ast\flags\MAGIC_NAMESPACE
267+
ast\flags\MAGIC_FUNCTION
268+
ast\flags\MAGIC_METHOD
269+
ast\flags\MAGIC_CLASS
270+
ast\flags\MAGIC_TRAIT
272271
273272
// Used by ast\AST_USE, ast\AST_GROUP_USE and ast\AST_USE_ELEM (exclusive)
274-
// (Constants defined by ext\tokenizer)
275-
T_CLASS
276-
T_FUNCTION
277-
T_CONST
273+
ast\flags\USE_NORMAL
274+
ast\flags\USE_FUNCTION
275+
ast\flags\USE_CONST
278276
279277
// Used by ast\AST_INCLUDE_OR_EVAL (exclusive)
280278
ast\flags\EXEC_EVAL

ast.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
#include "zend_language_scanner.h"
1212
#include "zend_language_scanner_defs.h"
13+
#include "zend_language_parser.h"
1314
#include "zend_exceptions.h"
1415
#include "zend_smart_str.h"
1516

@@ -616,6 +617,19 @@ PHP_MINIT_FUNCTION(ast) {
616617
ast_register_flag_constant("EXEC_REQUIRE", ZEND_REQUIRE);
617618
ast_register_flag_constant("EXEC_REQUIRE_ONCE", ZEND_REQUIRE_ONCE);
618619

620+
ast_register_flag_constant("USE_NORMAL", T_CLASS);
621+
ast_register_flag_constant("USE_FUNCTION", T_FUNCTION);
622+
ast_register_flag_constant("USE_CONST", T_CONST);
623+
624+
ast_register_flag_constant("MAGIC_LINE", T_LINE);
625+
ast_register_flag_constant("MAGIC_FILE", T_FILE);
626+
ast_register_flag_constant("MAGIC_DIR", T_DIR);
627+
ast_register_flag_constant("MAGIC_NAMESPACE", T_NS_C);
628+
ast_register_flag_constant("MAGIC_FUNCTION", T_FUNC_C);
629+
ast_register_flag_constant("MAGIC_METHOD", T_METHOD_C);
630+
ast_register_flag_constant("MAGIC_CLASS", T_CLASS_C);
631+
ast_register_flag_constant("MAGIC_TRAIT", T_TRAIT_C);
632+
619633
INIT_CLASS_ENTRY(tmp_ce, "ast\\Node", NULL);
620634
ast_node_ce = zend_register_internal_class(&tmp_ce);
621635

tests/magic_constants.phpt

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
--TEST--
2+
Magic constants
3+
--FILE--
4+
<?php
5+
6+
require __DIR__ . '/../util.php';
7+
8+
$code = <<<'PHP'
9+
<?php
10+
__LINE__;
11+
__FILE__;
12+
__DIR__;
13+
__NAMESPACE__;
14+
__FUNCTION__;
15+
__METHOD__;
16+
__CLASS__;
17+
__TRAIT__;
18+
PHP;
19+
20+
echo ast_dump(ast\parse_code($code, $version=15));
21+
22+
?>
23+
--EXPECTF--
24+
AST_STMT_LIST
25+
0: AST_MAGIC_CONST
26+
flags: MAGIC_LINE (%d)
27+
1: AST_MAGIC_CONST
28+
flags: MAGIC_FILE (%d)
29+
2: AST_MAGIC_CONST
30+
flags: MAGIC_DIR (%d)
31+
3: AST_MAGIC_CONST
32+
flags: MAGIC_NAMESPACE (%d)
33+
4: AST_MAGIC_CONST
34+
flags: MAGIC_FUNCTION (%d)
35+
5: AST_MAGIC_CONST
36+
flags: MAGIC_METHOD (%d)
37+
6: AST_MAGIC_CONST
38+
flags: MAGIC_CLASS (%d)
39+
7: AST_MAGIC_CONST
40+
flags: MAGIC_TRAIT (%d)

tests/use_declarations.phpt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,16 @@ PHP;
1616
echo ast_dump(ast\parse_code($code, $version=15));
1717

1818
?>
19-
--EXPECT--
19+
--EXPECTF--
2020
AST_STMT_LIST
2121
0: AST_USE
22-
flags: T_CLASS (361)
22+
flags: USE_NORMAL (%d)
2323
0: AST_USE_ELEM
2424
flags: 0
2525
0: "Foo\Bar"
2626
1: "Baz"
2727
1: AST_USE
28-
flags: T_FUNCTION (346)
28+
flags: USE_FUNCTION (%d)
2929
0: AST_USE_ELEM
3030
flags: 0
3131
0: "foo\bar"
@@ -36,15 +36,15 @@ AST_STMT_LIST
3636
1: AST_USE
3737
flags: 0
3838
0: AST_USE_ELEM
39-
flags: T_CLASS (361)
39+
flags: USE_NORMAL (%d)
4040
0: "Bar"
4141
1: null
4242
1: AST_USE_ELEM
43-
flags: T_FUNCTION (346)
43+
flags: USE_FUNCTION (%d)
4444
0: "bar"
4545
1: null
4646
3: AST_GROUP_USE
47-
flags: T_FUNCTION (346)
47+
flags: USE_FUNCTION (%d)
4848
0: "foo"
4949
1: AST_USE
5050
flags: 0

util.php

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ function get_flag_info() : array {
3030
flags\TYPE_CALLABLE => 'TYPE_CALLABLE',
3131
];
3232
$useTypes = [
33-
T_CLASS => 'T_CLASS',
34-
T_FUNCTION => 'T_FUNCTION',
35-
T_CONST => 'T_CONST',
33+
flags\USE_NORMAL => 'USE_NORMAL',
34+
flags\USE_FUNCTION => 'USE_FUNCTION',
35+
flags\USE_CONST => 'USE_CONST',
3636
];
3737
$sharedBinaryOps = [
3838
flags\BINARY_BITWISE_OR => 'BINARY_BITWISE_OR',
@@ -105,14 +105,14 @@ function get_flag_info() : array {
105105
flags\ASSIGN_SHIFT_RIGHT => 'ASSIGN_SHIFT_RIGHT',
106106
],
107107
ast\AST_MAGIC_CONST => [
108-
T_LINE => 'T_LINE',
109-
T_FILE => 'T_FILE',
110-
T_DIR => 'T_DIR',
111-
T_TRAIT_C => 'T_TRAIT_C',
112-
T_METHOD_C => 'T_METHOD_C',
113-
T_FUNC_C => 'T_FUNC_C',
114-
T_NS_C => 'T_NS_C',
115-
T_CLASS_C => 'T_CLASS_C',
108+
flags\MAGIC_LINE => 'MAGIC_LINE',
109+
flags\MAGIC_FILE => 'MAGIC_FILE',
110+
flags\MAGIC_DIR => 'MAGIC_DIR',
111+
flags\MAGIC_NAMESPACE => 'MAGIC_NAMESPACE',
112+
flags\MAGIC_FUNCTION => 'MAGIC_FUNCTION',
113+
flags\MAGIC_METHOD => 'MAGIC_METHOD',
114+
flags\MAGIC_CLASS => 'MAGIC_CLASS',
115+
flags\MAGIC_TRAIT => 'MAGIC_TRAIT',
116116
],
117117
ast\AST_USE => $useTypes,
118118
ast\AST_GROUP_USE => $useTypes,

0 commit comments

Comments
 (0)