public static string GetUrl(this IMemberDefinition member, PackageTargetFramework framework, bool linkToCode) { var url = framework.FindTypeUrl(member.DeclaringType); if (string.IsNullOrEmpty(url)) { return(""); } if (linkToCode && framework.Package.AllowedToDecompile) { url += "?code=true"; } if (member is TypeDefinition t && !t.IsNested) { return(url); } return(url + "#" + Uri.EscapeDataString(member.GetXmlName())); }
public static void WritePrototypeHtml(this TypeDefinition member, TextWriter w, PackageTargetFramework framework, bool linkToCode) { if (member.IsNestedFamily || member.IsNestedFamilyOrAssembly) { w.Write("<span class=\"c-kw\">protected</span> "); } else if (member.IsPublic || member.IsNestedPublic) { w.Write("<span class=\"c-kw\">public</span> "); } if (member.IsSealed && member.IsAbstract) { w.Write("<span class=\"c-kw\">static</span> "); } else if (member.IsSealed && !member.IsEnum && !member.IsValueType) { w.Write("<span class=\"c-kw\">sealed</span> "); } else if (member.IsAbstract && !member.IsInterface) { w.Write("<span class=\"c-kw\">abstract</span> "); } if (member.IsEnum) { w.Write("<span class=\"c-kw\">enum</span> "); } else if (member.IsValueType) { w.Write("<span class=\"c-kw\">struct</span> "); } else if (member.IsInterface) { w.Write("<span class=\"c-kw\">interface</span> "); } else if (member.IsDelegate()) { w.Write("<span class=\"c-kw\">delegate</span> "); } else { w.Write("<span class=\"c-kw\">class</span> "); } var id = member.GetXmlName(); var name = member.Name; var ni = name.LastIndexOf('`'); if (ni > 0) { name = name.Substring(0, ni); } var url = framework?.FindTypeUrl(member); if (url != null) { w.Write($"<a id=\"{id}\" href=\"{url}\" class=\"c-td\">"); WriteEncoded(name, w); w.Write("</a>"); } else { w.Write($"<span id=\"{id}\" class=\"c-td\">"); WriteEncoded(name, w); w.Write("</span>"); } if (member.HasGenericParameters) { w.Write("<"); var head = ""; foreach (var a in member.GenericParameters) { w.Write(head); WriteReferenceHtml(a, w, framework); head = ", "; } w.Write(">"); } var hier = ((!member.IsEnum && !member.IsValueType && member.BaseType != null && member.BaseType.FullName != "System.Object") ? new[] { member.BaseType } : new TypeReference[0]) .Concat(member.Interfaces.Select(x => x.InterfaceType)).ToList(); if (hier.Count > 0) { w.Write(" : "); var head = ""; foreach (var h in hier) { w.Write(head); WriteReferenceHtml(h, w, framework); head = ", "; } } }
public static void WriteReferenceHtml(this TypeReference type, TextWriter w, PackageTargetFramework framework, bool isOut = false) { if (type.FullName == "System.Void") { w.Write("<span class=\"c-tr\">void</span>"); } else if (type.FullName == "System.String") { w.Write("<span class=\"c-tr\">string</span>"); } else if (type.FullName == "System.Object") { w.Write("<span class=\"c-tr\">object</span>"); } else if (type.FullName == "System.Decimal") { w.Write("<span class=\"c-tr\">decimal</span>"); } else if (type.IsPrimitive) { w.Write("<span class=\"c-tr\">"); switch (type.FullName) { case "System.Byte": w.Write("byte"); break; case "System.Boolean": w.Write("bool"); break; case "System.Char": w.Write("char"); break; case "System.Double": w.Write("double"); break; case "System.Int16": w.Write("short"); break; case "System.Int32": w.Write("int"); break; case "System.Int64": w.Write("long"); break; case "System.Single": w.Write("float"); break; case "System.SByte": w.Write("sbyte"); break; case "System.UInt16": w.Write("ushort"); break; case "System.UInt32": w.Write("uint"); break; case "System.UInt64": w.Write("ulong"); break; default: WriteEncoded(type.Name, w); break; } w.Write("</span>"); } else if (type.IsArray) { var at = (ArrayType)type; WriteReferenceHtml(at.ElementType, w, framework); w.Write("["); var head = ""; foreach (var d in at.Dimensions) { w.Write(head); head = ","; } w.Write("]"); } else if (type.IsGenericInstance) { GenericInstanceType gi = (GenericInstanceType)type; if (gi.ElementType.FullName == "System.Nullable`1") { WriteReferenceHtml(gi.GenericArguments[0], w, framework); w.Write("?"); } else { WriteReferenceHtml(gi.ElementType, w, framework); w.Write("<"); var head = ""; foreach (var a in gi.GenericArguments) { w.Write(head); WriteReferenceHtml(a, w, framework); head = ", "; } w.Write(">"); } } else if (type.IsByReference) { if (isOut) { w.Write("<span class=\"c-kw\">out</span> "); } else { w.Write("<span class=\"c-kw\">ref</span> "); } WriteReferenceHtml(type.GetElementType(), w, framework); } else { var name = type.Name; var ni = name.LastIndexOf('`'); if (ni > 0) { name = name.Substring(0, ni); } var url = framework?.FindTypeUrl(type); if (url != null) { w.Write($"<a href=\"{url}\" class=\"c-tr\">"); WriteEncoded(name, w); w.Write("</a>"); } else { w.Write("<span class=\"c-tr\">"); WriteEncoded(name, w); w.Write("</span>"); } } }
string GetClassAndLink(AstNode n, out string link, out string id) { link = null; id = null; if (n == null || n == AstNode.Null) { return("c-uk"); } while (n != null && n.Annotations.Count() == 0) { n = n.Parent; } if (n == null || n == AstNode.Null) { return("c-uk"); } var t = n.Annotation <TypeResolveResult> (); if (t != null) { if (n.NodeType == NodeType.TypeDeclaration) { return("c-td"); } var name = t.Type.FullName; if (t.Type.TypeParameterCount > 0 && name.IndexOf('`') < 0) { name += "`" + t.Type.TypeParameterCount; } if (t.Type.Kind != TypeKind.TypeParameter) { link = framework.FindTypeUrl(name); } return("c-tr"); } var u = n.Annotation <UsingScope> (); if (u != null) { return("c-nr"); } var m = n.Annotation <MemberResolveResult> (); if (m != null) { if (m.Member.SymbolKind == SymbolKind.Method) { if (n is MethodDeclaration md) { if (md.GetSymbol() is DefaultResolvedMethod r) { id = r.GetIdString(); } return("c-md"); } return("c-mr"); } if (m.Member.SymbolKind == SymbolKind.Field) { if (n is FieldDeclaration fd) { if (fd.GetSymbol() is DefaultResolvedField r) { id = r.GetIdString(); } return("c-fd"); } return("c-fr"); } if (m.Member.SymbolKind == SymbolKind.Event) { if (n is EventDeclaration ed) { if (ed.GetSymbol() is DefaultResolvedEvent r) { id = r.GetIdString(); } return("c-ed"); } if (n is CustomEventDeclaration ed2) { if (ed2.GetSymbol() is DefaultResolvedEvent r) { id = r.GetIdString(); } return("c-ed"); } return("c-er"); } if (m.Member.SymbolKind == SymbolKind.Constructor) { if (n is ConstructorDeclaration cd) { if (cd.GetSymbol() is DefaultResolvedEvent r) { id = r.GetIdString(); } return("c-cd"); } return("c-cr"); } if (n is PropertyDeclaration pd) { if (pd.GetSymbol() is DefaultResolvedProperty r) { id = r.GetIdString(); } return("c-pd"); } return("c-pr"); } var mg = n.Annotation <MethodGroupResolveResult> (); if (mg != null) { return("c-mr"); } var v = n.Annotation <ILVariableResolveResult> (); if (v != null) { if (v.Variable.Kind == VariableKind.Parameter) { return("c-ar"); } return("c-uk"); } var c = n.Annotation <ConstantResolveResult> (); if (c != null) { return("c-fr"); } // Console.WriteLine(n.Annotations.FirstOrDefault()); return("c-uk"); }