Bug 533740 - Keyword super/this is proposed in cases where it is not
allowed
Change-Id: I579a5a2fb14c12f72a7fff6b63a687532f8b1bbb
Signed-off-by: Vikas Chandra <Vikas.Chandra@in.ibm.com>
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests.java
index c1c8fe0..055a802 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests.java
@@ -22064,9 +22064,7 @@
"element:RANKING_ATTRIBUTE_V2 completion:RANKING_ATTRIBUTE_V2 relevance:" + relevance +"\n" +
"element:REFERENCE_ATTRIBUTE completion:REFERENCE_ATTRIBUTE relevance:" + relevance +"\n" +
"element:WORK_ATTRIBUTE completion:WORK_ATTRIBUTE relevance:" + relevance +"\n" +
- "element:class completion:class relevance:" + relevance +"\n" +
- "element:super completion:super relevance:" + relevance + "\n" +
- "element:this completion:this relevance:" + relevance,
+ "element:class completion:class relevance:" + relevance,
requestor.getResults());
} finally {
// Restore compliance settings.
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests18.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests18.java
index 991b942..07728ab 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests18.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests18.java
@@ -239,8 +239,6 @@
assertResults(
"class[FIELD_REF]{class, null, Ljava.lang.Class<LX;>;, class, null, " + (R_DEFAULT + 21) + "}\n" +
"f[FIELD_REF]{f, LX;, LFoo;, f, null, " + (R_DEFAULT + 21) + "}\n" +
- "super[KEYWORD]{super, null, null, super, null, " + (R_DEFAULT + 21) + "}\n" +
- "this[KEYWORD]{this, null, null, this, null, " + (R_DEFAULT + 21) + "}\n" +
"x1[FIELD_REF]{x1, LX;, I, x1, null, " + (R_DEFAULT + 51) + "}",
requestor.getResults());
}
diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java
index 651cb61..7b3aa9b 100644
--- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java
+++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java
@@ -16,6 +16,7 @@
package org.eclipse.jdt.internal.codeassist;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashSet;
@@ -9767,8 +9768,44 @@
((scope instanceof MethodScope && !((MethodScope)scope).isStatic)
|| ((methodScope = scope.enclosingMethodScope()) != null && !methodScope.isStatic))) {
if (token.length >= 0) {
- findKeywords(token, new char[][]{Keywords.THIS, Keywords.SUPER}, true, false);
- }
+ boolean isInterface = false;
+ if (receiverType != null) {
+ isInterface = receiverType.isInterface();
+ }
+ if (!isInterface) {
+ findKeywords(token, new char[][] { Keywords.THIS, Keywords.SUPER }, true, false);
+ } else {
+ boolean isEqual = false;
+ char[] enclosingSourceName = null;
+ if(scope.enclosingSourceType() != null)
+ enclosingSourceName = scope.enclosingSourceType().sourceName;
+ char[] receiverSourceName = null;
+ if (receiverType != null) {
+ receiverSourceName = receiverType.sourceName;
+ }
+ if( enclosingSourceName !=null & receiverSourceName !=null)
+ isEqual = Arrays.equals(enclosingSourceName, receiverSourceName);
+ if(isEqual) {
+ findKeywords(token, new char[][] { Keywords.THIS }, true, false);
+ } else {
+ // Check if the enclosing source implements this interface then show super
+ if (scope.enclosingSourceType() != null) {
+ SourceTypeBinding src = scope.enclosingSourceType();
+ ReferenceBinding[] superInterfaces = src.superInterfaces();
+ boolean implemented = false;
+ for (ReferenceBinding referenceBinding : superInterfaces) {
+ if (Arrays.equals(referenceBinding.sourceName, receiverSourceName)) {
+ implemented = true;
+ break;
+ }
+ }
+ if (implemented) {
+ findKeywords(token, new char[][] { Keywords.SUPER }, true, false);
+ }
+ }
+ }
+ }
+ }
}
if (!this.requestor.isIgnored(CompletionProposal.FIELD_REF)) {