Bug 550631 - Unexpected runtime error while computing a text hover

This change adds a missing type check before casting synthetic members
to JDIObjectValue, preventing exceptions in cases of e.g. synthetic
members of type JDIPrimitiveValue.

Change-Id: Ia21a60434575ac4a4d98f264e373b32eb39340e9
Signed-off-by: Simeon Andreev <simeon.danailov.andreev@gmail.com>
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIObjectValue.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIObjectValue.java
index 0d477fd..307c462 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIObjectValue.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/model/JDIObjectValue.java
@@ -21,6 +21,7 @@
 import java.util.List;
 
 import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.model.IValue;
 import org.eclipse.jdi.internal.InterfaceTypeImpl;
 import org.eclipse.jdt.debug.core.IJavaFieldVariable;
 import org.eclipse.jdt.debug.core.IJavaObject;
@@ -278,7 +279,7 @@
 					}
 					// check if we are inside local type - Signature.createTypeSignature
 					// can't create proper type name out of source field in JavaDebugHover
-					// we get LDebugHoverTest$InnerClass2; instead of LDebugHoverTest$1InnerClass2; 
+					// we get LDebugHoverTest$InnerClass2; instead of LDebugHoverTest$1InnerClass2;
 					signature = signature.replaceFirst("\\$\\d+", "\\$"); //$NON-NLS-1$ //$NON-NLS-2$
 					if (declaringTypeSignature.equals(signature)) {
 						field = fieldTmp;
@@ -307,8 +308,9 @@
 			for (Field outer : synteticFields) {
 				// retrieve the reference to the "outer" object
 				JDIFieldVariable syntVariable = new JDIFieldVariable(debugTarget, outer, getUnderlyingObject(), fLogicalParent);
-				JDIObjectValue outerObject = (JDIObjectValue) syntVariable.getValue();
-				if (outerObject != null) {
+				IValue value = syntVariable.getValue();
+				if (value instanceof JDIObjectValue) {
+					JDIObjectValue outerObject = (JDIObjectValue) value;
 					// ask "outer" object about field probably declared within
 					return outerObject.getField(name, outer.signature());
 				}