public override void InsertCompletionText(CompletionListWindow window, ref KeyActions ka, Gdk.Key closeChar, char keyChar, Gdk.ModifierType modifier) { var ext = engine.Ext; var editor = ext.TextEditorData; var generator = CodeGenerator.CreateGenerator(ext.Document); if (ext.Project != null) { generator.PolicyParent = ext.Project.Policies; } var builder = engine.MDRefactoringCtx.CreateTypeSystemAstBuilder(); string sb = BaseExportCodeGenerator.GenerateMemberCode(engine.MDRefactoringCtx, builder, member); sb = sb.TrimEnd(); string indent = editor.GetIndentationString(editor.Caret.Location); sb = sb.Replace(editor.EolMarker, editor.EolMarker + indent); int targetCaretPosition = sb.LastIndexOf("throw", StringComparison.Ordinal); int selectionEndPosition = sb.LastIndexOf(";", StringComparison.Ordinal); editor.Replace(declarationBegin, editor.Caret.Offset - declarationBegin, sb); if (selectionEndPosition > 0) { targetCaretPosition += declarationBegin; selectionEndPosition += declarationBegin; editor.Caret.Offset = selectionEndPosition; editor.SetSelection(targetCaretPosition, selectionEndPosition); } }
protected override void AddVirtuals(List <IMember> alreadyInserted, CompletionDataWrapper col, string modifiers, IType curType, int declarationBegin) { base.AddVirtuals(alreadyInserted, col, modifiers, curType, declarationBegin); foreach (var member in GetProtocolMembers(curType)) { if (alreadyInserted.Contains(member)) { continue; } if (BaseExportCodeGenerator.IsImplemented(curType, member)) { continue; } alreadyInserted.Add(member); var data = new ProtocolCompletionData(this, declarationBegin, member); col.Add(data); } }
IEnumerable <IMember> GetProtocolMembers(IType curType) { foreach (var t in curType.DirectBaseTypes) { string name; if (!BaseExportCodeGenerator.HasProtocolAttribute(t, out name)) { continue; } var protocolType = Compilation.FindType(new FullTypeName(new TopLevelTypeName(t.Namespace, name))); if (protocolType == null) { break; } foreach (var member in protocolType.GetMethods(null, GetMemberOptions.IgnoreInheritedMembers)) { if (member.ImplementedInterfaceMembers.Any() || member.IsAbstract || !member.IsVirtual) { continue; } if (member.Attributes.Any(a => a.AttributeType.Name == "ExportAttribute" && a.AttributeType.Namespace == "MonoTouch.Foundation")) { yield return(member); } } foreach (var member in protocolType.GetProperties(null, GetMemberOptions.IgnoreInheritedMembers)) { if (member.ImplementedInterfaceMembers.Any() || member.IsAbstract || !member.IsVirtual) { continue; } if (member.CanGet && member.Getter.Attributes.Any(a => a.AttributeType.Name == "ExportAttribute" && a.AttributeType.Namespace == "MonoTouch.Foundation") || member.CanSet && member.Setter.Attributes.Any(a => a.AttributeType.Name == "ExportAttribute" && a.AttributeType.Namespace == "MonoTouch.Foundation")) { yield return(member); } } } }