Browse Source

[Completion] GetCurrentParameterIndex can now identify the names of

the named parameters that are used as well.
newNRvisualizers
Mike Krüger 13 years ago
parent
commit
a12bfaf997
  1. 236
      ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs

236
ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs

@ -146,8 +146,15 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
return false; 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); char lastChar = document.GetCharAt (endOffset - 1);
if (lastChar == '(' || lastChar == '<') { if (lastChar == '(' || lastChar == '<') {
return 0; return 0;
@ -155,134 +162,145 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
var parameter = new Stack<int> (); var parameter = new Stack<int> ();
var bracketStack = new Stack<Stack<int>> (); var bracketStack = new Stack<Stack<int>> ();
bool inSingleComment = false, inString = false, inVerbatimString = false, inChar = false, inMultiLineComment = false; bool inSingleComment = false, inString = false, inVerbatimString = false, inChar = false, inMultiLineComment = false;
var word = new StringBuilder ();
for (int i = triggerOffset; i < endOffset; i++) { for (int i = triggerOffset; i < endOffset; i++) {
char ch = document.GetCharAt (i); char ch = document.GetCharAt (i);
char nextCh = i + 1 < document.TextLength ? document.GetCharAt (i + 1) : '\0'; 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) { switch (ch) {
case '{': case '{':
if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) { if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) {
break; break;
} }
bracketStack.Push (parameter); bracketStack.Push (parameter);
parameter = new Stack<int> (); parameter = new Stack<int> ();
break;
case '[':
case '(':
if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) {
break; break;
} case '[':
parameter.Push (0); case '(':
break; if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) {
case '}': break;
if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) { }
parameter.Push (0);
break; break;
} case '}':
if (bracketStack.Count > 0) { if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) {
parameter = bracketStack.Pop (); break;
} else { }
return -1; if (bracketStack.Count > 0) {
} parameter = bracketStack.Pop ();
break; } else {
case ']': return -1;
case ')': }
if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) {
break; break;
} case ']':
if (parameter.Count > 0) { case ')':
parameter.Pop (); if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) {
} else { break;
return -1; }
} if (parameter.Count > 0) {
break; parameter.Pop ();
case '<': } else {
if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) { return -1;
}
break; break;
} case '<':
parameter.Push (0); if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) {
break; break;
case '=': }
if (nextCh == '>') { parameter.Push (0);
i++;
continue;
}
break;
case '>':
if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) {
break; break;
} case '=':
if (parameter.Count > 0) { if (nextCh == '>') {
parameter.Pop (); i++;
} continue;
break; }
case ',':
if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) {
break; break;
} case '>':
if (parameter.Count > 0) { if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) {
parameter.Push (parameter.Pop () + 1); break;
} }
break; if (parameter.Count > 0) {
case '/': parameter.Pop ();
if (inString || inChar || inVerbatimString) { }
break; break;
} case ',':
if (nextCh == '/') { if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) {
i++; break;
inSingleComment = true; }
} if (parameter.Count > 0) {
if (nextCh == '*') { parameter.Push (parameter.Pop () + 1);
inMultiLineComment = true; }
}
break;
case '*':
if (inString || inChar || inVerbatimString || inSingleComment) {
break; break;
} case '/':
if (nextCh == '/') { if (inString || inChar || inVerbatimString) {
i++; break;
inMultiLineComment = false; }
} if (nextCh == '/') {
break; i++;
case '@': inSingleComment = true;
if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) { }
if (nextCh == '*') {
inMultiLineComment = true;
}
break; break;
} case '*':
if (nextCh == '"') { if (inString || inChar || inVerbatimString || inSingleComment) {
i++; break;
inVerbatimString = true; }
} if (nextCh == '/') {
break; i++;
case '\n': inMultiLineComment = false;
case '\r': }
inSingleComment = false;
inString = false;
inChar = false;
break;
case '\\':
if (inString || inChar) {
i++;
}
break;
case '"':
if (inSingleComment || inMultiLineComment || inChar) {
break; break;
} case '@':
if (inVerbatimString) { if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) {
break;
}
if (nextCh == '"') { if (nextCh == '"') {
i++; 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; break;
} }
inVerbatimString = false; if (inVerbatimString) {
if (nextCh == '"') {
i++;
break;
}
inVerbatimString = false;
break;
}
inString = !inString;
break; break;
} case '\'':
inString = !inString; if (inSingleComment || inMultiLineComment || inString || inVerbatimString) {
break; break;
case '\'': }
if (inSingleComment || inMultiLineComment || inString || inVerbatimString) { inChar = !inChar;
break; break;
}
inChar = !inChar;
break;
} }
} }
if (parameter.Count == 0 || bracketStack.Count > 0) { if (parameter.Count == 0 || bracketStack.Count > 0) {

Loading…
Cancel
Save