From fd8636b9c699bc824e5de8e6639bce0c1e16eb9e Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 13 May 2016 09:43:55 +0200 Subject: [PATCH] recreate cached value with the new provider when it's outdated, to be more tolerant to providers capturing variables from the call context --- .../src/com/intellij/util/CachedValuesManagerImpl.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/platform/core-impl/src/com/intellij/util/CachedValuesManagerImpl.java b/platform/core-impl/src/com/intellij/util/CachedValuesManagerImpl.java index 3b9016e74677..67e249f2fea5 100644 --- a/platform/core-impl/src/com/intellij/util/CachedValuesManagerImpl.java +++ b/platform/core-impl/src/com/intellij/util/CachedValuesManagerImpl.java @@ -59,7 +59,7 @@ public class CachedValuesManagerImpl extends CachedValuesManager { if (dataHolder instanceof UserDataHolderEx) { UserDataHolderEx dh = (UserDataHolderEx)dataHolder; value = dh.getUserData(key); - if (value instanceof CachedValueBase && !((CachedValueBase)value).isFromMyProject(myProject)) { + if (isOutdated(value)) { value = null; dh.putUserData(key, null); } @@ -72,7 +72,7 @@ public class CachedValuesManagerImpl extends CachedValuesManager { else { synchronized (dataHolder) { value = dataHolder.getUserData(key); - if (value instanceof CachedValueBase && !((CachedValueBase)value).isFromMyProject(myProject)) { + if (isOutdated(value)) { value = null; } if (value == null) { @@ -84,6 +84,11 @@ public class CachedValuesManagerImpl extends CachedValuesManager { return value.getValue(); } + private boolean isOutdated(CachedValue value) { + return value instanceof CachedValueBase && + (!((CachedValueBase)value).isFromMyProject(myProject) || !value.hasUpToDateValue()); + } + public Project getProject() { return myProject; }