Support super expressions with type qualifier

Summary: Ouch, this crashed Ktfmt. Adding support for it.

Reviewed By: cgrushko

Differential Revision: D21627282

fbshipit-source-id: 51c60b5c33d80020664a3267876e1c8a940165e2
diff --git a/core/src/main/java/com/facebook/ktfmt/KotlinInputAstVisitor.kt b/core/src/main/java/com/facebook/ktfmt/KotlinInputAstVisitor.kt
index 7221d83..508f65d 100644
--- a/core/src/main/java/com/facebook/ktfmt/KotlinInputAstVisitor.kt
+++ b/core/src/main/java/com/facebook/ktfmt/KotlinInputAstVisitor.kt
@@ -85,6 +85,7 @@
 import org.jetbrains.kotlin.psi.KtSecondaryConstructor
 import org.jetbrains.kotlin.psi.KtSimpleNameExpression
 import org.jetbrains.kotlin.psi.KtStringTemplateExpression
+import org.jetbrains.kotlin.psi.KtSuperExpression
 import org.jetbrains.kotlin.psi.KtSuperTypeCallEntry
 import org.jetbrains.kotlin.psi.KtSuperTypeList
 import org.jetbrains.kotlin.psi.KtThisExpression
@@ -1341,6 +1342,17 @@
     builder.token(replaceTrailingWhitespaceWithTombstone(expression.text))
   }
 
+  /** Example `super` in `super.doIt(5)` or `super<Foo>` in `super<Foo>.doIt(5)` */
+  override fun visitSuperExpression(expression: KtSuperExpression) {
+    builder.token("super")
+    val superTypeQualifier = expression.superTypeQualifier
+    if (superTypeQualifier != null) {
+      builder.token("<")
+      superTypeQualifier.accept(this)
+      builder.token(">")
+    }
+  }
+
   /** Example `<T, S>` */
   override fun visitTypeParameterList(list: KtTypeParameterList) {
     builder.sync(list)
diff --git a/core/src/test/java/com/facebook/ktfmt/FormatterKtTest.kt b/core/src/test/java/com/facebook/ktfmt/FormatterKtTest.kt
index 8688da2..974be22 100644
--- a/core/src/test/java/com/facebook/ktfmt/FormatterKtTest.kt
+++ b/core/src/test/java/com/facebook/ktfmt/FormatterKtTest.kt
@@ -1256,6 +1256,17 @@
       |""".trimMargin())
 
   @Test
+  fun `handle super statement with with type argument`() =
+      assertFormatted(
+          """
+      |class Foo : Bar(), FooBar {
+      |  override fun doIt() {
+      |    super<FooBar>.doIt()
+      |  }
+      |}
+      |""".trimMargin())
+
+  @Test
   fun `primary constructor without parameters with a KDoc`() =
       assertFormatted(
           """