Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 /*
|
Chris@0
|
4 * This file is part of Psy Shell.
|
Chris@0
|
5 *
|
Chris@0
|
6 * (c) 2012-2017 Justin Hileman
|
Chris@0
|
7 *
|
Chris@0
|
8 * For the full copyright and license information, please view the LICENSE
|
Chris@0
|
9 * file that was distributed with this source code.
|
Chris@0
|
10 */
|
Chris@0
|
11
|
Chris@0
|
12 namespace Psy\CodeCleaner;
|
Chris@0
|
13
|
Chris@0
|
14 use PhpParser\Node;
|
Chris@0
|
15 use PhpParser\Node\Expr\Empty_;
|
Chris@0
|
16 use PhpParser\Node\Expr\Variable;
|
Chris@0
|
17 use Psy\Exception\ParseErrorException;
|
Chris@0
|
18
|
Chris@0
|
19 /**
|
Chris@0
|
20 * Validate that the user did not call the language construct `empty()` on a
|
Chris@0
|
21 * statement in PHP < 5.5.
|
Chris@0
|
22 */
|
Chris@0
|
23 class LegacyEmptyPass extends CodeCleanerPass
|
Chris@0
|
24 {
|
Chris@0
|
25 /**
|
Chris@0
|
26 * Validate use of empty in PHP < 5.5.
|
Chris@0
|
27 *
|
Chris@0
|
28 * @throws ParseErrorException if the user used empty with anything but a variable
|
Chris@0
|
29 *
|
Chris@0
|
30 * @param Node $node
|
Chris@0
|
31 */
|
Chris@0
|
32 public function enterNode(Node $node)
|
Chris@0
|
33 {
|
Chris@0
|
34 if (version_compare(PHP_VERSION, '5.5', '>=')) {
|
Chris@0
|
35 return;
|
Chris@0
|
36 }
|
Chris@0
|
37
|
Chris@0
|
38 if (!$node instanceof Empty_) {
|
Chris@0
|
39 return;
|
Chris@0
|
40 }
|
Chris@0
|
41
|
Chris@0
|
42 if (!$node->expr instanceof Variable) {
|
Chris@0
|
43 $msg = sprintf('syntax error, unexpected %s', $this->getUnexpectedThing($node->expr));
|
Chris@0
|
44
|
Chris@0
|
45 throw new ParseErrorException($msg, $node->expr->getLine());
|
Chris@0
|
46 }
|
Chris@0
|
47 }
|
Chris@0
|
48
|
Chris@0
|
49 private function getUnexpectedThing(Node $node)
|
Chris@0
|
50 {
|
Chris@0
|
51 switch ($node->getType()) {
|
Chris@0
|
52 case 'Scalar_String':
|
Chris@0
|
53 case 'Scalar_LNumber':
|
Chris@0
|
54 case 'Scalar_DNumber':
|
Chris@0
|
55 return json_encode($node->value);
|
Chris@0
|
56
|
Chris@0
|
57 case 'Expr_ConstFetch':
|
Chris@0
|
58 return (string) $node->name;
|
Chris@0
|
59
|
Chris@0
|
60 default:
|
Chris@0
|
61 return $node->getType();
|
Chris@0
|
62 }
|
Chris@0
|
63 }
|
Chris@0
|
64 }
|