diff --git a/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Workspace.java b/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Workspace.java
index 690cb8fe72e..16d458a404e 100644
--- a/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Workspace.java
+++ b/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Workspace.java
@@ -1870,14 +1870,14 @@ public ResourceInfo getResourceInfo(IPath path, boolean phantom, boolean mutable
Assert.isNotNull(info, "Tree root info must never be null"); //$NON-NLS-1$
return info;
}
- ResourceInfo result = null;
- if (!tree.includes(path)) {
- return null;
- }
+ ResourceInfo result;
if (mutable) {
+ if (!tree.includes(path)) {
+ return null;
+ }
result = (ResourceInfo) tree.openElementData(path);
} else {
- result = (ResourceInfo) tree.getElementData(path);
+ result = (ResourceInfo) tree.getElementDataOrNull(path);
}
if (result != null && (!phantom && result.isSet(M_PHANTOM))) {
return null;
diff --git a/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/watson/ElementTree.java b/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/watson/ElementTree.java
index a0820ade654..a7b59d26c85 100644
--- a/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/watson/ElementTree.java
+++ b/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/watson/ElementTree.java
@@ -384,6 +384,26 @@ public DeltaDataTree getDataTree() {
return tree;
}
+ /**
+ * Returns the element data for the given element identifier, or
+ * null if the element is not present in this tree.
+ *
+ * Unlike {@link #includes(IPath)} followed by {@link #getElementData(IPath)} + * this performs at most one tree lookup. + */ + public Object getElementDataOrNull(IPath key) { + if (key.isRoot()) { + return null; + } + synchronized (this) { + DataTreeLookup lookup = lookupCache; // Grab it in case it's replaced concurrently. + if (lookup == null || lookup.key != key) { + lookupCache = lookup = tree.lookup(key); + } + return lookup.isPresent ? lookup.data : null; + } + } + /** * Returns the element data for the given element identifier. * The given element must be present in this tree.