From d4e351fc15d13d5e17099de476f7078c732e5d41 Mon Sep 17 00:00:00 2001 From: Vyacheslav Gulyam Date: Thu, 6 Apr 2017 16:19:00 +0300 Subject: [PATCH] fix use extends and implements --- src/Naneau/Obfuscator/Node/Visitor/ScrambleUse.php | 9 ++++++++- tests/before/Namespaces.php | 7 +++++++ tests/expected/Namespaces.php | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/Naneau/Obfuscator/Node/Visitor/ScrambleUse.php b/src/Naneau/Obfuscator/Node/Visitor/ScrambleUse.php index 26ae484..0481ef4 100644 --- a/src/Naneau/Obfuscator/Node/Visitor/ScrambleUse.php +++ b/src/Naneau/Obfuscator/Node/Visitor/ScrambleUse.php @@ -88,13 +88,16 @@ public function enterNode(Node $node) $extends = $node->extends->toString(); if ($this->isRenamed($extends)) { $node->extends = new Name($this->getNewName($extends)); + } elseif ($this->isRenamed($node->extends->getFirst())) { + reset($node->extends->parts); + $node->extends->parts[key($node->extends->parts)] = $this->getNewName($node->extends->getFirst()); } } // Classes that implement an interface if ($node->implements !== null && count($node->implements) > 0) { - $implements = array(); + $implements = []; foreach($node->implements as $implementsName) { @@ -104,6 +107,10 @@ public function enterNode(Node $node) if ($this->isRenamed($oldName)) { // If renamed, set new one $implements[] = new Name($this->getNewName($oldName)); + } elseif ($this->isRenamed($implementsName->getFirst())) { + reset($implementsName->parts); + $implementsName->parts[key($node->extends->parts)] = $this->getNewName($implementsName->getFirst()); + $implements[] = $implementsName; } else { // If not renamed, pass old one $implements[] = $implementsName; diff --git a/tests/before/Namespaces.php b/tests/before/Namespaces.php index 689b67c..8e025f3 100644 --- a/tests/before/Namespaces.php +++ b/tests/before/Namespaces.php @@ -12,6 +12,10 @@ class classD { } +interface interfaceA { + +} + namespace namespaceB; use namespaceA\classA as classC; @@ -29,3 +33,6 @@ public function __construct() { } } +class classE extends namespaceDAlias\classD implements namespaceDAlias\interfaceA { + +} \ No newline at end of file diff --git a/tests/expected/Namespaces.php b/tests/expected/Namespaces.php index c24b9b9..91552d8 100644 --- a/tests/expected/Namespaces.php +++ b/tests/expected/Namespaces.php @@ -1,2 +1,2 @@ spa26210 = new spf0f507(); $this->sp2e1034 = new sp63627e\classD(); } } \ No newline at end of file +namespace namespaceA; class classA { } namespace namespaceC\namespaceD; class classD { } interface interfaceA { } namespace namespaceB; use namespaceA\classA as spf0f507; use namespaceC\namespaceD as sp63627e; class classB { private $spa26210; private $sp2e1034; public function __construct() { $this->spa26210 = new spf0f507(); $this->sp2e1034 = new sp63627e\classD(); } } class classE extends sp63627e\classD implements sp63627e\interfaceA { } \ No newline at end of file