[java compiler] force FS rescan in JPS build process after changes in excluded directories or patterns (IDEA-344089)

This behavior was broken when BuildManager migrated to listen for events from Workspace Model instead of using rootsChanged. ChangeSourceFileSetTest didn't catch that because BaseCompilerTestCase still used rootsChanged.

GitOrigin-RevId: c5d67bfb423faa723b7b6c355fe07bd01906bd16
This commit is contained in:
Nikolay Chashnikov
2024-01-26 11:11:09 +01:00
committed by intellij-monorepo-bot
parent 7415b9cf59
commit 25ed897eb5
2 changed files with 17 additions and 14 deletions

View File

@@ -6,15 +6,16 @@ import com.intellij.java.workspace.entities.JavaModuleSettingsEntity;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ModuleRootEvent;
import com.intellij.openapi.roots.ModuleRootListener;
import com.intellij.openapi.util.Predicates;
import com.intellij.platform.backend.workspace.WorkspaceModelChangeListener;
import com.intellij.platform.workspace.jps.entities.ModuleEntity;
import com.intellij.platform.workspace.jps.entities.SourceRootEntity;
import com.intellij.platform.workspace.jps.entities.*;
import com.intellij.platform.workspace.storage.EntityChange;
import com.intellij.platform.workspace.storage.VersionedStorageChange;
import com.intellij.platform.workspace.storage.WorkspaceEntity;
import org.jetbrains.annotations.NotNull;
import java.util.function.BiFunction;
import java.util.function.Predicate;
public final class BuildProcessPreloadedStateClearer implements WorkspaceModelChangeListener, ModuleRootListener {
@@ -28,7 +29,15 @@ public final class BuildProcessPreloadedStateClearer implements WorkspaceModelCh
public void changed(@NotNull VersionedStorageChange event) {
boolean needFSRescan =
processEntityChanges(event, SourceRootEntity.class, ChangeProcessor.anyChange(true, false)) ||
processEntityChanges(event, ModuleEntity.class, (before, after) -> before.getDependencies().equals(after.getDependencies()),
processEntityChanges(event, ModuleEntity.class, Predicates.alwaysTrue(),
(before, after) -> before.getDependencies().equals(after.getDependencies()),
ChangeProcessor.anyChange(true, false)) ||
processEntityChanges(event, ContentRootEntity.class, Predicates.alwaysTrue(),
(before, after) -> before.getExcludedPatterns().equals(after.getExcludedPatterns()),
ChangeProcessor.anyChange(true, false)) ||
processEntityChanges(event, ExcludeUrlEntity.class,
entity -> RootsKt.getContentRoot(entity) != null,//skip changes in excluded roots of libraries
(before, after) -> before.getUrl().equals(after.getUrl()),
ChangeProcessor.anyChange(true, false)) ||
processEntityChanges(event, JavaModuleSettingsEntity.class, ChangeProcessor.anyChange(true, false));
@@ -90,11 +99,12 @@ public final class BuildProcessPreloadedStateClearer implements WorkspaceModelCh
private static <T extends WorkspaceEntity, R> R processEntityChanges(@NotNull VersionedStorageChange event,
Class<T> entityClass,
ChangeProcessor<T, R> proc) {
return processEntityChanges(event, entityClass, Object::equals, proc);
return processEntityChanges(event, entityClass, Predicates.alwaysTrue(), Object::equals, proc);
}
private static <T extends WorkspaceEntity, R> R processEntityChanges(@NotNull VersionedStorageChange event,
Class<T> entityClass,
Predicate<T> filter,
BiFunction<T, T, Boolean> equalsBy,
ChangeProcessor<T, R> proc) {
for (EntityChange<T> change : event.getChanges(entityClass)) {
@@ -103,15 +113,15 @@ public final class BuildProcessPreloadedStateClearer implements WorkspaceModelCh
boolean shouldContinue = true;
if (after != null) {
if (before != null) {
if (!equalsBy.apply(before, after)) {
if ((filter.test(before) || filter.test(after)) && !equalsBy.apply(before, after)) {
shouldContinue = proc.changed(before, after);
}
}
else {
else if (filter.test(after)) {
shouldContinue = proc.added(after);
}
}
else if (before != null) {
else if (before != null && filter.test(before)) {
shouldContinue = proc.removed(before);
}
if (!shouldContinue) {