Repository: bnorm/kotlin-power-assert (kotlin)

Issue:
Exclude vararg arrays from expression diagram
Taken from #74:

```text
java.lang.AssertionError: Assertion failed
assert(listOf("a", "b", "c").containsExactlyInAnyOrder("b", "a"))
       |      |              |                         |
       |      |              |                         [Ljava.lang.String;@7579bc7
       |      |              false
       |      [Ljava.lang.String;@34cfd455
       [a, b, c]
```

Also need to handle the spread operator for non-constant arrays. Should all arrays be excluded because they don't have a good `toString()`? Special handling in the diagram builder?

Pull request:
Fixes #80

Patch:
diff --git a/kotlin-power-assert-plugin/src/main/kotlin/com/bnorm/power/diagram/ExpressionTree.kt b/kotlin-power-assert-plugin/src/main/kotlin/com/bnorm/power/diagram/ExpressionTree.kt
index 3be061e..79a7512 100644
--- a/kotlin-power-assert-plugin/src/main/kotlin/com/bnorm/power/diagram/ExpressionTree.kt
+++ b/kotlin-power-assert-plugin/src/main/kotlin/com/bnorm/power/diagram/ExpressionTree.kt
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.ir.expressions.IrFunctionExpression
 import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
 import org.jetbrains.kotlin.ir.expressions.IrTypeOperator
 import org.jetbrains.kotlin.ir.expressions.IrTypeOperatorCall
+import org.jetbrains.kotlin.ir.expressions.IrVararg
 import org.jetbrains.kotlin.ir.expressions.IrWhen
 import org.jetbrains.kotlin.ir.util.dumpKotlinLike
 import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
@@ -123,6 +124,11 @@ fun buildTree(expression: IrExpression): Node? {
       }
     }
 
+    override fun visitVararg(expression: IrVararg, data: Node) {
+      // Skip processing of vararg array
+      expression.acceptChildren(this, data)
+    }
+
     override fun visitConst(expression: IrConst<*>, data: Node) {
       // Do not include constants
     }


Test patch:
diff --git a/kotlin-power-assert-plugin/src/test/kotlin/com/bnorm/power/VarargTest.kt b/kotlin-power-assert-plugin/src/test/kotlin/com/bnorm/power/VarargTest.kt
new file mode 100644
index 0000000..77062d5
--- /dev/null
+++ b/kotlin-power-assert-plugin/src/test/kotlin/com/bnorm/power/VarargTest.kt
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2023 Brian Norman
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.bnorm.power
+
+import kotlin.test.Test
+
+class VarargTest {
+  @Test
+  fun `implicit array of vararg parameters is excluded from diagram`() {
+    assertMessage(
+      """
+      fun main() {
+        var i = 0
+        assert(listOf("a", "b", "c") == listOf(i++, i++, i++))
+      }""",
+      """
+      Assertion failed
+      assert(listOf("a", "b", "c") == listOf(i++, i++, i++))
+             |                     |  |      |    |    |
+             |                     |  |      |    |    2
+             |                     |  |      |    1
+             |                     |  |      0
+             |                     |  [0, 1, 2]
+             |                     false
+             [a, b, c]
+      """.trimIndent(),
+    )
+  }
+}
diff --git a/kotlin-power-assert-plugin/src/test/kotlin/com/bnorm/power/compiler.kt b/kotlin-power-assert-plugin/src/test/kotlin/com/bnorm/power/compiler.kt
index c73106a..e2fa94c 100644
--- a/kotlin-power-assert-plugin/src/test/kotlin/com/bnorm/power/compiler.kt
+++ b/kotlin-power-assert-plugin/src/test/kotlin/com/bnorm/power/compiler.kt
@@ -59,7 +59,7 @@ fun executeAssertion(
     listOf(SourceFile.kotlin("main.kt", source, trimIndent = false)),
     *plugins,
   )
-  assertEquals(KotlinCompilation.ExitCode.OK, result.exitCode)
+  assertEquals(KotlinCompilation.ExitCode.OK, result.exitCode, result.messages)
 
   val kClazz = result.classLoader.loadClass("MainKt")
   val main = kClazz.declaredMethods.single { it.name == "main" && it.parameterCount == 0 }