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());
}