diff --git a/powershell/extractor/Semmle.Extraction.PowerShell/Entities/StatementBlockEntity.cs b/powershell/extractor/Semmle.Extraction.PowerShell/Entities/StatementBlockEntity.cs index b90541f8f780..eb9937a4a8a7 100644 --- a/powershell/extractor/Semmle.Extraction.PowerShell/Entities/StatementBlockEntity.cs +++ b/powershell/extractor/Semmle.Extraction.PowerShell/Entities/StatementBlockEntity.cs @@ -32,6 +32,8 @@ public override void Populate(TextWriter trapFile) EntityConstructor.ConstructAppropriateEntity(PowerShellContext, Fragment.Traps[index])); } } + + trapFile.parent(this, EntityConstructor.ConstructAppropriateEntity(PowerShellContext, Fragment.Parent)); } public override bool NeedsPopulation => true; diff --git a/powershell/ql/lib/powershell.qll b/powershell/ql/lib/powershell.qll index a7fb74c97eb0..f62af84902aa 100644 --- a/powershell/ql/lib/powershell.qll +++ b/powershell/ql/lib/powershell.qll @@ -14,7 +14,6 @@ import semmle.code.powershell.Attribute import semmle.code.powershell.NamedAttributeArgument import semmle.code.powershell.TypeConstraint import semmle.code.powershell.VariableExpression -import semmle.code.powershell.Parameter import semmle.code.powershell.ModuleSpecification import semmle.code.powershell.ParamBlock import semmle.code.powershell.NamedBlock @@ -77,3 +76,4 @@ import semmle.code.powershell.IndexExpr import semmle.code.powershell.HashTable import semmle.code.powershell.SplitExpr import semmle.code.powershell.CommentEntity +import semmle.code.powershell.Variable \ No newline at end of file diff --git a/powershell/ql/lib/qlpack.yml b/powershell/ql/lib/qlpack.yml index 7c5c017b4bb8..8accccc63909 100644 --- a/powershell/ql/lib/qlpack.yml +++ b/powershell/ql/lib/qlpack.yml @@ -10,5 +10,6 @@ upgrades: upgrades dependencies: codeql/controlflow: ${workspace} codeql/dataflow: ${workspace} + codeql/ssa: ${workspace} codeql/util: ${workspace} warnOnImplicitThis: true \ No newline at end of file diff --git a/powershell/ql/lib/semmle/code/powershell/Ast.qll b/powershell/ql/lib/semmle/code/powershell/Ast.qll index 4db429a36a87..b9c1bc29518e 100644 --- a/powershell/ql/lib/semmle/code/powershell/Ast.qll +++ b/powershell/ql/lib/semmle/code/powershell/Ast.qll @@ -1,4 +1,5 @@ import powershell +private import semmle.code.powershell.controlflow.internal.Scope class Ast extends @ast { string toString() { none() } @@ -6,4 +7,6 @@ class Ast extends @ast { Ast getParent() { parent(this, result) } Location getLocation() { none() } + + final Scope getEnclosingScope() { result = scopeOf(this) } } diff --git a/powershell/ql/lib/semmle/code/powershell/ForEachStmt.qll b/powershell/ql/lib/semmle/code/powershell/ForEachStmt.qll index bf9c2d7b4715..4cbcc87038f7 100644 --- a/powershell/ql/lib/semmle/code/powershell/ForEachStmt.qll +++ b/powershell/ql/lib/semmle/code/powershell/ForEachStmt.qll @@ -7,7 +7,15 @@ class ForEachStmt extends @foreach_statement, LoopStmt { final override StmtBlock getBody() { foreach_statement(this, _, _, result, _) } - VarAccess getVariable() { foreach_statement(this, result, _, _, _) } + VarAccess getVarAccess() { foreach_statement(this, result, _, _, _) } + + Variable getVariable() { + exists(VarAccess va | + va = this.getVarAccess() and + foreach_statement(this, va, _, _, _) and + result = va.getVariable() + ) + } PipelineBase getIterableExpr() { foreach_statement(this, _, result, _, _) } diff --git a/powershell/ql/lib/semmle/code/powershell/Function.qll b/powershell/ql/lib/semmle/code/powershell/Function.qll index ac438c20429b..ec3c052fe4e7 100644 --- a/powershell/ql/lib/semmle/code/powershell/Function.qll +++ b/powershell/ql/lib/semmle/code/powershell/Function.qll @@ -35,7 +35,7 @@ class NonMemberFunction extends @function_definition, Stmt, AbstractFunction { predicate isWorkflow() { function_definition(this, _, _, _, true) } - override Parameter getFunctionParameter(int i) { function_definition_parameter(this, i, result) } + override Parameter getFunctionParameter(int i) { result.isFunctionParameter(this, i) } } class MemberFunction extends @function_member, Member, AbstractFunction { @@ -57,7 +57,7 @@ class MemberFunction extends @function_member, Member, AbstractFunction { predicate isConstructor() { function_member(this, _, true, _, _, _, _, _, _) } - override Parameter getFunctionParameter(int i) { function_member_parameter(this, i, result) } + override Parameter getFunctionParameter(int i) { result.isFunctionParameter(this, i) } TypeConstraint getTypeConstraint() { function_member_return_type(this, result) } } diff --git a/powershell/ql/lib/semmle/code/powershell/NamedBlock.qll b/powershell/ql/lib/semmle/code/powershell/NamedBlock.qll index b6fc800e8bce..5bf4de25cb38 100644 --- a/powershell/ql/lib/semmle/code/powershell/NamedBlock.qll +++ b/powershell/ql/lib/semmle/code/powershell/NamedBlock.qll @@ -9,9 +9,9 @@ class NamedBlock extends @named_block, Ast { int getNumTraps() { named_block(this, _, result) } - Stmt getStatement(int i) { named_block_statement(this, i, result) } + Stmt getStmt(int i) { named_block_statement(this, i, result) } - Stmt getAStatement() { result = this.getStatement(_) } + Stmt getAStmt() { result = this.getStmt(_) } TrapStmt getTrap(int i) { named_block_trap(this, i, result) } diff --git a/powershell/ql/lib/semmle/code/powershell/ParamBlock.qll b/powershell/ql/lib/semmle/code/powershell/ParamBlock.qll index 65baf93bfdd7..ff108717ef8d 100644 --- a/powershell/ql/lib/semmle/code/powershell/ParamBlock.qll +++ b/powershell/ql/lib/semmle/code/powershell/ParamBlock.qll @@ -13,7 +13,7 @@ class ParamBlock extends @param_block, Ast { Attribute getAnAttribute() { result = this.getAttribute(_) } - Parameter getParameter(int i) { param_block_parameter(this, i, result) } + Parameter getParameter(int i) { result.hasParameterBlock(this, i) } Parameter getAParameter() { result = this.getParameter(_) } } diff --git a/powershell/ql/lib/semmle/code/powershell/Variable.qll b/powershell/ql/lib/semmle/code/powershell/Variable.qll new file mode 100644 index 000000000000..52665ddb1908 --- /dev/null +++ b/powershell/ql/lib/semmle/code/powershell/Variable.qll @@ -0,0 +1,160 @@ +private import powershell +private import semmle.code.powershell.controlflow.internal.Scope +private import internal.Internal as Internal + +bindingset[scope] +pragma[inline_late] +private predicate isParameterImpl(string name, Scope scope) { + exists(Internal::Parameter p | p.getName() = name and p.getEnclosingScope() = scope) + or + name = "_" +} + +private newtype TParameterImpl = + TInternalParameter(Internal::Parameter p) or + TUnderscore(Scope scope) { + exists(VarAccess va | va.getUserPath() = "_" and scope = va.getEnclosingScope()) + } + +private class ParameterImpl extends TParameterImpl { + abstract Location getLocation(); + + string toString() { result = this.getName() } + + abstract string getName(); + + abstract Scope getEnclosingScope(); + + predicate hasParameterBlock(ParamBlock block, int i) { none() } + + predicate isFunctionParameter(Function f, int i) { none() } + + Expr getDefaultValue() { none() } + + VarAccess getAnAccess() { + // TODO: This won't join order nicely. + result.getUserPath() = this.getName() and + result.getEnclosingScope() = this.getEnclosingScope() + } +} + +private class InternalParameter extends ParameterImpl, TInternalParameter { + Internal::Parameter p; + + InternalParameter() { this = TInternalParameter(p) } + + override Location getLocation() { result = p.getLocation() } + + override string getName() { result = p.getName() } + + final override Scope getEnclosingScope() { result = p.getEnclosingScope() } + + override predicate hasParameterBlock(ParamBlock block, int i) { + param_block_parameter(block, i, p) + } + + override predicate isFunctionParameter(Function f, int i) { + function_definition_parameter(f, i, p) + or + function_member_parameter(f, i, p) + } + + override Expr getDefaultValue() { result = p.getDefaultValue() } +} + +private class Underscore extends ParameterImpl, TUnderscore { + Scope scope; + + Underscore() { this = TUnderscore(scope) } + + override Location getLocation() { + // The location is the first access (ordered by location) to the variable in the scope + exists(VarAccess va | + va = + min(VarAccess cand, Location location | + cand = this.getAnAccess() and location = cand.getLocation() + | + cand order by location.getStartLine(), location.getStartColumn() + ) and + result = va.getLocation() + ) + } + + override string getName() { result = "_" } + + final override Scope getEnclosingScope() { result = scope } +} + +private newtype TVariable = + TLocalVariable(string name, Scope scope) { + not isParameterImpl(name, scope) and + exists(VarAccess va | va.getUserPath() = name and scope = va.getEnclosingScope()) + } or + TParameter(ParameterImpl p) + +private class AbstractVariable extends TVariable { + abstract Location getLocation(); + + string toString() { result = this.getName() } + + abstract string getName(); + + abstract Scope getDeclaringScope(); + + VarAccess getAnAccess() { + exists(string s | + s = concat(this.getAQlClass(), ", ") and + // TODO: This won't join order nicely. + result.getUserPath() = this.getName() and + result.getEnclosingScope() = this.getDeclaringScope() + ) + } +} + +class LocalVariable extends AbstractVariable, TLocalVariable { + string name; + Scope scope; + + LocalVariable() { this = TLocalVariable(name, scope) } + + override Location getLocation() { + // The location is the first access (ordered by location) to the variable in the scope + exists(VarAccess va | + va = + min(VarAccess cand, Location location | + cand = this.getAnAccess() and location = cand.getLocation() + | + cand order by location.getStartLine(), location.getStartColumn() + ) and + result = va.getLocation() + ) + } + + override string getName() { result = name } + + final override Scope getDeclaringScope() { result = scope } +} + +class Parameter extends AbstractVariable, TParameter { + ParameterImpl p; + + Parameter() { this = TParameter(p) } + + override Location getLocation() { result = p.getLocation() } + + override string getName() { result = p.getName() } + + final override Scope getDeclaringScope() { result = p.getEnclosingScope() } + + predicate hasParameterBlock(ParamBlock block, int i) { p.hasParameterBlock(block, i) } + + predicate isFunctionParameter(Function f, int i) { p.isFunctionParameter(f, i) } + + Expr getDefaultValue() { result = p.getDefaultValue() } + + predicate hasDefaultValue() { exists(this.getDefaultValue()) } + + int getIndex() { this.isFunctionParameter(_, result) } +} + +final class Variable = AbstractVariable; diff --git a/powershell/ql/lib/semmle/code/powershell/VariableExpression.qll b/powershell/ql/lib/semmle/code/powershell/VariableExpression.qll index 8c4ff8a3ef8a..96580ec1e011 100644 --- a/powershell/ql/lib/semmle/code/powershell/VariableExpression.qll +++ b/powershell/ql/lib/semmle/code/powershell/VariableExpression.qll @@ -1,6 +1,10 @@ import powershell +private predicate isParameterName(@variable_expression ve) { parameter(_, ve, _, _) } + class VarAccess extends @variable_expression, Expr { + VarAccess() { not isParameterName(this) } + override string toString() { result = this.getUserPath() } override SourceLocation getLocation() { variable_expression_location(this, result) } @@ -26,4 +30,22 @@ class VarAccess extends @variable_expression, Expr { boolean isVariable() { variable_expression(this, _, _, _, _, _, _, _, _, _, result, _) } boolean isDriveQualified() { variable_expression(this, _, _, _, _, _, _, _, _, _, _, result) } + + Variable getVariable() { result.getAnAccess() = this } +} + +private predicate isVariableWriteAccess(Expr e) { + e = any(AssignStmt assign).getLeftHandSide() + or + e = any(ConvertExpr convert | isVariableWriteAccess(convert)).getExpr() + or + e = any(ArrayLiteral array | isVariableWriteAccess(array)).getAnElement() +} + +class VarReadAccess extends VarAccess { + VarReadAccess() { not this instanceof VarWriteAccess } +} + +class VarWriteAccess extends VarAccess { + VarWriteAccess() { isVariableWriteAccess(this) } } diff --git a/powershell/ql/lib/semmle/code/powershell/controlflow/CfgNodes.qll b/powershell/ql/lib/semmle/code/powershell/controlflow/CfgNodes.qll index 8bc52342c338..c6fc2d55dd29 100644 --- a/powershell/ql/lib/semmle/code/powershell/controlflow/CfgNodes.qll +++ b/powershell/ql/lib/semmle/code/powershell/controlflow/CfgNodes.qll @@ -60,16 +60,144 @@ class StmtCfgNode extends AstCfgNode { Stmt getStmt() { result = s } } +/** + * A class for mapping parent-child AST nodes to parent-child CFG nodes. + */ +abstract private class ChildMapping extends Ast { + /** + * Holds if `child` is a (possibly nested) child of this expression + * for which we would like to find a matching CFG child. + */ + abstract predicate relevantChild(Ast child); + + pragma[nomagic] + abstract predicate reachesBasicBlock(Ast child, CfgNode cfn, BasicBlock bb); + + /** + * Holds if there is a control-flow path from `cfn` to `cfnChild`, where `cfn` + * is a control-flow node for this expression, and `cfnChild` is a control-flow + * node for `child`. + * + * The path never escapes the syntactic scope of this expression. + */ + cached + predicate hasCfgChild(Ast child, CfgNode cfn, CfgNode cfnChild) { + this.reachesBasicBlock(child, cfn, cfnChild.getBasicBlock()) and + cfnChild.getAstNode() = child + } +} + +/** + * A class for mapping parent-child AST nodes to parent-child CFG nodes. + */ +abstract private class ExprChildMapping extends Expr, ChildMapping { + pragma[nomagic] + override predicate reachesBasicBlock(Ast child, CfgNode cfn, BasicBlock bb) { + this.relevantChild(child) and + cfn.getAstNode() = this and + bb.getANode() = cfn + or + exists(BasicBlock mid | + this.reachesBasicBlock(child, cfn, mid) and + bb = mid.getAPredecessor() and + not mid.getANode().getAstNode() = child + ) + } +} + +/** + * A class for mapping parent-child AST nodes to parent-child CFG nodes. + */ +abstract private class NonExprChildMapping extends ChildMapping { + NonExprChildMapping() { not this instanceof Expr } + + pragma[nomagic] + override predicate reachesBasicBlock(Ast child, CfgNode cfn, BasicBlock bb) { + this.relevantChild(child) and + cfn.getAstNode() = this and + bb.getANode() = cfn + or + exists(BasicBlock mid | + this.reachesBasicBlock(child, cfn, mid) and + bb = mid.getASuccessor() and + not mid.getANode().getAstNode() = child + ) + } +} + /** Provides classes for control-flow nodes that wrap AST expressions. */ -module ExprNodes { } +module ExprNodes { + private class VarAccessChildMapping extends ExprChildMapping, VarAccess { + override predicate relevantChild(Ast n) { none() } + } + + class VarAccessCfgNode extends ExprCfgNode { + override string getAPrimaryQlClass() { result = "VarAccessCfgNode" } + + override VarAccessChildMapping e; + + override VarAccess getExpr() { result = super.getExpr() } + } + + private class VarReadAccessChildMapping extends VarAccessChildMapping, VarReadAccess { } + + class VarReadAccessCfgNode extends VarAccessCfgNode { + override string getAPrimaryQlClass() { result = "VarReadAccessCfgNode" } + + override VarReadAccessChildMapping e; + + override VarReadAccess getExpr() { result = super.getExpr() } + } + + private class VarWriteAccessChildMapping extends VarAccessChildMapping, VarWriteAccess { } + + class VariableWriteAccessCfgNode extends VarAccessCfgNode { + override string getAPrimaryQlClass() { result = "VarWriteAccessCfgNode" } + + override VarWriteAccessChildMapping e; + + override VarWriteAccess getExpr() { result = super.getExpr() } + + Variable getVariable() { result = e.getVariable() } + + predicate isExplicitWrite(StmtNodes::AssignStmtCfgNode assignment) { + this = assignment.getLeftHandSide() + } + } +} module StmtNodes { + private class CmdChildMapping extends NonExprChildMapping, Cmd { + override predicate relevantChild(Ast n) { n = this.getElement(_) } + } + /** A control-flow node that wraps a `Cmd` AST expression. */ - class CallCfgNode extends StmtCfgNode { - override string getAPrimaryQlClass() { result = "CallCfgNode" } + class CmdCfgNode extends StmtCfgNode { + override string getAPrimaryQlClass() { result = "CmdCfgNode" } - override Cmd s; + override CmdChildMapping s; override Cmd getStmt() { result = super.getStmt() } } + + private class AssignStmtChildMapping extends NonExprChildMapping, AssignStmt { + override predicate relevantChild(Ast n) { + n = this.getLeftHandSide() or n = this.getRightHandSide() + } + } + + /** A control-flow node that wraps an `AssignStmt` AST expression. */ + class AssignStmtCfgNode extends StmtCfgNode { + override string getAPrimaryQlClass() { result = "AssignCfgNode" } + + override AssignStmtChildMapping s; + + override AssignStmt getStmt() { result = super.getStmt() } + + /** Gets the LHS of this assignment. */ + final ExprCfgNode getLeftHandSide() { s.hasCfgChild(s.getLeftHandSide(), this, result) } + + /** Gets the RHS of this assignment. */ + final StmtCfgNode getRightHandSide() { s.hasCfgChild(s.getRightHandSide(), this, result) } + } } diff --git a/powershell/ql/lib/semmle/code/powershell/controlflow/internal/ControlFlowGraphImpl.qll b/powershell/ql/lib/semmle/code/powershell/controlflow/internal/ControlFlowGraphImpl.qll index de1adb9c9219..8db6892998a4 100644 --- a/powershell/ql/lib/semmle/code/powershell/controlflow/internal/ControlFlowGraphImpl.qll +++ b/powershell/ql/lib/semmle/code/powershell/controlflow/internal/ControlFlowGraphImpl.qll @@ -76,23 +76,10 @@ predicate succExit(CfgScope scope, Ast last, Completion c) { scope.exit(last, c) /** Defines the CFG by dispatch on the various AST types. */ module Trees { - class NonDefaultParameterTree extends LeafTree instanceof Parameter { - NonDefaultParameterTree() { not exists(super.getDefaultValue()) } - } - - class DefaultParameterTree extends StandardPostOrderTree instanceof Parameter { - DefaultParameterTree() { exists(super.getDefaultValue()) } - + class ParameterBlockTree extends StandardPostOrderTree instanceof ParamBlock { override AstNode getChildNode(int i) { - i = 0 and - result = super.getDefaultValue() + exists(Parameter p | p = super.getParameter(i) | result = p.getDefaultValue()) } - - final override predicate propagatesAbnormal(AstNode child) { child = super.getDefaultValue() } - } - - class ParameterBlockTree extends StandardPostOrderTree instanceof ParamBlock { - override AstNode getChildNode(int i) { result = super.getParameter(i) } } abstract class ScriptBlockTree extends ControlFlowTree instanceof ScriptBlock { @@ -185,21 +172,31 @@ module Trees { FunctionScriptBlockTree() { func.getBody() = this } - AstNode getParameter(int i) { result = func.getFunctionParameter(i) } + Expr getDefaultValue(int i) { + exists(Parameter p | + p = + rank[i + 1](Parameter cand, int j | + cand.hasDefaultValue() and j = cand.getIndex() + | + cand order by j + ) and + result = p.getDefaultValue() + ) + } - int getNumberOfParameters() { result = func.getNumberOfFunctionParameters() } + int getNumberOfDefaultValues() { result = count(int i | exists(this.getDefaultValue(i))) } override predicate succ(AstNode pred, AstNode succ, Completion c) { // Step to the first parameter pred = this and - first(this.getParameter(0), succ) and + first(this.getDefaultValue(0), succ) and completionIsSimple(c) or // Step to the next parameter exists(int i | - last(this.getParameter(i), pred, c) and + last(this.getDefaultValue(i), pred, c) and completionIsNormal(c) and - first(this.getParameter(i + 1), succ) + first(this.getDefaultValue(i + 1), succ) ) or // Body steps @@ -208,12 +205,12 @@ module Trees { final override predicate succEntry(AstNode n, Completion c) { // If there are no paramters we enter the body directly - not exists(this.getParameter(0)) and + not exists(this.getDefaultValue(_)) and n = this and completionIsSimple(c) or // Once we are done with the last parameter we enter the body - last(this.getParameter(this.getNumberOfParameters() - 1), n, c) and + last(this.getDefaultValue(this.getNumberOfDefaultValues() - 1), n, c) and completionIsNormal(c) } } @@ -224,12 +221,12 @@ module Trees { final override predicate succEntry(Ast n, Completion c) { n = this and completionIsSimple(c) } } - class NamedBlockTree extends StandardPostOrderTree instanceof NamedBlock { + class NamedBlockTree extends StandardPreOrderTree instanceof NamedBlock { // TODO: Handle trap - override AstNode getChildNode(int i) { result = super.getStatement(i) } + override AstNode getChildNode(int i) { result = super.getStmt(i) } } - class AssignStmtTree extends StandardPostOrderTree instanceof AssignStmt { + class AssignStmtTree extends StandardPreOrderTree instanceof AssignStmt { override AstNode getChildNode(int i) { i = 0 and result = super.getLeftHandSide() or @@ -351,6 +348,11 @@ module Trees { last(this.getBody(), pred, c) and completionIsNormal(c) and first(super.getIterator(), succ) + or + // Iterator -> condition + last(super.getIterator(), pred, c) and + completionIsNormal(c) and + first(super.getCondition(), succ) } } @@ -380,11 +382,11 @@ module Trees { or // Emptiness test to variable declaration pred = this and - first(super.getVariable(), succ) and + first(super.getVarAccess(), succ) and completionIsSimple(c) or // Variable declaration to body - last(super.getVariable(), succ, c) and + last(super.getVarAccess(), pred, c) and completionIsNormal(c) and first(this.getBody(), succ) or diff --git a/powershell/ql/lib/semmle/code/powershell/dataflow/Ssa.qll b/powershell/ql/lib/semmle/code/powershell/dataflow/Ssa.qll new file mode 100644 index 000000000000..dc8851f885ae --- /dev/null +++ b/powershell/ql/lib/semmle/code/powershell/dataflow/Ssa.qll @@ -0,0 +1,148 @@ +/** + * Provides the module `Ssa` for working with static single assignment (SSA) form. + */ + +/** + * Provides classes for working with static single assignment (SSA) form. + */ +module Ssa { + private import semmle.code.powershell.Cfg + private import powershell + private import internal.SsaImpl as SsaImpl + private import CfgNodes::ExprNodes + + /** A static single assignment (SSA) definition. */ + class Definition extends SsaImpl::Definition { + /** + * Gets the control flow node of this SSA definition, if any. Phi nodes are + * examples of SSA definitions without a control flow node, as they are + * modeled at index `-1` in the relevant basic block. + */ + final CfgNode getControlFlowNode() { + exists(BasicBlock bb, int i | this.definesAt(_, bb, i) | result = bb.getNode(i)) + } + + /** Gets a control-flow node that reads the value of this SSA definition. */ + final VarReadAccessCfgNode getARead() { result = SsaImpl::getARead(this) } + + /** + * Gets a first control-flow node that reads the value of this SSA definition. + * That is, a read that can be reached from this definition without passing + * through other reads. + */ + final VarReadAccessCfgNode getAFirstRead() { SsaImpl::firstRead(this, result) } + + /** + * Gets a last control-flow node that reads the value of this SSA definition. + * That is, a read that can reach the end of the enclosing CFG scope, or another + * SSA definition for the source variable, without passing through any other read. + */ + final VarReadAccessCfgNode getALastRead() { SsaImpl::lastRead(this, result) } + + /** + * Holds if `read1` and `read2` are adjacent reads of this SSA definition. + * That is, `read2` can be reached from `read1` without passing through + * another read. + */ + final predicate hasAdjacentReads( + VarReadAccessCfgNode read1, VarReadAccessCfgNode read2 + ) { + SsaImpl::adjacentReadPair(this, read1, read2) + } + + /** + * Gets an SSA definition whose value can flow to this one in one step. This + * includes inputs to phi nodes and the prior definitions of uncertain writes. + */ + private Definition getAPhiInputOrPriorDefinition() { result = this.(PhiNode).getAnInput() } + + /** + * Gets a definition that ultimately defines this SSA definition and is + * not itself a phi node. + */ + final Definition getAnUltimateDefinition() { + result = this.getAPhiInputOrPriorDefinition*() and + not result instanceof PhiNode + } + + override string toString() { result = this.getControlFlowNode().toString() } + + /** Gets the scope of this SSA definition. */ + CfgScope getScope() { result = this.getBasicBlock().getScope() } + } + + /** + * An SSA definition that corresponds to a write. + */ + class WriteDefinition extends Definition, SsaImpl::WriteDefinition { + private VariableWriteAccessCfgNode write; + + WriteDefinition() { + exists(BasicBlock bb, int i, Variable v | + this.definesAt(v, bb, i) and + SsaImpl::variableWriteActual(bb, i, v, write) + ) + } + + /** Gets the underlying write access. */ + final VariableWriteAccessCfgNode getWriteAccess() { result = write } + + /** + * Holds if this SSA definition assigns `value` to the underlying variable. + */ + predicate assigns(CfgNodes::StmtCfgNode value) { + exists(CfgNodes::StmtNodes::AssignStmtCfgNode a, BasicBlock bb, int i | + this.definesAt(_, bb, i) and + a = bb.getNode(i) and + value = a.getRightHandSide() + ) + } + + final override string toString() { result = write.toString() } + + final override Location getLocation() { result = write.getLocation() } + } + + /** + * An SSA definition inserted at the beginning of a scope to represent an + * uninitialized local variable. + */ + class UninitializedDefinition extends Definition, SsaImpl::WriteDefinition { + private Variable v; + + UninitializedDefinition() { + exists(BasicBlock bb, int i | + this.definesAt(v, bb, i) and + SsaImpl::uninitializedWrite(bb, i, v) + ) + } + + final override string toString() { result = " " + v } + + final override Location getLocation() { result = this.getBasicBlock().getLocation() } + } + + /** A phi node. */ + class PhiNode extends Definition, SsaImpl::PhiNode { + /** Gets an input of this phi node. */ + final Definition getAnInput() { this.hasInputFromBlock(result, _) } + + /** Holds if `inp` is an input to this phi node along the edge originating in `bb`. */ + predicate hasInputFromBlock(Definition inp, BasicBlock bb) { + inp = SsaImpl::phiHasInputFromBlock(this, bb) + } + + override string toString() { result = "phi" } + + /** + * The location of a phi node is the same as the location of the first node + * in the basic block in which it is defined. + * + * Strictly speaking, the node is *before* the first node, but such a location + * does not exist in the source program. + */ + final override Location getLocation() { + result = this.getBasicBlock().getFirstNode().getLocation() + } + } +} diff --git a/powershell/ql/lib/semmle/code/powershell/dataflow/internal/DataFlowDispatch.qll b/powershell/ql/lib/semmle/code/powershell/dataflow/internal/DataFlowDispatch.qll index 1f6084ef4d5b..8ec7d8f19116 100644 --- a/powershell/ql/lib/semmle/code/powershell/dataflow/internal/DataFlowDispatch.qll +++ b/powershell/ql/lib/semmle/code/powershell/dataflow/internal/DataFlowDispatch.qll @@ -77,7 +77,7 @@ abstract class DataFlowCall extends TDataFlowCall { abstract DataFlowCallable getEnclosingCallable(); /** Gets the underlying source code call, if any. */ - abstract CfgNodes::StmtNodes::CallCfgNode asCall(); + abstract CfgNodes::StmtNodes::CmdCfgNode asCall(); /** Gets a textual representation of this call. */ abstract string toString(); @@ -107,11 +107,11 @@ abstract class DataFlowCall extends TDataFlowCall { } class NormalCall extends DataFlowCall, TNormalCall { - private CfgNodes::StmtNodes::CallCfgNode c; + private CfgNodes::StmtNodes::CmdCfgNode c; NormalCall() { this = TNormalCall(c) } - override CfgNodes::StmtNodes::CallCfgNode asCall() { result = c } + override CfgNodes::StmtNodes::CmdCfgNode asCall() { result = c } override DataFlowCallable getEnclosingCallable() { result = TCfgScope(c.getScope()) } @@ -121,7 +121,7 @@ class NormalCall extends DataFlowCall, TNormalCall { } /** A call for which we want to compute call targets. */ -private class RelevantCall extends CfgNodes::StmtNodes::CallCfgNode { } +private class RelevantCall extends CfgNodes::StmtNodes::CmdCfgNode { } /** Holds if `call` may resolve to the returned source-code method. */ private DataFlowCallable viableSourceCallable(DataFlowCall call) { @@ -139,7 +139,7 @@ class AdditionalCallTarget extends Unit { /** * Gets a viable target for `call`. */ - abstract DataFlowCallable viableTarget(CfgNodes::StmtNodes::CallCfgNode call); + abstract DataFlowCallable viableTarget(CfgNodes::StmtNodes::CmdCfgNode call); } /** Holds if `call` may resolve to the returned summarized library method. */ @@ -158,7 +158,7 @@ private module Cached { TLibraryCallable(LibraryCallable callable) cached - newtype TDataFlowCall = TNormalCall(CfgNodes::StmtNodes::CallCfgNode c) + newtype TDataFlowCall = TNormalCall(CfgNodes::StmtNodes::CmdCfgNode c) /** Gets a viable run-time target for the call `call`. */ cached diff --git a/powershell/ql/lib/semmle/code/powershell/dataflow/internal/DataFlowPrivate.qll b/powershell/ql/lib/semmle/code/powershell/dataflow/internal/DataFlowPrivate.qll index 95cb4caa6299..77a0eb804ca1 100644 --- a/powershell/ql/lib/semmle/code/powershell/dataflow/internal/DataFlowPrivate.qll +++ b/powershell/ql/lib/semmle/code/powershell/dataflow/internal/DataFlowPrivate.qll @@ -56,13 +56,13 @@ module LocalFlow { /** An argument of a call (including qualifier arguments and block arguments). */ private class Argument extends CfgNodes::ExprCfgNode { - private CfgNodes::StmtNodes::CallCfgNode call; + private CfgNodes::StmtNodes::CmdCfgNode call; private ArgumentPosition arg; Argument() { none() } /** Holds if this expression is the `i`th argument of `c`. */ - predicate isArgumentOf(CfgNodes::StmtNodes::CallCfgNode c, ArgumentPosition pos) { + predicate isArgumentOf(CfgNodes::StmtNodes::CmdCfgNode c, ArgumentPosition pos) { c = call and pos = arg } } @@ -140,7 +140,7 @@ abstract class ArgumentNode extends Node { /** Holds if this argument occurs at the given position in the given call. */ abstract predicate argumentOf(DataFlowCall call, ArgumentPosition pos); - abstract predicate sourceArgumentOf(CfgNodes::StmtNodes::CallCfgNode call, ArgumentPosition pos); + abstract predicate sourceArgumentOf(CfgNodes::StmtNodes::CmdCfgNode call, ArgumentPosition pos); /** Gets the call in which this node is an argument. */ final DataFlowCall getCall() { this.argumentOf(result, _) } @@ -293,7 +293,7 @@ predicate lambdaCreation(Node creation, LambdaCallKind kind, DataFlowCallable c) * Holds if `call` is a from-source lambda call of kind `kind` where `receiver` * is the lambda expression. */ -predicate lambdaSourceCall(CfgNodes::StmtNodes::CallCfgNode call, LambdaCallKind kind, Node receiver) { +predicate lambdaSourceCall(CfgNodes::StmtNodes::CmdCfgNode call, LambdaCallKind kind, Node receiver) { none() } diff --git a/powershell/ql/lib/semmle/code/powershell/dataflow/internal/SsaImpl.qll b/powershell/ql/lib/semmle/code/powershell/dataflow/internal/SsaImpl.qll new file mode 100644 index 000000000000..1d140e09a710 --- /dev/null +++ b/powershell/ql/lib/semmle/code/powershell/dataflow/internal/SsaImpl.qll @@ -0,0 +1,338 @@ +private import codeql.ssa.Ssa as SsaImplCommon +private import powershell +private import semmle.code.powershell.Cfg as Cfg +private import semmle.code.powershell.controlflow.internal.ControlFlowGraphImpl as ControlFlowGraphImpl +private import semmle.code.powershell.dataflow.Ssa +private import Cfg::CfgNodes::ExprNodes + +module SsaInput implements SsaImplCommon::InputSig { + private import semmle.code.powershell.controlflow.ControlFlowGraph as Cfg + private import semmle.code.powershell.controlflow.BasicBlocks as BasicBlocks + + class BasicBlock = BasicBlocks::BasicBlock; + + class ControlFlowNode = Cfg::CfgNode; + + BasicBlock getImmediateBasicBlockDominator(BasicBlock bb) { result = bb.getImmediateDominator() } + + BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() } + + class ExitBasicBlock extends BasicBlock, BasicBlocks::ExitBasicBlock { } + + class SourceVariable = LocalVariable; + + /** + * Holds if the statement at index `i` of basic block `bb` contains a write to variable `v`. + * `certain` is true if the write definitely occurs. + */ + predicate variableWrite(BasicBlock bb, int i, SourceVariable v, boolean certain) { + ( + uninitializedWrite(bb, i, v) + or + variableWriteActual(bb, i, v, _) + ) and + certain = true + } + + predicate variableRead(BasicBlock bb, int i, LocalVariable v, boolean certain) { + variableReadActual(bb, i, v) and + certain = true + } +} + +import SsaImplCommon::Make as Impl + +class Definition = Impl::Definition; + +class WriteDefinition = Impl::WriteDefinition; + +class UncertainWriteDefinition = Impl::UncertainWriteDefinition; + +class PhiNode = Impl::PhiNode; + +module Consistency = Impl::Consistency; + +/** Holds if `v` is uninitialized at index `i` in entry block `bb`. */ +predicate uninitializedWrite(Cfg::EntryBasicBlock bb, int i, LocalVariable v) { + v.getDeclaringScope() = bb.getScope() and + i = -1 +} + +/** Holds if `v` is read at index `i` in basic block `bb`. */ +private predicate variableReadActual(Cfg::BasicBlock bb, int i, LocalVariable v) { + exists(VarReadAccess read | + read.getVariable() = v and + read = bb.getNode(i).getAstNode() + ) +} + +pragma[noinline] +private predicate adjacentDefRead( + Definition def, SsaInput::BasicBlock bb1, int i1, SsaInput::BasicBlock bb2, int i2, + SsaInput::SourceVariable v +) { + Impl::adjacentDefRead(def, bb1, i1, bb2, i2) and + v = def.getSourceVariable() +} + +pragma[noinline] +private predicate adjacentDefReadExt( + DefinitionExt def, SsaInput::BasicBlock bb1, int i1, SsaInput::BasicBlock bb2, int i2, + SsaInput::SourceVariable v +) { + Impl::adjacentDefReadExt(def, _, bb1, i1, bb2, i2) and + v = def.getSourceVariable() +} + +private predicate adjacentDefReachesRead( + Definition def, SsaInput::BasicBlock bb1, int i1, SsaInput::BasicBlock bb2, int i2 +) { + exists(SsaInput::SourceVariable v | adjacentDefRead(def, bb1, i1, bb2, i2, v) | + def.definesAt(v, bb1, i1) + or + SsaInput::variableRead(bb1, i1, v, true) + ) + or + exists(SsaInput::BasicBlock bb3, int i3 | + adjacentDefReachesRead(def, bb1, i1, bb3, i3) and + SsaInput::variableRead(bb3, i3, _, false) and + Impl::adjacentDefRead(def, bb3, i3, bb2, i2) + ) +} + +private predicate adjacentDefReachesReadExt( + DefinitionExt def, SsaInput::BasicBlock bb1, int i1, SsaInput::BasicBlock bb2, int i2 +) { + exists(SsaInput::SourceVariable v | adjacentDefReadExt(def, bb1, i1, bb2, i2, v) | + def.definesAt(v, bb1, i1, _) + or + SsaInput::variableRead(bb1, i1, v, true) + ) + or + exists(SsaInput::BasicBlock bb3, int i3 | + adjacentDefReachesReadExt(def, bb1, i1, bb3, i3) and + SsaInput::variableRead(bb3, i3, _, false) and + Impl::adjacentDefReadExt(def, _, bb3, i3, bb2, i2) + ) +} + +/** Same as `adjacentDefRead`, but skips uncertain reads. */ +pragma[nomagic] +private predicate adjacentDefSkipUncertainReads( + Definition def, SsaInput::BasicBlock bb1, int i1, SsaInput::BasicBlock bb2, int i2 +) { + adjacentDefReachesRead(def, bb1, i1, bb2, i2) and + SsaInput::variableRead(bb2, i2, _, true) +} + +private predicate adjacentDefReachesUncertainReadExt( + DefinitionExt def, SsaInput::BasicBlock bb1, int i1, SsaInput::BasicBlock bb2, int i2 +) { + adjacentDefReachesReadExt(def, bb1, i1, bb2, i2) and + SsaInput::variableRead(bb2, i2, _, false) +} + +/** Same as `lastRefRedef`, but skips uncertain reads. */ +pragma[nomagic] +private predicate lastRefSkipUncertainReadsExt(DefinitionExt def, SsaInput::BasicBlock bb, int i) { + Impl::lastRef(def, bb, i) and + not SsaInput::variableRead(bb, i, def.getSourceVariable(), false) + or + exists(SsaInput::BasicBlock bb0, int i0 | + Impl::lastRef(def, bb0, i0) and + adjacentDefReachesUncertainReadExt(def, bb, i, bb0, i0) + ) +} + +cached +private module Cached { + /** + * Holds if `v` is written at index `i` in basic block `bb`, and the corresponding + * AST write access is `write`. + */ + cached + predicate variableWriteActual( + Cfg::BasicBlock bb, int i, LocalVariable v, VariableWriteAccessCfgNode write + ) { + exists(Cfg::CfgNode n | + write.getVariable() = v and + n = bb.getNode(i) + | + write.isExplicitWrite(n) + ) + } + + cached + VarReadAccessCfgNode getARead(Definition def) { + exists(LocalVariable v, Cfg::BasicBlock bb, int i | + Impl::ssaDefReachesRead(v, def, bb, i) and + variableReadActual(bb, i, v) and + result = bb.getNode(i) + ) + } + + private import semmle.code.powershell.dataflow.Ssa + + cached + Definition phiHasInputFromBlock(PhiNode phi, Cfg::BasicBlock bb) { + Impl::phiHasInputFromBlock(phi, result, bb) + } + + /** + * Holds if the value defined at SSA definition `def` can reach a read at `read`, + * without passing through any other non-pseudo read. + */ + cached + predicate firstRead(Definition def, VarReadAccessCfgNode read) { + exists(Cfg::BasicBlock bb1, int i1, Cfg::BasicBlock bb2, int i2 | + def.definesAt(_, bb1, i1) and + adjacentDefSkipUncertainReads(def, bb1, i1, bb2, i2) and + read = bb2.getNode(i2) + ) + } + + /** + * Holds if the read at `read2` is a read of the same SSA definition `def` + * as the read at `read1`, and `read2` can be reached from `read1` without + * passing through another non-pseudo read. + */ + cached + predicate adjacentReadPair(Definition def, VarReadAccessCfgNode read1, VarReadAccessCfgNode read2) { + exists(Cfg::BasicBlock bb1, int i1, Cfg::BasicBlock bb2, int i2 | + read1 = bb1.getNode(i1) and + variableReadActual(bb1, i1, _) and + adjacentDefSkipUncertainReads(def, bb1, i1, bb2, i2) and + read2 = bb2.getNode(i2) + ) + } + + /** + * Holds if the read of `def` at `read` may be a last read. That is, `read` + * can either reach another definition of the underlying source variable or + * the end of the CFG scope, without passing through another non-pseudo read. + */ + cached + predicate lastRead(Definition def, VarReadAccessCfgNode read) { + exists(Cfg::BasicBlock bb, int i | + lastRefSkipUncertainReadsExt(def, bb, i) and + variableReadActual(bb, i, _) and + read = bb.getNode(i) + ) + } + + cached + Definition uncertainWriteDefinitionInput(UncertainWriteDefinition def) { + Impl::uncertainWriteDefinitionInput(def, result) + } + + cached + module DataFlowIntegration { + import DataFlowIntegrationImpl + + cached + predicate localFlowStep(DefinitionExt def, Node nodeFrom, Node nodeTo, boolean isUseStep) { + DataFlowIntegrationImpl::localFlowStep(def, nodeFrom, nodeTo, isUseStep) + } + + cached + predicate localMustFlowStep(DefinitionExt def, Node nodeFrom, Node nodeTo) { + DataFlowIntegrationImpl::localMustFlowStep(def, nodeFrom, nodeTo) + } + + signature predicate guardChecksSig(Cfg::CfgNodes::AstCfgNode g, Cfg::CfgNode e, boolean branch); + + cached // nothing is actually cached + module BarrierGuard { + private Node getABarrierNodeImpl() { + none() // TODO + } + + predicate getABarrierNode = getABarrierNodeImpl/0; + } + } +} + +import Cached + +/** + * An extended static single assignment (SSA) definition. + * + * This is either a normal SSA definition (`Definition`) or a + * phi-read node (`PhiReadNode`). + * + * Only intended for internal use. + */ +class DefinitionExt extends Impl::DefinitionExt { + VarReadAccessCfgNode getARead() { result = getARead(this) } + + override string toString() { result = this.(Ssa::Definition).toString() } + + override Location getLocation() { result = this.(Ssa::Definition).getLocation() } +} + +/** + * A phi-read node. + * + * Only intended for internal use. + */ +class PhiReadNode extends DefinitionExt, Impl::PhiReadNode { + override string toString() { result = "SSA phi read(" + this.getSourceVariable() + ")" } + + override Location getLocation() { result = Impl::PhiReadNode.super.getLocation() } +} + +abstract class NormalParameter extends Parameter { } + +/** Gets the SSA definition node corresponding to parameter `p`. */ +pragma[nomagic] +DefinitionExt getParameterDef(Parameter p) { + none() // TODO +} + +private newtype TParameterExt = TNormalParameter(NormalParameter p) + +/** A normal parameter or an implicit `self` parameter. */ +class ParameterExt extends TParameterExt { + NormalParameter asParameter() { this = TNormalParameter(result) } + + predicate isInitializedBy(WriteDefinition def) { def = getParameterDef(this.asParameter()) } + + string toString() { result = this.asParameter().toString() } + + Location getLocation() { result = this.asParameter().getLocation() } +} + +private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInputSig { + class Parameter = ParameterExt; + + class Expr extends Cfg::CfgNodes::ExprCfgNode { + predicate hasCfgNode(SsaInput::BasicBlock bb, int i) { this = bb.getNode(i) } + } + + Expr getARead(Definition def) { result = Cached::getARead(def) } + + predicate ssaDefAssigns(WriteDefinition def, Expr value) { + def.(Ssa::WriteDefinition).assigns(value) + } + + predicate ssaDefInitializesParam(WriteDefinition def, Parameter p) { p.isInitializedBy(def) } + + class Guard extends Cfg::CfgNodes::AstCfgNode { + predicate hasCfgNode(SsaInput::BasicBlock bb, int i) { this = bb.getNode(i) } + } + + /** Holds if the guard `guard` controls block `bb` upon evaluating to `branch`. */ + predicate guardControlsBlock(Guard guard, SsaInput::BasicBlock bb, boolean branch) { + none() // TODO + } + + /** Gets an immediate conditional successor of basic block `bb`, if any. */ + SsaInput::BasicBlock getAConditionalBasicBlockSuccessor(SsaInput::BasicBlock bb, boolean branch) { + exists(Cfg::SuccessorTypes::ConditionalSuccessor s | + result = bb.getASuccessor(s) and + s.getValue() = branch + ) + } +} + +private module DataFlowIntegrationImpl = Impl::DataFlowIntegration; diff --git a/powershell/ql/lib/semmle/code/powershell/internal/Internal.qll b/powershell/ql/lib/semmle/code/powershell/internal/Internal.qll new file mode 100644 index 000000000000..be00f67e5606 --- /dev/null +++ b/powershell/ql/lib/semmle/code/powershell/internal/Internal.qll @@ -0,0 +1 @@ +import Parameter \ No newline at end of file diff --git a/powershell/ql/lib/semmle/code/powershell/Parameter.qll b/powershell/ql/lib/semmle/code/powershell/internal/Parameter.qll similarity index 75% rename from powershell/ql/lib/semmle/code/powershell/Parameter.qll rename to powershell/ql/lib/semmle/code/powershell/internal/Parameter.qll index 07c897d03201..85e953f00587 100644 --- a/powershell/ql/lib/semmle/code/powershell/Parameter.qll +++ b/powershell/ql/lib/semmle/code/powershell/internal/Parameter.qll @@ -3,7 +3,12 @@ import powershell class Parameter extends @parameter, Ast { override string toString() { result = this.getName().toString() } - VarAccess getName() { parameter(this, result, _, _) } + string getName() { + exists(@variable_expression ve | + parameter(this, ve, _, _) and + variable_expression(ve, result, _, _, _, _, _, _, _, _, _, _) + ) + } string getStaticType() { parameter(this, _, result, _) } diff --git a/powershell/ql/test/library-tests/ast/Arrays/arrays.expected b/powershell/ql/test/library-tests/ast/Arrays/arrays.expected index cf8238923bbf..1c50d2710a1b 100644 --- a/powershell/ql/test/library-tests/ast/Arrays/arrays.expected +++ b/powershell/ql/test/library-tests/ast/Arrays/arrays.expected @@ -1,23 +1,23 @@ arrayExpr -| Arrays.ps1:11:11:11:25 | ArrayExpression at: Arrays.ps1:11:11:11:25 | Arrays.ps1:11:13:11:24 | StatementBlock at: Arrays.ps1:11:13:11:24 | -| Arrays.ps1:14:41:14:44 | ArrayExpression at: Arrays.ps1:14:41:14:44 | Arrays.ps1:0:0:0:0 | StatementBlock at: Arrays.ps1:0:0:0:0 | +| Arrays.ps1:11:11:11:25 | @(...) | Arrays.ps1:11:13:11:24 | {...} | +| Arrays.ps1:14:41:14:44 | @(...) | Arrays.ps1:0:0:0:0 | {...} | arrayLiteral -| Arrays.ps1:1:11:1:37 | ArrayLiteral at: Arrays.ps1:1:11:1:37 | 0 | Arrays.ps1:1:11:1:12 | 1 | -| Arrays.ps1:1:11:1:37 | ArrayLiteral at: Arrays.ps1:1:11:1:37 | 1 | Arrays.ps1:1:13:1:14 | 2 | -| Arrays.ps1:1:11:1:37 | ArrayLiteral at: Arrays.ps1:1:11:1:37 | 2 | Arrays.ps1:1:15:1:18 | a | -| Arrays.ps1:1:11:1:37 | ArrayLiteral at: Arrays.ps1:1:11:1:37 | 3 | Arrays.ps1:1:19:1:24 | true | -| Arrays.ps1:1:11:1:37 | ArrayLiteral at: Arrays.ps1:1:11:1:37 | 4 | Arrays.ps1:1:25:1:31 | false | -| Arrays.ps1:1:11:1:37 | ArrayLiteral at: Arrays.ps1:1:11:1:37 | 5 | Arrays.ps1:1:32:1:37 | null | -| Arrays.ps1:5:34:5:37 | ArrayLiteral at: Arrays.ps1:5:34:5:37 | 0 | Arrays.ps1:5:34:5:35 | 2 | -| Arrays.ps1:5:34:5:37 | ArrayLiteral at: Arrays.ps1:5:34:5:37 | 1 | Arrays.ps1:5:36:5:37 | 2 | -| Arrays.ps1:6:9:6:12 | ArrayLiteral at: Arrays.ps1:6:9:6:12 | 0 | Arrays.ps1:6:9:6:10 | 0 | -| Arrays.ps1:6:9:6:12 | ArrayLiteral at: Arrays.ps1:6:9:6:12 | 1 | Arrays.ps1:6:11:6:12 | 0 | -| Arrays.ps1:7:9:7:12 | ArrayLiteral at: Arrays.ps1:7:9:7:12 | 0 | Arrays.ps1:7:9:7:10 | 1 | -| Arrays.ps1:7:9:7:12 | ArrayLiteral at: Arrays.ps1:7:9:7:12 | 1 | Arrays.ps1:7:11:7:12 | 0 | -| Arrays.ps1:8:9:8:12 | ArrayLiteral at: Arrays.ps1:8:9:8:12 | 0 | Arrays.ps1:8:9:8:10 | 0 | -| Arrays.ps1:8:9:8:12 | ArrayLiteral at: Arrays.ps1:8:9:8:12 | 1 | Arrays.ps1:8:11:8:12 | 1 | -| Arrays.ps1:9:9:9:12 | ArrayLiteral at: Arrays.ps1:9:9:9:12 | 0 | Arrays.ps1:9:9:9:10 | 1 | -| Arrays.ps1:9:9:9:12 | ArrayLiteral at: Arrays.ps1:9:9:9:12 | 1 | Arrays.ps1:9:11:9:12 | 1 | -| Arrays.ps1:11:13:11:24 | ArrayLiteral at: Arrays.ps1:11:13:11:24 | 0 | Arrays.ps1:11:13:11:16 | a | -| Arrays.ps1:11:13:11:24 | ArrayLiteral at: Arrays.ps1:11:13:11:24 | 1 | Arrays.ps1:11:17:11:20 | b | -| Arrays.ps1:11:13:11:24 | ArrayLiteral at: Arrays.ps1:11:13:11:24 | 2 | Arrays.ps1:11:21:11:24 | c | +| Arrays.ps1:1:11:1:37 | ...,... | 0 | Arrays.ps1:1:11:1:12 | 1 | +| Arrays.ps1:1:11:1:37 | ...,... | 1 | Arrays.ps1:1:13:1:14 | 2 | +| Arrays.ps1:1:11:1:37 | ...,... | 2 | Arrays.ps1:1:15:1:18 | a | +| Arrays.ps1:1:11:1:37 | ...,... | 3 | Arrays.ps1:1:19:1:24 | true | +| Arrays.ps1:1:11:1:37 | ...,... | 4 | Arrays.ps1:1:25:1:31 | false | +| Arrays.ps1:1:11:1:37 | ...,... | 5 | Arrays.ps1:1:32:1:37 | null | +| Arrays.ps1:5:34:5:37 | ...,... | 0 | Arrays.ps1:5:34:5:35 | 2 | +| Arrays.ps1:5:34:5:37 | ...,... | 1 | Arrays.ps1:5:36:5:37 | 2 | +| Arrays.ps1:6:9:6:12 | ...,... | 0 | Arrays.ps1:6:9:6:10 | 0 | +| Arrays.ps1:6:9:6:12 | ...,... | 1 | Arrays.ps1:6:11:6:12 | 0 | +| Arrays.ps1:7:9:7:12 | ...,... | 0 | Arrays.ps1:7:9:7:10 | 1 | +| Arrays.ps1:7:9:7:12 | ...,... | 1 | Arrays.ps1:7:11:7:12 | 0 | +| Arrays.ps1:8:9:8:12 | ...,... | 0 | Arrays.ps1:8:9:8:10 | 0 | +| Arrays.ps1:8:9:8:12 | ...,... | 1 | Arrays.ps1:8:11:8:12 | 1 | +| Arrays.ps1:9:9:9:12 | ...,... | 0 | Arrays.ps1:9:9:9:10 | 1 | +| Arrays.ps1:9:9:9:12 | ...,... | 1 | Arrays.ps1:9:11:9:12 | 1 | +| Arrays.ps1:11:13:11:24 | ...,... | 0 | Arrays.ps1:11:13:11:16 | a | +| Arrays.ps1:11:13:11:24 | ...,... | 1 | Arrays.ps1:11:17:11:20 | b | +| Arrays.ps1:11:13:11:24 | ...,... | 2 | Arrays.ps1:11:21:11:24 | c | diff --git a/powershell/ql/test/library-tests/ast/Arrays/arrays.ql b/powershell/ql/test/library-tests/ast/Arrays/arrays.ql index 18aa9ea5988e..087ee78e4ef9 100644 --- a/powershell/ql/test/library-tests/ast/Arrays/arrays.ql +++ b/powershell/ql/test/library-tests/ast/Arrays/arrays.ql @@ -1,6 +1,6 @@ import powershell -query predicate arrayExpr(ArrayExpr arrayExpr, StmtBlock subExpr) { subExpr = arrayExpr.getStatementBlock() } +query predicate arrayExpr(ArrayExpr arrayExpr, StmtBlock subExpr) { subExpr = arrayExpr.getStmtBlock() } query predicate arrayLiteral(ArrayLiteral arrayLiteral, int i, Expr e) { e = arrayLiteral.getElement(i) diff --git a/powershell/ql/test/library-tests/ast/Blocks/blocks.expected b/powershell/ql/test/library-tests/ast/Blocks/blocks.expected index b2116a0389b9..1d23ed850efe 100644 --- a/powershell/ql/test/library-tests/ast/Blocks/blocks.expected +++ b/powershell/ql/test/library-tests/ast/Blocks/blocks.expected @@ -1 +1 @@ -| ParamBlock.ps1:2:1:5:2 | ParamBlock | 0 | ParamBlock.ps1:3:5:4:23 | Parameter | +| ParamBlock.ps1:2:1:5:2 | param(...) | 0 | ParamBlock.ps1:3:5:4:23 | Parameter | diff --git a/powershell/ql/test/library-tests/ast/Expressions/expressions.expected b/powershell/ql/test/library-tests/ast/Expressions/expressions.expected index 662287cd1306..30aabf5cb277 100644 --- a/powershell/ql/test/library-tests/ast/Expressions/expressions.expected +++ b/powershell/ql/test/library-tests/ast/Expressions/expressions.expected @@ -1,19 +1,19 @@ binaryExpr | BinaryExpression.ps1:3:11:3:24 | ...+... | BinaryExpression.ps1:3:11:3:16 | val1 | BinaryExpression.ps1:3:19:3:24 | val2 | -| TernaryExpression.ps1:1:9:1:16 | ...+... | TernaryExpression.ps1:1:9:1:10 | 6 | TernaryExpression.ps1:1:15:1:16 | 7 | +| TernaryExpression.ps1:1:9:1:16 | ... -gt ... | TernaryExpression.ps1:1:9:1:10 | 6 | TernaryExpression.ps1:1:15:1:16 | 7 | cmdExpr | BinaryExpression.ps1:1:9:1:10 | 1 | BinaryExpression.ps1:1:9:1:10 | 1 | | BinaryExpression.ps1:2:9:2:10 | 2 | BinaryExpression.ps1:2:9:2:10 | 2 | | BinaryExpression.ps1:3:11:3:24 | ...+... | BinaryExpression.ps1:3:11:3:24 | ...+... | | BinaryExpression.ps1:4:1:4:8 | result | BinaryExpression.ps1:4:1:4:8 | result | -| ExpandableString.ps1:1:1:1:40 | ExpandableStringExpression at: ExpandableString.ps1:1:1:1:40 | ExpandableString.ps1:1:1:1:40 | ExpandableStringExpression at: ExpandableString.ps1:1:1:1:40 | -| ExpandableString.ps1:1:23:1:38 | (no string representation) | file://:0:0:0:0 | (no string representation) | -| SubExpression.ps1:1:1:1:24 | ArrayExpression at: SubExpression.ps1:1:1:1:24 | SubExpression.ps1:1:1:1:24 | ArrayExpression at: SubExpression.ps1:1:1:1:24 | -| SubExpression.ps1:2:1:2:22 | ArrayExpression at: SubExpression.ps1:2:1:2:22 | SubExpression.ps1:2:1:2:22 | ArrayExpression at: SubExpression.ps1:2:1:2:22 | +| ExpandableString.ps1:1:1:1:40 | Date: $([DateTime]::Now)\nName: $name | ExpandableString.ps1:1:1:1:40 | Date: $([DateTime]::Now)\nName: $name | +| ExpandableString.ps1:1:23:1:38 | Now | ExpandableString.ps1:1:23:1:38 | Now | +| SubExpression.ps1:1:1:1:24 | call to AddDays | SubExpression.ps1:1:1:1:24 | call to AddDays | +| SubExpression.ps1:2:1:2:22 | call to AddDays | SubExpression.ps1:2:1:2:22 | call to AddDays | | TernaryExpression.ps1:1:8:1:23 | ...?...:... | TernaryExpression.ps1:1:8:1:23 | ...?...:... | -| TernaryExpression.ps1:1:9:1:16 | ...+... | TernaryExpression.ps1:1:9:1:16 | ...+... | +| TernaryExpression.ps1:1:9:1:16 | ... -gt ... | TernaryExpression.ps1:1:9:1:16 | ... -gt ... | invokeMemoryExpression -| SubExpression.ps1:1:1:1:24 | ArrayExpression at: SubExpression.ps1:1:1:1:24 | file://:0:0:0:0 | (no string representation) | 0 | SubExpression.ps1:1:21:1:23 | 10 | +| SubExpression.ps1:1:1:1:24 | call to AddDays | SubExpression.ps1:1:1:1:12 | $(...) | 0 | SubExpression.ps1:1:21:1:23 | 10 | expandableString -| ExpandableString.ps1:1:1:1:40 | ExpandableStringExpression at: ExpandableString.ps1:1:1:1:40 | 0 | ExpandableString.ps1:1:8:1:13 | name | -| ExpandableString.ps1:1:1:1:40 | ExpandableStringExpression at: ExpandableString.ps1:1:1:1:40 | 1 | file://:0:0:0:0 | (no string representation) | +| ExpandableString.ps1:1:1:1:40 | Date: $([DateTime]::Now)\nName: $name | 0 | ExpandableString.ps1:1:8:1:13 | name | +| ExpandableString.ps1:1:1:1:40 | Date: $([DateTime]::Now)\nName: $name | 1 | ExpandableString.ps1:1:21:1:39 | $(...) | diff --git a/powershell/ql/test/library-tests/ast/Expressions/expressions.ql b/powershell/ql/test/library-tests/ast/Expressions/expressions.ql index 8680b2fc46f0..22d68304d1fb 100644 --- a/powershell/ql/test/library-tests/ast/Expressions/expressions.ql +++ b/powershell/ql/test/library-tests/ast/Expressions/expressions.ql @@ -9,11 +9,11 @@ query predicate cmdExpr(CmdExpr cmd, Expr e) { e = cmd.getExpr() } -query predicate invokeMemoryExpression(InvokeMemberExpression invoke, Expr e, int i, Expr arg) { - e = invoke.getExpression() and +query predicate invokeMemoryExpression(InvokeMemberExpr invoke, Expr e, int i, Expr arg) { + e = invoke.getBase() and arg = invoke.getArgument(i) } -query predicate expandableString(ExpandableStringExpression expandable, int i, Expr e) { +query predicate expandableString(ExpandableStringExpr expandable, int i, Expr e) { e = expandable.getExpr(i) } diff --git a/powershell/ql/test/library-tests/ast/Loops/loops.expected b/powershell/ql/test/library-tests/ast/Loops/loops.expected index 0f14697fe724..503d8894a46a 100644 --- a/powershell/ql/test/library-tests/ast/Loops/loops.expected +++ b/powershell/ql/test/library-tests/ast/Loops/loops.expected @@ -1,6 +1,6 @@ doUntil -| DoUntil.ps1:1:1:7:19 | DoUntil | DoUntil.ps1:7:10:7:18 | ...\|... | DoUntil.ps1:2:1:7:2 | StatementBlock at: DoUntil.ps1:2:1:7:2 | +| DoUntil.ps1:1:1:7:19 | DoUntil | DoUntil.ps1:7:10:7:18 | ... -le ... | DoUntil.ps1:2:1:7:2 | {...} | doWhile -| DoWhile.ps1:1:1:7:19 | DoWhile | DoWhile.ps1:7:10:7:18 | ...\|... | DoWhile.ps1:2:1:7:2 | StatementBlock at: DoWhile.ps1:2:1:7:2 | +| DoWhile.ps1:1:1:7:19 | DoWhile | DoWhile.ps1:7:10:7:18 | ... -le ... | DoWhile.ps1:2:1:7:2 | {...} | while -| While.ps1:2:1:13:2 | while(...) {...} | While.ps1:2:8:2:18 | ...\|... | While.ps1:3:1:13:2 | StatementBlock at: While.ps1:3:1:13:2 | +| While.ps1:2:1:13:2 | while(...) {...} | While.ps1:2:8:2:18 | ... -le ... | While.ps1:3:1:13:2 | {...} | diff --git a/powershell/ql/test/library-tests/ast/Statements/statements.expected b/powershell/ql/test/library-tests/ast/Statements/statements.expected index 51438b79f1b5..4d45d2a7c74f 100644 --- a/powershell/ql/test/library-tests/ast/Statements/statements.expected +++ b/powershell/ql/test/library-tests/ast/Statements/statements.expected @@ -1,38 +1,38 @@ | ExitStatement.ps1:1:1:1:8 | exit ... | | ExitStatement.ps1:1:6:1:8 | -1 | -| ExitStatement.ps1:1:6:1:8 | ...\|... | +| ExitStatement.ps1:1:6:1:8 | -1 | | IfStatement.ps1:1:1:1:7 | ...=... | | IfStatement.ps1:1:6:1:7 | 4 | | IfStatement.ps1:3:1:8:2 | if (...) {...} else {...} | -| IfStatement.ps1:3:5:3:13 | ...+... | -| IfStatement.ps1:3:5:3:13 | ...\|... | -| IfStatement.ps1:4:2:4:36 | ...\|... | -| IfStatement.ps1:4:2:4:36 | ExpandableStringExpression at: IfStatement.ps1:4:2:4:36 | -| IfStatement.ps1:7:2:7:21 | ...\|... | -| IfStatement.ps1:7:2:7:21 | ExpandableStringExpression at: IfStatement.ps1:7:2:7:21 | -| TrapStatement.ps1:1:1:4:2 | FunctionDefinition at: TrapStatement.ps1:1:1:4:2 | +| IfStatement.ps1:3:5:3:13 | ... -ge ... | +| IfStatement.ps1:3:5:3:13 | ... -ge ... | +| IfStatement.ps1:4:2:4:36 | $x is greater than or equal to 3 | +| IfStatement.ps1:4:2:4:36 | $x is greater than or equal to 3 | +| IfStatement.ps1:7:2:7:21 | $x is less than 3 | +| IfStatement.ps1:7:2:7:21 | $x is less than 3 | +| TrapStatement.ps1:1:1:4:2 | TrapTest | | TrapStatement.ps1:2:5:2:26 | TrapStatement at: TrapStatement.ps1:2:5:2:26 | -| TrapStatement.ps1:2:11:2:25 | ...\|... | | TrapStatement.ps1:2:11:2:25 | Error found. | -| TrapStatement.ps1:3:5:3:19 | ...\|... | +| TrapStatement.ps1:2:11:2:25 | Error found. | +| TrapStatement.ps1:3:5:3:19 | nonsenseString | | TrapStatement.ps1:3:5:3:19 | nonsenseString | -| TrapStatement.ps1:6:1:6:9 | ...\|... | +| TrapStatement.ps1:6:1:6:9 | TrapTest | | TrapStatement.ps1:6:1:6:9 | TrapTest | | Try.ps1:1:1:13:2 | try {...} | | Try.ps1:2:4:2:95 | ...=... | -| Try.ps1:2:17:2:95 | ...\|... | | Try.ps1:2:17:2:95 | New-Object | -| Try.ps1:2:69:2:94 | ...\|... | -| Try.ps1:2:69:2:94 | ArrayLiteral at: Try.ps1:2:69:2:94 | -| Try.ps1:3:11:3:21 | ...\|... | +| Try.ps1:2:17:2:95 | New-Object | +| Try.ps1:2:69:2:94 | ...,... | +| Try.ps1:2:69:2:94 | ...,... | +| Try.ps1:3:5:3:21 | throw ... | | Try.ps1:3:11:3:21 | Exception | -| Try.ps1:6:5:6:64 | ...\|... | +| Try.ps1:3:11:3:21 | Exception | +| Try.ps1:6:5:6:64 | Unable to download MyDoc.doc from http://www.contoso.com. | | Try.ps1:6:5:6:64 | Unable to download MyDoc.doc from http://www.contoso.com. | -| Try.ps1:9:5:9:52 | ...\|... | | Try.ps1:9:5:9:52 | An error occurred that could not be resolved. | -| Try.ps1:12:5:12:37 | ...\|... | +| Try.ps1:9:5:9:52 | An error occurred that could not be resolved. | | Try.ps1:12:5:12:37 | The finally block is executed. | -| UseProcessBlockForPipelineCommand.ps1:1:1:11:2 | FunctionDefinition at: UseProcessBlockForPipelineCommand.ps1:1:1:11:2 | -| UseProcessBlockForPipelineCommand.ps1:10:5:10:12 | ...\|... | +| Try.ps1:12:5:12:37 | The finally block is executed. | +| UseProcessBlockForPipelineCommand.ps1:1:1:11:2 | Get-Number | +| UseProcessBlockForPipelineCommand.ps1:10:5:10:12 | Number | | UseProcessBlockForPipelineCommand.ps1:10:5:10:12 | Number | -| file://:0:0:0:0 | (no string representation) | diff --git a/powershell/ql/test/library-tests/ast/parent.expected b/powershell/ql/test/library-tests/ast/parent.expected index b5eaea785627..2f6fe10b1e4c 100644 --- a/powershell/ql/test/library-tests/ast/parent.expected +++ b/powershell/ql/test/library-tests/ast/parent.expected @@ -1,128 +1,136 @@ +| Arrays/Arrays.ps1:0:0:0:0 | {...} | Arrays/Arrays.ps1:14:41:14:44 | @(...) | | Arrays/Arrays.ps1:1:1:1:8 | array1 | Arrays/Arrays.ps1:1:1:1:37 | ...=... | | Arrays/Arrays.ps1:1:1:1:37 | ...=... | Arrays/Arrays.ps1:1:1:15:15 | {...} | | Arrays/Arrays.ps1:1:1:15:15 | {...} | Arrays/Arrays.ps1:1:1:15:15 | Arrays.ps1 | -| Arrays/Arrays.ps1:1:11:1:12 | 1 | Arrays/Arrays.ps1:1:11:1:37 | ArrayLiteral at: Arrays/Arrays.ps1:1:11:1:37 | -| Arrays/Arrays.ps1:1:11:1:37 | ArrayLiteral at: Arrays/Arrays.ps1:1:11:1:37 | Arrays/Arrays.ps1:1:1:1:37 | ...=... | -| Arrays/Arrays.ps1:1:11:1:37 | ArrayLiteral at: Arrays/Arrays.ps1:1:11:1:37 | Arrays/Arrays.ps1:1:11:1:37 | ArrayLiteral at: Arrays/Arrays.ps1:1:11:1:37 | -| Arrays/Arrays.ps1:1:13:1:14 | 2 | Arrays/Arrays.ps1:1:11:1:37 | ArrayLiteral at: Arrays/Arrays.ps1:1:11:1:37 | -| Arrays/Arrays.ps1:1:15:1:18 | a | Arrays/Arrays.ps1:1:11:1:37 | ArrayLiteral at: Arrays/Arrays.ps1:1:11:1:37 | -| Arrays/Arrays.ps1:1:19:1:24 | true | Arrays/Arrays.ps1:1:11:1:37 | ArrayLiteral at: Arrays/Arrays.ps1:1:11:1:37 | -| Arrays/Arrays.ps1:1:25:1:31 | false | Arrays/Arrays.ps1:1:11:1:37 | ArrayLiteral at: Arrays/Arrays.ps1:1:11:1:37 | -| Arrays/Arrays.ps1:1:32:1:37 | null | Arrays/Arrays.ps1:1:11:1:37 | ArrayLiteral at: Arrays/Arrays.ps1:1:11:1:37 | -| Arrays/Arrays.ps1:2:1:2:8 | array1 | file://:0:0:0:0 | (no string representation) | +| Arrays/Arrays.ps1:1:11:1:12 | 1 | Arrays/Arrays.ps1:1:11:1:37 | ...,... | +| Arrays/Arrays.ps1:1:11:1:37 | ...,... | Arrays/Arrays.ps1:1:1:1:37 | ...=... | +| Arrays/Arrays.ps1:1:11:1:37 | ...,... | Arrays/Arrays.ps1:1:11:1:37 | ...,... | +| Arrays/Arrays.ps1:1:13:1:14 | 2 | Arrays/Arrays.ps1:1:11:1:37 | ...,... | +| Arrays/Arrays.ps1:1:15:1:18 | a | Arrays/Arrays.ps1:1:11:1:37 | ...,... | +| Arrays/Arrays.ps1:1:19:1:24 | true | Arrays/Arrays.ps1:1:11:1:37 | ...,... | +| Arrays/Arrays.ps1:1:25:1:31 | false | Arrays/Arrays.ps1:1:11:1:37 | ...,... | +| Arrays/Arrays.ps1:1:32:1:37 | null | Arrays/Arrays.ps1:1:11:1:37 | ...,... | +| Arrays/Arrays.ps1:2:1:2:8 | array1 | Arrays/Arrays.ps1:2:1:2:11 | ...[...] | +| Arrays/Arrays.ps1:2:1:2:11 | ...[...] | Arrays/Arrays.ps1:2:1:2:15 | ...=... | | Arrays/Arrays.ps1:2:1:2:15 | ...=... | Arrays/Arrays.ps1:1:1:15:15 | {...} | -| Arrays/Arrays.ps1:2:9:2:10 | 1 | file://:0:0:0:0 | (no string representation) | +| Arrays/Arrays.ps1:2:9:2:10 | 1 | Arrays/Arrays.ps1:2:1:2:11 | ...[...] | | Arrays/Arrays.ps1:2:14:2:15 | 3 | Arrays/Arrays.ps1:2:1:2:15 | ...=... | | Arrays/Arrays.ps1:2:14:2:15 | 3 | Arrays/Arrays.ps1:2:14:2:15 | 3 | -| Arrays/Arrays.ps1:3:1:3:8 | array1 | file://:0:0:0:0 | (no string representation) | +| Arrays/Arrays.ps1:3:1:3:8 | array1 | Arrays/Arrays.ps1:3:1:3:11 | ...[...] | +| Arrays/Arrays.ps1:3:1:3:11 | ...[...] | Arrays/Arrays.ps1:3:1:3:17 | ...=... | | Arrays/Arrays.ps1:3:1:3:17 | ...=... | Arrays/Arrays.ps1:1:1:15:15 | {...} | -| Arrays/Arrays.ps1:3:9:3:10 | 2 | file://:0:0:0:0 | (no string representation) | +| Arrays/Arrays.ps1:3:9:3:10 | 2 | Arrays/Arrays.ps1:3:1:3:11 | ...[...] | | Arrays/Arrays.ps1:3:14:3:17 | b | Arrays/Arrays.ps1:3:1:3:17 | ...=... | | Arrays/Arrays.ps1:3:14:3:17 | b | Arrays/Arrays.ps1:3:14:3:17 | b | | Arrays/Arrays.ps1:5:1:5:8 | array2 | Arrays/Arrays.ps1:5:1:5:37 | ...=... | | Arrays/Arrays.ps1:5:1:5:37 | ...=... | Arrays/Arrays.ps1:1:1:15:15 | {...} | | Arrays/Arrays.ps1:5:11:5:21 | New-Object | Arrays/Arrays.ps1:5:11:5:37 | New-Object | -| Arrays/Arrays.ps1:5:11:5:37 | ...\|... | Arrays/Arrays.ps1:5:1:5:37 | ...=... | -| Arrays/Arrays.ps1:5:11:5:37 | New-Object | Arrays/Arrays.ps1:5:11:5:37 | ...\|... | +| Arrays/Arrays.ps1:5:11:5:37 | New-Object | Arrays/Arrays.ps1:5:1:5:37 | ...=... | +| Arrays/Arrays.ps1:5:11:5:37 | New-Object | Arrays/Arrays.ps1:5:11:5:37 | New-Object | | Arrays/Arrays.ps1:5:22:5:33 | object[,] | Arrays/Arrays.ps1:5:11:5:37 | New-Object | -| Arrays/Arrays.ps1:5:34:5:35 | 2 | Arrays/Arrays.ps1:5:34:5:37 | ArrayLiteral at: Arrays/Arrays.ps1:5:34:5:37 | -| Arrays/Arrays.ps1:5:34:5:37 | ArrayLiteral at: Arrays/Arrays.ps1:5:34:5:37 | Arrays/Arrays.ps1:5:11:5:37 | New-Object | -| Arrays/Arrays.ps1:5:36:5:37 | 2 | Arrays/Arrays.ps1:5:34:5:37 | ArrayLiteral at: Arrays/Arrays.ps1:5:34:5:37 | -| Arrays/Arrays.ps1:6:1:6:8 | array2 | file://:0:0:0:0 | (no string representation) | +| Arrays/Arrays.ps1:5:34:5:35 | 2 | Arrays/Arrays.ps1:5:34:5:37 | ...,... | +| Arrays/Arrays.ps1:5:34:5:37 | ...,... | Arrays/Arrays.ps1:5:11:5:37 | New-Object | +| Arrays/Arrays.ps1:5:36:5:37 | 2 | Arrays/Arrays.ps1:5:34:5:37 | ...,... | +| Arrays/Arrays.ps1:6:1:6:8 | array2 | Arrays/Arrays.ps1:6:1:6:13 | ...[...] | +| Arrays/Arrays.ps1:6:1:6:13 | ...[...] | Arrays/Arrays.ps1:6:1:6:22 | ...=... | | Arrays/Arrays.ps1:6:1:6:22 | ...=... | Arrays/Arrays.ps1:1:1:15:15 | {...} | -| Arrays/Arrays.ps1:6:9:6:10 | 0 | Arrays/Arrays.ps1:6:9:6:12 | ArrayLiteral at: Arrays/Arrays.ps1:6:9:6:12 | -| Arrays/Arrays.ps1:6:9:6:12 | ArrayLiteral at: Arrays/Arrays.ps1:6:9:6:12 | file://:0:0:0:0 | (no string representation) | -| Arrays/Arrays.ps1:6:11:6:12 | 0 | Arrays/Arrays.ps1:6:9:6:12 | ArrayLiteral at: Arrays/Arrays.ps1:6:9:6:12 | +| Arrays/Arrays.ps1:6:9:6:10 | 0 | Arrays/Arrays.ps1:6:9:6:12 | ...,... | +| Arrays/Arrays.ps1:6:9:6:12 | ...,... | Arrays/Arrays.ps1:6:1:6:13 | ...[...] | +| Arrays/Arrays.ps1:6:11:6:12 | 0 | Arrays/Arrays.ps1:6:9:6:12 | ...,... | | Arrays/Arrays.ps1:6:16:6:22 | key1 | Arrays/Arrays.ps1:6:1:6:22 | ...=... | | Arrays/Arrays.ps1:6:16:6:22 | key1 | Arrays/Arrays.ps1:6:16:6:22 | key1 | -| Arrays/Arrays.ps1:7:1:7:8 | array2 | file://:0:0:0:0 | (no string representation) | +| Arrays/Arrays.ps1:7:1:7:8 | array2 | Arrays/Arrays.ps1:7:1:7:13 | ...[...] | +| Arrays/Arrays.ps1:7:1:7:13 | ...[...] | Arrays/Arrays.ps1:7:1:7:22 | ...=... | | Arrays/Arrays.ps1:7:1:7:22 | ...=... | Arrays/Arrays.ps1:1:1:15:15 | {...} | -| Arrays/Arrays.ps1:7:9:7:10 | 1 | Arrays/Arrays.ps1:7:9:7:12 | ArrayLiteral at: Arrays/Arrays.ps1:7:9:7:12 | -| Arrays/Arrays.ps1:7:9:7:12 | ArrayLiteral at: Arrays/Arrays.ps1:7:9:7:12 | file://:0:0:0:0 | (no string representation) | -| Arrays/Arrays.ps1:7:11:7:12 | 0 | Arrays/Arrays.ps1:7:9:7:12 | ArrayLiteral at: Arrays/Arrays.ps1:7:9:7:12 | +| Arrays/Arrays.ps1:7:9:7:10 | 1 | Arrays/Arrays.ps1:7:9:7:12 | ...,... | +| Arrays/Arrays.ps1:7:9:7:12 | ...,... | Arrays/Arrays.ps1:7:1:7:13 | ...[...] | +| Arrays/Arrays.ps1:7:11:7:12 | 0 | Arrays/Arrays.ps1:7:9:7:12 | ...,... | | Arrays/Arrays.ps1:7:16:7:22 | key1 | Arrays/Arrays.ps1:7:1:7:22 | ...=... | | Arrays/Arrays.ps1:7:16:7:22 | key1 | Arrays/Arrays.ps1:7:16:7:22 | key1 | -| Arrays/Arrays.ps1:8:1:8:8 | array2 | file://:0:0:0:0 | (no string representation) | +| Arrays/Arrays.ps1:8:1:8:8 | array2 | Arrays/Arrays.ps1:8:1:8:13 | ...[...] | +| Arrays/Arrays.ps1:8:1:8:13 | ...[...] | Arrays/Arrays.ps1:8:1:8:24 | ...=... | | Arrays/Arrays.ps1:8:1:8:24 | ...=... | Arrays/Arrays.ps1:1:1:15:15 | {...} | -| Arrays/Arrays.ps1:8:9:8:10 | 0 | Arrays/Arrays.ps1:8:9:8:12 | ArrayLiteral at: Arrays/Arrays.ps1:8:9:8:12 | -| Arrays/Arrays.ps1:8:9:8:12 | ArrayLiteral at: Arrays/Arrays.ps1:8:9:8:12 | file://:0:0:0:0 | (no string representation) | -| Arrays/Arrays.ps1:8:11:8:12 | 1 | Arrays/Arrays.ps1:8:9:8:12 | ArrayLiteral at: Arrays/Arrays.ps1:8:9:8:12 | +| Arrays/Arrays.ps1:8:9:8:10 | 0 | Arrays/Arrays.ps1:8:9:8:12 | ...,... | +| Arrays/Arrays.ps1:8:9:8:12 | ...,... | Arrays/Arrays.ps1:8:1:8:13 | ...[...] | +| Arrays/Arrays.ps1:8:11:8:12 | 1 | Arrays/Arrays.ps1:8:9:8:12 | ...,... | | Arrays/Arrays.ps1:8:16:8:24 | value1 | Arrays/Arrays.ps1:8:1:8:24 | ...=... | | Arrays/Arrays.ps1:8:16:8:24 | value1 | Arrays/Arrays.ps1:8:16:8:24 | value1 | -| Arrays/Arrays.ps1:9:1:9:8 | array2 | file://:0:0:0:0 | (no string representation) | +| Arrays/Arrays.ps1:9:1:9:8 | array2 | Arrays/Arrays.ps1:9:1:9:13 | ...[...] | +| Arrays/Arrays.ps1:9:1:9:13 | ...[...] | Arrays/Arrays.ps1:9:1:9:21 | ...=... | | Arrays/Arrays.ps1:9:1:9:21 | ...=... | Arrays/Arrays.ps1:1:1:15:15 | {...} | -| Arrays/Arrays.ps1:9:9:9:10 | 1 | Arrays/Arrays.ps1:9:9:9:12 | ArrayLiteral at: Arrays/Arrays.ps1:9:9:9:12 | -| Arrays/Arrays.ps1:9:9:9:12 | ArrayLiteral at: Arrays/Arrays.ps1:9:9:9:12 | file://:0:0:0:0 | (no string representation) | -| Arrays/Arrays.ps1:9:11:9:12 | 1 | Arrays/Arrays.ps1:9:9:9:12 | ArrayLiteral at: Arrays/Arrays.ps1:9:9:9:12 | +| Arrays/Arrays.ps1:9:9:9:10 | 1 | Arrays/Arrays.ps1:9:9:9:12 | ...,... | +| Arrays/Arrays.ps1:9:9:9:12 | ...,... | Arrays/Arrays.ps1:9:1:9:13 | ...[...] | +| Arrays/Arrays.ps1:9:11:9:12 | 1 | Arrays/Arrays.ps1:9:9:9:12 | ...,... | | Arrays/Arrays.ps1:9:16:9:21 | null | Arrays/Arrays.ps1:9:1:9:21 | ...=... | | Arrays/Arrays.ps1:9:16:9:21 | null | Arrays/Arrays.ps1:9:16:9:21 | null | | Arrays/Arrays.ps1:11:1:11:8 | array3 | Arrays/Arrays.ps1:11:1:11:25 | ...=... | | Arrays/Arrays.ps1:11:1:11:25 | ...=... | Arrays/Arrays.ps1:1:1:15:15 | {...} | -| Arrays/Arrays.ps1:11:11:11:25 | ArrayExpression at: Arrays/Arrays.ps1:11:11:11:25 | Arrays/Arrays.ps1:11:1:11:25 | ...=... | -| Arrays/Arrays.ps1:11:11:11:25 | ArrayExpression at: Arrays/Arrays.ps1:11:11:11:25 | Arrays/Arrays.ps1:11:11:11:25 | ArrayExpression at: Arrays/Arrays.ps1:11:11:11:25 | -| Arrays/Arrays.ps1:11:13:11:16 | a | Arrays/Arrays.ps1:11:13:11:24 | ArrayLiteral at: Arrays/Arrays.ps1:11:13:11:24 | -| Arrays/Arrays.ps1:11:13:11:24 | ...\|... | Arrays/Arrays.ps1:11:13:11:24 | StatementBlock at: Arrays/Arrays.ps1:11:13:11:24 | -| Arrays/Arrays.ps1:11:13:11:24 | ArrayLiteral at: Arrays/Arrays.ps1:11:13:11:24 | Arrays/Arrays.ps1:11:13:11:24 | ...\|... | -| Arrays/Arrays.ps1:11:13:11:24 | ArrayLiteral at: Arrays/Arrays.ps1:11:13:11:24 | Arrays/Arrays.ps1:11:13:11:24 | ArrayLiteral at: Arrays/Arrays.ps1:11:13:11:24 | -| Arrays/Arrays.ps1:11:17:11:20 | b | Arrays/Arrays.ps1:11:13:11:24 | ArrayLiteral at: Arrays/Arrays.ps1:11:13:11:24 | -| Arrays/Arrays.ps1:11:21:11:24 | c | Arrays/Arrays.ps1:11:13:11:24 | ArrayLiteral at: Arrays/Arrays.ps1:11:13:11:24 | -| Arrays/Arrays.ps1:12:1:12:8 | array3 | file://:0:0:0:0 | (no string representation) | -| Arrays/Arrays.ps1:12:1:12:14 | (no string representation) | Arrays/Arrays.ps1:12:1:12:14 | ...\|... | -| Arrays/Arrays.ps1:12:1:12:14 | ...\|... | Arrays/Arrays.ps1:1:1:15:15 | {...} | -| Arrays/Arrays.ps1:12:9:12:14 | count | file://:0:0:0:0 | (no string representation) | +| Arrays/Arrays.ps1:11:11:11:25 | @(...) | Arrays/Arrays.ps1:11:1:11:25 | ...=... | +| Arrays/Arrays.ps1:11:11:11:25 | @(...) | Arrays/Arrays.ps1:11:11:11:25 | @(...) | +| Arrays/Arrays.ps1:11:13:11:16 | a | Arrays/Arrays.ps1:11:13:11:24 | ...,... | +| Arrays/Arrays.ps1:11:13:11:24 | ...,... | Arrays/Arrays.ps1:11:13:11:24 | ...,... | +| Arrays/Arrays.ps1:11:13:11:24 | ...,... | Arrays/Arrays.ps1:11:13:11:24 | ...,... | +| Arrays/Arrays.ps1:11:13:11:24 | ...,... | Arrays/Arrays.ps1:11:13:11:24 | {...} | +| Arrays/Arrays.ps1:11:13:11:24 | {...} | Arrays/Arrays.ps1:11:11:11:25 | @(...) | +| Arrays/Arrays.ps1:11:17:11:20 | b | Arrays/Arrays.ps1:11:13:11:24 | ...,... | +| Arrays/Arrays.ps1:11:21:11:24 | c | Arrays/Arrays.ps1:11:13:11:24 | ...,... | +| Arrays/Arrays.ps1:12:1:12:8 | array3 | Arrays/Arrays.ps1:12:1:12:14 | count | +| Arrays/Arrays.ps1:12:1:12:14 | count | Arrays/Arrays.ps1:1:1:15:15 | {...} | +| Arrays/Arrays.ps1:12:1:12:14 | count | Arrays/Arrays.ps1:12:1:12:14 | count | +| Arrays/Arrays.ps1:12:1:12:14 | count | Arrays/Arrays.ps1:12:1:12:14 | count | +| Arrays/Arrays.ps1:12:9:12:14 | count | Arrays/Arrays.ps1:12:1:12:14 | count | | Arrays/Arrays.ps1:14:1:14:8 | array4 | Arrays/Arrays.ps1:14:1:14:44 | ...=... | | Arrays/Arrays.ps1:14:1:14:44 | ...=... | Arrays/Arrays.ps1:1:1:15:15 | {...} | -| Arrays/Arrays.ps1:14:11:14:41 | System.Collections.ArrayList | file://:0:0:0:0 | (no string representation) | -| Arrays/Arrays.ps1:14:11:14:44 | (no string representation) | Arrays/Arrays.ps1:14:1:14:44 | ...=... | -| Arrays/Arrays.ps1:14:41:14:44 | ArrayExpression at: Arrays/Arrays.ps1:14:41:14:44 | file://:0:0:0:0 | (no string representation) | -| Arrays/Arrays.ps1:15:1:15:8 | array4 | Arrays/Arrays.ps1:15:1:15:15 | ArrayExpression at: Arrays/Arrays.ps1:15:1:15:15 | -| Arrays/Arrays.ps1:15:1:15:15 | ...\|... | Arrays/Arrays.ps1:1:1:15:15 | {...} | -| Arrays/Arrays.ps1:15:1:15:15 | ArrayExpression at: Arrays/Arrays.ps1:15:1:15:15 | Arrays/Arrays.ps1:15:1:15:15 | ...\|... | -| Arrays/Arrays.ps1:15:1:15:15 | ArrayExpression at: Arrays/Arrays.ps1:15:1:15:15 | Arrays/Arrays.ps1:15:1:15:15 | ArrayExpression at: Arrays/Arrays.ps1:15:1:15:15 | -| Arrays/Arrays.ps1:15:9:15:12 | Add | Arrays/Arrays.ps1:15:1:15:15 | ArrayExpression at: Arrays/Arrays.ps1:15:1:15:15 | -| Arrays/Arrays.ps1:15:13:15:14 | 1 | Arrays/Arrays.ps1:15:1:15:15 | ArrayExpression at: Arrays/Arrays.ps1:15:1:15:15 | -| Blocks/ParamBlock.ps1:1:1:1:18 | CmdletBinding | Blocks/ParamBlock.ps1:2:1:5:2 | ParamBlock | -| Blocks/ParamBlock.ps1:2:1:5:2 | ParamBlock | Blocks/ParamBlock.ps1:1:1:5:2 | ParamBlock.ps1 | +| Arrays/Arrays.ps1:14:11:14:41 | System.Collections.ArrayList | Arrays/Arrays.ps1:14:11:14:44 | [...]... | +| Arrays/Arrays.ps1:14:11:14:44 | [...]... | Arrays/Arrays.ps1:14:1:14:44 | ...=... | +| Arrays/Arrays.ps1:14:11:14:44 | [...]... | Arrays/Arrays.ps1:14:11:14:44 | [...]... | +| Arrays/Arrays.ps1:14:41:14:44 | @(...) | Arrays/Arrays.ps1:14:11:14:44 | [...]... | +| Arrays/Arrays.ps1:15:1:15:8 | array4 | Arrays/Arrays.ps1:15:1:15:15 | call to Add | +| Arrays/Arrays.ps1:15:1:15:15 | call to Add | Arrays/Arrays.ps1:1:1:15:15 | {...} | +| Arrays/Arrays.ps1:15:1:15:15 | call to Add | Arrays/Arrays.ps1:15:1:15:15 | call to Add | +| Arrays/Arrays.ps1:15:1:15:15 | call to Add | Arrays/Arrays.ps1:15:1:15:15 | call to Add | +| Arrays/Arrays.ps1:15:9:15:12 | Add | Arrays/Arrays.ps1:15:1:15:15 | call to Add | +| Arrays/Arrays.ps1:15:13:15:14 | 1 | Arrays/Arrays.ps1:15:1:15:15 | call to Add | +| Blocks/ParamBlock.ps1:1:1:1:18 | CmdletBinding | Blocks/ParamBlock.ps1:2:1:5:2 | param(...) | +| Blocks/ParamBlock.ps1:2:1:5:2 | param(...) | Blocks/ParamBlock.ps1:1:1:5:2 | ParamBlock.ps1 | | Blocks/ParamBlock.ps1:2:1:5:2 | {...} | Blocks/ParamBlock.ps1:1:1:5:2 | ParamBlock.ps1 | | Blocks/ParamBlock.ps1:3:5:3:18 | Parameter | Blocks/ParamBlock.ps1:3:5:4:23 | Parameter | -| Blocks/ParamBlock.ps1:3:5:4:23 | Parameter | Blocks/ParamBlock.ps1:2:1:5:2 | ParamBlock | +| Blocks/ParamBlock.ps1:3:5:4:23 | Parameter | Blocks/ParamBlock.ps1:2:1:5:2 | param(...) | | Blocks/ParamBlock.ps1:4:5:4:13 | string | Blocks/ParamBlock.ps1:3:5:4:23 | Parameter | -| Blocks/ParamBlock.ps1:4:13:4:23 | Parameter | Blocks/ParamBlock.ps1:3:5:4:23 | Parameter | | Dynamic/DynamicExecution.ps1:1:1:1:5 | foo | Dynamic/DynamicExecution.ps1:1:1:1:17 | ...=... | | Dynamic/DynamicExecution.ps1:1:1:1:17 | ...=... | Dynamic/DynamicExecution.ps1:1:1:5:8 | {...} | | Dynamic/DynamicExecution.ps1:1:1:5:8 | {...} | Dynamic/DynamicExecution.ps1:1:1:5:8 | DynamicExecution.ps1 | | Dynamic/DynamicExecution.ps1:1:8:1:17 | cmd.exe | Dynamic/DynamicExecution.ps1:1:1:1:17 | ...=... | | Dynamic/DynamicExecution.ps1:1:8:1:17 | cmd.exe | Dynamic/DynamicExecution.ps1:1:8:1:17 | cmd.exe | | Dynamic/DynamicExecution.ps1:2:1:2:18 | Invoke-Expression | Dynamic/DynamicExecution.ps1:2:1:2:23 | Invoke-Expression | -| Dynamic/DynamicExecution.ps1:2:1:2:23 | ...\|... | Dynamic/DynamicExecution.ps1:1:1:5:8 | {...} | -| Dynamic/DynamicExecution.ps1:2:1:2:23 | Invoke-Expression | Dynamic/DynamicExecution.ps1:2:1:2:23 | ...\|... | +| Dynamic/DynamicExecution.ps1:2:1:2:23 | Invoke-Expression | Dynamic/DynamicExecution.ps1:1:1:5:8 | {...} | +| Dynamic/DynamicExecution.ps1:2:1:2:23 | Invoke-Expression | Dynamic/DynamicExecution.ps1:2:1:2:23 | Invoke-Expression | | Dynamic/DynamicExecution.ps1:2:19:2:23 | foo | Dynamic/DynamicExecution.ps1:2:1:2:23 | Invoke-Expression | -| Dynamic/DynamicExecution.ps1:3:1:3:14 | scriptblock | Dynamic/DynamicExecution.ps1:3:1:3:28 | ArrayExpression at: Dynamic/DynamicExecution.ps1:3:1:3:28 | -| Dynamic/DynamicExecution.ps1:3:1:3:28 | ...\|... | Dynamic/DynamicExecution.ps1:1:1:5:8 | {...} | -| Dynamic/DynamicExecution.ps1:3:1:3:28 | ArrayExpression at: Dynamic/DynamicExecution.ps1:3:1:3:28 | Dynamic/DynamicExecution.ps1:3:1:3:28 | ...\|... | -| Dynamic/DynamicExecution.ps1:3:1:3:28 | ArrayExpression at: Dynamic/DynamicExecution.ps1:3:1:3:28 | Dynamic/DynamicExecution.ps1:3:1:3:28 | ArrayExpression at: Dynamic/DynamicExecution.ps1:3:1:3:28 | -| Dynamic/DynamicExecution.ps1:3:16:3:22 | Create | Dynamic/DynamicExecution.ps1:3:1:3:28 | ArrayExpression at: Dynamic/DynamicExecution.ps1:3:1:3:28 | -| Dynamic/DynamicExecution.ps1:3:23:3:27 | foo | Dynamic/DynamicExecution.ps1:3:1:3:28 | ArrayExpression at: Dynamic/DynamicExecution.ps1:3:1:3:28 | -| Dynamic/DynamicExecution.ps1:4:1:4:32 | | Dynamic/DynamicExecution.ps1:4:1:4:32 | ...\|... | -| Dynamic/DynamicExecution.ps1:4:1:4:32 | ...\|... | Dynamic/DynamicExecution.ps1:1:1:5:8 | {...} | +| Dynamic/DynamicExecution.ps1:3:1:3:14 | scriptblock | Dynamic/DynamicExecution.ps1:3:1:3:28 | call to Create | +| Dynamic/DynamicExecution.ps1:3:1:3:28 | call to Create | Dynamic/DynamicExecution.ps1:1:1:5:8 | {...} | +| Dynamic/DynamicExecution.ps1:3:1:3:28 | call to Create | Dynamic/DynamicExecution.ps1:3:1:3:28 | call to Create | +| Dynamic/DynamicExecution.ps1:3:1:3:28 | call to Create | Dynamic/DynamicExecution.ps1:3:1:3:28 | call to Create | +| Dynamic/DynamicExecution.ps1:3:16:3:22 | Create | Dynamic/DynamicExecution.ps1:3:1:3:28 | call to Create | +| Dynamic/DynamicExecution.ps1:3:23:3:27 | foo | Dynamic/DynamicExecution.ps1:3:1:3:28 | call to Create | +| Dynamic/DynamicExecution.ps1:4:1:4:32 | | Dynamic/DynamicExecution.ps1:1:1:5:8 | {...} | +| Dynamic/DynamicExecution.ps1:4:1:4:32 | | Dynamic/DynamicExecution.ps1:4:1:4:32 | | | Dynamic/DynamicExecution.ps1:4:3:4:32 | (...) | Dynamic/DynamicExecution.ps1:4:1:4:32 | | -| Dynamic/DynamicExecution.ps1:4:4:4:17 | scriptblock | Dynamic/DynamicExecution.ps1:4:4:4:31 | ArrayExpression at: Dynamic/DynamicExecution.ps1:4:4:4:31 | -| Dynamic/DynamicExecution.ps1:4:4:4:31 | ...\|... | Dynamic/DynamicExecution.ps1:4:3:4:32 | (...) | -| Dynamic/DynamicExecution.ps1:4:4:4:31 | ArrayExpression at: Dynamic/DynamicExecution.ps1:4:4:4:31 | Dynamic/DynamicExecution.ps1:4:4:4:31 | ...\|... | -| Dynamic/DynamicExecution.ps1:4:4:4:31 | ArrayExpression at: Dynamic/DynamicExecution.ps1:4:4:4:31 | Dynamic/DynamicExecution.ps1:4:4:4:31 | ArrayExpression at: Dynamic/DynamicExecution.ps1:4:4:4:31 | -| Dynamic/DynamicExecution.ps1:4:19:4:25 | Create | Dynamic/DynamicExecution.ps1:4:4:4:31 | ArrayExpression at: Dynamic/DynamicExecution.ps1:4:4:4:31 | -| Dynamic/DynamicExecution.ps1:4:26:4:30 | foo | Dynamic/DynamicExecution.ps1:4:4:4:31 | ArrayExpression at: Dynamic/DynamicExecution.ps1:4:4:4:31 | -| Dynamic/DynamicExecution.ps1:5:1:5:8 | | Dynamic/DynamicExecution.ps1:5:1:5:8 | ...\|... | -| Dynamic/DynamicExecution.ps1:5:1:5:8 | ...\|... | Dynamic/DynamicExecution.ps1:1:1:5:8 | {...} | -| Dynamic/DynamicExecution.ps1:5:2:5:8 | ExpandableStringExpression at: Dynamic/DynamicExecution.ps1:5:2:5:8 | Dynamic/DynamicExecution.ps1:5:1:5:8 | | -| Dynamic/DynamicExecution.ps1:5:3:5:7 | foo | Dynamic/DynamicExecution.ps1:5:2:5:8 | ExpandableStringExpression at: Dynamic/DynamicExecution.ps1:5:2:5:8 | -| Dynamic/DynamicExecutionWithFunc.ps1:1:1:11:2 | FunctionDefinition at: Dynamic/DynamicExecutionWithFunc.ps1:1:1:11:2 | Dynamic/DynamicExecutionWithFunc.ps1:1:1:11:2 | {...} | +| Dynamic/DynamicExecution.ps1:4:4:4:17 | scriptblock | Dynamic/DynamicExecution.ps1:4:4:4:31 | call to Create | +| Dynamic/DynamicExecution.ps1:4:4:4:31 | call to Create | Dynamic/DynamicExecution.ps1:4:3:4:32 | (...) | +| Dynamic/DynamicExecution.ps1:4:4:4:31 | call to Create | Dynamic/DynamicExecution.ps1:4:4:4:31 | call to Create | +| Dynamic/DynamicExecution.ps1:4:4:4:31 | call to Create | Dynamic/DynamicExecution.ps1:4:4:4:31 | call to Create | +| Dynamic/DynamicExecution.ps1:4:19:4:25 | Create | Dynamic/DynamicExecution.ps1:4:4:4:31 | call to Create | +| Dynamic/DynamicExecution.ps1:4:26:4:30 | foo | Dynamic/DynamicExecution.ps1:4:4:4:31 | call to Create | +| Dynamic/DynamicExecution.ps1:5:1:5:8 | | Dynamic/DynamicExecution.ps1:1:1:5:8 | {...} | +| Dynamic/DynamicExecution.ps1:5:1:5:8 | | Dynamic/DynamicExecution.ps1:5:1:5:8 | | +| Dynamic/DynamicExecution.ps1:5:2:5:8 | $foo | Dynamic/DynamicExecution.ps1:5:1:5:8 | | +| Dynamic/DynamicExecution.ps1:5:3:5:7 | foo | Dynamic/DynamicExecution.ps1:5:2:5:8 | $foo | +| Dynamic/DynamicExecutionWithFunc.ps1:1:1:11:2 | ExecuteAThing | Dynamic/DynamicExecutionWithFunc.ps1:1:1:11:2 | {...} | | Dynamic/DynamicExecutionWithFunc.ps1:1:1:11:2 | {...} | Dynamic/DynamicExecutionWithFunc.ps1:1:1:11:2 | DynamicExecutionWithFunc.ps1 | -| Dynamic/DynamicExecutionWithFunc.ps1:1:24:11:2 | DynamicExecutionWithFunc.ps1 | Dynamic/DynamicExecutionWithFunc.ps1:1:1:11:2 | FunctionDefinition at: Dynamic/DynamicExecutionWithFunc.ps1:1:1:11:2 | -| Dynamic/DynamicExecutionWithFunc.ps1:2:5:4:6 | ParamBlock | Dynamic/DynamicExecutionWithFunc.ps1:1:24:11:2 | DynamicExecutionWithFunc.ps1 | -| Dynamic/DynamicExecutionWithFunc.ps1:2:5:10:30 | {...} | Dynamic/DynamicExecutionWithFunc.ps1:1:24:11:2 | DynamicExecutionWithFunc.ps1 | -| Dynamic/DynamicExecutionWithFunc.ps1:3:9:3:19 | userInput | Dynamic/DynamicExecutionWithFunc.ps1:2:5:4:6 | ParamBlock | -| Dynamic/DynamicExecutionWithFunc.ps1:3:9:3:19 | userInput | Dynamic/DynamicExecutionWithFunc.ps1:3:9:3:19 | userInput | +| Dynamic/DynamicExecutionWithFunc.ps1:1:24:11:2 | {...} | Dynamic/DynamicExecutionWithFunc.ps1:1:1:11:2 | ExecuteAThing | +| Dynamic/DynamicExecutionWithFunc.ps1:2:5:4:6 | param(...) | Dynamic/DynamicExecutionWithFunc.ps1:1:24:11:2 | {...} | +| Dynamic/DynamicExecutionWithFunc.ps1:2:5:10:30 | {...} | Dynamic/DynamicExecutionWithFunc.ps1:1:24:11:2 | {...} | +| Dynamic/DynamicExecutionWithFunc.ps1:3:9:3:19 | userInput | Dynamic/DynamicExecutionWithFunc.ps1:2:5:4:6 | param(...) | | Dynamic/DynamicExecutionWithFunc.ps1:5:5:5:9 | foo | Dynamic/DynamicExecutionWithFunc.ps1:5:5:5:34 | ...=... | | Dynamic/DynamicExecutionWithFunc.ps1:5:5:5:34 | ...=... | Dynamic/DynamicExecutionWithFunc.ps1:2:5:10:30 | {...} | | Dynamic/DynamicExecutionWithFunc.ps1:5:12:5:21 | cmd.exe | Dynamic/DynamicExecutionWithFunc.ps1:5:12:5:34 | ...+... | @@ -130,35 +138,36 @@ | Dynamic/DynamicExecutionWithFunc.ps1:5:12:5:34 | ...+... | Dynamic/DynamicExecutionWithFunc.ps1:5:12:5:34 | ...+... | | Dynamic/DynamicExecutionWithFunc.ps1:5:24:5:34 | userInput | Dynamic/DynamicExecutionWithFunc.ps1:5:12:5:34 | ...+... | | Dynamic/DynamicExecutionWithFunc.ps1:6:5:6:22 | Invoke-Expression | Dynamic/DynamicExecutionWithFunc.ps1:6:5:6:27 | Invoke-Expression | -| Dynamic/DynamicExecutionWithFunc.ps1:6:5:6:27 | ...\|... | Dynamic/DynamicExecutionWithFunc.ps1:2:5:10:30 | {...} | -| Dynamic/DynamicExecutionWithFunc.ps1:6:5:6:27 | Invoke-Expression | Dynamic/DynamicExecutionWithFunc.ps1:6:5:6:27 | ...\|... | +| Dynamic/DynamicExecutionWithFunc.ps1:6:5:6:27 | Invoke-Expression | Dynamic/DynamicExecutionWithFunc.ps1:2:5:10:30 | {...} | +| Dynamic/DynamicExecutionWithFunc.ps1:6:5:6:27 | Invoke-Expression | Dynamic/DynamicExecutionWithFunc.ps1:6:5:6:27 | Invoke-Expression | | Dynamic/DynamicExecutionWithFunc.ps1:6:23:6:27 | foo | Dynamic/DynamicExecutionWithFunc.ps1:6:5:6:27 | Invoke-Expression | -| Dynamic/DynamicExecutionWithFunc.ps1:7:5:7:18 | scriptblock | Dynamic/DynamicExecutionWithFunc.ps1:7:5:7:32 | ArrayExpression at: Dynamic/DynamicExecutionWithFunc.ps1:7:5:7:32 | -| Dynamic/DynamicExecutionWithFunc.ps1:7:5:7:32 | ...\|... | Dynamic/DynamicExecutionWithFunc.ps1:2:5:10:30 | {...} | -| Dynamic/DynamicExecutionWithFunc.ps1:7:5:7:32 | ArrayExpression at: Dynamic/DynamicExecutionWithFunc.ps1:7:5:7:32 | Dynamic/DynamicExecutionWithFunc.ps1:7:5:7:32 | ...\|... | -| Dynamic/DynamicExecutionWithFunc.ps1:7:5:7:32 | ArrayExpression at: Dynamic/DynamicExecutionWithFunc.ps1:7:5:7:32 | Dynamic/DynamicExecutionWithFunc.ps1:7:5:7:32 | ArrayExpression at: Dynamic/DynamicExecutionWithFunc.ps1:7:5:7:32 | -| Dynamic/DynamicExecutionWithFunc.ps1:7:20:7:26 | Create | Dynamic/DynamicExecutionWithFunc.ps1:7:5:7:32 | ArrayExpression at: Dynamic/DynamicExecutionWithFunc.ps1:7:5:7:32 | -| Dynamic/DynamicExecutionWithFunc.ps1:7:27:7:31 | foo | Dynamic/DynamicExecutionWithFunc.ps1:7:5:7:32 | ArrayExpression at: Dynamic/DynamicExecutionWithFunc.ps1:7:5:7:32 | -| Dynamic/DynamicExecutionWithFunc.ps1:8:5:8:36 | | Dynamic/DynamicExecutionWithFunc.ps1:8:5:8:36 | ...\|... | -| Dynamic/DynamicExecutionWithFunc.ps1:8:5:8:36 | ...\|... | Dynamic/DynamicExecutionWithFunc.ps1:2:5:10:30 | {...} | +| Dynamic/DynamicExecutionWithFunc.ps1:7:5:7:18 | scriptblock | Dynamic/DynamicExecutionWithFunc.ps1:7:5:7:32 | call to Create | +| Dynamic/DynamicExecutionWithFunc.ps1:7:5:7:32 | call to Create | Dynamic/DynamicExecutionWithFunc.ps1:2:5:10:30 | {...} | +| Dynamic/DynamicExecutionWithFunc.ps1:7:5:7:32 | call to Create | Dynamic/DynamicExecutionWithFunc.ps1:7:5:7:32 | call to Create | +| Dynamic/DynamicExecutionWithFunc.ps1:7:5:7:32 | call to Create | Dynamic/DynamicExecutionWithFunc.ps1:7:5:7:32 | call to Create | +| Dynamic/DynamicExecutionWithFunc.ps1:7:20:7:26 | Create | Dynamic/DynamicExecutionWithFunc.ps1:7:5:7:32 | call to Create | +| Dynamic/DynamicExecutionWithFunc.ps1:7:27:7:31 | foo | Dynamic/DynamicExecutionWithFunc.ps1:7:5:7:32 | call to Create | +| Dynamic/DynamicExecutionWithFunc.ps1:8:5:8:36 | | Dynamic/DynamicExecutionWithFunc.ps1:2:5:10:30 | {...} | +| Dynamic/DynamicExecutionWithFunc.ps1:8:5:8:36 | | Dynamic/DynamicExecutionWithFunc.ps1:8:5:8:36 | | | Dynamic/DynamicExecutionWithFunc.ps1:8:7:8:36 | (...) | Dynamic/DynamicExecutionWithFunc.ps1:8:5:8:36 | | -| Dynamic/DynamicExecutionWithFunc.ps1:8:8:8:21 | scriptblock | Dynamic/DynamicExecutionWithFunc.ps1:8:8:8:35 | ArrayExpression at: Dynamic/DynamicExecutionWithFunc.ps1:8:8:8:35 | -| Dynamic/DynamicExecutionWithFunc.ps1:8:8:8:35 | ...\|... | Dynamic/DynamicExecutionWithFunc.ps1:8:7:8:36 | (...) | -| Dynamic/DynamicExecutionWithFunc.ps1:8:8:8:35 | ArrayExpression at: Dynamic/DynamicExecutionWithFunc.ps1:8:8:8:35 | Dynamic/DynamicExecutionWithFunc.ps1:8:8:8:35 | ...\|... | -| Dynamic/DynamicExecutionWithFunc.ps1:8:8:8:35 | ArrayExpression at: Dynamic/DynamicExecutionWithFunc.ps1:8:8:8:35 | Dynamic/DynamicExecutionWithFunc.ps1:8:8:8:35 | ArrayExpression at: Dynamic/DynamicExecutionWithFunc.ps1:8:8:8:35 | -| Dynamic/DynamicExecutionWithFunc.ps1:8:23:8:29 | Create | Dynamic/DynamicExecutionWithFunc.ps1:8:8:8:35 | ArrayExpression at: Dynamic/DynamicExecutionWithFunc.ps1:8:8:8:35 | -| Dynamic/DynamicExecutionWithFunc.ps1:8:30:8:34 | foo | Dynamic/DynamicExecutionWithFunc.ps1:8:8:8:35 | ArrayExpression at: Dynamic/DynamicExecutionWithFunc.ps1:8:8:8:35 | -| Dynamic/DynamicExecutionWithFunc.ps1:9:5:9:12 | | Dynamic/DynamicExecutionWithFunc.ps1:9:5:9:12 | ...\|... | -| Dynamic/DynamicExecutionWithFunc.ps1:9:5:9:12 | ...\|... | Dynamic/DynamicExecutionWithFunc.ps1:2:5:10:30 | {...} | -| Dynamic/DynamicExecutionWithFunc.ps1:9:6:9:12 | ExpandableStringExpression at: Dynamic/DynamicExecutionWithFunc.ps1:9:6:9:12 | Dynamic/DynamicExecutionWithFunc.ps1:9:5:9:12 | | -| Dynamic/DynamicExecutionWithFunc.ps1:9:7:9:11 | foo | Dynamic/DynamicExecutionWithFunc.ps1:9:6:9:12 | ExpandableStringExpression at: Dynamic/DynamicExecutionWithFunc.ps1:9:6:9:12 | -| Dynamic/DynamicExecutionWithFunc.ps1:10:5:10:30 | ...\|... | Dynamic/DynamicExecutionWithFunc.ps1:2:5:10:30 | {...} | -| Dynamic/DynamicExecutionWithFunc.ps1:10:5:10:30 | cmd.exe | Dynamic/DynamicExecutionWithFunc.ps1:10:5:10:30 | ...\|... | +| Dynamic/DynamicExecutionWithFunc.ps1:8:8:8:21 | scriptblock | Dynamic/DynamicExecutionWithFunc.ps1:8:8:8:35 | call to Create | +| Dynamic/DynamicExecutionWithFunc.ps1:8:8:8:35 | call to Create | Dynamic/DynamicExecutionWithFunc.ps1:8:7:8:36 | (...) | +| Dynamic/DynamicExecutionWithFunc.ps1:8:8:8:35 | call to Create | Dynamic/DynamicExecutionWithFunc.ps1:8:8:8:35 | call to Create | +| Dynamic/DynamicExecutionWithFunc.ps1:8:8:8:35 | call to Create | Dynamic/DynamicExecutionWithFunc.ps1:8:8:8:35 | call to Create | +| Dynamic/DynamicExecutionWithFunc.ps1:8:23:8:29 | Create | Dynamic/DynamicExecutionWithFunc.ps1:8:8:8:35 | call to Create | +| Dynamic/DynamicExecutionWithFunc.ps1:8:30:8:34 | foo | Dynamic/DynamicExecutionWithFunc.ps1:8:8:8:35 | call to Create | +| Dynamic/DynamicExecutionWithFunc.ps1:9:5:9:12 | | Dynamic/DynamicExecutionWithFunc.ps1:2:5:10:30 | {...} | +| Dynamic/DynamicExecutionWithFunc.ps1:9:5:9:12 | | Dynamic/DynamicExecutionWithFunc.ps1:9:5:9:12 | | +| Dynamic/DynamicExecutionWithFunc.ps1:9:6:9:12 | $foo | Dynamic/DynamicExecutionWithFunc.ps1:9:5:9:12 | | +| Dynamic/DynamicExecutionWithFunc.ps1:9:7:9:11 | foo | Dynamic/DynamicExecutionWithFunc.ps1:9:6:9:12 | $foo | +| Dynamic/DynamicExecutionWithFunc.ps1:10:5:10:30 | cmd.exe | Dynamic/DynamicExecutionWithFunc.ps1:2:5:10:30 | {...} | +| Dynamic/DynamicExecutionWithFunc.ps1:10:5:10:30 | cmd.exe | Dynamic/DynamicExecutionWithFunc.ps1:10:5:10:30 | cmd.exe | | Dynamic/DynamicExecutionWithFunc.ps1:10:7:10:16 | cmd.exe | Dynamic/DynamicExecutionWithFunc.ps1:10:5:10:30 | cmd.exe | -| Dynamic/DynamicExecutionWithFunc.ps1:10:17:10:30 | ArrayExpression at: Dynamic/DynamicExecutionWithFunc.ps1:10:17:10:30 | Dynamic/DynamicExecutionWithFunc.ps1:10:5:10:30 | cmd.exe | -| Dynamic/DynamicExecutionWithFunc.ps1:10:19:10:29 | ...\|... | Dynamic/DynamicExecutionWithFunc.ps1:10:19:10:29 | StatementBlock at: Dynamic/DynamicExecutionWithFunc.ps1:10:19:10:29 | -| Dynamic/DynamicExecutionWithFunc.ps1:10:19:10:29 | userInput | Dynamic/DynamicExecutionWithFunc.ps1:10:19:10:29 | ...\|... | +| Dynamic/DynamicExecutionWithFunc.ps1:10:17:10:30 | @(...) | Dynamic/DynamicExecutionWithFunc.ps1:10:5:10:30 | cmd.exe | | Dynamic/DynamicExecutionWithFunc.ps1:10:19:10:29 | userInput | Dynamic/DynamicExecutionWithFunc.ps1:10:19:10:29 | userInput | +| Dynamic/DynamicExecutionWithFunc.ps1:10:19:10:29 | userInput | Dynamic/DynamicExecutionWithFunc.ps1:10:19:10:29 | userInput | +| Dynamic/DynamicExecutionWithFunc.ps1:10:19:10:29 | userInput | Dynamic/DynamicExecutionWithFunc.ps1:10:19:10:29 | {...} | +| Dynamic/DynamicExecutionWithFunc.ps1:10:19:10:29 | {...} | Dynamic/DynamicExecutionWithFunc.ps1:10:17:10:30 | @(...) | | Expressions/BinaryExpression.ps1:1:1:1:6 | val1 | Expressions/BinaryExpression.ps1:1:1:1:10 | ...=... | | Expressions/BinaryExpression.ps1:1:1:1:10 | ...=... | Expressions/BinaryExpression.ps1:1:1:4:8 | {...} | | Expressions/BinaryExpression.ps1:1:1:4:8 | {...} | Expressions/BinaryExpression.ps1:1:1:4:8 | BinaryExpression.ps1 | @@ -174,249 +183,259 @@ | Expressions/BinaryExpression.ps1:3:11:3:24 | ...+... | Expressions/BinaryExpression.ps1:3:1:3:24 | ...=... | | Expressions/BinaryExpression.ps1:3:11:3:24 | ...+... | Expressions/BinaryExpression.ps1:3:11:3:24 | ...+... | | Expressions/BinaryExpression.ps1:3:19:3:24 | val2 | Expressions/BinaryExpression.ps1:3:11:3:24 | ...+... | -| Expressions/BinaryExpression.ps1:4:1:4:8 | ...\|... | Expressions/BinaryExpression.ps1:1:1:4:8 | {...} | -| Expressions/BinaryExpression.ps1:4:1:4:8 | result | Expressions/BinaryExpression.ps1:4:1:4:8 | ...\|... | +| Expressions/BinaryExpression.ps1:4:1:4:8 | result | Expressions/BinaryExpression.ps1:1:1:4:8 | {...} | +| Expressions/BinaryExpression.ps1:4:1:4:8 | result | Expressions/BinaryExpression.ps1:4:1:4:8 | result | | Expressions/BinaryExpression.ps1:4:1:4:8 | result | Expressions/BinaryExpression.ps1:4:1:4:8 | result | | Expressions/ConvertWithSecureString.ps1:1:1:1:11 | UserInput | Expressions/ConvertWithSecureString.ps1:1:1:1:55 | ...=... | | Expressions/ConvertWithSecureString.ps1:1:1:1:55 | ...=... | Expressions/ConvertWithSecureString.ps1:1:1:2:80 | {...} | | Expressions/ConvertWithSecureString.ps1:1:1:2:80 | {...} | Expressions/ConvertWithSecureString.ps1:1:1:2:80 | ConvertWithSecureString.ps1 | | Expressions/ConvertWithSecureString.ps1:1:14:1:23 | Read-Host | Expressions/ConvertWithSecureString.ps1:1:14:1:55 | Read-Host | -| Expressions/ConvertWithSecureString.ps1:1:14:1:55 | ...\|... | Expressions/ConvertWithSecureString.ps1:1:1:1:55 | ...=... | -| Expressions/ConvertWithSecureString.ps1:1:14:1:55 | Read-Host | Expressions/ConvertWithSecureString.ps1:1:14:1:55 | ...\|... | +| Expressions/ConvertWithSecureString.ps1:1:14:1:55 | Read-Host | Expressions/ConvertWithSecureString.ps1:1:1:1:55 | ...=... | +| Expressions/ConvertWithSecureString.ps1:1:14:1:55 | Read-Host | Expressions/ConvertWithSecureString.ps1:1:14:1:55 | Read-Host | | Expressions/ConvertWithSecureString.ps1:1:24:1:55 | Please enter your secure code | Expressions/ConvertWithSecureString.ps1:1:14:1:55 | Read-Host | | Expressions/ConvertWithSecureString.ps1:2:1:2:16 | EncryptedInput | Expressions/ConvertWithSecureString.ps1:2:1:2:80 | ...=... | | Expressions/ConvertWithSecureString.ps1:2:1:2:80 | ...=... | Expressions/ConvertWithSecureString.ps1:1:1:2:80 | {...} | | Expressions/ConvertWithSecureString.ps1:2:19:2:41 | ConvertTo-SecureString | Expressions/ConvertWithSecureString.ps1:2:19:2:80 | ConvertTo-SecureString | -| Expressions/ConvertWithSecureString.ps1:2:19:2:80 | ...\|... | Expressions/ConvertWithSecureString.ps1:2:1:2:80 | ...=... | -| Expressions/ConvertWithSecureString.ps1:2:19:2:80 | ConvertTo-SecureString | Expressions/ConvertWithSecureString.ps1:2:19:2:80 | ...\|... | +| Expressions/ConvertWithSecureString.ps1:2:19:2:80 | ConvertTo-SecureString | Expressions/ConvertWithSecureString.ps1:2:1:2:80 | ...=... | +| Expressions/ConvertWithSecureString.ps1:2:19:2:80 | ConvertTo-SecureString | Expressions/ConvertWithSecureString.ps1:2:19:2:80 | ConvertTo-SecureString | | Expressions/ConvertWithSecureString.ps1:2:42:2:49 | String | Expressions/ConvertWithSecureString.ps1:2:19:2:80 | ConvertTo-SecureString | | Expressions/ConvertWithSecureString.ps1:2:50:2:60 | UserInput | Expressions/ConvertWithSecureString.ps1:2:19:2:80 | ConvertTo-SecureString | | Expressions/ConvertWithSecureString.ps1:2:61:2:73 | AsPlainText | Expressions/ConvertWithSecureString.ps1:2:19:2:80 | ConvertTo-SecureString | | Expressions/ConvertWithSecureString.ps1:2:74:2:80 | Force | Expressions/ConvertWithSecureString.ps1:2:19:2:80 | ConvertTo-SecureString | -| Expressions/ExpandableString.ps1:1:1:1:40 | ...\|... | Expressions/ExpandableString.ps1:1:1:1:40 | {...} | -| Expressions/ExpandableString.ps1:1:1:1:40 | ExpandableStringExpression at: Expressions/ExpandableString.ps1:1:1:1:40 | Expressions/ExpandableString.ps1:1:1:1:40 | ...\|... | -| Expressions/ExpandableString.ps1:1:1:1:40 | ExpandableStringExpression at: Expressions/ExpandableString.ps1:1:1:1:40 | Expressions/ExpandableString.ps1:1:1:1:40 | ExpandableStringExpression at: Expressions/ExpandableString.ps1:1:1:1:40 | +| Expressions/ExpandableString.ps1:1:1:1:40 | Date: $([DateTime]::Now)\nName: $name | Expressions/ExpandableString.ps1:1:1:1:40 | Date: $([DateTime]::Now)\nName: $name | +| Expressions/ExpandableString.ps1:1:1:1:40 | Date: $([DateTime]::Now)\nName: $name | Expressions/ExpandableString.ps1:1:1:1:40 | Date: $([DateTime]::Now)\nName: $name | +| Expressions/ExpandableString.ps1:1:1:1:40 | Date: $([DateTime]::Now)\nName: $name | Expressions/ExpandableString.ps1:1:1:1:40 | {...} | | Expressions/ExpandableString.ps1:1:1:1:40 | {...} | Expressions/ExpandableString.ps1:1:1:1:40 | ExpandableString.ps1 | -| Expressions/ExpandableString.ps1:1:8:1:13 | name | Expressions/ExpandableString.ps1:1:1:1:40 | ExpandableStringExpression at: Expressions/ExpandableString.ps1:1:1:1:40 | -| Expressions/ExpandableString.ps1:1:23:1:33 | DateTime | file://:0:0:0:0 | (no string representation) | -| Expressions/ExpandableString.ps1:1:23:1:38 | (no string representation) | Expressions/ExpandableString.ps1:1:23:1:38 | ...\|... | -| Expressions/ExpandableString.ps1:1:23:1:38 | ...\|... | Expressions/ExpandableString.ps1:1:23:1:38 | StatementBlock at: Expressions/ExpandableString.ps1:1:23:1:38 | -| Expressions/ExpandableString.ps1:1:35:1:38 | Now | file://:0:0:0:0 | (no string representation) | -| Expressions/SubExpression.ps1:1:1:1:24 | ...\|... | Expressions/SubExpression.ps1:1:1:2:22 | {...} | -| Expressions/SubExpression.ps1:1:1:1:24 | ArrayExpression at: Expressions/SubExpression.ps1:1:1:1:24 | Expressions/SubExpression.ps1:1:1:1:24 | ...\|... | -| Expressions/SubExpression.ps1:1:1:1:24 | ArrayExpression at: Expressions/SubExpression.ps1:1:1:1:24 | Expressions/SubExpression.ps1:1:1:1:24 | ArrayExpression at: Expressions/SubExpression.ps1:1:1:1:24 | +| Expressions/ExpandableString.ps1:1:8:1:13 | name | Expressions/ExpandableString.ps1:1:1:1:40 | Date: $([DateTime]::Now)\nName: $name | +| Expressions/ExpandableString.ps1:1:21:1:39 | $(...) | Expressions/ExpandableString.ps1:1:1:1:40 | Date: $([DateTime]::Now)\nName: $name | +| Expressions/ExpandableString.ps1:1:23:1:33 | DateTime | Expressions/ExpandableString.ps1:1:23:1:38 | Now | +| Expressions/ExpandableString.ps1:1:23:1:38 | Now | Expressions/ExpandableString.ps1:1:23:1:38 | Now | +| Expressions/ExpandableString.ps1:1:23:1:38 | Now | Expressions/ExpandableString.ps1:1:23:1:38 | Now | +| Expressions/ExpandableString.ps1:1:23:1:38 | Now | Expressions/ExpandableString.ps1:1:23:1:38 | {...} | +| Expressions/ExpandableString.ps1:1:23:1:38 | {...} | Expressions/ExpandableString.ps1:1:21:1:39 | $(...) | +| Expressions/ExpandableString.ps1:1:35:1:38 | Now | Expressions/ExpandableString.ps1:1:23:1:38 | Now | +| Expressions/SubExpression.ps1:1:1:1:12 | $(...) | Expressions/SubExpression.ps1:1:1:1:24 | call to AddDays | +| Expressions/SubExpression.ps1:1:1:1:24 | call to AddDays | Expressions/SubExpression.ps1:1:1:1:24 | call to AddDays | +| Expressions/SubExpression.ps1:1:1:1:24 | call to AddDays | Expressions/SubExpression.ps1:1:1:1:24 | call to AddDays | +| Expressions/SubExpression.ps1:1:1:1:24 | call to AddDays | Expressions/SubExpression.ps1:1:1:2:22 | {...} | | Expressions/SubExpression.ps1:1:1:2:22 | {...} | Expressions/SubExpression.ps1:1:1:2:22 | SubExpression.ps1 | -| Expressions/SubExpression.ps1:1:3:1:11 | ...\|... | Expressions/SubExpression.ps1:1:3:1:11 | StatementBlock at: Expressions/SubExpression.ps1:1:3:1:11 | -| Expressions/SubExpression.ps1:1:3:1:11 | Get-Date | Expressions/SubExpression.ps1:1:3:1:11 | ...\|... | | Expressions/SubExpression.ps1:1:3:1:11 | Get-Date | Expressions/SubExpression.ps1:1:3:1:11 | Get-Date | -| Expressions/SubExpression.ps1:1:13:1:20 | AddDays | Expressions/SubExpression.ps1:1:1:1:24 | ArrayExpression at: Expressions/SubExpression.ps1:1:1:1:24 | -| Expressions/SubExpression.ps1:1:21:1:23 | 10 | Expressions/SubExpression.ps1:1:1:1:24 | ArrayExpression at: Expressions/SubExpression.ps1:1:1:1:24 | -| Expressions/SubExpression.ps1:2:1:2:22 | ...\|... | Expressions/SubExpression.ps1:1:1:2:22 | {...} | -| Expressions/SubExpression.ps1:2:1:2:22 | ArrayExpression at: Expressions/SubExpression.ps1:2:1:2:22 | Expressions/SubExpression.ps1:2:1:2:22 | ...\|... | -| Expressions/SubExpression.ps1:2:1:2:22 | ArrayExpression at: Expressions/SubExpression.ps1:2:1:2:22 | Expressions/SubExpression.ps1:2:1:2:22 | ArrayExpression at: Expressions/SubExpression.ps1:2:1:2:22 | -| Expressions/SubExpression.ps1:2:3:2:11 | ...\|... | Expressions/SubExpression.ps1:2:3:2:11 | StatementBlock at: Expressions/SubExpression.ps1:2:3:2:11 | -| Expressions/SubExpression.ps1:2:3:2:11 | Get-Date | Expressions/SubExpression.ps1:2:3:2:11 | ...\|... | +| Expressions/SubExpression.ps1:1:3:1:11 | Get-Date | Expressions/SubExpression.ps1:1:3:1:11 | Get-Date | +| Expressions/SubExpression.ps1:1:3:1:11 | Get-Date | Expressions/SubExpression.ps1:1:3:1:11 | {...} | +| Expressions/SubExpression.ps1:1:3:1:11 | {...} | Expressions/SubExpression.ps1:1:1:1:12 | $(...) | +| Expressions/SubExpression.ps1:1:13:1:20 | AddDays | Expressions/SubExpression.ps1:1:1:1:24 | call to AddDays | +| Expressions/SubExpression.ps1:1:21:1:23 | 10 | Expressions/SubExpression.ps1:1:1:1:24 | call to AddDays | +| Expressions/SubExpression.ps1:2:1:2:12 | $(...) | Expressions/SubExpression.ps1:2:1:2:22 | call to AddDays | +| Expressions/SubExpression.ps1:2:1:2:22 | call to AddDays | Expressions/SubExpression.ps1:1:1:2:22 | {...} | +| Expressions/SubExpression.ps1:2:1:2:22 | call to AddDays | Expressions/SubExpression.ps1:2:1:2:22 | call to AddDays | +| Expressions/SubExpression.ps1:2:1:2:22 | call to AddDays | Expressions/SubExpression.ps1:2:1:2:22 | call to AddDays | +| Expressions/SubExpression.ps1:2:3:2:11 | Get-Date | Expressions/SubExpression.ps1:2:3:2:11 | Get-Date | | Expressions/SubExpression.ps1:2:3:2:11 | Get-Date | Expressions/SubExpression.ps1:2:3:2:11 | Get-Date | -| Expressions/SubExpression.ps1:2:13:2:20 | AddDays | Expressions/SubExpression.ps1:2:1:2:22 | ArrayExpression at: Expressions/SubExpression.ps1:2:1:2:22 | +| Expressions/SubExpression.ps1:2:3:2:11 | Get-Date | Expressions/SubExpression.ps1:2:3:2:11 | {...} | +| Expressions/SubExpression.ps1:2:3:2:11 | {...} | Expressions/SubExpression.ps1:2:1:2:12 | $(...) | +| Expressions/SubExpression.ps1:2:13:2:20 | AddDays | Expressions/SubExpression.ps1:2:1:2:22 | call to AddDays | | Expressions/TernaryExpression.ps1:1:1:1:5 | var | Expressions/TernaryExpression.ps1:1:1:1:23 | ...=... | | Expressions/TernaryExpression.ps1:1:1:1:23 | ...=... | Expressions/TernaryExpression.ps1:1:1:1:23 | {...} | | Expressions/TernaryExpression.ps1:1:1:1:23 | {...} | Expressions/TernaryExpression.ps1:1:1:1:23 | TernaryExpression.ps1 | | Expressions/TernaryExpression.ps1:1:8:1:17 | (...) | Expressions/TernaryExpression.ps1:1:8:1:23 | ...?...:... | | Expressions/TernaryExpression.ps1:1:8:1:23 | ...?...:... | Expressions/TernaryExpression.ps1:1:1:1:23 | ...=... | | Expressions/TernaryExpression.ps1:1:8:1:23 | ...?...:... | Expressions/TernaryExpression.ps1:1:8:1:23 | ...?...:... | -| Expressions/TernaryExpression.ps1:1:9:1:10 | 6 | Expressions/TernaryExpression.ps1:1:9:1:16 | ...+... | -| Expressions/TernaryExpression.ps1:1:9:1:16 | ...+... | Expressions/TernaryExpression.ps1:1:9:1:16 | ...+... | -| Expressions/TernaryExpression.ps1:1:9:1:16 | ...+... | Expressions/TernaryExpression.ps1:1:9:1:16 | ...\|... | -| Expressions/TernaryExpression.ps1:1:9:1:16 | ...\|... | Expressions/TernaryExpression.ps1:1:8:1:17 | (...) | -| Expressions/TernaryExpression.ps1:1:15:1:16 | 7 | Expressions/TernaryExpression.ps1:1:9:1:16 | ...+... | +| Expressions/TernaryExpression.ps1:1:9:1:10 | 6 | Expressions/TernaryExpression.ps1:1:9:1:16 | ... -gt ... | +| Expressions/TernaryExpression.ps1:1:9:1:16 | ... -gt ... | Expressions/TernaryExpression.ps1:1:8:1:17 | (...) | +| Expressions/TernaryExpression.ps1:1:9:1:16 | ... -gt ... | Expressions/TernaryExpression.ps1:1:9:1:16 | ... -gt ... | +| Expressions/TernaryExpression.ps1:1:9:1:16 | ... -gt ... | Expressions/TernaryExpression.ps1:1:9:1:16 | ... -gt ... | +| Expressions/TernaryExpression.ps1:1:15:1:16 | 7 | Expressions/TernaryExpression.ps1:1:9:1:16 | ... -gt ... | | Expressions/TernaryExpression.ps1:1:20:1:21 | 1 | Expressions/TernaryExpression.ps1:1:8:1:23 | ...?...:... | | Expressions/TernaryExpression.ps1:1:22:1:23 | 2 | Expressions/TernaryExpression.ps1:1:8:1:23 | ...?...:... | | Loops/DoUntil.ps1:1:1:7:19 | DoUntil | Loops/DoUntil.ps1:1:1:7:19 | {...} | | Loops/DoUntil.ps1:1:1:7:19 | {...} | Loops/DoUntil.ps1:1:1:7:19 | DoUntil.ps1 | -| Loops/DoUntil.ps1:3:2:3:20 | ...\|... | Loops/DoUntil.ps1:2:1:7:2 | StatementBlock at: Loops/DoUntil.ps1:2:1:7:2 | -| Loops/DoUntil.ps1:3:2:3:20 | ExpandableStringExpression at: Loops/DoUntil.ps1:3:2:3:20 | Loops/DoUntil.ps1:3:2:3:20 | ...\|... | -| Loops/DoUntil.ps1:3:2:3:20 | ExpandableStringExpression at: Loops/DoUntil.ps1:3:2:3:20 | Loops/DoUntil.ps1:3:2:3:20 | ExpandableStringExpression at: Loops/DoUntil.ps1:3:2:3:20 | -| Loops/DoUntil.ps1:3:17:3:19 | a | Loops/DoUntil.ps1:3:2:3:20 | ExpandableStringExpression at: Loops/DoUntil.ps1:3:2:3:20 | -| Loops/DoUntil.ps1:4:2:4:4 | ...\|... | Loops/DoUntil.ps1:2:1:7:2 | StatementBlock at: Loops/DoUntil.ps1:2:1:7:2 | -| Loops/DoUntil.ps1:4:2:4:4 | a | Loops/DoUntil.ps1:4:2:4:4 | ...\|... | +| Loops/DoUntil.ps1:2:1:7:2 | {...} | Loops/DoUntil.ps1:1:1:7:19 | DoUntil | +| Loops/DoUntil.ps1:3:2:3:20 | Starting Loop $a | Loops/DoUntil.ps1:2:1:7:2 | {...} | +| Loops/DoUntil.ps1:3:2:3:20 | Starting Loop $a | Loops/DoUntil.ps1:3:2:3:20 | Starting Loop $a | +| Loops/DoUntil.ps1:3:2:3:20 | Starting Loop $a | Loops/DoUntil.ps1:3:2:3:20 | Starting Loop $a | +| Loops/DoUntil.ps1:3:17:3:19 | a | Loops/DoUntil.ps1:3:2:3:20 | Starting Loop $a | +| Loops/DoUntil.ps1:4:2:4:4 | a | Loops/DoUntil.ps1:2:1:7:2 | {...} | | Loops/DoUntil.ps1:4:2:4:4 | a | Loops/DoUntil.ps1:4:2:4:4 | a | -| Loops/DoUntil.ps1:5:2:5:4 | a | file://:0:0:0:0 | (no string representation) | -| Loops/DoUntil.ps1:5:2:5:6 | (no string representation) | Loops/DoUntil.ps1:5:2:5:6 | ...\|... | -| Loops/DoUntil.ps1:5:2:5:6 | ...\|... | Loops/DoUntil.ps1:2:1:7:2 | StatementBlock at: Loops/DoUntil.ps1:2:1:7:2 | -| Loops/DoUntil.ps1:6:2:6:17 | ...\|... | Loops/DoUntil.ps1:2:1:7:2 | StatementBlock at: Loops/DoUntil.ps1:2:1:7:2 | -| Loops/DoUntil.ps1:6:2:6:17 | ExpandableStringExpression at: Loops/DoUntil.ps1:6:2:6:17 | Loops/DoUntil.ps1:6:2:6:17 | ...\|... | -| Loops/DoUntil.ps1:6:2:6:17 | ExpandableStringExpression at: Loops/DoUntil.ps1:6:2:6:17 | Loops/DoUntil.ps1:6:2:6:17 | ExpandableStringExpression at: Loops/DoUntil.ps1:6:2:6:17 | -| Loops/DoUntil.ps1:6:14:6:16 | a | Loops/DoUntil.ps1:6:2:6:17 | ExpandableStringExpression at: Loops/DoUntil.ps1:6:2:6:17 | -| Loops/DoUntil.ps1:7:10:7:12 | a | Loops/DoUntil.ps1:7:10:7:18 | ...+... | -| Loops/DoUntil.ps1:7:10:7:18 | ...+... | Loops/DoUntil.ps1:7:10:7:18 | ...+... | -| Loops/DoUntil.ps1:7:10:7:18 | ...+... | Loops/DoUntil.ps1:7:10:7:18 | ...\|... | -| Loops/DoUntil.ps1:7:10:7:18 | ...\|... | Loops/DoUntil.ps1:1:1:7:19 | DoUntil | -| Loops/DoUntil.ps1:7:17:7:18 | 5 | Loops/DoUntil.ps1:7:10:7:18 | ...+... | +| Loops/DoUntil.ps1:4:2:4:4 | a | Loops/DoUntil.ps1:4:2:4:4 | a | +| Loops/DoUntil.ps1:5:2:5:4 | a | Loops/DoUntil.ps1:5:2:5:6 | ...++ | +| Loops/DoUntil.ps1:5:2:5:6 | ...++ | Loops/DoUntil.ps1:2:1:7:2 | {...} | +| Loops/DoUntil.ps1:5:2:5:6 | ...++ | Loops/DoUntil.ps1:5:2:5:6 | ...++ | +| Loops/DoUntil.ps1:5:2:5:6 | ...++ | Loops/DoUntil.ps1:5:2:5:6 | ...++ | +| Loops/DoUntil.ps1:6:2:6:17 | Now $a is $a | Loops/DoUntil.ps1:2:1:7:2 | {...} | +| Loops/DoUntil.ps1:6:2:6:17 | Now $a is $a | Loops/DoUntil.ps1:6:2:6:17 | Now $a is $a | +| Loops/DoUntil.ps1:6:2:6:17 | Now $a is $a | Loops/DoUntil.ps1:6:2:6:17 | Now $a is $a | +| Loops/DoUntil.ps1:6:14:6:16 | a | Loops/DoUntil.ps1:6:2:6:17 | Now $a is $a | +| Loops/DoUntil.ps1:7:10:7:12 | a | Loops/DoUntil.ps1:7:10:7:18 | ... -le ... | +| Loops/DoUntil.ps1:7:10:7:18 | ... -le ... | Loops/DoUntil.ps1:1:1:7:19 | DoUntil | +| Loops/DoUntil.ps1:7:10:7:18 | ... -le ... | Loops/DoUntil.ps1:7:10:7:18 | ... -le ... | +| Loops/DoUntil.ps1:7:10:7:18 | ... -le ... | Loops/DoUntil.ps1:7:10:7:18 | ... -le ... | +| Loops/DoUntil.ps1:7:17:7:18 | 5 | Loops/DoUntil.ps1:7:10:7:18 | ... -le ... | | Loops/DoWhile.ps1:1:1:7:19 | DoWhile | Loops/DoWhile.ps1:1:1:7:19 | {...} | | Loops/DoWhile.ps1:1:1:7:19 | {...} | Loops/DoWhile.ps1:1:1:7:19 | DoWhile.ps1 | -| Loops/DoWhile.ps1:3:2:3:20 | ...\|... | Loops/DoWhile.ps1:2:1:7:2 | StatementBlock at: Loops/DoWhile.ps1:2:1:7:2 | -| Loops/DoWhile.ps1:3:2:3:20 | ExpandableStringExpression at: Loops/DoWhile.ps1:3:2:3:20 | Loops/DoWhile.ps1:3:2:3:20 | ...\|... | -| Loops/DoWhile.ps1:3:2:3:20 | ExpandableStringExpression at: Loops/DoWhile.ps1:3:2:3:20 | Loops/DoWhile.ps1:3:2:3:20 | ExpandableStringExpression at: Loops/DoWhile.ps1:3:2:3:20 | -| Loops/DoWhile.ps1:3:17:3:19 | a | Loops/DoWhile.ps1:3:2:3:20 | ExpandableStringExpression at: Loops/DoWhile.ps1:3:2:3:20 | -| Loops/DoWhile.ps1:4:2:4:4 | ...\|... | Loops/DoWhile.ps1:2:1:7:2 | StatementBlock at: Loops/DoWhile.ps1:2:1:7:2 | -| Loops/DoWhile.ps1:4:2:4:4 | a | Loops/DoWhile.ps1:4:2:4:4 | ...\|... | +| Loops/DoWhile.ps1:2:1:7:2 | {...} | Loops/DoWhile.ps1:1:1:7:19 | DoWhile | +| Loops/DoWhile.ps1:3:2:3:20 | Starting Loop $a | Loops/DoWhile.ps1:2:1:7:2 | {...} | +| Loops/DoWhile.ps1:3:2:3:20 | Starting Loop $a | Loops/DoWhile.ps1:3:2:3:20 | Starting Loop $a | +| Loops/DoWhile.ps1:3:2:3:20 | Starting Loop $a | Loops/DoWhile.ps1:3:2:3:20 | Starting Loop $a | +| Loops/DoWhile.ps1:3:17:3:19 | a | Loops/DoWhile.ps1:3:2:3:20 | Starting Loop $a | +| Loops/DoWhile.ps1:4:2:4:4 | a | Loops/DoWhile.ps1:2:1:7:2 | {...} | +| Loops/DoWhile.ps1:4:2:4:4 | a | Loops/DoWhile.ps1:4:2:4:4 | a | | Loops/DoWhile.ps1:4:2:4:4 | a | Loops/DoWhile.ps1:4:2:4:4 | a | -| Loops/DoWhile.ps1:5:2:5:4 | a | file://:0:0:0:0 | (no string representation) | -| Loops/DoWhile.ps1:5:2:5:6 | (no string representation) | Loops/DoWhile.ps1:5:2:5:6 | ...\|... | -| Loops/DoWhile.ps1:5:2:5:6 | ...\|... | Loops/DoWhile.ps1:2:1:7:2 | StatementBlock at: Loops/DoWhile.ps1:2:1:7:2 | -| Loops/DoWhile.ps1:6:2:6:17 | ...\|... | Loops/DoWhile.ps1:2:1:7:2 | StatementBlock at: Loops/DoWhile.ps1:2:1:7:2 | -| Loops/DoWhile.ps1:6:2:6:17 | ExpandableStringExpression at: Loops/DoWhile.ps1:6:2:6:17 | Loops/DoWhile.ps1:6:2:6:17 | ...\|... | -| Loops/DoWhile.ps1:6:2:6:17 | ExpandableStringExpression at: Loops/DoWhile.ps1:6:2:6:17 | Loops/DoWhile.ps1:6:2:6:17 | ExpandableStringExpression at: Loops/DoWhile.ps1:6:2:6:17 | -| Loops/DoWhile.ps1:6:14:6:16 | a | Loops/DoWhile.ps1:6:2:6:17 | ExpandableStringExpression at: Loops/DoWhile.ps1:6:2:6:17 | -| Loops/DoWhile.ps1:7:10:7:12 | a | Loops/DoWhile.ps1:7:10:7:18 | ...+... | -| Loops/DoWhile.ps1:7:10:7:18 | ...+... | Loops/DoWhile.ps1:7:10:7:18 | ...+... | -| Loops/DoWhile.ps1:7:10:7:18 | ...+... | Loops/DoWhile.ps1:7:10:7:18 | ...\|... | -| Loops/DoWhile.ps1:7:10:7:18 | ...\|... | Loops/DoWhile.ps1:1:1:7:19 | DoWhile | -| Loops/DoWhile.ps1:7:17:7:18 | 5 | Loops/DoWhile.ps1:7:10:7:18 | ...+... | +| Loops/DoWhile.ps1:5:2:5:4 | a | Loops/DoWhile.ps1:5:2:5:6 | ...++ | +| Loops/DoWhile.ps1:5:2:5:6 | ...++ | Loops/DoWhile.ps1:2:1:7:2 | {...} | +| Loops/DoWhile.ps1:5:2:5:6 | ...++ | Loops/DoWhile.ps1:5:2:5:6 | ...++ | +| Loops/DoWhile.ps1:5:2:5:6 | ...++ | Loops/DoWhile.ps1:5:2:5:6 | ...++ | +| Loops/DoWhile.ps1:6:2:6:17 | Now $a is $a | Loops/DoWhile.ps1:2:1:7:2 | {...} | +| Loops/DoWhile.ps1:6:2:6:17 | Now $a is $a | Loops/DoWhile.ps1:6:2:6:17 | Now $a is $a | +| Loops/DoWhile.ps1:6:2:6:17 | Now $a is $a | Loops/DoWhile.ps1:6:2:6:17 | Now $a is $a | +| Loops/DoWhile.ps1:6:14:6:16 | a | Loops/DoWhile.ps1:6:2:6:17 | Now $a is $a | +| Loops/DoWhile.ps1:7:10:7:12 | a | Loops/DoWhile.ps1:7:10:7:18 | ... -le ... | +| Loops/DoWhile.ps1:7:10:7:18 | ... -le ... | Loops/DoWhile.ps1:1:1:7:19 | DoWhile | +| Loops/DoWhile.ps1:7:10:7:18 | ... -le ... | Loops/DoWhile.ps1:7:10:7:18 | ... -le ... | +| Loops/DoWhile.ps1:7:10:7:18 | ... -le ... | Loops/DoWhile.ps1:7:10:7:18 | ... -le ... | +| Loops/DoWhile.ps1:7:17:7:18 | 5 | Loops/DoWhile.ps1:7:10:7:18 | ... -le ... | | Loops/While.ps1:1:1:1:5 | var | Loops/While.ps1:1:1:1:9 | ...=... | | Loops/While.ps1:1:1:1:9 | ...=... | Loops/While.ps1:1:1:13:2 | {...} | | Loops/While.ps1:1:1:13:2 | {...} | Loops/While.ps1:1:1:13:2 | While.ps1 | | Loops/While.ps1:1:8:1:9 | 1 | Loops/While.ps1:1:1:1:9 | ...=... | | Loops/While.ps1:1:8:1:9 | 1 | Loops/While.ps1:1:8:1:9 | 1 | | Loops/While.ps1:2:1:13:2 | while(...) {...} | Loops/While.ps1:1:1:13:2 | {...} | -| Loops/While.ps1:2:8:2:12 | var | Loops/While.ps1:2:8:2:18 | ...+... | -| Loops/While.ps1:2:8:2:18 | ...+... | Loops/While.ps1:2:8:2:18 | ...+... | -| Loops/While.ps1:2:8:2:18 | ...+... | Loops/While.ps1:2:8:2:18 | ...\|... | -| Loops/While.ps1:2:8:2:18 | ...\|... | Loops/While.ps1:2:1:13:2 | while(...) {...} | -| Loops/While.ps1:2:17:2:18 | 5 | Loops/While.ps1:2:8:2:18 | ...+... | +| Loops/While.ps1:2:8:2:12 | var | Loops/While.ps1:2:8:2:18 | ... -le ... | +| Loops/While.ps1:2:8:2:18 | ... -le ... | Loops/While.ps1:2:1:13:2 | while(...) {...} | +| Loops/While.ps1:2:8:2:18 | ... -le ... | Loops/While.ps1:2:8:2:18 | ... -le ... | +| Loops/While.ps1:2:8:2:18 | ... -le ... | Loops/While.ps1:2:8:2:18 | ... -le ... | +| Loops/While.ps1:2:17:2:18 | 5 | Loops/While.ps1:2:8:2:18 | ... -le ... | +| Loops/While.ps1:3:1:13:2 | {...} | Loops/While.ps1:2:1:13:2 | while(...) {...} | | Loops/While.ps1:4:5:4:15 | Write-Host | Loops/While.ps1:4:5:4:41 | Write-Host | -| Loops/While.ps1:4:5:4:41 | ...\|... | Loops/While.ps1:3:1:13:2 | StatementBlock at: Loops/While.ps1:3:1:13:2 | -| Loops/While.ps1:4:5:4:41 | Write-Host | Loops/While.ps1:4:5:4:41 | ...\|... | +| Loops/While.ps1:4:5:4:41 | Write-Host | Loops/While.ps1:3:1:13:2 | {...} | +| Loops/While.ps1:4:5:4:41 | Write-Host | Loops/While.ps1:4:5:4:41 | Write-Host | | Loops/While.ps1:4:16:4:19 | The | Loops/While.ps1:4:5:4:41 | Write-Host | | Loops/While.ps1:4:20:4:25 | value | Loops/While.ps1:4:5:4:41 | Write-Host | | Loops/While.ps1:4:26:4:28 | of | Loops/While.ps1:4:5:4:41 | Write-Host | | Loops/While.ps1:4:29:4:32 | Var | Loops/While.ps1:4:5:4:41 | Write-Host | | Loops/While.ps1:4:33:4:36 | is: | Loops/While.ps1:4:5:4:41 | Write-Host | | Loops/While.ps1:4:37:4:41 | var | Loops/While.ps1:4:5:4:41 | Write-Host | -| Loops/While.ps1:5:5:5:9 | var | file://:0:0:0:0 | (no string representation) | -| Loops/While.ps1:5:5:5:11 | (no string representation) | Loops/While.ps1:5:5:5:11 | ...\|... | -| Loops/While.ps1:5:5:5:11 | ...\|... | Loops/While.ps1:3:1:13:2 | StatementBlock at: Loops/While.ps1:3:1:13:2 | -| Loops/While.ps1:6:5:12:6 | if (...) {...} else {...} | Loops/While.ps1:3:1:13:2 | StatementBlock at: Loops/While.ps1:3:1:13:2 | -| Loops/While.ps1:6:9:6:13 | var | Loops/While.ps1:6:9:6:19 | ...+... | -| Loops/While.ps1:6:9:6:19 | ...+... | Loops/While.ps1:6:9:6:19 | ...+... | -| Loops/While.ps1:6:9:6:19 | ...+... | Loops/While.ps1:6:9:6:19 | ...\|... | -| Loops/While.ps1:6:9:6:19 | ...\|... | Loops/While.ps1:6:5:12:6 | if (...) {...} else {...} | -| Loops/While.ps1:6:18:6:19 | 3 | Loops/While.ps1:6:9:6:19 | ...+... | -| Loops/While.ps1:7:9:7:17 | continue | Loops/While.ps1:6:20:8:6 | StatementBlock at: Loops/While.ps1:6:20:8:6 | -| Loops/While.ps1:11:9:11:14 | continue | Loops/While.ps1:10:5:12:6 | StatementBlock at: Loops/While.ps1:10:5:12:6 | -| Redirections/FileRedirection.ps1:1:1:3:20 | (no string representation) | Redirections/FileRedirection.ps1:1:1:3:20 | ...\|... | -| Redirections/FileRedirection.ps1:1:1:3:20 | ...\|... | Redirections/FileRedirection.ps1:1:1:3:20 | {...} | +| Loops/While.ps1:5:5:5:9 | var | Loops/While.ps1:5:5:5:11 | ...++ | +| Loops/While.ps1:5:5:5:11 | ...++ | Loops/While.ps1:3:1:13:2 | {...} | +| Loops/While.ps1:5:5:5:11 | ...++ | Loops/While.ps1:5:5:5:11 | ...++ | +| Loops/While.ps1:5:5:5:11 | ...++ | Loops/While.ps1:5:5:5:11 | ...++ | +| Loops/While.ps1:6:5:12:6 | if (...) {...} else {...} | Loops/While.ps1:3:1:13:2 | {...} | +| Loops/While.ps1:6:9:6:13 | var | Loops/While.ps1:6:9:6:19 | ... -le ... | +| Loops/While.ps1:6:9:6:19 | ... -le ... | Loops/While.ps1:6:5:12:6 | if (...) {...} else {...} | +| Loops/While.ps1:6:9:6:19 | ... -le ... | Loops/While.ps1:6:9:6:19 | ... -le ... | +| Loops/While.ps1:6:9:6:19 | ... -le ... | Loops/While.ps1:6:9:6:19 | ... -le ... | +| Loops/While.ps1:6:18:6:19 | 3 | Loops/While.ps1:6:9:6:19 | ... -le ... | +| Loops/While.ps1:6:20:8:6 | {...} | Loops/While.ps1:6:5:12:6 | if (...) {...} else {...} | +| Loops/While.ps1:7:9:7:17 | continue | Loops/While.ps1:6:20:8:6 | {...} | +| Loops/While.ps1:10:5:12:6 | {...} | Loops/While.ps1:6:5:12:6 | if (...) {...} else {...} | +| Loops/While.ps1:11:9:11:14 | break | Loops/While.ps1:10:5:12:6 | {...} | +| Redirections/FileRedirection.ps1:1:1:3:2 | $(...) | Redirections/FileRedirection.ps1:1:1:3:20 | $(...) | +| Redirections/FileRedirection.ps1:1:1:3:20 | $(...) | Redirections/FileRedirection.ps1:1:1:3:20 | $(...) | +| Redirections/FileRedirection.ps1:1:1:3:20 | $(...) | Redirections/FileRedirection.ps1:1:1:3:20 | {...} | | Redirections/FileRedirection.ps1:1:1:3:20 | {...} | Redirections/FileRedirection.ps1:1:1:3:20 | FileRedirection.ps1 | | Redirections/FileRedirection.ps1:2:5:2:9 | Here | Redirections/FileRedirection.ps1:2:5:2:32 | Here | -| Redirections/FileRedirection.ps1:2:5:2:32 | ...\|... | Redirections/FileRedirection.ps1:2:5:2:32 | StatementBlock at: Redirections/FileRedirection.ps1:2:5:2:32 | -| Redirections/FileRedirection.ps1:2:5:2:32 | Here | Redirections/FileRedirection.ps1:2:5:2:32 | ...\|... | +| Redirections/FileRedirection.ps1:2:5:2:32 | Here | Redirections/FileRedirection.ps1:2:5:2:32 | Here | +| Redirections/FileRedirection.ps1:2:5:2:32 | Here | Redirections/FileRedirection.ps1:2:5:2:32 | {...} | +| Redirections/FileRedirection.ps1:2:5:2:32 | {...} | Redirections/FileRedirection.ps1:1:1:3:2 | $(...) | | Redirections/FileRedirection.ps1:2:10:2:12 | is | Redirections/FileRedirection.ps1:2:5:2:32 | Here | | Redirections/FileRedirection.ps1:2:13:2:17 | your | Redirections/FileRedirection.ps1:2:5:2:32 | Here | | Redirections/FileRedirection.ps1:2:18:2:25 | current | Redirections/FileRedirection.ps1:2:5:2:32 | Here | | Redirections/FileRedirection.ps1:2:26:2:32 | script | Redirections/FileRedirection.ps1:2:5:2:32 | Here | -| Redirections/FileRedirection.ps1:3:3:3:7 | MergingRedirection | Redirections/FileRedirection.ps1:1:1:3:20 | (no string representation) | -| Redirections/FileRedirection.ps1:3:8:3:20 | FileRedirection | Redirections/FileRedirection.ps1:1:1:3:20 | (no string representation) | +| Redirections/FileRedirection.ps1:3:3:3:7 | MergingRedirection | Redirections/FileRedirection.ps1:1:1:3:20 | $(...) | +| Redirections/FileRedirection.ps1:3:8:3:20 | FileRedirection | Redirections/FileRedirection.ps1:1:1:3:20 | $(...) | | Redirections/FileRedirection.ps1:3:10:3:20 | output.txt | Redirections/FileRedirection.ps1:3:8:3:20 | FileRedirection | | Statements/ExitStatement.ps1:1:1:1:8 | exit ... | Statements/ExitStatement.ps1:1:1:1:8 | {...} | | Statements/ExitStatement.ps1:1:1:1:8 | {...} | Statements/ExitStatement.ps1:1:1:1:8 | ExitStatement.ps1 | +| Statements/ExitStatement.ps1:1:6:1:8 | -1 | Statements/ExitStatement.ps1:1:1:1:8 | exit ... | +| Statements/ExitStatement.ps1:1:6:1:8 | -1 | Statements/ExitStatement.ps1:1:6:1:8 | -1 | | Statements/ExitStatement.ps1:1:6:1:8 | -1 | Statements/ExitStatement.ps1:1:6:1:8 | -1 | -| Statements/ExitStatement.ps1:1:6:1:8 | -1 | Statements/ExitStatement.ps1:1:6:1:8 | ...\|... | -| Statements/ExitStatement.ps1:1:6:1:8 | ...\|... | Statements/ExitStatement.ps1:1:1:1:8 | exit ... | | Statements/IfStatement.ps1:1:1:1:3 | x | Statements/IfStatement.ps1:1:1:1:7 | ...=... | | Statements/IfStatement.ps1:1:1:1:7 | ...=... | Statements/IfStatement.ps1:1:1:8:2 | {...} | | Statements/IfStatement.ps1:1:1:8:2 | {...} | Statements/IfStatement.ps1:1:1:8:2 | IfStatement.ps1 | | Statements/IfStatement.ps1:1:6:1:7 | 4 | Statements/IfStatement.ps1:1:1:1:7 | ...=... | | Statements/IfStatement.ps1:1:6:1:7 | 4 | Statements/IfStatement.ps1:1:6:1:7 | 4 | | Statements/IfStatement.ps1:3:1:8:2 | if (...) {...} else {...} | Statements/IfStatement.ps1:1:1:8:2 | {...} | -| Statements/IfStatement.ps1:3:5:3:7 | x | Statements/IfStatement.ps1:3:5:3:13 | ...+... | -| Statements/IfStatement.ps1:3:5:3:13 | ...+... | Statements/IfStatement.ps1:3:5:3:13 | ...+... | -| Statements/IfStatement.ps1:3:5:3:13 | ...+... | Statements/IfStatement.ps1:3:5:3:13 | ...\|... | -| Statements/IfStatement.ps1:3:5:3:13 | ...\|... | Statements/IfStatement.ps1:3:1:8:2 | if (...) {...} else {...} | -| Statements/IfStatement.ps1:3:12:3:13 | 3 | Statements/IfStatement.ps1:3:5:3:13 | ...+... | -| Statements/IfStatement.ps1:4:2:4:36 | ...\|... | Statements/IfStatement.ps1:3:15:5:2 | StatementBlock at: Statements/IfStatement.ps1:3:15:5:2 | -| Statements/IfStatement.ps1:4:2:4:36 | ExpandableStringExpression at: Statements/IfStatement.ps1:4:2:4:36 | Statements/IfStatement.ps1:4:2:4:36 | ...\|... | -| Statements/IfStatement.ps1:4:2:4:36 | ExpandableStringExpression at: Statements/IfStatement.ps1:4:2:4:36 | Statements/IfStatement.ps1:4:2:4:36 | ExpandableStringExpression at: Statements/IfStatement.ps1:4:2:4:36 | -| Statements/IfStatement.ps1:4:3:4:5 | x | Statements/IfStatement.ps1:4:2:4:36 | ExpandableStringExpression at: Statements/IfStatement.ps1:4:2:4:36 | -| Statements/IfStatement.ps1:7:2:7:21 | ...\|... | Statements/IfStatement.ps1:6:6:8:2 | StatementBlock at: Statements/IfStatement.ps1:6:6:8:2 | -| Statements/IfStatement.ps1:7:2:7:21 | ExpandableStringExpression at: Statements/IfStatement.ps1:7:2:7:21 | Statements/IfStatement.ps1:7:2:7:21 | ...\|... | -| Statements/IfStatement.ps1:7:2:7:21 | ExpandableStringExpression at: Statements/IfStatement.ps1:7:2:7:21 | Statements/IfStatement.ps1:7:2:7:21 | ExpandableStringExpression at: Statements/IfStatement.ps1:7:2:7:21 | -| Statements/IfStatement.ps1:7:3:7:5 | x | Statements/IfStatement.ps1:7:2:7:21 | ExpandableStringExpression at: Statements/IfStatement.ps1:7:2:7:21 | -| Statements/TrapStatement.ps1:1:1:4:2 | FunctionDefinition at: Statements/TrapStatement.ps1:1:1:4:2 | Statements/TrapStatement.ps1:1:1:6:9 | {...} | +| Statements/IfStatement.ps1:3:5:3:7 | x | Statements/IfStatement.ps1:3:5:3:13 | ... -ge ... | +| Statements/IfStatement.ps1:3:5:3:13 | ... -ge ... | Statements/IfStatement.ps1:3:1:8:2 | if (...) {...} else {...} | +| Statements/IfStatement.ps1:3:5:3:13 | ... -ge ... | Statements/IfStatement.ps1:3:5:3:13 | ... -ge ... | +| Statements/IfStatement.ps1:3:5:3:13 | ... -ge ... | Statements/IfStatement.ps1:3:5:3:13 | ... -ge ... | +| Statements/IfStatement.ps1:3:12:3:13 | 3 | Statements/IfStatement.ps1:3:5:3:13 | ... -ge ... | +| Statements/IfStatement.ps1:3:15:5:2 | {...} | Statements/IfStatement.ps1:3:1:8:2 | if (...) {...} else {...} | +| Statements/IfStatement.ps1:4:2:4:36 | $x is greater than or equal to 3 | Statements/IfStatement.ps1:3:15:5:2 | {...} | +| Statements/IfStatement.ps1:4:2:4:36 | $x is greater than or equal to 3 | Statements/IfStatement.ps1:4:2:4:36 | $x is greater than or equal to 3 | +| Statements/IfStatement.ps1:4:2:4:36 | $x is greater than or equal to 3 | Statements/IfStatement.ps1:4:2:4:36 | $x is greater than or equal to 3 | +| Statements/IfStatement.ps1:4:3:4:5 | x | Statements/IfStatement.ps1:4:2:4:36 | $x is greater than or equal to 3 | +| Statements/IfStatement.ps1:6:6:8:2 | {...} | Statements/IfStatement.ps1:3:1:8:2 | if (...) {...} else {...} | +| Statements/IfStatement.ps1:7:2:7:21 | $x is less than 3 | Statements/IfStatement.ps1:6:6:8:2 | {...} | +| Statements/IfStatement.ps1:7:2:7:21 | $x is less than 3 | Statements/IfStatement.ps1:7:2:7:21 | $x is less than 3 | +| Statements/IfStatement.ps1:7:2:7:21 | $x is less than 3 | Statements/IfStatement.ps1:7:2:7:21 | $x is less than 3 | +| Statements/IfStatement.ps1:7:3:7:5 | x | Statements/IfStatement.ps1:7:2:7:21 | $x is less than 3 | +| Statements/TrapStatement.ps1:1:1:4:2 | TrapTest | Statements/TrapStatement.ps1:1:1:6:9 | {...} | | Statements/TrapStatement.ps1:1:1:6:9 | {...} | Statements/TrapStatement.ps1:1:1:6:9 | TrapStatement.ps1 | -| Statements/TrapStatement.ps1:1:19:4:2 | TrapStatement.ps1 | Statements/TrapStatement.ps1:1:1:4:2 | FunctionDefinition at: Statements/TrapStatement.ps1:1:1:4:2 | +| Statements/TrapStatement.ps1:1:19:4:2 | {...} | Statements/TrapStatement.ps1:1:1:4:2 | TrapTest | | Statements/TrapStatement.ps1:2:5:2:26 | TrapStatement at: Statements/TrapStatement.ps1:2:5:2:26 | Statements/TrapStatement.ps1:2:5:3:19 | {...} | -| Statements/TrapStatement.ps1:2:5:3:19 | {...} | Statements/TrapStatement.ps1:1:19:4:2 | TrapStatement.ps1 | -| Statements/TrapStatement.ps1:2:11:2:25 | ...\|... | Statements/TrapStatement.ps1:2:10:2:26 | StatementBlock at: Statements/TrapStatement.ps1:2:10:2:26 | -| Statements/TrapStatement.ps1:2:11:2:25 | Error found. | Statements/TrapStatement.ps1:2:11:2:25 | ...\|... | +| Statements/TrapStatement.ps1:2:5:3:19 | {...} | Statements/TrapStatement.ps1:1:19:4:2 | {...} | +| Statements/TrapStatement.ps1:2:10:2:26 | {...} | Statements/TrapStatement.ps1:2:5:2:26 | TrapStatement at: Statements/TrapStatement.ps1:2:5:2:26 | +| Statements/TrapStatement.ps1:2:11:2:25 | Error found. | Statements/TrapStatement.ps1:2:10:2:26 | {...} | +| Statements/TrapStatement.ps1:2:11:2:25 | Error found. | Statements/TrapStatement.ps1:2:11:2:25 | Error found. | | Statements/TrapStatement.ps1:2:11:2:25 | Error found. | Statements/TrapStatement.ps1:2:11:2:25 | Error found. | -| Statements/TrapStatement.ps1:3:5:3:19 | ...\|... | Statements/TrapStatement.ps1:2:5:3:19 | {...} | -| Statements/TrapStatement.ps1:3:5:3:19 | nonsenseString | Statements/TrapStatement.ps1:3:5:3:19 | ...\|... | +| Statements/TrapStatement.ps1:3:5:3:19 | nonsenseString | Statements/TrapStatement.ps1:2:5:3:19 | {...} | | Statements/TrapStatement.ps1:3:5:3:19 | nonsenseString | Statements/TrapStatement.ps1:3:5:3:19 | nonsenseString | -| Statements/TrapStatement.ps1:6:1:6:9 | ...\|... | Statements/TrapStatement.ps1:1:1:6:9 | {...} | -| Statements/TrapStatement.ps1:6:1:6:9 | TrapTest | Statements/TrapStatement.ps1:6:1:6:9 | ...\|... | +| Statements/TrapStatement.ps1:3:5:3:19 | nonsenseString | Statements/TrapStatement.ps1:3:5:3:19 | nonsenseString | +| Statements/TrapStatement.ps1:6:1:6:9 | TrapTest | Statements/TrapStatement.ps1:1:1:6:9 | {...} | +| Statements/TrapStatement.ps1:6:1:6:9 | TrapTest | Statements/TrapStatement.ps1:6:1:6:9 | TrapTest | | Statements/TrapStatement.ps1:6:1:6:9 | TrapTest | Statements/TrapStatement.ps1:6:1:6:9 | TrapTest | | Statements/Try.ps1:1:1:13:2 | try {...} | Statements/Try.ps1:1:1:13:2 | {...} | | Statements/Try.ps1:1:1:13:2 | {...} | Statements/Try.ps1:1:1:13:2 | Try.ps1 | +| Statements/Try.ps1:1:5:4:2 | {...} | Statements/Try.ps1:1:1:13:2 | try {...} | | Statements/Try.ps1:2:4:2:14 | Exception | Statements/Try.ps1:2:4:2:95 | ...=... | -| Statements/Try.ps1:2:4:2:95 | ...=... | Statements/Try.ps1:1:5:4:2 | StatementBlock at: Statements/Try.ps1:1:5:4:2 | +| Statements/Try.ps1:2:4:2:95 | ...=... | Statements/Try.ps1:1:5:4:2 | {...} | | Statements/Try.ps1:2:17:2:27 | New-Object | Statements/Try.ps1:2:17:2:95 | New-Object | -| Statements/Try.ps1:2:17:2:95 | ...\|... | Statements/Try.ps1:2:4:2:95 | ...=... | -| Statements/Try.ps1:2:17:2:95 | New-Object | Statements/Try.ps1:2:17:2:95 | ...\|... | +| Statements/Try.ps1:2:17:2:95 | New-Object | Statements/Try.ps1:2:4:2:95 | ...=... | +| Statements/Try.ps1:2:17:2:95 | New-Object | Statements/Try.ps1:2:17:2:95 | New-Object | | Statements/Try.ps1:2:28:2:53 | System.Xaml.XamlException | Statements/Try.ps1:2:17:2:95 | New-Object | | Statements/Try.ps1:2:54:2:67 | ArgumentList | Statements/Try.ps1:2:17:2:95 | New-Object | | Statements/Try.ps1:2:68:2:95 | (...) | Statements/Try.ps1:2:17:2:95 | New-Object | -| Statements/Try.ps1:2:69:2:80 | Bad XAML! | Statements/Try.ps1:2:69:2:94 | ArrayLiteral at: Statements/Try.ps1:2:69:2:94 | -| Statements/Try.ps1:2:69:2:94 | ...\|... | Statements/Try.ps1:2:68:2:95 | (...) | -| Statements/Try.ps1:2:69:2:94 | ArrayLiteral at: Statements/Try.ps1:2:69:2:94 | Statements/Try.ps1:2:69:2:94 | ...\|... | -| Statements/Try.ps1:2:69:2:94 | ArrayLiteral at: Statements/Try.ps1:2:69:2:94 | Statements/Try.ps1:2:69:2:94 | ArrayLiteral at: Statements/Try.ps1:2:69:2:94 | -| Statements/Try.ps1:2:82:2:87 | null | Statements/Try.ps1:2:69:2:94 | ArrayLiteral at: Statements/Try.ps1:2:69:2:94 | -| Statements/Try.ps1:2:89:2:91 | 10 | Statements/Try.ps1:2:69:2:94 | ArrayLiteral at: Statements/Try.ps1:2:69:2:94 | -| Statements/Try.ps1:2:93:2:94 | 2 | Statements/Try.ps1:2:69:2:94 | ArrayLiteral at: Statements/Try.ps1:2:69:2:94 | -| Statements/Try.ps1:3:11:3:21 | ...\|... | file://:0:0:0:0 | (no string representation) | -| Statements/Try.ps1:3:11:3:21 | Exception | Statements/Try.ps1:3:11:3:21 | ...\|... | +| Statements/Try.ps1:2:69:2:80 | Bad XAML! | Statements/Try.ps1:2:69:2:94 | ...,... | +| Statements/Try.ps1:2:69:2:94 | ...,... | Statements/Try.ps1:2:68:2:95 | (...) | +| Statements/Try.ps1:2:69:2:94 | ...,... | Statements/Try.ps1:2:69:2:94 | ...,... | +| Statements/Try.ps1:2:69:2:94 | ...,... | Statements/Try.ps1:2:69:2:94 | ...,... | +| Statements/Try.ps1:2:82:2:87 | null | Statements/Try.ps1:2:69:2:94 | ...,... | +| Statements/Try.ps1:2:89:2:91 | 10 | Statements/Try.ps1:2:69:2:94 | ...,... | +| Statements/Try.ps1:2:93:2:94 | 2 | Statements/Try.ps1:2:69:2:94 | ...,... | +| Statements/Try.ps1:3:5:3:21 | throw ... | Statements/Try.ps1:1:5:4:2 | {...} | +| Statements/Try.ps1:3:11:3:21 | Exception | Statements/Try.ps1:3:5:3:21 | throw ... | | Statements/Try.ps1:3:11:3:21 | Exception | Statements/Try.ps1:3:11:3:21 | Exception | -| Statements/Try.ps1:5:1:7:2 | catch {...} | Statements/Try.ps1:1:1:13:2 | try {...} | -| Statements/Try.ps1:5:7:5:32 | System.Net.WebException | Statements/Try.ps1:5:1:7:2 | catch {...} | -| Statements/Try.ps1:5:33:5:56 | System.IO.IOException | Statements/Try.ps1:5:1:7:2 | catch {...} | -| Statements/Try.ps1:6:5:6:64 | ...\|... | Statements/Try.ps1:5:57:7:2 | StatementBlock at: Statements/Try.ps1:5:57:7:2 | -| Statements/Try.ps1:6:5:6:64 | Unable to download MyDoc.doc from http://www.contoso.com. | Statements/Try.ps1:6:5:6:64 | ...\|... | +| Statements/Try.ps1:3:11:3:21 | Exception | Statements/Try.ps1:3:11:3:21 | Exception | +| Statements/Try.ps1:5:1:7:2 | catch[...] {...} | Statements/Try.ps1:1:1:13:2 | try {...} | +| Statements/Try.ps1:5:7:5:32 | System.Net.WebException | Statements/Try.ps1:5:1:7:2 | catch[...] {...} | +| Statements/Try.ps1:5:33:5:56 | System.IO.IOException | Statements/Try.ps1:5:1:7:2 | catch[...] {...} | +| Statements/Try.ps1:5:57:7:2 | {...} | Statements/Try.ps1:5:1:7:2 | catch[...] {...} | +| Statements/Try.ps1:6:5:6:64 | Unable to download MyDoc.doc from http://www.contoso.com. | Statements/Try.ps1:5:57:7:2 | {...} | +| Statements/Try.ps1:6:5:6:64 | Unable to download MyDoc.doc from http://www.contoso.com. | Statements/Try.ps1:6:5:6:64 | Unable to download MyDoc.doc from http://www.contoso.com. | | Statements/Try.ps1:6:5:6:64 | Unable to download MyDoc.doc from http://www.contoso.com. | Statements/Try.ps1:6:5:6:64 | Unable to download MyDoc.doc from http://www.contoso.com. | | Statements/Try.ps1:8:1:10:2 | catch {...} | Statements/Try.ps1:1:1:13:2 | try {...} | -| Statements/Try.ps1:9:5:9:52 | ...\|... | Statements/Try.ps1:8:7:10:2 | StatementBlock at: Statements/Try.ps1:8:7:10:2 | -| Statements/Try.ps1:9:5:9:52 | An error occurred that could not be resolved. | Statements/Try.ps1:9:5:9:52 | ...\|... | +| Statements/Try.ps1:8:7:10:2 | {...} | Statements/Try.ps1:8:1:10:2 | catch {...} | +| Statements/Try.ps1:9:5:9:52 | An error occurred that could not be resolved. | Statements/Try.ps1:8:7:10:2 | {...} | | Statements/Try.ps1:9:5:9:52 | An error occurred that could not be resolved. | Statements/Try.ps1:9:5:9:52 | An error occurred that could not be resolved. | -| Statements/Try.ps1:12:5:12:37 | ...\|... | Statements/Try.ps1:11:9:13:2 | StatementBlock at: Statements/Try.ps1:11:9:13:2 | -| Statements/Try.ps1:12:5:12:37 | The finally block is executed. | Statements/Try.ps1:12:5:12:37 | ...\|... | +| Statements/Try.ps1:9:5:9:52 | An error occurred that could not be resolved. | Statements/Try.ps1:9:5:9:52 | An error occurred that could not be resolved. | +| Statements/Try.ps1:11:9:13:2 | {...} | Statements/Try.ps1:1:1:13:2 | try {...} | +| Statements/Try.ps1:12:5:12:37 | The finally block is executed. | Statements/Try.ps1:11:9:13:2 | {...} | +| Statements/Try.ps1:12:5:12:37 | The finally block is executed. | Statements/Try.ps1:12:5:12:37 | The finally block is executed. | | Statements/Try.ps1:12:5:12:37 | The finally block is executed. | Statements/Try.ps1:12:5:12:37 | The finally block is executed. | -| Statements/UseProcessBlockForPipelineCommand.ps1:1:1:11:2 | FunctionDefinition at: Statements/UseProcessBlockForPipelineCommand.ps1:1:1:11:2 | Statements/UseProcessBlockForPipelineCommand.ps1:1:1:11:2 | {...} | +| Statements/UseProcessBlockForPipelineCommand.ps1:1:1:11:2 | Get-Number | Statements/UseProcessBlockForPipelineCommand.ps1:1:1:11:2 | {...} | | Statements/UseProcessBlockForPipelineCommand.ps1:1:1:11:2 | {...} | Statements/UseProcessBlockForPipelineCommand.ps1:1:1:11:2 | UseProcessBlockForPipelineCommand.ps1 | -| Statements/UseProcessBlockForPipelineCommand.ps1:2:1:11:2 | UseProcessBlockForPipelineCommand.ps1 | Statements/UseProcessBlockForPipelineCommand.ps1:1:1:11:2 | FunctionDefinition at: Statements/UseProcessBlockForPipelineCommand.ps1:1:1:11:2 | -| Statements/UseProcessBlockForPipelineCommand.ps1:3:5:3:22 | CmdletBinding | Statements/UseProcessBlockForPipelineCommand.ps1:4:5:8:6 | ParamBlock | -| Statements/UseProcessBlockForPipelineCommand.ps1:4:5:8:6 | ParamBlock | Statements/UseProcessBlockForPipelineCommand.ps1:2:1:11:2 | UseProcessBlockForPipelineCommand.ps1 | -| Statements/UseProcessBlockForPipelineCommand.ps1:4:5:10:12 | {...} | Statements/UseProcessBlockForPipelineCommand.ps1:2:1:11:2 | UseProcessBlockForPipelineCommand.ps1 | +| Statements/UseProcessBlockForPipelineCommand.ps1:2:1:11:2 | {...} | Statements/UseProcessBlockForPipelineCommand.ps1:1:1:11:2 | Get-Number | +| Statements/UseProcessBlockForPipelineCommand.ps1:3:5:3:22 | CmdletBinding | Statements/UseProcessBlockForPipelineCommand.ps1:4:5:8:6 | param(...) | +| Statements/UseProcessBlockForPipelineCommand.ps1:4:5:8:6 | param(...) | Statements/UseProcessBlockForPipelineCommand.ps1:2:1:11:2 | {...} | +| Statements/UseProcessBlockForPipelineCommand.ps1:4:5:10:12 | {...} | Statements/UseProcessBlockForPipelineCommand.ps1:2:1:11:2 | {...} | | Statements/UseProcessBlockForPipelineCommand.ps1:5:9:5:39 | Parameter | Statements/UseProcessBlockForPipelineCommand.ps1:5:9:7:16 | Number | -| Statements/UseProcessBlockForPipelineCommand.ps1:5:9:7:16 | Number | Statements/UseProcessBlockForPipelineCommand.ps1:4:5:8:6 | ParamBlock | -| Statements/UseProcessBlockForPipelineCommand.ps1:5:20:5:37 | True | file://:0:0:0:0 | (no string representation) | +| Statements/UseProcessBlockForPipelineCommand.ps1:5:9:7:16 | Number | Statements/UseProcessBlockForPipelineCommand.ps1:4:5:8:6 | param(...) | +| Statements/UseProcessBlockForPipelineCommand.ps1:5:20:5:37 | True | Statements/UseProcessBlockForPipelineCommand.ps1:5:9:5:39 | Parameter | +| Statements/UseProcessBlockForPipelineCommand.ps1:5:20:5:37 | True | Statements/UseProcessBlockForPipelineCommand.ps1:5:20:5:37 | True | | Statements/UseProcessBlockForPipelineCommand.ps1:6:9:6:14 | int | Statements/UseProcessBlockForPipelineCommand.ps1:5:9:7:16 | Number | -| Statements/UseProcessBlockForPipelineCommand.ps1:7:9:7:16 | Number | Statements/UseProcessBlockForPipelineCommand.ps1:5:9:7:16 | Number | -| Statements/UseProcessBlockForPipelineCommand.ps1:10:5:10:12 | ...\|... | Statements/UseProcessBlockForPipelineCommand.ps1:4:5:10:12 | {...} | -| Statements/UseProcessBlockForPipelineCommand.ps1:10:5:10:12 | Number | Statements/UseProcessBlockForPipelineCommand.ps1:10:5:10:12 | ...\|... | +| Statements/UseProcessBlockForPipelineCommand.ps1:10:5:10:12 | Number | Statements/UseProcessBlockForPipelineCommand.ps1:4:5:10:12 | {...} | +| Statements/UseProcessBlockForPipelineCommand.ps1:10:5:10:12 | Number | Statements/UseProcessBlockForPipelineCommand.ps1:10:5:10:12 | Number | | Statements/UseProcessBlockForPipelineCommand.ps1:10:5:10:12 | Number | Statements/UseProcessBlockForPipelineCommand.ps1:10:5:10:12 | Number | -| file://:0:0:0:0 | (no string representation) | Arrays/Arrays.ps1:2:1:2:15 | ...=... | -| file://:0:0:0:0 | (no string representation) | Arrays/Arrays.ps1:3:1:3:17 | ...=... | -| file://:0:0:0:0 | (no string representation) | Arrays/Arrays.ps1:6:1:6:22 | ...=... | -| file://:0:0:0:0 | (no string representation) | Arrays/Arrays.ps1:7:1:7:22 | ...=... | -| file://:0:0:0:0 | (no string representation) | Arrays/Arrays.ps1:8:1:8:24 | ...=... | -| file://:0:0:0:0 | (no string representation) | Arrays/Arrays.ps1:9:1:9:21 | ...=... | -| file://:0:0:0:0 | (no string representation) | Arrays/Arrays.ps1:12:1:12:14 | (no string representation) | -| file://:0:0:0:0 | (no string representation) | Arrays/Arrays.ps1:14:11:14:44 | (no string representation) | -| file://:0:0:0:0 | (no string representation) | Expressions/ExpandableString.ps1:1:1:1:40 | ExpandableStringExpression at: Expressions/ExpandableString.ps1:1:1:1:40 | -| file://:0:0:0:0 | (no string representation) | Expressions/ExpandableString.ps1:1:23:1:38 | (no string representation) | -| file://:0:0:0:0 | (no string representation) | Expressions/SubExpression.ps1:1:1:1:24 | ArrayExpression at: Expressions/SubExpression.ps1:1:1:1:24 | -| file://:0:0:0:0 | (no string representation) | Expressions/SubExpression.ps1:2:1:2:22 | ArrayExpression at: Expressions/SubExpression.ps1:2:1:2:22 | -| file://:0:0:0:0 | (no string representation) | Loops/DoUntil.ps1:5:2:5:6 | (no string representation) | -| file://:0:0:0:0 | (no string representation) | Loops/DoWhile.ps1:5:2:5:6 | (no string representation) | -| file://:0:0:0:0 | (no string representation) | Loops/While.ps1:5:5:5:11 | (no string representation) | -| file://:0:0:0:0 | (no string representation) | Redirections/FileRedirection.ps1:1:1:3:20 | (no string representation) | -| file://:0:0:0:0 | (no string representation) | Statements/Try.ps1:1:5:4:2 | StatementBlock at: Statements/Try.ps1:1:5:4:2 | -| file://:0:0:0:0 | (no string representation) | Statements/UseProcessBlockForPipelineCommand.ps1:5:9:5:39 | Parameter | +| file://:0:0:0:0 | (no string representation) | Blocks/ParamBlock.ps1:3:5:4:23 | Parameter | +| file://:0:0:0:0 | (no string representation) | Dynamic/DynamicExecutionWithFunc.ps1:3:9:3:19 | userInput | +| file://:0:0:0:0 | (no string representation) | Statements/UseProcessBlockForPipelineCommand.ps1:5:9:7:16 | Number | diff --git a/powershell/ql/test/library-tests/controlflow/graph/Cfg.expected b/powershell/ql/test/library-tests/controlflow/graph/Cfg.expected index cf644265bbd4..08e3368df905 100644 --- a/powershell/ql/test/library-tests/controlflow/graph/Cfg.expected +++ b/powershell/ql/test/library-tests/controlflow/graph/Cfg.expected @@ -3,7 +3,7 @@ functions.ps1: #-----| -> foo # 1| {...} -#-----| -> exit functions.ps1 (normal) +#-----| -> Add-Numbers-Arguments # 1| enter functions.ps1 #-----| -> functions.ps1 @@ -14,7 +14,7 @@ functions.ps1: #-----| -> exit functions.ps1 # 1| functions.ps1 -#-----| -> Add-Numbers-Arguments +#-----| -> {...} # 1| enter {...} #-----| -> {...} @@ -25,19 +25,13 @@ functions.ps1: #-----| -> exit {...} # 1| {...} -#-----| -> number1 +#-----| -> param(...) # 3| param(...) -#-----| -> ...+... +#-----| -> {...} # 3| {...} -#-----| -> exit {...} (normal) - -# 4| number1 -#-----| -> number2 - -# 5| number2 -#-----| -> param(...) +#-----| -> ...+... # 8| number1 #-----| -> number2 @@ -46,7 +40,7 @@ functions.ps1: #-----| -> number1 # 8| ...+... -#-----| -> {...} +#-----| -> exit {...} (normal) # 8| ...+... #-----| -> ...+... @@ -66,7 +60,7 @@ functions.ps1: #-----| -> exit {...} # 11| {...} -#-----| -> a +#-----| -> param(...) # 11| param(...) #-----| -> {...} @@ -74,9 +68,6 @@ functions.ps1: # 11| {...} #-----| -> exit {...} (normal) -# 11| a -#-----| -> param(...) - # 13| Default-Arguments #-----| -> Add-Numbers-From-Array @@ -89,31 +80,22 @@ functions.ps1: #-----| -> exit {...} # 13| {...} -#-----| -> name0 +#-----| -> 0 # 14| param(...) -#-----| -> ...+... +#-----| -> {...} # 14| {...} -#-----| -> exit {...} (normal) - -# 15| name0 -#-----| -> 0 - -# 16| name1 -#-----| -> name1 +#-----| -> ...+... # 16| 0 #-----| -> name1 -# 17| name2 -#-----| -> param(...) - # 17| name1 #-----| -> 1 # 17| ...+... -#-----| -> name2 +#-----| -> param(...) # 17| 1 #-----| -> ...+... @@ -125,7 +107,7 @@ functions.ps1: #-----| -> name # 19| ...+... -#-----| -> {...} +#-----| -> exit {...} (normal) # 19| ...+... #-----| -> ...+... @@ -145,25 +127,22 @@ functions.ps1: #-----| -> exit {...} # 22| {...} -#-----| -> numbers +#-----| -> param(...) # 24| param(...) -#-----| -> sum +#-----| -> {...} # 24| {...} -#-----| -> exit {...} (normal) - -# 25| numbers -#-----| -> param(...) +#-----| -> ...=... # 28| sum #-----| -> 0 # 28| ...=... -#-----| -> numbers +#-----| -> sum # 28| 0 -#-----| -> ...=... +#-----| -> numbers # 28| 0 #-----| -> 0 @@ -173,6 +152,7 @@ functions.ps1: #-----| -> sum # 29| number +#-----| -> {...} # 29| numbers #-----| -> numbers @@ -183,17 +163,32 @@ functions.ps1: # 29| numbers #-----| -> numbers +# 29| {...} +#-----| -> ...=... + +# 31| sum +#-----| -> number + +# 31| ...=... +#-----| -> sum + +# 31| number +#-----| -> forach(... in ...) + +# 31| number +#-----| -> number + # 33| sum #-----| -> sum # 33| sum -#-----| -> {...} +#-----| -> exit {...} (normal) # 33| sum #-----| -> sum # 36| Add-Numbers-From-Pipeline -#-----| -> {...} +#-----| -> exit functions.ps1 (normal) # 36| enter {...} #-----| -> {...} @@ -204,60 +199,57 @@ functions.ps1: #-----| -> exit {...} # 36| {...} -#-----| -> numbers +#-----| -> param(...) # 38| param(...) -#-----| -> sum - -# 39| numbers -#-----| -> param(...) +#-----| -> {...} # 41| {...} -#-----| -> sum +#-----| -> ...=... # 42| sum #-----| -> 0 # 42| ...=... -#-----| -> {...} +#-----| -> sum # 42| 0 -#-----| -> ...=... +#-----| -> {...} # 42| 0 #-----| -> 0 # 44| {...} -#-----| -> sum -#-----| -> sum +#-----| -> ...=... # 46| sum #-----| -> _ # 46| ...=... -#-----| -> {...} +#-----| -> sum # 46| _ -#-----| -> ...=... +#-----| -> {...} +#-----| -> {...} # 46| _ #-----| -> _ # 48| {...} -#-----| -> exit {...} (normal) +#-----| -> sum # 50| sum #-----| -> sum # 50| sum -#-----| -> {...} +#-----| -> exit {...} (normal) # 50| sum #-----| -> sum global.ps1: # 1| {...} -#-----| -> c +#-----| -> ...=... # 1| enter global.ps1 #-----| -> global.ps1 @@ -268,13 +260,13 @@ global.ps1: #-----| -> exit global.ps1 # 1| global.ps1 -#-----| -> a +#-----| -> {...} # 2| a #-----| -> 1 # 2| ...=... -#-----| -> b +#-----| -> a # 2| 1 #-----| -> ...=... @@ -286,28 +278,28 @@ global.ps1: #-----| -> 2 # 3| ...=... -#-----| -> {...} +#-----| -> b # 3| 2 -#-----| -> ...=... +#-----| -> {...} # 3| 2 #-----| -> 2 # 5| {...} -#-----| -> exit global.ps1 (normal) +#-----| -> ...=... # 6| c #-----| -> ...+... # 6| ...=... -#-----| -> {...} +#-----| -> c # 6| a #-----| -> b # 6| ...+... -#-----| -> ...=... +#-----| -> exit global.ps1 (normal) # 6| ...+... #-----| -> a @@ -328,10 +320,10 @@ loops.ps1: #-----| -> exit loops.ps1 # 1| loops.ps1 -#-----| -> Test-While +#-----| -> {...} # 1| {...} -#-----| -> exit loops.ps1 (normal) +#-----| -> Test-While # 1| enter {...} #-----| -> {...} @@ -342,19 +334,19 @@ loops.ps1: #-----| -> exit {...} # 1| {...} -#-----| -> a +#-----| -> {...} # 2| a #-----| -> 0 # 2| ...=... -#-----| -> while(...) {...} +#-----| -> a # 2| {...} -#-----| -> exit {...} (normal) +#-----| -> ...=... # 2| 0 -#-----| -> ...=... +#-----| -> while(...) {...} # 2| 0 #-----| -> 0 @@ -369,7 +361,7 @@ loops.ps1: #-----| -> a # 4| ... -le ... -#-----| false -> {...} +#-----| false -> exit {...} (normal) #-----| true -> {...} # 4| ... -le ... @@ -379,19 +371,19 @@ loops.ps1: #-----| -> ... -le ... # 4| {...} -#-----| -> a +#-----| -> ...=... # 5| a #-----| -> ...+... # 5| ...=... -#-----| -> ... -le ... +#-----| -> a # 5| a #-----| -> 1 # 5| ...+... -#-----| -> ...=... +#-----| -> ... -le ... # 5| ...+... #-----| -> a @@ -411,19 +403,19 @@ loops.ps1: #-----| -> exit {...} # 9| {...} -#-----| -> a +#-----| -> {...} # 10| a #-----| -> 0 # 10| ...=... -#-----| -> while(...) {...} +#-----| -> a # 10| {...} -#-----| -> exit {...} (normal) +#-----| -> ...=... # 10| 0 -#-----| -> ...=... +#-----| -> while(...) {...} # 10| 0 #-----| -> 0 @@ -438,7 +430,7 @@ loops.ps1: #-----| -> a # 11| ... -le ... -#-----| false -> {...} +#-----| false -> exit {...} (normal) #-----| true -> {...} # 11| ... -le ... @@ -465,19 +457,19 @@ loops.ps1: #-----| -> exit {...} # 17| {...} -#-----| -> a +#-----| -> {...} # 18| a #-----| -> 0 # 18| ...=... -#-----| -> while(...) {...} +#-----| -> a # 18| {...} -#-----| -> exit {...} (normal) +#-----| -> ...=... # 18| 0 -#-----| -> ...=... +#-----| -> while(...) {...} # 18| 0 #-----| -> 0 @@ -492,7 +484,7 @@ loops.ps1: #-----| -> a # 19| ... -le ... -#-----| false -> {...} +#-----| false -> exit {...} (normal) #-----| true -> {...} # 19| ... -le ... @@ -519,19 +511,19 @@ loops.ps1: #-----| -> exit {...} # 25| {...} -#-----| -> a +#-----| -> {...} # 26| a #-----| -> 0 # 26| ...=... -#-----| -> DoWhile +#-----| -> a # 26| {...} -#-----| -> exit {...} (normal) +#-----| -> ...=... # 26| 0 -#-----| -> ...=... +#-----| -> DoWhile # 26| 0 #-----| -> 0 @@ -540,19 +532,19 @@ loops.ps1: #-----| -> {...} # 28| {...} -#-----| -> a +#-----| -> ...=... # 29| a #-----| -> ...+... # 29| ...=... -#-----| -> ... -le ... +#-----| -> a # 29| a #-----| -> 1 # 29| ...+... -#-----| -> ...=... +#-----| -> ... -le ... # 29| ...+... #-----| -> a @@ -567,7 +559,7 @@ loops.ps1: #-----| -> a # 30| ... -le ... -#-----| false -> {...} +#-----| false -> exit {...} (normal) #-----| true -> {...} # 30| ... -le ... @@ -588,19 +580,19 @@ loops.ps1: #-----| -> exit {...} # 33| {...} -#-----| -> a +#-----| -> {...} # 34| a #-----| -> 0 # 34| ...=... -#-----| -> DoUntil +#-----| -> a # 34| {...} -#-----| -> exit {...} (normal) +#-----| -> ...=... # 34| 0 -#-----| -> ...=... +#-----| -> DoUntil # 34| 0 #-----| -> 0 @@ -609,19 +601,19 @@ loops.ps1: #-----| -> {...} # 36| {...} -#-----| -> a +#-----| -> ...=... # 37| a #-----| -> ...+... # 37| ...=... -#-----| -> ... -ge ... +#-----| -> a # 37| a #-----| -> 1 # 37| ...+... -#-----| -> ...=... +#-----| -> ... -ge ... # 37| ...+... #-----| -> a @@ -636,7 +628,7 @@ loops.ps1: #-----| -> a # 38| ... -ge ... -#-----| true -> {...} +#-----| true -> exit {...} (normal) #-----| false -> {...} # 38| ... -ge ... @@ -657,34 +649,34 @@ loops.ps1: #-----| -> exit {...} # 41| {...} -#-----| -> a +#-----| -> {...} # 42| a #-----| -> 0 # 42| ...=... -#-----| -> for(...;...;...) +#-----| -> a # 42| {...} -#-----| -> exit {...} (normal) +#-----| -> ...=... # 42| 0 -#-----| -> ...=... +#-----| -> for(...;...;...) # 42| 0 #-----| -> 0 # 44| for(...;...;...) -#-----| -> i +#-----| -> ...=... # 44| i #-----| -> 0 # 44| ...=... -#-----| -> ... -le ... +#-----| -> i # 44| 0 -#-----| -> ...=... +#-----| -> ... -le ... # 44| 0 #-----| -> 0 @@ -696,7 +688,7 @@ loops.ps1: #-----| -> i # 44| ... -le ... -#-----| false -> {...} +#-----| false -> exit {...} (normal) #-----| true -> {...} # 44| ... -le ... @@ -709,12 +701,12 @@ loops.ps1: #-----| -> ...+... # 44| ...=... +#-----| -> i # 44| i #-----| -> 1 # 44| ...+... -#-----| -> ...=... # 44| ...+... #-----| -> i @@ -723,13 +715,13 @@ loops.ps1: #-----| -> ...+... # 44| {...} -#-----| -> a +#-----| -> ...=... # 45| a #-----| -> ...+... # 45| ...=... -#-----| -> i +#-----| -> a # 45| a #-----| -> 1 @@ -744,15 +736,21 @@ loops.ps1: #-----| -> ...+... # 49| Test-ForEach -#-----| -> {...} +#-----| -> exit loops.ps1 (normal) # 49| enter {...} #-----| -> {...} # 49| {...} -#-----| -> letterArray +#-----| -> {...} # 50| letterArray #-----| -> ...,... +# 50| ...=... +#-----| -> letterArray + +# 50| {...} +#-----| -> ...=... + # 50| ...,...