diff options
Diffstat (limited to 'main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDocDocumentationProvider.cs')
-rw-r--r-- | main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDocDocumentationProvider.cs | 146 |
1 files changed, 44 insertions, 102 deletions
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDocDocumentationProvider.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDocDocumentationProvider.cs index 67e8fd2bf2..9d98c1beb5 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDocDocumentationProvider.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDocDocumentationProvider.cs @@ -26,29 +26,18 @@ using System; using System.Collections.Generic; using System.Xml; -using ICSharpCode.NRefactory.TypeSystem; -using ICSharpCode.NRefactory.TypeSystem.Implementation; using MonoDevelop.Core; -using ICSharpCode.NRefactory.Documentation; using System.Text; +using Microsoft.CodeAnalysis; namespace MonoDevelop.Ide.TypeSystem { - [Serializable] - public class MonoDocDocumentationProvider : IDocumentationProvider + static class MonoDocDocumentationProvider { - [NonSerialized] - bool hadError; - - public MonoDocDocumentationProvider () - { - } + static bool hadError; + static Dictionary<string, string> commentCache = new Dictionary<string, string> (); - #region IDocumentationProvider implementation - [NonSerialized] - readonly Dictionary<string, DocumentationComment> commentCache = new Dictionary<string, DocumentationComment> (); - - public DocumentationComment GetDocumentation (IEntity entity) + public static string GetDocumentation (ISymbol entity) { if (entity == null) throw new System.ArgumentNullException ("entity"); @@ -57,8 +46,10 @@ namespace MonoDevelop.Ide.TypeSystem // shouldn't try it again. A corrupt .zip file could cause long tooltip delays otherwise. if (hadError) return null; - var idString = entity.GetIdString (); - DocumentationComment result; + var idString = entity.GetDocumentationCommentId (); + if (string.IsNullOrEmpty (idString)) + return null; + string result; if (commentCache.TryGetValue (idString, out result)) return result; XmlDocument doc = null; @@ -66,21 +57,20 @@ namespace MonoDevelop.Ide.TypeSystem var helpTree = MonoDevelop.Projects.HelpService.HelpTree; if (helpTree == null) return null; - if (entity.SymbolKind == SymbolKind.TypeDefinition) { + if (entity.Kind == SymbolKind.NamedType) { doc = helpTree.GetHelpXml (idString); } else { - var parentId = entity.DeclaringTypeDefinition.GetIdString (); - + var containingType = entity.ContainingType; + if (containingType == null) + return null; + var parentId = containingType.GetDocumentationCommentId (); doc = helpTree.GetHelpXml (parentId); if (doc == null) return null; XmlNode node = SelectNode (doc, entity); - if (node != null) - return commentCache [idString] = new DocumentationComment (node.OuterXml, new SimpleTypeResolveContext (entity)); + return commentCache [idString] = node.OuterXml; return null; -// var node = doc.SelectSingleNode ("/Type/Members/Member") -// return new DocumentationComment (doc.OuterXml, new SimpleTypeResolveContext (entity)); } } catch (Exception e) { hadError = true; @@ -90,33 +80,34 @@ namespace MonoDevelop.Ide.TypeSystem commentCache [idString] = null; return null; } - return commentCache [idString] = new DocumentationComment (doc.OuterXml, new SimpleTypeResolveContext (entity)); + return commentCache [idString] = doc.OuterXml; } - public XmlNode SelectNode (XmlDocument doc, IEntity entity) + internal static void ClearCommentCache () { - switch (entity.SymbolKind) { - case SymbolKind.None: - case SymbolKind.TypeDefinition: + commentCache = new Dictionary<string, string> (); + } + + static XmlNode SelectNode (XmlDocument doc, ISymbol entity) + { + switch (entity.Kind) { + case SymbolKind.NamedType: case SymbolKind.Field: case SymbolKind.Property: - case SymbolKind.Indexer: case SymbolKind.Event: return doc.SelectSingleNode ("/Type/Members/Member[@MemberName='" + entity.Name + "']"); case SymbolKind.Method: - case SymbolKind.Operator: - case SymbolKind.Destructor: - return SelectOverload (doc.SelectNodes ("/Type/Members/Member[@MemberName='" + entity.Name + "']"), (IParameterizedMember)entity); - case SymbolKind.Constructor: - return SelectOverload (doc.SelectNodes ("/Type/Members/Member[@MemberName='.ctor']"), (IParameterizedMember)entity); - + var method = (IMethodSymbol)entity; + if (method.MethodKind == MethodKind.Constructor) + return SelectOverload (doc.SelectNodes ("/Type/Members/Member[@MemberName='.ctor']"), method); + return SelectOverload (doc.SelectNodes ("/Type/Members/Member[@MemberName='" + entity.Name + "']"), method); default: throw new ArgumentOutOfRangeException (); } - } - public XmlNode SelectOverload (XmlNodeList nodes, IParameterizedMember entity) + + static XmlNode SelectOverload (XmlNodeList nodes, IMethodSymbol entity) { XmlNode node = null; if (nodes.Count == 1) { @@ -125,12 +116,12 @@ namespace MonoDevelop.Ide.TypeSystem var p = entity.Parameters; foreach (XmlNode curNode in nodes) { var paramList = curNode.SelectNodes ("Parameters/*"); - if (p.Count == 0 && paramList.Count == 0) + if (p.Length == 0 && paramList.Count == 0) return curNode; - if (p.Count != paramList.Count) + if (p.Length != paramList.Count) continue; bool matched = true; - for (int i = 0; i < p.Count; i++) { + for (int i = 0; i < p.Length; i++) { var idString = GetTypeString (p [i].Type); if (idString != paramList [i].Attributes ["Type"].Value) { matched = false; @@ -148,69 +139,20 @@ namespace MonoDevelop.Ide.TypeSystem } return null; } - - static string GetTypeString (IType t) + static string GetTypeString (ITypeSymbol t) { - if (t.Kind == TypeKind.Unknown) - return t.Name; - - if (t.Kind == TypeKind.TypeParameter) - return t.FullName; - - var typeWithElementType = t as TypeWithElementType; - if (typeWithElementType != null) { - var sb = new StringBuilder (); - - if (typeWithElementType is PointerType) { - sb.Append ("*"); - } - sb.Append (GetTypeString (typeWithElementType.ElementType)); - - if (typeWithElementType is ArrayType) { - sb.Append ("["); - sb.Append (new string (',', ((ArrayType)t).Dimensions - 1)); - sb.Append ("]"); - } - return sb.ToString (); - } - - ITypeDefinition typeDef = t.GetDefinition (); - if (typeDef == null) - return ""; - - var result = new StringBuilder (); - - result.Append (typeDef.Namespace + "."); - - if (typeDef.DeclaringTypeDefinition != null) { - string typeString = GetTypeString (typeDef.DeclaringTypeDefinition); - result.Append (typeString); - result.Append ("."); - } - - result.Append (typeDef.Name); - - if (typeDef.TypeParameterCount > 0) { - result.Append ("<"); - for (int i = 0; i < typeDef.TypeParameterCount; i++) { - if (i > 0) - result.Append (","); - if (t.TypeArguments.Count > 0) { - result.Append (GetTypeString (t.TypeArguments [i])); - } else { - result.Append (typeDef.TypeParameters [i].FullName); - } - } - result.Append (">"); + switch (t.TypeKind) { + case TypeKind.Array: + var arr = (IArrayTypeSymbol)t; + return GetTypeString (arr.ElementType) + "[" + new string (',', arr.Rank - 1) + "]"; + case TypeKind.Pointer: + var ptr = (IPointerTypeSymbol)t; + return "*" + GetTypeString (ptr.PointedAtType); + default: + var docComment = t.GetDocumentationCommentId (); + return docComment != null && docComment.Length > 2 ? docComment.Substring (2) : t.Name; } - - return result.ToString (); } - - #endregion - - } } - |