Advertisement
Guest User

Untitled

a guest
Oct 14th, 2019
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 4.95 KB | None | 0 0
  1. package com.example
  2.  
  3. import com.intellij.openapi.Disposable
  4. import com.intellij.psi.PsiFileFactory
  5. import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
  6. import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation
  7. import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
  8. import org.jetbrains.kotlin.cli.common.messages.MessageCollector
  9. import org.jetbrains.kotlin.cli.jvm.compiler.CliBindingTrace
  10. import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
  11. import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
  12. import org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM
  13. import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar
  14. import org.jetbrains.kotlin.config.CommonConfigurationKeys
  15. import org.jetbrains.kotlin.config.CompilerConfiguration
  16. import org.jetbrains.kotlin.config.JVMConfigurationKeys
  17. import org.jetbrains.kotlin.config.JvmTarget
  18. import org.jetbrains.kotlin.container.get
  19. import org.jetbrains.kotlin.idea.KotlinLanguage
  20. import org.jetbrains.kotlin.mainKts.MainKtsScript
  21. import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil
  22. import org.jetbrains.kotlin.psi.KtFile
  23. import org.jetbrains.kotlin.resolve.LazyTopDownAnalyzer
  24. import org.jetbrains.kotlin.resolve.TopDownAnalysisMode
  25. import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameOrNull
  26. import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory
  27. import org.jetbrains.kotlin.scripting.compiler.plugin.ScriptingCompilerConfigurationComponentRegistrar
  28. import org.jetbrains.kotlin.scripting.compiler.plugin.dependencies.collectScriptsCompilationDependencies
  29. import org.jetbrains.kotlin.scripting.configuration.ScriptingConfigurationKeys
  30. import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
  31. import java.io.File
  32. import kotlin.script.experimental.api.ScriptCompilationConfiguration
  33. import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration
  34. import kotlin.system.exitProcess
  35.  
  36. fun main(args: Array<String>) {
  37.   if (args.size != 1) {
  38.     println("Usage: program path_to_script.main.kts")
  39.     exitProcess(1)
  40.   }
  41.  
  42.   // Initialize compilation environment.
  43.   val compilerConfiguration = getCompilationConfiguration()
  44.   val environment = KotlinCoreEnvironment.createForProduction(
  45.     parentDisposable = Disposable { },
  46.     configuration = compilerConfiguration,
  47.     configFiles = EnvironmentConfigFiles.JVM_CONFIG_FILES
  48.   )
  49.   val project = environment.project
  50.   val psiFactory = PsiFileFactory.getInstance(project)
  51.  
  52.   // Create KtFile.
  53.   val filePath = args[0]
  54.   val fileContent = File(filePath).readText()
  55.   val ktFile = psiFactory.createFileFromText(filePath, KotlinLanguage.INSTANCE, fileContent, true, false) as KtFile
  56.  
  57.   // Collect dependencies.
  58.   val sourceFiles = arrayListOf(ktFile)
  59.   val (_ , newSources, _) = collectScriptsCompilationDependencies(
  60.     compilerConfiguration, project, listOf(ktFile))
  61.   sourceFiles.addAll(newSources)
  62.  
  63.   // Compile files.
  64.   val trace = CliBindingTrace()
  65.   val container = TopDownAnalyzerFacadeForJVM.createContainer(
  66.     project,
  67.     emptyList(),
  68.     trace,
  69.     environment.configuration,
  70.     environment::createPackagePartProvider,
  71.     { storageManager, _ -> FileBasedDeclarationProviderFactory(storageManager, sourceFiles) }
  72.   )
  73.   val analyzer = container.get<LazyTopDownAnalyzer>()
  74.   val analysisContext = analyzer.analyzeDeclarations(TopDownAnalysisMode.TopLevelDeclarations, sourceFiles)
  75.  
  76.   // Print scripts related information.
  77.   analysisContext.scripts.forEach { (script, classDescriptor) ->
  78.     val constructors = classDescriptor.constructors
  79.     println("Class ${classDescriptor.fqNameOrNull()} has ${constructors.size} constructor(s):")
  80.     constructors.forEachIndexed { i, constructor ->
  81.       val parameters = constructor.valueParameters
  82.       println(" - Constructor $i has ${parameters.size} parameter(s): ${parameters.map { it.name }.joinToString(", ")}")
  83.     }
  84.     println()
  85.   }
  86. }
  87.  
  88. object CustomMessageCollector : MessageCollector {
  89.   override fun clear() {
  90.   }
  91.  
  92.   override fun hasErrors(): Boolean = false
  93.  
  94.   override fun report(severity: CompilerMessageSeverity, message: String, location: CompilerMessageLocation?) {
  95.     println("Compiler report | $severity | $message | $location")
  96.   }
  97. }
  98.  
  99. private fun getCompilationConfiguration(): CompilerConfiguration {
  100.   return CompilerConfiguration().apply {
  101.     put(CommonConfigurationKeys.MODULE_NAME, JvmProtoBufUtil.DEFAULT_MODULE_NAME)
  102.     put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, CustomMessageCollector)
  103.     put(JVMConfigurationKeys.JVM_TARGET, JvmTarget.JVM_1_8)
  104.     add(
  105.       ComponentRegistrar.PLUGIN_COMPONENT_REGISTRARS,
  106.       ScriptingCompilerConfigurationComponentRegistrar()
  107.     )
  108.  
  109.     add(
  110.       ScriptingConfigurationKeys.SCRIPT_DEFINITIONS,
  111.       ScriptDefinition.FromTemplate(
  112.         defaultJvmScriptingHostConfiguration,
  113.         MainKtsScript::class,
  114.         ScriptCompilationConfiguration::class
  115.       )
  116.     )
  117.   }
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement