diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs index c0da6aebb1..1eef7176fe 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs @@ -146,8 +146,15 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return false; } - public int GetCurrentParameterIndex (int triggerOffset, int endOffset) + public int GetCurrentParameterIndex(int triggerOffset, int endOffset) { + List list; + return GetCurrentParameterIndex (triggerOffset, endOffset, out list); + } + + public int GetCurrentParameterIndex (int triggerOffset, int endOffset, out List usedNamedParameters) + { + usedNamedParameters =new List (); char lastChar = document.GetCharAt (endOffset - 1); if (lastChar == '(' || lastChar == '<') { return 0; @@ -155,134 +162,145 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var parameter = new Stack (); var bracketStack = new Stack> (); bool inSingleComment = false, inString = false, inVerbatimString = false, inChar = false, inMultiLineComment = false; + var word = new StringBuilder (); for (int i = triggerOffset; i < endOffset; i++) { char ch = document.GetCharAt (i); char nextCh = i + 1 < document.TextLength ? document.GetCharAt (i + 1) : '\0'; + if (ch == ':') { + usedNamedParameters.Add (word.ToString ()); + word.Length = 0; + } else if (char.IsLetterOrDigit (ch) || ch =='_') { + word.Append (ch); + } else if (char.IsWhiteSpace (ch)) { + + } else { + word.Length = 0; + } switch (ch) { - case '{': - if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) { - break; - } - bracketStack.Push (parameter); - parameter = new Stack (); - break; - case '[': - case '(': - if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) { + case '{': + if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) { + break; + } + bracketStack.Push (parameter); + parameter = new Stack (); break; - } - parameter.Push (0); - break; - case '}': - if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) { + case '[': + case '(': + if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) { + break; + } + parameter.Push (0); break; - } - if (bracketStack.Count > 0) { - parameter = bracketStack.Pop (); - } else { - return -1; - } - break; - case ']': - case ')': - if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) { + case '}': + if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) { + break; + } + if (bracketStack.Count > 0) { + parameter = bracketStack.Pop (); + } else { + return -1; + } break; - } - if (parameter.Count > 0) { - parameter.Pop (); - } else { - return -1; - } - break; - case '<': - if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) { + case ']': + case ')': + if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) { + break; + } + if (parameter.Count > 0) { + parameter.Pop (); + } else { + return -1; + } break; - } - parameter.Push (0); - break; - case '=': - if (nextCh == '>') { - i++; - continue; - } - break; - case '>': - if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) { + case '<': + if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) { + break; + } + parameter.Push (0); break; - } - if (parameter.Count > 0) { - parameter.Pop (); - } - break; - case ',': - if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) { + case '=': + if (nextCh == '>') { + i++; + continue; + } break; - } - if (parameter.Count > 0) { - parameter.Push (parameter.Pop () + 1); - } - break; - case '/': - if (inString || inChar || inVerbatimString) { + case '>': + if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) { + break; + } + if (parameter.Count > 0) { + parameter.Pop (); + } break; - } - if (nextCh == '/') { - i++; - inSingleComment = true; - } - if (nextCh == '*') { - inMultiLineComment = true; - } - break; - case '*': - if (inString || inChar || inVerbatimString || inSingleComment) { + case ',': + if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) { + break; + } + if (parameter.Count > 0) { + parameter.Push (parameter.Pop () + 1); + } break; - } - if (nextCh == '/') { - i++; - inMultiLineComment = false; - } - break; - case '@': - if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) { + case '/': + if (inString || inChar || inVerbatimString) { + break; + } + if (nextCh == '/') { + i++; + inSingleComment = true; + } + if (nextCh == '*') { + inMultiLineComment = true; + } break; - } - if (nextCh == '"') { - i++; - inVerbatimString = true; - } - break; - case '\n': - case '\r': - inSingleComment = false; - inString = false; - inChar = false; - break; - case '\\': - if (inString || inChar) { - i++; - } - break; - case '"': - if (inSingleComment || inMultiLineComment || inChar) { + case '*': + if (inString || inChar || inVerbatimString || inSingleComment) { + break; + } + if (nextCh == '/') { + i++; + inMultiLineComment = false; + } break; - } - if (inVerbatimString) { + case '@': + if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) { + break; + } if (nextCh == '"') { i++; + inVerbatimString = true; + } + break; + case '\n': + case '\r': + inSingleComment = false; + inString = false; + inChar = false; + break; + case '\\': + if (inString || inChar) { + i++; + } + break; + case '"': + if (inSingleComment || inMultiLineComment || inChar) { break; } - inVerbatimString = false; + if (inVerbatimString) { + if (nextCh == '"') { + i++; + break; + } + inVerbatimString = false; + break; + } + inString = !inString; break; - } - inString = !inString; - break; - case '\'': - if (inSingleComment || inMultiLineComment || inString || inVerbatimString) { + case '\'': + if (inSingleComment || inMultiLineComment || inString || inVerbatimString) { + break; + } + inChar = !inChar; break; - } - inChar = !inChar; - break; } } if (parameter.Count == 0 || bracketStack.Count > 0) {