From 4a95275cf7d0418250d87844550934b849b1153d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Kr=C3=BCger?= Date: Thu, 28 Jun 2012 11:52:05 +0200 Subject: [PATCH] [CSharpBinding] Editor tooltips are now taking the context into account. --- .../TextEditorResolverProvider.cs | 81 +++++++++---------- .../LanguageItemTooltipProvider.cs | 27 ++++--- .../addins/CSharpBinding/gtk-gui/objects.xml | 4 + .../LanguageItemWindow.cs | 2 +- .../ITextEditorResolver.cs | 2 +- 5 files changed, 61 insertions(+), 55 deletions(-) diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Resolver/TextEditorResolverProvider.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Resolver/TextEditorResolverProvider.cs index 9b748e6201a..a64a8ed3d6e 100644 --- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Resolver/TextEditorResolverProvider.cs +++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Resolver/TextEditorResolverProvider.cs @@ -41,6 +41,7 @@ using ICSharpCode.NRefactory.CSharp.TypeSystem; using System.Threading; using MonoDevelop.Refactoring; +using ICSharpCode.NRefactory.CSharp.Refactoring; namespace MonoDevelop.CSharp.Resolver { @@ -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) { @@ -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)); @@ -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; @@ -249,16 +246,16 @@ public string CreateTooltip (IParsedFile unit, ResolveResult result, string erro s.Append ("\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 (""); s.Append (namespaceStr); @@ -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"); - s.Append (AmbienceService.GetDocumentationMarkup ("" + doc + "")); + s.Append (AmbienceService.GetDocumentationMarkup ("" + documentation + "")); s.Append (""); } } diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Tooltips/LanguageItemTooltipProvider.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Tooltips/LanguageItemTooltipProvider.cs index 0247ad556f0..1c6e8f04618 100644 --- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Tooltips/LanguageItemTooltipProvider.cs +++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Tooltips/LanguageItemTooltipProvider.cs @@ -41,6 +41,7 @@ using MonoDevelop.Core; using System.Collections.Generic; using System.Linq; +using MonoDevelop.CSharp.Resolver; namespace MonoDevelop.SourceEditor { @@ -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; @@ -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) { @@ -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 (""); s.Append (methodStr); @@ -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; @@ -245,16 +250,16 @@ public string CreateTooltip (ResolveResult result, Ambience ambience) s.Append ("\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 (""); s.Append (namespaceStr); @@ -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"); - s.Append (AmbienceService.GetDocumentationMarkup ("" + doc + "")); + s.Append (AmbienceService.GetDocumentationMarkup ("" + documentation + "")); s.Append (""); } return s.ToString (); diff --git a/main/src/addins/CSharpBinding/gtk-gui/objects.xml b/main/src/addins/CSharpBinding/gtk-gui/objects.xml index ef4e673007c..c432cd0fa6e 100644 --- a/main/src/addins/CSharpBinding/gtk-gui/objects.xml +++ b/main/src/addins/CSharpBinding/gtk-gui/objects.xml @@ -308,4 +308,8 @@ + + + + \ No newline at end of file diff --git a/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/LanguageItemWindow.cs b/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/LanguageItemWindow.cs index f1541bddb0b..706dbd1c921 100644 --- a/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/LanguageItemWindow.cs +++ b/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/LanguageItemWindow.cs @@ -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 (); diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Content/ITextEditorResolver.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Content/ITextEditorResolver.cs index 4c62e2a49b1..5c1006a1924 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Content/ITextEditorResolver.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Content/ITextEditorResolver.cs @@ -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); }