diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/LinkedResourceDecorator.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/LinkedResourceDecorator.java index f4dd754bd00..47c3c879ecf 100644 --- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/LinkedResourceDecorator.java +++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/LinkedResourceDecorator.java @@ -18,8 +18,10 @@ import java.net.URI; import java.util.Optional; +import org.eclipse.core.filesystem.EFS; import org.eclipse.core.filesystem.IFileInfo; import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.ResourceAttributes; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.ResourceLocator; import org.eclipse.jface.viewers.IDecoration; @@ -108,8 +110,20 @@ public void decorate(Object element, IDecoration decoration) { } else { LINK_WARNING.ifPresent(decoration::addOverlay); } + } else { + // broken filesystem symlinks (not Eclipse-linked, but a symlink with missing + // target) + ResourceAttributes attrs = resource.getResourceAttributes(); + if (attrs == null) { + URI location = resource.getLocationURI(); + if (location != null) { + IFileInfo fileInfo = IDEResourceInfoUtils.getFileInfo(location); + if (fileInfo != null && fileInfo.getAttribute(EFS.ATTRIBUTE_SYMLINK)) { + LINK_WARNING.ifPresent(decoration::addOverlay); + } + } + } } - } } diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/SymlinkDecorator.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/SymlinkDecorator.java index cd82135a07d..3647f8a50f7 100644 --- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/SymlinkDecorator.java +++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/SymlinkDecorator.java @@ -14,8 +14,11 @@ *******************************************************************************/ package org.eclipse.ui.internal.ide; +import java.net.URI; import java.util.Optional; +import org.eclipse.core.filesystem.EFS; +import org.eclipse.core.filesystem.IFileInfo; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourceAttributes; import org.eclipse.core.resources.mapping.ResourceMapping; @@ -25,6 +28,7 @@ import org.eclipse.jface.viewers.IDecoration; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ILightweightLabelDecorator; +import org.eclipse.ui.internal.ide.dialogs.IDEResourceInfoUtils; /** * Decorate symbolic links @@ -68,8 +72,18 @@ public void decorate(Object element, IDecoration decoration) { IResource resource = Adapters.adapt(element, IResource.class); if (resource != null) { ResourceAttributes resourceAttributes = resource.getResourceAttributes(); - if (resourceAttributes != null && resourceAttributes.isSymbolicLink()) { - SYMLINK.ifPresent(decoration::addOverlay); + if (resourceAttributes != null) { + if (resourceAttributes.isSymbolicLink()) { + SYMLINK.ifPresent(decoration::addOverlay); + } + } else { + URI location = resource.getLocationURI(); + if (location != null) { + IFileInfo fileInfo = IDEResourceInfoUtils.getFileInfo(location); + if (fileInfo != null && fileInfo.getAttribute(EFS.ATTRIBUTE_SYMLINK)) { + SYMLINK.ifPresent(decoration::addOverlay); + } + } } } }