Microsoft.R.Debugger.AD7Property.GetDebugPropertyInfo C# (CSharp) Method

GetDebugPropertyInfo() private method

private GetDebugPropertyInfo ( uint radix, enum_DEBUGPROP_INFO_FLAGS fields ) : DEBUG_PROPERTY_INFO
radix uint
fields enum_DEBUGPROP_INFO_FLAGS
return DEBUG_PROPERTY_INFO
        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;
        }
    }