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)) {