1
1
package org.javacs.kt.compiler
2
2
3
- import com.intellij.codeInsight.NullableNotNullManager
4
3
import com.intellij.lang.Language
5
- import com.intellij.openapi.Disposable
6
4
import com.intellij.openapi.util.Disposer
7
5
import com.intellij.openapi.vfs.StandardFileSystems
8
6
import com.intellij.openapi.vfs.VirtualFileManager
9
7
import com.intellij.openapi.vfs.VirtualFileSystem
10
8
import com.intellij.psi.PsiFile
11
9
import com.intellij.psi.PsiFileFactory
12
- import com.intellij.mock.MockProject
13
10
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
14
11
import org.jetbrains.kotlin.cli.common.environment.setIdeaIoUseFallback
15
12
import org.jetbrains.kotlin.cli.jvm.compiler.CliBindingTrace
@@ -18,7 +15,6 @@ import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
18
15
import org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM
19
16
import org.jetbrains.kotlin.cli.jvm.config.addJavaSourceRoots
20
17
import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots
21
- import org.jetbrains.kotlin.cli.jvm.plugins.PluginCliParser
22
18
import org.jetbrains.kotlin.config.CommonConfigurationKeys
23
19
import org.jetbrains.kotlin.config.CompilerConfiguration as KotlinCompilerConfiguration
24
20
import org.jetbrains.kotlin.config.JVMConfigurationKeys
@@ -39,26 +35,20 @@ import org.jetbrains.kotlin.resolve.LazyTopDownAnalyzer
39
35
import org.jetbrains.kotlin.resolve.TopDownAnalysisMode
40
36
import org.jetbrains.kotlin.resolve.calls.components.InferenceSession
41
37
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo
42
- import org.jetbrains.kotlin.resolve.extensions.ExtraImportsProviderExtension
43
38
import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory
44
39
import org.jetbrains.kotlin.resolve.scopes.LexicalScope
45
40
import org.jetbrains.kotlin.scripting.compiler.plugin.ScriptingCompilerConfigurationComponentRegistrar
46
41
import org.jetbrains.kotlin.scripting.compiler.plugin.definitions.CliScriptDefinitionProvider
47
42
import org.jetbrains.kotlin.scripting.configuration.ScriptingConfigurationKeys
48
- import org.jetbrains.kotlin.scripting.definitions.ScriptCompilationConfigurationFromDefinition
49
43
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionProvider
50
- import org.jetbrains.kotlin.scripting.definitions.ScriptDependenciesProvider
51
- import org.jetbrains.kotlin.scripting.definitions.StandardScriptDefinition
52
44
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
53
45
import org.jetbrains.kotlin.scripting.definitions.KotlinScriptDefinition // Legacy
54
46
import org.jetbrains.kotlin.scripting.definitions.findScriptDefinition
55
47
import org.jetbrains.kotlin.scripting.definitions.getEnvironment
56
- import org.jetbrains.kotlin.scripting.extensions.ScriptExtraImportsProviderExtension
57
48
import org.jetbrains.kotlin.scripting.resolve.KotlinScriptDefinitionFromAnnotatedTemplate
58
49
import org.jetbrains.kotlin.types.TypeUtils
59
50
import org.jetbrains.kotlin.types.expressions.ExpressionTypingServices
60
51
import org.jetbrains.kotlin.util.KotlinFrontEndException
61
- import org.jetbrains.kotlin.utils.PathUtil
62
52
import java.io.Closeable
63
53
import java.io.File
64
54
import java.nio.file.Path
@@ -69,7 +59,6 @@ import kotlin.concurrent.withLock
69
59
import kotlin.script.dependencies.Environment
70
60
import kotlin.script.dependencies.ScriptContents
71
61
import kotlin.script.experimental.dependencies.ScriptDependencies
72
- import kotlin.script.experimental.api.ScriptCompilationConfiguration
73
62
import kotlin.script.experimental.dependencies.DependenciesResolver
74
63
import kotlin.script.experimental.dependencies.DependenciesResolver.ResolveResult
75
64
import kotlin.script.experimental.host.ScriptingHostConfiguration
@@ -80,6 +69,12 @@ import org.javacs.kt.LOG
80
69
import org.javacs.kt.CompilerConfiguration
81
70
import org.javacs.kt.util.KotlinLSException
82
71
import org.javacs.kt.util.LoggingMessageCollector
72
+ import org.jetbrains.kotlin.cli.common.output.writeAllTo
73
+ import org.jetbrains.kotlin.codegen.ClassBuilderFactories
74
+ import org.jetbrains.kotlin.codegen.KotlinCodegenFacade
75
+ import org.jetbrains.kotlin.codegen.state.GenerationState
76
+ import org.jetbrains.kotlin.container.getService
77
+ import org.jetbrains.kotlin.descriptors.ModuleDescriptor
83
78
84
79
private val GRADLE_DSL_DEPENDENCY_PATTERN = Regex (" ^gradle-(?:kotlin-dsl|core).*\\ .jar$" )
85
80
@@ -445,7 +440,7 @@ enum class CompilationKind {
445
440
* Incrementally compiles files and expressions.
446
441
* The basic strategy for compiling one file at-a-time is outlined in OneFilePerformance.
447
442
*/
448
- class Compiler (javaSourcePath : Set <Path >, classPath : Set <Path >, buildScriptClassPath : Set <Path > = emptySet()) : Closeable {
443
+ class Compiler (javaSourcePath : Set <Path >, classPath : Set <Path >, buildScriptClassPath : Set <Path > = emptySet(), var outputDirectory : File ? = null ) : Closeable {
449
444
private var closed = false
450
445
private val localFileSystem: VirtualFileSystem
451
446
@@ -553,6 +548,34 @@ class Compiler(javaSourcePath: Set<Path>, classPath: Set<Path>, buildScriptClass
553
548
}
554
549
}
555
550
551
+ fun removeGeneratedCode (files : Collection <KtFile >) {
552
+ files.forEach { file ->
553
+ file.declarations.forEach { declaration ->
554
+ outputDirectory?.resolve(
555
+ file.packageFqName.asString().replace(" ." , File .separator) + File .separator + declaration.name + " .class"
556
+ )?.delete()
557
+ }
558
+ }
559
+ }
560
+
561
+ fun generateCode (container : ComponentProvider , bindingContext : BindingContext , files : Collection <KtFile >) {
562
+ outputDirectory?.let {
563
+ compileLock.withLock {
564
+ val compileEnv = compileEnvironmentFor(CompilationKind .DEFAULT )
565
+ val state = GenerationState .Builder (
566
+ project = compileEnv.environment.project,
567
+ builderFactory = ClassBuilderFactories .BINARIES ,
568
+ module = container.getService(ModuleDescriptor ::class .java),
569
+ bindingContext = bindingContext,
570
+ files = files.toList(),
571
+ configuration = compileEnv.environment.configuration
572
+ ).build()
573
+ KotlinCodegenFacade .compileCorrectFiles(state)
574
+ state.factory.writeAllTo(it)
575
+ }
576
+ }
577
+ }
578
+
556
579
override fun close () {
557
580
if (! closed) {
558
581
defaultCompileEnvironment.close()
0 commit comments