async Task <string> Test(string input, string type, string member, Gdk.Key key = Gdk.Key.Return, bool isDelegateExpected = false)
        {
            var s = await Setup(input);

            var             ext     = s.Item1;
            TestViewContent content = s.Item2;

            var listWindow = new CompletionListWindow();
            var widget     = new TestCompletionWidget(ext.Editor, ext.DocumentContext);

            listWindow.CompletionWidget      = widget;
            listWindow.CodeCompletionContext = widget.CurrentCodeCompletionContext;
            var model = await ext.DocumentContext.AnalysisDocument.GetSemanticModelAsync();

            DefaultSourceEditorOptions.Instance.AutoInsertMatchingBracket = true;

            var t = model.Compilation.GetTypeByMetadataName(type);

            var method = member != null?model.LookupSymbols(s.Item1.Editor.CaretOffset).OfType <IMethodSymbol> ().First(m => m.Name == member) : t.GetMembers().OfType <IMethodSymbol> ().First(m => m.MethodKind == MethodKind.Constructor);

            var factory = new RoslynCodeCompletionFactory(ext, model);
            var data    = new RoslynSymbolCompletionData(null, factory, method);

            data.IsDelegateExpected = isDelegateExpected;
            KeyActions ka = KeyActions.Process;

            data.InsertCompletionText(listWindow, ref ka, KeyDescriptor.FromGtk(key, (char)key, Gdk.ModifierType.None));

            return(widget.CompletedWord);
        }
Exemplo n.º 2
0
        public virtual void RunShowCodeTemplatesWindow()
        {
            ICompletionDataList completionList = null;
            int cpos, wlen;

            if (!GetCompletionCommandOffset(out cpos, out wlen))
            {
                cpos = Editor.Caret.Offset;
                wlen = 0;
            }

            var ctx = CompletionWidget.CreateCodeCompletionContext(cpos);

            ctx.TriggerWordLength = wlen;
            completionList        = Document.Editor.IsSomethingSelected ? ShowCodeSurroundingsCommand(ctx) : ShowCodeTemplatesCommand(ctx);
            if (completionList == null)
            {
                return;
            }
            var wnd = new CompletionListWindow(Gtk.WindowType.Toplevel);

            wnd.TypeHint        = Gdk.WindowTypeHint.Dialog;
            wnd.SkipPagerHint   = true;
            wnd.SkipTaskbarHint = true;
            wnd.Decorated       = false;
            wnd.Extension       = this;
            wnd.ShowListWindow((char)0, completionList, CompletionWidget, ctx);
        }
        public async Task TestBug60365()
        {
            var             tww     = new TestWorkbenchWindow();
            TestViewContent content = new TestViewContent();

            tww.ViewContent       = content;
            content.ContentName   = "/a.cs";
            content.Data.MimeType = "text/x-csharp";

            var doc = new MonoDevelop.Ide.Gui.Document(tww);

            var text   = "@c$";
            int endPos = text.IndexOf('$');

            if (endPos >= 0)
            {
                text = text.Substring(0, endPos) + text.Substring(endPos + 1);
            }

            content.Text           = text;
            content.CursorPosition = System.Math.Max(0, endPos);

            var project = MonoDevelop.Projects.Services.ProjectService.CreateProject("C#");

            project.Name     = "test";
            project.FileName = "test.csproj";
            project.Files.Add(new ProjectFile(content.ContentName, BuildAction.Compile));

            var solution = new MonoDevelop.Projects.Solution();

            solution.AddConfiguration("", true);
            solution.DefaultSolutionFolder.AddItem(project);
            using (var monitor = new ProgressMonitor())
                await TypeSystemService.Load(solution, monitor);
            content.Project = project;
            doc.SetProject(project);

            var ext = new CSharpCompletionTextEditorExtension();

            ext.Initialize(doc.Editor, doc);
            var listWindow = new CompletionListWindow();
            var widget     = new TestCompletionWidget(ext.Editor, ext.DocumentContext);

            listWindow.CompletionWidget      = widget;
            listWindow.CodeCompletionContext = widget.CurrentCodeCompletionContext;

            var list = await ext.HandleCodeCompletionAsync(widget.CurrentCodeCompletionContext, new CompletionTriggerInfo (CompletionTriggerReason.CharTyped, 'c'));

            var ka = KeyActions.Complete;

            list.First(d => d.CompletionText == "class").InsertCompletionText(listWindow, ref ka, KeyDescriptor.Tab);

            Assert.AreEqual("@class", content.Text);

            content.Contents.Add(ext);

            await doc.UpdateParseDocument();

            TypeSystemService.Unload(solution);
        }
        public override void InsertCompletionText(CompletionListWindow window, ref KeyActions ka, Gdk.Key closeChar, char keyChar, Gdk.ModifierType modifier)
        {
            MonoDevelop.Ide.Gui.Content.IEditableTextBuffer buf = window.CompletionWidget as MonoDevelop.Ide.Gui.Content.IEditableTextBuffer;
            if (buf != null)
            {
                using (var undo = buf.OpenUndoGroup()) {
                    int deleteStartOffset = window.CodeCompletionContext.TriggerOffset;
                    if (text.StartsWith(docTypeStart))
                    {
                        int start = window.CodeCompletionContext.TriggerOffset - docTypeStart.Length;
                        if (start >= 0)
                        {
                            string readback = buf.GetText(start, window.CodeCompletionContext.TriggerOffset);
                            if (string.Compare(readback, docTypeStart, StringComparison.OrdinalIgnoreCase) == 0)
                            {
                                deleteStartOffset -= docTypeStart.Length;
                            }
                        }
                    }

                    buf.DeleteText(deleteStartOffset, buf.CursorPosition - deleteStartOffset);
                    buf.InsertText(buf.CursorPosition, text);
                }
            }
        }
        public virtual void RunShowCodeTemplatesWindow()
        {
            Editor.EnsureCaretIsNotVirtual();
            ICompletionDataList completionList = null;
            int cpos, wlen;

            if (!GetCompletionCommandOffset(out cpos, out wlen))
            {
                cpos = Editor.CaretOffset;
                wlen = 0;
            }

            var ctx = CompletionWidget.CreateCodeCompletionContext(cpos);

            ctx.TriggerWordLength = wlen;
            completionList        = Editor.IsSomethingSelected ? ShowCodeSurroundingsCommand(ctx) : ShowCodeTemplatesCommand(ctx);
            if (completionList == null)
            {
                return;
            }
            var wnd = CompletionListWindow.CreateAsDialog();

            wnd.Extension = this;
            wnd.ShowListWindow((char)0, completionList, CompletionWidget, ctx);
        }
Exemplo n.º 6
0
        public override void InsertCompletionText(CompletionListWindow window, ref KeyActions ka, KeyDescriptor descriptor)
        {
            var document = IdeApp.Workbench.ActiveDocument;
            var editor   = document?.Editor;

            if (editor == null || completionService == null)
            {
                base.InsertCompletionText(window, ref ka, descriptor);
                return;
            }
            var completionChange = completionService.GetChangeAsync(doc, CompletionItem, null, default(CancellationToken)).WaitAndGetResult(default(CancellationToken));

            var currentBuffer = editor.GetPlatformTextBuffer();
            var textChange    = completionChange.TextChange;

            var triggerSnapshotSpan = new SnapshotSpan(triggerSnapshot, new Span(textChange.Span.Start, textChange.Span.Length));

            var mappedSpan = triggerSnapshotSpan.TranslateTo(triggerSnapshot.TextBuffer.CurrentSnapshot, SpanTrackingMode.EdgeInclusive);

            triggerSnapshot.TextBuffer.Replace(mappedSpan, completionChange.TextChange.NewText);
//			editor.ReplaceText (mappedSpan.Start, mappedSpan.Length, completionChange.TextChange.NewText);

            if (completionChange.NewPosition.HasValue)
            {
                editor.CaretOffset = completionChange.NewPosition.Value;
            }

            if (CompletionItem.Rules.FormatOnCommit)
            {
                var endOffset = mappedSpan.Start + completionChange.TextChange.NewText.Length;
                Format(editor, document, mappedSpan.Start, endOffset);
            }
        }
        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);
            }
        }
Exemplo n.º 8
0
        public override void InsertCompletionText(CompletionListWindow window)
        {
            MonoDevelop.Ide.Gui.Content.IEditableTextBuffer buf = window.CompletionWidget as MonoDevelop.Ide.Gui.Content.IEditableTextBuffer;
            if (buf != null)
            {
                buf.BeginAtomicUndo();

                int deleteStartOffset = window.CodeCompletionContext.TriggerOffset;
                if (text.StartsWith(docTypeStart))
                {
                    int start = window.CodeCompletionContext.TriggerOffset - docTypeStart.Length;
                    if (start >= 0)
                    {
                        string readback = buf.GetText(start, window.CodeCompletionContext.TriggerOffset);
                        if (string.Compare(readback, docTypeStart, StringComparison.OrdinalIgnoreCase) == 0)
                        {
                            deleteStartOffset -= docTypeStart.Length;
                        }
                    }
                }

                buf.DeleteText(deleteStartOffset, buf.CursorPosition - deleteStartOffset);
                buf.InsertText(buf.CursorPosition, text);
                buf.EndAtomicUndo();
            }
        }
        public override void InsertCompletionText(CompletionListWindow window, ref KeyActions ka, Gdk.Key closeChar, char keyChar, Gdk.ModifierType modifier)
        {
            // insert add/remove event handler code after +=/-=
            editor.Replace(initialOffset, editor.Caret.Offset - initialOffset, this.DisplayText + (AddSemicolon ? ";" : ""));

            // Search opening bracket of member
            int pos = callingMember != null?editor.Document.LocationToOffset(callingMember.BodyRegion.Start.Line, callingMember.BodyRegion.Start.Column) : initialOffset;

            while (pos < editor.Document.Length && editor.Document.GetCharAt(pos) != '{')
            {
                pos++;
            }

            // Search closing bracket of member
            pos = editor.Document.GetMatchingBracketOffset(pos) + 1;

            pos = Math.Max(0, Math.Min(pos, editor.Document.Length - 1));

            // Insert new event handler after closing bracket
            string indent = editor.Document.GetLine(callingMember.Location.Line).GetIndentation(editor.Document);

            StringBuilder sb = new StringBuilder();

            sb.Append(editor.EolMarker);
            sb.Append(editor.EolMarker);
            sb.Append(indent);
            if (callingMember.IsStatic)
            {
                sb.Append("static ");
            }
            sb.Append("void ");
            int pos2 = sb.Length;

            sb.Append(this.DisplayText); sb.Append(' '); sb.Append(this.parameterList); sb.Append(editor.EolMarker);
            sb.Append(indent); sb.Append("{"); sb.Append(editor.EolMarker);
            sb.Append(indent); sb.Append(TextEditorProperties.IndentString);
            int cursorPos = pos + sb.Length;

            sb.Append(editor.EolMarker);
            sb.Append(indent); sb.Append("}");
            editor.Insert(pos, sb.ToString());
            editor.Caret.Offset = cursorPos;

            // start text link mode after insert
            List <TextLink> links = new List <TextLink> ();
            TextLink        link  = new TextLink("name");

            link.AddLink(new Segment(0, this.DisplayText.Length));
            link.AddLink(new Segment(pos - initialOffset + pos2, this.DisplayText.Length));
            links.Add(link);

            CompletionTextLinkMode tle = new CompletionTextLinkMode(editor.Parent, initialOffset, links);

            tle.TriggerCodeCompletion = false;
            tle.SetCaretPosition      = true;
            tle.SelectPrimaryLink     = true;
            tle.OldMode = editor.CurrentMode;
            tle.StartMode();
            editor.CurrentMode = tle;
        }
Exemplo n.º 10
0
        public override void InsertCompletionText(CompletionListWindow window, ref KeyActions ka, KeyDescriptor descriptor)
        {
            if (completionItem?.textEdit?.range != null)
            {
                var range               = completionItem.textEdit.range;
                int insertStartOffset   = editor.LocationToOffset(range.start.line + 1, range.start.character + 1);
                int charactersToReplace = editor.CaretOffset - insertStartOffset;
                editor.ReplaceText(insertStartOffset, charactersToReplace, CompletionText);

                int caretOffset = completionItem.insertText.IndexOf("{{");
                if (caretOffset >= 0)
                {
                    int selectionLength = completionItem.insertText.IndexOf("}}", caretOffset) - caretOffset - 2;
                    caretOffset       += insertStartOffset;
                    editor.CaretOffset = caretOffset;
                    if (selectionLength > 0)
                    {
                        editor.SetSelection(editor.CaretOffset, editor.CaretOffset + selectionLength);
                    }
                }
            }
            else
            {
                base.InsertCompletionText(window, ref ka, descriptor);
            }
        }
Exemplo n.º 11
0
        public override async Task <KeyActions> InsertCompletionText(CompletionListWindow window, KeyActions ka, KeyDescriptor descriptor)
        {
            if (XmlEditorOptions.AutoInsertFragments && dataType == DataType.XmlAttribute)
            {
                //This temporary variable is needed because
                //base.InsertCompletionText sets window.CompletionWidget to null
                var completionWidget = window.CompletionWidget;
                ka = await base.InsertCompletionText(window, ka, descriptor);

                if (completionWidget is ITextEditorImpl)
                {
                    ((ITextEditorImpl)completionWidget).EditorExtension.Editor.StartSession(new SkipCharSession('"'));
                }

                //Even if we are on UI thread call Application.Invoke to postpone calling command
                //otherwise code calling InsertCompletionText will close completion window created by this command
                Application.Invoke((s, e) => IdeApp.CommandService.DispatchCommand(TextEditorCommands.ShowCompletionWindow));
                ka &= ~KeyActions.CloseWindow;
                return(ka);
            }
            else
            {
                return(await base.InsertCompletionText(window, ka, descriptor));
            }
        }
Exemplo n.º 12
0
        static string RunSimulation(SimulationSettings settings)
        {
            CompletionListWindow listWindow = CreateListWindow(settings);

            SimulateInput(listWindow, settings.SimulatedInput);
            return(((TestCompletionWidget)listWindow.CompletionWidget).CompletedWord);
        }
 public bool PostProcessKey(
     CompletionListWindow listWindow,
     KeyDescriptor descriptor,
     out KeyActions keyAction)
 {
     return(ProcessKey(descriptor, out keyAction));
 }
Exemplo n.º 14
0
        public override void InsertCompletionText(CompletionListWindow window, ref KeyActions ka, Gdk.Key closeChar, char keyChar, Gdk.ModifierType modifier)
        {
            Initialize();
            using (var undo = doc.Editor.OpenUndoGroup()) {
                string text = insertNamespace ? type.Namespace + "." + type.Name : type.Name;
                if (text != GetCurrentWord(window))
                {
                    if (window.WasShiftPressed && generateUsing)
                    {
                        text = type.Namespace + "." + text;
                    }
                    window.CompletionWidget.SetCompletionText(window.CodeCompletionContext, GetCurrentWord(window), text);
                }

                if (!window.WasShiftPressed && generateUsing)
                {
                    var generator = CodeGenerator.CreateGenerator(doc);
                    if (generator != null)
                    {
                        generator.AddGlobalNamespaceImport(doc, type.Namespace);
                        // reparse
                        doc.UpdateParseDocument();
                    }
                }
            }
            ka |= KeyActions.Ignore;
        }
        async Task <string> Test(string input, string type, string member, Gdk.Key key = Gdk.Key.Return, bool isDelegateExpected = false)
        {
            var s = await Setup(input);

            var             ext     = s.Item1;
            TestViewContent content = s.Item2;

            var listWindow = new CompletionListWindow();
            var widget     = new TestCompletionWidget(ext.Editor, ext.DocumentContext);

            listWindow.CompletionWidget      = widget;
            listWindow.CodeCompletionContext = widget.CurrentCodeCompletionContext;
            var model = ext.DocumentContext.ParsedDocument.GetAst <SemanticModel> ();

            Ide.IdeApp.Preferences.AddParenthesesAfterCompletion.Set(true);
            Ide.IdeApp.Preferences.AddOpeningOnly.Set(false);

            var t      = model.Compilation.GetTypeByMetadataName(type);
            var method = member != null?t.GetMembers().First(m => m.Name == member) : t.GetMembers().OfType <IMethodSymbol> ().First(m => m.MethodKind == MethodKind.Constructor);

            var factory = new RoslynCodeCompletionFactory(ext, model);
            var data    = new RoslynSymbolCompletionData(null, factory, method);

            data.IsDelegateExpected = isDelegateExpected;
            KeyActions ka = KeyActions.Process;

            data.InsertCompletionText(listWindow, ref ka, KeyDescriptor.FromGtk(key, (char)key, Gdk.ModifierType.None));

            return(widget.CompletedWord);
        }
Exemplo n.º 16
0
		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);
			}
		}
Exemplo n.º 17
0
        static string GetCurrentWordForMethods(CompletionListWindow window, MonoDevelop.Ide.Editor.Extension.KeyDescriptor descriptor)
        {
            int partialWordLength = window.PartialWord != null ? window.PartialWord.Length : 0;
            int replaceLength;

            if (descriptor.SpecialKey == SpecialKey.Return || descriptor.SpecialKey == SpecialKey.Tab)
            {
                replaceLength = window.CodeCompletionContext.TriggerWordLength + partialWordLength - window.InitialWordLength;
            }
            else
            {
                replaceLength = partialWordLength;
            }
            int endOffset = Math.Min(window.StartOffset + replaceLength, window.CompletionWidget.TextLength);

            if (descriptor.KeyChar == '(' && DefaultSourceEditorOptions.Instance.AutoInsertMatchingBracket)
            {
                endOffset++;
                if (DefaultSourceEditorOptions.Instance.AutoInsertMatchingBracket)
                {
                    endOffset++;
                }
            }
            var result = window.CompletionWidget.GetText(window.StartOffset, endOffset);

            return(result);
        }
		public override void InsertCompletionText (CompletionListWindow window, ref KeyActions ka, Gdk.Key closeChar, char keyChar, Gdk.ModifierType modifier)
		{
			// insert add/remove event handler code after +=/-=
			editor.Replace (initialOffset, editor.Caret.Offset - initialOffset, this.DisplayText + (AddSemicolon ? ";" : ""));
			
			// Search opening bracket of member
			int pos = callingMember != null ? editor.Document.LocationToOffset (callingMember.BodyRegion.BeginLine, callingMember.BodyRegion.BeginColumn) : initialOffset;
			while (pos < editor.Document.TextLength && editor.Document.GetCharAt (pos) != '{') {
				pos++;
			}
			
			// Search closing bracket of member
			pos = editor.Document.GetMatchingBracketOffset (pos) + 1;
			
			pos = Math.Max (0, Math.Min (pos, editor.Document.TextLength - 1));
			
			// Insert new event handler after closing bracket
			var line = callingMember != null ? editor.Document.GetLine (callingMember.Region.BeginLine) : editor.Document.GetLineByOffset (initialOffset);
			string indent = line.GetIndentation (editor.Document);
			
			StringBuilder sb = new StringBuilder ();
			sb.Append (editor.EolMarker);
			sb.Append (editor.EolMarker);
			sb.Append (indent);
			if (callingMember != null && callingMember.IsStatic)
				sb.Append ("static ");
			sb.Append ("void ");
			int pos2 = sb.Length;
			sb.Append (this.DisplayText);
			sb.Append (' ');
			sb.Append (this.parameterList);
			sb.Append (editor.EolMarker);
			sb.Append (indent);
			sb.Append ("{");
			sb.Append (editor.EolMarker);
			sb.Append (indent);
			sb.Append (editor.Options.IndentationString);
			int cursorPos = pos + sb.Length;
			sb.Append (editor.EolMarker);
			sb.Append (indent);
			sb.Append ("}");
			editor.Insert (pos, sb.ToString ());
			editor.Caret.Offset = cursorPos;
			
			// start text link mode after insert
			List<TextLink> links = new List<TextLink> ();
			TextLink link = new TextLink ("name");
			
			link.AddLink (new TextSegment (0, this.DisplayText.Length));
			link.AddLink (new TextSegment (pos - initialOffset + pos2, this.DisplayText.Length));
			links.Add (link);
			
			var tle = new TextLinkEditMode (editor.Parent, initialOffset, links);
			tle.TextLinkMode = TextLinkMode.EditIdentifier;
			tle.SetCaretPosition = true;
			tle.SelectPrimaryLink = true;
			tle.OldMode = editor.CurrentMode;
			tle.StartMode ();
			editor.CurrentMode = tle;
		}
Exemplo n.º 19
0
        public async Task TestBug60365()
        {
            var text   = "@c$";
            int endPos = text.IndexOf('$');

            if (endPos >= 0)
            {
                text = text.Substring(0, endPos) + text.Substring(endPos + 1);
            }

            using (var testCase = await SetupTestCase(text, Math.Max(0, endPos))) {
                var doc = testCase.Document;
                var ext = doc.GetContent <CSharpCompletionTextEditorExtension> ();

                var listWindow = new CompletionListWindow();
                var widget     = new TestCompletionWidget(ext.Editor, ext.DocumentContext);
                listWindow.CompletionWidget      = widget;
                listWindow.CodeCompletionContext = widget.CurrentCodeCompletionContext;


                Assert.AreEqual("@class", ext.Editor.Text);

                var list = await ext.HandleCodeCompletionAsync(widget.CurrentCodeCompletionContext, new CompletionTriggerInfo (CompletionTriggerReason.CharTyped, 'c'));

                var ka = KeyActions.Complete;
                list.First(d => d.CompletionText == "class").InsertCompletionText(listWindow, ref ka, KeyDescriptor.Tab);

                await doc.DocumentContext.UpdateParseDocument();
            }
        }
        async Task <string> Test(string input, string type, string member, Gdk.Key key = Gdk.Key.Return)
        {
            var s = await Setup(input);

            var             ext     = s.Item1;
            TestViewContent content = s.Item2;

            var listWindow = new CompletionListWindow();
            var widget     = new TestCompletionWidget(ext.Editor, ext.DocumentContext);

            listWindow.CompletionWidget      = widget;
            listWindow.CodeCompletionContext = widget.CurrentCodeCompletionContext;
            var sm = ext.DocumentContext.ParsedDocument.GetAst <SemanticModel> ();

            var t           = sm.Compilation.GetTypeByMetadataName(type);
            var foundMember = t.GetMembers().First(m => m.Name == member);
            var factory     = new RoslynCodeCompletionFactory(ext, sm);
            var data        = new RoslynSymbolCompletionData(null, factory, foundMember);

            data.DisplayFlags |= DisplayFlags.NamedArgument;
            KeyActions ka = KeyActions.Process;

            data.InsertCompletionText(listWindow, ref ka, KeyDescriptor.FromGtk(key, (char)key, Gdk.ModifierType.None));

            return(widget.CompletedWord);
        }
Exemplo n.º 21
0
            public bool PostProcessKey(CompletionListWindow listWindow, KeyDescriptor descriptor, out KeyActions keyAction)
            {
                //any time any key is pressed, we might need to update
                list.UpdateSearch(listWindow.CompletionString);

                keyAction = KeyActions.None;
                return(false);
            }
		public static string GetCurrentWord (CompletionListWindow window)
		{
			int partialWordLength = window.PartialWord != null ? window.PartialWord.Length : 0;
			int replaceLength = window.CodeCompletionContext.TriggerWordLength + partialWordLength - window.InitialWordLength;
			int endOffset = Math.Min (window.CodeCompletionContext.TriggerOffset + replaceLength, window.CompletionWidget.TextLength);
			var result = window.CompletionWidget.GetText (window.CodeCompletionContext.TriggerOffset, endOffset);
			return result;
		}
Exemplo n.º 23
0
			public bool PostProcessKey (CompletionListWindow listWindow, KeyDescriptor descriptor, out KeyActions keyAction)
			{
				keyAction = KeyActions.None;
				if (descriptor.KeyChar == '-') {
					return true;
				}
				return false;
			}
            public override void InsertCompletionText(CompletionListWindow window, ref KeyActions ka, MonoDevelop.Ide.Editor.Extension.KeyDescriptor descriptor)
            {
                if (this.CompletionText == "sizeof" || this.CompletionText == "nameof" || this.CompletionText == "typeof")
                {
                    string partialWord = GetCurrentWord(window, descriptor);
                    int    skipChars   = 0;
                    bool   runCompletionCompletionCommand = false;
                    var    method = Symbol as IMethodSymbol;

                    bool   addParens      = IdeApp.Preferences.AddParenthesesAfterCompletion;
                    bool   addOpeningOnly = IdeApp.Preferences.AddOpeningOnly;
                    var    Editor         = ext.Editor;
                    var    Policy         = ext.FormattingPolicy;
                    string insertionText  = this.CompletionText;

                    if (addParens && !IsBracketAlreadyInserted(ext))
                    {
                        var line = Editor.GetLine(Editor.CaretLine);
                        //var start = window.CodeCompletionContext.TriggerOffset + partialWord.Length + 2;
                        //var end = line.Offset + line.Length;
                        //string textToEnd = start < end ? Editor.GetTextBetween (start, end) : "";
                        bool addSpace = Policy.SpaceAfterMethodCallName && MonoDevelop.Ide.Editor.DefaultSourceEditorOptions.Instance.OnTheFlyFormatting;

                        var keys = new [] { SpecialKey.Return, SpecialKey.Tab, SpecialKey.Space };
                        if (keys.Contains(descriptor.SpecialKey) || descriptor.KeyChar == ' ')
                        {
                            if (addOpeningOnly)
                            {
                                insertionText += addSpace ? " (|" : "(|";
                            }
                            else
                            {
                                insertionText += addSpace ? " (|)" : "(|)";
                            }
                        }
                        ka |= KeyActions.Ignore;
                    }

                    window.CompletionWidget.SetCompletionText(window.CodeCompletionContext, partialWord, insertionText);
                    int offset = Editor.CaretOffset;
                    for (int i = skipChars - 1; i-- > 0;)
                    {
                        Editor.StartSession(new SkipCharSession(Editor.GetCharAt(offset)));
                        offset++;
                    }

                    if (runCompletionCompletionCommand && IdeApp.Workbench != null)
                    {
                        Application.Invoke(delegate {
                            ext.RunCompletionCommand();
                        });
                    }
                }
                else
                {
                    base.InsertCompletionText(window, ref ka, descriptor);
                }
            }
 public bool PreProcessKey(CompletionListWindow listWindow, KeyDescriptor descriptor, out KeyActions keyAction)
 {
     keyAction = KeyActions.None;
     if (descriptor.KeyChar == '.')
     {
         return(true);
     }
     return(false);
 }
Exemplo n.º 26
0
 public bool PreProcessKey(CompletionListWindow listWindow, KeyDescriptor descriptor, out KeyActions keyAction)
 {
     if (!listWindow.AutoSelect && char.IsLetterOrDigit(descriptor.KeyChar))
     {
         listWindow.AutoSelect = true;
     }
     keyAction = KeyActions.None;
     return(false);
 }
 public override void InsertCompletionText(CompletionListWindow window, ref KeyActions ka, Ide.Editor.Extension.KeyDescriptor descriptor)
 {
     base.InsertCompletionText(window, ref ka, descriptor);
     factory.Ext.Editor.GetContent <CSharpTextEditorIndentation> ().DoReSmartIndent();
     if (this.CompletionText.Contains("\n"))
     {
         factory.Ext.Editor.GetContent <CSharpTextEditorIndentation> ().DoReSmartIndent(factory.Ext.Editor.GetLine(factory.Ext.Editor.CaretLine).NextLine.Offset);
     }
 }
 public bool PostProcessKey(CompletionListWindow listWindow, Gdk.Key key, char keyChar, Gdk.ModifierType modifier, out KeyActions keyAction)
 {
     keyAction = KeyActions.None;
     if (keyChar == '.')
     {
         return(true);
     }
     return(false);
 }
		public override void InsertCompletionText (CompletionListWindow window, ref KeyActions ka, Ide.Editor.Extension.KeyDescriptor descriptor)
		{
			base.InsertCompletionText (window, ref ka, descriptor);
			factory.Ext.Editor.GetContent<CSharpTextEditorIndentation> ().DoReSmartIndent ();
			if (this.CompletionText.Contains ("\n")) {
				
				factory.Ext.Editor.GetContent<CSharpTextEditorIndentation> ().DoReSmartIndent (factory.Ext.Editor.GetLine (factory.Ext.Editor.CaretLine).NextLine.Offset);
			}
		}
        static async Task <string> RunSimulation(SimulationSettings settings)
        {
            CompletionListWindow listWindow = CreateListWindow(settings);
            var testCompletionWidget        = (TestCompletionWidget)listWindow.CompletionWidget;

            await SimulateInput(listWindow, settings.SimulatedInput);

            return(testCompletionWidget.CompletedWord);
        }
		public virtual void InsertCompletionText (CompletionListWindow window)
		{
			int partialWordLength = window.PartialWord != null ? window.PartialWord.Length : 0;
			
			int replaceLength = window.CodeCompletionContext.TriggerWordLength + partialWordLength - window.InitialWordLength;
			string currentWord = window.CompletionWidget.GetText (window.CodeCompletionContext.TriggerOffset, window.CodeCompletionContext.TriggerOffset + replaceLength);
			
			window.CompletionWidget.SetCompletionText (window.CodeCompletionContext, currentWord, CompletionText);
		}
Exemplo n.º 32
0
        public CSharpInteractiveConsoleView(Evaluator evaluator)
        {
            this.evaluator = evaluator;

            completionWidget = new CSharpInteractiveConsoleCompletionWidget(this);
            completionWindow = new CompletionListWindow();

            UpdateInputLineBegin();

            TextView.KeyReleaseEvent += TextViewKeyReleaseEvent;
        }
 public override void InsertCompletionText(CompletionListWindow window, ref KeyActions ka, KeyDescriptor descriptor)
 {
     if (codeTemplate != null)
     {
         codeTemplate.Insert(textEditorExtension.Editor, textEditorExtension.DocumentContext);
     }
     else
     {
         base.InsertCompletionText(window, ref ka, descriptor);
     }
 }
Exemplo n.º 34
0
		public override void InsertCompletionText (CompletionListWindow window, ref KeyActions ka, KeyDescriptor descriptor)
		{
			var editor = factory.Ext.Editor;
			var offset = window.CodeCompletionContext.TriggerOffset;
			using (var undo = editor.OpenUndoGroup ()) {
				base.InsertCompletionText (window, ref ka, descriptor);
				var span = nodeToCast.Span;
				var type = SafeMinimalDisplayString (targetType, semanticModel, nodeToCast.SpanStart, Ambience.LabelFormat);
				editor.ReplaceText (span.Start, span.Length, "((" + type + ")" + nodeToCast + ")");
			}
		}
        public override async Task <KeyActions> InsertCompletionText(CompletionListWindow window, KeyActions ka, KeyDescriptor descriptor)
        {
            var  editor     = ext.Editor;
            bool isExplicit = false;
            //			if (member.DeclaringTypeDefinition.Kind == TypeKind.Interface) {
            //				foreach (var m in type.Members) {
            //					if (m.Name == member.Name && !m.ReturnType.Equals (member.ReturnType)) {
            //						isExplicit = true;
            //						break;
            //					}
            //				}
            //			}
            //			var resolvedType = type.Resolve (ext.Project).GetDefinition ();
            //			if (ext.Project != null)
            //				generator.PolicyParent = ext.Project.Policies;

            var    result    = CSharpCodeGenerator.CreatePartialMemberImplementation(ext.DocumentContext, ext.Editor, currentType, currentType.Locations.First(), Symbol, isExplicit, factory.SemanticModel);
            string sb        = result.Code.TrimStart();
            int    trimStart = result.Code.Length - sb.Length;

            sb = sb.TrimEnd();

            var lastRegion = result.BodyRegions.LastOrDefault();
            var region     = lastRegion == null? null
                                : new CodeGeneratorBodyRegion(lastRegion.StartOffset - trimStart, lastRegion.EndOffset - trimStart);

            int targetCaretPosition;
            int selectionEndPosition = -1;

            if (region != null && region.IsValid)
            {
                targetCaretPosition = declarationBegin + region.EndOffset;
            }
            else
            {
                targetCaretPosition = declarationBegin + sb.Length;
            }

            editor.ReplaceText(declarationBegin, editor.CaretOffset - declarationBegin, sb);
            if (selectionEndPosition > 0)
            {
                editor.CaretOffset = selectionEndPosition;
                editor.SetSelection(targetCaretPosition, selectionEndPosition);
            }
            else
            {
                editor.CaretOffset = targetCaretPosition;
            }

            await OnTheFlyFormatter.Format(editor, ext.DocumentContext, declarationBegin, declarationBegin + sb.Length);

            editor.CaretLine--;
            return(ka);
        }
        public override async Task <KeyActions> InsertCompletionText(CompletionListWindow window, KeyActions ka, Ide.Editor.Extension.KeyDescriptor descriptor)
        {
            ka = await base.InsertCompletionText(window, ka, descriptor);

            factory.Ext.Editor.GetContent <CSharpTextEditorIndentation> ().DoReSmartIndent();
            if (this.CompletionText.Contains("\n"))
            {
                factory.Ext.Editor.GetContent <CSharpTextEditorIndentation> ().DoReSmartIndent(factory.Ext.Editor.GetLine(factory.Ext.Editor.CaretLine).NextLine.Offset);
            }
            return(ka);
        }
		public override void InsertCompletionText (CompletionListWindow window)
		{
			// insert add/remove event handler code after +=/-=
			editor.Replace (initialOffset, editor.Caret.Offset - initialOffset, this.DisplayText + ";");
			
			// Search opening bracket of member
			int pos = callingMember != null ? editor.Document.LocationToOffset (callingMember.BodyRegion.Start.Line, callingMember.BodyRegion.Start.Column) : initialOffset;
			while (pos < editor.Document.Length && editor.Document.GetCharAt (pos) != '{') {
				pos++;
			}
			
			// Search closing bracket of member
			pos = editor.Document.GetMatchingBracketOffset (pos) + 1;
			
			pos = Math.Max (0, Math.Min (pos, editor.Document.Length - 1));
			
			// Insert new event handler after closing bracket
			string indent = editor.Document.GetLine (callingMember.Location.Line).GetIndentation (editor.Document);
			
			StringBuilder sb = new StringBuilder ();
			sb.Append (editor.EolMarker);
			sb.Append (editor.EolMarker);
			sb.Append (indent);
			if (callingMember.IsStatic)
				sb.Append ("static ");
			sb.Append ("void ");
			int pos2 = sb.Length;
			sb.Append (this.DisplayText);sb.Append (' ');sb.Append (this.parameterList);sb.Append (editor.EolMarker);
			sb.Append (indent);sb.Append ("{");sb.Append (editor.EolMarker);
			sb.Append (indent);sb.Append (TextEditorProperties.IndentString);
			int cursorPos = pos + sb.Length;
			sb.Append (editor.EolMarker);
			sb.Append (indent);sb.Append ("}");
			editor.Insert (pos, sb.ToString ());
			editor.Caret.Offset = cursorPos;
			
			// start text link mode after insert
			List<TextLink> links = new List<TextLink> ();
			TextLink link = new TextLink ("name");
			
			link.AddLink (new Segment (0, this.DisplayText.Length));
			link.AddLink (new Segment (pos - initialOffset + pos2, this.DisplayText.Length));
			links.Add (link);
			
			CompletionTextLinkMode tle = new CompletionTextLinkMode (editor.Parent, initialOffset, links);
			tle.TriggerCodeCompletion = false;
			tle.SetCaretPosition = true;
			tle.SelectPrimaryLink = true;
			tle.OldMode = editor.CurrentMode;
			tle.StartMode ();
			editor.CurrentMode = tle;
		}
		public override void InsertCompletionText (CompletionListWindow window)
		{
			IEditableTextBuffer buf = window.CompletionWidget as IEditableTextBuffer;
			if (buf != null) {
				buf.BeginAtomicUndo ();
				buf.InsertText (buf.CursorPosition, element);
				
				// Move caret into the middle of the tags
				buf.CursorPosition = window.CodeCompletionContext.TriggerOffset + cursorOffset;
				buf.Select (buf.CursorPosition, buf.CursorPosition);
				buf.EndAtomicUndo ();
			}
		}
		public override void InsertCompletionText (CompletionListWindow window, ref KeyActions ka, KeyDescriptor descriptor)
		{
			var buf = window.CompletionWidget;
			if (buf != null) {
				//completion context gets nulled from window as soon as we alter the buffer
				var codeCompletionContext = window.CodeCompletionContext;

				buf.Replace (buf.CaretOffset, 0, element);
					
				// Move caret into the middle of the tags
				buf.CaretOffset = codeCompletionContext.TriggerOffset + cursorOffset;
			}
		}
Exemplo n.º 40
0
		public override void InsertCompletionText (CompletionListWindow window, ref KeyActions ka, Gdk.Key closeChar, char keyChar, Gdk.ModifierType modifier)
		{
			IEditableTextBuffer buf = window.CompletionWidget as IEditableTextBuffer;
			if (buf != null) {
				using (var undo = buf.OpenUndoGroup ()) {
					buf.InsertText (buf.CursorPosition, element);
					
					// Move caret into the middle of the tags
					buf.CursorPosition = window.CodeCompletionContext.TriggerOffset + cursorOffset;
					buf.Select (buf.CursorPosition, buf.CursorPosition);
				}
			}
		}
		public override void InsertCompletionText (CompletionListWindow window, ref KeyActions ka, Gdk.Key closeChar, char keyChar, Gdk.ModifierType modifier)
		{
			var editor = ext.TextEditorData;
			var generator = CodeGenerator.CreateGenerator (ext.Document);
			bool isExplicit = false;
			if (member.DeclaringTypeDefinition.Kind == TypeKind.Interface) {
				foreach (var m in type.Members) {
					if (m.Name == member.Name && !m.ReturnType.Equals (member.ReturnType)) {
						isExplicit = true;
						break;
					}
				}
			}
			var resolvedType = type.Resolve (ext.ParsedDocument.GetTypeResolveContext (ext.Compilation, editor.Caret.Location)).GetDefinition ();
			if (ext.Project != null)
				generator.PolicyParent = ext.Project.Policies;
			var result = generator.CreateMemberImplementation (resolvedType, type, member, isExplicit);
			string sb = result.Code.TrimStart ();
			int trimStart = result.Code.Length - sb.Length;
			sb = sb.TrimEnd ();
			
			var lastRegion = result.BodyRegions.LastOrDefault ();
			var region = lastRegion == null? null
				: new CodeGeneratorBodyRegion (lastRegion.StartOffset - trimStart, lastRegion.EndOffset - trimStart);
			
			int targetCaretPosition;
			int selectionEndPosition = -1;
			if (region != null && region.IsValid) {
				targetCaretPosition = declarationBegin + region.StartOffset;
				if (region.Length > 0) {
					if (GenerateBody) {
						selectionEndPosition = declarationBegin + region.EndOffset;
					} else {
						//FIXME: if there are multiple regions, remove all of them
						sb = sb.Substring (0, region.StartOffset) + sb.Substring (region.EndOffset); 
					}
				}
			} else {
				targetCaretPosition = declarationBegin + sb.Length;
			}
			
			editor.Replace (declarationBegin, editor.Caret.Offset - declarationBegin, sb);
			if (selectionEndPosition > 0) {
				editor.Caret.Offset = selectionEndPosition;
				editor.SetSelection (targetCaretPosition, selectionEndPosition);
			} else {
				editor.Caret.Offset = targetCaretPosition;
			}
		}
		public override void InsertCompletionText (CompletionListWindow window, ref KeyActions ka, KeyDescriptor descriptor)
		{
			//insert the method name
			var buf = window.CompletionWidget;
			if (buf != null) {
				buf.Replace (window.CodeCompletionContext.TriggerOffset, buf.CaretOffset - window.CodeCompletionContext.TriggerOffset, methodInfo.Name);
			}
			
			//generate the codebehind method

			// TODO: Roslyn port.
//			if (codeBehindClassLocation != null && project != null)
//				BindingService.AddMemberToClass (project, codeBehindClass, codeBehindClassLocation, methodInfo, false);
//			else
//				BindingService.AddMemberToClass (project, codeBehindClass, codeBehindClass.Locations.First (), methodInfo, false);
		}
		public override void InsertCompletionText (CompletionListWindow window, ref KeyActions ka, Gdk.Key closeChar, char keyChar, Gdk.ModifierType modifier)
		{
			//insert the method name
			MonoDevelop.Ide.Gui.Content.IEditableTextBuffer buf = window.CompletionWidget as MonoDevelop.Ide.Gui.Content.IEditableTextBuffer;
			if (buf != null) {
				using (var undo = buf.OpenUndoGroup ()) {
					buf.DeleteText (window.CodeCompletionContext.TriggerOffset, buf.CursorPosition - window.CodeCompletionContext.TriggerOffset);
					buf.InsertText (buf.CursorPosition, methodInfo.Name);
				}
			}
			
			//generate the codebehind method
			if (codeBehindClassPart != null && project != null)
				BindingService.AddMemberToClass (project, codeBehindClass.GetDefinition (), codeBehindClassPart, methodInfo, false);
			else
				BindingService.AddMemberToClass (project, codeBehindClass.GetDefinition (), codeBehindClass.GetDefinition ().Parts.First (), methodInfo, false);
		}
		public override void InsertCompletionText (CompletionListWindow window, ref KeyActions ka, KeyDescriptor descriptor)
		{
			var buf = window.CompletionWidget;
			if (buf != null) {
				int deleteStartOffset = window.CodeCompletionContext.TriggerOffset;
				if (text.StartsWith (docTypeStart)) {
					int start = window.CodeCompletionContext.TriggerOffset - docTypeStart.Length;
					if (start >= 0) {
						string readback = buf.GetText (start, window.CodeCompletionContext.TriggerOffset);
						if (string.Compare (readback, docTypeStart, StringComparison.OrdinalIgnoreCase) == 0)
							deleteStartOffset -= docTypeStart.Length;
					}
				}
				
				buf.Replace (deleteStartOffset, buf.CaretOffset - deleteStartOffset, text);
			}
		}
		public override void InsertCompletionText (CompletionListWindow window)
		{
			//insert the method name
			MonoDevelop.Ide.Gui.Content.IEditableTextBuffer buf = window.CompletionWidget as MonoDevelop.Ide.Gui.Content.IEditableTextBuffer;
			if (buf != null) {
				buf.BeginAtomicUndo ();
				buf.DeleteText (window.CodeCompletionContext.TriggerOffset, buf.CursorPosition - window.CodeCompletionContext.TriggerOffset);
				buf.InsertText (buf.CursorPosition, methodInfo.Name);
				buf.EndAtomicUndo ();
			}
			
			//generate the codebehind method
			if (codeBehindClassPart != null && project != null)
				BindingService.AddMemberToClass (project, codeBehindClass, codeBehindClassPart, methodInfo, false);
			else
				BindingService.AddMemberToClass (project, codeBehindClass, codeBehindClass, methodInfo, false);
		}
		public override void InsertCompletionText (CompletionListWindow window)
		{
			CodeGenerator generator = CodeGenerator.CreateGenerator (editor.Document.MimeType, editor.Options.TabsToSpaces, editor.Options.TabSize, editor.EolMarker);
			bool isExplicit = false;
			if (member.DeclaringType.ClassType == ClassType.Interface) {
				foreach (var m in type.Members) {
					if (m.Name == member.Name && m.ReturnType.ToInvariantString () != member.ReturnType.ToInvariantString ()) {
						isExplicit = true;
						break;
					}
				}
			}
			var result = generator.CreateMemberImplementation (type, member, isExplicit);
			string sb = result.Code.TrimStart ();
			int trimStart = result.Code.Length - sb.Length;
			sb = sb.TrimEnd ();
			
			var lastRegion = result.BodyRegions.LastOrDefault ();
			var region = lastRegion == null? null
				: new CodeGeneratorBodyRegion (lastRegion.StartOffset - trimStart, lastRegion.EndOffset - trimStart);
			
			int targetCaretPosition;
			int selectionEndPosition = -1;
			if (region != null && region.IsValid) {
				targetCaretPosition = declarationBegin + region.StartOffset;
				if (region.Length > 0) {
					if (GenerateBody) {
						selectionEndPosition = declarationBegin + region.EndOffset;
					} else {
						//FIXME: if there are multiple regions, remove all of them
						sb = sb.Substring (0, region.StartOffset) + sb.Substring (region.EndOffset); 
					}
				}
			} else {
				targetCaretPosition = declarationBegin + sb.Length;
			}
			
			editor.Replace (declarationBegin, editor.Caret.Offset - declarationBegin, sb);
			if (selectionEndPosition > 0) {
				editor.Caret.Offset = selectionEndPosition;
				editor.SetSelection (targetCaretPosition, selectionEndPosition);
			} else {
				editor.Caret.Offset = targetCaretPosition;
			}
		}
Exemplo n.º 47
0
		public override void InsertCompletionText (CompletionListWindow window, ref KeyActions ka, Gdk.Key closeChar, char keyChar, Gdk.ModifierType modifier)
		{
			MonoDevelop.Ide.Gui.Content.IEditableTextBuffer buf = window.CompletionWidget as MonoDevelop.Ide.Gui.Content.IEditableTextBuffer;
			if (buf != null) {
				using (var undo = buf.OpenUndoGroup ()) {
					int deleteStartOffset = window.CodeCompletionContext.TriggerOffset;
					if (text.StartsWith (docTypeStart)) {
						int start = window.CodeCompletionContext.TriggerOffset - docTypeStart.Length;
						if (start >= 0) {
							string readback = buf.GetText (start, window.CodeCompletionContext.TriggerOffset);
							if (string.Compare (readback, docTypeStart, StringComparison.OrdinalIgnoreCase) == 0)
								deleteStartOffset -= docTypeStart.Length;
						}
					}
					
					buf.DeleteText (deleteStartOffset, buf.CursorPosition - deleteStartOffset);
					buf.InsertText (buf.CursorPosition, text);
				}
			}
		}
		public override void InsertCompletionText (CompletionListWindow window)
		{
			MonoDevelop.Ide.Gui.Content.IEditableTextBuffer buf = window.CompletionWidget as MonoDevelop.Ide.Gui.Content.IEditableTextBuffer;
			if (buf != null) {
				buf.BeginAtomicUndo ();
				
				int deleteStartOffset = window.CodeCompletionContext.TriggerOffset;
				if (text.StartsWith (docTypeStart)) {
					int start = window.CodeCompletionContext.TriggerOffset - docTypeStart.Length;
					if (start >= 0) {
						string readback = buf.GetText (start, window.CodeCompletionContext.TriggerOffset);
						if (string.Compare (readback, docTypeStart, StringComparison.OrdinalIgnoreCase) == 0)
							deleteStartOffset -= docTypeStart.Length;
					}
				}
				
				buf.DeleteText (deleteStartOffset, buf.CursorPosition - deleteStartOffset);
				buf.InsertText (buf.CursorPosition, text);
				buf.EndAtomicUndo ();
			}
		}
		public override void InsertCompletionText (CompletionListWindow window)
		{
			var generator = new CSharpCodeGenerator ();
			var result = generator.CreateMemberImplementation (type, member, false);
			string sb = result.Code.TrimStart ();
			int trimStart = result.Code.Length - sb.Length;
			sb = sb.TrimEnd ();
			
			var lastRegion = result.BodyRegions.LastOrDefault ();
			var region = lastRegion == null? null
				: new CodeGeneratorBodyRegion (lastRegion.StartOffset - trimStart, lastRegion.EndOffset - trimStart);
			
			int targetCaretPosition;
			int selectionEndPosition = -1;
			if (region != null && region.IsValid) {
				targetCaretPosition = declarationBegin + region.StartOffset;
				if (region.Length > 0) {
					if (GenerateBody) {
						selectionEndPosition = declarationBegin + region.EndOffset;
					} else {
						//FIXME: if there are multiple regions, remove all of them
						sb = sb.Substring (0, region.StartOffset) + sb.Substring (region.EndOffset); 
					}
				}
			} else {
				targetCaretPosition = declarationBegin + sb.Length;
			}
			
			editor.Replace (declarationBegin, editor.Caret.Offset - declarationBegin, sb);
			if (selectionEndPosition > 0) {
				editor.Caret.Offset = selectionEndPosition;
				editor.SetSelection (targetCaretPosition, selectionEndPosition);
			} else {
				editor.Caret.Offset = targetCaretPosition;
			}
		}
 static CompletionListWindow CreateListWindow(CompletionListWindowTests.SimulationSettings settings)
 {
     CompletionDataList dataList = new CompletionDataList ();
     dataList.AutoSelect = settings.AutoSelect;
     dataList.AddRange (settings.CompletionData);
     dataList.DefaultCompletionString = settings.DefaultCompletionString;
     ListWindow.ClearHistory ();
     CompletionListWindow listWindow = new CompletionListWindow () {
         CompletionDataList = dataList,
         CompletionWidget = new TestCompletionWidget (),
         AutoSelect = settings.AutoSelect,
         CodeCompletionContext = new CodeCompletionContext (),
         AutoCompleteEmptyMatch = settings.AutoCompleteEmptyMatch,
         DefaultCompletionString = settings.DefaultCompletionString
     };
     listWindow.List.FilterWords ();
     listWindow.UpdateWordSelection ();
     listWindow.ResetSizes ();
     return listWindow;
 }
		public virtual void InsertCompletionText (CompletionListWindow window, ref KeyActions ka, Gdk.Key closeChar, char keyChar, Gdk.ModifierType modifier)
		{
			var currentWord = GetCurrentWord (window);
			window.CompletionWidget.SetCompletionText (window.CodeCompletionContext, currentWord, CompletionText);
		}
Exemplo n.º 52
0
		// ext may be null, but then parameter completion don't work
		internal static void PrepareShowWindow (CompletionTextEditorExtension ext, char firstChar, ICompletionWidget completionWidget, CodeCompletionContext completionContext)
		{
			isShowing = true;

			if (wnd == null) {
				wnd = new CompletionListWindow ();
				wnd.WordCompleted += HandleWndWordCompleted;
			}
			if (ext != null) {
				var widget = ext.Editor.GetNativeWidget<Gtk.Widget> ();
				wnd.TransientFor = widget?.Parent?.Toplevel as Gtk.Window;
			} else {
				var widget = completionWidget as Gtk.Widget;
				if (widget != null) {
					var window = widget.Toplevel as Gtk.Window;
					if (window != null)
						wnd.TransientFor = window;
				}
			}
			wnd.Extension = ext;

			wnd.InitializeListWindow (completionWidget, completionContext);
		}
Exemplo n.º 53
0
		public override void InsertCompletionText (CompletionListWindow window, ref KeyActions ka, Gdk.Key closeChar, char keyChar, Gdk.ModifierType modifier)
		{
			Initialize ();
			string text = insertNamespace ? type.Namespace + "." + type.Name : type.Name;
			if (text != GetCurrentWord (window)) {
				if (window.WasShiftPressed && generateUsing) 
					text = type.Namespace + "." + text;
				window.CompletionWidget.SetCompletionText (window.CodeCompletionContext, GetCurrentWord (window), text);
			}
			
			if (!window.WasShiftPressed && generateUsing) {
				var generator = CodeGenerator.CreateGenerator (doc);
				if (generator != null) {
					generator.AddGlobalNamespaceImport (doc, type.Namespace);
					// reparse
					doc.UpdateParseDocument ();
				}
			}
		}
 static void SimulateInput(CompletionListWindow listWindow, string input)
 {
     foreach (char ch in input) {
         switch (ch) {
         case '8':
             listWindow.PreProcessKeyEvent (Gdk.Key.Up, '\0', Gdk.ModifierType.None);
             listWindow.PostProcessKeyEvent (Gdk.Key.Up, '\0', Gdk.ModifierType.None);
             break;
         case '2':
             listWindow.PreProcessKeyEvent (Gdk.Key.Down, '\0', Gdk.ModifierType.None);
             listWindow.PostProcessKeyEvent (Gdk.Key.Down, '\0', Gdk.ModifierType.None);
             break;
         case '4':
             listWindow.PreProcessKeyEvent (Gdk.Key.Left, '\0', Gdk.ModifierType.None);
             listWindow.PostProcessKeyEvent (Gdk.Key.Left, '\0', Gdk.ModifierType.None);
             break;
         case '6':
             listWindow.PreProcessKeyEvent (Gdk.Key.Right, '\0', Gdk.ModifierType.None);
             listWindow.PostProcessKeyEvent (Gdk.Key.Right, '\0', Gdk.ModifierType.None);
             break;
         case '\t':
             listWindow.PreProcessKeyEvent (Gdk.Key.Tab, '\t', Gdk.ModifierType.None);
             listWindow.PostProcessKeyEvent (Gdk.Key.Tab, '\t', Gdk.ModifierType.None);
             break;
         case '\b':
             listWindow.PreProcessKeyEvent (Gdk.Key.BackSpace, '\b', Gdk.ModifierType.None);
             ((TestCompletionWidget)listWindow.CompletionWidget).Backspace ();
             listWindow.PostProcessKeyEvent (Gdk.Key.BackSpace, '\b', Gdk.ModifierType.None);
             break;
         case '\n':
             listWindow.PreProcessKeyEvent (Gdk.Key.Return, '\n', Gdk.ModifierType.None);
             listWindow.PostProcessKeyEvent (Gdk.Key.Return, '\n', Gdk.ModifierType.None);
             break;
         default:
             listWindow.PreProcessKeyEvent ((Gdk.Key)ch, ch, Gdk.ModifierType.None);
             ((TestCompletionWidget)listWindow.CompletionWidget).AddChar (ch);
             listWindow.PostProcessKeyEvent ((Gdk.Key)ch, ch, Gdk.ModifierType.None);
             break;
         }
     }
 }
Exemplo n.º 55
0
		static void DestroyWindow ()
		{
			if (wnd != null) {
				wnd.Destroy ();
				wnd = null;
			}
			OnWindowClosed (EventArgs.Empty);
		}
			public bool PostProcessKey (CompletionListWindow listWindow, KeyDescriptor descriptor, out KeyActions keyAction)
			{
				keyAction = KeyActions.None;
				if (descriptor.KeyChar == '.') {
					return true;
				}
				return false;
			}
		public override void InsertCompletionText (CompletionListWindow window, ref KeyActions ka, KeyDescriptor descriptor)
		{
			var editor = ext.Editor;
			bool isExplicit = false;
			//			if (member.DeclaringTypeDefinition.Kind == TypeKind.Interface) {
			//				foreach (var m in type.Members) {
			//					if (m.Name == member.Name && !m.ReturnType.Equals (member.ReturnType)) {
			//						isExplicit = true;
			//						break;
			//					}
			//				}
			//			}
			//			var resolvedType = type.Resolve (ext.Project).GetDefinition ();
			//			if (ext.Project != null)
			//				generator.PolicyParent = ext.Project.Policies;

			var result = CSharpCodeGenerator.CreatePartialMemberImplementation (ext.DocumentContext, ext.Editor, currentType, currentType.Locations.First (), Symbol, isExplicit, factory.SemanticModel);
			string sb = result.Code.TrimStart ();
			int trimStart = result.Code.Length - sb.Length;
			sb = sb.TrimEnd ();

			var lastRegion = result.BodyRegions.LastOrDefault ();
			var region = lastRegion == null? null
				: new CodeGeneratorBodyRegion (lastRegion.StartOffset - trimStart, lastRegion.EndOffset - trimStart);

			int targetCaretPosition;
			int selectionEndPosition = -1;
			if (region != null && region.IsValid) {
				targetCaretPosition = declarationBegin + region.EndOffset;

			} else {
				targetCaretPosition = declarationBegin + sb.Length;
			}

			editor.ReplaceText (declarationBegin, editor.CaretOffset - declarationBegin, sb);
			if (selectionEndPosition > 0) {
				editor.CaretOffset = selectionEndPosition;
				editor.SetSelection (targetCaretPosition, selectionEndPosition);
			} else {
				editor.CaretOffset = targetCaretPosition;
			}

			OnTheFlyFormatter.Format (editor, ext.DocumentContext, declarationBegin, declarationBegin + sb.Length);
			editor.CaretLine--;
		}
Exemplo n.º 58
0
				public bool ProcessKey (CompletionListWindow window, Gdk.Key key, char keyChar, Gdk.ModifierType modifier, out KeyActions keyAction)
				{
					if (keyChar != '!') {
						keyAction = KeyActions.None;
						return false;
					}
					
					keyAction = KeyActions.CloseWindow;
					
					CodeCompletionContext ctx = window.CodeCompletionContext;
					int offset = ctx.TriggerOffset;
					
					while (offset > 0) {
						char ch = window.CompletionWidget.GetChar (offset - 1);
						if (ch != '.') 
							break;
						offset--;
						while (offset > 0) {
							ch = window.CompletionWidget.GetChar (offset - 1);
							if (ch != '_' && !Char.IsLetterOrDigit (ch))
								break;
							offset--;
						}
					}
					
					keyAction = KeyActions.CloseWindow | KeyActions.Ignore | KeyActions.Complete;
					window.CompletionWidget.Replace (offset, 0, "!");
					
					ctx.TriggerOffset++;
					ctx.TriggerLineOffset++;
					
					return true;
				}
		public override void InsertCompletionText (CompletionListWindow window, ref KeyActions ka, KeyDescriptor descriptor)
		{
			// insert add/remove event handler code after +=/-=
			var editor = factory.Ext.Editor;


			bool AddSemicolon = true;
			var position = window.CodeCompletionContext.TriggerOffset;
			editor.ReplaceText (position, editor.CaretOffset - position, this.DisplayText + (AddSemicolon ? ";" : ""));


			var document = IdeApp.Workbench.ActiveDocument;
			var parsedDocument = document.UpdateParseDocument ().Result;
			var semanticModel = parsedDocument.GetAst<SemanticModel> ();

			var declaringType = semanticModel.GetEnclosingSymbol<INamedTypeSymbol> (position, default(CancellationToken));
			var enclosingSymbol = semanticModel.GetEnclosingSymbol<ISymbol> (position, default(CancellationToken));

			var insertionPoints = InsertionPointService.GetInsertionPoints (
				document.Editor,
				parsedDocument,
				declaringType,
				editor.CaretOffset
			);
			var options = new InsertionModeOptions (
				GettextCatalog.GetString ("Create new method"),
				insertionPoints,
				point => {
					if (!point.Success) 
						return;
					var indent = "\t";
					var sb = new StringBuilder ();
					if (enclosingSymbol != null && enclosingSymbol.IsStatic)
						sb.Append ("static ");
					sb.Append ("void ");
					int pos2 = sb.Length;
					sb.Append (this.DisplayText);
					sb.Append (' ');
					sb.Append("(");

					var delegateMethod = delegateType.GetDelegateInvokeMethod();
					for (int k = 0; k < delegateMethod.Parameters.Length; k++) {
						if (k > 0) {
							sb.Append(", ");
						}
						sb.Append (RoslynCompletionData.SafeMinimalDisplayString (delegateMethod.Parameters [k], semanticModel, position, MonoDevelop.Ide.TypeSystem.Ambience.LabelFormat)); 
					}
					sb.Append(")");

					sb.Append (editor.EolMarker);
					sb.Append (indent);
					sb.Append ("{");
					sb.Append (editor.EolMarker);
					sb.Append (indent);
					sb.Append (editor.Options.GetIndentationString ());
					//int cursorPos = pos + sb.Length;
					sb.Append (editor.EolMarker);
					sb.Append (indent);
					sb.Append ("}");
					point.InsertionPoint.Insert (document.Editor, document, sb.ToString ());
					//			// start text link mode after insert
					//			var links = new List<TextLink> ();
					//			var link = new TextLink ("name");
					//			
					//			link.AddLink (new TextSegment (initialOffset, this.DisplayText.Length));
					//			link.AddLink (new TextSegment (initialOffset + pos + pos2, this.DisplayText.Length));
					//			links.Add (link);
					//			editor.StartTextLinkMode (new TextLinkModeOptions (links));
				}
			);

			editor.StartInsertionMode (options);

		}
		public virtual void RunShowCodeTemplatesWindow ()
		{
			ICompletionDataList completionList = null;
			int cpos, wlen;
			if (!GetCompletionCommandOffset (out cpos, out wlen)) {
				cpos = Editor.CaretOffset;
				wlen = 0;
			}

			var ctx = CompletionWidget.CreateCodeCompletionContext (cpos);
			ctx.TriggerWordLength = wlen;
			completionList = Editor.IsSomethingSelected ? ShowCodeSurroundingsCommand (ctx) : ShowCodeTemplatesCommand (ctx);
			if (completionList == null) {
				return;
			}
			var wnd = new CompletionListWindow (Gtk.WindowType.Toplevel);
			wnd.TypeHint = Gdk.WindowTypeHint.Dialog;
			wnd.SkipPagerHint = true;
			wnd.SkipTaskbarHint = true;
			wnd.Decorated = false;
			wnd.Extension = this;
			wnd.ShowListWindow ((char)0, completionList, CompletionWidget, ctx);
		}