Skip to content
This repository was archived by the owner on Jul 12, 2020. It is now read-only.

php7 support #73

Open
wants to merge 29 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
1c0b15c
Add support for renaming local variables inside functions
K-Phoen May 14, 2016
2aaabe1
Add a test for the local variable renaming inside functions
K-Phoen May 14, 2016
746d697
Fix undeclared variable usage
K-Phoen May 14, 2016
9306801
Allow to rename function and method arguments
K-Phoen May 14, 2016
b595ed0
Update vendors
K-Phoen May 14, 2016
867b96e
Use nikic/PHP-Parser ~2.0
K-Phoen May 14, 2016
3f4e7a8
Fix case in method call
K-Phoen May 14, 2016
ffb4867
Prefer single quotes when possible
K-Phoen May 14, 2016
d318e46
Remove useless semicolons
K-Phoen May 14, 2016
1a1f91e
Use short syntax for bits operation
K-Phoen May 14, 2016
ceee74a
Use assertCount in tests when possible
K-Phoen May 14, 2016
d89aef8
Update tests
K-Phoen May 14, 2016
33d81cf
Remove unused variables
K-Phoen May 14, 2016
8d94437
Remove unused imports
K-Phoen May 14, 2016
522a953
Remove unused attribute
K-Phoen May 14, 2016
c41c0b1
Fix undeclared variable usage
K-Phoen May 14, 2016
67cab17
Update travis-ci config
K-Phoen May 14, 2016
7e07066
PHP 7.0 should not be allowed to fail
K-Phoen May 14, 2016
eca98ae
Also test against HHVM
K-Phoen May 14, 2016
5696332
Disallow failures for HHVM
K-Phoen May 14, 2016
acc316f
Add rename property command
K-Phoen May 15, 2016
ae172a7
Add a few behat tests
K-Phoen May 15, 2016
286a0f1
Talk about the "Rename Class Property" refactor
K-Phoen May 16, 2016
e750c69
Switch to POPSuL fork of php-token-reflection
AJenbo Jun 4, 2017
8d49db4
Don't throw a fit when file doesn't contain a class
AJenbo Jun 4, 2017
ff01104
Switch to my branch of PHP-Token-Reflection
AJenbo Jun 4, 2017
bdc51b3
Hanvle nested array keys
AJenbo Jul 2, 2017
8c86834
Update README.md
AJenbo Jul 4, 2017
774b51e
Require php 5.5
AJenbo Jul 4, 2017
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Use nikic/PHP-Parser ~2.0
  • Loading branch information
K-Phoen committed May 14, 2016
commit 867b96e67317914fc06fe49704f814d10a3aee1c
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
],

"require": {
"nikic/php-parser": "~1.2",
"nikic/php-parser": "~2.1",
"beberlei/assert": "~2.3",
"andrewsville/php-token-reflection": "~1.4",
"symfony/finder": "~2.4",
Expand Down
30 changes: 18 additions & 12 deletions composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -2,30 +2,26 @@

namespace QafooLabs\Refactoring\Adapters\PHPParser;

use PhpParser\NodeTraverser;
use PhpParser\ParserFactory;
use QafooLabs\Refactoring\Adapters\PHPParser\Visitor\PhpNameCollector;
use QafooLabs\Refactoring\Domain\Services\PhpNameScanner;
use QafooLabs\Refactoring\Domain\Model\File;
use QafooLabs\Refactoring\Domain\Model\LineRange;
use QafooLabs\Refactoring\Domain\Model\UseStatement;
use QafooLabs\Refactoring\Domain\Model\PhpName;
use QafooLabs\Refactoring\Domain\Model\PhpNameOccurance;

use PHPParser_Parser;
use PHPParser_Lexer;
use PHPParser_NodeTraverser;
use PHPParser_Error;

class ParserPhpNameScanner implements PhpNameScanner
{
public function findNames(File $file)
{
$parser = new PHPParser_Parser(new PHPParser_Lexer());
$parserFactory = new ParserFactory();
$parser = $parserFactory->create(ParserFactory::PREFER_PHP7);
$collector = new PhpNameCollector();
$traverser = new PHPParser_NodeTraverser;
$traverser = new NodeTraverser();

try {
$stmts = $parser->parse($file->getCode());
} catch (PHPParser_Error $e) {
} catch (\PHPParser\Error $e) {
throw new \RuntimeException("Error parsing " . $file->getRelativePath() .": " . $e->getMessage(), 0, $e);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@

namespace QafooLabs\Refactoring\Adapters\PHPParser;

use PhpParser\NodeTraverser;
use PhpParser\ParserFactory;
use QafooLabs\Refactoring\Domain\Model\LineRange;
use QafooLabs\Refactoring\Domain\Model\File;
use QafooLabs\Refactoring\Domain\Model\DefinedVariables;
Expand All @@ -23,23 +25,17 @@
use QafooLabs\Refactoring\Adapters\PHPParser\Visitor\LocalVariableClassifier;
use QafooLabs\Refactoring\Adapters\PHPParser\Visitor\NodeConnector;

use PHPParser_Parser;
use PHPParser_Lexer;
use PHPParser_Node;
use PHPParser_Node_Stmt;
use PHPParser_Node_Expr_FuncCall;
use PHPParser_NodeTraverser;

class ParserVariableScanner implements VariableScanner
{
public function scanForVariables(File $file, LineRange $range)
{
$parser = new PHPParser_Parser(new PHPParser_Lexer());
$parserFactory = new ParserFactory();
$parser = $parserFactory->create(ParserFactory::PREFER_PHP7);
$stmts = $parser->parse($file->getCode());

$collector = new LineRangeStatementCollector($range);

$traverser = new PHPParser_NodeTraverser;
$traverser = new NodeTraverser();
$traverser->addVisitor(new NodeConnector);
$traverser->addVisitor($collector);

Expand All @@ -52,7 +48,7 @@ public function scanForVariables(File $file, LineRange $range)
}

$localVariableClassifier = new LocalVariableClassifier();
$traverser = new PHPParser_NodeTraverser;
$traverser = new NodeTraverser();
$traverser->addVisitor($localVariableClassifier);
$traverser->traverse($selectedStatements);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,14 @@

namespace QafooLabs\Refactoring\Adapters\PHPParser\Visitor;

use PhpParser\Node;
use PhpParser\NodeVisitorAbstract;
use QafooLabs\Refactoring\Domain\Model\LineRange;
use PHPParser_Node;
use PHPParser_Node_Stmt;
use PHPParser_Node_Expr_FuncCall;

/**
* Given a line range, collect the AST slice that is inside that range.
*/
class LineRangeStatementCollector extends \PHPParser_NodeVisitorAbstract
class LineRangeStatementCollector extends NodeVisitorAbstract
{
/**
* @var LineRange
Expand All @@ -36,7 +35,7 @@ public function __construct(LineRange $lineRange)
$this->statements = new \SplObjectStorage();
}

public function enterNode(PHPParser_Node $node)
public function enterNode(Node $node)
{
if ( ! $this->lineRange->isInRange($node->getLine())) {
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,15 @@

namespace QafooLabs\Refactoring\Adapters\PHPParser\Visitor;

use PHPParser_Node;
use PHPParser_NodeVisitorAbstract;
use PHPParser_Node_Expr_Variable;
use PHPParser_Node_Expr_Assign;
use PHPParser_Node_Expr_ArrayDimFetch;
use PHPParser_Node_Param;
use PhpParser\Node;
use PhpParser\NodeVisitorAbstract;
use SplObjectStorage;

/**
* Classify local variables into assignments and usages,
* permanent and temporary variables.
*/
class LocalVariableClassifier extends PHPParser_NodeVisitorAbstract
class LocalVariableClassifier extends NodeVisitorAbstract
{
private $localVariables = array();
private $assignments = array();
Expand All @@ -37,40 +33,40 @@ public function __construct()
$this->seenAssignmentVariables = new SplObjectStorage();
}

public function enterNode(PHPParser_Node $node)
public function enterNode(Node $node)
{
if ($node instanceof PHPParser_Node_Expr_Variable) {
if ($node instanceof Node\Expr\Variable) {
$this->enterVariableNode($node);
}

if ($node instanceof PHPParser_Node_Expr_Assign) {
if ($node instanceof Node\Expr\Assign) {
$this->enterAssignment($node);
}

if ($node instanceof PHPParser_Node_Param) {
if ($node instanceof Node\Param) {
$this->enterParam($node);
}
}

private function enterParam($node)
private function enterParam(Node\Param $node)
{
$this->assignments[$node->name][] = $node->getLine();
}

private function enterAssignment($node)
private function enterAssignment(Node\Expr\Assign $node)
{
if ($node->var instanceof PHPParser_Node_Expr_Variable) {
if ($node->var instanceof Node\Expr\Variable) {
$this->assignments[$node->var->name][] = $node->getLine();
$this->seenAssignmentVariables->attach($node->var);
} else if ($node->var instanceof PHPParser_Node_Expr_ArrayDimFetch) {
} else if ($node instanceof Node\Expr\ArrayDimFetch) {
// $foo[] = "baz" is both a read and a write access to $foo
$this->localVariables[$node->var->var->name][] = $node->getLine();
$this->assignments[$node->var->var->name][] = $node->getLine();
$this->seenAssignmentVariables->attach($node->var->var);
}
}

private function enterVariableNode($node)
private function enterVariableNode(Node\Expr\Variable $node)
{
if ($node->name === "this" || $this->seenAssignmentVariables->contains($node)) {
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,21 +13,21 @@

namespace QafooLabs\Refactoring\Adapters\PHPParser\Visitor;

use PHPParser_NodeVisitorAbstract;
use PHPParser_Node;
use PhpParser\Node;
use PhpParser\NodeVisitorAbstract;

/**
* Connects the nodes.
*
* @author Johannes M. Schmitt <[email protected]>
*/
class NodeConnector extends PHPParser_NodeVisitorAbstract
class NodeConnector extends NodeVisitorAbstract
{
public function enterNode(PHPParser_Node $node)
public function enterNode(Node $node)
{
$subNodes = array();
foreach ($node as $subNode) {
if ($subNode instanceof PHPParser_Node) {
if ($subNode instanceof Node) {
$subNodes[] = $subNode;
continue;
} else if (!is_array($subNode)) {
Expand All @@ -38,7 +38,7 @@ public function enterNode(PHPParser_Node $node)
}

for ($i=0,$c=count($subNodes); $i<$c; $i++) {
if (!$subNodes[$i] instanceof PHPParser_Node) {
if (!$subNodes[$i] instanceof Node) {
continue;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,19 +13,13 @@

namespace QafooLabs\Refactoring\Adapters\PHPParser\Visitor;

use PHPParser_Node;
use PHPParser_Node_Name;
use PHPParser_Node_Stmt_Namespace;
use PHPParser_Node_Stmt_Use;
use PHPParser_Node_Stmt_Class;
use PHPParser_Node_Stmt_UseUse;
use PHPParser_Node_Expr_New;
use PHPParser_Node_Expr_StaticCall;
use PhpParser\Node;
use PhpParser\NodeVisitorAbstract;

/**
* Visitor for PHP Parser collecting PHP Names from an AST.
*/
class PhpNameCollector extends \PHPParser_NodeVisitorAbstract
class PhpNameCollector extends NodeVisitorAbstract
{
/**
* @var array
Expand All @@ -40,11 +34,11 @@ class PhpNameCollector extends \PHPParser_NodeVisitorAbstract
*/
private $currentNamespace;

public function enterNode(PHPParser_Node $node)
public function enterNode(Node $node)
{
if ($node instanceof PHPParser_Node_Stmt_Use) {
if ($node instanceof Node\Stmt\Use_) {
foreach ($node->uses as $use) {
if ($use instanceof PHPParser_Node_Stmt_UseUse) {
if ($use instanceof Node\Stmt\UseUse) {
$name = implode('\\', $use->name->parts);

$this->useStatements[$use->alias] = $name;
Expand All @@ -59,7 +53,7 @@ public function enterNode(PHPParser_Node $node)
}


if ($node instanceof PHPParser_Node_Expr_New && $node->class instanceof PHPParser_Node_Name) {
if ($node instanceof Node\Expr\New_ && $node->class instanceof Node\Name) {
$usedAlias = implode('\\', $node->class->parts);

$this->nameDeclarations[] = array(
Expand All @@ -70,7 +64,7 @@ public function enterNode(PHPParser_Node $node)
);
}

if ($node instanceof PHPParser_Node_Expr_StaticCall && $node->class instanceof PHPParser_Node_Name) {
if ($node instanceof Node\Expr\StaticCall && $node->class instanceof Node\Name) {
$usedAlias = implode('\\', $node->class->parts);

$this->nameDeclarations[] = array(
Expand All @@ -81,7 +75,7 @@ public function enterNode(PHPParser_Node $node)
);
}

if ($node instanceof PHPParser_Node_Stmt_Class) {
if ($node instanceof Node\Stmt\Class_) {
$className = $node->name;

$this->nameDeclarations[] = array(
Expand Down Expand Up @@ -114,7 +108,7 @@ public function enterNode(PHPParser_Node $node)
}
}

if ($node instanceof PHPParser_Node_Stmt_Namespace) {
if ($node instanceof Node\Stmt\Namespace_) {
$this->currentNamespace = implode('\\', $node->name->parts);
$this->useStatements = array();

Expand Down