getContainingFile() and getProject() have to be executed under read lock

This commit is contained in:
Nikolay Krasko
2014-10-02 18:35:03 +04:00
parent 74242a5fd9
commit c80cdb4790
2 changed files with 36 additions and 23 deletions
@@ -16,12 +16,13 @@
package org.jetbrains.jet.plugin; package org.jetbrains.jet.plugin;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.roots.ProjectFileIndex;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFile;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.JetCodeFragment;
import org.jetbrains.jet.plugin.configuration.JetModuleTypeManager; import org.jetbrains.jet.plugin.configuration.JetModuleTypeManager;
public class ProjectRootsUtil { public class ProjectRootsUtil {
@@ -29,17 +30,22 @@ public class ProjectRootsUtil {
return isInSource(element, true); return isInSource(element, true);
} }
public static boolean isInSource(@NotNull PsiElement element, boolean includeLibrarySources) { public static boolean isInSource(@NotNull final PsiElement element, final boolean includeLibrarySources) {
PsiFile containingFile = element.getContainingFile(); return ApplicationManager.getApplication().runReadAction(new Computable<Boolean>() {
if (containingFile == null) { @Override
return false; public Boolean compute() {
} PsiFile containingFile = element.getContainingFile();
VirtualFile virtualFile = containingFile.getVirtualFile(); if (containingFile == null) {
if (virtualFile == null) { return false;
return false; }
} VirtualFile virtualFile = containingFile.getVirtualFile();
ProjectFileIndex index = ProjectFileIndex.SERVICE.getInstance(element.getProject()); if (virtualFile == null) {
return includeLibrarySources ? index.isInSource(virtualFile) : index.isInSourceContent(virtualFile); return false;
}
ProjectFileIndex index = ProjectFileIndex.SERVICE.getInstance(element.getProject());
return includeLibrarySources ? index.isInSource(virtualFile) : index.isInSourceContent(virtualFile);
}
});
} }
public static boolean isInSourceWithGradleCheck(@NotNull PsiElement element) { public static boolean isInSourceWithGradleCheck(@NotNull PsiElement element) {
@@ -18,10 +18,12 @@ package org.jetbrains.jet.plugin;
import com.intellij.facet.Facet; import com.intellij.facet.Facet;
import com.intellij.facet.FacetManager; import com.intellij.facet.FacetManager;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.module.Module; import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtilCore; import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFile;
@@ -30,20 +32,25 @@ import org.jetbrains.jet.plugin.configuration.JetModuleTypeManager;
public class JetModuleTypeManagerImpl extends JetModuleTypeManager { public class JetModuleTypeManagerImpl extends JetModuleTypeManager {
@Override @Override
public boolean isKtFileInGradleProjectInWrongFolder(@NotNull PsiElement element) { public boolean isKtFileInGradleProjectInWrongFolder(@NotNull final PsiElement element) {
PsiFile containingFile = element.getContainingFile(); return ApplicationManager.getApplication().runReadAction(new Computable<Boolean>() {
if (containingFile == null) { @Override
return false; public Boolean compute() {
} PsiFile containingFile = element.getContainingFile();
VirtualFile virtualFile = containingFile.getVirtualFile(); if (containingFile == null) {
if (virtualFile == null) { return false;
return false; }
} VirtualFile virtualFile = containingFile.getVirtualFile();
return isKtFileInGradleProjectInWrongFolder(virtualFile, element.getProject()); if (virtualFile == null) {
return false;
}
return isKtFileInGradleProjectInWrongFolder(virtualFile, element.getProject());
}
});
} }
@Override @Override
public boolean isKtFileInGradleProjectInWrongFolder(@NotNull VirtualFile virtualFile, @NotNull Project project ) { public boolean isKtFileInGradleProjectInWrongFolder(@NotNull VirtualFile virtualFile, @NotNull Project project) {
Module module = ModuleUtilCore.findModuleForFile(virtualFile, project); Module module = ModuleUtilCore.findModuleForFile(virtualFile, project);
if (module == null) return false; if (module == null) return false;