|
|
|
@ -146,8 +146,15 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
@@ -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<string> list; |
|
|
|
|
return GetCurrentParameterIndex (triggerOffset, endOffset, out list); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public int GetCurrentParameterIndex (int triggerOffset, int endOffset, out List<string> usedNamedParameters) |
|
|
|
|
{ |
|
|
|
|
usedNamedParameters =new List<string> (); |
|
|
|
|
char lastChar = document.GetCharAt (endOffset - 1); |
|
|
|
|
if (lastChar == '(' || lastChar == '<') { |
|
|
|
|
return 0; |
|
|
|
@ -155,134 +162,145 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
@@ -155,134 +162,145 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
|
|
|
|
|
var parameter = new Stack<int> (); |
|
|
|
|
var bracketStack = new Stack<Stack<int>> (); |
|
|
|
|
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<int> (); |
|
|
|
|
break; |
|
|
|
|
case '[': |
|
|
|
|
case '(': |
|
|
|
|
if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) { |
|
|
|
|
case '{': |
|
|
|
|
if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
bracketStack.Push (parameter); |
|
|
|
|
parameter = new Stack<int> (); |
|
|
|
|
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) { |
|
|
|
|