From cf01c4d5a1baa89b91cb05a5b3d9401e0f100af0 Mon Sep 17 00:00:00 2001 From: Sergey Simonchik Date: Wed, 1 Mar 2017 00:55:51 +0300 Subject: [PATCH] WEB-25679 NodeModulesDirectoryManager - Recursion prevented when computing FileIndex extension --- .../intellij/openapi/project/ProjectLocator.java | 16 ++++++++++++++++ .../openapi/project/ProjectLocatorImpl.java | 4 ++++ 2 files changed, 20 insertions(+) diff --git a/platform/projectModel-api/src/com/intellij/openapi/project/ProjectLocator.java b/platform/projectModel-api/src/com/intellij/openapi/project/ProjectLocator.java index 0e82d2948009..7202ca9997e9 100644 --- a/platform/projectModel-api/src/com/intellij/openapi/project/ProjectLocator.java +++ b/platform/projectModel-api/src/com/intellij/openapi/project/ProjectLocator.java @@ -20,6 +20,8 @@ package com.intellij.openapi.project; import com.intellij.openapi.components.ServiceManager; +import com.intellij.openapi.util.Key; +import com.intellij.openapi.util.ThrowableComputable; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -28,6 +30,8 @@ import java.util.Collection; public abstract class ProjectLocator { + static final Key PREFERRED_PROJECT_KEY = Key.create("PREFERRED_PROJECT_KEY"); + public static ProjectLocator getInstance() { return ServiceManager.getService(ProjectLocator.class); } @@ -50,4 +54,16 @@ public abstract class ProjectLocator { */ @NotNull public abstract Collection getProjectsForFile(VirtualFile file); + + public static T computeWithPreferredProject(@NotNull VirtualFile file, + @NotNull Project preferredProject, + @NotNull ThrowableComputable action) throws E { + file.putUserData(PREFERRED_PROJECT_KEY, preferredProject); + try { + return action.compute(); + } + finally { + file.putUserData(PREFERRED_PROJECT_KEY, null); + } + } } \ No newline at end of file diff --git a/platform/projectModel-impl/src/com/intellij/openapi/project/ProjectLocatorImpl.java b/platform/projectModel-impl/src/com/intellij/openapi/project/ProjectLocatorImpl.java index 4729b77560d2..fdde1640c75c 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/project/ProjectLocatorImpl.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/project/ProjectLocatorImpl.java @@ -41,6 +41,10 @@ public class ProjectLocatorImpl extends ProjectLocator { if (projects.length == 1 && !projects[0].isDisposed()) return projects[0]; if (file != null) { + Project preferredProject = file.getUserData(PREFERRED_PROJECT_KEY); + if (preferredProject != null) { + return preferredProject; + } for (Project project : projects) { if (project.isInitialized() && !project.isDisposed() && ProjectRootManager.getInstance(project).getFileIndex().isInContent(file)) { return project;