/// <summary>
        /// Creates a new <see cref="NodeEvaluationResult" />.
        /// </summary>
        /// <param name="variable">Variable provider.</param>
        /// <returns>Result.</returns>
        public NodeEvaluationResult Create(INodeVariable variable) {
            Utilities.ArgumentNotNull("variable", variable);

            int id = variable.Id;
            NodeStackFrame stackFrame = variable.StackFrame;
            NodeEvaluationResult parent = variable.Parent;

            string name = variable.Name;
            string fullName = GetFullName(parent, variable.Name, ref name);
            string stringValue, hexValue = null;
            string typeName = variable.TypeName;
            var type = NodeExpressionType.None;

            switch (typeName) {
                case "undefined":
                    stringValue = "undefined";
                    typeName = NodeVariableType.Undefined;
                    break;

                case "null":
                    stringValue = "null";
                    typeName = NodeVariableType.Null;
                    break;

                case "number":
                    stringValue = variable.Value ?? variable.Text;
                    typeName = NodeVariableType.Number;
                    int intValue;
                    if (int.TryParse(stringValue, out intValue)) {
                        hexValue = string.Format(CultureInfo.InvariantCulture, "0x{0:x}", intValue);
                    }
                    break;

                case "boolean":
                    stringValue = (variable.Value ?? variable.Text).ToLowerInvariant();
                    typeName = NodeVariableType.Boolean;
                    type |= NodeExpressionType.Boolean;
                    break;

                case "regexp":
                    stringValue = variable.Value ?? variable.Text;
                    typeName = NodeVariableType.Regexp;
                    type |= NodeExpressionType.Expandable;
                    break;

                case "function":
                    stringValue = string.IsNullOrEmpty(variable.Text) ? string.Format(CultureInfo.InvariantCulture, "{{{0}}}", NodeVariableType.Function) : variable.Text;
                    typeName = NodeVariableType.Function;
                    type |= NodeExpressionType.Function | NodeExpressionType.Expandable;
                    break;

                case "string":
                    stringValue = variable.Value ?? variable.Text;
                    typeName = NodeVariableType.String;
                    type |= NodeExpressionType.String;
                    break;

                case "object":
                    stringValue = variable.Class == NodeVariableType.Object ? "{...}" : string.Format(CultureInfo.InvariantCulture, "{{{0}}}", variable.Class);
                    typeName = NodeVariableType.Object;
                    type |= NodeExpressionType.Expandable;
                    break;

                case "error":
                    stringValue = variable.Value ?? variable.Text;
                    if (!string.IsNullOrEmpty(stringValue) && stringValue.StartsWith("Error: ", StringComparison.Ordinal)) {
                        stringValue = stringValue.Substring(7);
                    }
                    typeName = NodeVariableType.Error;
                    type |= NodeExpressionType.Expandable;
                    break;

                default:
                    stringValue = variable.Value ?? variable.Text;
                    typeName = NodeVariableType.Unknown;
                    break;
            }

            if (variable.Attributes.HasFlag(NodePropertyAttributes.ReadOnly)) {
                type |= NodeExpressionType.ReadOnly;
            }

            if (variable.Attributes.HasFlag(NodePropertyAttributes.DontEnum)) {
                type |= NodeExpressionType.Private;
            }

            return new NodeEvaluationResult(id, stringValue, hexValue, typeName, name, fullName, type, stackFrame);
        }
        /// <summary>
        /// Creates a new <see cref="NodeEvaluationResult" />.
        /// </summary>
        /// <param name="variable">Variable provider.</param>
        /// <returns>Result.</returns>
        public NodeEvaluationResult Create(INodeVariable variable)
        {
            Utilities.ArgumentNotNull(nameof(variable), variable);

            var id         = variable.Id;
            var stackFrame = variable.StackFrame;
            var parent     = variable.Parent;

            var    name = variable.Name;
            var    fullName = GetFullName(parent, variable.Name, ref name);
            string stringValue, hexValue = null;
            var    typeName = variable.TypeName;
            var    type     = NodeExpressionType.None;

            switch (typeName)
            {
            case "undefined":
                stringValue = "undefined";
                typeName    = NodeVariableType.Undefined;
                break;

            case "null":
                stringValue = "null";
                typeName    = NodeVariableType.Null;
                break;

            case "number":
                stringValue = variable.Value ?? variable.Text;
                typeName    = NodeVariableType.Number;
                int intValue;
                if (int.TryParse(stringValue, out intValue))
                {
                    hexValue = string.Format(CultureInfo.InvariantCulture, "0x{0:x}", intValue);
                }
                break;

            case "boolean":
                stringValue = (variable.Value ?? variable.Text).ToLowerInvariant();
                typeName    = NodeVariableType.Boolean;
                type       |= NodeExpressionType.Boolean;
                break;

            case "regexp":
                stringValue = variable.Value ?? variable.Text;
                typeName    = NodeVariableType.Regexp;
                type       |= NodeExpressionType.Expandable;
                break;

            case "function":
                stringValue = string.IsNullOrEmpty(variable.Text) ? string.Format(CultureInfo.InvariantCulture, "{{{0}}}", NodeVariableType.Function) : variable.Text;
                typeName    = NodeVariableType.Function;
                type       |= NodeExpressionType.Function | NodeExpressionType.Expandable;
                break;

            case "string":
                stringValue = variable.Value ?? variable.Text;
                typeName    = NodeVariableType.String;
                type       |= NodeExpressionType.String;
                break;

            case "object":
                stringValue = variable.Class == NodeVariableType.Object ? "{...}" : string.Format(CultureInfo.InvariantCulture, "{{{0}}}", variable.Class);
                typeName    = NodeVariableType.Object;
                type       |= NodeExpressionType.Expandable;
                break;

            case "error":
                stringValue = variable.Value ?? variable.Text;
                if (!string.IsNullOrEmpty(stringValue) && stringValue.StartsWith("Error: ", StringComparison.Ordinal))
                {
                    stringValue = stringValue.Substring(7);
                }
                typeName = NodeVariableType.Error;
                type    |= NodeExpressionType.Expandable;
                break;

            default:
                stringValue = variable.Value ?? variable.Text;
                typeName    = NodeVariableType.Unknown;
                break;
            }

            if (variable.Attributes.HasFlag(NodePropertyAttributes.ReadOnly))
            {
                type |= NodeExpressionType.ReadOnly;
            }

            if (variable.Attributes.HasFlag(NodePropertyAttributes.DontEnum))
            {
                type |= NodeExpressionType.Private;
            }

            return(new NodeEvaluationResult(id, stringValue, hexValue, typeName, name, fullName, type, stackFrame));
        }