Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.example
- import com.intellij.openapi.Disposable
- import com.intellij.psi.PsiFileFactory
- import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
- import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation
- import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
- import org.jetbrains.kotlin.cli.common.messages.MessageCollector
- import org.jetbrains.kotlin.cli.jvm.compiler.CliBindingTrace
- import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
- import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
- import org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM
- import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar
- import org.jetbrains.kotlin.config.CommonConfigurationKeys
- import org.jetbrains.kotlin.config.CompilerConfiguration
- import org.jetbrains.kotlin.config.JVMConfigurationKeys
- import org.jetbrains.kotlin.config.JvmTarget
- import org.jetbrains.kotlin.container.get
- import org.jetbrains.kotlin.idea.KotlinLanguage
- import org.jetbrains.kotlin.mainKts.MainKtsScript
- import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil
- import org.jetbrains.kotlin.psi.KtFile
- import org.jetbrains.kotlin.resolve.LazyTopDownAnalyzer
- import org.jetbrains.kotlin.resolve.TopDownAnalysisMode
- import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameOrNull
- import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory
- import org.jetbrains.kotlin.scripting.compiler.plugin.ScriptingCompilerConfigurationComponentRegistrar
- import org.jetbrains.kotlin.scripting.compiler.plugin.dependencies.collectScriptsCompilationDependencies
- import org.jetbrains.kotlin.scripting.configuration.ScriptingConfigurationKeys
- import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
- import java.io.File
- import kotlin.script.experimental.api.ScriptCompilationConfiguration
- import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration
- import kotlin.system.exitProcess
- fun main(args: Array<String>) {
- if (args.size != 1) {
- println("Usage: program path_to_script.main.kts")
- exitProcess(1)
- }
- // Initialize compilation environment.
- val compilerConfiguration = getCompilationConfiguration()
- val environment = KotlinCoreEnvironment.createForProduction(
- parentDisposable = Disposable { },
- configuration = compilerConfiguration,
- configFiles = EnvironmentConfigFiles.JVM_CONFIG_FILES
- )
- val project = environment.project
- val psiFactory = PsiFileFactory.getInstance(project)
- // Create KtFile.
- val filePath = args[0]
- val fileContent = File(filePath).readText()
- val ktFile = psiFactory.createFileFromText(filePath, KotlinLanguage.INSTANCE, fileContent, true, false) as KtFile
- // Collect dependencies.
- val sourceFiles = arrayListOf(ktFile)
- val (_ , newSources, _) = collectScriptsCompilationDependencies(
- compilerConfiguration, project, listOf(ktFile))
- sourceFiles.addAll(newSources)
- // Compile files.
- val trace = CliBindingTrace()
- val container = TopDownAnalyzerFacadeForJVM.createContainer(
- project,
- emptyList(),
- trace,
- environment.configuration,
- environment::createPackagePartProvider,
- { storageManager, _ -> FileBasedDeclarationProviderFactory(storageManager, sourceFiles) }
- )
- val analyzer = container.get<LazyTopDownAnalyzer>()
- val analysisContext = analyzer.analyzeDeclarations(TopDownAnalysisMode.TopLevelDeclarations, sourceFiles)
- // Print scripts related information.
- analysisContext.scripts.forEach { (script, classDescriptor) ->
- val constructors = classDescriptor.constructors
- println("Class ${classDescriptor.fqNameOrNull()} has ${constructors.size} constructor(s):")
- constructors.forEachIndexed { i, constructor ->
- val parameters = constructor.valueParameters
- println(" - Constructor $i has ${parameters.size} parameter(s): ${parameters.map { it.name }.joinToString(", ")}")
- }
- println()
- }
- }
- object CustomMessageCollector : MessageCollector {
- override fun clear() {
- }
- override fun hasErrors(): Boolean = false
- override fun report(severity: CompilerMessageSeverity, message: String, location: CompilerMessageLocation?) {
- println("Compiler report | $severity | $message | $location")
- }
- }
- private fun getCompilationConfiguration(): CompilerConfiguration {
- return CompilerConfiguration().apply {
- put(CommonConfigurationKeys.MODULE_NAME, JvmProtoBufUtil.DEFAULT_MODULE_NAME)
- put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, CustomMessageCollector)
- put(JVMConfigurationKeys.JVM_TARGET, JvmTarget.JVM_1_8)
- add(
- ComponentRegistrar.PLUGIN_COMPONENT_REGISTRARS,
- ScriptingCompilerConfigurationComponentRegistrar()
- )
- add(
- ScriptingConfigurationKeys.SCRIPT_DEFINITIONS,
- ScriptDefinition.FromTemplate(
- defaultJvmScriptingHostConfiguration,
- MainKtsScript::class,
- ScriptCompilationConfiguration::class
- )
- )
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement