@file:Suppress("UnstableApiUsage") import org.gradle.jvm.tasks.Jar import org.jetbrains.gradle.ext.ActionDelegationConfig import org.jetbrains.gradle.ext.JUnit import org.jetbrains.gradle.ext.RecursiveArtifact import org.jetbrains.gradle.ext.TopLevelArtifact import org.jetbrains.kotlin.ideaExt.* val ideaPluginDir: File by extra val ideaSandboxDir: File by extra val ideaSdkPath: String get() = rootProject.ideaHomePathForTests().absolutePath fun MutableList.addModularizedTestArgs(prefix: String, path: String, additionalParameters: Map, benchFilter: String?) { add("-${prefix}fir.bench.prefix=$path") add("-${prefix}fir.bench.jps.dir=$path/test-project-model-dump") add("-${prefix}fir.bench.passes=1") add("-${prefix}fir.bench.dump=true") for ((name, value) in additionalParameters) { add("-$prefix$name=$value") } if (benchFilter != null) { add("-${prefix}fir.bench.filter=$benchFilter") } } fun generateVmParametersForJpsConfiguration(path: String, additionalParameters: Map, benchFilter: String?): String { val vmParameters = mutableListOf( "-ea", "-XX:+HeapDumpOnOutOfMemoryError", "-Xmx3600m", "-XX:+UseCodeCacheFlushing", "-XX:ReservedCodeCacheSize=128m", "-Djna.nosys=true", "-Didea.platform.prefix=Idea", "-Didea.is.unit.test=true", "-Didea.ignore.disabled.plugins=true", "-Didea.home.path=$ideaSdkPath", "-Didea.use.native.fs.for.win=false", "-Djps.kotlin.home=${ideaPluginDir.absolutePath}", "-Duse.jps=true", "-Djava.awt.headless=true" ) vmParameters.addModularizedTestArgs(prefix = "D", path = path, additionalParameters = additionalParameters, benchFilter = benchFilter) return vmParameters.joinToString(" ") } fun generateArgsForGradleConfiguration(path: String, additionalParameters: Map, benchFilter: String?): String { val args = mutableListOf() args.addModularizedTestArgs(prefix = "P", path = path, additionalParameters = additionalParameters, benchFilter = benchFilter) return args.joinToString(" ") } fun generateXmlContentForJpsConfiguration(name: String, testClassName: String, vmParameters: String): String { return """ """.trimIndent() } fun generateXmlContentForGradleConfiguration(name: String, testClassName: String, vmParameters: String): String { return """ true """.trimIndent() } fun String.convertNameToRunConfigurationFile(prefix: String = ""): File { val fileName = prefix + replace("""[ -.\[\]]""".toRegex(), "_") + ".xml" return rootDir.resolve(".idea/runConfigurations/${fileName}") } fun generateJpsConfiguration(name: String, testClassName: String, path: String, additionalParameters: Map, benchFilter: String?) { val vmParameters = generateVmParametersForJpsConfiguration(path, additionalParameters, benchFilter) val content = generateXmlContentForJpsConfiguration( name = name, testClassName = testClassName, vmParameters = vmParameters ) name.convertNameToRunConfigurationFile("JPS").writeText(content) } fun generateGradleConfiguration(name: String, testClassName: String, path: String, additionalParameters: Map, benchFilter: String?) { val vmParameters = generateArgsForGradleConfiguration(path, additionalParameters, benchFilter) val content = generateXmlContentForGradleConfiguration( name = name, testClassName = testClassName, vmParameters = vmParameters ) name.convertNameToRunConfigurationFile().writeText(content) } data class Configuration(val path: String, val name: String, val additionalParameters: Map = emptyMap()) { companion object { operator fun invoke(path: String?, name: String, additionalParameters: Map = emptyMap()): Configuration? { return path?.let { Configuration(it, name, additionalParameters) } } } } val testDataPathList = listOfNotNull( Configuration(kotlinBuildProperties.pathToKotlinModularizedTestData, "Kotlin"), Configuration(kotlinBuildProperties.pathToIntellijModularizedTestData, "IntelliJ"), Configuration(kotlinBuildProperties.pathToYoutrackModularizedTestData, "YouTrack"), Configuration(kotlinBuildProperties.pathToSpaceModularizedTestData, "Space") ) val generateMT = kotlinBuildProperties.generateModularizedConfigurations val generateFP = kotlinBuildProperties.generateFullPipelineConfigurations for ((path, projectName, additionalParameters) in testDataPathList) { rootProject.afterEvaluate { val configurations = mutableListOf>( "Full $projectName" to null ) val jpsBuildEnabled = kotlinBuildProperties.isInJpsBuildIdeaSync for ((name, benchFilter) in configurations) { if (generateMT) { generateGradleConfiguration( "[MT] $name", "FirResolveModularizedTotalKotlinTest", path, additionalParameters, benchFilter ) } if (generateFP) { generateGradleConfiguration( "[FP] $name", "FullPipelineModularizedTest", path, additionalParameters, benchFilter ) } if (jpsBuildEnabled) { if (generateMT) { generateJpsConfiguration( "[MT-JPS] $name", "FirResolveModularizedTotalKotlinTest", path, additionalParameters, benchFilter ) } if (generateFP) { generateJpsConfiguration( "[FP-JPS] $name", "FullPipelineModularizedTest", path, additionalParameters, benchFilter ) } } } } }