void AddVirtuals (CodeCompletionContext ctx, Dictionary<string, bool> alreadyInserted, CompletionDataList completionList, IType type, string modifiers, IReturnType curType)
{
if (curType == null)
return;
IType searchType = dom.SearchType (Document.CompilationUnit, type, new DomLocation (ctx.TriggerLine, ctx.TriggerLineOffset + 1), curType);
//System.Console.WriteLine("Add Virtuals for:" + searchType + " / " + curType);
if (searchType == null)
return;
bool isInterface = type.ClassType == ClassType.Interface;
bool includeOverriden = false;
int declarationBegin = ctx.TriggerOffset;
int j = declarationBegin;
for (int i = 0; i < 3; i++) {
switch (GetPreviousToken (ref j, true)) {
case "public":
case "protected":
case "private":
case "internal":
case "sealed":
case "override":
declarationBegin = j;
break;
case "static":
return; // don't add override completion for static members
}
}
CompletionDataCollector col = new CompletionDataCollector (dom, completionList, Document.CompilationUnit, searchType, DomLocation.Empty);
var inheritanceTree = new List<IType> (this.dom.GetInheritanceTree (searchType));
var sortedTree = inheritanceTree.Where (c => c.ClassType != ClassType.Interface).Concat (inheritanceTree.Where (c => c.ClassType == ClassType.Interface));
foreach (IType t in sortedTree) {
foreach (IMember m in t.Members) {
if (/*!m.IsAccessibleFrom (dom, type, type, true) ||*/ m.IsSpecialName)
continue;
//if (m.IsSpecialName || (m.IsInternal && !m.IsProtectedOrInternal) || && searchType.SourceProject != Document.Project)
// continue;
if (t.ClassType == ClassType.Interface || (isInterface || m.IsVirtual || m.IsAbstract) && !m.IsSealed && (includeOverriden || !type.HasOverriden (m))) {
// filter out the "Finalize" methods, because finalizers should be done with destructors.
if (m is IMethod && m.Name == "Finalize")
continue;
//System.Console.WriteLine("add");
NewOverrideCompletionData data = new NewOverrideCompletionData (dom, textEditorData, declarationBegin, type, m);
string text = CompletionDataCollector.ambience.GetString (m, OutputFlags.ClassBrowserEntries);
// check if the member is already implemented
bool foundMember = false;
foreach (IMember member in type.Members) {
if (text == CompletionDataCollector.ambience.GetString (member, OutputFlags.ClassBrowserEntries)) {
foundMember = true;
break;
}
}
if (!foundMember && !alreadyInserted.ContainsKey (text)) {
alreadyInserted[text] = true;
data.CompletionCategory = col.GetCompletionCategory (t);
completionList.Add (data);
}
}
}
}
}