Merge remote-tracking branch 'origin/master' into BETA_JAVA_12

Change-Id: I74458e14252e34bf66f1c63883d8e9273c2b9936
diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/GenerateHashCodeEqualsOperation.java b/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/codemanipulation/GenerateHashCodeEqualsOperation.java
similarity index 99%
rename from org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/GenerateHashCodeEqualsOperation.java
rename to org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/codemanipulation/GenerateHashCodeEqualsOperation.java
index 3a95b37..0558e03 100644
--- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/GenerateHashCodeEqualsOperation.java
+++ b/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/codemanipulation/GenerateHashCodeEqualsOperation.java
@@ -13,6 +13,7 @@
  *     Pierre-Yves B. <pyvesdev@gmail.com> - Generation of equals and hashcode with java 7 Objects.equals and Objects.hashcode - https://bugs.eclipse.org/424214
  *     Pierre-Yves B. <pyvesdev@gmail.com> - Different behaviour when generating hashCode and equals - https://bugs.eclipse.org/539589
  *     Pierre-Yves B. <pyvesdev@gmail.com> - Confusing name when generating hashCode and equals with outer type - https://bugs.eclipse.org/539872
+ *     Red Hat Inc. - refactored to jdt.core.manipulation
  *******************************************************************************/
 package org.eclipse.jdt.internal.corext.codemanipulation;
 
diff --git a/org.eclipse.jdt.ui.tests/META-INF/MANIFEST.MF b/org.eclipse.jdt.ui.tests/META-INF/MANIFEST.MF
index bc77658..068fb22 100644
--- a/org.eclipse.jdt.ui.tests/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.ui.tests/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %Plugin.name
 Bundle-SymbolicName: org.eclipse.jdt.ui.tests; singleton:=true
-Bundle-Version: 3.13.300.qualifier
+Bundle-Version: 3.13.400.qualifier
 Bundle-Activator: org.eclipse.jdt.testplugin.JavaTestPlugin
 Bundle-ActivationPolicy: lazy
 Bundle-Vendor: %Plugin.providerName
diff --git a/org.eclipse.jdt.ui.tests/pom.xml b/org.eclipse.jdt.ui.tests/pom.xml
index 2becafc..62e2530 100644
--- a/org.eclipse.jdt.ui.tests/pom.xml
+++ b/org.eclipse.jdt.ui.tests/pom.xml
@@ -20,7 +20,7 @@
   </parent>
   <groupId>org.eclipse.jdt</groupId>
   <artifactId>org.eclipse.jdt.ui.tests</artifactId>
-  <version>3.13.300-SNAPSHOT</version>
+  <version>3.13.400-SNAPSHOT</version>
   <packaging>eclipse-test-plugin</packaging>
   <properties>
     <defaultSigning-excludeInnerJars>true</defaultSigning-excludeInnerJars>
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/TypeMismatchQuickFixTests.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/TypeMismatchQuickFixTests.java
index 7b81aa0..28183da 100644
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/TypeMismatchQuickFixTests.java
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/TypeMismatchQuickFixTests.java
@@ -1050,6 +1050,47 @@
 		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });
 	}
 
+	public void testTypeMismatchInAssignment4() throws Exception {
+		// test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=540927
+		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
+		StringBuffer buf= new StringBuffer();
+		buf.append("package test1;\n");
+		buf.append("import java.util.Map;\n");
+		buf.append("import java.util.Map.Entry;\n");
+		buf.append("import java.util.Set;\n");
+		buf.append("public class E {\n");
+		buf.append("    static void foo(Map<Integer, ? extends Number> path) {\n");
+		buf.append("        Set<Entry<Integer, ? extends Number>> s = path.entrySet();\n");
+		buf.append("        System.out.println(s);\n");
+		buf.append("    }\n");
+		buf.append("}\n");
+
+		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
+
+		CompilationUnit astRoot= getASTRoot(cu);
+		ArrayList<IJavaCompletionProposal> proposals= collectCorrections(cu, astRoot);
+		assertNumberOfProposals(proposals, 1);
+		assertCorrectLabels(proposals);
+
+		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
+		String preview1= getPreviewContent(proposal);
+
+		buf= new StringBuffer();
+		buf.append("package test1;\n");
+		buf.append("import java.util.Map;\n");
+		buf.append("import java.util.Map.Entry;\n");
+		buf.append("import java.util.Set;\n");
+		buf.append("public class E {\n");
+		buf.append("    static void foo(Map<Integer, ? extends Number> path) {\n");
+		buf.append("        Set<?> s = path.entrySet();\n");
+		buf.append("        System.out.println(s);\n");
+		buf.append("    }\n");
+		buf.append("}\n");
+		String expected1= buf.toString();
+
+		assertEqualString(preview1, expected1);
+	}
+
 	public void testTypeMismatchInExpression() throws Exception {
 
 		IPackageFragment pack0= fSourceFolder.createPackageFragment("test0", false, null);
diff --git a/org.eclipse.jdt.ui/preview/formatter.java b/org.eclipse.jdt.ui/preview/formatter.java
index d3ce991..6d460ff 100644
--- a/org.eclipse.jdt.ui/preview/formatter.java
+++ b/org.eclipse.jdt.ui/preview/formatter.java
@@ -975,7 +975,7 @@
  * between 0 and 100.
  * @param second The second parameter.
  * @throws Exception when the foo operation cannot be performed for one reason or another.
- * @return The result of the foo operation, usually within 0 and 1000.
+ * @return The result of the foo operation, usually an even number within 0 and 1000.
  */ int foo(int first, int second) throws Exception;
 }
 class Test {
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/JavaUIMessages.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/JavaUIMessages.java
index 8923383..584b327 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/JavaUIMessages.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/JavaUIMessages.java
@@ -113,6 +113,8 @@
 	public static String OverrideMethodDialog_selectioninfo_more;
 	public static String OverrideMethodDialog_link_tooltip;
 	public static String OverrideMethodDialog_link_message;
+	public static String OverrideMethodDialog_searchtext_message;
+	public static String OverrideMethodDialog_filter_description;
 
 	public static String GenerateHashCodeEqualsDialog_dialog_title;
 	public static String GenerateHashCodeEqualsDialog_selectioninfo_more;
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/JavaUIMessages.properties b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/JavaUIMessages.properties
index 7e16e3f..3252587 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/JavaUIMessages.properties
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/JavaUIMessages.properties
@@ -145,10 +145,12 @@
 OverrideMethodDialog_dialog_title=Override/Implement Methods
 OverrideMethodDialog_dialog_description=Select methods to override or implement:
 OverrideMethodDialog_selectioninfo_more={0} of {1} selected.
-
+OverrideMethodDialog_filter_description=&Enter method name, prefix or pattern (*, ? or camel case)
 OverrideMethodDialog_link_tooltip=Show the code templates preferences.
 OverrideMethodDialog_link_message=The format of the method stubs may be configured on the <a>Code Templates</a> preference page.
 
+OverrideMethodDialog_searchtext_message=Search Methods
+
 TypeSelectionDialog2_title_format={0} - {1}
 
 TypeSelectionComponent_label= &Matching types:
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/dialogs/OverrideMethodDialog.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/dialogs/OverrideMethodDialog.java
index 9942ae6..cb7f2ea 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/dialogs/OverrideMethodDialog.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/dialogs/OverrideMethodDialog.java
@@ -18,14 +18,18 @@
 import java.util.List;
 
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Link;
 import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
 
 import org.eclipse.core.runtime.IStatus;
 
@@ -33,9 +37,12 @@
 import org.eclipse.jface.action.ToolBarManager;
 import org.eclipse.jface.dialogs.IDialogSettings;
 import org.eclipse.jface.viewers.CheckboxTreeViewer;
+import org.eclipse.jface.viewers.IBaseLabelProvider;
 import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.jface.viewers.ViewerComparator;
+import org.eclipse.jface.viewers.ViewerFilter;
 
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.dialogs.ContainerCheckedTreeViewer;
@@ -63,6 +70,7 @@
 import org.eclipse.jdt.internal.ui.JavaPluginImages;
 import org.eclipse.jdt.internal.ui.JavaUIMessages;
 import org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor;
+import org.eclipse.jdt.internal.ui.util.PatternMatcher;
 import org.eclipse.jdt.internal.ui.util.ViewerPane;
 import org.eclipse.jdt.internal.ui.viewsupport.BindingLabelProvider;
 
@@ -422,8 +430,55 @@
 		return treeViewer;
 	}
 
+	@Override
+	protected Text createFilterComposite(Composite inner) {
+		Label filterTextLabel = new Label(inner, SWT.NONE);
+		filterTextLabel.setText(JavaUIMessages.OverrideMethodDialog_filter_description);
+		Text filterText= new Text(inner, SWT.SEARCH | SWT.BORDER);
+		filterText.setMessage(JavaUIMessages.OverrideMethodDialog_searchtext_message);
+		return filterText;
+	}
+
 	public boolean hasMethodsToOverride() {
 		return getContentProvider().getElements(null).length > 0;
 	}
+	
+	@Override
+	protected void addMethodSearchFilter(Text filterText, CheckboxTreeViewer treeViewer) {
+		
+		filterText.addModifyListener(new ModifyListener() {
+			@Override
+			public void modifyText(ModifyEvent e) {
+				final String searchText = filterText.getText();
+				
+				PatternMatcher matcher = new PatternMatcher(searchText);
+				ViewerFilter vf = null;
+				if(!searchText.trim().isEmpty()) {
+					vf = new ViewerFilter() {
+						
+						@Override
+						public boolean select(Viewer viewer, Object parentElement, Object element) {
+							IBaseLabelProvider lblProvider= getTreeViewer().getLabelProvider();
+							if(element instanceof ITypeBinding) {
+								return true;
+							}
+							
+							String filterableName = null;
+							if(lblProvider instanceof LabelProvider) {
+								filterableName = ((LabelProvider)lblProvider).getText(element);
+								return matcher.matches(filterableName);
+							}
+							
+							return false;
+						}
+					};
+					treeViewer.setFilters(vf);
+					treeViewer.expandAll();
+				} else {
+					treeViewer.resetFilters();
+				}
+			}
+		});
+	}
 
 }
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/dialogs/SourceActionDialog.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/dialogs/SourceActionDialog.java
index d82bb51..033ab85 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/dialogs/SourceActionDialog.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/dialogs/SourceActionDialog.java
@@ -30,6 +30,7 @@
 import org.eclipse.swt.widgets.Group;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
 import org.eclipse.swt.widgets.TreeItem;
 
 import org.eclipse.jface.dialogs.IDialogConstants;
@@ -382,7 +383,13 @@
 		innerLayout.marginWidth= 0;
 		inner.setLayout(innerLayout);
 		inner.setFont(parent.getFont());
-
+		Text filterText = createFilterComposite(inner);
+		if(filterText != null) {
+			gd = new GridData();
+			gd.widthHint = convertWidthInCharsToPixels(fWidth);
+			gd.horizontalSpan = 2 ;
+			filterText.setLayoutData(gd);
+		}
 		CheckboxTreeViewer treeViewer= createTreeViewer(inner);
 		gd= new GridData(GridData.FILL_BOTH);
 		gd.widthHint = convertWidthInCharsToPixels(fWidth);
@@ -409,11 +416,19 @@
 		gd= new GridData(GridData.FILL_BOTH);
 		composite.setLayoutData(gd);
 
+		if(filterText != null) {
+			addMethodSearchFilter(filterText, treeViewer);
+			filterText.forceFocus();
+		}
 		applyDialogFont(composite);
 
 		return composite;
 	}
 
+	protected Text createFilterComposite(@SuppressWarnings("unused") Composite inner) {
+		return null; // No filter as default
+	}
+		
 	/**
 	 * Clients override to provide link control
 	 *
@@ -703,5 +718,10 @@
 	protected IDialogSettings getDialogBoundsSettings() {
 		return JavaPlugin.getDefault().getDialogSettingsSection("DialogBounds_" + getClass().getSimpleName()); //$NON-NLS-1$
 	}
+	
+	@SuppressWarnings("unused")
+	protected void addMethodSearchFilter(Text filterText, CheckboxTreeViewer treeViewer) {
+		//Default is do nothing
+	}
 
 }
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/ComplianceConfigurationBlock.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/ComplianceConfigurationBlock.java
index 2026bbd..a626501 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/ComplianceConfigurationBlock.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/ComplianceConfigurationBlock.java
@@ -62,6 +62,7 @@
 import org.eclipse.jdt.core.IClasspathEntry;
 import org.eclipse.jdt.core.JavaCore;
 
+import org.eclipse.jdt.internal.core.manipulation.util.BasicElementLabels;
 import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
 import org.eclipse.jdt.internal.corext.util.Messages;
 
@@ -72,7 +73,6 @@
 
 import org.eclipse.jdt.internal.ui.JavaPlugin;
 import org.eclipse.jdt.internal.ui.dialogs.StatusInfo;
-import org.eclipse.jdt.internal.core.manipulation.util.BasicElementLabels;
 import org.eclipse.jdt.internal.ui.wizards.IStatusChangeListener;
 import org.eclipse.jdt.internal.ui.wizards.buildpaths.BuildPathSupport;
 import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil;
@@ -167,12 +167,14 @@
 	 * @see #IDX_COMPLIANCE
 	 * @see #IDX_INLINE_JSR_BYTECODE
 	 * @see #IDX_METHOD_PARAMETERS_ATTR
+	 * @see #IDX_RELEASE
 	 */
 	private String[] fRememberedUserCompliance;
 	
 	/**
-	 * Stored compliance settings that were active when the page was first shown. May be <code>null</code>.
-	 * Elements are identified by <code>IDX_*</code> constants.
+	 * Stored compliance settings that were active when the page was first shown. May be
+	 * <code>null</code>. Elements are identified by <code>IDX_*</code> constants.
+	 * 
 	 * @see #IDX_ASSERT_AS_IDENTIFIER
 	 * @see #IDX_ENUM_AS_IDENTIFIER
 	 * @see #IDX_SOURCE_COMPATIBILITY
@@ -180,6 +182,7 @@
 	 * @see #IDX_COMPLIANCE
 	 * @see #IDX_INLINE_JSR_BYTECODE
 	 * @see #IDX_METHOD_PARAMETERS_ATTR
+	 * @see #IDX_RELEASE
 	 */
 	private String[] fOriginalStoredCompliance;
 
@@ -659,6 +662,7 @@
 			updateComplianceEnableState();
 			validateComplianceStatus();
 			updateInlineJSREnableState();
+			updateAssertEnumAsIdentifierEnableState();
 			updateStoreMethodParamNamesEnableState();
 		}
 	}
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/FormatterMessages.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/FormatterMessages.java
index afafc74..2a7a199 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/FormatterMessages.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/FormatterMessages.java
@@ -74,6 +74,7 @@
 	public static String FormatterModifyDialog_comments_pref_format_html;
 	public static String FormatterModifyDialog_comments_pref_format_line_comments_on_first_column;
 	public static String FormatterModifyDialog_comments_pref_indent_description_after_param;
+	public static String FormatterModifyDialog_comments_pref_indent_other_tag_descriptions;
 	public static String FormatterModifyDialog_comments_pref_javadoc_align;
 	public static String FormatterModifyDialog_comments_pref_javadoc_align_none;
 	public static String FormatterModifyDialog_comments_pref_javadoc_align_names_and_descriptions;
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/FormatterMessages.properties b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/FormatterMessages.properties
index af35cec..61e15b4 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/FormatterMessages.properties
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/FormatterMessages.properties
@@ -296,6 +296,7 @@
 FormatterModifyDialog_comments_pref_javadoc_align_descriptions_grouped=Align descriptions, grouped by type
 FormatterModifyDialog_comments_pref_javadoc_align_descriptions_to_tag=Align descriptions to tag width
 FormatterModifyDialog_comments_pref_indent_description_after_param=Indent wrapped @param/@throws descriptions
+FormatterModifyDialog_comments_pref_indent_other_tag_descriptions=Indent other tag descriptions when wrapped
 FormatterModifyDialog_comments_pref_new_line_after_param_tags=New line before @param/@throws descriptions
 FormatterModifyDialog_comments_pref_line_width=Maximum width for comments:
 FormatterModifyDialog_comments_pref_line_width_count_from_starting_position=Count width from comment's starting position
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/FormatterModifyDialog.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/FormatterModifyDialog.java
index 6b5f73a..84850eb 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/FormatterModifyDialog.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/FormatterModifyDialog.java
@@ -1417,10 +1417,12 @@
 				alignPref.addLabel(FormatterMessages.FormatterModifyDialog_comments_pref_javadoc_align, true, fTree.getIndent(parent));
 				fTree.addChild(parent, alignPref);
 
-				fTree.addCheckbox(alignPref, FormatterMessages.FormatterModifyDialog_comments_pref_indent_description_after_param,
-						DefaultCodeFormatterConstants.FORMATTER_COMMENT_INDENT_PARAMETER_DESCRIPTION, CheckboxPreference.FALSE_TRUE);
 				fTree.addCheckbox(alignPref, FormatterMessages.FormatterModifyDialog_comments_pref_new_line_after_param_tags,
 						DefaultCodeFormatterConstants.FORMATTER_COMMENT_INSERT_NEW_LINE_FOR_PARAMETER, CheckboxPreference.DO_NOT_INSERT_INSERT);
+				fTree.addCheckbox(alignPref, FormatterMessages.FormatterModifyDialog_comments_pref_indent_description_after_param,
+						DefaultCodeFormatterConstants.FORMATTER_COMMENT_INDENT_PARAMETER_DESCRIPTION, CheckboxPreference.FALSE_TRUE);
+				fTree.addCheckbox(alignPref, FormatterMessages.FormatterModifyDialog_comments_pref_indent_other_tag_descriptions,
+						DefaultCodeFormatterConstants.FORMATTER_COMMENT_INDENT_TAG_DESCRIPTION, CheckboxPreference.FALSE_TRUE);
 				return alignPref;
 			}
 		};
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/TypeChangeCorrectionProposal.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/TypeChangeCorrectionProposal.java
index 41f7341..57d2ad3 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/TypeChangeCorrectionProposal.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/TypeChangeCorrectionProposal.java
@@ -52,6 +52,8 @@
 import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.TypeLocation;
 import org.eclipse.jdt.core.dom.rewrite.ListRewrite;
 
+import org.eclipse.jdt.internal.core.manipulation.dom.ASTResolving;
+import org.eclipse.jdt.internal.core.manipulation.util.BasicElementLabels;
 import org.eclipse.jdt.internal.corext.codemanipulation.ContextSensitiveImportRewriteContext;
 import org.eclipse.jdt.internal.corext.dom.Bindings;
 import org.eclipse.jdt.internal.corext.dom.DimensionRewrite;
@@ -65,9 +67,6 @@
 import org.eclipse.jdt.internal.ui.JavaPluginImages;
 import org.eclipse.jdt.internal.ui.text.correction.CorrectionMessages;
 import org.eclipse.jdt.internal.ui.text.correction.JavadocTagsSubProcessor;
-
-import org.eclipse.jdt.internal.core.manipulation.dom.ASTResolving;
-import org.eclipse.jdt.internal.core.manipulation.util.BasicElementLabels;
 import org.eclipse.jdt.internal.ui.viewsupport.BindingLabelProvider;
 
 public class TypeChangeCorrectionProposal extends LinkedCorrectionProposal {
@@ -116,7 +115,13 @@
 		if (isNewTypeVar) {
 			typeName= VAR_TYPE;
 		} else {
-			typeName= BindingLabelProvider.getBindingLabel(fNewType, JavaElementLabels.ALL_DEFAULT);
+			// Bug 540927 - if type contains nested capture, we need to get the name
+			// that the type will eventually be resolved to
+			if (containsNestedCapture(fNewType, false)) {
+				typeName= getNewTypeString();
+			} else {
+				typeName= BindingLabelProvider.getBindingLabel(fNewType, JavaElementLabels.ALL_DEFAULT);
+			}
 		}
 		if (binding.getKind() == IBinding.VARIABLE) {
 			IVariableBinding varBinding= (IVariableBinding) binding;
@@ -137,6 +142,50 @@
 			setDisplayName(Messages.format(CorrectionMessages.TypeChangeCompletionProposal_method_name, args));
 		}
 	}
+	
+	private boolean containsNestedCapture(ITypeBinding binding, boolean isNested) {
+		if (binding == null || binding.isPrimitive() || binding.isTypeVariable()) {
+			return false;
+		}
+		if (binding.isCapture()) {
+			if (isNested) {
+				return true;
+			}
+			return containsNestedCapture(binding.getWildcard(), true);
+		}
+		if (binding.isWildcardType()) {
+			return containsNestedCapture(binding.getBound(), true);
+		}
+		if (binding.isArray()) {
+			return containsNestedCapture(binding.getElementType(), true);
+		}
+		ITypeBinding[] typeArguments= binding.getTypeArguments();
+		for (int i= 0; i < typeArguments.length; i++) {
+			if (containsNestedCapture(typeArguments[i], true)) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	private String getNewTypeString() {
+		ASTNode boundNode= fAstRoot.findDeclaringNode(fBinding);
+		ASTNode declNode= null;
+		CompilationUnit newRoot= fAstRoot;
+		if (boundNode != null) {
+			declNode= boundNode; // is same CU
+		} else {
+			newRoot= ASTResolving.createQuickFixAST(getCompilationUnit(), null);
+			declNode= newRoot.findDeclaringNode(fBinding.getKey());
+		}
+		if (declNode != null) {
+			ImportRewrite imports= createImportRewrite(newRoot);
+			ImportRewriteContext context= new ContextSensitiveImportRewriteContext(newRoot, declNode.getStartPosition(), imports);
+
+			return imports.addImport(fNewType, context);
+		}
+		return BindingLabelProvider.getBindingLabel(fNewType, JavaElementLabels.ALL_DEFAULT);
+	}
 
 	@Override
 	protected ASTRewrite getRewrite() throws CoreException {