@@ -29,17 +29,21 @@ import org.jetbrains.kotlin.config.ApiVersion
29
29
import org.jetbrains.kotlin.config.LanguageVersion
30
30
import org.jetbrains.kotlin.container.ComponentProvider
31
31
import org.jetbrains.kotlin.container.get
32
+ import org.jetbrains.kotlin.context.ModuleContext
32
33
import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar
34
+ import org.jetbrains.kotlin.descriptors.ModuleDescriptor
33
35
import org.jetbrains.kotlin.idea.KotlinLanguage
36
+ import org.jetbrains.kotlin.load.java.JavaClassesTracker
34
37
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil
35
38
import org.jetbrains.kotlin.psi.*
36
39
import org.jetbrains.kotlin.resolve.BindingContext
37
40
import org.jetbrains.kotlin.resolve.BindingTraceContext
38
41
import org.jetbrains.kotlin.resolve.LazyTopDownAnalyzer
39
- import org.jetbrains.kotlin.resolve.TopDownAnalysisMode.TopLevelDeclarations
42
+ import org.jetbrains.kotlin.resolve.TopDownAnalysisMode
40
43
import org.jetbrains.kotlin.resolve.calls.components.InferenceSession
41
44
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo
42
45
import org.jetbrains.kotlin.resolve.extensions.ExtraImportsProviderExtension
46
+ import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisHandlerExtension
43
47
import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory
44
48
import org.jetbrains.kotlin.resolve.scopes.LexicalScope
45
49
import org.jetbrains.kotlin.scripting.compiler.plugin.ScriptingCompilerConfigurationComponentRegistrar
@@ -114,9 +118,11 @@ private class CompilationEnvironment(
114
118
put(CommonConfigurationKeys .LANGUAGE_VERSION_SETTINGS , languageVersionSettings)
115
119
put(CLIConfigurationKeys .MESSAGE_COLLECTOR_KEY , LoggingMessageCollector )
116
120
add(ComponentRegistrar .PLUGIN_COMPONENT_REGISTRARS , ScriptingCompilerConfigurationComponentRegistrar ())
117
- addJavaSourceRoots(workspaceRoots.map { it.toFile() })
118
121
addJvmClasspathRoots(classPath.map { it.toFile() })
119
122
123
+ // HACK: Use the SourcePath instead
124
+ addJavaSourceRoots(workspaceRoots.flatMap { it.toFile().walk().filter { it.name.endsWith(" .java" ) }.toList() })
125
+
120
126
// Setup script templates (e.g. used by Gradle's Kotlin DSL)
121
127
val scriptDefinitions: MutableList <ScriptDefinition > = mutableListOf (ScriptDefinition .getDefault(defaultJvmScriptingHostConfiguration))
122
128
@@ -163,7 +169,11 @@ private class CompilationEnvironment(
163
169
configFiles = EnvironmentConfigFiles .JVM_CONFIG_FILES
164
170
)
165
171
166
- // TODO: Update VFS source files directly inside the environment instead of using a custom SourcePath/SourceFile mechanism
172
+ // TODO: Update VFS source files dynamically inside the environment using updateClasspath
173
+ // and use VirtualFileManager.getInstance instead of using a custom SourcePath/SourceFile mechanism.
174
+ // Documentation on the VFS is available here: https://www.jetbrains.org/intellij/sdk/docs/basics/architectural_overview/virtual_file.html
175
+ // Virtual files can be manipulated using input-/output-stream-readers. Note that each virtual file has an associated charset.
176
+
167
177
// environment.addKotlinSourceRoots(workspaceRoots.map { it.toFile() })
168
178
169
179
val project = environment.project
@@ -306,9 +316,19 @@ class Compiler(workspaceRoots: Set<Path>, classPath: Set<Path>, buildScriptClass
306
316
}
307
317
308
318
compileLock.withLock {
309
- val (container, trace) = compileEnvironmentFor(kind).createContainer(sourcePath)
310
- val topDownAnalyzer = container.get<LazyTopDownAnalyzer >()
311
- topDownAnalyzer.analyzeDeclarations(TopLevelDeclarations , files)
319
+ val compileEnv = compileEnvironmentFor(kind)
320
+ val (container, trace) = compileEnv.createContainer(sourcePath)
321
+ val module = container.get<ModuleDescriptor >()
322
+ val moduleContext = container.get<ModuleContext >()
323
+ val project = compileEnv.environment.project
324
+ val analysisHandlerExtensions = AnalysisHandlerExtension .getInstances(project)
325
+
326
+ analysisHandlerExtensions.forEach { it.doAnalysis(project, module, moduleContext, files, trace, container) }
327
+
328
+ container.get<LazyTopDownAnalyzer >().analyzeDeclarations(TopDownAnalysisMode .TopLevelDeclarations , files)
329
+ container.get<JavaClassesTracker >().onCompletedAnalysis(module)
330
+
331
+ analysisHandlerExtensions.forEach { it.analysisCompleted(project, module, trace, files) }
312
332
313
333
return Pair (trace.bindingContext, container)
314
334
}
0 commit comments