public static CSNamespace FromText(string text) { CSNamespace result = new CSNamespace(); bool newType = true; CSMemberedType last = null; foreach (var _line in text.Split('\n')) { var line = _line.Replace("\r", ""); if (string.IsNullOrEmpty(line)) { newType = true; continue; } if (newType) { newType = false; int minusIndex = line.IndexOf('-'); string typeName = line.Substring(0, minusIndex); Attributes attributes = (Attributes)uint.Parse(line.Substring(minusIndex + 1)); string[] dotSplitTypeName = typeName.Split('.'); var cNamespace = result; for (int n = 0; n < dotSplitTypeName.Length; n++) { var item = dotSplitTypeName[n]; if (n == dotSplitTypeName.Length - 1) { cNamespace.NestedClasses.Add(last = new CSMemberedType { Name = item, Attributes = attributes }); break; } var firstOrDefault = cNamespace.NestedNamespaces.FirstOrDefault(v => v.name == item); if (firstOrDefault != null) { cNamespace = firstOrDefault; } else { var oldN = cNamespace; oldN.NestedNamespaces.Add(cNamespace = new CSNamespace { name = item }); } } } else { newType = false; int pIndex = line.IndexOf('('); int attIndex = line.IndexOf('-'); Attributes attributes = (Attributes)uint.Parse(line.Substring(attIndex + 1)); CSTypedMember member; if (attributes.HasFlag(Attributes.Field) || attributes.HasFlag(Attributes.Property)) { member = new CSField(); } else if (attributes.HasFlag(Attributes.Method)) { member = new CSMethod(); } else { throw new NotImplementedException(); } member.Attributes = attributes; string name; CSParameter[] parameters; if (pIndex != -1) { name = line.Substring(0, pIndex); var cPindex = line.IndexOf(')'); string args = line.Substring(pIndex + 1, cPindex - pIndex - 1); string[][] argsSplit = Array.ConvertAll(args.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries), v => v.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)); ((CSMethod)member).Parameters = (parameters = Array.ConvertAll(argsSplit, v => new CSParameter { Name = v[1], Type = v[0] })).ToList(); } else { name = line.Split(' ')[0]; } member.Name = name; int tIndex = line.IndexOf("=>"); if (tIndex != -1) { member.Type = line.Substring(tIndex + 3); } last.Members.Add(member); } } return(result); }
static void DiffTypes(CSMemberedType bridgeType, CSMemberedType netType) { if (bridgeType == null || netType == null) { return; } HashSet <string> membersHash = new HashSet <string>(); Dictionary <string, CSMember> MembersOf(CSMemberedType type) { string NameOf(CSMember member) { CSMethod csMethod; if ((csMethod = member as CSMethod) != null) { return(member.Name + "(" + string.Join(", ", csMethod.Parameters.ConvertAll(v2 => v2.Type)) + ")"); } else { return(member.Name); } } var dic = new Dictionary <string, CSMember>(); foreach (var member in type.Members) { var name = NameOf(member); if (!dic.ContainsKey(name)) { dic.Add(name, member); membersHash.Add(name); } } return(dic); } var bridgeMembers = MembersOf(bridgeType); var netMembers = MembersOf(netType); writer.Write("<ul>"); foreach (var @string in membersHash.OrderBy(v => v)) { bool inBridge = bridgeMembers.ContainsKey(@string); bool inNet = netMembers.ContainsKey(@string); var detectedProperty = inNet ? netMembers[@string] : bridgeMembers[@string]; string icon; if (detectedProperty.Attributes.HasFlag(Attributes.Field)) { icon = "field"; } else if (detectedProperty.Attributes.HasFlag(Attributes.Property)) { icon = "property"; } else if (detectedProperty.Attributes.HasFlag(Attributes.Method)) { icon = "method"; } else { throw new NotImplementedException(); } writer.Write("<li data-jstree='{\"icon\":\"dist/images/"); writer.Write(icon); writer.Write(".png\"}'><span style=\"color:"); CompareSupport(inBridge, inNet); writer.Write("\">"); writer.Write(@string); writer.Write("</span>"); if (inNet && inBridge) { CompareAttributes(netMembers[@string].Attributes, bridgeMembers[@string].Attributes); } writer.Write("</li>"); } writer.Write("</ul>"); }