[workspace file index] don't fail if a method from SyntheticLibrary incorrectly returned null (EA-1410276)

'getSourceRoots', 'getBinaryRoots' and 'getExcludedRoots' methods in SyntheticLibrary are marked as '@NotNull', but some implementations in external plugins return null from them. Now such violations will be reported as errors mentioning the problematic plugin, but code in NonIncrementalContributors won't fail.

GitOrigin-RevId: fae1b11b3fc7e228950597bf1cf3c8cc93092aac
This commit is contained in:
Nikolay Chashnikov
2024-09-19 17:07:15 +02:00
committed by intellij-monorepo-bot
parent 5607d63c25
commit c1d98069be

View File

@@ -10,6 +10,7 @@ import com.intellij.openapi.roots.AdditionalLibraryRootsProvider
import com.intellij.openapi.roots.JavaSyntheticLibrary
import com.intellij.openapi.roots.ModuleRootManager
import com.intellij.openapi.roots.OrderRootType
import com.intellij.openapi.roots.SyntheticLibrary
import com.intellij.openapi.roots.impl.DirectoryIndexExcludePolicy
import com.intellij.openapi.roots.impl.RootFileValidityChecker
import com.intellij.openapi.vfs.VirtualFile
@@ -149,7 +150,7 @@ internal class NonIncrementalContributors(private val project: Project) {
continue
}
fun registerRoots(files: MutableCollection<VirtualFile>, kind: WorkspaceFileKind, fileSetData: WorkspaceFileSetData) {
fun registerRoots(files: Collection<VirtualFile>, kind: WorkspaceFileKind, fileSetData: WorkspaceFileSetData) {
files.forEach { root ->
RootFileValidityChecker.correctRoot(root, library, provider)?.let {
result.putValue(it, WorkspaceFileSetImpl(it, kind, NonIncrementalMarker, EntityStorageKind.MAIN, fileSetData))
@@ -157,9 +158,12 @@ internal class NonIncrementalContributors(private val project: Project) {
}
}
//todo use comparisonId for incremental updates?
registerRoots(library.sourceRoots, WorkspaceFileKind.EXTERNAL_SOURCE, if (library is JavaSyntheticLibrary) LibrarySourceRootFileSetData(null, "") else SyntheticLibrarySourceRootData)
registerRoots(library.binaryRoots, WorkspaceFileKind.EXTERNAL, if (library is JavaSyntheticLibrary) LibraryRootFileSetData(null, "") else DummyWorkspaceFileSetData)
library.excludedRoots.forEach {
val sourceRoots = checkNotNull(library.sourceRoots, "getSourceRoots()", library) ?: emptyList<VirtualFile>()
registerRoots(sourceRoots, WorkspaceFileKind.EXTERNAL_SOURCE, if (library is JavaSyntheticLibrary) LibrarySourceRootFileSetData(null, "") else SyntheticLibrarySourceRootData)
val binaryRoots = checkNotNull(library.binaryRoots, "getBinaryRoots()", library) ?: emptyList<VirtualFile>()
registerRoots(binaryRoots, WorkspaceFileKind.EXTERNAL, if (library is JavaSyntheticLibrary) LibraryRootFileSetData(null, "") else DummyWorkspaceFileSetData)
val excludedRoots = checkNotNull(library.excludedRoots, "getExcludedRoots()", library) ?: emptySet<VirtualFile>()
excludedRoots.forEach {
result.putValue(it, ExcludedFileSet.ByFileKind(WorkspaceFileKindMask.EXTERNAL, NonIncrementalMarker))
}
library.unitedExcludeCondition?.let { condition ->
@@ -172,6 +176,13 @@ internal class NonIncrementalContributors(private val project: Project) {
}
return result
}
private fun <T> checkNotNull(result: T?, methodName: String, library: SyntheticLibrary): T? {
if (result == null) {
PluginException.logPluginError(LOG, "Contract violation: SyntheticLibrary::$methodName is marked as '@NotNull', but its implementation in $library returned 'null'", null, library.javaClass)
}
return result
}
@RequiresWriteLock
fun resetCache() {