Skip to content

Commit

Permalink
Merge branch 'ir-code-gen' of github.com:xebia-functional/AsFuture in…
Browse files Browse the repository at this point in the history
…to ir-code-gen
  • Loading branch information
nomisRev committed Jun 13, 2023
2 parents f3c75a8 + 97472ef commit e8b0d50
Show file tree
Hide file tree
Showing 22 changed files with 487 additions and 5 deletions.
65 changes: 64 additions & 1 deletion compiler-plugin/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,40 @@ group = "com.xebia"
version = "0.0.1"
val autoService = "1.1.1"

sourceSets {
test {
java.srcDirs("src/test-gen")
}
}

dependencies {
compileOnly("com.google.auto.service:auto-service:$autoService")
compileOnly("org.jetbrains.kotlin:kotlin-compiler:1.8.22")
kapt("com.google.auto.service:auto-service:$autoService")
compileOnly("org.jetbrains.kotlin:kotlin-compiler-embeddable:1.8.20")
compileOnly("org.jetbrains.kotlin:kotlin-compiler-embeddable:1.8.22")
testImplementation("dev.zacsweers.kctfork:core:0.2.1")
testImplementation("junit:junit:4.13.2")
testImplementation("com.google.truth:truth:1.1.3")
testImplementation(kotlin("reflect"))
testRuntimeOnly("org.jetbrains.kotlin:kotlin-test:1.8.22")
testRuntimeOnly("org.jetbrains.kotlin:kotlin-script-runtime:1.8.22")
testRuntimeOnly("org.jetbrains.kotlin:kotlin-annotations-jvm:1.8.22")

testCompileOnly("org.jetbrains.kotlin:kotlin-compiler:1.8.22")
testImplementation("org.jetbrains.kotlin:kotlin-compiler:1.8.22")
testImplementation("org.jetbrains.kotlin:kotlin-compiler-internal-test-framework:1.8.22")
testImplementation(platform("org.junit:junit-bom:5.9.1"))
testImplementation("org.junit.jupiter:junit-jupiter")
testImplementation("org.junit.platform:junit-platform-commons")
testImplementation("org.junit.platform:junit-platform-launcher")
testImplementation("org.junit.platform:junit-platform-runner")
testImplementation("org.junit.platform:junit-platform-suite-api")
testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1")
}

java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
toolchain {
languageVersion.set(JavaLanguageVersion.of(11))
}
Expand All @@ -40,3 +63,43 @@ tasks.withType<KotlinCompile> {
}

//./gradlew clean :lib:compileKotlinJvm --no-daemon -Dorg.gradle.debug=true -Dkotlin.compiler.execution.strategy="in-process" -Dkotlin.daemon.jvm.options="-Xdebug,-Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n"

tasks.create<JavaExec>("generateTests") {
classpath = sourceSets.test.get().runtimeClasspath
mainClass.set("com.xebia.GenerateKotlinCompilerTestKt")
}


tasks.test {
testLogging { showStandardStreams = true }

useJUnitPlatform()
doFirst {
setLibraryProperty("org.jetbrains.kotlin.test.kotlin-stdlib", "kotlin-stdlib")
setLibraryProperty("org.jetbrains.kotlin.test.kotlin-stdlib-jdk8", "kotlin-stdlib-jdk8")
setLibraryProperty("org.jetbrains.kotlin.test.kotlin-reflect", "kotlin-reflect")
setLibraryProperty("org.jetbrains.kotlin.test.kotlin-test", "kotlin-test")
setLibraryProperty("org.jetbrains.kotlin.test.kotlin-script-runtime", "kotlin-script-runtime")
setLibraryProperty("org.jetbrains.kotlin.test.kotlin-annotations-jvm", "kotlin-annotations-jvm")
setLibraryProperty("coroutines.lib", "kotlinx-coroutines-core-jvm")
}

dependsOn("generateTests")
}

fun Test.setLibraryProperty(propName: String, jarName: String) {
//error(project.configurations.testRuntimeClasspath
// .get()
// .files.joinToString("\n") { it.absolutePath })
val path =
project.configurations.testRuntimeClasspath
.get()
.files
.find {
val matches = """$jarName-\d.*jar""".toRegex().matches(it.name)
matches
}
?.absolutePath
?: return
systemProperty(propName, path)
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,4 @@ fun CompilerPluginRegistrar.ExtensionStorage.registerExtensionsCommon(configurat
messageCollector, asFutureAnnotation, coroutineScope
)
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ import org.jetbrains.kotlin.ir.declarations.IrValueParameter
import org.jetbrains.kotlin.ir.declarations.copyAttributes
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
import org.jetbrains.kotlin.ir.declarations.copyAttributes
import org.jetbrains.kotlin.ir.expressions.IrFunctionExpression
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@


package com.xebia.runners;

import com.intellij.testFramework.TestDataPath;
import org.jetbrains.kotlin.test.util.KtTestUtil;
import org.jetbrains.kotlin.test.TargetBackend;
import org.jetbrains.kotlin.test.TestMetadata;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;

import java.io.File;
import java.util.regex.Pattern;

/** This class is generated by {@link com.xebia.GenerateKotlinCompilerTestKt}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("src/testData/box")
@TestDataPath("$PROJECT_ROOT")
public class BoxTestGenerated extends AbstractBoxTest {
@Test
public void testAllFilesPresentInBox() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("src/testData/box"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true);
}

@Test
@TestMetadata("simple.kt")
public void testSimple() throws Exception {
runTest("src/testData/box/simple.kt");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@


package com.xebia.runners;

import com.intellij.testFramework.TestDataPath;
import org.jetbrains.kotlin.test.util.KtTestUtil;
import org.jetbrains.kotlin.test.TestMetadata;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;

import java.io.File;
import java.util.regex.Pattern;

/** This class is generated by {@link com.xebia.GenerateKotlinCompilerTestKt}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("src/testData/diagnostics")
@TestDataPath("$PROJECT_ROOT")
public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
@Test
public void testAllFilesPresentInDiagnostics() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("src/testData/diagnostics"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.xebia

import com.xebia.runners.AbstractBoxTest
import com.xebia.runners.AbstractDiagnosticTest
import org.jetbrains.kotlin.generators.generateTestGroupSuiteWithJUnit5

fun main() {
generateTestGroupSuiteWithJUnit5 {
testGroup(testDataRoot = "src/testData", testsRoot = "src/test-gen") {
testClass<AbstractDiagnosticTest> {
model("diagnostics")
}

testClass<AbstractBoxTest> {
model("box")
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.xebia.runners

import org.jetbrains.kotlin.test.TargetBackend
import org.jetbrains.kotlin.test.backend.BlackBoxCodegenSuppressor
import org.jetbrains.kotlin.test.backend.handlers.IrTextDumpHandler
import org.jetbrains.kotlin.test.backend.handlers.IrTreeVerifierHandler
import org.jetbrains.kotlin.test.backend.handlers.JvmBoxRunner
import org.jetbrains.kotlin.test.backend.ir.JvmIrBackendFacade
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
import org.jetbrains.kotlin.test.builders.fir2IrStep
import org.jetbrains.kotlin.test.builders.irHandlersStep
import org.jetbrains.kotlin.test.builders.jvmArtifactsHandlersStep
import org.jetbrains.kotlin.test.directives.CodegenTestDirectives.DUMP_IR
import org.jetbrains.kotlin.test.runners.RunnerWithTargetBackendForTestGeneratorMarker

open class AbstractBoxTest : BaseTestRunner(), RunnerWithTargetBackendForTestGeneratorMarker {
override val targetBackend: TargetBackend = TargetBackend.JVM_IR

override fun TestConfigurationBuilder.configuration() {
defaultDirectives { +DUMP_IR }

commonFirWithPluginFrontendConfiguration()
fir2IrStep()
irHandlersStep {
useHandlers(
::IrTextDumpHandler,
::IrTreeVerifierHandler,
)
}
facadeStep(::JvmIrBackendFacade)
jvmArtifactsHandlersStep { useHandlers(::JvmBoxRunner) }

useAfterAnalysisCheckers(::BlackBoxCodegenSuppressor)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.xebia.runners

import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
import org.jetbrains.kotlin.test.services.EnvironmentBasedStandardLibrariesPathProvider
import org.jetbrains.kotlin.test.services.KotlinStandardLibrariesPathProvider

abstract class AbstractDiagnosticTest : BaseTestRunner() {
override fun TestConfigurationBuilder.configuration() {
commonFirWithPluginFrontendConfiguration()
}

override fun createKotlinStandardLibrariesPathProvider(): KotlinStandardLibrariesPathProvider {
return EnvironmentBasedStandardLibrariesPathProvider
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package com.xebia.runners

import com.xebia.services.ExtensionRegistrarConfigurator
import com.xebia.services.PluginAnnotationsConfigurator
import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoot
import org.jetbrains.kotlin.cli.jvm.config.addJvmSdkRoots
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
import org.jetbrains.kotlin.test.TargetBackend
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives
import org.jetbrains.kotlin.test.impl.testConfiguration
import org.jetbrains.kotlin.test.initIdeaConfiguration
import org.jetbrains.kotlin.test.model.DependencyKind
import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerTest
import org.jetbrains.kotlin.test.runners.baseFirDiagnosticTestConfiguration
import org.jetbrains.kotlin.test.services.*
import org.jetbrains.kotlin.utils.PathUtil
import org.junit.jupiter.api.BeforeAll
import java.io.File
import java.util.concurrent.CompletableFuture
import java.util.concurrent.Future

abstract class BaseTestRunner : AbstractKotlinCompilerTest() {
companion object {
@BeforeAll
@JvmStatic
fun setUp() {
initIdeaConfiguration()
}
}

override fun createKotlinStandardLibrariesPathProvider(): KotlinStandardLibrariesPathProvider {
return EnvironmentBasedStandardLibrariesPathProvider
}
}

fun TestConfigurationBuilder.commonFirWithPluginFrontendConfiguration() {
baseFirDiagnosticTestConfiguration()

useCustomRuntimeClasspathProviders(
::CustomClassPathProvider
)

defaultDirectives {
+FirDiagnosticsDirectives.ENABLE_PLUGIN_PHASES
+FirDiagnosticsDirectives.FIR_DUMP
// +PreludeAdditionalFilesDirectives.ANNOTATION_DIRECTIVE
// +PreludeAdditionalFilesDirectives.IDENTITY_DIRECTIVE
}

globalDefaults {
targetBackend = TargetBackend.JVM_IR
targetPlatform = JvmPlatforms.defaultJvmPlatform
dependencyKind = DependencyKind.Binary
}

useConfigurators(
::PluginAnnotationsConfigurator,
::ExtensionRegistrarConfigurator,
::CustomClassPathConfigurator
)


//useAdditionalSourceProviders(::PreludeProvider)
}

fun CustomClassPathConfigurator(testServices: TestServices): EnvironmentConfigurator =
object : EnvironmentConfigurator(testServices) {
override fun configureCompilerConfiguration(configuration: CompilerConfiguration, module: TestModule) {
configuration.put(JVMConfigurationKeys.NO_JDK, false)
configuration.put(JVMConfigurationKeys.JDK_HOME, File(System.getProperty("java.home")))
configuration.addJvmSdkRoots(PathUtil.getJdkClassesRootsFromCurrentJre())
configuration.addJvmClasspathRoot(File(System.getProperty("coroutines.lib")))
super.configureCompilerConfiguration(configuration, module)
}
}

fun CustomClassPathProvider(testServices: TestServices): RuntimeClasspathProvider =
object : RuntimeClasspathProvider(testServices) {
override fun runtimeClassPaths(module: TestModule): List<File> {
val jrt = PathUtil.getJdkClassesRootsFromCurrentJre()
println("Adding JRE classpath roots: $jrt")
return listOf(PluginAnnotationsConfigurator.jar(testServices)) +
listOfNotNull(File(System.getProperty("coroutines.lib"))) +
jrt
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.xebia.services

import com.xebia.registerExtensionsCommon
import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar
import org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.services.EnvironmentConfigurator
import org.jetbrains.kotlin.test.services.TestServices

class ExtensionRegistrarConfigurator(
testServices: TestServices,
) : EnvironmentConfigurator(testServices) {
@OptIn(ExperimentalCompilerApi::class)
override fun CompilerPluginRegistrar.ExtensionStorage.registerCompilerExtensions(
module: TestModule,
configuration: CompilerConfiguration
) {
registerExtensionsCommon(configuration)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.xebia.services

import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoot
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.services.EnvironmentConfigurator
import org.jetbrains.kotlin.test.services.TestServices
import org.jetbrains.kotlin.test.services.assertions
import java.io.FilenameFilter
import java.io.File

class PluginAnnotationsConfigurator(testServices: TestServices) :
EnvironmentConfigurator(testServices) {

companion object {
private const val ANNOTATIONS_JAR_DIR = "../annotation/build/libs/"
private val ANNOTATIONS_JAR_FILTER = FilenameFilter { _, name ->
name.startsWith("annotation-jvm") && name.endsWith(".jar")
}
private val failMessage = {
"Jar with annotations does not exist. Please run :annotation:jar"
}
fun jar(testServices: TestServices) =
File(ANNOTATIONS_JAR_DIR).listFiles(ANNOTATIONS_JAR_FILTER)?.firstOrNull()
?: testServices.assertions.fail(failMessage)
}

override fun configureCompilerConfiguration(
configuration: CompilerConfiguration,
module: TestModule
) {
val libDir = File(ANNOTATIONS_JAR_DIR)
testServices.assertions.assertTrue(libDir.exists() && libDir.isDirectory, failMessage)
val jar = jar(testServices)
configuration.addJvmClasspathRoot(jar)
}

}
Loading

0 comments on commit e8b0d50

Please sign in to comment.