private string FindTypeForThis(int startAtPos)
{
if (_fixedTypeForThisKeyword != null)
{
return _fixedTypeForThisKeyword;
}
int lineNumber = scintillaControl1.LineFromPosition(startAtPos) - 1;
int searchBackUntil = (lineNumber > SCAN_BACK_DISTANCE) ? lineNumber - SCAN_BACK_DISTANCE : 0;
while (lineNumber > searchBackUntil)
{
string lineText = scintillaControl1.GetLine(lineNumber);
int structNameEnd = lineText.IndexOf("::");
if (structNameEnd >= 0)
{
int structNameStart = structNameEnd - 1;
while ((structNameStart >= 0) && (Char.IsLetterOrDigit(lineText[structNameStart]) || (lineText[structNameStart] == '_')))
{
structNameStart--;
}
structNameStart++;
return lineText.Substring(structNameStart, structNameEnd - structNameStart);
}
int extenderFunction = lineText.IndexOf("(this ");
if (extenderFunction >= 0)
{
int structNameStart = extenderFunction + 5;
while (lineText[structNameStart] == ' ')
{
structNameStart++;
}
structNameEnd = structNameStart + 1;
while (Char.IsLetterOrDigit(lineText[structNameEnd]))
{
structNameEnd++;
}
return lineText.Substring(structNameStart, structNameEnd - structNameStart);
}
if (lineText.IndexOf("function ") >= 0)
{
// we're in a function that wasn't a struct member
break;
}
lineNumber--;
}
return string.Empty;
}