internal DEBUG_PROPERTY_INFO GetDebugPropertyInfo(uint radix, enum_DEBUGPROP_INFO_FLAGS fields) {
var dpi = new DEBUG_PROPERTY_INFO();
// Always provide the property so that we can access locals from the automation object.
dpi.pProperty = this;
dpi.dwFields |= enum_DEBUGPROP_INFO_FLAGS.DEBUGPROP_INFO_PROP;
var valueInfo = EvaluationResult as IRValueInfo;
var errorInfo = EvaluationResult as IRErrorInfo;
var promiseInfo = EvaluationResult as IRPromiseInfo;
var activeBindingInfo = EvaluationResult as IRActiveBindingInfo;
if (fields.HasFlag(enum_DEBUGPROP_INFO_FLAGS.DEBUGPROP_INFO_FULLNAME)) {
dpi.bstrFullName = EvaluationResult.Expression;
dpi.dwFields |= enum_DEBUGPROP_INFO_FLAGS.DEBUGPROP_INFO_FULLNAME;
}
if (fields.HasFlag(enum_DEBUGPROP_INFO_FLAGS.DEBUGPROP_INFO_NAME)) {
dpi.bstrName = EvaluationResult.Name ?? EvaluationResult.Expression;
if (Parent?.IsFrameEnvironment == true && dpi.bstrName?.StartsWithOrdinal("$") == true) {
dpi.bstrName = dpi.bstrName.Substring(1);
}
dpi.dwFields |= enum_DEBUGPROP_INFO_FLAGS.DEBUGPROP_INFO_NAME;
}
if (fields.HasFlag(enum_DEBUGPROP_INFO_FLAGS.DEBUGPROP_INFO_TYPE)) {
if (valueInfo != null) {
dpi.bstrType = valueInfo.TypeName;
if (valueInfo.Classes != null && valueInfo.Classes.Count > 0) {
dpi.bstrType += " (" + string.Join(", ", valueInfo.Classes) + ")";
}
dpi.dwFields |= enum_DEBUGPROP_INFO_FLAGS.DEBUGPROP_INFO_TYPE;
} else if (promiseInfo != null) {
dpi.bstrType = "<promise>";
dpi.dwFields |= enum_DEBUGPROP_INFO_FLAGS.DEBUGPROP_INFO_TYPE;
} else if (activeBindingInfo != null) {
if (activeBindingInfo.ComputedValue != null) {
dpi.bstrType = activeBindingInfo.ComputedValue.TypeName;
if (activeBindingInfo.ComputedValue.Classes != null && activeBindingInfo.ComputedValue.Classes.Count > 0) {
dpi.bstrType += " (" + string.Join(", ", activeBindingInfo.ComputedValue.Classes) + ")";
}
} else {
dpi.bstrType = "<active binding>";
}
dpi.dwFields |= enum_DEBUGPROP_INFO_FLAGS.DEBUGPROP_INFO_TYPE;
}
}
if (fields.HasFlag(enum_DEBUGPROP_INFO_FLAGS.DEBUGPROP_INFO_VALUE)) {
if (valueInfo != null && valueInfo.Representation != null) {
// TODO: handle radix
dpi.bstrValue = valueInfo.Representation.ToUnicodeQuotes();
dpi.dwFields |= enum_DEBUGPROP_INFO_FLAGS.DEBUGPROP_INFO_VALUE;
} else if (promiseInfo != null) {
dpi.bstrValue = promiseInfo.Code;
dpi.dwFields |= enum_DEBUGPROP_INFO_FLAGS.DEBUGPROP_INFO_VALUE;
} else if (errorInfo != null) {
dpi.bstrValue = errorInfo.ErrorText;
dpi.dwFields |= enum_DEBUGPROP_INFO_FLAGS.DEBUGPROP_INFO_VALUE;
} else if (activeBindingInfo != null) {
if (activeBindingInfo.ComputedValue != null) {
dpi.bstrValue = activeBindingInfo.ComputedValue.Representation;
dpi.dwFields |= enum_DEBUGPROP_INFO_FLAGS.DEBUGPROP_INFO_VALUE;
}
}
}
if (fields.HasFlag(enum_DEBUGPROP_INFO_FLAGS.DEBUGPROP_INFO_ATTRIB)) {
dpi.dwFields |= enum_DEBUGPROP_INFO_FLAGS.DEBUGPROP_INFO_ATTRIB;
if (IsSynthetic) {
dpi.dwAttrib |= enum_DBG_ATTRIB_FLAGS.DBG_ATTRIB_METHOD | enum_DBG_ATTRIB_FLAGS.DBG_ATTRIB_TYPE_VIRTUAL;
}
if (StackFrame.Engine.GridViewProvider?.CanShowDataGrid(EvaluationResult) == true) {
dpi.dwAttrib |= enum_DBG_ATTRIB_FLAGS.DBG_ATTRIB_VALUE_CUSTOM_VIEWER;
}
if (valueInfo?.HasChildren == true || valueInfo?.HasAttributes() == true) {
dpi.dwAttrib |= enum_DBG_ATTRIB_FLAGS.DBG_ATTRIB_OBJ_IS_EXPANDABLE;
}
if (valueInfo != null) {
switch (valueInfo.TypeName) {
case "logical":
dpi.dwAttrib |= enum_DBG_ATTRIB_FLAGS.DBG_ATTRIB_VALUE_BOOLEAN;
if (valueInfo.Representation == "TRUE") {
dpi.dwAttrib |= enum_DBG_ATTRIB_FLAGS.DBG_ATTRIB_VALUE_BOOLEAN_TRUE;
}
break;
case "closure":
dpi.dwAttrib |= enum_DBG_ATTRIB_FLAGS.DBG_ATTRIB_METHOD;
break;
case "character":
case "symbol":
if (valueInfo.Length == 1) {
dpi.dwAttrib |= enum_DBG_ATTRIB_FLAGS.DBG_ATTRIB_VALUE_RAW_STRING;
}
break;
}
} else if (errorInfo != null) {
dpi.dwAttrib |= enum_DBG_ATTRIB_FLAGS.DBG_ATTRIB_VALUE_ERROR;
} else if (promiseInfo != null) {
dpi.dwAttrib |= enum_DBG_ATTRIB_FLAGS.DBG_ATTRIB_VALUE_SIDE_EFFECT;
} else if (activeBindingInfo != null) {
dpi.dwAttrib |= enum_DBG_ATTRIB_FLAGS.DBG_ATTRIB_PROPERTY;
dpi.dwAttrib |= enum_DBG_ATTRIB_FLAGS.DBG_ATTRIB_VALUE_SIDE_EFFECT;
}
}
return dpi;
}
}