1
// MemberCompletionData.cs
4
// Mike Krüger <mkrueger@novell.com>
6
// Copyright (c) 2008 Novell, Inc (http://www.novell.com)
8
// Permission is hereby granted, free of charge, to any person obtaining a copy
9
// of this software and associated documentation files (the "Software"), to deal
10
// in the Software without restriction, including without limitation the rights
11
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
// copies of the Software, and to permit persons to whom the Software is
13
// furnished to do so, subject to the following conditions:
15
// The above copyright notice and this permission notice shall be included in
16
// all copies or substantial portions of the Software.
18
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
28
using System.Collections.Generic;
31
using MonoDevelop.Projects.Gui.Completion;
32
using MonoDevelop.Projects.Dom;
33
using MonoDevelop.Projects.Dom.Output;
35
using MonoDevelop.Core;
36
using MonoDevelop.Ide.Gui;
37
using MonoDevelop.Ide.Gui.Content;
38
using MonoDevelop.CSharp.Dom;
40
namespace MonoDevelop.CSharp.Completion
42
public class MemberCompletionData : IMemberCompletionData, IOverloadedCompletionData
45
bool hideExtensionParameter = true;
46
static CSharpAmbience ambience = new CSharpAmbience ();
47
bool descriptionCreated = false;
49
string description, completionString;
52
Dictionary<string, ICompletionData> overloads;
54
public string Description {
61
public string CompletionText {
62
get { return completionString; }
63
set { completionString = value; }
71
public string DisplayText {
73
if (displayText == null) {
74
displayText = ambience.GetString (Member, flags | OutputFlags.HideGenericParameterNames);
83
if (Member is IMember)
84
return ((IMember)Member).StockIcon;
85
if (Member is IParameter)
86
return ((IParameter)Member).StockIcon;
87
if (Member is LocalVariable)
88
return ((LocalVariable)Member).StockIcon;
93
public DisplayFlags DisplayFlags { get; set; }
95
public bool HideExtensionParameter {
97
return hideExtensionParameter;
100
hideExtensionParameter = value;
104
public MemberCompletionData (INode member, OutputFlags flags)
108
DisplayFlags = DisplayFlags.DescriptionHasMarkup;
109
IMember m = Member as IMember;
110
if (m != null && m.IsObsolete)
111
DisplayFlags |= DisplayFlags.Obsolete;
114
void SetMember (INode member)
116
this.Member = member;
117
if (member is IParameter) {
118
this.completionString = ((IParameter)member).Name;
120
this.completionString = ambience.GetString (member, flags & ~OutputFlags.IncludeGenerics);
122
descriptionCreated = false;
126
void CheckDescription ()
128
if (descriptionCreated)
131
StringBuilder sb = new StringBuilder ();
133
descriptionCreated = true;
134
if (Member is IMethod && ((IMethod)Member).WasExtended)
135
sb.Append (GettextCatalog.GetString ("(Extension) "));
136
sb.Append (ambience.GetString (Member,
137
OutputFlags.ClassBrowserEntries | OutputFlags.IncludeKeywords | OutputFlags.UseFullName | OutputFlags.IncludeParameterName | OutputFlags.IncludeMarkup
138
| (HideExtensionParameter ? OutputFlags.HideExtensionsParameter : OutputFlags.None)));
140
if (Member is IMember) {
141
if ((Member as IMember).IsObsolete) {
143
sb.Append (GettextCatalog.GetString ("[Obsolete]"));
145
string docMarkup = AmbienceService.GetDocumentationMarkup ("<summary>" + AmbienceService.GetDocumentationSummary ((IMember)Member) + "</summary>", new AmbienceService.DocumentationFormatOptions {
148
if (!string.IsNullOrEmpty (docMarkup)) {
150
sb.Append (docMarkup);
153
description = sb.ToString ();
157
#region IOverloadedCompletionData implementation
159
class OverloadSorter : IComparer<ICompletionData>
161
OutputFlags flags = OutputFlags.ClassBrowserEntries | OutputFlags.IncludeParameterName;
163
public int Compare (ICompletionData x, ICompletionData y)
165
INode mx = ((MemberCompletionData)x).Member;
166
INode my = ((MemberCompletionData)y).Member;
169
if (mx is IType && my is IType) {
170
result = ((((IType)mx).TypeParameters.Count).CompareTo (((IType)my).TypeParameters.Count));
175
if (mx is IMethod && my is IMethod) {
176
IMethod mmx = (IMethod) mx;//, mmy = (IMethod) my;
177
result = (mmx.TypeParameters.Count).CompareTo (mmx.TypeParameters.Count);
180
result = (mmx.Parameters.Count).CompareTo (mmx.Parameters.Count);
185
string sx = ambience.GetString (mx, flags);
186
string sy = ambience.GetString (my, flags);
187
result = sx.Length.CompareTo (sy.Length);
188
return result == 0? string.Compare (sx, sy) : result;
192
public IEnumerable<ICompletionData> GetOverloadedData ()
194
if (overloads == null)
195
return new ICompletionData[] { this };
197
List<ICompletionData> sorted = new List<ICompletionData> (overloads.Values);
199
sorted.Sort (new OverloadSorter ());
203
public bool IsOverloaded {
204
get { return overloads != null && overloads.Count > 0; }
207
public void AddOverload (MemberCompletionData overload)
209
if (overloads == null)
210
overloads = new Dictionary<string, ICompletionData> ();
211
if (overload.Member is IMember && Member is IMember) {
212
// filter virtual & overriden members that came from base classes
213
// note that the overload tree is traversed top down.
214
IMember member = Member as IMember;
215
if ((member.IsVirtual || member.IsOverride) && member.DeclaringType != null && ((IMember)overload.Member).DeclaringType != null && member.DeclaringType.DecoratedFullName != ((IMember)overload.Member).DeclaringType.DecoratedFullName) {
216
string str1 = ambience.GetString (member, flags);
217
string str2 = ambience.GetString (overload.Member, flags);
219
if (string.IsNullOrEmpty (AmbienceService.GetDocumentationSummary ((IMember)Member)) && !string.IsNullOrEmpty (AmbienceService.GetDocumentationSummary ((IMember)overload.Member)))
220
SetMember (overload.Member);
225
string MemberId = (overload.Member as IMember).HelpUrl;
226
if (Member is IMethod && overload.Member is IMethod) {
227
string signature1 = ambience.GetString (Member, OutputFlags.IncludeParameters);
228
string signature2 = ambience.GetString (overload.Member, OutputFlags.IncludeParameters);
229
if (signature1 == signature2)
233
if (MemberId != (this.Member as IMember).HelpUrl && !overloads.ContainsKey (MemberId)) {
234
if (((IMember)overload.Member).IsPartial)
236
overloads[MemberId] = overload;
238
//if any of the overloads is obsolete, we should not mark the item obsolete
239
if (!(overload.Member as IMember).IsObsolete)
240
DisplayFlags &= ~DisplayFlags.Obsolete;
242
//make sure that if there are generic overloads, we show a generic signature
243
if (overload.Member is IType && Member is IType && ((IType)Member).TypeParameters.Count == 0 && ((IType)overload.Member).TypeParameters.Count > 0) {
244
displayText = overload.DisplayText;
246
if (overload.Member is IMethod && Member is IMethod && ((IMethod)Member).TypeParameters.Count == 0 && ((IMethod)overload.Member).TypeParameters.Count > 0) {
247
displayText = overload.DisplayText;