introduced PushedFilePropertiesUpdater.filePropertiesChanged(file, condition) for...
authorMaxim.Mossienko <Maxim.Mossienko@jetbrains.com>
Fri, 11 Nov 2016 17:53:36 +0000 (18:53 +0100)
committerMaxim.Mossienko <Maxim.Mossienko@jetbrains.com>
Fri, 11 Nov 2016 17:55:16 +0000 (18:55 +0100)
java/java-analysis-impl/src/com/intellij/openapi/roots/impl/JavaLanguageLevelPusher.java
java/java-tests/testSrc/com/intellij/util/gist/FileGistTest.groovy
platform/lang-impl/src/com/intellij/openapi/roots/impl/PushedFilePropertiesUpdaterImpl.java
platform/lang-impl/src/com/intellij/psi/templateLanguages/TemplateDataLanguagePusher.java
platform/projectModel-api/src/com/intellij/openapi/roots/impl/PushedFilePropertiesUpdater.java
python/src/com/jetbrains/python/psi/impl/PythonLanguageLevelPusher.java

index 066d1c3643eb48976bbb2ea6d695a763a5b4dbfe..71fa0ce43b9be1b4c65bfb85a364993ee8518eb2 100644 (file)
@@ -107,11 +107,7 @@ public class JavaLanguageLevelPusher implements FilePropertyPusher<LanguageLevel
     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) {
index a1c67d03b80816901c13a8409c65ed58545cf158..875744717c450088c54845fd7544849b25f8ffb0 100644 (file)
@@ -20,6 +20,7 @@ import com.intellij.openapi.fileEditor.impl.LoadTextUtil
 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
@@ -78,7 +79,7 @@ class FileGistTest extends LightCodeInsightFixtureTestCase {
     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
   }
 
index 1310222eea24a74448935d23885261a3b6365f50..19713ac11234291be36b0109095edf4795e6ebf4 100644 (file)
@@ -37,6 +37,7 @@ import com.intellij.openapi.project.*;
 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;
@@ -216,6 +217,20 @@ public class PushedFilePropertiesUpdaterImpl extends PushedFilePropertiesUpdater
     }
   }
 
+  @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;
index daa7557ac1ddf315738afd5318117e045ee3ebb2..60c0e0338b469a9ddb76b30fe406f22488ee0541 100644 (file)
@@ -20,6 +20,7 @@ import com.intellij.openapi.module.Module;
 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;
@@ -112,7 +113,7 @@ public class TemplateDataLanguagePusher implements FilePropertyPusher<Language>
       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());
     }
   }
 
index 3b8a92297d6b6dd091a647d45d5b5e546f0ae298..37618bf1369aa85f86897990a287426ecee14849 100644 (file)
@@ -16,6 +16,7 @@
 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;
 
@@ -27,7 +28,18 @@ public abstract class PushedFilePropertiesUpdater {
 
   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);
 }
index ce669a0a6a9e7484696cdbcd04af29594bef91a0..acc703b8cdb5ed023cea698f4d775d7d5d61660a 100644 (file)
@@ -19,7 +19,6 @@ import com.intellij.facet.Facet;
 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;
@@ -183,15 +182,18 @@ public class PythonLanguageLevelPusher implements FilePropertyPusher<LanguageLev
     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) {