Skip to content
This repository has been archived by the owner on Oct 4, 2021. It is now read-only.

Commit

Permalink
[CSharpBinding] Editor tooltips are now taking the context into
Browse files Browse the repository at this point in the history
account.
  • Loading branch information
mkrueger committed Jun 28, 2012
1 parent 571aa95 commit 4a95275
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 55 deletions.
Expand Up @@ -41,6 +41,7 @@
using ICSharpCode.NRefactory.CSharp.TypeSystem;
using System.Threading;
using MonoDevelop.Refactoring;
using ICSharpCode.NRefactory.CSharp.Refactoring;

namespace MonoDevelop.CSharp.Resolver
{
Expand Down Expand Up @@ -117,7 +118,7 @@ public ResolveResult GetLanguageItem (MonoDevelop.Ide.Gui.Document doc, int offs
static string paramStr = GettextCatalog.GetString ("Parameter");
static string localStr = GettextCatalog.GetString ("Local variable");
static string methodStr = GettextCatalog.GetString ("Method");

static string namespaceStr = GettextCatalog.GetString ("Namespace");
static string GetString (IType type)
{
Expand Down Expand Up @@ -174,42 +175,39 @@ string GetConst (object obj)
return "'" + obj + "'";
return obj.ToString ();
}

public string CreateTooltip (IParsedFile unit, ResolveResult result, string errorInformations, Ambience ambience, Gdk.ModifierType modifierState)
static CSharpAmbience ambience = new CSharpAmbience ();

static TypeSystemAstBuilder CreateBuilder (MonoDevelop.Ide.Gui.Document doc, int offset)
{
var ctx = doc.ParsedDocument.ParsedFile.GetTypeResolveContext (doc.Compilation, doc.Editor.Caret.Location) as CSharpTypeResolveContext;
var state = new CSharpResolver (ctx);
var builder = new TypeSystemAstBuilder (state);
builder.AddAnnotations = true;
var dt = state.CurrentTypeDefinition;
var declaring = ctx.CurrentTypeDefinition != null ? ctx.CurrentTypeDefinition.DeclaringTypeDefinition : null;
if (declaring != null) {
while (dt != null) {
if (dt.Equals (declaring)) {
builder.AlwaysUseShortTypeNames = true;
break;
}
dt = dt.DeclaringTypeDefinition;
}
}
return builder;
}

internal static MonoDevelop.CSharp.Completion.MemberCompletionData.MyAmbience CreateAmbience (Document doc, int offset)
{
return new MonoDevelop.CSharp.Completion.MemberCompletionData.MyAmbience (CreateBuilder (doc, offset));
}

public string CreateTooltip (MonoDevelop.Ide.Gui.Document doc, int offset, ResolveResult result, string errorInformations, Gdk.ModifierType modifierState)
{
OutputSettings settings = new OutputSettings (OutputFlags.ClassBrowserEntries | OutputFlags.IncludeParameterName | OutputFlags.IncludeKeywords | OutputFlags.IncludeMarkup | OutputFlags.UseFullName);
// if ((Gdk.ModifierType.ShiftMask & modifierState) == Gdk.ModifierType.ShiftMask) {
// settings.EmitNameCallback = delegate(object domVisitable, ref string outString) {
// // crop used namespaces.
// if (unit != null) {
// int len = 0;
// foreach (var u in unit.Usings) {
// foreach (string ns in u.Namespaces) {
// if (outString.StartsWith (ns + ".")) {
// len = Math.Max (len, ns.Length + 1);
// }
// }
// }
// string newName = outString.Substring (len);
// int count = 0;
// // check if there is a name clash.
// if (dom.GetType (newName) != null)
// count++;
// foreach (IUsing u in unit.Usings) {
// foreach (string ns in u.Namespaces) {
// if (dom.GetType (ns + "." + newName) != null)
// count++;
// }
// }
// if (len > 0 && count == 1)
// outString = newName;
// }
// };
// }

// Approximate value for usual case
StringBuilder s = new StringBuilder (150);
string doc = null;
string documentation = null;
if (result != null) {
if (result is UnknownIdentifierResolveResult) {
s.Append (String.Format (GettextCatalog.GetString ("Unresolved identifier '{0}'"), ((UnknownIdentifierResolveResult)result).Identifier));
Expand All @@ -232,15 +230,14 @@ public string CreateTooltip (IParsedFile unit, ResolveResult result, string erro
foreach (var l in mrr.GetExtensionMethods ()) {
allMethods.AddRange (l);
}

var method = allMethods.FirstOrDefault ();
if (method != null) {
s.Append (ambience.GetString (method, settings));
s.Append (GLib.Markup.EscapeText (CreateAmbience (doc, offset).ConvertEntity (method)));
if (allMethods.Count > 1) {
int overloadCount = allMethods.Count - 1;
s.Append (string.Format (GettextCatalog.GetPluralString (" (+{0} overload)", " (+{0} overloads)", overloadCount), overloadCount));
}
doc = AmbienceService.GetDocumentationSummary (method);
documentation = AmbienceService.GetDocumentationSummary (method);
}
} else if (result is MemberResolveResult) {
var member = ((MemberResolveResult)result).Member;
Expand All @@ -249,16 +246,16 @@ public string CreateTooltip (IParsedFile unit, ResolveResult result, string erro
s.Append ("</i></small>\n");
var field = member as IField;
if (field != null && field.IsConst) {
s.Append (ambience.GetString (field.Type, settings));
s.Append (GLib.Markup.EscapeText (CreateAmbience (doc, offset).ConvertType (field.Type)));
s.Append (" ");
s.Append (field.Name);
s.Append (" = ");
s.Append (GetConst (field.ConstantValue));
s.Append (";");
} else {
s.Append (ambience.GetString (member, settings));
s.Append (GLib.Markup.EscapeText (CreateAmbience (doc, offset).ConvertEntity (member)));
}
doc = AmbienceService.GetDocumentationSummary (member);
documentation = AmbienceService.GetDocumentationSummary (member);
} else if (result is NamespaceResolveResult) {
s.Append ("<small><i>");
s.Append (namespaceStr);
Expand All @@ -274,12 +271,12 @@ public string CreateTooltip (IParsedFile unit, ResolveResult result, string erro
}
settings.OutputFlags |= OutputFlags.UseFullName;
s.Append (ambience.GetString (tr.Type, settings));
doc = AmbienceService.GetDocumentationSummary (tr.Type.GetDefinition ());
documentation = AmbienceService.GetDocumentationSummary (tr.Type.GetDefinition ());
}

if (!string.IsNullOrEmpty (doc)) {
if (!string.IsNullOrEmpty (documentation)) {
s.Append ("\n<small>");
s.Append (AmbienceService.GetDocumentationMarkup ("<summary>" + doc + "</summary>"));
s.Append (AmbienceService.GetDocumentationMarkup ("<summary>" + documentation + "</summary>"));
s.Append ("</small>");
}
}
Expand Down
Expand Up @@ -41,6 +41,7 @@
using MonoDevelop.Core;
using System.Collections.Generic;
using System.Linq;
using MonoDevelop.CSharp.Resolver;

namespace MonoDevelop.SourceEditor
{
Expand Down Expand Up @@ -122,7 +123,7 @@ public Gtk.Window CreateTooltipWindow (Mono.TextEditor.TextEditor editor, int of
Console.WriteLine (ev.ErrorResolveResult);
tooltip = string.Format ("Error while resolving: '{0}'", ev.ErrorNode.GetText ());
} else {
tooltip = CreateTooltip (titem.Result, ambience);
tooltip = CreateTooltip (titem.Result, offset, ambience);
}
} else {
return null;
Expand Down Expand Up @@ -201,12 +202,15 @@ string GetConst (object obj)
return obj.ToString ();
}

public string CreateTooltip (ResolveResult result, Ambience ambience)
public string CreateTooltip (ResolveResult result, int offset, Ambience ambience)
{
var doc = IdeApp.Workbench.ActiveDocument;
if (doc == null)
return null;
OutputSettings settings = new OutputSettings (OutputFlags.ClassBrowserEntries | OutputFlags.IncludeParameterName | OutputFlags.IncludeKeywords | OutputFlags.IncludeMarkup | OutputFlags.UseFullName);
// Approximate value for usual case
StringBuilder s = new StringBuilder (150);
string doc = null;
string documentation = null;
if (result is UnknownIdentifierResolveResult) {
s.Append (String.Format (GettextCatalog.GetString ("Unresolved identifier '{0}'"), ((UnknownIdentifierResolveResult)result).Identifier));
} else if (result.IsError) {
Expand All @@ -220,6 +224,7 @@ public string CreateTooltip (ResolveResult result, Ambience ambience)
s.Append (" ");
s.Append (lr.Variable.Name);
} else if (result is MethodGroupResolveResult) {

var mrr = (MethodGroupResolveResult)result;
s.Append ("<small><i>");
s.Append (methodStr);
Expand All @@ -231,12 +236,12 @@ public string CreateTooltip (ResolveResult result, Ambience ambience)

var method = allMethods.FirstOrDefault ();
if (method != null) {
s.Append (ambience.GetString (method, settings));
s.Append (GLib.Markup.EscapeText (TextEditorResolverProvider.CreateAmbience (doc, offset).ConvertEntity (method)));
if (allMethods.Count > 1) {
int overloadCount = allMethods.Count - 1;
s.Append (string.Format (GettextCatalog.GetPluralString (" (+{0} overload)", " (+{0} overloads)", overloadCount), overloadCount));
}
doc = AmbienceService.GetDocumentationSummary (method);
documentation = AmbienceService.GetDocumentationSummary (method);
}
} else if (result is MemberResolveResult) {
var member = ((MemberResolveResult)result).Member;
Expand All @@ -245,16 +250,16 @@ public string CreateTooltip (ResolveResult result, Ambience ambience)
s.Append ("</i></small>\n");
var field = member as IField;
if (field != null && field.IsConst) {
s.Append (ambience.GetString (field.Type, settings));
s.Append (GLib.Markup.EscapeText (TextEditorResolverProvider.CreateAmbience (doc, offset).ConvertType (field.Type)));
s.Append (" ");
s.Append (field.Name);
s.Append (" = ");
s.Append (GetConst (field.ConstantValue));
s.Append (";");
} else {
s.Append (ambience.GetString (member, settings));
s.Append (GLib.Markup.EscapeText (TextEditorResolverProvider.CreateAmbience (doc, offset).ConvertEntity (member)));
}
doc = AmbienceService.GetDocumentationSummary (member);
documentation = AmbienceService.GetDocumentationSummary (member);
} else if (result is NamespaceResolveResult) {
s.Append ("<small><i>");
s.Append (namespaceStr);
Expand All @@ -270,12 +275,12 @@ public string CreateTooltip (ResolveResult result, Ambience ambience)
}
settings.OutputFlags |= OutputFlags.UseFullName | OutputFlags.UseFullInnerTypeName;
s.Append (ambience.GetString (tr.Type, settings));
doc = AmbienceService.GetDocumentationSummary (tr.Type.GetDefinition ());
documentation = AmbienceService.GetDocumentationSummary (tr.Type.GetDefinition ());
}

if (!string.IsNullOrEmpty (doc)) {
if (!string.IsNullOrEmpty (documentation)) {
s.Append ("\n<small>");
s.Append (AmbienceService.GetDocumentationMarkup ("<summary>" + doc + "</summary>"));
s.Append (AmbienceService.GetDocumentationMarkup ("<summary>" + documentation + "</summary>"));
s.Append ("</small>");
}
return s.ToString ();
Expand Down
4 changes: 4 additions & 0 deletions main/src/addins/CSharpBinding/gtk-gui/objects.xml
Expand Up @@ -308,4 +308,8 @@
<itemgroups />
<signals />
</object>
<object type="MonoDevelop.Ide.Projects.OptionPanels.PortableRuntimeOptionsPanelWidget" palette-category="General" allow-children="false" base-type="Gtk.Bin">
<itemgroups />
<signals />
</object>
</objects>
Expand Up @@ -55,7 +55,7 @@ public LanguageItemWindow (ExtensibleTextEditor ed, Gdk.ModifierType modifierSta
if (ur.TargetType.Kind != TypeKind.Unknown)
tooltip = string.Format ("error CS0117: `{0}' does not contain a definition for `{1}'", ur.TargetType.FullName, ur.MemberName);
} else if (result != null && ed.TextEditorResolverProvider != null) {
tooltip = ed.TextEditorResolverProvider.CreateTooltip (unit, result, errorInformations, ambience, modifierState);
//tooltip = ed.TextEditorResolverProvider.CreateTooltip (unit, result, errorInformations, ambience, modifierState);
// TODO: Type sysetm conversion. (btw. this isn't required because the analyzer should provide semantic error messages.)
// if (result.ResolveErrors.Count > 0) {
// StringBuilder sb = new StringBuilder ();
Expand Down
Expand Up @@ -48,7 +48,7 @@ public interface ITextEditorResolverProvider
ResolveResult GetLanguageItem (MonoDevelop.Ide.Gui.Document document, int offset, out DomRegion expressionRegion);
ResolveResult GetLanguageItem (MonoDevelop.Ide.Gui.Document document, int offset, string identifier);

string CreateTooltip (IParsedFile unit, ResolveResult result, string errorInformations, Ambience ambience, Gdk.ModifierType modifierState);
string CreateTooltip (MonoDevelop.Ide.Gui.Document document, int offset, ResolveResult result, string errorInformations, Gdk.ModifierType modifierState);

}

Expand Down

0 comments on commit 4a95275

Please sign in to comment.