public virtual ExpressionAst VisitExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst) { return(new ExpandableStringExpressionAst( expandableStringExpressionAst.Extent, expandableStringExpressionAst.Value, expandableStringExpressionAst.StringConstantType)); }
public static ExpandableStringExpressionAst Update( this ExpandableStringExpressionAst ast, string value = null, StringConstantType?type = null) { return(ast.Clone()); }
public override object VisitExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst) { var value = UnVerbatimString(expandableStringExpressionAst.Value); switch (expandableStringExpressionAst.StringConstantType) { case StringConstantType.DoubleQuotedHereString: case StringConstantType.DoubleQuoted: script_.Write('"'); script_.Write(value); script_.Write('"'); break; case StringConstantType.SingleQuotedHereString: case StringConstantType.SingleQuoted: script_.Write("'"); script_.Write(value); script_.Write("'"); break; case StringConstantType.BareWord: script_.Write(value); break; default: throw new Exception("StringConstantType not supported"); } return(expandableStringExpressionAst); }
public override AstVisitAction VisitExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst) { var stringSize = expandableStringExpressionAst.Value.Length; StringLiteralCount += 1; StringLiteralCumulativeSize += stringSize; MaxStringSize = Math.Max(MaxStringSize, stringSize); return(AstVisitAction.Continue); }
public override AstVisitAction VisitExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst) { var items = string.Join(", ", expandableStringExpressionAst.NestedExpressions.Select(n => n.Extent.Text)); explanations.Add( new Explanation() { Description = $"String with expandable elements: {items}", CommandName = expandableStringExpressionAst.StringConstantType.ToString(), HelpResult = HelpTableQuery("about_quoting_rules"), TextToHighlight = "\"" }.AddDefaults(expandableStringExpressionAst, explanations)); return(AstVisitAction.Continue); }
public object VisitExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst) { bool isSafe = true; foreach (var nestedExpression in expandableStringExpressionAst.NestedExpressions) { _visitCount++; if (!(bool)nestedExpression.Accept(this)) { isSafe = false; break; } } return(isSafe); }
private string GetPathFromExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst) { var path = expandableStringExpressionAst.Value; foreach (var nestedExpression in expandableStringExpressionAst.NestedExpressions) { // If the string contains the variable $PSScriptRoot, we replace it with the corresponding value. if (!(nestedExpression is VariableExpressionAst variableAst && variableAst.VariablePath.UserPath.Equals("PSScriptRoot", StringComparison.OrdinalIgnoreCase))) { return(null); // We return null instead of a partially evaluated ExpandableStringExpression. } path = path.Replace(variableAst.ToString(), _psScriptRoot); } return(path); }
/// <summary> /// Checks to see if the command invocation is a dot /// in order to find a dot sourced file /// </summary> /// <param name="commandAst">A CommandAst object in the script's AST</param> /// <returns>A decision to stop searching if the right commandAst was found, /// or a decision to continue if it wasn't found</returns> public override AstVisitAction VisitCommand(CommandAst commandAst) { CommandElementAst commandElementAst = commandAst.CommandElements[0]; if (commandAst.InvocationOperator.Equals(TokenKind.Dot)) { string path = commandElementAst switch { StringConstantExpressionAst stringConstantExpressionAst => stringConstantExpressionAst.Value, ExpandableStringExpressionAst expandableStringExpressionAst => GetPathFromExpandableStringExpression(expandableStringExpressionAst), _ => null, }; if (!string.IsNullOrWhiteSpace(path)) { DotSourcedFiles.Add(PathUtils.NormalizePathSeparators(path)); } } return(base.VisitCommand(commandAst)); }
public object VisitExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst) { Console.WriteLine("Visited an ExpandableStringExpressionAst."); return(expandableStringExpressionAst); }
public object VisitExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst) { return(expandableStringExpressionAst.Copy()); }
public object VisitExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst) => null;
/// <summary/> public virtual AstVisitAction VisitExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst) => DefaultVisit(expandableStringExpressionAst);
public object VisitExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst) { object[] safeValues = new object[expandableStringExpressionAst.NestedExpressions.Count]; // retrieve OFS, and if it doesn't exist set it to space string ofs = null; if (s_context != null) { ofs = s_context.SessionState.PSVariable.GetValue("OFS") as string; } if (ofs == null) { ofs = " "; } for (int offset = 0; offset < safeValues.Length; offset++) { var result = expandableStringExpressionAst.NestedExpressions[offset].Accept(this); // depending on the nested expression we may retrieve a variable, or even need to // execute a sub-expression. The result of which may be returned // as a scalar, array or nested array. If the unwrap of first array doesn't contain a nested // array we can then pass it to string.Join. If it *does* contain an array, // we need to unwrap the inner array and pass *that* to string.Join. // // This means we get the same answer with GetPowerShell() as in the command-line // { echo "abc $true $(1) $(2,3) def" }.Invoke() gives the same answer as // { echo "abc $true $(1) $(2,3) def" }.GetPowerShell().Invoke() // abc True 1 2 3 def // as does { echo "abc $true $(1) $(@(1,2),@(3,4)) def" // which is // abc True 1 System.Object[] System.Object[] def // fortunately, at this point, we're dealing with strings, so whatever the result // from the ToString method of the array (or scalar) elements, that's symmetrical with // a standard scriptblock invocation behavior var resultArray = result as object[]; // In this environment, we can't use $OFS as we might expect. Retrieving OFS // might possibly leak server side info which we don't want, so we'll // assign ' ' as our OFS for purposes of GetPowerShell // Also, this will not call any script implementations of ToString (ala types.clixml) // This *will* result in a different result in those cases. However, to execute some // arbitrary script at this stage would be opening ourselves up to an attack if (resultArray != null) { object[] subExpressionResult = new object[resultArray.Length]; for (int subExpressionOffset = 0; subExpressionOffset < subExpressionResult.Length; subExpressionOffset++) { // check to see if there is an array in our array, object[] subResult = resultArray[subExpressionOffset] as object[]; if (subResult != null) { subExpressionResult[subExpressionOffset] = string.Join(ofs, subResult); } else // it is a scalar, so we can just add it to our collections { subExpressionResult[subExpressionOffset] = resultArray[subExpressionOffset]; } } safeValues[offset] = string.Join(ofs, subExpressionResult); } else { safeValues[offset] = result; } } return(StringUtil.Format(expandableStringExpressionAst.FormatExpression, safeValues)); }
private List <CompletionResult> GetResultForString(CompletionContext completionContext, ref int replacementIndex, ref int replacementLength, bool isQuotedString) { if (isQuotedString) { return(null); } Token tokenAtCursor = completionContext.TokenAtCursor; Ast ast = completionContext.RelatedAsts.Last <Ast>(); List <CompletionResult> list = null; ExpandableStringExpressionAst ast2 = ast as ExpandableStringExpressionAst; StringConstantExpressionAst ast3 = ast as StringConstantExpressionAst; if ((ast3 != null) || (ast2 != null)) { string input = (ast3 != null) ? ast3.Value : ast2.Value; StringConstantType type = (ast3 != null) ? ast3.StringConstantType : ast2.StringConstantType; string str2 = null; if (type == StringConstantType.DoubleQuoted) { Match match = Regex.Match(input, @"(\$[\w\d]+\.[\w\d\*]*)$"); if (match.Success) { str2 = match.Groups[1].Value; } else if ((match = Regex.Match(input, @"(\[[\w\d\.]+\]::[\w\d\*]*)$")).Success) { str2 = match.Groups[1].Value; } } if (str2 != null) { int num3; int num4; int offset = tokenAtCursor.Extent.StartScriptPosition.Offset; int length = (this._cursorPosition.Offset - offset) - 1; if (length >= input.Length) { length = input.Length; } CompletionAnalysis analysis = new CompletionAnalysis(this._ast, this._tokens, this._cursorPosition, this._options); CompletionContext context = analysis.CreateCompletionContext(completionContext.ExecutionContext); context.Helper = completionContext.Helper; List <CompletionResult> list2 = analysis.GetResultHelper(context, out num3, out num4, true); if ((list2 != null) && (list2.Count > 0)) { list = new List <CompletionResult>(); replacementIndex = (offset + 1) + (length - str2.Length); replacementLength = str2.Length; string str3 = str2.Substring(0, num3); foreach (CompletionResult result in list2) { string completionText = str3 + result.CompletionText; if (result.ResultType.Equals(CompletionResultType.Property)) { completionText = TokenKind.DollarParen.Text() + completionText + TokenKind.RParen.Text(); } else if (result.ResultType.Equals(CompletionResultType.Method)) { completionText = TokenKind.DollarParen.Text() + completionText; } completionText = completionText + "\""; list.Add(new CompletionResult(completionText, result.ListItemText, result.ResultType, result.ToolTip)); } } return(list); } CommandElementAst stringAst = ast as CommandElementAst; string str5 = CompletionCompleters.ConcatenateStringPathArguments(stringAst, string.Empty, completionContext); if (str5 == null) { return(list); } completionContext.WordToComplete = str5; if ((ast.Parent is CommandAst) || (ast.Parent is CommandParameterAst)) { list = CompletionCompleters.CompleteCommandArgument(completionContext); replacementIndex = completionContext.ReplacementIndex; replacementLength = completionContext.ReplacementLength; return(list); } list = new List <CompletionResult>(CompletionCompleters.CompleteFilename(completionContext)); if (str5.IndexOf('-') != -1) { List <CompletionResult> collection = CompletionCompleters.CompleteCommand(completionContext); if ((collection != null) && (collection.Count > 0)) { list.AddRange(collection); } } } return(list); }
object ICustomAstVisitor.VisitExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst) => ProcessRewriter(VisitExpandableStringExpression, expandableStringExpressionAst);
public virtual object VisitExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst) { return(expandableStringExpressionAst); }
public override AstVisitAction VisitExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst) { Console.WriteLine("Visited an ExpandableStringExpressionAst."); Console.WriteLine(" " + expandableStringExpressionAst.ToString().Replace(Environment.NewLine, Environment.NewLine + " ")); return(AstVisitAction.Continue); }
public override AstVisitAction VisitExpandableStringExpression(ExpandableStringExpressionAst ast) { return(AstVisitAction.Continue); }
public object VisitExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst) { throw new NotImplementedException(); }
public override AstVisitAction VisitExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst) { _currentNode = new TemplateStringConstant(expandableStringExpressionAst.Value); return(AstVisitAction.SkipChildren); }
object ICustomAstVisitor.VisitExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst) => VisitExpandableStringExpression(expandableStringExpressionAst);
public object VisitExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst) { throw new UnexpectedElementException(); }
private List <CompletionResult> GetResultForIdentifier(CompletionContext completionContext, ref int replacementIndex, ref int replacementLength, bool isQuotedString) { Token tokenAtCursor = completionContext.TokenAtCursor; Ast lastAst = completionContext.RelatedAsts.Last <Ast>(); List <CompletionResult> source = null; completionContext.WordToComplete = tokenAtCursor.Text; StringConstantExpressionAst ast2 = lastAst as StringConstantExpressionAst; if ((ast2 != null) && ast2.Value.Equals("$", StringComparison.Ordinal)) { completionContext.WordToComplete = ""; return(CompletionCompleters.CompleteVariable(completionContext)); } if ((tokenAtCursor.TokenFlags & TokenFlags.CommandName) != TokenFlags.None) { if ((completionContext.RelatedAsts.Count > 0) && (completionContext.RelatedAsts[0] is ScriptBlockAst)) { Ast lastAstAtCursor = null; InternalScriptPosition position = (InternalScriptPosition)this._cursorPosition; int offset = position.Offset - tokenAtCursor.Text.Length; if (offset >= 0) { InternalScriptPosition cursorPosition = position.CloneWithNewOffset(offset); ScriptBlockAst scriptBlockAst = (ScriptBlockAst)completionContext.RelatedAsts[0]; lastAstAtCursor = GetLastAstAtCursor(scriptBlockAst, cursorPosition); } if (((lastAstAtCursor != null) && (lastAstAtCursor.Extent.EndLineNumber == tokenAtCursor.Extent.StartLineNumber)) && (lastAstAtCursor.Extent.EndColumnNumber == tokenAtCursor.Extent.StartColumnNumber)) { if (tokenAtCursor.Text.IndexOfAny(new char[] { '\\', '/' }) == 0) { string str = CompletionCompleters.ConcatenateStringPathArguments(lastAstAtCursor as CommandElementAst, tokenAtCursor.Text, completionContext); if (str != null) { completionContext.WordToComplete = str; source = new List <CompletionResult>(CompletionCompleters.CompleteFilename(completionContext)); if (source.Count > 0) { replacementIndex = lastAstAtCursor.Extent.StartScriptPosition.Offset; replacementLength += lastAstAtCursor.Extent.Text.Length; } return(source); } VariableExpressionAst variableAst = lastAstAtCursor as VariableExpressionAst; string str2 = (variableAst != null) ? CompletionCompleters.CombineVariableWithPartialPath(variableAst, tokenAtCursor.Text, completionContext.ExecutionContext) : null; if (str2 == null) { return(source); } completionContext.WordToComplete = str2; replacementIndex = lastAstAtCursor.Extent.StartScriptPosition.Offset; replacementLength += lastAstAtCursor.Extent.Text.Length; completionContext.ReplacementIndex = replacementIndex; completionContext.ReplacementLength = replacementLength; } else if (!(lastAstAtCursor is ErrorExpressionAst) || !(lastAstAtCursor.Parent is IndexExpressionAst)) { return(source); } } } if (!isQuotedString) { StringExpandableToken token2 = tokenAtCursor as StringExpandableToken; if (((token2 != null) && (token2.NestedTokens != null)) && (ast2 != null)) { try { string expandedString = null; ExpandableStringExpressionAst expandableStringAst = new ExpandableStringExpressionAst(ast2.Extent, ast2.Value, StringConstantType.BareWord); if (CompletionCompleters.IsPathSafelyExpandable(expandableStringAst, string.Empty, completionContext.ExecutionContext, out expandedString)) { completionContext.WordToComplete = expandedString; } else { return(source); } } catch (Exception exception) { CommandProcessorBase.CheckForSevereException(exception); return(source); } } source = CompleteFileNameAsCommand(completionContext); List <CompletionResult> collection = CompletionCompleters.CompleteCommand(completionContext); if ((collection != null) && (collection.Count > 0)) { source.AddRange(collection); } } return(source); } if (((tokenAtCursor.Text.Length == 1) && tokenAtCursor.Text[0].IsDash()) && (lastAst.Parent is CommandAst)) { if (isQuotedString) { return(source); } return(CompletionCompleters.CompleteCommandParameter(completionContext)); } TokenKind unknown = TokenKind.Unknown; bool flag = lastAst.Parent is MemberExpressionAst; bool @static = flag ? ((MemberExpressionAst)lastAst.Parent).Static : false; bool flag3 = false; if (!flag) { if (tokenAtCursor.Text.Equals(TokenKind.Dot.Text(), StringComparison.Ordinal)) { unknown = TokenKind.Dot; flag = true; } else if (tokenAtCursor.Text.Equals(TokenKind.ColonColon.Text(), StringComparison.Ordinal)) { unknown = TokenKind.ColonColon; flag = true; } else if (tokenAtCursor.Kind.Equals(TokenKind.Multiply) && (lastAst is BinaryExpressionAst)) { BinaryExpressionAst item = (BinaryExpressionAst)lastAst; MemberExpressionAst left = item.Left as MemberExpressionAst; IScriptExtent errorPosition = item.ErrorPosition; if (((left != null) && (item.Operator == TokenKind.Multiply)) && (errorPosition.StartOffset == left.Member.Extent.EndOffset)) { @static = left.Static; unknown = @static ? TokenKind.ColonColon : TokenKind.Dot; flag = true; flag3 = true; completionContext.RelatedAsts.Remove(item); completionContext.RelatedAsts.Add(left); StringConstantExpressionAst member = left.Member as StringConstantExpressionAst; if (member != null) { replacementIndex = member.Extent.StartScriptPosition.Offset; replacementLength += member.Extent.Text.Length; } } } } if (flag) { source = CompletionCompleters.CompleteMember(completionContext, @static || (unknown == TokenKind.ColonColon)); if (source.Any <CompletionResult>()) { if (!flag3 && (unknown != TokenKind.Unknown)) { replacementIndex += tokenAtCursor.Text.Length; replacementLength = 0; } return(source); } } if (lastAst.Parent is HashtableAst) { source = CompletionCompleters.CompleteHashtableKey(completionContext, (HashtableAst)lastAst.Parent); if ((source != null) && source.Any <CompletionResult>()) { return(source); } } if (!isQuotedString) { bool flag4 = false; if ((lastAst.Parent is FileRedirectionAst) || CompleteAgainstSwitchFile(lastAst, completionContext.TokenBeforeCursor)) { string str4 = CompletionCompleters.ConcatenateStringPathArguments(lastAst as CommandElementAst, string.Empty, completionContext); if (str4 != null) { flag4 = true; completionContext.WordToComplete = str4; } } else if (tokenAtCursor.Text.IndexOfAny(new char[] { '\\', '/' }) == 0) { CommandBaseAst parent = lastAst.Parent as CommandBaseAst; if ((parent != null) && parent.Redirections.Any <RedirectionAst>()) { FileRedirectionAst ast11 = parent.Redirections[0] as FileRedirectionAst; if (((ast11 != null) && (ast11.Extent.EndLineNumber == lastAst.Extent.StartLineNumber)) && (ast11.Extent.EndColumnNumber == lastAst.Extent.StartColumnNumber)) { string str5 = CompletionCompleters.ConcatenateStringPathArguments(ast11.Location, tokenAtCursor.Text, completionContext); if (str5 != null) { flag4 = true; completionContext.WordToComplete = str5; replacementIndex = ast11.Location.Extent.StartScriptPosition.Offset; replacementLength += ast11.Location.Extent.EndScriptPosition.Offset - replacementIndex; completionContext.ReplacementIndex = replacementIndex; completionContext.ReplacementLength = replacementLength; } } } } if (flag4) { return(new List <CompletionResult>(CompletionCompleters.CompleteFilename(completionContext))); } string str6 = CompletionCompleters.ConcatenateStringPathArguments(lastAst as CommandElementAst, string.Empty, completionContext); if (str6 != null) { completionContext.WordToComplete = str6; } source = CompletionCompleters.CompleteCommandArgument(completionContext); replacementIndex = completionContext.ReplacementIndex; replacementLength = completionContext.ReplacementLength; } return(source); }
public override AstVisitAction VisitExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst) { return(Visit(expandableStringExpressionAst)); }
public override AstVisitAction VisitExpandableStringExpression(ExpandableStringExpressionAst ast) { return(DoNextAction(ast)); }
public virtual TResult VisitExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst) => default(TResult);
public override ExpressionAst VisitExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst) => VisitExpression(base.VisitExpandableStringExpression(expandableStringExpressionAst));
public override AstVisitAction VisitExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst) { throw new NotImplementedException(); //VisitExpandableStringExpression(expandableStringExpressionAst); }
public object VisitExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst) { return(false); }
public override AstVisitAction VisitExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst) => VisitAst(expandableStringExpressionAst);