static GacUDT[] ExtractRelatedUDT(GacUDT udt) { if (udt.Name.StartsWith("vl::presentation::")) { return(udt.BaseClasses.Select(b => b.UDT).Concat( udt.Fields.Where(f => f.Access == GacAccess.Public).SelectMany(f => ExtractRelatedUDT(f.Type)).Concat( udt.StaticFields.Where(f => f.Access == GacAccess.Public).SelectMany(f => ExtractRelatedUDT(f.Type)).Concat( udt.Methods.Where(f => f.Access == GacAccess.Public).SelectMany(f => ExtractRelatedUDT(f.Type)).Concat( udt.StaticMethods.Where(f => f.Access == GacAccess.Public).SelectMany(f => ExtractRelatedUDT(f.Type)) )))).Distinct().ToArray()); } else { return(new GacUDT[0]); } }
static bool IsUDTImportant(GacUDT udt) { return(!udt.Name.StartsWith("vl::presentation::Description<") && !udt.Name.StartsWith("vl::Func<") && !udt.Name.StartsWith("vl::presentation::windows::") && !udt.Name.Contains("vl::presentation::DescriptableValue") && !udt.Name.Contains("vl::presentation::IType") && !udt.Name.Contains("vl::presentation::IMemberDescriptor") && !udt.Name.Contains("vl::presentation::IParameterDescriptor") && !udt.Name.Contains("vl::presentation::IMethodDescriptor") && !udt.Name.Contains("vl::presentation::IPropertyDescriptor") && !udt.Name.Contains("vl::presentation::ITypeDescriptor") && !udt.Name.Contains("vl::presentation::ITypeProvider") && udt.Name != "vl::Interface" && udt.Name != "vl::Object" ); }
static Dictionary <string, GacUDT> LoadXML(XDocument document) { Dictionary <string, GacUDT> udts = new Dictionary <string, GacUDT>(); foreach (var udtElement in document.Root.Elements().Where(e => e.Name != "functions")) { GacUDT udt = new GacUDT(); udt.Name = udtElement.Attribute("name").Value; switch (udtElement.Name.LocalName) { case "class": udt.Kind = GacUDTKind.Class; break; case "enum": udt.Kind = GacUDTKind.Enum; break; } udts.Add(udt.Name, udt); } foreach (var udtElement in document.Root.Elements().Where(e => e.Name != "functions")) { FillUdt(udts, udts[udtElement.Attribute("name").Value], udtElement); } foreach (var udt in udts.Values) { List <GacBaseClass> newBaseClasses = new List <GacBaseClass>(); HashSet <GacUDT> baseBaseClasses = new HashSet <GacUDT>(udt.BaseClasses.SelectMany(b => GetBaseClasses(b.UDT))); foreach (var baseUdt in udt.BaseClasses) { if (!baseBaseClasses.Contains(baseUdt.UDT)) { newBaseClasses.Add(baseUdt); } } udt.BaseClasses = newBaseClasses.ToArray(); } return(udts); }
static void FillUdt(Dictionary <string, GacUDT> udts, GacUDT udt, XElement udtElement) { udt.BaseClasses = udtElement.Element("baseClasses") == null ? new GacBaseClass[0] : udtElement .Element("baseClasses") .Elements("baseClass") .Select(e => new GacBaseClass { Access = TranslateAccess(e.Attribute("access").Value), UDT = udts[e.Attribute("name").Value], }) .ToArray(); udt.Fields = udtElement.Element("fields") == null ? new GacField[0] : udtElement .Element("fields") .Elements("field") .Select(e => TranslateField(udts, e, udt)) .ToArray(); udt.StaticFields = udtElement.Element("fields") == null ? new GacField[0] : udtElement .Element("fields") .Elements("staticField") .Select(e => TranslateField(udts, e, udt)) .ToArray(); udt.Constants = udtElement.Element("fields") == null ? new GacConst[0] : udtElement .Element("fields") .Elements("const") .Select(e => TranslateEnumField(udts, e, udt)) .ToArray(); udt.Methods = udtElement.Element("methods") == null ? new GacMethod[0] : udtElement .Element("methods") .Elements("method") .Select(e => TranslateMethod(udts, e, udt)) .ToArray(); udt.StaticMethods = udtElement.Element("methods") == null ? new GacMethod[0] : udtElement .Element("methods") .Elements("staticMethod") .Select(e => TranslateMethod(udts, e, udt)) .ToArray(); udt.IsAbstract = udt.Methods.Any(m => m.Kind == GacMethodKind.Abstract); }
static bool InheritsFromObjectOrInterface(GacUDT udt) { return(udt.BaseClasses.Any(t => t.UDT.Name == "vl::Object" || t.UDT.Name == "vl::Interface" || InheritsFromObjectOrInterface(t.UDT))); }
static GacUDT[] GetBaseClasses(GacUDT udt) { return(udt.BaseClasses.Select(b => b.UDT).Concat(udt.BaseClasses.SelectMany(b => GetBaseClasses(b.UDT))).ToArray()); }
static GacMethod TranslateMethod(Dictionary <string, GacUDT> udts, XElement methodElement, GacUDT ownerUDT) { return(new GacMethod { Name = methodElement.Attribute("name").Value, Kind = TranslateVirtual(methodElement.Attribute("virtual").Value), Access = TranslateAccess(methodElement.Attribute("access").Value), Type = TranslateType(udts, methodElement.Element("type").Elements().First()), ParameterNames = methodElement.Element("arguments").Elements("argument").Select(e => e.Attribute("name").Value).ToArray(), OwnerUDT = ownerUDT, }); }
static GacConst TranslateEnumField(Dictionary <string, GacUDT> udts, XElement fieldElement, GacUDT ownerUDT) { GacField field = TranslateField(udts, fieldElement, ownerUDT); return(new GacConst { Name = field.Name, Access = field.Access, Type = field.Type, OwnerUDT = field.OwnerUDT, EnumItemValue = int.Parse(fieldElement.Element("intValue").Attribute("value").Value), }); }
static GacField TranslateField(Dictionary <string, GacUDT> udts, XElement fieldElement, GacUDT ownerUDT) { return(new GacField { Name = fieldElement.Attribute("name").Value, Access = TranslateAccess(fieldElement.Attribute("access").Value), Type = TranslateType(udts, fieldElement.Element("type").Elements().First()), OwnerUDT = ownerUDT, }); }