Use safer way of filtering out files from other modules

Comparing files by paths is too error-prone and it created a problem
here, where paths of File instances on Windows use "\" as a separator,
whereas VirtualFile paths always use "/", resulting in empty source
lists being compiled. This issue was introduced in 1582354077. Instead,
get the instance of the VirtualFile by path, and use its identity for
comparison
This commit is contained in:
Alexander Udalov
2018-08-10 02:43:23 +03:00
parent 59c41e111d
commit 587ce56ad6
@@ -18,7 +18,9 @@ package org.jetbrains.kotlin.cli.jvm.compiler
import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.StandardFileSystems
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import com.intellij.openapi.vfs.VirtualFileManager
import com.intellij.psi.PsiJavaModule import com.intellij.psi.PsiJavaModule
import com.intellij.psi.PsiManager import com.intellij.psi.PsiManager
import com.intellij.psi.impl.PsiModificationTrackerImpl import com.intellij.psi.impl.PsiModificationTrackerImpl
@@ -64,13 +66,13 @@ import java.net.URLClassLoader
object KotlinToJVMBytecodeCompiler { object KotlinToJVMBytecodeCompiler {
private fun getAbsolutePaths(buildFile: File, module: Module): List<String> { private fun getAbsoluteFiles(buildFile: File, module: Module): List<File> {
return module.getSourceFiles().map { sourceFile -> return module.getSourceFiles().map { sourceFile ->
val source = File(sourceFile) val source = File(sourceFile)
if (!source.isAbsolute) { if (!source.isAbsolute) {
File(buildFile.absoluteFile.parentFile, sourceFile).absolutePath File(buildFile.absoluteFile.parentFile, sourceFile)
} else { } else {
source.absolutePath source
} }
} }
} }
@@ -136,10 +138,12 @@ object KotlinToJVMBytecodeCompiler {
val outputs = newLinkedHashMapWithExpectedSize<Module, GenerationState>(chunk.size) val outputs = newLinkedHashMapWithExpectedSize<Module, GenerationState>(chunk.size)
val localFileSystem = VirtualFileManager.getInstance().getFileSystem(StandardFileSystems.FILE_PROTOCOL)
for (module in chunk) { for (module in chunk) {
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled() ProgressIndicatorAndCompilationCanceledStatus.checkCanceled()
val moduleSourcePaths = getAbsolutePaths(buildFile, module) val moduleSourceFiles = getAbsoluteFiles(buildFile, module).map { file -> localFileSystem.findFileByPath(file.path) }
val ktFiles = environment.getSourceFiles().filter { file -> file.virtualFilePath in moduleSourcePaths } val ktFiles = environment.getSourceFiles().filter { file -> file.virtualFile in moduleSourceFiles }
if (!checkKotlinPackageUsage(environment, ktFiles)) return false if (!checkKotlinPackageUsage(environment, ktFiles)) return false
@@ -180,7 +184,7 @@ object KotlinToJVMBytecodeCompiler {
internal fun configureSourceRoots(configuration: CompilerConfiguration, chunk: List<Module>, buildFile: File) { internal fun configureSourceRoots(configuration: CompilerConfiguration, chunk: List<Module>, buildFile: File) {
for (module in chunk) { for (module in chunk) {
configuration.addKotlinSourceRoots(getAbsolutePaths(buildFile, module)) configuration.addKotlinSourceRoots(getAbsoluteFiles(buildFile, module).map(File::getPath))
} }
for (module in chunk) { for (module in chunk) {