|
90 | 90 | * `PHP_CodeSniffer\Tests\Core\Util\Tokens\TokenNameTest::dataPolyfilledPHPNativeTokens()` test method!} |
91 | 91 | */ |
92 | 92 |
|
93 | | -// Some PHP 5.5 tokens, replicated for lower versions. |
94 | | -if (defined('T_FINALLY') === false) { |
95 | | - define('T_FINALLY', 'PHPCS_T_FINALLY'); |
96 | | -} |
97 | | - |
98 | | -if (defined('T_YIELD') === false) { |
99 | | - define('T_YIELD', 'PHPCS_T_YIELD'); |
100 | | -} |
101 | | - |
102 | | -// Some PHP 5.6 tokens, replicated for lower versions. |
103 | | -if (defined('T_ELLIPSIS') === false) { |
104 | | - define('T_ELLIPSIS', 'PHPCS_T_ELLIPSIS'); |
105 | | -} |
106 | | - |
107 | | -if (defined('T_POW') === false) { |
108 | | - define('T_POW', 'PHPCS_T_POW'); |
109 | | -} |
110 | | - |
111 | | -if (defined('T_POW_EQUAL') === false) { |
112 | | - define('T_POW_EQUAL', 'PHPCS_T_POW_EQUAL'); |
113 | | -} |
114 | | - |
115 | | -// Some PHP 7 tokens, replicated for lower versions. |
116 | | -if (defined('T_SPACESHIP') === false) { |
117 | | - define('T_SPACESHIP', 'PHPCS_T_SPACESHIP'); |
118 | | -} |
119 | | - |
120 | | -if (defined('T_COALESCE') === false) { |
121 | | - define('T_COALESCE', 'PHPCS_T_COALESCE'); |
122 | | -} |
123 | | - |
124 | | -if (defined('T_COALESCE_EQUAL') === false) { |
125 | | - define('T_COALESCE_EQUAL', 'PHPCS_T_COALESCE_EQUAL'); |
126 | | -} |
127 | | - |
128 | | -if (defined('T_YIELD_FROM') === false) { |
129 | | - define('T_YIELD_FROM', 'PHPCS_T_YIELD_FROM'); |
130 | | -} |
131 | | - |
132 | | -// Some PHP 7.4 tokens, replicated for lower versions. |
133 | | -if (defined('T_BAD_CHARACTER') === false) { |
134 | | - define('T_BAD_CHARACTER', 'PHPCS_T_BAD_CHARACTER'); |
135 | | -} |
136 | | - |
137 | | -if (defined('T_FN') === false) { |
138 | | - define('T_FN', 'PHPCS_T_FN'); |
139 | | -} |
140 | | - |
141 | | -// Some PHP 8.0 tokens, replicated for lower versions. |
142 | | -if (defined('T_NULLSAFE_OBJECT_OPERATOR') === false) { |
143 | | - define('T_NULLSAFE_OBJECT_OPERATOR', 'PHPCS_T_NULLSAFE_OBJECT_OPERATOR'); |
144 | | -} |
145 | | - |
146 | | -if (defined('T_NAME_QUALIFIED') === false) { |
147 | | - define('T_NAME_QUALIFIED', 'PHPCS_T_NAME_QUALIFIED'); |
148 | | -} |
149 | | - |
150 | | -if (defined('T_NAME_FULLY_QUALIFIED') === false) { |
151 | | - define('T_NAME_FULLY_QUALIFIED', 'PHPCS_T_NAME_FULLY_QUALIFIED'); |
152 | | -} |
153 | | - |
154 | | -if (defined('T_NAME_RELATIVE') === false) { |
155 | | - define('T_NAME_RELATIVE', 'PHPCS_T_NAME_RELATIVE'); |
156 | | -} |
157 | | - |
158 | | -if (defined('T_MATCH') === false) { |
159 | | - define('T_MATCH', 'PHPCS_T_MATCH'); |
160 | | -} |
161 | | - |
162 | | -if (defined('T_ATTRIBUTE') === false) { |
163 | | - define('T_ATTRIBUTE', 'PHPCS_T_ATTRIBUTE'); |
164 | | -} |
165 | | - |
166 | | -// Some PHP 8.1 tokens, replicated for lower versions. |
167 | | -if (defined('T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG') === false) { |
168 | | - define('T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG', 'PHPCS_T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG'); |
169 | | -} |
170 | | - |
171 | | -if (defined('T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG') === false) { |
172 | | - define('T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG', 'PHPCS_T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG'); |
173 | | -} |
174 | | - |
175 | | -if (defined('T_READONLY') === false) { |
176 | | - define('T_READONLY', 'PHPCS_T_READONLY'); |
177 | | -} |
178 | | - |
179 | | -if (defined('T_ENUM') === false) { |
180 | | - define('T_ENUM', 'PHPCS_T_ENUM'); |
181 | | -} |
182 | | - |
183 | | -// Some PHP 8.4 tokens, replicated for lower versions. |
184 | | -if (defined('T_PUBLIC_SET') === false) { |
185 | | - define('T_PUBLIC_SET', 'PHPCS_T_PUBLIC_SET'); |
186 | | -} |
187 | | - |
188 | | -if (defined('T_PROTECTED_SET') === false) { |
189 | | - define('T_PROTECTED_SET', 'PHPCS_T_PROTECTED_SET'); |
190 | | -} |
191 | | - |
192 | | -if (defined('T_PRIVATE_SET') === false) { |
193 | | - define('T_PRIVATE_SET', 'PHPCS_T_PRIVATE_SET'); |
194 | | -} |
| 93 | +Tokens::registerPolyfills(); |
195 | 94 |
|
196 | 95 | // Tokens used for parsing doc blocks. |
197 | 96 | define('T_DOC_COMMENT_STAR', 'PHPCS_T_DOC_COMMENT_STAR'); |
|
210 | 109 |
|
211 | 110 | final class Tokens |
212 | 111 | { |
| 112 | + /** |
| 113 | + * Counter for assigning unique negative IDs to polyfilled tokens. |
| 114 | + * |
| 115 | + * @var int |
| 116 | + */ |
| 117 | + private static $nextPolyfillId = -1000; |
213 | 118 |
|
214 | 119 | /** |
215 | 120 | * The token weightings. |
@@ -832,4 +737,69 @@ public static function getHighestWeightedToken(array $tokens) |
832 | 737 | }//end getHighestWeightedToken() |
833 | 738 |
|
834 | 739 |
|
| 740 | + /** |
| 741 | + * Defines a token if it does not exist in the current PHP. |
| 742 | + * |
| 743 | + * @param string $name Constant name |
| 744 | + * |
| 745 | + * @return void |
| 746 | + */ |
| 747 | + private static function polyfill(string $name): void |
| 748 | + { |
| 749 | + if (defined($name) === false) { |
| 750 | + define($name, self::$nextPolyfillId--); |
| 751 | + } |
| 752 | + |
| 753 | + }//end polyfill() |
| 754 | + |
| 755 | + |
| 756 | + /** |
| 757 | + * Initialization of all emulated tokens. |
| 758 | + * |
| 759 | + * @return void |
| 760 | + */ |
| 761 | + public static function registerPolyfills(): void |
| 762 | + { |
| 763 | + // PHP 5.5. |
| 764 | + self::polyfill('T_FINALLY'); |
| 765 | + self::polyfill('T_YIELD'); |
| 766 | + |
| 767 | + // PHP 5.6. |
| 768 | + self::polyfill('T_ELLIPSIS'); |
| 769 | + self::polyfill('T_POW'); |
| 770 | + self::polyfill('T_POW_EQUAL'); |
| 771 | + |
| 772 | + // PHP 7. |
| 773 | + self::polyfill('T_SPACESHIP'); |
| 774 | + self::polyfill('T_COALESCE'); |
| 775 | + self::polyfill('T_COALESCE_EQUAL'); |
| 776 | + self::polyfill('T_YIELD_FROM'); |
| 777 | + |
| 778 | + // PHP 7.4. |
| 779 | + self::polyfill('T_BAD_CHARACTER'); |
| 780 | + self::polyfill('T_FN'); |
| 781 | + |
| 782 | + // PHP 8.0. |
| 783 | + self::polyfill('T_NULLSAFE_OBJECT_OPERATOR'); |
| 784 | + self::polyfill('T_NAME_QUALIFIED'); |
| 785 | + self::polyfill('T_NAME_FULLY_QUALIFIED'); |
| 786 | + self::polyfill('T_NAME_RELATIVE'); |
| 787 | + self::polyfill('T_MATCH'); |
| 788 | + self::polyfill('T_ATTRIBUTE'); |
| 789 | + |
| 790 | + // PHP 8.1. |
| 791 | + self::polyfill('T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG'); |
| 792 | + self::polyfill('T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG'); |
| 793 | + self::polyfill('T_READONLY'); |
| 794 | + self::polyfill('T_ENUM'); |
| 795 | + |
| 796 | + // PHP 8.4. |
| 797 | + self::polyfill('T_PROPERTY_C'); |
| 798 | + self::polyfill('T_PUBLIC_SET'); |
| 799 | + self::polyfill('T_PROTECTED_SET'); |
| 800 | + self::polyfill('T_PRIVATE_SET'); |
| 801 | + |
| 802 | + }//end registerPolyfills() |
| 803 | + |
| 804 | + |
835 | 805 | }//end class |
0 commit comments