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 9be062ddcf56..ce74d01c79d7 100644 --- a/platform/projectModel-api/src/com/intellij/openapi/project/ProjectLocator.java +++ b/platform/projectModel-api/src/com/intellij/openapi/project/ProjectLocator.java @@ -20,18 +20,17 @@ 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; import java.util.Collection; +import java.util.HashMap; +import java.util.Map; public abstract class ProjectLocator { - private static final Key> PREFERRED_PROJECT_KEY = Key.create("PREFERRED_PROJECT_KEY"); - public static ProjectLocator getInstance() { return ServiceManager.getService(ProjectLocator.class); } @@ -58,22 +57,20 @@ public abstract class ProjectLocator { public static T computeWithPreferredProject(@NotNull VirtualFile file, @NotNull Project preferredProject, @NotNull ThrowableComputable action) throws E { - ThreadLocal local = file.getUserData(PREFERRED_PROJECT_KEY); - if (local == null) { - local = file.putUserDataIfAbsent(PREFERRED_PROJECT_KEY, new ThreadLocal<>()); - } - local.set(preferredProject); + Map local = ourPreferredProjects.get(); + local.put(file, preferredProject); try { return action.compute(); } finally { - local.remove(); + local.remove(file); } } @Nullable static Project getPreferredProject(@NotNull VirtualFile file) { - ThreadLocal local = file.getUserData(PREFERRED_PROJECT_KEY); - return local != null ? local.get() : null; + return ourPreferredProjects.get().get(file); } + + private static final ThreadLocal> ourPreferredProjects = ThreadLocal.withInitial(() -> new HashMap<>()); }