Browse Source

[Completion] GetParameterCompletionCommandOffset is now

reusable/removed code duplication of GetCurrentParameterIndex.
newNRvisualizers
mike 14 years ago
parent
commit
49e1b67a3a
  1. 2
      ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs
  2. 168
      ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs
  3. 139
      ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs

2
ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs

@ -428,7 +428,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
if (!GetParameterCompletionCommandOffset(out cpos)) { if (!GetParameterCompletionCommandOffset(out cpos)) {
break; break;
} }
int currentParameter = GetCurrentParameterIndex(cpos, 0) - 1; int currentParameter = GetCurrentParameterIndex(cpos - 1, this.offset) - 1;
if (currentParameter < 0) { if (currentParameter < 0) {
return null; return null;
} }

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

@ -91,7 +91,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
set; set;
} }
protected void SetOffset (int offset) public void SetOffset (int offset)
{ {
Reset (); Reset ();
@ -101,7 +101,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
provider.GetCurrentMembers (offset, out currentType, out currentMember); provider.GetCurrentMembers (offset, out currentType, out currentMember);
} }
protected bool GetParameterCompletionCommandOffset(out int cpos) public bool GetParameterCompletionCommandOffset (out int cpos)
{ {
// Start calculating the parameter offset from the beginning of the // Start calculating the parameter offset from the beginning of the
// current member, instead of the beginning of the file. // current member, instead of the beginning of the file.
@ -131,7 +131,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
chevronDepth = 0; chevronDepth = 0;
} }
if (indexStack.Count == 0 && (parenDepth == 0 && c == '(' || chevronDepth == 0 && c == '<')) { if (indexStack.Count == 0 && (parenDepth == 0 && c == '(' || chevronDepth == 0 && c == '<')) {
int p = GetCurrentParameterIndex (cpos + 1, startPos); int p = GetCurrentParameterIndex (startPos, cpos + 1);
if (p != -1) { if (p != -1) {
cpos++; cpos++;
return true; return true;
@ -154,94 +154,144 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
return false; return false;
} }
protected int GetCurrentParameterIndex (int offset, int memberStart) public int GetCurrentParameterIndex (int triggerOffset, int endOffset)
{ {
int cursor = this.offset; char lastChar = document.GetCharAt (endOffset - 1);
int i = offset; if (lastChar == '(' || lastChar == '<') {
return 0;
if (i > cursor) { }
var parameter = new Stack<int> ();
var bracketStack = new Stack<Stack<int>> ();
bool inSingleComment = false, inString = false, inVerbatimString = false, inChar = false, inMultiLineComment = false;
for (int i = triggerOffset; i < endOffset; i++) {
char ch = document.GetCharAt (i);
char nextCh = i + 1 < document.TextLength ? document.GetCharAt (i + 1) : '\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) {
break;
}
parameter.Push (0);
break;
case '}':
if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) {
break;
}
if (bracketStack.Count > 0) {
parameter = bracketStack.Pop ();
} else {
return -1; return -1;
} }
if (i == cursor) { break;
return 1; case ']':
case ')':
if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) {
break;
} }
// parameters are 1 based if (parameter.Count > 0) {
int index = memberStart + 1; parameter.Pop ();
int parentheses = 0; } else {
int bracket = 0; return -1;
bool insideQuote = false, insideString = false, insideSingleLineComment = false, insideMultiLineComment = false;
Stack<int> indexStack = new Stack<int> ();
do {
char c = document.GetCharAt (i - 1);
switch (c) {
case '\\':
if (insideString || insideQuote) {
i++;
} }
break; break;
case '\'': case '<':
if (!insideString && !insideSingleLineComment && !insideMultiLineComment) { if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) {
insideQuote = !insideQuote; break;
} }
parameter.Push (0);
break; break;
case '"': case '>':
if (!insideQuote && !insideSingleLineComment && !insideMultiLineComment) { if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) {
insideString = !insideString; 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; break;
case '/': case '/':
if (!insideQuote && !insideString && !insideMultiLineComment) { if (inString || inChar || inVerbatimString) {
if (document.GetCharAt (i) == '/') { break;
insideSingleLineComment = true;
} }
if (document.GetCharAt (i) == '*') { if (nextCh == '/') {
insideMultiLineComment = true; i++;
inSingleComment = true;
} }
if (nextCh == '*') {
inMultiLineComment = true;
} }
break; break;
case '*': case '*':
if (insideMultiLineComment && document.GetCharAt (i) == '/') { if (inString || inChar || inVerbatimString || inSingleComment) {
insideMultiLineComment = false; break;
}
if (nextCh == '/') {
i++;
inMultiLineComment = false;
}
break;
case '@':
if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) {
break;
}
if (nextCh == '"') {
i++;
inVerbatimString = true;
} }
break; break;
case '\n': case '\n':
case '\r': case '\r':
insideSingleLineComment = false; inSingleComment = false;
inString = false;
inChar = false;
break; break;
case '{': case '\\':
if (!insideQuote && !insideString && !insideSingleLineComment && !insideMultiLineComment) { if (inString || inChar) {
bracket++; i++;
indexStack.Push (index);
} }
break; break;
case '}': case '"':
if (!insideQuote && !insideString && !insideSingleLineComment && !insideMultiLineComment) { if (inSingleComment || inMultiLineComment || inChar) {
bracket--; break;
if (indexStack.Count > 0)
index = indexStack.Pop ();
} }
if (inVerbatimString) {
if (nextCh == '"') {
i++;
break; break;
case '(':
if (!insideQuote && !insideString && !insideSingleLineComment && !insideMultiLineComment) {
parentheses++;
} }
inVerbatimString = false;
break; break;
case ')':
if (!insideQuote && !insideString && !insideSingleLineComment && !insideMultiLineComment) {
parentheses--;
} }
inString = !inString;
break;
case '\'':
if (inSingleComment || inMultiLineComment || inString || inVerbatimString) {
break; break;
case ',':
if (!insideQuote && !insideString && !insideSingleLineComment && !insideMultiLineComment && parentheses == 1 && bracket == 0) {
index++;
} }
inChar = !inChar;
break; break;
} }
i++; }
} while (i <= cursor && parentheses >= 0); if (parameter.Count == 0 || bracketStack.Count > 0) {
Console.WriteLine (indexStack.Count >= 0 || parentheses != 1 || bracket > 0 ? -1 : index); return -1;
return indexStack.Count >= 0 || parentheses != 1 || bracket > 0 ? -1 : index; }
return parameter.Pop() + 1;
} }
#region Context helper methods #region Context helper methods

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

@ -335,144 +335,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
return result; return result;
} }
public int GetCurrentParameterIndex(int triggerOffset, int endOffset)
{
char lastChar = document.GetCharAt(endOffset - 1);
if (lastChar == '(' || lastChar == '<') {
return 0;
}
var parameter = new Stack<int>();
var bracketStack = new Stack<Stack<int>>();
bool inSingleComment = false, inString = false, inVerbatimString = false, inChar = false, inMultiLineComment = false;
for (int i = triggerOffset; i < endOffset; i++) {
char ch = document.GetCharAt(i);
char nextCh = i + 1 < document.TextLength ? document.GetCharAt(i + 1) : '\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) {
break;
}
parameter.Push(0);
break;
case '}':
if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) {
break;
}
if (bracketStack.Count > 0) {
parameter = bracketStack.Pop();
} else {
return -1;
}
break;
case ']':
case ')':
if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) {
break;
}
if (parameter.Count > 0) {
parameter.Pop();
} else {
return -1;
}
break;
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 || bracketStack.Count > 0) {
return -1;
}
return parameter.Pop() + 1;
}
} }
} }

Loading…
Cancel
Save