Skip to content

Commit a4fad97

Browse files
committed
Implement experimental detection of Java source files
1 parent 1ce35c2 commit a4fad97

File tree

1 file changed

+26
-6
lines changed

1 file changed

+26
-6
lines changed

server/src/main/kotlin/org/javacs/kt/Compiler.kt

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,21 @@ import org.jetbrains.kotlin.config.ApiVersion
2929
import org.jetbrains.kotlin.config.LanguageVersion
3030
import org.jetbrains.kotlin.container.ComponentProvider
3131
import org.jetbrains.kotlin.container.get
32+
import org.jetbrains.kotlin.context.ModuleContext
3233
import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar
34+
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
3335
import org.jetbrains.kotlin.idea.KotlinLanguage
36+
import org.jetbrains.kotlin.load.java.JavaClassesTracker
3437
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil
3538
import org.jetbrains.kotlin.psi.*
3639
import org.jetbrains.kotlin.resolve.BindingContext
3740
import org.jetbrains.kotlin.resolve.BindingTraceContext
3841
import org.jetbrains.kotlin.resolve.LazyTopDownAnalyzer
39-
import org.jetbrains.kotlin.resolve.TopDownAnalysisMode.TopLevelDeclarations
42+
import org.jetbrains.kotlin.resolve.TopDownAnalysisMode
4043
import org.jetbrains.kotlin.resolve.calls.components.InferenceSession
4144
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo
4245
import org.jetbrains.kotlin.resolve.extensions.ExtraImportsProviderExtension
46+
import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisHandlerExtension
4347
import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory
4448
import org.jetbrains.kotlin.resolve.scopes.LexicalScope
4549
import org.jetbrains.kotlin.scripting.compiler.plugin.ScriptingCompilerConfigurationComponentRegistrar
@@ -114,9 +118,11 @@ private class CompilationEnvironment(
114118
put(CommonConfigurationKeys.LANGUAGE_VERSION_SETTINGS, languageVersionSettings)
115119
put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, LoggingMessageCollector)
116120
add(ComponentRegistrar.PLUGIN_COMPONENT_REGISTRARS, ScriptingCompilerConfigurationComponentRegistrar())
117-
addJavaSourceRoots(workspaceRoots.map { it.toFile() })
118121
addJvmClasspathRoots(classPath.map { it.toFile() })
119122

123+
// HACK: Use the SourcePath instead
124+
addJavaSourceRoots(workspaceRoots.flatMap { it.toFile().walk().filter { it.name.endsWith(".java") }.toList() })
125+
120126
// Setup script templates (e.g. used by Gradle's Kotlin DSL)
121127
val scriptDefinitions: MutableList<ScriptDefinition> = mutableListOf(ScriptDefinition.getDefault(defaultJvmScriptingHostConfiguration))
122128

@@ -163,7 +169,11 @@ private class CompilationEnvironment(
163169
configFiles = EnvironmentConfigFiles.JVM_CONFIG_FILES
164170
)
165171

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+
167177
// environment.addKotlinSourceRoots(workspaceRoots.map { it.toFile() })
168178

169179
val project = environment.project
@@ -306,9 +316,19 @@ class Compiler(workspaceRoots: Set<Path>, classPath: Set<Path>, buildScriptClass
306316
}
307317

308318
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) }
312332

313333
return Pair(trace.bindingContext, container)
314334
}

0 commit comments

Comments
 (0)