Fix exception when Groovy lazy string (GString) is in freeCompilerArgs

    #KT-15500 fixed

GString is an object that represents string literal like `"${project.name}"`
in Groovy. It is not an instance of string.
Groovy automatically converts GString to String when it is passed where String is expected.
However freeCompilerArgs is a List<String>, so type parameter info is lost at runtime.
When iterating freeCompilerArgs in Kotlin as a list of string, an exception
is thrown because GString cannot be casted to String (toString should be called instead).
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinGradlePluginIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinGradlePluginIT.kt
index fc01f9e..1ef9e87 100644
--- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinGradlePluginIT.kt
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinGradlePluginIT.kt
@@ -346,4 +346,23 @@
             assertFileExists("libJs/build/classes/test/libJs_test.js")
         }
     }
+
+    @Test
+    fun testFreeCompilerArgs() {
+        val project = Project("kotlinProject", GRADLE_VERSION)
+        project.setupWorkingDir()
+
+        File(project.projectDir, "build.gradle").modify {
+            // lazy eval is important
+            val customModuleName = "\${project.name}"
+            it + """
+            compileKotlin {
+                kotlinOptions.freeCompilerArgs = [ "-module-name", "$customModuleName" ]
+            }"""
+        }
+
+        project.build("build") {
+            assertSuccessful()
+        }
+    }
 }
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinJsOptionsImpl.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinJsOptionsImpl.kt
index 88d8dda..ac7b19c 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinJsOptionsImpl.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinJsOptionsImpl.kt
@@ -19,11 +19,13 @@
 import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments
 import org.jetbrains.kotlin.cli.js.K2JSCompiler
 
-internal class KotlinJsOptionsImpl() : KotlinJsOptionsBase() {
+internal class KotlinJsOptionsImpl : KotlinJsOptionsBase() {
     override var freeCompilerArgs: List<String> = listOf()
 
     override fun updateArguments(args: K2JSCompilerArguments) {
         super.updateArguments(args)
-        K2JSCompiler().parseArguments(freeCompilerArgs.toTypedArray(), args)
+        // cast to List<Any> is important because in Groovy a GString can be inside of a list
+        val freeArgsArray = (freeCompilerArgs as List<Any>).map(Any::toString).toTypedArray()
+        K2JSCompiler().parseArguments(freeArgsArray, args)
     }
 }
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinJvmOptionsImpl.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinJvmOptionsImpl.kt
index ba5c336..72ed22d 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinJvmOptionsImpl.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinJvmOptionsImpl.kt
@@ -24,6 +24,8 @@
 
     override fun updateArguments(args: K2JVMCompilerArguments) {
         super.updateArguments(args)
-        K2JVMCompiler().parseArguments(freeCompilerArgs.toTypedArray(), args)
+        // cast to List<Any> is important because in Groovy a GString can be inside of a list
+        val freeArgsArray = (freeCompilerArgs as List<Any>).map(Any::toString).toTypedArray()
+        K2JVMCompiler().parseArguments(freeArgsArray, args)
     }
 }