diff --git a/package.xml b/package.xml
index 4d78dc26e7..86897f6cb9 100644
--- a/package.xml
+++ b/package.xml
@@ -111,9 +111,11 @@ http://pear.php.net/dtd/package-2.0.xsd">
-- Allows the required spacing to be set using the spacing sniff property (default is 0)
-- Allows newlines to be used by setting the ignoreNewlines sniff property (default is false)
-- Thanks to Juliette Reinders Folmer for the contribution
- - Added New PSR12.Keywords.ShortFormTypeKeywords sniff
+ - Added new PSR12.Classes.ClassInstantiation sniff
+ -- Ensures parenthesis are used when instantiating a new class
+ - Added new PSR12.Keywords.ShortFormTypeKeywords sniff
-- Ensures the short form of PHP types is used when type casting
- - Added New PSR12.Namespaces.CompundNamespaceDepth sniff
+ - Added new PSR12.Namespaces.CompundNamespaceDepth sniff
-- Ensures compund namespace use statements have a max depth of 2 levels
-- The max depth can be changed by setting the 'maxDepth' sniff property in a ruleset.xml file
- Improved core support for grouped property declarations
@@ -1041,6 +1043,47 @@ http://pear.php.net/dtd/package-2.0.xsd">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Standards/PSR12/Docs/Classes/ClassInstantiationStandard.xml b/src/Standards/PSR12/Docs/Classes/ClassInstantiationStandard.xml
new file mode 100644
index 0000000000..ae24611d0b
--- /dev/null
+++ b/src/Standards/PSR12/Docs/Classes/ClassInstantiationStandard.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Standards/PSR12/Sniffs/Classes/ClassInstantiationSniff.php b/src/Standards/PSR12/Sniffs/Classes/ClassInstantiationSniff.php
new file mode 100644
index 0000000000..bbf6124e9a
--- /dev/null
+++ b/src/Standards/PSR12/Sniffs/Classes/ClassInstantiationSniff.php
@@ -0,0 +1,82 @@
+
+ * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600)
+ * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
+ */
+
+namespace PHP_CodeSniffer\Standards\PSR12\Sniffs\Classes;
+
+use PHP_CodeSniffer\Sniffs\Sniff;
+use PHP_CodeSniffer\Files\File;
+use PHP_CodeSniffer\Util\Tokens;
+
+class ClassInstantiationSniff implements Sniff
+{
+
+
+ /**
+ * Returns an array of tokens this test wants to listen for.
+ *
+ * @return array
+ */
+ public function register()
+ {
+ return [T_NEW];
+
+ }//end register()
+
+
+ /**
+ * Processes this test, when one of its tokens is encountered.
+ *
+ * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned.
+ * @param int $stackPtr The position of the current token in the
+ * stack passed in $tokens.
+ *
+ * @return void
+ */
+ public function process(File $phpcsFile, $stackPtr)
+ {
+ $tokens = $phpcsFile->getTokens();
+
+ // Find the class name.
+ $allowed = [
+ T_STRING,
+ T_NS_SEPARATOR,
+ T_SELF,
+ T_STATIC,
+ T_VARIABLE,
+ T_DOLLAR,
+ ];
+
+ $allowed += Tokens::$emptyTokens;
+
+ $classNameEnd = $phpcsFile->findNext($allowed, ($stackPtr + 1), null, true);
+ if ($classNameEnd === false) {
+ return;
+ }
+
+ if ($tokens[$classNameEnd]['code'] === T_ANON_CLASS) {
+ // Ignore anon classes.
+ return;
+ }
+
+ if ($tokens[$classNameEnd]['code'] === T_OPEN_PARENTHESIS) {
+ // Using parenthesis.
+ return;
+ }
+
+ $error = 'Parenthesis must be used when instantiating a new class';
+ $fix = $phpcsFile->addFixableError($error, $stackPtr, 'MissingParenthesis');
+ if ($fix === true) {
+ $prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($classNameEnd - 1), null, true);
+ $phpcsFile->fixer->addContent($prev, '()');
+ }
+
+ }//end process()
+
+
+}//end class
diff --git a/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.inc b/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.inc
new file mode 100644
index 0000000000..6f61f63523
--- /dev/null
+++ b/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.inc
@@ -0,0 +1,25 @@
+bar();
+echo (new Foo)->bar();
+echo (new Foo((new Bar)->getBaz()))->bar();
+$foo = (new Foo)::$bar;
+
+echo (new Foo((new Bar//comment
+)->getBaz(new Baz /* comment */)))->bar();
diff --git a/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.inc.fixed b/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.inc.fixed
new file mode 100644
index 0000000000..cd3722e63b
--- /dev/null
+++ b/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.inc.fixed
@@ -0,0 +1,25 @@
+bar();
+echo (new Foo())->bar();
+echo (new Foo((new Bar())->getBaz()))->bar();
+$foo = (new Foo())::$bar;
+
+echo (new Foo((new Bar()//comment
+)->getBaz(new Baz() /* comment */)))->bar();
diff --git a/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.php b/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.php
new file mode 100644
index 0000000000..b2383e7a5a
--- /dev/null
+++ b/src/Standards/PSR12/Tests/Classes/ClassInstantiationUnitTest.php
@@ -0,0 +1,60 @@
+
+ * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600)
+ * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
+ */
+
+namespace PHP_CodeSniffer\Standards\PSR12\Tests\Classes;
+
+use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest;
+
+class ClassInstantiationUnitTest extends AbstractSniffUnitTest
+{
+
+
+ /**
+ * Returns the lines where errors should occur.
+ *
+ * The key of the array should represent the line number and the value
+ * should represent the number of errors that should occur on that line.
+ *
+ * @return array
+ */
+ public function getErrorList()
+ {
+ return [
+ 3 => 1,
+ 4 => 1,
+ 9 => 1,
+ 11 => 1,
+ 14 => 1,
+ 16 => 1,
+ 20 => 1,
+ 21 => 1,
+ 22 => 1,
+ 24 => 1,
+ 25 => 1,
+ ];
+
+ }//end getErrorList()
+
+
+ /**
+ * Returns the lines where warnings should occur.
+ *
+ * The key of the array should represent the line number and the value
+ * should represent the number of warnings that should occur on that line.
+ *
+ * @return array
+ */
+ public function getWarningList()
+ {
+ return [];
+
+ }//end getWarningList()
+
+
+}//end class
diff --git a/src/Standards/PSR12/ruleset.xml b/src/Standards/PSR12/ruleset.xml
index bdecb6190c..fa2f3dc473 100644
--- a/src/Standards/PSR12/ruleset.xml
+++ b/src/Standards/PSR12/ruleset.xml
@@ -82,7 +82,7 @@
-
+
@@ -110,17 +110,14 @@
+
-
-
-
-