1
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
2
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
5
using System.Collections.Generic;
6
using ICSharpCode.Core;
7
using ICSharpCode.SharpDevelop.Dom;
8
using ICSharpCode.SharpDevelop.Dom.Refactoring;
10
namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
12
public sealed class OverrideCompletionItem : ICompletionItem
16
public IMember Member {
17
get { return member; }
23
static readonly List<ICompletionItemHandler> handlers = AddInTree.BuildItems<ICompletionItemHandler>("/SharpDevelop/ViewContent/TextEditor/OverrideCompletionHandler", null, false);
25
public OverrideCompletionItem(IMember member)
28
throw new ArgumentNullException("member");
31
this.text = GetName(member, ConversionFlags.ShowParameterList);
32
this.image = ClassBrowserIconService.GetIcon(member);
43
public string Description {
45
return "override " + GetName(member, ConversionFlags.ShowReturnType
46
| ConversionFlags.ShowParameterList
47
| ConversionFlags.ShowAccessibility)
48
+ "\n\n" + CodeCompletionItem.ConvertDocumentation(member.Documentation);
52
double ICompletionItem.Priority { get { return 0; } }
54
static string GetName(IMember member, ConversionFlags flags)
56
IAmbience ambience = AmbienceService.GetCurrentAmbience();
57
ambience.ConversionFlags = flags | ConversionFlags.ShowParameterNames | ConversionFlags.ShowTypeParameterList;
58
return ambience.Convert(member);
61
public void Complete(CompletionContext context)
63
ITextEditor editor = context.Editor;
64
ClassFinder classFinder = new ClassFinder(ParserService.GetParseInformation(editor.FileName),
65
editor.Caret.Line, editor.Caret.Column);
66
int caretPosition = editor.Caret.Offset;
67
IDocumentLine line = editor.Document.GetLine(editor.Caret.Line);
68
string lineText = editor.Document.GetText(line.Offset, caretPosition - line.Offset);
69
foreach (char c in lineText) {
70
if (!char.IsWhiteSpace(c) && !char.IsLetterOrDigit(c)) {
71
editor.Document.Replace(context.StartOffset, context.Length, this.Text);
72
context.EndOffset = context.StartOffset + this.Text.Length;
77
string indentation = lineText.Substring(0, lineText.Length - lineText.TrimStart().Length);
79
editor.Document.Remove(line.Offset, caretPosition - line.Offset);
81
foreach (ICompletionItemHandler handler in handlers) {
82
if (handler.Handles(this)) {
83
editor.Document.Insert(line.Offset, indentation);
84
handler.Insert(context, this);
89
CodeGenerator codeGen = ParserService.CurrentProjectContent.Language.CodeGenerator;
91
string text = codeGen.GenerateCode(codeGen.GetOverridingMethod(member, classFinder), indentation);
92
text = text.TrimEnd(); // remove newline from end
94
editor.Document.Insert(line.Offset, text);
96
int endPos = line.Offset + text.Length;
97
line = editor.Document.GetLineForOffset(endPos);
98
editor.JumpTo(line.LineNumber, endPos - line.Offset + 1);