diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs index 493e5866d2..5bc8eafb4b 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs @@ -188,6 +188,100 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } return result; } + + public int GetCurrentParameterIndex (int triggerOffset) + { + SetOffset (triggerOffset); + var text = GetMemberTextToCaret (); + var parameter = new Stack (); + + bool inSingleComment = false, inString = false, inVerbatimString = false, inChar = false, inMultiLineComment = false; + + for (int i = 0; i < text.Item1.Length; i++) { + char ch = text.Item1 [i]; + char nextCh = i + 1 < text.Item1.Length ? text.Item1 [i + 1] : '\0'; + + switch (ch) { + case '(': + if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) + break; + parameter.Push (0); + break; + case ')': + if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) + break; + if (parameter.Count > 0) + parameter.Pop (); + break; + case ',': + if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) + break; + if (parameter.Count > 0) + parameter.Push (parameter.Pop () + 1); + break; + case '/': + if (inString || inChar || inVerbatimString) + break; + if (nextCh == '/') { + i++; + inSingleComment = true; + } + if (nextCh == '*') + inMultiLineComment = true; + break; + case '*': + if (inString || inChar || inVerbatimString || inSingleComment) + break; + if (nextCh == '/') { + i++; + inMultiLineComment = false; + } + break; + 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; + if (inVerbatimString) { + if (nextCh == '"') { + i++; + break; + } + inVerbatimString = false; + break; + } + inString = !inString; + break; + case '\'': + if (inSingleComment || inMultiLineComment || inString || inVerbatimString) + break; + inChar = !inChar; + break; + } + } + if (parameter.Count == 0) + return -1; + if (text.Item1.EndsWith ("(")) + return 1; + return parameter.Pop () + 1; + } + /* public override bool GetParameterCompletionCommandOffset (out int cpos) {