From 9a5656d9dad0abcb2d9cbe6d2c359274fe1f9b9f Mon Sep 17 00:00:00 2001
From: Klaus Purer <klaus.purer@gmail.com>
Date: Sat, 21 Nov 2015 18:33:58 +0100
Subject: [PATCH] Issue #2618020: Fixed class parenthesis fixer with namespace
 separators

---
 .../Classes/ClassCreateInstanceSniff.php      | 27 ++++++++++++++++---
 .../Classes/ClassCreateInstanceUnitTest.inc   |  8 ++++++
 .../ClassCreateInstanceUnitTest.inc.fixed     | 18 +++++++++++++
 .../Classes/ClassCreateInstanceUnitTest.php   |  7 +++++
 4 files changed, 57 insertions(+), 3 deletions(-)
 create mode 100644 coder_sniffer/Drupal/Test/Classes/ClassCreateInstanceUnitTest.inc.fixed

diff --git a/coder_sniffer/Drupal/Sniffs/Classes/ClassCreateInstanceSniff.php b/coder_sniffer/Drupal/Sniffs/Classes/ClassCreateInstanceSniff.php
index ebc9b865..70f6a17f 100644
--- a/coder_sniffer/Drupal/Sniffs/Classes/ClassCreateInstanceSniff.php
+++ b/coder_sniffer/Drupal/Sniffs/Classes/ClassCreateInstanceSniff.php
@@ -57,15 +57,36 @@ class Drupal_Sniffs_Classes_ClassCreateInstanceSniff implements PHP_CodeSniffer_
             $constructor = $phpcsFile->findNext(PHP_CodeSniffer_Tokens::$emptyTokens, ($stackPtr + 1), null, true, null, true);
             // We can only invoke the fixer if we know this is a static constructor
             // function call.
-            if ($tokens[$constructor]['code'] === T_STRING) {
+            if ($tokens[$constructor]['code'] === T_STRING || $tokens[$constructor]['code'] === T_NS_SEPARATOR) {
+                // Scan to the end of possible string\namespace parts.
+                $nextConstructorPart = $constructor;
+                while (true) {
+                    $nextConstructorPart = $phpcsFile->findNext(
+                        PHP_CodeSniffer_Tokens::$emptyTokens,
+                        ($nextConstructorPart + 1),
+                        null,
+                        true,
+                        null,
+                        true
+                    );
+                    if ($nextConstructorPart === false
+                        || ($tokens[$nextConstructorPart]['code'] !== T_STRING
+                        && $tokens[$nextConstructorPart]['code'] !== T_NS_SEPARATOR)
+                    ) {
+                        break;
+                    }
+
+                    $constructor = $nextConstructorPart;
+                }
+
                 $fix = $phpcsFile->addFixableError($error, $constructor, 'ParenthesisMissing');
                 if ($fix === true) {
                     $phpcsFile->fixer->addContent($constructor, '()');
                 }
             } else {
                 $phpcsFile->addError($error, $stackPtr, 'ParenthesisMissing');
-            }
-        }
+            }//end if
+        }//end if
 
     }//end process()
 
diff --git a/coder_sniffer/Drupal/Test/Classes/ClassCreateInstanceUnitTest.inc b/coder_sniffer/Drupal/Test/Classes/ClassCreateInstanceUnitTest.inc
index aa125f01..8cb98ff2 100644
--- a/coder_sniffer/Drupal/Test/Classes/ClassCreateInstanceUnitTest.inc
+++ b/coder_sniffer/Drupal/Test/Classes/ClassCreateInstanceUnitTest.inc
@@ -4,3 +4,11 @@ $x = array(new Foo, array());
 $y = new Foo;
 $z = new $class;
 $bar = new $foo[$x + 1];
+
+$obj1 = new DateTime;
+$obj1 = new \DateTime;
+$obj2 = $obj1->add(new \DateTime);
+$obj2 = $obj1->add(new Vendor);
+$obj2 = $obj1->add(new Vendor\DateTools);
+$obj2 = $obj1->add(new Vendor\DateTools\DateInterval);
+$obj2 = $obj1->add(new \Vendor\DateTools\DateInterval);
diff --git a/coder_sniffer/Drupal/Test/Classes/ClassCreateInstanceUnitTest.inc.fixed b/coder_sniffer/Drupal/Test/Classes/ClassCreateInstanceUnitTest.inc.fixed
new file mode 100644
index 00000000..acc50796
--- /dev/null
+++ b/coder_sniffer/Drupal/Test/Classes/ClassCreateInstanceUnitTest.inc.fixed
@@ -0,0 +1,18 @@
+<?php
+
+/**
+ * @file
+ */
+
+$x = array(new Foo(), array());
+$y = new Foo();
+$z = new $class;
+$bar = new $foo[$x + 1];
+
+$obj1 = new DateTime();
+$obj1 = new \DateTime();
+$obj2 = $obj1->add(new \DateTime());
+$obj2 = $obj1->add(new Vendor());
+$obj2 = $obj1->add(new Vendor\DateTools());
+$obj2 = $obj1->add(new Vendor\DateTools\DateInterval());
+$obj2 = $obj1->add(new \Vendor\DateTools\DateInterval());
diff --git a/coder_sniffer/Drupal/Test/Classes/ClassCreateInstanceUnitTest.php b/coder_sniffer/Drupal/Test/Classes/ClassCreateInstanceUnitTest.php
index c9aebcad..3f734ec1 100644
--- a/coder_sniffer/Drupal/Test/Classes/ClassCreateInstanceUnitTest.php
+++ b/coder_sniffer/Drupal/Test/Classes/ClassCreateInstanceUnitTest.php
@@ -19,6 +19,13 @@ class Drupal_Sniffs_Classes_ClassCreateInstanceUnitTest extends CoderSniffUnitTe
                 4 => 1,
                 5 => 1,
                 6 => 1,
+                8 => 1,
+                9 => 1,
+                10 => 1,
+                11 => 1,
+                12 => 1,
+                13 => 1,
+                14 => 1,
                );
 
     }//end getErrorList()
-- 
GitLab