diff --git a/.gitignore b/.gitignore index 289767c96c0..8ea7b3cc674 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,8 @@ build/ .idea/modules .idea/runConfigurations/JPS_*.xml .idea/runConfigurations/PILL_*.xml +.idea/runConfigurations/_FP_*.xml +.idea/runConfigurations/_MT_*.xml .idea/libraries .idea/modules.xml .idea/gradle.xml diff --git a/build.gradle.kts b/build.gradle.kts index e4fe8b0fc57..7160ca59539 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -159,6 +159,7 @@ rootProject.apply { from(rootProject.file("gradle/checkArtifacts.gradle.kts")) from(rootProject.file("gradle/checkCacheability.gradle.kts")) from(rootProject.file("gradle/retryPublishing.gradle.kts")) + from(rootProject.file("gradle/modularizedTestConfigurations.gradle.kts")) } IdeVersionConfigurator.setCurrentIde(project) diff --git a/gradle/modularizedTestConfigurations.gradle.kts b/gradle/modularizedTestConfigurations.gradle.kts new file mode 100644 index 00000000000..5bda4c14158 --- /dev/null +++ b/gradle/modularizedTestConfigurations.gradle.kts @@ -0,0 +1,160 @@ +@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() = IntellijRootUtils.getIntellijRootDir(rootProject).absolutePath + +val intellijUltimateEnabled: Boolean by rootProject.extra +val ideaUltimatePluginDir: File by rootProject.extra +val ideaUltimateSandboxDir: File by rootProject.extra + +val pathToKotlinModularizedTestData = kotlinBuildProperties.pathToKotlinModularizedTestData + +fun MutableList.addModularizedTestArgs(prefix: String, benchFilter: String?) { + add("-${prefix}fir.bench.prefix=$pathToKotlinModularizedTestData") + add("-${prefix}fir.bench.jps.dir=$pathToKotlinModularizedTestData/test-project-model-dump") + add("-${prefix}fir.bench.passes=1") + add("-${prefix}fir.bench.dump=true") + if (benchFilter != null) { + add("-${prefix}fir.bench.filter=$benchFilter") + } +} + +fun generateVmParametersForJpsConfiguration(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", + "-Djps.kotlin.home=${ideaPluginDir.absolutePath}", + "-Dkotlin.ni=" + if (rootProject.hasProperty("newInferenceTests")) "true" else "false", + "-Duse.jps=true", + "-Djava.awt.headless=true" + ) + vmParameters.addModularizedTestArgs(prefix = "D", benchFilter = benchFilter) + return vmParameters.joinToString(" ") +} + +fun generateArgsForGradleConfiguration(benchFilter: String?): String { + val args = mutableListOf() + args.addModularizedTestArgs(prefix = "P", 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, benchFilter: String?) { + val vmParameters = generateVmParametersForJpsConfiguration(benchFilter) + val content = generateXmlContentForJpsConfiguration( + name = name, + testClassName = testClassName, + vmParameters = vmParameters + ) + name.convertNameToRunConfigurationFile("JPS").writeText(content) +} + +fun generateGradleConfiguration(name: String, testClassName: String, benchFilter: String?) { + val vmParameters = generateArgsForGradleConfiguration(benchFilter) + val content = generateXmlContentForGradleConfiguration( + name = name, + testClassName = testClassName, + vmParameters = vmParameters + ) + name.convertNameToRunConfigurationFile().writeText(content) +} + +if (pathToKotlinModularizedTestData != null) { + rootProject.afterEvaluate { + val configurations = listOf( + "Full kotlin" to null, + "All main modules" to ".*/main", + "idea.main module" to ".*/idea/build/.*/main", + "idea.test module" to ".*/idea/build/.*/test" + ) + + val jpsBuildEnabled = kotlinBuildProperties.isInJpsBuildIdeaSync + + for ((name, benchFilter) in configurations) { + generateGradleConfiguration("[MT] $name", "FirResolveModularizedTotalKotlinTest", benchFilter) + generateGradleConfiguration("[FP] $name", "FullPipelineModularizedTest", benchFilter) + if (jpsBuildEnabled) { + generateJpsConfiguration("[MT-JPS] $name", "FirResolveModularizedTotalKotlinTest", benchFilter) + generateJpsConfiguration("[FP-JPS] $name", "FullPipelineModularizedTest", benchFilter) + } + } + } +}