From 8e73d5a54a5aec20362b66fa15c220341cae0fee Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Fri, 23 Jun 2023 15:12:28 +0300 Subject: [PATCH] [FIR] Run irGenerationExtensions after IR actualization ^KT-56173 Fixed --- .../kotlin/fir/pipeline/convertToIr.kt | 19 ++++++++++++++----- .../kotlin/fir/backend/Fir2IrConverter.kt | 11 +---------- .../test/backend/ir/ActualizerOnlyFacade.kt | 5 +++++ .../test/backend/ir/JvmIrBackendFacade.kt | 19 ++++++++++++++----- .../frontend/fir/Fir2IrJsResultsConverter.kt | 15 +++++++++++++-- .../frontend/fir/Fir2IrJvmResultsConverter.kt | 14 +++++++++++++- .../fir/Fir2IrWasmResultsConverter.kt | 1 - .../jetbrains/kotlin/fir/FirAnalyzerFacade.kt | 1 - .../test/converters/FirJsKlibBackendFacade.kt | 9 ++++++++- ...ActualFunctionBodyWitExpectDefaultValue.kt | 1 - .../converters/FirWasmKlibBackendFacade.kt | 11 +++++++++-- 11 files changed, 77 insertions(+), 29 deletions(-) diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/convertToIr.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/convertToIr.kt index 32b3711673a..08318a74209 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/convertToIr.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/convertToIr.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.pipeline import org.jetbrains.kotlin.backend.common.actualizer.IrActualizedResult import org.jetbrains.kotlin.backend.common.actualizer.IrActualizer import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension +import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext import org.jetbrains.kotlin.backend.jvm.JvmIrTypeSystemContext import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor import org.jetbrains.kotlin.builtins.DefaultBuiltIns @@ -96,7 +97,6 @@ fun FirResult.convertToIrAndActualize( fir2IrResult = outputs.single().convertToIr( fir2IrExtensions, fir2IrConfiguration, - irGeneratorExtensions, commonMemberStorage = commonMemberStorage, irBuiltIns = null, irMangler, @@ -115,7 +115,6 @@ fun FirResult.convertToIrAndActualize( it.convertToIr( fir2IrExtensions, fir2IrConfiguration, - irGeneratorExtensions, commonMemberStorage = commonMemberStorage, irBuiltIns = irBuiltIns, irMangler, @@ -131,7 +130,6 @@ fun FirResult.convertToIrAndActualize( fir2IrResult = platformOutput.convertToIr( fir2IrExtensions, fir2IrConfiguration, - irGeneratorExtensions, commonMemberStorage = commonMemberStorage, irBuiltIns = irBuiltIns!!, irMangler, @@ -152,13 +150,25 @@ fun FirResult.convertToIrAndActualize( } val (irModuleFragment, components, pluginContext) = fir2IrResult + components.applyIrGenerationExtensions(irModuleFragment, irGeneratorExtensions) return Fir2IrActualizedResult(irModuleFragment, components, pluginContext, actualizationResult) } +fun Fir2IrComponents.applyIrGenerationExtensions(irModuleFragment: IrModuleFragment, irGenerationExtensions: Collection) { + if (irGenerationExtensions.isEmpty()) return + Fir2IrPluginContext(this, irModuleFragment.descriptor).applyIrGenerationExtensions(irModuleFragment, irGenerationExtensions) +} + +fun IrPluginContext.applyIrGenerationExtensions(irModuleFragment: IrModuleFragment, irGenerationExtensions: Collection) { + if (irGenerationExtensions.isEmpty()) return + for (extension in irGenerationExtensions) { + extension.generate(irModuleFragment, this) + } +} + private fun ModuleCompilerAnalyzedOutput.convertToIr( fir2IrExtensions: Fir2IrExtensions, fir2IrConfiguration: Fir2IrConfiguration, - irGeneratorExtensions: Collection, commonMemberStorage: Fir2IrCommonMemberStorage, irBuiltIns: IrBuiltInsOverFir?, irMangler: KotlinMangler.IrMangler, @@ -170,7 +180,6 @@ private fun ModuleCompilerAnalyzedOutput.convertToIr( fir2IrExtensions, fir2IrConfiguration, irMangler, IrFactoryImpl, visibilityConverter, Fir2IrJvmSpecialAnnotationSymbolProvider(), // TODO: replace with appropriate (probably empty) implementation for other backends. - irGeneratorExtensions, kotlinBuiltIns = kotlinBuiltIns, commonMemberStorage = commonMemberStorage, initializedIrBuiltIns = irBuiltIns diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt index ce825839bb6..470becadf31 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt @@ -53,7 +53,6 @@ class Fir2IrConverter( private fun runSourcesConversion( allFirFiles: List, irModuleFragment: IrModuleFragmentImpl, - irGenerationExtensions: Collection, fir2irVisitor: Fir2IrVisitor, fir2IrExtensions: Fir2IrExtensions, runPreCacheBuiltinClasses: Boolean @@ -100,13 +99,6 @@ class Fir2IrConverter( evaluateConstants(irModuleFragment, configuration) - if (irGenerationExtensions.isNotEmpty()) { - val pluginContext = Fir2IrPluginContext(components, irModuleFragment.descriptor) - for (extension in irGenerationExtensions) { - extension.generate(irModuleFragment, pluginContext) - } - } - irModuleFragment.acceptVoid(ExternalPackageParentPatcher(components, fir2IrExtensions)) } @@ -461,7 +453,6 @@ class Fir2IrConverter( irFactory: IrFactory, visibilityConverter: Fir2IrVisibilityConverter, specialSymbolProvider: Fir2IrSpecialSymbolProvider, - irGenerationExtensions: Collection, kotlinBuiltIns: KotlinBuiltIns, commonMemberStorage: Fir2IrCommonMemberStorage, initializedIrBuiltIns: IrBuiltInsOverFir? @@ -508,7 +499,7 @@ class Fir2IrConverter( } converter.runSourcesConversion( - allFirFiles, irModuleFragment, irGenerationExtensions, fir2irVisitor, fir2IrExtensions, + allFirFiles, irModuleFragment, fir2irVisitor, fir2IrExtensions, runPreCacheBuiltinClasses = initializedIrBuiltIns == null ) diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/ir/ActualizerOnlyFacade.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/ir/ActualizerOnlyFacade.kt index 067f65e5449..0a53d11b7ab 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/ir/ActualizerOnlyFacade.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/ir/ActualizerOnlyFacade.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.common.actualizer.IrActualizer import org.jetbrains.kotlin.backend.jvm.JvmIrTypeSystemContext import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.languageVersionSettings +import org.jetbrains.kotlin.fir.pipeline.applyIrGenerationExtensions import org.jetbrains.kotlin.ir.types.IrTypeSystemContextImpl import org.jetbrains.kotlin.platform.jvm.isJvm import org.jetbrains.kotlin.test.model.* @@ -32,6 +33,10 @@ class ActualizerOnlyFacade( typeSystemContext, testServices.compilerConfigurationProvider.getCompilerConfiguration(module).languageVersionSettings ) + inputArtifact.irPluginContext.applyIrGenerationExtensions( + inputArtifact.irModuleFragment, + irGenerationExtensions = module.irGenerationExtensions(testServices) + ) } return inputArtifact } diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/ir/JvmIrBackendFacade.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/ir/JvmIrBackendFacade.kt index b083947d9fc..8a4acadc5df 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/ir/JvmIrBackendFacade.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/ir/JvmIrBackendFacade.kt @@ -8,14 +8,15 @@ package org.jetbrains.kotlin.test.backend.ir import org.jetbrains.kotlin.KtPsiSourceFile import org.jetbrains.kotlin.backend.common.BackendException import org.jetbrains.kotlin.backend.common.actualizer.IrActualizer +import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension import org.jetbrains.kotlin.backend.jvm.JvmIrTypeSystemContext import org.jetbrains.kotlin.backend.jvm.MultifileFacadeFileEntry import org.jetbrains.kotlin.backend.jvm.lower.getFileClassInfoFromIrFile import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil +import org.jetbrains.kotlin.fir.pipeline.applyIrGenerationExtensions import org.jetbrains.kotlin.ir.PsiIrFileEntry import org.jetbrains.kotlin.ir.declarations.IrFile -import org.jetbrains.kotlin.ir.types.IrTypeSystemContextImpl import org.jetbrains.kotlin.ir.util.NaiveSourceBasedFileEntryImpl import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.test.backend.classic.JavaCompilerFacade @@ -45,6 +46,10 @@ class JvmIrBackendFacade( JvmIrTypeSystemContext(inputArtifact.irModuleFragment.irBuiltins), inputArtifact.state.languageVersionSettings ) + inputArtifact.irPluginContext.applyIrGenerationExtensions( + inputArtifact.irModuleFragment, + module.irGenerationExtensions(testServices) + ) } val state = inputArtifact.state @@ -91,8 +96,12 @@ class JvmIrBackendFacade( } ) } - - private fun TestModule.useIrActualizer(): Boolean { - return frontendKind == FrontendKinds.FIR && languageVersionSettings.supportsFeature(LanguageFeature.MultiPlatformProjects) - } +} + +internal fun TestModule.useIrActualizer(): Boolean { + return frontendKind == FrontendKinds.FIR && languageVersionSettings.supportsFeature(LanguageFeature.MultiPlatformProjects) +} + +fun TestModule.irGenerationExtensions(testServices: TestServices): Collection { + return IrGenerationExtension.getInstances(testServices.compilerConfigurationProvider.getProject(this)) } diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrJsResultsConverter.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrJsResultsConverter.kt index 622b898742f..3e10cf07291 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrJsResultsConverter.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrJsResultsConverter.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.fir.backend.jvm.Fir2IrJvmSpecialAnnotationSymbolProv import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor +import org.jetbrains.kotlin.fir.pipeline.applyIrGenerationExtensions import org.jetbrains.kotlin.fir.serialization.FirKLibSerializerExtension import org.jetbrains.kotlin.fir.serialization.serializeSingleFirFile import org.jetbrains.kotlin.incremental.components.LookupTracker @@ -41,6 +42,8 @@ import org.jetbrains.kotlin.library.metadata.resolver.KotlinResolvedLibrary import org.jetbrains.kotlin.library.unresolvedDependencies import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.test.backend.ir.IrBackendInput +import org.jetbrains.kotlin.test.backend.ir.irGenerationExtensions +import org.jetbrains.kotlin.test.backend.ir.useIrActualizer import org.jetbrains.kotlin.test.directives.CodegenTestDirectives import org.jetbrains.kotlin.test.model.BackendKinds import org.jetbrains.kotlin.test.model.Frontend2BackendConverter @@ -120,7 +123,7 @@ class Fir2IrJsResultsConverter( var actualizedExpectDeclarations: Set? = null - return IrBackendInput.JsIrBackendInput( + val result = IrBackendInput.JsIrBackendInput( mainIrPart, dependentIrParts, mainPluginContext, @@ -152,6 +155,15 @@ class Fir2IrJsResultsConverter( configuration.languageVersionSettings, ) } + + if (!module.useIrActualizer()) { + result.irPluginContext.applyIrGenerationExtensions( + result.irModuleFragment, + irGenerationExtensions = module.irGenerationExtensions(testServices) + ) + } + + return result } } @@ -185,7 +197,6 @@ fun AbstractFirAnalyzerFacade.convertToJsIr( irMangler, IrFactoryImpl, Fir2IrVisibilityConverter.Default, Fir2IrJvmSpecialAnnotationSymbolProvider(), // TODO: replace with appropriate (probably empty) implementation - irGeneratorExtensions, kotlinBuiltIns = builtIns ?: DefaultBuiltIns.Instance, // TODO: consider passing externally, commonMemberStorage = commonMemberStorage, initializedIrBuiltIns = irBuiltIns diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrJvmResultsConverter.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrJvmResultsConverter.kt index 84cc516238c..cecf02a7328 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrJvmResultsConverter.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrJvmResultsConverter.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendClassResolver import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendExtension import org.jetbrains.kotlin.fir.backend.jvm.FirJvmKotlinMangler import org.jetbrains.kotlin.fir.backend.jvm.JvmFir2IrExtensions +import org.jetbrains.kotlin.fir.pipeline.applyIrGenerationExtensions import org.jetbrains.kotlin.fir.pipeline.signatureComposerForJvmFir2Ir import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrMangler @@ -29,6 +30,8 @@ import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.CompilerEnvironment import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory import org.jetbrains.kotlin.test.backend.ir.IrBackendInput +import org.jetbrains.kotlin.test.backend.ir.irGenerationExtensions +import org.jetbrains.kotlin.test.backend.ir.useIrActualizer import org.jetbrains.kotlin.test.directives.CodegenTestDirectives import org.jetbrains.kotlin.test.model.BackendKinds import org.jetbrains.kotlin.test.model.Frontend2BackendConverter @@ -126,7 +129,7 @@ class Fir2IrJvmResultsConverter( FirJvmBackendClassResolver(mainModuleComponents) ).build() - return IrBackendInput.JvmIrBackendInput( + val result = IrBackendInput.JvmIrBackendInput( generationState, codegenFactory, backendInput, @@ -136,5 +139,14 @@ class Fir2IrJvmResultsConverter( irMangler = irMangler, firMangler = commonMemberStorage.firSignatureComposer.mangler, ) + + if (!module.useIrActualizer()) { + result.irPluginContext.applyIrGenerationExtensions( + backendInput.irModuleFragment, + irGenerationExtensions = module.irGenerationExtensions(testServices) + ) + } + + return result } } diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrWasmResultsConverter.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrWasmResultsConverter.kt index 0e3e3cdb916..94dbc91e335 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrWasmResultsConverter.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrWasmResultsConverter.kt @@ -185,7 +185,6 @@ fun AbstractFirAnalyzerFacade.convertToWasmIr( irMangler, IrFactoryImpl, Fir2IrVisibilityConverter.Default, Fir2IrJvmSpecialAnnotationSymbolProvider(), // TODO: replace with appropriate (probably empty) implementation - irGeneratorExtensions, kotlinBuiltIns = builtIns ?: DefaultBuiltIns.Instance, // TODO: consider passing externally, commonMemberStorage = commonMemberStorage, initializedIrBuiltIns = irBuiltIns diff --git a/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/fir/FirAnalyzerFacade.kt b/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/fir/FirAnalyzerFacade.kt index 407c90fd245..69116485700 100644 --- a/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/fir/FirAnalyzerFacade.kt +++ b/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/fir/FirAnalyzerFacade.kt @@ -119,7 +119,6 @@ class FirAnalyzerFacade( JvmIrMangler, IrFactoryImpl, FirJvmVisibilityConverter, Fir2IrJvmSpecialAnnotationSymbolProvider(), - irGeneratorExtensions, kotlinBuiltIns = DefaultBuiltIns.Instance, // TODO: consider passing externally, commonMemberStorage = commonMemberStorage, initializedIrBuiltIns = irBuiltIns diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/FirJsKlibBackendFacade.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/FirJsKlibBackendFacade.kt index 6a5fc387fbf..c2227fff918 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/FirJsKlibBackendFacade.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/FirJsKlibBackendFacade.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory +import org.jetbrains.kotlin.fir.pipeline.applyIrGenerationExtensions import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.ir.backend.js.JsFactories import org.jetbrains.kotlin.ir.backend.js.resolverLogger @@ -24,6 +25,7 @@ import org.jetbrains.kotlin.library.KotlinAbiVersion import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.test.backend.ir.IrBackendFacade import org.jetbrains.kotlin.test.backend.ir.IrBackendInput +import org.jetbrains.kotlin.test.backend.ir.irGenerationExtensions import org.jetbrains.kotlin.test.frontend.classic.ModuleDescriptorProvider import org.jetbrains.kotlin.test.frontend.classic.moduleDescriptorProvider import org.jetbrains.kotlin.test.frontend.fir.getAllJsDependenciesPaths @@ -74,7 +76,12 @@ class FirJsKlibBackendFacade( diagnosticReporter, IrTypeSystemContextImpl(inputArtifact.irModuleFragment.irBuiltins), configuration.languageVersionSettings - ) + ).also { + inputArtifact.irPluginContext.applyIrGenerationExtensions( + inputArtifact.irModuleFragment, + irGenerationExtensions = module.irGenerationExtensions(testServices) + ) + } } else { null } diff --git a/plugins/fir-plugin-prototype/testData/box/replaceActualFunctionBodyWitExpectDefaultValue.kt b/plugins/fir-plugin-prototype/testData/box/replaceActualFunctionBodyWitExpectDefaultValue.kt index 577265a1df3..9aa24cc3124 100644 --- a/plugins/fir-plugin-prototype/testData/box/replaceActualFunctionBodyWitExpectDefaultValue.kt +++ b/plugins/fir-plugin-prototype/testData/box/replaceActualFunctionBodyWitExpectDefaultValue.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // LANGUAGE: +MultiPlatformProjects // ISSUE: KT-56173 diff --git a/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/converters/FirWasmKlibBackendFacade.kt b/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/converters/FirWasmKlibBackendFacade.kt index e49431ca41c..85d3c788bf6 100644 --- a/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/converters/FirWasmKlibBackendFacade.kt +++ b/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/converters/FirWasmKlibBackendFacade.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory +import org.jetbrains.kotlin.fir.pipeline.applyIrGenerationExtensions import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.ir.backend.js.JsFactories import org.jetbrains.kotlin.ir.backend.js.resolverLogger @@ -22,6 +23,7 @@ import org.jetbrains.kotlin.library.KotlinAbiVersion import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.test.backend.ir.IrBackendFacade import org.jetbrains.kotlin.test.backend.ir.IrBackendInput +import org.jetbrains.kotlin.test.backend.ir.irGenerationExtensions import org.jetbrains.kotlin.test.frontend.classic.ModuleDescriptorProvider import org.jetbrains.kotlin.test.frontend.classic.moduleDescriptorProvider import org.jetbrains.kotlin.test.frontend.fir.getAllWasmDependenciesPaths @@ -71,7 +73,12 @@ class FirWasmKlibBackendFacade( diagnosticReporter, IrTypeSystemContextImpl(inputArtifact.irModuleFragment.irBuiltins), configuration.languageVersionSettings - ) + ).also { + inputArtifact.irPluginContext.applyIrGenerationExtensions( + inputArtifact.irModuleFragment, + irGenerationExtensions = module.irGenerationExtensions(testServices) + ) + } } else { null } @@ -120,4 +127,4 @@ class FirWasmKlibBackendFacade( return BinaryArtifacts.KLib(File(outputFile)) } -} \ No newline at end of file +}