introduce JavaSyntheticLibrary to handle java roots only in DirectoryIndex.getDirectoriesByPackageName

Fixes the following case: directories under synthetic libraries roots were shown with java package icon (unexpectedly).
This commit is contained in:
Sergey Simonchik
2018-02-15 17:47:10 +03:00
parent 3b358b89d6
commit 6d3375d92e
6 changed files with 115 additions and 65 deletions
@@ -7,6 +7,7 @@ import com.intellij.openapi.project.Project
import com.intellij.openapi.projectRoots.ProjectJdkTable
import com.intellij.openapi.projectRoots.Sdk
import com.intellij.openapi.roots.AdditionalLibraryRootsProvider
import com.intellij.openapi.roots.JavaSyntheticLibrary
import com.intellij.openapi.roots.OrderRootType
import com.intellij.openapi.roots.SyntheticLibrary
import com.intellij.openapi.roots.ex.ProjectRootManagerEx
@@ -14,7 +15,6 @@ import com.intellij.openapi.util.EmptyRunnable
import com.intellij.openapi.util.registry.Registry
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.ui.AppUIUtil
import java.util.*
/**
* @author egor
@@ -28,20 +28,17 @@ class AlternativeSdkRootsProvider : AdditionalLibraryRootsProvider() {
.mapNotNull { it.alternativeJrePath }
.mapNotNull { ProjectJdkTable.getInstance().findJdk(it) }
.distinct()
.map { SdkSyntheticLibrary(it) }
.map { createSdkLibrary(it) }
.toList()
}
return emptyList()
}
class SdkSyntheticLibrary(val sdk: Sdk) : SyntheticLibrary() {
override fun getSourceRoots(): Collection<VirtualFile> = sdk.rootProvider.getFiles(OrderRootType.SOURCES).toList()
override fun getBinaryRoots(): Collection<VirtualFile> = sdk.rootProvider.getFiles(OrderRootType.CLASSES).toList()
override fun equals(other: Any?) = other is SdkSyntheticLibrary && sourceRoots == other.sourceRoots && binaryRoots == other.binaryRoots
override fun hashCode() = Objects.hash(sourceRoots, binaryRoots)
private fun createSdkLibrary(sdk: Sdk): JavaSyntheticLibrary {
return JavaSyntheticLibrary(sdk.rootProvider.getFiles(OrderRootType.SOURCES).toList(),
sdk.rootProvider.getFiles(OrderRootType.CLASSES).toList(),
emptySet<VirtualFile>(),
null)
}
companion object {