Fix ParameterListWrappingRule to correctly identify misplaced left parens
diff --git a/ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/ParameterListWrappingRule.kt b/ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/ParameterListWrappingRule.kt
index 3117727..16c85b3 100644
--- a/ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/ParameterListWrappingRule.kt
+++ b/ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/ParameterListWrappingRule.kt
@@ -47,12 +47,21 @@
             if (putParametersOnSeparateLines || maxLineLengthExceeded) {
                 // aiming for
                 // ... LPAR
-                // <LPAR line indent + indentSize> VALUE_PARAMETER...
-                // <LPAR line indent> RPAR
+                // <line indent + indentSize> VALUE_PARAMETER...
+                // <line indent> RPAR
                 val indent = "\n" + node.psi.lineIndent()
                 val paramIndent = indent + " ".repeat(indentSize) // single indent as recommended by Jetbrains/Google
                 nextChild@ for (child in node.children()) {
                     when (child.elementType) {
+                        KtTokens.LPAR -> {
+                            val prevLeaf = child.psi.prevLeaf()!!
+                            if (prevLeaf.elementType == KtTokens.WHITE_SPACE && prevLeaf.textContains('\n')) {
+                                emit(child.startOffset, errorMessage(child), true)
+                                if (autoCorrect) {
+                                    prevLeaf.delete()
+                                }
+                            }
+                        }
                         KtStubElementTypes.VALUE_PARAMETER,
                         KtTokens.RPAR -> {
                             var paramInnerIndentAdjustment = 0
@@ -128,6 +137,7 @@
 
     private fun errorMessage(node: ASTNode) =
         when (node.elementType) {
+            KtTokens.LPAR -> """Unnecessary newline before "(""""
             KtStubElementTypes.VALUE_PARAMETER ->
                 "Parameter should be on a separate line (unless all parameters can fit a single line)"
             KtTokens.RPAR -> """Missing newline before ")""""
diff --git a/ktlint-ruleset-standard/src/test/kotlin/com/github/shyiko/ktlint/ruleset/standard/ParameterListWrappingRuleTest.kt b/ktlint-ruleset-standard/src/test/kotlin/com/github/shyiko/ktlint/ruleset/standard/ParameterListWrappingRuleTest.kt
index ea8f58a..0264235 100644
--- a/ktlint-ruleset-standard/src/test/kotlin/com/github/shyiko/ktlint/ruleset/standard/ParameterListWrappingRuleTest.kt
+++ b/ktlint-ruleset-standard/src/test/kotlin/com/github/shyiko/ktlint/ruleset/standard/ParameterListWrappingRuleTest.kt
@@ -391,4 +391,92 @@
             LintError(6, 4, "parameter-list-wrapping", "Unexpected indentation (expected 4, actual 3)")
         ))
     }
+
+    @Test
+    fun testLintClassDanglingLeftParen() {
+        assertThat(
+            ParameterListWrappingRule().lint(
+            """
+            class ClassA
+            (
+                paramA: String,
+                paramB: String,
+                paramC: String
+            )
+            """.trimIndent()
+            )
+        ).isEqualTo(
+            listOf(
+                LintError(2, 1, "parameter-list-wrapping", """Unnecessary newline before "("""")
+            )
+        )
+    }
+
+    @Test
+    fun testLintFunctionDanglingLeftParen() {
+        assertThat(
+            ParameterListWrappingRule().lint(
+            """
+            fun doSomething
+            (
+                paramA: String,
+                paramB: String,
+                paramC: String
+            )
+            """.trimIndent()
+            )
+        ).isEqualTo(
+            listOf(
+                LintError(2, 1, "parameter-list-wrapping", """Unnecessary newline before "("""")
+            )
+        )
+    }
+
+    @Test
+    fun testFormatClassDanglingLeftParen() {
+        assertThat(
+            ParameterListWrappingRule().format(
+            """
+            class ClassA constructor
+            (
+                paramA: String,
+                paramB: String,
+                paramC: String
+            )
+            """.trimIndent()
+            )
+        ).isEqualTo(
+            """
+            class ClassA constructor(
+                paramA: String,
+                paramB: String,
+                paramC: String
+            )
+            """.trimIndent()
+        )
+    }
+
+    @Test
+    fun testFormatFunctionDanglingLeftParen() {
+        assertThat(
+            ParameterListWrappingRule().format(
+            """
+            fun doSomething
+            (
+                paramA: String,
+                paramB: String,
+                paramC: String
+            )
+            """.trimIndent()
+            )
+        ).isEqualTo(
+            """
+            fun doSomething(
+                paramA: String,
+                paramB: String,
+                paramC: String
+            )
+            """.trimIndent()
+        )
+    }
 }