Browse Source

Added a method to determine the current parameter index.

newNRvisualizers
Mike Krüger 14 years ago
parent
commit
ba88599ec6
  1. 94
      ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs

94
ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs

@ -188,6 +188,100 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
} }
return result; return result;
} }
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;
}
/* /*
public override bool GetParameterCompletionCommandOffset (out int cpos) public override bool GetParameterCompletionCommandOffset (out int cpos)
{ {

Loading…
Cancel
Save