diff options
author | Mike Krüger <mkrueger@xamarin.com> | 2011-11-09 16:58:29 +0400 |
---|---|---|
committer | Mike Krüger <mkrueger@xamarin.com> | 2011-11-09 16:58:29 +0400 |
commit | 767cd548c6d6dbe99ab20d5fffedb155a4476929 (patch) | |
tree | 51d7b712b6067adef7e6484a493a0edeb33dd9a3 /main/contrib | |
parent | 96d8d1edbbaf66f985d1d150e308499b3f0c5c0c (diff) |
Fixed "Bug 1914 - [New Resolver] Annoying parameters tooltip behavior
when typing a string".
Diffstat (limited to 'main/contrib')
-rw-r--r-- | main/contrib/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/main/contrib/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs b/main/contrib/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs index 493e5866d2..fdb57190a7 100644 --- a/main/contrib/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs +++ b/main/contrib/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs @@ -226,6 +226,100 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } return false; }*/ + + public int GetCurrentParameterIndex (int triggerOffset) + { + SetOffset (triggerOffset); + var text = GetMemberTextToCaret (); + var parameter = new Stack<int> (); + + 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; + } + } } |