144992 [hashcode/equals] CCE in GenerateHashcodeEqualsAction#checkHashcodeEqualsExists [code generation]
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/GenerateHashCodeEqualsAction.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/GenerateHashCodeEqualsAction.java
index eb318b9..02243c6 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/GenerateHashCodeEqualsAction.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/GenerateHashCodeEqualsAction.java
@@ -33,10 +33,15 @@
 import org.eclipse.ui.PlatformUI;
 
 import org.eclipse.ltk.core.refactoring.RefactoringStatus;
+import org.eclipse.ltk.core.refactoring.RefactoringStatusContext;
 import org.eclipse.ltk.ui.refactoring.RefactoringUI;
 
+import org.eclipse.jdt.core.IClassFile;
 import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaElement;
 import org.eclipse.jdt.core.IMember;
+import org.eclipse.jdt.core.IOpenable;
+import org.eclipse.jdt.core.ISourceReference;
 import org.eclipse.jdt.core.IType;
 import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jdt.core.dom.AST;
@@ -328,7 +333,7 @@
 				}
 				if (Modifier.isTransient(selectedBindings[i].getModifiers()))
 					status.addWarning(Messages.format(ActionMessages.GenerateHashCodeEqualsAction_transient_field_included_error, selectedBindings[i]
-							.getName()), JavaStatusContext.create((IMember) selectedBindings[i].getJavaElement()));
+							.getName()), createRefactoringStatusContext(selectedBindings[i].getJavaElement()));
 			}
 
 			if (status.hasEntries()) {
@@ -365,6 +370,25 @@
 		}
 		notifyResult(dialogResult == Window.OK);
 	}
+	
+	public static RefactoringStatusContext createRefactoringStatusContext(IJavaElement element) {
+		if (element instanceof IMember) {
+			return JavaStatusContext.create((IMember) element);
+		}
+		if (element instanceof ISourceReference) {
+			IOpenable openable= element.getOpenable();
+			try {
+				if (openable instanceof ICompilationUnit) {
+					return JavaStatusContext.create((ICompilationUnit) openable, ((ISourceReference) element).getSourceRange());
+				} else if (openable instanceof IClassFile) {
+					return JavaStatusContext.create((IClassFile) openable, ((ISourceReference) element).getSourceRange());
+				}
+			} catch (JavaModelException e) {
+				// ignore
+			}
+		}
+		return null;
+	}
 
 	private boolean hasHashCodeOrEquals(ITypeBinding someType) {
 		HashCodeEqualsInfo info= getTypeInfo(someType);
@@ -393,11 +417,11 @@
 
 		if (!info.foundEquals && !info.foundHashCode)
 			status.addWarning(Messages.format(concreteMethWarning, new String[] { Messages.format(concreteTypeWarning, someType.getQualifiedName()),
-					concreteHCEWarning }), JavaStatusContext.create((IMember) someType.getJavaElement()));
+					concreteHCEWarning }), createRefactoringStatusContext(someType.getJavaElement()));
 
 		if (superClass && (info.foundFinalEquals || info.foundFinalHashCode)) {
 			status.addError(Messages.format(ActionMessages.GenerateHashCodeEqualsAction_final_hashCode_equals_in_superclass_error, Messages.format(
-					concreteTypeWarning, someType.getQualifiedName())), JavaStatusContext.create((IMember) someType.getJavaElement()));
+					concreteTypeWarning, someType.getQualifiedName())), createRefactoringStatusContext(someType.getJavaElement()));
 		}
 
 		return status;
@@ -405,6 +429,10 @@
 
 	private HashCodeEqualsInfo getTypeInfo(ITypeBinding someType) {
 		HashCodeEqualsInfo info= new HashCodeEqualsInfo();
+		if (someType.isTypeVariable()) {
+			someType= someType.getErasure();
+		}
+		
 		IMethodBinding[] declaredMethods= someType.getDeclaredMethods();
 
 		for (int i= 0; i < declaredMethods.length; i++) {