private static CommandCompletion CompleteInputImpl(Ast ast, Token[] tokens, IScriptPosition positionOfCursor, Hashtable options) { PowerShell powershell = PowerShell.Create(RunspaceMode.CurrentRunspace); int replacementIndex = -1; int replacementLength = -1; List <CompletionResult> list = null; if (NeedToInvokeLegacyTabExpansion(powershell)) { Tuple <string, int, int> inputAndCursorFromAst = GetInputAndCursorFromAst(positionOfCursor); list = InvokeLegacyTabExpansion(powershell, inputAndCursorFromAst.Item1, inputAndCursorFromAst.Item2, false, out replacementIndex, out replacementLength); replacementIndex += inputAndCursorFromAst.Item3; } if ((list == null) || (list.Count == 0)) { ExecutionContext executionContextFromTLS = LocalPipeline.GetExecutionContextFromTLS(); MutableTuple tuple2 = null; foreach (CallStackFrame frame in executionContextFromTLS.Debugger.GetCallStack()) { dynamic obj2 = PSObject.AsPSObject(frame); var site1 = CallSite <Func <CallSite, object, bool> > .Create(Binder.UnaryOperation(CSharpBinderFlags.None, ExpressionType.IsTrue, typeof(CommandCompletion), new CSharpArgumentInfo[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) })); if (site1.Target(site1, obj2.Command.Equals("TabExpansion2", StringComparison.OrdinalIgnoreCase))) { tuple2 = frame.FunctionContext._localsTuple; break; } } SessionStateScope currentScope = null; if (tuple2 != null) { currentScope = executionContextFromTLS.EngineSessionState.CurrentScope; SessionStateScope parent = executionContextFromTLS.EngineSessionState.CurrentScope; while ((parent != null) && (parent.LocalsTuple != tuple2)) { parent = parent.Parent; } if (parent != null) { executionContextFromTLS.EngineSessionState.CurrentScope = parent.Parent; } } try { list = new CompletionAnalysis(ast, tokens, positionOfCursor, options).GetResults(powershell, out replacementIndex, out replacementLength); } finally { if (currentScope != null) { executionContextFromTLS.EngineSessionState.CurrentScope = currentScope; } } } return(new CommandCompletion(new Collection <CompletionResult>(list ?? EmptyCompletionResult), -1, replacementIndex, replacementLength)); }
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); }
private List<CompletionResult> GetResultForString(CompletionContext completionContext, ref int replacementIndex, ref int replacementLength, bool isQuotedString) { // When it's the content of a quoted string, we only handle variable/member completion if (isQuotedString) { return null; } var tokenAtCursor = completionContext.TokenAtCursor; var lastAst = completionContext.RelatedAsts.Last(); List<CompletionResult> result = null; var expandableString = lastAst as ExpandableStringExpressionAst; var constantString = lastAst as StringConstantExpressionAst; if (constantString == null && expandableString == null) { return null; } string strValue = constantString != null ? constantString.Value : expandableString.Value; StringConstantType strType = constantString != null ? constantString.StringConstantType : expandableString.StringConstantType; string subInput = null; bool shouldContinue; result = GetResultForEnumPropertyValueOfDSCResource(completionContext, strValue, ref replacementIndex, ref replacementLength, out shouldContinue); if (!shouldContinue || (result != null && result.Count > 0)) { return result; } if (strType == StringConstantType.DoubleQuoted) { var match = Regex.Match(strValue, @"(\$[\w\d]+\.[\w\d\*]*)$"); if (match.Success) { subInput = match.Groups[1].Value; } else if ((match = Regex.Match(strValue, @"(\[[\w\d\.]+\]::[\w\d\*]*)$")).Success) { subInput = match.Groups[1].Value; } } // Handle variable/member completion if (subInput != null) { int stringStartIndex = tokenAtCursor.Extent.StartScriptPosition.Offset; int cursorIndexInString = _cursorPosition.Offset - stringStartIndex - 1; if (cursorIndexInString >= strValue.Length) cursorIndexInString = strValue.Length; var analysis = new CompletionAnalysis(_ast, _tokens, _cursorPosition, _options); var subContext = analysis.CreateCompletionContext(completionContext.ExecutionContext); subContext.Helper = completionContext.Helper; int subReplaceIndex, subReplaceLength; var subResult = analysis.GetResultHelper(subContext, out subReplaceIndex, out subReplaceLength, true); if (subResult != null && subResult.Count > 0) { result = new List<CompletionResult>(); replacementIndex = stringStartIndex + 1 + (cursorIndexInString - subInput.Length); replacementLength = subInput.Length; string prefix = subInput.Substring(0, subReplaceIndex); foreach (CompletionResult entry in subResult) { string completionText = prefix + entry.CompletionText; if (entry.ResultType == CompletionResultType.Property) { completionText = TokenKind.DollarParen.Text() + completionText + TokenKind.RParen.Text(); } else if (entry.ResultType == CompletionResultType.Method) { completionText = TokenKind.DollarParen.Text() + completionText; } completionText += "\""; result.Add(new CompletionResult(completionText, entry.ListItemText, entry.ResultType, entry.ToolTip)); } } } else { var commandElementAst = lastAst as CommandElementAst; string wordToComplete = CompletionCompleters.ConcatenateStringPathArguments(commandElementAst, string.Empty, completionContext); if (wordToComplete != null) { completionContext.WordToComplete = wordToComplete; // Handle scenarios like this: cd 'c:\windows\win'<tab> if (lastAst.Parent is CommandAst || lastAst.Parent is CommandParameterAst) { result = CompletionCompleters.CompleteCommandArgument(completionContext); replacementIndex = completionContext.ReplacementIndex; replacementLength = completionContext.ReplacementLength; } // Hanlde scenarios like this: "c:\wind"<tab>. Treat the StringLiteral/StringExpandable as path/command else { // Handle path/commandname completion for quoted string result = new List<CompletionResult>(CompletionCompleters.CompleteFilename(completionContext)); // Try command name completion only if the text contains '-' if (wordToComplete.IndexOf('-') != -1) { var commandNameResult = CompletionCompleters.CompleteCommand(completionContext); if (commandNameResult != null && commandNameResult.Count > 0) { result.AddRange(commandNameResult); } } } } } return result; }
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; }