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 {