diff --git a/debug/org.eclipse.cdt.debug.core/ChangeLog b/debug/org.eclipse.cdt.debug.core/ChangeLog index c79e18b9e62..fbc439a74d6 100644 --- a/debug/org.eclipse.cdt.debug.core/ChangeLog +++ b/debug/org.eclipse.cdt.debug.core/ChangeLog @@ -1,3 +1,10 @@ +2003-03-09 Mikhail Khodjaiants + Core support of the "Cast To Type" and "Restore Default Type" actions. + * ICastToType.java: new + * CLocalVariable.java + * CStackFrame.java + * CVariable.java + 2003-02-24 Alain Magloire * src/org/eclipse/cdt/debug/core/cdi/ICDIRegisterObject.java: diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/ICastToType.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/ICastToType.java new file mode 100644 index 00000000000..90e3d4bd39f --- /dev/null +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/ICastToType.java @@ -0,0 +1,28 @@ +/* + *(c) Copyright QNX Software Systems Ltd. 2002. + * All Rights Reserved. + * + */ + +package org.eclipse.cdt.debug.core.model; + +import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.debug.core.DebugException; + +/** + * Enter type comment. + * + * @since Mar 7, 2003 + */ +public interface ICastToType extends IAdaptable +{ + boolean supportsCasting(); + + String getCurrentType(); + + void cast( String type ) throws DebugException; + + void restoreDefault() throws DebugException; + + boolean isCasted(); +} diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CLocalVariable.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CLocalVariable.java index d7d34c75877..6084974cb2e 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CLocalVariable.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CLocalVariable.java @@ -6,6 +6,9 @@ package org.eclipse.cdt.debug.internal.core.model; import org.eclipse.cdt.debug.core.cdi.model.ICDIVariable; +import org.eclipse.cdt.debug.core.model.ICValue; +import org.eclipse.debug.core.DebugException; +import org.eclipse.debug.core.model.IValue; /** * @@ -15,12 +18,36 @@ import org.eclipse.cdt.debug.core.cdi.model.ICDIVariable; */ public class CLocalVariable extends CModificationVariable { - /** - * Constructor for CLocalVariable. - * @param target - */ public CLocalVariable( CDebugElement parent, ICDIVariable cdiVariable ) { super( parent, cdiVariable ); } + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.core.model.ICastToType#supportsCasting() + */ + public boolean supportsCasting() + { + boolean enabled = false; + try + { + IValue value = getValue(); + if ( value instanceof ICValue ) + { + switch( ((ICValue)value).getType() ) + { + case ICValue.TYPE_SIMPLE: + case ICValue.TYPE_POINTER: + case ICValue.TYPE_CHAR: + enabled = true; + break; + } + } + } + catch( DebugException e ) + { + logError( e ); + } + return enabled; + } } diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CStackFrame.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CStackFrame.java index 96688667748..fe8cf22504b 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CStackFrame.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CStackFrame.java @@ -129,7 +129,7 @@ public class CStackFrame extends CDebugElement while( index < fVariables.size() ) { CLocalVariable local = (CLocalVariable)fVariables.get( index ); - ICDIVariable var = findVariable( locals, local.getCDIVariable() ); + ICDIVariable var = findVariable( locals, local.getOriginalCDIVariable() ); if ( var != null ) { locals.remove( var ); @@ -684,7 +684,7 @@ public class CStackFrame extends CDebugElement for ( int i = 0; i < vars.length; ++i ) { if ( vars[i] instanceof CLocalVariable && - ((CLocalVariable)vars[i]).getCDIVariable() instanceof ICDIArgument ) + ((CLocalVariable)vars[i]).getOriginalCDIVariable() instanceof ICDIArgument ) { list.add( vars[i] ); } diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CVariable.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CVariable.java index 5da9edab16b..cdffde065a4 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CVariable.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CVariable.java @@ -5,16 +5,21 @@ */ package org.eclipse.cdt.debug.internal.core.model; +import java.text.MessageFormat; + import org.eclipse.cdt.debug.core.cdi.CDIException; import org.eclipse.cdt.debug.core.cdi.ICDIFormat; import org.eclipse.cdt.debug.core.cdi.event.ICDIChangedEvent; import org.eclipse.cdt.debug.core.cdi.event.ICDIEvent; import org.eclipse.cdt.debug.core.cdi.event.ICDIEventListener; +import org.eclipse.cdt.debug.core.cdi.model.ICDIExpression; import org.eclipse.cdt.debug.core.cdi.model.ICDIObject; +import org.eclipse.cdt.debug.core.cdi.model.ICDIStackFrame; import org.eclipse.cdt.debug.core.cdi.model.ICDIValue; import org.eclipse.cdt.debug.core.cdi.model.ICDIVariable; import org.eclipse.cdt.debug.core.model.ICValue; import org.eclipse.cdt.debug.core.model.ICVariable; +import org.eclipse.cdt.debug.core.model.ICastToType; import org.eclipse.debug.core.DebugEvent; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.model.IDebugTarget; @@ -29,7 +34,8 @@ import org.eclipse.debug.core.model.IVariable; */ public abstract class CVariable extends CDebugElement implements ICVariable, - ICDIEventListener + ICDIEventListener, + ICastToType { /** * The parent object this variable is contained in. @@ -41,6 +47,11 @@ public abstract class CVariable extends CDebugElement */ private ICDIVariable fCDIVariable; + /** + * The shadow CDI variable used for casting. + */ + private ICDIVariable fShadow; + /** * Cache of current value - see #getValue(). */ @@ -79,6 +90,7 @@ public abstract class CVariable extends CDebugElement super( (CDebugTarget)parent.getDebugTarget() ); fParent = parent; fCDIVariable = cdiVariable; + fShadow = null; getCDISession().getEventManager().addEventListener( this ); } @@ -158,6 +170,8 @@ public abstract class CVariable extends CDebugElement */ public Object getAdapter( Class adapter ) { + if ( adapter.equals( ICastToType.class ) ) + return this; if ( adapter.equals( IVariable.class ) ) return this; if ( adapter.equals( ICVariable.class ) ) @@ -229,6 +243,15 @@ public abstract class CVariable extends CDebugElement ((CValue)fValue).dispose(); } getCDISession().getEventManager().removeEventListener( this ); + try + { + if ( getShadow() != null ) + destroyShadow( getShadow() ); + } + catch( DebugException e ) + { + logError( e ); + } } protected synchronized void setChanged( boolean changed ) throws DebugException @@ -300,12 +323,9 @@ public abstract class CVariable extends CDebugElement */ protected ICDIVariable getCDIVariable() { - return fCDIVariable; - } - - protected void setCDIVariable( ICDIVariable newVar ) - { - fCDIVariable = newVar; + if ( fShadow != null ) + return fShadow; + return getOriginalCDIVariable(); } /** @@ -325,7 +345,7 @@ public abstract class CVariable extends CDebugElement String name = null; try { - name = getCDIVariable().getName(); + name = getOriginalCDIVariable().getName(); } catch( CDIException e ) { @@ -391,4 +411,125 @@ public abstract class CVariable extends CDebugElement ((ICValue)getValue()).setChanged( true ); fireChangeEvent( DebugEvent.STATE ); } + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.core.model.ICastToType#cast(java.lang.String) + */ + public void cast( String type ) throws DebugException + { + try + { + String newName = MessageFormat.format( "({0})({1})", new String[] { type, getOriginalCDIVariable().getName() } ); + ICDIVariable newVar = createShadow( getOriginalCDIVariable().getStackFrame(), newName ); + ICDIVariable oldVar = getShadow(); + setShadow( newVar ); + if ( oldVar != null ) + destroyShadow( oldVar ); + } + catch( CDIException e ) + { + targetRequestFailed( e.getMessage(), null ); + } + finally + { + if ( fValue != null ) + { + ((CValue)fValue).dispose(); + fValue = null; + } + fireChangeEvent( DebugEvent.STATE ); + } + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.core.model.ICastToType#getCurrentType() + */ + public String getCurrentType() + { + try + { + return getReferenceTypeName(); + } + catch( DebugException e ) + { + logError( e ); + } + return ""; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.core.model.ICastToType#restoreDefault() + */ + public void restoreDefault() throws DebugException + { + ICDIVariable oldVar = getShadow(); + setShadow( null ); + if ( oldVar != null ) + destroyShadow( oldVar ); + if ( fValue != null ) + { + ((CValue)fValue).dispose(); + fValue = null; + } + fireChangeEvent( DebugEvent.STATE ); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.core.model.ICastToType#supportsCasting() + */ + public boolean supportsCasting() + { + return false; + } + + protected ICDIVariable getOriginalCDIVariable() + { + return fCDIVariable; + } + + private ICDIVariable getShadow() + { + return fShadow; + } + + private void setShadow( ICDIVariable shadow ) + { + fShadow = shadow; + } + + private ICDIVariable createShadow( ICDIStackFrame cdiFrame, String expression ) throws DebugException + { + try + { +// ICDIVariableObject varObject = getCDISession().getVariableManager().getVariableObject( getCDIVariable().getStackFrame(), newName ); +// return getCDISession().getVariableManager().createVariable( varObject ); + return getCDISession().getExpressionManager().createExpression( expression ); + } + catch( CDIException e ) + { + targetRequestFailed( e.getMessage(), null ); + } + return null; + } + + private void destroyShadow( ICDIVariable shadow ) throws DebugException + { + try + { +// getCDISession().getVariableManager().destroyVariable( shadow ); + getCDISession().getExpressionManager().destroyExpression( (ICDIExpression)shadow ); + } + catch( CDIException e ) + { + targetRequestFailed( e.getMessage(), null ); + } + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.core.model.ICastToType#isCasted() + */ + public boolean isCasted() + { + return ( getShadow() != null ); + } }