From c2be3d90800dbd632811ac020c7334030e7cf916 Mon Sep 17 00:00:00 2001 From: Margarita Bobova Date: Tue, 31 Jan 2023 11:07:56 +0100 Subject: [PATCH 01/14] chore(release): add kotlin 1.8.20-Beta --- Dockerfile | 4 ++-- build.gradle.kts | 4 ++-- gradle.properties | 4 ++-- settings.gradle.kts | 2 +- src/main/resources/application.properties | 6 +++--- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Dockerfile b/Dockerfile index 2a8bc01e6..11303462b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM openjdk:11.0.16-jdk as build -ENV KOTLIN_LIB=1.8.10 -ENV KOTLIN_LIB_JS=1.8.10-js +ENV KOTLIN_LIB=1.8.20-Beta +ENV KOTLIN_LIB_JS=1.8.20-Beta-js RUN mkdir -p /kotlin-compiler-server WORKDIR /kotlin-compiler-server diff --git a/build.gradle.kts b/build.gradle.kts index f770ec637..ca2e8dfc6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -46,8 +46,8 @@ val copyJSDependencies by tasks.creating(Copy::class) { plugins { id("org.springframework.boot") version "2.7.9" id("io.spring.dependency-management") version "1.1.0" - kotlin("jvm") version "1.8.10" - kotlin("plugin.spring") version "1.8.10" + kotlin("jvm") version "1.8.20-Beta" + kotlin("plugin.spring") version "1.8.20-Beta" } allprojects { diff --git a/gradle.properties b/gradle.properties index be7b223fa..db698598c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ -systemProp.kotlinVersion=1.8.10 -systemProp.kotlinIdeVersion=1.8.10-release-430 +systemProp.kotlinVersion=1.8.20-Beta +systemProp.kotlinIdeVersion=1.8.20-Beta-release-162 systemProp.policy=executor.policy systemProp.indexes=indexes.json systemProp.indexesJs=indexesJs.json diff --git a/settings.gradle.kts b/settings.gradle.kts index becc5e51b..506057a4c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,4 +1,4 @@ rootProject.name = "kotlin-compiler-server" include(":executors") include(":indexation") -include(":common") +include(":common") \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index b892cd4a3..fb0a07768 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,8 +1,8 @@ # this file is autogenerated by build.gradle.kts -kotlin.version=1.8.10 +kotlin.version=1.8.20-Beta policy.file=executor.policy indexes.file=indexes.json indexesJs.file=indexesJs.json -libraries.folder.jvm=1.8.10 -libraries.folder.js=1.8.10-js +libraries.folder.jvm=1.8.20-Beta +libraries.folder.js=1.8.20-Beta-js spring.mvc.pathmatch.matching-strategy=ant_path_matcher \ No newline at end of file From 3e106c7f65210444bcb0b57246be710f1bf49100 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Tue, 31 Jan 2023 13:36:29 +0100 Subject: [PATCH 02/14] Adopt changes from 1.8.20-Beta with private fields --- .../components/KotlinToJSTranslator.kt | 32 +++++++++++++------ 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt b/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt index d721cc259..3d4a0b028 100644 --- a/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt +++ b/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt @@ -7,10 +7,12 @@ import component.KotlinEnvironment import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.ir.backend.js.CompilerResult +import org.jetbrains.kotlin.ir.backend.js.WholeWorldStageController import org.jetbrains.kotlin.ir.backend.js.compile import org.jetbrains.kotlin.ir.backend.js.prepareAnalyzedSourceModule import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformer -import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl +import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.TranslationMode +import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImplForJsIC import org.jetbrains.kotlin.js.config.JsConfig import org.jetbrains.kotlin.js.facade.K2JSTranslator import org.jetbrains.kotlin.js.facade.MainCallParameters @@ -115,19 +117,20 @@ class KotlinToJSTranslator( val ir = compile( sourceModule, kotlinEnvironment.jsIrPhaseConfig, - irFactory = IrFactoryImpl + irFactory = IrFactoryImplForJsIC(WholeWorldStageController()) ) val transformer = IrModuleToJsTransformer( ir.context, - arguments, - fullJs = true, - dceJs = false, - multiModule = false, - relativeRequirePath = true, + arguments ) - val compiledModule: CompilerResult = transformer.generateModule(ir.allModules) - val jsCode = compiledModule.outputs.values.single().jsCode + val compiledModule: CompilerResult = transformer.generateModule( + modules = ir.allModules, + modes = setOf(TranslationMode.FULL_DEV), + relativeRequirePath = false + ) + + val jsCode = getJsCodeFromModule(compiledModule) val listLines = jsCode .lineSequence() @@ -139,4 +142,15 @@ class KotlinToJSTranslator( return TranslationJSResult(listLines.joinToString("\n")) } + + private fun getJsCodeFromModule(compiledModule: CompilerResult): String { + val jsCodeObject = compiledModule.outputs.values.single() + + val jsCodeClass = jsCodeObject.javaClass + val jsCode = jsCodeClass.getDeclaredField("rawJsCode").let { + it.isAccessible = true + it.get(jsCodeObject) as String + } + return jsCode + } } \ No newline at end of file From 6fdb2f47ab8e12b00cbc64d6648bb8069a5653cd Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Mon, 6 Feb 2023 15:59:16 +0100 Subject: [PATCH 03/14] Infer JDK_HOME from java.home if it wasn't passed explicitly Now it requires because of KT-54337, where initialization of JDK_HOME was removed: https://github.com/jetbrains/kotlin/commit/b50a803b6fa0fc23732de12b3b881c10dc8cc3a8#diff-2c54e4ecf73ab55ca80a7497db6211001f27a916446694a6a988db65268216dbL97 --- common/src/main/kotlin/component/KotlinEnvironment.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/common/src/main/kotlin/component/KotlinEnvironment.kt b/common/src/main/kotlin/component/KotlinEnvironment.kt index ce1072a3a..5dddf648f 100644 --- a/common/src/main/kotlin/component/KotlinEnvironment.kt +++ b/common/src/main/kotlin/component/KotlinEnvironment.kt @@ -112,6 +112,11 @@ class KotlinEnvironment( put(JVMConfigurationKeys.DO_NOT_CLEAR_BINDING_CONTEXT, true) configureJdkClasspathRoots() + val jdkHome = get(JVMConfigurationKeys.JDK_HOME) + if (jdkHome == null) { + val javaHome = File(System.getProperty("java.home")) + put(JVMConfigurationKeys.JDK_HOME, javaHome) + } } } } \ No newline at end of file From 0670707950f381d3f0a7cdc854948d132e6d9d72 Mon Sep 17 00:00:00 2001 From: Margarita Bobova Date: Wed, 8 Feb 2023 10:36:16 +0100 Subject: [PATCH 04/14] Formatting --- .../compiler/server/compiler/components/KotlinToJSTranslator.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt b/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt index 3d4a0b028..2db4926a3 100644 --- a/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt +++ b/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt @@ -150,7 +150,7 @@ class KotlinToJSTranslator( val jsCode = jsCodeClass.getDeclaredField("rawJsCode").let { it.isAccessible = true it.get(jsCodeObject) as String - } + } return jsCode } } \ No newline at end of file From c5c73dfa28d1156bcd2037b494ee5191c99bb14b Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Thu, 9 Feb 2023 13:29:28 +0100 Subject: [PATCH 05/14] Fix change of name for init properties console.kt --- .../server/compiler/components/KotlinToJSTranslator.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt b/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt index 2db4926a3..a9e5d6b44 100644 --- a/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt +++ b/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt @@ -31,12 +31,12 @@ class KotlinToJSTranslator( private const val JS_CODE_FLUSH = "kotlin.kotlin.io.output.flush();\n" private const val JS_CODE_BUFFER = "\nkotlin.kotlin.io.output.buffer;\n" - private const val JS_IR_CODE_BUFFER = "moduleId.output._buffer;\n" + private const val JS_IR_CODE_BUFFER = "moduleId.output.buffer_1;\n" private val JS_IR_OUTPUT_REWRITE = """ if (kotlin.isRewrite) { - init_properties_console_kt_6h8hpf(); - output = new BufferedOutput_0() + _init_properties_console_kt__rfg7jv(); + output = new BufferedOutput() } """.trimIndent() From c24e59a76184cd3d7ac38f04112c3d0b61f35db7 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Tue, 14 Feb 2023 11:19:41 +0100 Subject: [PATCH 06/14] feat: ir ic (#604) * Enable gzip * process source module * Support IC caches * Init IC caches * Prepare IC caches and copy it inside a request --- Dockerfile | 2 + build.gradle.kts | 33 +++++- cache-preparator/build.gradle.kts | 55 +++++++++ cache-preparator/src/jsMain/kotlin/File.kt | 3 + .../kotlin/component/KotlinEnvironment.kt | 3 +- .../kotlin/KotlinEnvironmentConfiguration.kt | 3 +- settings.gradle.kts | 3 +- .../server/compiler/components/JsCompiler.kt | 104 ++++++++++++++++++ .../compiler/components/KotlinEnvironment.kt | 8 +- .../components/KotlinToJSTranslator.kt | 86 +++++++++------ .../configuration/ApplicationConfiguration.kt | 16 ++- .../compiler/server/model/bean/CachesFile.kt | 5 + src/main/resources/application.properties | 5 +- 13 files changed, 281 insertions(+), 45 deletions(-) create mode 100644 cache-preparator/build.gradle.kts create mode 100644 cache-preparator/src/jsMain/kotlin/File.kt create mode 100644 src/main/kotlin/com/compiler/server/compiler/components/JsCompiler.kt create mode 100644 src/main/kotlin/com/compiler/server/model/bean/CachesFile.kt diff --git a/Dockerfile b/Dockerfile index 11303462b..f6af34a11 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,6 +2,7 @@ FROM openjdk:11.0.16-jdk as build ENV KOTLIN_LIB=1.8.20-Beta ENV KOTLIN_LIB_JS=1.8.20-Beta-js +ENV KOTLIN_CACHES_JS=1.8.20-Beta-js-caches RUN mkdir -p /kotlin-compiler-server WORKDIR /kotlin-compiler-server @@ -20,6 +21,7 @@ COPY --from=build /build/libs/META-INF /kotlin-compiler-server/META-INF COPY --from=build /build/libs/BOOT-INF/classes /kotlin-compiler-server COPY --from=build /kotlin-compiler-server/${KOTLIN_LIB} /kotlin-compiler-server/${KOTLIN_LIB} COPY --from=build /kotlin-compiler-server/${KOTLIN_LIB_JS} /kotlin-compiler-server/${KOTLIN_LIB_JS} +COPY --from=build /kotlin-compiler-server/${KOTLIN_CACHES_JS} /kotlin-compiler-server/${KOTLIN_CACHES_JS} COPY --from=build /kotlin-compiler-server/executor.policy /kotlin-compiler-server/ COPY --from=build /kotlin-compiler-server/indexes.json /kotlin-compiler-server/ diff --git a/build.gradle.kts b/build.gradle.kts index ca2e8dfc6..a08454c0e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -25,11 +25,31 @@ val kotlinJsDependency: Configuration by configurations.creating { ) attribute( KotlinJsCompilerAttribute.jsCompilerAttribute, - KotlinJsCompilerAttribute.legacy + KotlinJsCompilerAttribute.ir ) } } + +val kotlinJsIcCache: Configuration by configurations.creating { + isTransitive = false + attributes { + attribute( + KotlinPlatformType.attribute, + KotlinPlatformType.js + ) + attribute( + KotlinJsCompilerAttribute.jsCompilerAttribute, + KotlinJsCompilerAttribute.ir + ) + attribute( + LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, + objects.named(LibraryElements::class.java, "js-ir-cache") + ) + } +} + val libJSFolder = "$kotlinVersion-js" +val libJSCachesFolder = "$kotlinVersion-js-caches" val libJVMFolder = kotlinVersion val propertyFile = "application.properties" val jacksonVersionKotlinDependencyJar = "2.14.0" // don't forget to update version in `executor.policy` file. @@ -43,6 +63,11 @@ val copyJSDependencies by tasks.creating(Copy::class) { into(libJSFolder) } +val copyJSCaches by tasks.creating(Copy::class) { + from(kotlinJsIcCache) + into(libJSCachesFolder) +} + plugins { id("org.springframework.boot") version "2.7.9" id("io.spring.dependency-management") version "1.1.0" @@ -87,6 +112,8 @@ dependencies { kotlinDependency("org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4") kotlinJsDependency("org.jetbrains.kotlin:kotlin-stdlib-js:$kotlinVersion") + kotlinJsIcCache(project(":cache-preparator")) + annotationProcessor("org.springframework:spring-context-indexer") implementation("org.springframework.boot:spring-boot-starter-web") implementation("com.amazonaws.serverless:aws-serverless-java-container-springboot2:1.9.1") @@ -131,7 +158,10 @@ fun generateProperties(prefix: String = "") = """ indexesJs.file=${prefix + indexesJs} libraries.folder.jvm=${prefix + libJVMFolder} libraries.folder.js=${prefix + libJSFolder} + caches.folder.js=${prefix + libJSCachesFolder} spring.mvc.pathmatch.matching-strategy=ant_path_matcher + server.compression.enabled=true + server.compression.mime-types=application/json """.trimIndent() tasks.withType { @@ -141,6 +171,7 @@ tasks.withType { } dependsOn(copyDependencies) dependsOn(copyJSDependencies) + dependsOn(copyJSCaches) dependsOn(":executors:jar") dependsOn(":indexation:run") buildPropertyFile() diff --git a/cache-preparator/build.gradle.kts b/cache-preparator/build.gradle.kts new file mode 100644 index 000000000..d173271a0 --- /dev/null +++ b/cache-preparator/build.gradle.kts @@ -0,0 +1,55 @@ +import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType +import org.jetbrains.kotlin.gradle.targets.js.KotlinJsCompilerAttribute +import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBinaryMode +import org.jetbrains.kotlin.gradle.targets.js.ir.JsIrBinary + +plugins { + kotlin("multiplatform") +} + +val kotlinJsDependency by rootProject.configurations + +kotlin { + js(IR) { + nodejs() + val executables = binaries.executable() + val main by compilations.getting + main.configurations.apiConfiguration.extendsFrom(kotlinJsDependency) + + val jsCaches by configurations.creating { + isVisible = false + isCanBeResolved = false + isCanBeConsumed = true + + attributes { + attribute( + KotlinPlatformType.attribute, + KotlinPlatformType.js + ) + attribute( + KotlinJsCompilerAttribute.jsCompilerAttribute, + KotlinJsCompilerAttribute.ir + ) + attribute( + LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, + objects.named(LibraryElements::class.java, "js-ir-cache") + ) + } + } + + val linkTask = executables + .filterIsInstance() + .single { it.mode == KotlinJsBinaryMode.DEVELOPMENT } + .linkTask + + val rootCacheDir = linkTask + .map { it.rootCacheDirectory } + + artifacts.add(jsCaches.name, rootCacheDir) { + builtBy(linkTask) + } + } +} + +// just to calm down root project's allprojects block +configurations.register("implementation") \ No newline at end of file diff --git a/cache-preparator/src/jsMain/kotlin/File.kt b/cache-preparator/src/jsMain/kotlin/File.kt new file mode 100644 index 000000000..222d270e8 --- /dev/null +++ b/cache-preparator/src/jsMain/kotlin/File.kt @@ -0,0 +1,3 @@ +fun main() { + println("Hello, world") +} \ No newline at end of file diff --git a/common/src/main/kotlin/component/KotlinEnvironment.kt b/common/src/main/kotlin/component/KotlinEnvironment.kt index 5dddf648f..2989eaa86 100644 --- a/common/src/main/kotlin/component/KotlinEnvironment.kt +++ b/common/src/main/kotlin/component/KotlinEnvironment.kt @@ -28,7 +28,8 @@ import java.io.File class KotlinEnvironment( val classpath: List, - additionalJsClasspath: List + additionalJsClasspath: List, + val cachesJsDir: File ) { companion object { /** diff --git a/indexation/src/main/kotlin/KotlinEnvironmentConfiguration.kt b/indexation/src/main/kotlin/KotlinEnvironmentConfiguration.kt index cff2374ad..d355434ef 100644 --- a/indexation/src/main/kotlin/KotlinEnvironmentConfiguration.kt +++ b/indexation/src/main/kotlin/KotlinEnvironmentConfiguration.kt @@ -7,6 +7,7 @@ class KotlinEnvironmentConfiguration(fileName: String) { val kotlinEnvironment = run { val jvmFile = File(fileName) val jsFile = File("$fileName-js") + val cachesJsDir = File("$fileName-js-caches") val classPath = listOfNotNull(jvmFile) .flatMap { @@ -15,6 +16,6 @@ class KotlinEnvironmentConfiguration(fileName: String) { } val additionalJsClasspath = listOfNotNull(jsFile) - KotlinEnvironment(classPath, additionalJsClasspath) + KotlinEnvironment(classPath, additionalJsClasspath, cachesJsDir) } } diff --git a/settings.gradle.kts b/settings.gradle.kts index 506057a4c..ca96936db 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,4 +1,5 @@ rootProject.name = "kotlin-compiler-server" include(":executors") include(":indexation") -include(":common") \ No newline at end of file +include(":common") +include(":cache-preparator") \ No newline at end of file diff --git a/src/main/kotlin/com/compiler/server/compiler/components/JsCompiler.kt b/src/main/kotlin/com/compiler/server/compiler/components/JsCompiler.kt new file mode 100644 index 000000000..46abbee7d --- /dev/null +++ b/src/main/kotlin/com/compiler/server/compiler/components/JsCompiler.kt @@ -0,0 +1,104 @@ +package com.compiler.server.compiler.components + +import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport +import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity +import org.jetbrains.kotlin.cli.common.messages.MessageCollector +import org.jetbrains.kotlin.cli.js.klib.generateIrForKlibSerialization +import org.jetbrains.kotlin.config.CompilerConfiguration +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.ir.backend.js.* +import org.jetbrains.kotlin.ir.backend.js.codegen.JsGenerationGranularity +import org.jetbrains.kotlin.ir.backend.js.ic.CacheUpdater +import org.jetbrains.kotlin.ir.backend.js.ic.DirtyFileState +import org.jetbrains.kotlin.ir.backend.js.ic.ModuleArtifact +import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl +import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImplForJsIC +import org.jetbrains.kotlin.ir.symbols.IrSymbol +import org.jetbrains.kotlin.psi.KtFile +import java.io.File + +// copy from compiler private funs + +fun processSourceModule( + project: Project, + files: List, + libraries: List, + friendLibraries: List, + configuration: CompilerConfiguration, + outputKlibPath: String +): ModulesStructure { + val sourceModule: ModulesStructure = prepareAnalyzedSourceModule( + project, + files, + configuration, + libraries, + friendLibraries, + AnalyzerWithCompilerReport(configuration) + ) + + val moduleSourceFiles = (sourceModule.mainModule as MainModule.SourceFiles).files + val expectDescriptorToSymbol = mutableMapOf() + + val (moduleFragment, _) = generateIrForKlibSerialization( + project, + moduleSourceFiles, + configuration, + sourceModule.jsFrontEndResult.jsAnalysisResult, + sourceModule.allDependencies.map { it.library }, + emptyList(), + expectDescriptorToSymbol, + IrFactoryImpl, + verifySignatures = true + ) { + sourceModule.getModuleDescriptor(it) + } + + val metadataSerializer = + KlibMetadataIncrementalSerializer( + configuration, + sourceModule.project, + sourceModule.jsFrontEndResult.hasErrors + ) + + generateKLib( + sourceModule, + outputKlibPath, + nopack = true, + jsOutputName = null, + icData = emptyList(), + expectDescriptorToSymbol = expectDescriptorToSymbol, + moduleFragment = moduleFragment + ) { file -> + metadataSerializer.serializeScope(file, sourceModule.jsFrontEndResult.bindingContext, moduleFragment.descriptor) + } + return sourceModule +} + +fun prepareIcCaches( + includes: String, + cacheDirectory: String, + libraries: List, + friendLibraries: List, + configurationJs: CompilerConfiguration, +): List { + val cacheUpdater = CacheUpdater( + mainModule = includes, + allModules = libraries, + mainModuleFriends = friendLibraries, + cacheDir = cacheDirectory, + compilerConfiguration = configurationJs, + irFactory = { IrFactoryImplForJsIC(WholeWorldStageController()) }, + mainArguments = emptyList(), + compilerInterfaceFactory = { mainModule, cfg -> + JsIrCompilerWithIC( + mainModule, + cfg, + JsGenerationGranularity.WHOLE_PROGRAM, + es6mode = false + ) + } + ) + + return cacheUpdater.actualizeCaches() +} \ No newline at end of file diff --git a/src/main/kotlin/com/compiler/server/compiler/components/KotlinEnvironment.kt b/src/main/kotlin/com/compiler/server/compiler/components/KotlinEnvironment.kt index e450e73a9..55723f3e7 100644 --- a/src/main/kotlin/com/compiler/server/compiler/components/KotlinEnvironment.kt +++ b/src/main/kotlin/com/compiler/server/compiler/components/KotlinEnvironment.kt @@ -1,12 +1,16 @@ package com.compiler.server.compiler.components +import com.compiler.server.model.bean.CachesFile import com.compiler.server.model.bean.LibrariesFile import component.KotlinEnvironment import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration @Configuration -class KotlinEnvironmentConfiguration(val librariesFile: LibrariesFile) { +class KotlinEnvironmentConfiguration( + val librariesFile: LibrariesFile, + val cachesFiles: CachesFile +) { @Bean fun kotlinEnvironment(): KotlinEnvironment { val classPath = @@ -17,6 +21,6 @@ class KotlinEnvironmentConfiguration(val librariesFile: LibrariesFile) { } val additionalJsClasspath = listOfNotNull(librariesFile.js) - return KotlinEnvironment(classPath, additionalJsClasspath) + return KotlinEnvironment(classPath, additionalJsClasspath, cachesFiles.js) } } diff --git a/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt b/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt index a9e5d6b44..66493cd10 100644 --- a/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt +++ b/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt @@ -4,15 +4,11 @@ import com.compiler.server.model.ErrorDescriptor import com.compiler.server.model.TranslationJSResult import com.compiler.server.model.toExceptionDescriptor import component.KotlinEnvironment -import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment -import org.jetbrains.kotlin.ir.backend.js.CompilerResult -import org.jetbrains.kotlin.ir.backend.js.WholeWorldStageController -import org.jetbrains.kotlin.ir.backend.js.compile -import org.jetbrains.kotlin.ir.backend.js.prepareAnalyzedSourceModule -import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformer -import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.TranslationMode -import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImplForJsIC +import org.jetbrains.kotlin.ir.backend.js.* +import org.jetbrains.kotlin.ir.backend.js.ic.JsExecutableProducer +import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.CompilationOutputs +import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.CompilationOutputsBuilt import org.jetbrains.kotlin.js.config.JsConfig import org.jetbrains.kotlin.js.facade.K2JSTranslator import org.jetbrains.kotlin.js.facade.MainCallParameters @@ -20,7 +16,11 @@ import org.jetbrains.kotlin.js.facade.TranslationResult import org.jetbrains.kotlin.js.facade.exceptions.TranslationException import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.CompilerEnvironment +import org.jetbrains.kotlin.serialization.js.ModuleKind import org.springframework.stereotype.Service +import kotlin.io.path.absolutePathString +import kotlin.io.path.createTempDirectory +import kotlin.io.path.deleteRecursively @Service class KotlinToJSTranslator( @@ -104,33 +104,47 @@ class KotlinToJSTranslator( arguments: List, coreEnvironment: KotlinCoreEnvironment ): TranslationJSResult { - val currentProject = coreEnvironment.project - - val sourceModule = prepareAnalyzedSourceModule( - currentProject, - files, - kotlinEnvironment.jsConfiguration, - kotlinEnvironment.JS_LIBRARIES, - friendDependencies = emptyList(), - analyzer = AnalyzerWithCompilerReport(kotlinEnvironment.jsConfiguration), - ) - val ir = compile( - sourceModule, - kotlinEnvironment.jsIrPhaseConfig, - irFactory = IrFactoryImplForJsIC(WholeWorldStageController()) - ) - val transformer = IrModuleToJsTransformer( - ir.context, - arguments - ) - - val compiledModule: CompilerResult = transformer.generateModule( - modules = ir.allModules, - modes = setOf(TranslationMode.FULL_DEV), - relativeRequirePath = false - ) + val tmpDir = createTempDirectory() + val mainKlib = tmpDir.resolve("main").normalize().absolutePathString() + + val cachesDir = tmpDir.resolve("caches").normalize() + val caches = cachesDir.absolutePathString() + + kotlinEnvironment.cachesJsDir.copyRecursively(cachesDir.toFile()) + + val outputs = try { + processSourceModule( + coreEnvironment.project, + files, + kotlinEnvironment.JS_LIBRARIES, + friendLibraries = emptyList(), + kotlinEnvironment.jsConfiguration, + mainKlib + ) + + val icCaches = prepareIcCaches( + includes = mainKlib, + cacheDirectory = caches, + libraries = kotlinEnvironment.JS_LIBRARIES + mainKlib, + friendLibraries = emptyList(), + configurationJs = kotlinEnvironment.jsConfiguration, + ) + + val jsExecutableProducer = JsExecutableProducer( + mainModuleName = "moduleId", + moduleKind = ModuleKind.PLAIN, + sourceMapsInfo = null, + caches = icCaches, + relativeRequirePath = true + ) + + val (outputs, _) = jsExecutableProducer.buildExecutable(multiModule = false, outJsProgram = false) + outputs + } finally { + tmpDir.normalize().toAbsolutePath().toFile().deleteRecursively() + } - val jsCode = getJsCodeFromModule(compiledModule) + val jsCode = getJsCodeFromOutputs(outputs) val listLines = jsCode .lineSequence() @@ -143,8 +157,8 @@ class KotlinToJSTranslator( return TranslationJSResult(listLines.joinToString("\n")) } - private fun getJsCodeFromModule(compiledModule: CompilerResult): String { - val jsCodeObject = compiledModule.outputs.values.single() + private fun getJsCodeFromOutputs(outputs: CompilationOutputs): String { + val jsCodeObject = (outputs as CompilationOutputsBuilt) val jsCodeClass = jsCodeObject.javaClass val jsCode = jsCodeClass.getDeclaredField("rawJsCode").let { diff --git a/src/main/kotlin/com/compiler/server/configuration/ApplicationConfiguration.kt b/src/main/kotlin/com/compiler/server/configuration/ApplicationConfiguration.kt index d0b87ffce..4b2c0e1b3 100644 --- a/src/main/kotlin/com/compiler/server/configuration/ApplicationConfiguration.kt +++ b/src/main/kotlin/com/compiler/server/configuration/ApplicationConfiguration.kt @@ -1,5 +1,6 @@ package com.compiler.server.configuration +import com.compiler.server.model.bean.CachesFile import com.compiler.server.model.bean.LibrariesFile import com.compiler.server.model.bean.VersionInfo import org.springframework.beans.factory.annotation.Value @@ -12,10 +13,11 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer import java.io.File @Configuration -@EnableConfigurationProperties(value = [LibrariesFolderProperties::class]) +@EnableConfigurationProperties(value = [LibrariesFolderProperties::class, CachesFolderProperties::class]) class ApplicationConfiguration( @Value("\${kotlin.version}") private val version: String, - private val librariesFolderProperties: LibrariesFolderProperties + private val librariesFolderProperties: LibrariesFolderProperties, + private val cachesFolderProperties: LibrariesFolderProperties ) : WebMvcConfigurer { override fun addFormatters(registry: FormatterRegistry) { registry.addConverter(ProjectConverter()) @@ -32,10 +34,20 @@ class ApplicationConfiguration( File(librariesFolderProperties.jvm), File(librariesFolderProperties.js) ) + + @Bean + fun cachesFiles() = CachesFile( + File(cachesFolderProperties.js) + ) } @ConfigurationProperties(prefix = "libraries.folder") class LibrariesFolderProperties { lateinit var jvm: String lateinit var js: String +} + +@ConfigurationProperties(prefix = "caches.folder") +class CachesFolderProperties { + lateinit var js: String } \ No newline at end of file diff --git a/src/main/kotlin/com/compiler/server/model/bean/CachesFile.kt b/src/main/kotlin/com/compiler/server/model/bean/CachesFile.kt new file mode 100644 index 000000000..a64b8ba00 --- /dev/null +++ b/src/main/kotlin/com/compiler/server/model/bean/CachesFile.kt @@ -0,0 +1,5 @@ +package com.compiler.server.model.bean + +import java.io.File + +class CachesFile(val js: File) \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index fb0a07768..f2df66764 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -5,4 +5,7 @@ indexes.file=indexes.json indexesJs.file=indexesJs.json libraries.folder.jvm=1.8.20-Beta libraries.folder.js=1.8.20-Beta-js -spring.mvc.pathmatch.matching-strategy=ant_path_matcher \ No newline at end of file +caches.folder.js=1.8.20-Beta-js-caches +spring.mvc.pathmatch.matching-strategy=ant_path_matcher +server.compression.enabled=true +server.compression.mime-types=application/json \ No newline at end of file From 3f41c3c5fe9238fe3e24eaf776c629fbb5c03f5f Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Thu, 23 Feb 2023 16:25:16 +0100 Subject: [PATCH 07/14] Fix main call arguments for JS IR with incremental compilation --- .../com/compiler/server/compiler/components/JsCompiler.kt | 3 ++- .../server/compiler/components/KotlinToJSTranslator.kt | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/com/compiler/server/compiler/components/JsCompiler.kt b/src/main/kotlin/com/compiler/server/compiler/components/JsCompiler.kt index 46abbee7d..1a5b1e496 100644 --- a/src/main/kotlin/com/compiler/server/compiler/components/JsCompiler.kt +++ b/src/main/kotlin/com/compiler/server/compiler/components/JsCompiler.kt @@ -80,6 +80,7 @@ fun prepareIcCaches( cacheDirectory: String, libraries: List, friendLibraries: List, + mainCallArgs: List, configurationJs: CompilerConfiguration, ): List { val cacheUpdater = CacheUpdater( @@ -89,7 +90,7 @@ fun prepareIcCaches( cacheDir = cacheDirectory, compilerConfiguration = configurationJs, irFactory = { IrFactoryImplForJsIC(WholeWorldStageController()) }, - mainArguments = emptyList(), + mainArguments = mainCallArgs, compilerInterfaceFactory = { mainModule, cfg -> JsIrCompilerWithIC( mainModule, diff --git a/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt b/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt index 66493cd10..a6075fd5a 100644 --- a/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt +++ b/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt @@ -127,6 +127,7 @@ class KotlinToJSTranslator( cacheDirectory = caches, libraries = kotlinEnvironment.JS_LIBRARIES + mainKlib, friendLibraries = emptyList(), + mainCallArgs = arguments, configurationJs = kotlinEnvironment.jsConfiguration, ) From 03fc312afb671562e079d41ddf65c1dbc010d09e Mon Sep 17 00:00:00 2001 From: Margarita Bobova Date: Mon, 27 Feb 2023 17:43:11 +0100 Subject: [PATCH 08/14] chore(release): add kotlin 1.8.20-RC --- Dockerfile | 6 +++--- build.gradle.kts | 4 ++-- gradle.properties | 4 ++-- src/main/resources/application.properties | 8 ++++---- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Dockerfile b/Dockerfile index f6af34a11..20c53f28a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,8 @@ FROM openjdk:11.0.16-jdk as build -ENV KOTLIN_LIB=1.8.20-Beta -ENV KOTLIN_LIB_JS=1.8.20-Beta-js -ENV KOTLIN_CACHES_JS=1.8.20-Beta-js-caches +ENV KOTLIN_LIB=1.8.20-RC +ENV KOTLIN_LIB_JS=1.8.20-RC-js +ENV KOTLIN_CACHES_JS=1.8.20-RC-js-caches RUN mkdir -p /kotlin-compiler-server WORKDIR /kotlin-compiler-server diff --git a/build.gradle.kts b/build.gradle.kts index a08454c0e..bf9e02c12 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -71,8 +71,8 @@ val copyJSCaches by tasks.creating(Copy::class) { plugins { id("org.springframework.boot") version "2.7.9" id("io.spring.dependency-management") version "1.1.0" - kotlin("jvm") version "1.8.20-Beta" - kotlin("plugin.spring") version "1.8.20-Beta" + kotlin("jvm") version "1.8.20-RC" + kotlin("plugin.spring") version "1.8.20-RC" } allprojects { diff --git a/gradle.properties b/gradle.properties index db698598c..5b0b300ba 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ -systemProp.kotlinVersion=1.8.20-Beta -systemProp.kotlinIdeVersion=1.8.20-Beta-release-162 +systemProp.kotlinVersion=1.8.20-RC +systemProp.kotlinIdeVersion=1.8.20-RC-release-288 systemProp.policy=executor.policy systemProp.indexes=indexes.json systemProp.indexesJs=indexesJs.json diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index f2df66764..765714b85 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,11 +1,11 @@ # this file is autogenerated by build.gradle.kts -kotlin.version=1.8.20-Beta +kotlin.version=1.8.20-RC policy.file=executor.policy indexes.file=indexes.json indexesJs.file=indexesJs.json -libraries.folder.jvm=1.8.20-Beta -libraries.folder.js=1.8.20-Beta-js -caches.folder.js=1.8.20-Beta-js-caches +libraries.folder.jvm=1.8.20-RC +libraries.folder.js=1.8.20-RC-js +caches.folder.js=1.8.20-RC-js-caches spring.mvc.pathmatch.matching-strategy=ant_path_matcher server.compression.enabled=true server.compression.mime-types=application/json \ No newline at end of file From 1fb89a07b5b38b5df14907f91d87ce32acbfac7a Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Mon, 13 Mar 2023 17:45:30 +0100 Subject: [PATCH 09/14] Add js caches to buildLambda --- build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle.kts b/build.gradle.kts index bf9e02c12..9663b3c13 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -194,6 +194,7 @@ val buildLambda by tasks.creating(Zip::class) { from(indexes) from(indexesJs) from(libJSFolder) { into(libJSFolder) } + from(libJSCachesFolder) { into(libJSCachesFolder) } from(libJVMFolder) { into(libJVMFolder) } into("lib") { from(configurations.compileClasspath) { exclude("tomcat-embed-*") } From 7adb1fd3a123e993fd8f7c0c641e9029ceb23e6b Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Tue, 14 Mar 2023 12:08:43 +0100 Subject: [PATCH 10/14] Revert "Add js caches to buildLambda" This reverts commit e0c64d45152e185de8faeb2fcf8690797d41b5c7. --- build.gradle.kts | 1 - 1 file changed, 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 9663b3c13..bf9e02c12 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -194,7 +194,6 @@ val buildLambda by tasks.creating(Zip::class) { from(indexes) from(indexesJs) from(libJSFolder) { into(libJSFolder) } - from(libJSCachesFolder) { into(libJSCachesFolder) } from(libJVMFolder) { into(libJVMFolder) } into("lib") { from(configurations.compileClasspath) { exclude("tomcat-embed-*") } From 28e6f56c0e024ffb08eba4652d232cc32d832acc Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Tue, 14 Mar 2023 12:08:43 +0100 Subject: [PATCH 11/14] Revert "Fix main call arguments for JS IR with incremental compilation" This reverts commit e8109a1a2ae11a7849d0ba9adaa6fc2732643e4e. --- .../com/compiler/server/compiler/components/JsCompiler.kt | 3 +-- .../server/compiler/components/KotlinToJSTranslator.kt | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/kotlin/com/compiler/server/compiler/components/JsCompiler.kt b/src/main/kotlin/com/compiler/server/compiler/components/JsCompiler.kt index 1a5b1e496..46abbee7d 100644 --- a/src/main/kotlin/com/compiler/server/compiler/components/JsCompiler.kt +++ b/src/main/kotlin/com/compiler/server/compiler/components/JsCompiler.kt @@ -80,7 +80,6 @@ fun prepareIcCaches( cacheDirectory: String, libraries: List, friendLibraries: List, - mainCallArgs: List, configurationJs: CompilerConfiguration, ): List { val cacheUpdater = CacheUpdater( @@ -90,7 +89,7 @@ fun prepareIcCaches( cacheDir = cacheDirectory, compilerConfiguration = configurationJs, irFactory = { IrFactoryImplForJsIC(WholeWorldStageController()) }, - mainArguments = mainCallArgs, + mainArguments = emptyList(), compilerInterfaceFactory = { mainModule, cfg -> JsIrCompilerWithIC( mainModule, diff --git a/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt b/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt index a6075fd5a..66493cd10 100644 --- a/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt +++ b/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt @@ -127,7 +127,6 @@ class KotlinToJSTranslator( cacheDirectory = caches, libraries = kotlinEnvironment.JS_LIBRARIES + mainKlib, friendLibraries = emptyList(), - mainCallArgs = arguments, configurationJs = kotlinEnvironment.jsConfiguration, ) From 5cb463c715d5d47343e065bd0370715c04905ef5 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Tue, 14 Mar 2023 12:09:26 +0100 Subject: [PATCH 12/14] Revert "feat: ir ic (#604)" This reverts commit dc4983e1 --- Dockerfile | 2 - build.gradle.kts | 31 ------ cache-preparator/build.gradle.kts | 55 --------- cache-preparator/src/jsMain/kotlin/File.kt | 3 - .../kotlin/component/KotlinEnvironment.kt | 3 +- .../kotlin/KotlinEnvironmentConfiguration.kt | 3 +- settings.gradle.kts | 3 +- .../server/compiler/components/JsCompiler.kt | 104 ------------------ .../compiler/components/KotlinEnvironment.kt | 8 +- .../components/KotlinToJSTranslator.kt | 86 ++++++--------- .../configuration/ApplicationConfiguration.kt | 16 +-- .../compiler/server/model/bean/CachesFile.kt | 5 - src/main/resources/application.properties | 5 +- 13 files changed, 44 insertions(+), 280 deletions(-) delete mode 100644 cache-preparator/build.gradle.kts delete mode 100644 cache-preparator/src/jsMain/kotlin/File.kt delete mode 100644 src/main/kotlin/com/compiler/server/compiler/components/JsCompiler.kt delete mode 100644 src/main/kotlin/com/compiler/server/model/bean/CachesFile.kt diff --git a/Dockerfile b/Dockerfile index 20c53f28a..566c3afdb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,6 @@ FROM openjdk:11.0.16-jdk as build ENV KOTLIN_LIB=1.8.20-RC ENV KOTLIN_LIB_JS=1.8.20-RC-js -ENV KOTLIN_CACHES_JS=1.8.20-RC-js-caches RUN mkdir -p /kotlin-compiler-server WORKDIR /kotlin-compiler-server @@ -21,7 +20,6 @@ COPY --from=build /build/libs/META-INF /kotlin-compiler-server/META-INF COPY --from=build /build/libs/BOOT-INF/classes /kotlin-compiler-server COPY --from=build /kotlin-compiler-server/${KOTLIN_LIB} /kotlin-compiler-server/${KOTLIN_LIB} COPY --from=build /kotlin-compiler-server/${KOTLIN_LIB_JS} /kotlin-compiler-server/${KOTLIN_LIB_JS} -COPY --from=build /kotlin-compiler-server/${KOTLIN_CACHES_JS} /kotlin-compiler-server/${KOTLIN_CACHES_JS} COPY --from=build /kotlin-compiler-server/executor.policy /kotlin-compiler-server/ COPY --from=build /kotlin-compiler-server/indexes.json /kotlin-compiler-server/ diff --git a/build.gradle.kts b/build.gradle.kts index bf9e02c12..e2f88fd7f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -29,27 +29,7 @@ val kotlinJsDependency: Configuration by configurations.creating { ) } } - -val kotlinJsIcCache: Configuration by configurations.creating { - isTransitive = false - attributes { - attribute( - KotlinPlatformType.attribute, - KotlinPlatformType.js - ) - attribute( - KotlinJsCompilerAttribute.jsCompilerAttribute, - KotlinJsCompilerAttribute.ir - ) - attribute( - LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, - objects.named(LibraryElements::class.java, "js-ir-cache") - ) - } -} - val libJSFolder = "$kotlinVersion-js" -val libJSCachesFolder = "$kotlinVersion-js-caches" val libJVMFolder = kotlinVersion val propertyFile = "application.properties" val jacksonVersionKotlinDependencyJar = "2.14.0" // don't forget to update version in `executor.policy` file. @@ -63,11 +43,6 @@ val copyJSDependencies by tasks.creating(Copy::class) { into(libJSFolder) } -val copyJSCaches by tasks.creating(Copy::class) { - from(kotlinJsIcCache) - into(libJSCachesFolder) -} - plugins { id("org.springframework.boot") version "2.7.9" id("io.spring.dependency-management") version "1.1.0" @@ -112,8 +87,6 @@ dependencies { kotlinDependency("org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4") kotlinJsDependency("org.jetbrains.kotlin:kotlin-stdlib-js:$kotlinVersion") - kotlinJsIcCache(project(":cache-preparator")) - annotationProcessor("org.springframework:spring-context-indexer") implementation("org.springframework.boot:spring-boot-starter-web") implementation("com.amazonaws.serverless:aws-serverless-java-container-springboot2:1.9.1") @@ -158,10 +131,7 @@ fun generateProperties(prefix: String = "") = """ indexesJs.file=${prefix + indexesJs} libraries.folder.jvm=${prefix + libJVMFolder} libraries.folder.js=${prefix + libJSFolder} - caches.folder.js=${prefix + libJSCachesFolder} spring.mvc.pathmatch.matching-strategy=ant_path_matcher - server.compression.enabled=true - server.compression.mime-types=application/json """.trimIndent() tasks.withType { @@ -171,7 +141,6 @@ tasks.withType { } dependsOn(copyDependencies) dependsOn(copyJSDependencies) - dependsOn(copyJSCaches) dependsOn(":executors:jar") dependsOn(":indexation:run") buildPropertyFile() diff --git a/cache-preparator/build.gradle.kts b/cache-preparator/build.gradle.kts deleted file mode 100644 index d173271a0..000000000 --- a/cache-preparator/build.gradle.kts +++ /dev/null @@ -1,55 +0,0 @@ -import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType -import org.jetbrains.kotlin.gradle.targets.js.KotlinJsCompilerAttribute -import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBinaryMode -import org.jetbrains.kotlin.gradle.targets.js.ir.JsIrBinary - -plugins { - kotlin("multiplatform") -} - -val kotlinJsDependency by rootProject.configurations - -kotlin { - js(IR) { - nodejs() - val executables = binaries.executable() - val main by compilations.getting - main.configurations.apiConfiguration.extendsFrom(kotlinJsDependency) - - val jsCaches by configurations.creating { - isVisible = false - isCanBeResolved = false - isCanBeConsumed = true - - attributes { - attribute( - KotlinPlatformType.attribute, - KotlinPlatformType.js - ) - attribute( - KotlinJsCompilerAttribute.jsCompilerAttribute, - KotlinJsCompilerAttribute.ir - ) - attribute( - LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, - objects.named(LibraryElements::class.java, "js-ir-cache") - ) - } - } - - val linkTask = executables - .filterIsInstance() - .single { it.mode == KotlinJsBinaryMode.DEVELOPMENT } - .linkTask - - val rootCacheDir = linkTask - .map { it.rootCacheDirectory } - - artifacts.add(jsCaches.name, rootCacheDir) { - builtBy(linkTask) - } - } -} - -// just to calm down root project's allprojects block -configurations.register("implementation") \ No newline at end of file diff --git a/cache-preparator/src/jsMain/kotlin/File.kt b/cache-preparator/src/jsMain/kotlin/File.kt deleted file mode 100644 index 222d270e8..000000000 --- a/cache-preparator/src/jsMain/kotlin/File.kt +++ /dev/null @@ -1,3 +0,0 @@ -fun main() { - println("Hello, world") -} \ No newline at end of file diff --git a/common/src/main/kotlin/component/KotlinEnvironment.kt b/common/src/main/kotlin/component/KotlinEnvironment.kt index 2989eaa86..5dddf648f 100644 --- a/common/src/main/kotlin/component/KotlinEnvironment.kt +++ b/common/src/main/kotlin/component/KotlinEnvironment.kt @@ -28,8 +28,7 @@ import java.io.File class KotlinEnvironment( val classpath: List, - additionalJsClasspath: List, - val cachesJsDir: File + additionalJsClasspath: List ) { companion object { /** diff --git a/indexation/src/main/kotlin/KotlinEnvironmentConfiguration.kt b/indexation/src/main/kotlin/KotlinEnvironmentConfiguration.kt index d355434ef..cff2374ad 100644 --- a/indexation/src/main/kotlin/KotlinEnvironmentConfiguration.kt +++ b/indexation/src/main/kotlin/KotlinEnvironmentConfiguration.kt @@ -7,7 +7,6 @@ class KotlinEnvironmentConfiguration(fileName: String) { val kotlinEnvironment = run { val jvmFile = File(fileName) val jsFile = File("$fileName-js") - val cachesJsDir = File("$fileName-js-caches") val classPath = listOfNotNull(jvmFile) .flatMap { @@ -16,6 +15,6 @@ class KotlinEnvironmentConfiguration(fileName: String) { } val additionalJsClasspath = listOfNotNull(jsFile) - KotlinEnvironment(classPath, additionalJsClasspath, cachesJsDir) + KotlinEnvironment(classPath, additionalJsClasspath) } } diff --git a/settings.gradle.kts b/settings.gradle.kts index ca96936db..506057a4c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,5 +1,4 @@ rootProject.name = "kotlin-compiler-server" include(":executors") include(":indexation") -include(":common") -include(":cache-preparator") \ No newline at end of file +include(":common") \ No newline at end of file diff --git a/src/main/kotlin/com/compiler/server/compiler/components/JsCompiler.kt b/src/main/kotlin/com/compiler/server/compiler/components/JsCompiler.kt deleted file mode 100644 index 46abbee7d..000000000 --- a/src/main/kotlin/com/compiler/server/compiler/components/JsCompiler.kt +++ /dev/null @@ -1,104 +0,0 @@ -package com.compiler.server.compiler.components - -import com.intellij.openapi.project.Project -import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport -import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity -import org.jetbrains.kotlin.cli.common.messages.MessageCollector -import org.jetbrains.kotlin.cli.js.klib.generateIrForKlibSerialization -import org.jetbrains.kotlin.config.CompilerConfiguration -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import org.jetbrains.kotlin.ir.backend.js.* -import org.jetbrains.kotlin.ir.backend.js.codegen.JsGenerationGranularity -import org.jetbrains.kotlin.ir.backend.js.ic.CacheUpdater -import org.jetbrains.kotlin.ir.backend.js.ic.DirtyFileState -import org.jetbrains.kotlin.ir.backend.js.ic.ModuleArtifact -import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl -import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImplForJsIC -import org.jetbrains.kotlin.ir.symbols.IrSymbol -import org.jetbrains.kotlin.psi.KtFile -import java.io.File - -// copy from compiler private funs - -fun processSourceModule( - project: Project, - files: List, - libraries: List, - friendLibraries: List, - configuration: CompilerConfiguration, - outputKlibPath: String -): ModulesStructure { - val sourceModule: ModulesStructure = prepareAnalyzedSourceModule( - project, - files, - configuration, - libraries, - friendLibraries, - AnalyzerWithCompilerReport(configuration) - ) - - val moduleSourceFiles = (sourceModule.mainModule as MainModule.SourceFiles).files - val expectDescriptorToSymbol = mutableMapOf() - - val (moduleFragment, _) = generateIrForKlibSerialization( - project, - moduleSourceFiles, - configuration, - sourceModule.jsFrontEndResult.jsAnalysisResult, - sourceModule.allDependencies.map { it.library }, - emptyList(), - expectDescriptorToSymbol, - IrFactoryImpl, - verifySignatures = true - ) { - sourceModule.getModuleDescriptor(it) - } - - val metadataSerializer = - KlibMetadataIncrementalSerializer( - configuration, - sourceModule.project, - sourceModule.jsFrontEndResult.hasErrors - ) - - generateKLib( - sourceModule, - outputKlibPath, - nopack = true, - jsOutputName = null, - icData = emptyList(), - expectDescriptorToSymbol = expectDescriptorToSymbol, - moduleFragment = moduleFragment - ) { file -> - metadataSerializer.serializeScope(file, sourceModule.jsFrontEndResult.bindingContext, moduleFragment.descriptor) - } - return sourceModule -} - -fun prepareIcCaches( - includes: String, - cacheDirectory: String, - libraries: List, - friendLibraries: List, - configurationJs: CompilerConfiguration, -): List { - val cacheUpdater = CacheUpdater( - mainModule = includes, - allModules = libraries, - mainModuleFriends = friendLibraries, - cacheDir = cacheDirectory, - compilerConfiguration = configurationJs, - irFactory = { IrFactoryImplForJsIC(WholeWorldStageController()) }, - mainArguments = emptyList(), - compilerInterfaceFactory = { mainModule, cfg -> - JsIrCompilerWithIC( - mainModule, - cfg, - JsGenerationGranularity.WHOLE_PROGRAM, - es6mode = false - ) - } - ) - - return cacheUpdater.actualizeCaches() -} \ No newline at end of file diff --git a/src/main/kotlin/com/compiler/server/compiler/components/KotlinEnvironment.kt b/src/main/kotlin/com/compiler/server/compiler/components/KotlinEnvironment.kt index 55723f3e7..e450e73a9 100644 --- a/src/main/kotlin/com/compiler/server/compiler/components/KotlinEnvironment.kt +++ b/src/main/kotlin/com/compiler/server/compiler/components/KotlinEnvironment.kt @@ -1,16 +1,12 @@ package com.compiler.server.compiler.components -import com.compiler.server.model.bean.CachesFile import com.compiler.server.model.bean.LibrariesFile import component.KotlinEnvironment import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration @Configuration -class KotlinEnvironmentConfiguration( - val librariesFile: LibrariesFile, - val cachesFiles: CachesFile -) { +class KotlinEnvironmentConfiguration(val librariesFile: LibrariesFile) { @Bean fun kotlinEnvironment(): KotlinEnvironment { val classPath = @@ -21,6 +17,6 @@ class KotlinEnvironmentConfiguration( } val additionalJsClasspath = listOfNotNull(librariesFile.js) - return KotlinEnvironment(classPath, additionalJsClasspath, cachesFiles.js) + return KotlinEnvironment(classPath, additionalJsClasspath) } } diff --git a/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt b/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt index 66493cd10..a9e5d6b44 100644 --- a/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt +++ b/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt @@ -4,11 +4,15 @@ import com.compiler.server.model.ErrorDescriptor import com.compiler.server.model.TranslationJSResult import com.compiler.server.model.toExceptionDescriptor import component.KotlinEnvironment +import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment -import org.jetbrains.kotlin.ir.backend.js.* -import org.jetbrains.kotlin.ir.backend.js.ic.JsExecutableProducer -import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.CompilationOutputs -import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.CompilationOutputsBuilt +import org.jetbrains.kotlin.ir.backend.js.CompilerResult +import org.jetbrains.kotlin.ir.backend.js.WholeWorldStageController +import org.jetbrains.kotlin.ir.backend.js.compile +import org.jetbrains.kotlin.ir.backend.js.prepareAnalyzedSourceModule +import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformer +import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.TranslationMode +import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImplForJsIC import org.jetbrains.kotlin.js.config.JsConfig import org.jetbrains.kotlin.js.facade.K2JSTranslator import org.jetbrains.kotlin.js.facade.MainCallParameters @@ -16,11 +20,7 @@ import org.jetbrains.kotlin.js.facade.TranslationResult import org.jetbrains.kotlin.js.facade.exceptions.TranslationException import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.CompilerEnvironment -import org.jetbrains.kotlin.serialization.js.ModuleKind import org.springframework.stereotype.Service -import kotlin.io.path.absolutePathString -import kotlin.io.path.createTempDirectory -import kotlin.io.path.deleteRecursively @Service class KotlinToJSTranslator( @@ -104,47 +104,33 @@ class KotlinToJSTranslator( arguments: List, coreEnvironment: KotlinCoreEnvironment ): TranslationJSResult { - val tmpDir = createTempDirectory() - val mainKlib = tmpDir.resolve("main").normalize().absolutePathString() - - val cachesDir = tmpDir.resolve("caches").normalize() - val caches = cachesDir.absolutePathString() - - kotlinEnvironment.cachesJsDir.copyRecursively(cachesDir.toFile()) - - val outputs = try { - processSourceModule( - coreEnvironment.project, - files, - kotlinEnvironment.JS_LIBRARIES, - friendLibraries = emptyList(), - kotlinEnvironment.jsConfiguration, - mainKlib - ) - - val icCaches = prepareIcCaches( - includes = mainKlib, - cacheDirectory = caches, - libraries = kotlinEnvironment.JS_LIBRARIES + mainKlib, - friendLibraries = emptyList(), - configurationJs = kotlinEnvironment.jsConfiguration, - ) - - val jsExecutableProducer = JsExecutableProducer( - mainModuleName = "moduleId", - moduleKind = ModuleKind.PLAIN, - sourceMapsInfo = null, - caches = icCaches, - relativeRequirePath = true - ) - - val (outputs, _) = jsExecutableProducer.buildExecutable(multiModule = false, outJsProgram = false) - outputs - } finally { - tmpDir.normalize().toAbsolutePath().toFile().deleteRecursively() - } + val currentProject = coreEnvironment.project + + val sourceModule = prepareAnalyzedSourceModule( + currentProject, + files, + kotlinEnvironment.jsConfiguration, + kotlinEnvironment.JS_LIBRARIES, + friendDependencies = emptyList(), + analyzer = AnalyzerWithCompilerReport(kotlinEnvironment.jsConfiguration), + ) + val ir = compile( + sourceModule, + kotlinEnvironment.jsIrPhaseConfig, + irFactory = IrFactoryImplForJsIC(WholeWorldStageController()) + ) + val transformer = IrModuleToJsTransformer( + ir.context, + arguments + ) + + val compiledModule: CompilerResult = transformer.generateModule( + modules = ir.allModules, + modes = setOf(TranslationMode.FULL_DEV), + relativeRequirePath = false + ) - val jsCode = getJsCodeFromOutputs(outputs) + val jsCode = getJsCodeFromModule(compiledModule) val listLines = jsCode .lineSequence() @@ -157,8 +143,8 @@ class KotlinToJSTranslator( return TranslationJSResult(listLines.joinToString("\n")) } - private fun getJsCodeFromOutputs(outputs: CompilationOutputs): String { - val jsCodeObject = (outputs as CompilationOutputsBuilt) + private fun getJsCodeFromModule(compiledModule: CompilerResult): String { + val jsCodeObject = compiledModule.outputs.values.single() val jsCodeClass = jsCodeObject.javaClass val jsCode = jsCodeClass.getDeclaredField("rawJsCode").let { diff --git a/src/main/kotlin/com/compiler/server/configuration/ApplicationConfiguration.kt b/src/main/kotlin/com/compiler/server/configuration/ApplicationConfiguration.kt index 4b2c0e1b3..d0b87ffce 100644 --- a/src/main/kotlin/com/compiler/server/configuration/ApplicationConfiguration.kt +++ b/src/main/kotlin/com/compiler/server/configuration/ApplicationConfiguration.kt @@ -1,6 +1,5 @@ package com.compiler.server.configuration -import com.compiler.server.model.bean.CachesFile import com.compiler.server.model.bean.LibrariesFile import com.compiler.server.model.bean.VersionInfo import org.springframework.beans.factory.annotation.Value @@ -13,11 +12,10 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer import java.io.File @Configuration -@EnableConfigurationProperties(value = [LibrariesFolderProperties::class, CachesFolderProperties::class]) +@EnableConfigurationProperties(value = [LibrariesFolderProperties::class]) class ApplicationConfiguration( @Value("\${kotlin.version}") private val version: String, - private val librariesFolderProperties: LibrariesFolderProperties, - private val cachesFolderProperties: LibrariesFolderProperties + private val librariesFolderProperties: LibrariesFolderProperties ) : WebMvcConfigurer { override fun addFormatters(registry: FormatterRegistry) { registry.addConverter(ProjectConverter()) @@ -34,20 +32,10 @@ class ApplicationConfiguration( File(librariesFolderProperties.jvm), File(librariesFolderProperties.js) ) - - @Bean - fun cachesFiles() = CachesFile( - File(cachesFolderProperties.js) - ) } @ConfigurationProperties(prefix = "libraries.folder") class LibrariesFolderProperties { lateinit var jvm: String lateinit var js: String -} - -@ConfigurationProperties(prefix = "caches.folder") -class CachesFolderProperties { - lateinit var js: String } \ No newline at end of file diff --git a/src/main/kotlin/com/compiler/server/model/bean/CachesFile.kt b/src/main/kotlin/com/compiler/server/model/bean/CachesFile.kt deleted file mode 100644 index a64b8ba00..000000000 --- a/src/main/kotlin/com/compiler/server/model/bean/CachesFile.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.compiler.server.model.bean - -import java.io.File - -class CachesFile(val js: File) \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 765714b85..49d769f5d 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -5,7 +5,4 @@ indexes.file=indexes.json indexesJs.file=indexesJs.json libraries.folder.jvm=1.8.20-RC libraries.folder.js=1.8.20-RC-js -caches.folder.js=1.8.20-RC-js-caches -spring.mvc.pathmatch.matching-strategy=ant_path_matcher -server.compression.enabled=true -server.compression.mime-types=application/json \ No newline at end of file +spring.mvc.pathmatch.matching-strategy=ant_path_matcher \ No newline at end of file From 8f71ccc46f01f7bce920a3275eb97f54e9c24a70 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Thu, 16 Mar 2023 12:19:11 +0100 Subject: [PATCH 13/14] Use JS DCE to reduce output size --- .../compiler/server/compiler/components/KotlinToJSTranslator.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt b/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt index a9e5d6b44..14b4b9134 100644 --- a/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt +++ b/src/main/kotlin/com/compiler/server/compiler/components/KotlinToJSTranslator.kt @@ -126,7 +126,7 @@ class KotlinToJSTranslator( val compiledModule: CompilerResult = transformer.generateModule( modules = ir.allModules, - modes = setOf(TranslationMode.FULL_DEV), + modes = setOf(TranslationMode.FULL_PROD), relativeRequirePath = false ) From b48aba496edcf7fca666dba988efba975ab0681b Mon Sep 17 00:00:00 2001 From: Margarita Bobova Date: Mon, 20 Mar 2023 17:41:05 +0100 Subject: [PATCH 14/14] chore(release): add kotlin 1.8.20 --- Dockerfile | 4 ++-- build.gradle.kts | 5 +++-- gradle.properties | 4 ++-- settings.gradle.kts | 9 ++++++++- src/main/resources/application.properties | 6 +++--- versions.json | 6 +++--- 6 files changed, 21 insertions(+), 13 deletions(-) diff --git a/Dockerfile b/Dockerfile index 566c3afdb..aa88298c9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM openjdk:11.0.16-jdk as build -ENV KOTLIN_LIB=1.8.20-RC -ENV KOTLIN_LIB_JS=1.8.20-RC-js +ENV KOTLIN_LIB=1.8.20 +ENV KOTLIN_LIB_JS=1.8.20-js RUN mkdir -p /kotlin-compiler-server WORKDIR /kotlin-compiler-server diff --git a/build.gradle.kts b/build.gradle.kts index e2f88fd7f..a36a665e9 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -46,13 +46,14 @@ val copyJSDependencies by tasks.creating(Copy::class) { plugins { id("org.springframework.boot") version "2.7.9" id("io.spring.dependency-management") version "1.1.0" - kotlin("jvm") version "1.8.20-RC" - kotlin("plugin.spring") version "1.8.20-RC" + kotlin("jvm") version "1.8.20" + kotlin("plugin.spring") version "1.8.20" } allprojects { repositories { mavenCentral() + gradlePluginPortal() maven("https://repo.spring.io/snapshot") maven("https://repo.spring.io/milestone") maven("https://maven.pkg.jetbrains.space/kotlin/p/kotlin/kotlin-ide") diff --git a/gradle.properties b/gradle.properties index 5b0b300ba..b396c53c2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ -systemProp.kotlinVersion=1.8.20-RC -systemProp.kotlinIdeVersion=1.8.20-RC-release-288 +systemProp.kotlinVersion=1.8.20 +systemProp.kotlinIdeVersion=1.8.20-release-327 systemProp.policy=executor.policy systemProp.indexes=indexes.json systemProp.indexesJs=indexesJs.json diff --git a/settings.gradle.kts b/settings.gradle.kts index 506057a4c..6eea8f98a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,4 +1,11 @@ rootProject.name = "kotlin-compiler-server" include(":executors") include(":indexation") -include(":common") \ No newline at end of file +include(":common") + +pluginManagement{ + repositories{ + gradlePluginPortal() + mavenCentral() + } +} \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 49d769f5d..4ea9679c2 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,8 +1,8 @@ # this file is autogenerated by build.gradle.kts -kotlin.version=1.8.20-RC +kotlin.version=1.8.20 policy.file=executor.policy indexes.file=indexes.json indexesJs.file=indexesJs.json -libraries.folder.jvm=1.8.20-RC -libraries.folder.js=1.8.20-RC-js +libraries.folder.jvm=1.8.20 +libraries.folder.js=1.8.20-js spring.mvc.pathmatch.matching-strategy=ant_path_matcher \ No newline at end of file diff --git a/versions.json b/versions.json index ea0caf6dc..ef48799b2 100644 --- a/versions.json +++ b/versions.json @@ -18,10 +18,10 @@ "version": "1.7.21" }, { - "version": "1.8.10", - "latestStable": true + "version": "1.8.10" }, { - "version": "1.8.20-RC2" + "version": "1.8.20", + "latestStable": true } ]