/// <summary> /// Evaluates a variable expression in the context of the stopped /// debugger. This method decomposes the variable expression to /// walk the cached variable data for the specified stack frame. /// </summary> /// <param name="variableExpression">The variable expression string to evaluate.</param> /// <param name="stackFrameId">The ID of the stack frame in which the expression should be evaluated.</param> /// <returns>A VariableDetails object containing the result.</returns> public VariableDetails GetVariableFromExpression(string variableExpression, int stackFrameId) { // Break up the variable path string[] variablePathParts = variableExpression.Split('.'); VariableDetails resolvedVariable = null; IEnumerable <VariableDetails> variableList = this.currentVariables; foreach (var variableName in variablePathParts) { if (variableList == null) { // If there are no children left to search, break out early return(null); } resolvedVariable = variableList.FirstOrDefault( v => string.Equals( v.Name, variableExpression, StringComparison.InvariantCultureIgnoreCase)); if (resolvedVariable != null && resolvedVariable.IsExpandable) { // Continue by searching in this variable's children variableList = this.GetVariables(resolvedVariable.Id); } } return(resolvedVariable); }
/// <summary> /// If this variable instance is expandable, this method returns the /// details of its children. Otherwise it returns an empty array. /// </summary> /// <returns></returns> public override VariableDetailsBase[] GetChildren(ILogger logger) { VariableDetails[] childVariables = null; if (this.IsExpandable) { if (this.cachedChildren == null) { this.cachedChildren = GetChildren(this.valueObject, logger); } return(this.cachedChildren); } else { childVariables = new VariableDetails[0]; } return(childVariables); }
/// <summary> /// If this variable instance is expandable, this method returns the /// details of its children. Otherwise it returns an empty array. /// </summary> /// <returns></returns> public VariableDetails[] GetChildren() { VariableDetails[] childVariables = null; if (this.IsExpandable) { if (this.cachedChildren == null) { this.cachedChildren = GetChildren(this.valueObject); } return(this.cachedChildren); } else { childVariables = new VariableDetails[0]; } return(childVariables); }
private async Task FetchVariables() { this.nextVariableId = VariableDetails.FirstVariableId; this.currentVariables = new List <VariableDetails>(); PSCommand psCommand = new PSCommand(); psCommand.AddCommand("Get-Variable"); psCommand.AddParameter("Scope", "Local"); var results = await this.powerShellContext.ExecuteCommand <PSVariable>(psCommand); foreach (var variable in results) { var details = new VariableDetails(variable); details.Id = this.nextVariableId; this.currentVariables.Add(details); this.nextVariableId++; } }
/// <summary> /// Gets the list of variables that are children of the scope or variable /// that is identified by the given referenced ID. /// </summary> /// <param name="variableReferenceId"></param> /// <returns>An array of VariableDetails instances which describe the requested variables.</returns> public VariableDetails[] GetVariables(int variableReferenceId) { VariableDetails[] childVariables = null; if (variableReferenceId >= VariableDetails.FirstVariableId) { int correctedId = (variableReferenceId - VariableDetails.FirstVariableId); VariableDetails parentVariable = this.currentVariables[correctedId]; if (parentVariable.IsExpandable) { childVariables = parentVariable.GetChildren(); foreach (var child in childVariables) { this.currentVariables.Add(child); child.Id = this.nextVariableId; this.nextVariableId++; } } else { childVariables = new VariableDetails[0]; } } else { // TODO: Get variables for the desired scope ID childVariables = this.currentVariables.ToArray(); } return(childVariables); }
private async Task <VariableContainerDetails> FetchVariableContainer( string scope, VariableContainerDetails autoVariables) { PSCommand psCommand = new PSCommand(); psCommand.AddCommand("Get-Variable"); psCommand.AddParameter("Scope", scope); var scopeVariableContainer = new VariableContainerDetails(this.nextVariableId++, "Scope: " + scope); this.variables.Add(scopeVariableContainer); var results = await this.powerShellContext.ExecuteCommand <PSVariable>(psCommand, sendErrorToHost : false); if (results != null) { foreach (PSVariable psvariable in results) { var variableDetails = new VariableDetails(psvariable) { Id = this.nextVariableId++ }; this.variables.Add(variableDetails); scopeVariableContainer.Children.Add(variableDetails.Name, variableDetails); if ((autoVariables != null) && AddToAutoVariables(psvariable, scope)) { autoVariables.Children.Add(variableDetails.Name, variableDetails); } } } return(scopeVariableContainer); }
/// <summary> /// If this variable instance is expandable, this method returns the /// details of its children. Otherwise it returns an empty array. /// </summary> /// <returns></returns> public VariableDetails[] GetChildren() { VariableDetails[] childVariables = null; if (this.IsExpandable) { if (this.cachedChildren == null) { this.cachedChildren = GetChildren(this.valueObject); } return this.cachedChildren; } else { childVariables = new VariableDetails[0]; } return childVariables; }
private async Task FetchVariables() { this.nextVariableId = VariableDetails.FirstVariableId; this.currentVariables = new List<VariableDetails>(); PSCommand psCommand = new PSCommand(); psCommand.AddCommand("Get-Variable"); psCommand.AddParameter("Scope", "Local"); var results = await this.powerShellContext.ExecuteCommand<PSVariable>(psCommand); foreach (var variable in results) { var details = new VariableDetails(variable); details.Id = this.nextVariableId; this.currentVariables.Add(details); this.nextVariableId++; } }
/// <summary> /// Gets the list of variables that are children of the scope or variable /// that is identified by the given referenced ID. /// </summary> /// <param name="variableReferenceId"></param> /// <returns>An array of VariableDetails instances which describe the requested variables.</returns> public VariableDetails[] GetVariables(int variableReferenceId) { VariableDetails[] childVariables = null; if (variableReferenceId >= VariableDetails.FirstVariableId) { int correctedId = (variableReferenceId - VariableDetails.FirstVariableId); VariableDetails parentVariable = this.currentVariables[correctedId]; if (parentVariable.IsExpandable) { childVariables = parentVariable.GetChildren(); foreach (var child in childVariables) { this.currentVariables.Add(child); child.Id = this.nextVariableId; this.nextVariableId++; } } else { childVariables = new VariableDetails[0]; } } else { // TODO: Get variables for the desired scope ID childVariables = this.currentVariables.ToArray(); } return childVariables; }
private async Task<VariableContainerDetails> FetchVariableContainer( string scope, VariableContainerDetails autoVariables) { PSCommand psCommand = new PSCommand(); psCommand.AddCommand("Get-Variable"); psCommand.AddParameter("Scope", scope); var scopeVariableContainer = new VariableContainerDetails(this.nextVariableId++, "Scope: " + scope); this.variables.Add(scopeVariableContainer); var results = await this.powerShellContext.ExecuteCommand<PSVariable>(psCommand, sendErrorToHost: false); if (results != null) { foreach (PSVariable psvariable in results) { var variableDetails = new VariableDetails(psvariable) {Id = this.nextVariableId++}; this.variables.Add(variableDetails); scopeVariableContainer.Children.Add(variableDetails.Name, variableDetails); if ((autoVariables != null) && AddToAutoVariables(psvariable, scope)) { autoVariables.Children.Add(variableDetails.Name, variableDetails); } } } return scopeVariableContainer; }