DataInputOutputUtil.writeINT(oStream, level.ordinal());
oStream.close();
- for (VirtualFile child : fileOrDir.getChildren()) {
- if (!child.isDirectory() && isJavaLike(child.getFileType())) {
- PushedFilePropertiesUpdater.getInstance(project).filePropertiesChanged(child);
- }
- }
+ PushedFilePropertiesUpdater.getInstance(project).filePropertiesChanged(fileOrDir, f -> isJavaLike(f.getFileType()));
}
private static boolean isJavaLike(FileType type) {
import com.intellij.openapi.fileTypes.PlainTextFileType
import com.intellij.openapi.project.ProjectManager
import com.intellij.openapi.roots.impl.PushedFilePropertiesUpdater
+import com.intellij.openapi.util.Conditions
import com.intellij.openapi.vfs.VfsUtil
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.JavaPsiFacade
FileContentUtilCore.reparseFiles(file)
assert gist.getFileData(project, file) == 3
- PushedFilePropertiesUpdater.getInstance(project).filePropertiesChanged(file)
+ PushedFilePropertiesUpdater.getInstance(project).filePropertiesChanged(file, Conditions.alwaysTrue())
assert gist.getFileData(project, file) == 4
}
import com.intellij.openapi.roots.*;
import com.intellij.openapi.startup.StartupManager;
import com.intellij.openapi.util.Computable;
+import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.EmptyRunnable;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.newvfs.events.VFileCopyEvent;
}
}
+ @Override
+ public void filePropertiesChanged(@NotNull VirtualFile fileOrDir, @NotNull Condition<VirtualFile> acceptFileCondition) {
+ if (fileOrDir.isDirectory()) {
+ for (VirtualFile child : fileOrDir.getChildren()) {
+ if (!child.isDirectory() && acceptFileCondition.value(child)) {
+ filePropertiesChanged(child);
+ }
+ }
+ }
+ else if (acceptFileCondition.value(fileOrDir)) {
+ filePropertiesChanged(fileOrDir);
+ }
+ }
+
private static <T> T findPusherValuesUpwards(Project project, VirtualFile dir, FilePropertyPusher<T> pusher, T moduleValue) {
final T value = pusher.getImmediateValue(project, dir);
if (value != null) return value;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.impl.FilePropertyPusher;
import com.intellij.openapi.roots.impl.PushedFilePropertiesUpdater;
+import com.intellij.openapi.util.Conditions;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.newvfs.FileAttribute;
final DataOutputStream oStream = PERSISTENCE.writeAttribute(fileOrDir);
DataInputOutputUtil.writeINT(oStream, ourLanguagesEnumerator.getId(value.getID()));
oStream.close();
- PushedFilePropertiesUpdater.getInstance(project).filePropertiesChanged(fileOrDir);
+ PushedFilePropertiesUpdater.getInstance(project).filePropertiesChanged(fileOrDir, Conditions.alwaysTrue());
}
}
package com.intellij.openapi.roots.impl;
import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.Condition;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
public abstract void initializeProperties();
public abstract void pushAll(final FilePropertyPusher... pushers);
+
+ /**
+ * Use {@link #filePropertiesChanged(VirtualFile, Condition)}
+ */
+ @Deprecated
public abstract void filePropertiesChanged(@NotNull final VirtualFile file);
public abstract void pushAllPropertiesNow();
public abstract <T> void findAndUpdateValue(final VirtualFile fileOrDir, final FilePropertyPusher<T> pusher, final T moduleValue);
+
+ /**
+ * Invalidates indices and other caches for the given file or its immediate children (in case it's a directory).
+ * Only files matching the condition are processed.
+ */
+ public abstract void filePropertiesChanged(@NotNull VirtualFile fileOrDir, @NotNull Condition<VirtualFile> acceptFileCondition);
}
import com.intellij.facet.FacetManager;
import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.FileTypeManager;
import com.intellij.openapi.fileTypes.FileTypeRegistry;
import com.intellij.openapi.module.Module;
DataInputOutputUtil.writeINT(oStream, level.ordinal());
oStream.close();
+ PushedFilePropertiesUpdater.getInstance(project).filePropertiesChanged(fileOrDir, PythonLanguageLevelPusher::isPythonFile);
for (VirtualFile child : fileOrDir.getChildren()) {
- final FileType fileType = FileTypeRegistry.getInstance().getFileTypeByFileName(child.getName());
- if (!child.isDirectory() && PythonFileType.INSTANCE.equals(fileType)) {
+ if (!child.isDirectory() && isPythonFile(child)) {
clearSdkPathCache(child);
- PushedFilePropertiesUpdater.getInstance(project).filePropertiesChanged(child);
}
}
}
+ private static boolean isPythonFile(VirtualFile child) {
+ return PythonFileType.INSTANCE.equals(FileTypeRegistry.getInstance().getFileTypeByFileName(child.getName()));
+ }
+
private static void clearSdkPathCache(@NotNull final VirtualFile child) {
final Project[] projects = ProjectManager.getInstance().getOpenProjects();
for (Project project : projects) {