Merge remote-tracking branch 'origin/master' into BETA_JAVA9
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/ProgressImages.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/ProgressImages.java
index 4267af7..c41daa9 100644
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/ProgressImages.java
+++ b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/ProgressImages.java
@@ -30,9 +30,9 @@
 			return;
 
 		for (int i= 0; i < PROGRESS_STEPS; i++) {
-			String okname= BASE+OK+Integer.toString(i+1)+".gif"; //$NON-NLS-1$
+			String okname= BASE+OK+Integer.toString(i+1)+".png"; //$NON-NLS-1$
 			fOKImages[i]= createImage(okname);
-			String failurename= BASE+FAILURE+Integer.toString(i+1)+".gif"; //$NON-NLS-1$
+			String failurename= BASE+FAILURE+Integer.toString(i+1)+".png"; //$NON-NLS-1$
 			fFailureImages[i]= createImage(failurename);
 		}
 	}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/AssistQuickFixTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/AssistQuickFixTest.java
index d85993a..1e3d02d 100644
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/AssistQuickFixTest.java
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/AssistQuickFixTest.java
@@ -1097,6 +1097,65 @@
 			assertExpectedExistInProposals(proposals, new String[] { expected1, expected2 });
 		}
 
+	// bug 506799
+	public void testAssignToLocal17() throws Exception {
+			IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
+			StringBuffer buf= new StringBuffer();
+			buf.append("package test1;\n");
+			buf.append("\n");
+			buf.append("interface WorkItem { }\n");
+			buf.append("enum RebaseWorkItem implements WorkItem {\n");
+			buf.append("    PREPARE, APPLY_COMMIT\n");
+			buf.append("}\n");
+			buf.append("\n");
+			buf.append("public class Snippet {\n");
+			buf.append("    void foo(Class<? extends WorkItem> workItemType) throws Exception {\n");
+			buf.append("        workItemType.getEnumConstants();\n");
+			buf.append("    }\n");
+			buf.append("}\n");
+			ICompilationUnit cu= pack1.createCompilationUnit("Snippet.java", buf.toString(), false, null);
+	
+			String str= "workItemType.getEnumConstants();";
+			AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str) + str.length(), 0);
+			List<IJavaCompletionProposal> proposals= collectAssists(context, false);
+			assertNumberOfProposals(proposals, 4);
+			assertCorrectLabels(proposals);
+	
+			buf= new StringBuffer();
+			buf.append("package test1;\n");
+			buf.append("\n");
+			buf.append("interface WorkItem { }\n");
+			buf.append("enum RebaseWorkItem implements WorkItem {\n");
+			buf.append("    PREPARE, APPLY_COMMIT\n");
+			buf.append("}\n");
+			buf.append("\n");
+			buf.append("public class Snippet {\n");
+			buf.append("    void foo(Class<? extends WorkItem> workItemType) throws Exception {\n");
+			buf.append("        WorkItem[] enumConstants = workItemType.getEnumConstants();\n");
+			buf.append("    }\n");
+			buf.append("}\n");
+			String expected1= buf.toString();
+	
+			buf= new StringBuffer();
+			buf.append("package test1;\n");
+			buf.append("\n");
+			buf.append("interface WorkItem { }\n");
+			buf.append("enum RebaseWorkItem implements WorkItem {\n");
+			buf.append("    PREPARE, APPLY_COMMIT\n");
+			buf.append("}\n");
+			buf.append("\n");
+			buf.append("public class Snippet {\n");
+			buf.append("    private WorkItem[] enumConstants;\n");
+			buf.append("\n");
+			buf.append("    void foo(Class<? extends WorkItem> workItemType) throws Exception {\n");
+			buf.append("        enumConstants = workItemType.getEnumConstants();\n");
+			buf.append("    }\n");
+			buf.append("}\n");
+			String expected2= buf.toString();
+	
+			assertExpectedExistInProposals(proposals, new String[] { expected1, expected2 });
+		}
+
 	public void testAssignParamToField() throws Exception {
 		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
 		StringBuffer buf= new StringBuffer();
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpStressTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpStressTest.java
index 6e67d47..55de958 100644
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpStressTest.java
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpStressTest.java
@@ -3671,10 +3671,9 @@
         buf.append("        } else {\n");
         buf.append("            this.getWriter().println();\n");
         buf.append("            this.getWriter().println(\"FAILURES!!!\"); //$NON-NLS-1$\n");
-        buf.append("            this.getWriter()\n");
-        buf.append("                    .println(\"Tests run: \" + result.runCount() + //$NON-NLS-1$\n");
-        buf.append("                            \",  Failures: \" + result.failureCount() + //$NON-NLS-1$\n");
-        buf.append("                            \",  Errors: \" + result.errorCount()); //$NON-NLS-1$\n");
+        buf.append("            this.getWriter().println(\"Tests run: \" + result.runCount() + //$NON-NLS-1$\n");
+        buf.append("                    \",  Failures: \" + result.failureCount() + //$NON-NLS-1$\n");
+        buf.append("                    \",  Errors: \" + result.errorCount()); //$NON-NLS-1$\n");
         buf.append("        }\n");
         buf.append("        this.getWriter().println();\n");
         buf.append("    }\n");
diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/Bindings.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/Bindings.java
index a42e8a0..5a449c1 100644
--- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/Bindings.java
+++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/Bindings.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2015 IBM Corporation and others.
+ * Copyright (c) 2000, 2016 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -1163,7 +1163,11 @@
 		if (binding.isPrimitive())
 			return binding;
 		binding= normalizeTypeBinding(binding);
-		if (binding == null || !binding.isWildcardType())
+		if (binding == null)
+			return binding;
+		if (binding.isArray())
+			return normalizeForDeclarationUse(binding.getComponentType(), ast).createArrayType(1);
+		if (!binding.isWildcardType())
 			return binding;
 		ITypeBinding bound= binding.getBound();
 		if (bound == null || !binding.isUpperbound()) {
diff --git a/org.eclipse.jdt.ui/plugin.properties b/org.eclipse.jdt.ui/plugin.properties
index b011063..f3f670f 100644
--- a/org.eclipse.jdt.ui/plugin.properties
+++ b/org.eclipse.jdt.ui/plugin.properties
@@ -594,6 +594,9 @@
 HideOutputFolder.description= Hides Java output folders of the Java projects. A Java output folder is where the compiled Java classes are.
 HideJavaOutputFolder.label= Java output folders
 
+HideJavaLangObjectMembersFilter.label=Inherited members from java.lang.Object
+HideJavaLangObjectMembersFilter.description=Hides all inherited members from java.lang.Object
+
 sourceHover= Source
 sourceHoverDescription= Shows the source of the selected element, or the source near the matching opening curly brace.
 javadocHover= Javadoc
diff --git a/org.eclipse.jdt.ui/plugin.xml b/org.eclipse.jdt.ui/plugin.xml
index 5db8127..3cbc936 100644
--- a/org.eclipse.jdt.ui/plugin.xml
+++ b/org.eclipse.jdt.ui/plugin.xml
@@ -1074,7 +1074,7 @@
       <colorDefinition
             label="%JavadocBackgroundColor.label"
             categoryId="org.eclipse.jdt.ui.presentation"
-            value="COLOR_INFO_BACKGROUND"
+            defaultsTo="org.eclipse.ui.workbench.HOVER_BACKGROUND"
             id="org.eclipse.jdt.ui.Javadoc.backgroundColor">
          <description>
             %JavadocBackgroundColor.description
@@ -1083,7 +1083,7 @@
       <colorDefinition
             label="%JavadocForegroundColor.label"
             categoryId="org.eclipse.jdt.ui.presentation"
-            value="COLOR_INFO_FOREGROUND"
+            defaultsTo="org.eclipse.ui.workbench.HOVER_FOREGROUND"
             id="org.eclipse.jdt.ui.Javadoc.foregroundColor">
          <description>
             %JavadocForegroundColor.description
@@ -5305,6 +5305,14 @@
             class="org.eclipse.jdt.internal.ui.filters.SyntheticMembersFilter"
             id="org.eclipse.jdt.internal.ui.text.QuickOutline.SyntheticMembersFilter">
       </filter>
+      <filter
+            targetId="org.eclipse.jdt.internal.ui.text.QuickOutline"
+            name="%HideJavaLangObjectMembersFilter.label"
+            enabled="false"
+            description="%HideJavaLangObjectMembersFilter.description"
+            class="org.eclipse.jdt.internal.ui.filters.JavaLangObjectMembersFilter"
+            id="org.eclipse.jdt.internal.ui.text.QuickOutline.JavaLangObjectMembersFilter">
+      </filter>
 <!-- Quick Hierarchy -->
       <filter
             targetId="org.eclipse.jdt.internal.ui.typehierarchy.QuickHierarchy"
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/filters/JavaLangObjectMembersFilter.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/filters/JavaLangObjectMembersFilter.java
new file mode 100644
index 0000000..2d7fd5b
--- /dev/null
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/filters/JavaLangObjectMembersFilter.java
@@ -0,0 +1,58 @@
+/*******************************************************************************

+ * Copyright (c) 2016 Björn Michael and others.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *     Björn Michael <b.michael@gmx.de> - initial API and implementation

+ *******************************************************************************/

+package org.eclipse.jdt.internal.ui.filters;

+

+import org.eclipse.jface.viewers.Viewer;

+import org.eclipse.jface.viewers.ViewerFilter;

+

+import org.eclipse.jdt.core.IMember;

+import org.eclipse.jdt.core.IType;

+import org.eclipse.jdt.core.ITypeRoot;

+

+/**

+ * Filters out members of {@link java.lang.Object}.

+ *

+ * @author Björn Michael

+ * @since 3.13

+ */

+public class JavaLangObjectMembersFilter extends ViewerFilter {

+

+	private static final String JAVA_LANG_OBJECT_CLASS_NAME= Object.class.getName();

+

+	@Override

+	public boolean select(final Viewer viewer, final Object parentElement, final Object element) {

+		if (parentElement instanceof IType) {

+			if (JAVA_LANG_OBJECT_CLASS_NAME.equals(((IType) parentElement).getFullyQualifiedName())) {

+				return true; // java.lang.Object itself is shown; don't filter it out

+			}

+		}

+

+		if (parentElement instanceof ITypeRoot) {

+			IType primaryType= ((ITypeRoot) parentElement).findPrimaryType();

+			if (primaryType != null && JAVA_LANG_OBJECT_CLASS_NAME.equals(primaryType.getFullyQualifiedName())) {

+				return true; // top-level type is java.lang.Object itself; don't filter it out

+			}

+		}

+

+		if (element instanceof IMember) {

+			IType declaringType= ((IMember) element).getDeclaringType();

+			if (declaringType != null) {

+				String fullyQualifiedName= declaringType.getFullyQualifiedName();

+				if (JAVA_LANG_OBJECT_CLASS_NAME.equals(fullyQualifiedName)) {

+					return false;

+				}

+			}

+		}

+

+		return true;

+	}

+

+}

diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/JavaBasePreferencePage.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/JavaBasePreferencePage.java
index 986b4a0..f609274 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/JavaBasePreferencePage.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/JavaBasePreferencePage.java
@@ -24,6 +24,8 @@
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Text;
 
+import org.eclipse.core.runtime.preferences.InstanceScope;
+
 import org.eclipse.jface.dialogs.Dialog;
 import org.eclipse.jface.dialogs.IDialogConstants;
 import org.eclipse.jface.dialogs.MessageDialog;
@@ -33,6 +35,9 @@
 import org.eclipse.ui.IWorkbench;
 import org.eclipse.ui.IWorkbenchPreferencePage;
 import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.preferences.ScopedPreferenceStore;
+
+import org.eclipse.jdt.core.JavaCore;
 
 import org.eclipse.jdt.ui.PreferenceConstants;
 
@@ -61,12 +66,16 @@
 	private ArrayList<Button> fCheckBoxes;
 	private ArrayList<Button> fRadioButtons;
 	private ArrayList<Text> fTextControls;
+	private static final String PREFERENCE_STORE_KEY = "preferenceStore";
+
+	private IPreferenceStore fJavaCorePreferences;
 
 	public JavaBasePreferencePage() {
 		super();
 		setPreferenceStore(JavaPlugin.getDefault().getPreferenceStore());
 		setDescription(PreferencesMessages.JavaBasePreferencePage_description);
 
+		fJavaCorePreferences = new ScopedPreferenceStore(InstanceScope.INSTANCE, JavaCore.PLUGIN_ID);
 		fRadioButtons= new ArrayList<>();
 		fCheckBoxes= new ArrayList<>();
 		fTextControls= new ArrayList<>();
@@ -102,15 +111,19 @@
 		return button;
 	}
 
-	private Button addCheckBox(Composite parent, String label, String key) {
+	private Button addCheckBox(Composite parent, String label, IPreferenceStore preferenceStore, String key) {
+		if (preferenceStore == null) {
+			preferenceStore = getPreferenceStore();
+		}
 		GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL);
 
 		Button button= new Button(parent, SWT.CHECK);
 		button.setText(label);
 		button.setData(key);
+		button.setData(PREFERENCE_STORE_KEY, preferenceStore);
 		button.setLayoutData(gd);
 
-		button.setSelection(getPreferenceStore().getBoolean(key));
+		button.setSelection(preferenceStore.getBoolean(key));
 
 		fCheckBoxes.add(button);
 		return button;
@@ -161,9 +174,11 @@
 		refactoringGroup.setText(PreferencesMessages.JavaBasePreferencePage_refactoring_title);
 		addCheckBox(refactoringGroup,
 			PreferencesMessages.JavaBasePreferencePage_refactoring_auto_save,
+			null,
 			RefactoringSavePreferences.PREF_SAVE_ALL_EDITORS);
 		addCheckBox(refactoringGroup,
 				PreferencesMessages.JavaBasePreferencePage_refactoring_lightweight,
+				null,
 				PreferenceConstants.REFACTOR_LIGHTWEIGHT);
 
 		Group group= new Group(result, SWT.NONE);
@@ -171,8 +186,8 @@
 		group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
 		group.setText(PreferencesMessages.JavaBasePreferencePage_search);
 
-		addCheckBox(group, PreferencesMessages.JavaBasePreferencePage_search_small_menu, PreferenceConstants.SEARCH_USE_REDUCED_MENU);
-
+		addCheckBox(group, PreferencesMessages.JavaBasePreferencePage_search_small_menu, null, PreferenceConstants.SEARCH_USE_REDUCED_MENU);
+		addCheckBox(group, PreferencesMessages.JavaBasePreferencePage_DisableNewJavaIndex, fJavaCorePreferences, "disableNewJavaIndex"); //$NON-NLS-1$
 
 		layout= new GridLayout();
 		layout.numColumns= 2;
@@ -218,12 +233,13 @@
 	 */
 	@Override
 	protected void performDefaults() {
-		IPreferenceStore store= getPreferenceStore();
 		for (int i= 0; i < fCheckBoxes.size(); i++) {
 			Button button= fCheckBoxes.get(i);
 			String key= (String) button.getData();
-			button.setSelection(store.getDefaultBoolean(key));
+			IPreferenceStore buttonPreferenceStore = (IPreferenceStore) button.getData(PREFERENCE_STORE_KEY);
+			button.setSelection(buttonPreferenceStore.getDefaultBoolean(key));
 		}
+		IPreferenceStore store= getPreferenceStore();
 		for (int i= 0; i < fRadioButtons.size(); i++) {
 			Button button= fRadioButtons.get(i);
 			String[] info= (String[]) button.getData();
@@ -242,12 +258,13 @@
 	 */
 	@Override
 	public boolean performOk() {
-		IPreferenceStore store= getPreferenceStore();
 		for (int i= 0; i < fCheckBoxes.size(); i++) {
 			Button button= fCheckBoxes.get(i);
 			String key= (String) button.getData();
-			store.setValue(key, button.getSelection());
+			IPreferenceStore buttonPreferenceStore = (IPreferenceStore) button.getData(PREFERENCE_STORE_KEY);
+			buttonPreferenceStore.setValue(key, button.getSelection());
 		}
+		IPreferenceStore store= getPreferenceStore();
 		for (int i= 0; i < fRadioButtons.size(); i++) {
 			Button button= fRadioButtons.get(i);
 			if (button.getSelection()) {
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.java
index e73557a..43b016d 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.java
@@ -793,6 +793,7 @@
 	public static String ComplianceConfigurationBlock_jrecompliance_info_project;
 	public static String ProblemSeveritiesConfigurationBlock_section_generics;
 	public static String JavaBasePreferencePage_dialogs;
+	public static String JavaBasePreferencePage_DisableNewJavaIndex;
 	public static String JavaBasePreferencePage_do_not_hide_description;
 	public static String JavaBasePreferencePage_do_not_hide_button;
 	public static String JavaBasePreferencePage_do_not_hide_dialog_title;
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.properties b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.properties
index 1c19432..35c53d7 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.properties
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.properties
@@ -199,6 +199,7 @@
 JavaBasePreferencePage_openTypeHierarchy=When opening a Type Hierarchy
 JavaBasePreferencePage_inView=Show the &Type Hierarchy View in the current perspective
 JavaBasePreferencePage_dialogs=Java dialogs
+JavaBasePreferencePage_DisableNewJavaIndex=Disable &new Java index
 JavaBasePreferencePage_inPerspective=Open a new Type Hierarchy &Perspective
 
 JavaEditorPreferencePage_quickassist_lightbulb=L&ight bulb for quick assists
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/AssignToVariableAssistProposal.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/AssignToVariableAssistProposal.java
index 7f2897a..1dd2bdd 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/AssignToVariableAssistProposal.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/AssignToVariableAssistProposal.java
@@ -104,11 +104,8 @@
 		fVariableKind= variableKind;
 		fNodesToAssign= new ArrayList<>();
 		fNodesToAssign.add(node);
-		if (typeBinding.isWildcardType()) {
-			typeBinding= ASTResolving.normalizeWildcardType(typeBinding, true, node.getAST());
-		}
 
-		fTypeBinding= typeBinding;
+		fTypeBinding= Bindings.normalizeForDeclarationUse(typeBinding, node.getAST());
 		if (variableKind == LOCAL) {
 			setDisplayName(CorrectionMessages.AssignToVariableAssistProposal_assigntolocal_description);
 			setImage(JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_LOCAL));
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/PreferenceConstants.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/PreferenceConstants.java
index b698854..8b4ed63 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/PreferenceConstants.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/PreferenceConstants.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2015 IBM Corporation and others.
+ * Copyright (c) 2000, 2016 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -3915,7 +3915,7 @@
 		store.setDefault(PreferenceConstants.EDITOR_CLOSE_BRACES, true);
 		store.setDefault(PreferenceConstants.EDITOR_CLOSE_JAVADOCS, true);
 		store.setDefault(PreferenceConstants.EDITOR_WRAP_STRINGS, true);
-		store.setDefault(PreferenceConstants.EDITOR_ESCAPE_STRINGS, false);
+		store.setDefault(PreferenceConstants.EDITOR_ESCAPE_STRINGS, true);
 		store.setDefault(PreferenceConstants.EDITOR_ADD_JAVADOC_TAGS, true);
 		store.setDefault(PreferenceConstants.EDITOR_FORMAT_JAVADOCS, false);
 		store.setDefault(PreferenceConstants.EDITOR_SMART_INDENT_AFTER_NEWLINE, true);
diff --git a/org.eclipse.ltk.core.refactoring/src/org/eclipse/ltk/internal/core/refactoring/resource/DeleteResourcesProcessor.java b/org.eclipse.ltk.core.refactoring/src/org/eclipse/ltk/internal/core/refactoring/resource/DeleteResourcesProcessor.java
index a7d2b10..733019f 100644
--- a/org.eclipse.ltk.core.refactoring/src/org/eclipse/ltk/internal/core/refactoring/resource/DeleteResourcesProcessor.java
+++ b/org.eclipse.ltk.core.refactoring/src/org/eclipse/ltk/internal/core/refactoring/resource/DeleteResourcesProcessor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2012 IBM Corporation and others.
+ * Copyright (c) 2007, 2016 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -19,6 +19,7 @@
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.OperationCanceledException;
 
+import org.eclipse.core.resources.IContainer;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IFolder;
 import org.eclipse.core.resources.IProject;
@@ -122,7 +123,7 @@
 
 			for (int i= 0; i < fResources.length; i++) {
 				IResource resource= fResources[i];
-				if (!resource.isSynchronized(IResource.DEPTH_INFINITE)) {
+				if (!isSynchronizedExcludingLinkedResources(resource)) {
 					String pathLabel= BasicElementLabels.getPathLabel(resource.getFullPath(), false);
 					
 					String locationLabel= null;
@@ -173,6 +174,33 @@
 		}
 	}
 
+	/**
+	 * Checks whether this resource and its descendents are considered to be in sync with the local
+	 * file system. The linked resources and their descendents are excluded from the check.
+	 * 
+	 * @param resource the resource to check
+	 * @return <code>true</code> if this resource and its descendents except linked resources are
+	 *         synchronized, and <code>false</code> in all other cases
+	 * @throws CoreException if visiting the resource descendents fails for any reason
+	 * @see IResource#isSynchronized(int)
+	 */
+	public boolean isSynchronizedExcludingLinkedResources(IResource resource) throws CoreException {
+		boolean[] result= { true };
+		resource.accept(new IResourceVisitor() {
+			@Override
+			public boolean visit(IResource visitedResource) throws CoreException {
+				if (!result[0] || visitedResource.isLinked())
+					return false;
+				if (!visitedResource.isSynchronized(IResource.DEPTH_ZERO)) {
+					result[0]= false;
+					return false;
+				}
+				return true;
+			}
+		}, IResource.DEPTH_INFINITE, IContainer.DO_NOT_CHECK_EXISTENCE);
+		return result[0];
+	}
+
 	private void checkDirtyResources(final RefactoringStatus result) throws CoreException {
 		for (int i= 0; i < fResources.length; i++) {
 			IResource resource= fResources[i];