KT-63748: Pack Swift Export Frontend into compiler plugin

Co-authored-by: Sergej Jaskiewicz <jaskiewiczs@icloud.com>


Merge-request: KT-MR-13351
Merged-by: Artem Olkov <artem.olkov@jetbrains.com>
This commit is contained in:
Artem Olkov
2023-12-13 10:40:38 +00:00
committed by Space Team
parent ae5a053025
commit 5fcdd4a9f6
29 changed files with 821 additions and 9 deletions
@@ -0,0 +1,34 @@
description = "Swift Compiler Plugin (CLI)"
plugins {
kotlin("jvm")
}
dependencies {
implementation(project(":kotlin-swift-export-compiler-plugin.backend"))
compileOnly(project(":compiler:plugin-api"))
compileOnly(project(":compiler:fir:entrypoint"))
embedded(project(":analysis:analysis-api-standalone")) { isTransitive = false }
embedded(project(":analysis:analysis-api")) { isTransitive = false }
embedded(project(":analysis:analysis-api-fir")) { isTransitive = false }
embedded(project(":analysis:analysis-api-impl-base")) { isTransitive = false }
embedded(project(":analysis:analysis-api-impl-barebone")) { isTransitive = false }
embedded(project(":analysis:analysis-api-standalone:analysis-api-standalone-base")) { isTransitive = false }
embedded(project(":analysis:analysis-api-standalone:analysis-api-fir-standalone-base")) { isTransitive = false }
embedded(project(":analysis:analysis-internal-utils")) { isTransitive = false }
embedded(project(":analysis:low-level-api-fir")) { isTransitive = false }
embedded(project(":analysis:symbol-light-classes")) { isTransitive = false }
}
optInToExperimentalCompilerApi()
sourceSets {
"main" { projectDefault() }
"test" { none() }
}
runtimeJar()
sourcesJar()
javadocJar()
@@ -0,0 +1 @@
org.jetbrains.kotlin.swiftexport.SwiftExportCommandLineProcessor
@@ -0,0 +1 @@
org.jetbrains.kotlin.swiftexport.SwiftExportComponentRegistrar
@@ -0,0 +1,68 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.swiftexport
import org.jetbrains.kotlin.compiler.plugin.*
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.CompilerConfigurationKey
import org.jetbrains.kotlin.fir.extensions.FirAnalysisHandlerExtension
import org.jetbrains.kotlin.swiftexport.SwiftExportPluginNames.OUTPUT_DIR_KEY
import org.jetbrains.kotlin.swiftexport.SwiftExportPluginNames.PLUGIN_ID
import org.jetbrains.kotlin.swiftexport.SwiftExportPluginNames.RESULT_NAME_KEY
import java.io.File
object SwiftExportConfigurationKeys {
val OUTPUT_DIR: CompilerConfigurationKey<String> = CompilerConfigurationKey.create(
"Destination directory for swift-export resulted files"
)
val RESULT_NAME: CompilerConfigurationKey<String> = CompilerConfigurationKey.create(
"Filenames for resulted files. There will be 3 files - %RESULT_NAME%.swift, %RESULT_NAME%.h and %RESULT_NAME%.kt."
)
}
class SwiftExportCommandLineProcessor : CommandLineProcessor {
companion object {
val OUTPUT_DIR = CliOption(
OUTPUT_DIR_KEY, "output destination",
"Destination directory for swift-export resulted files",
required = true, allowMultipleOccurrences = false
)
val RESULT_NAME = CliOption(
RESULT_NAME_KEY, "Filenames for resulted files",
"Filenames for resulted files. By default - \"result\"",
required = false, allowMultipleOccurrences = false
)
}
override val pluginId = PLUGIN_ID
override val pluginOptions = listOf(
OUTPUT_DIR, RESULT_NAME
)
override fun processOption(option: AbstractCliOption, value: String, configuration: CompilerConfiguration) = when (option) {
OUTPUT_DIR -> configuration.put(SwiftExportConfigurationKeys.OUTPUT_DIR, value)
RESULT_NAME -> configuration.put(SwiftExportConfigurationKeys.RESULT_NAME, value)
else -> throw CliOptionProcessingException("Unknown option: ${option.optionName}")
}
}
class SwiftExportComponentRegistrar : CompilerPluginRegistrar() {
override val supportsK2: Boolean
get() = true
override fun ExtensionStorage.registerExtensions(configuration: CompilerConfiguration) {
val dir = File(
configuration.get(SwiftExportConfigurationKeys.OUTPUT_DIR)
?: throw IllegalArgumentException("output_dir is a required argument for org.jetbrains.kotlin.swiftexport")
)
val named = configuration.get(SwiftExportConfigurationKeys.RESULT_NAME)
?: "result"
FirAnalysisHandlerExtension.registerExtension(
SwiftExportExtension(dir, named)
)
}
}