Esempio n. 1
0
        private Models.Type LoadType(FileItem typeFile)
        {
            string xmlContent = _fileAccessor.ReadAllText(typeFile.RelativePath);

            xmlContent = xmlContent.Replace("TextAntiAliasingQuality&nbsp;property.</summary>", "TextAntiAliasingQuality property.</summary>");
            xmlContent = xmlContent.Replace("DefaultValue('&#x0;')</AttributeName>", "DefaultValue('\\0')</AttributeName>");
            xmlContent = xmlContent.Replace("\0", "\\0");

            XDocument tDoc  = XDocument.Parse(xmlContent, LoadOptions.PreserveWhitespace);
            XElement  tRoot = tDoc.Root;

            if (tRoot.Name.LocalName != "Type")
            {
                return(null);
            }
            Models.Type t = new Models.Type();
            t.Name                = tRoot.Attribute("Name").Value.Replace('+', '.');
            t.FullName            = tRoot.Attribute("FullName").Value.Replace('+', '.');
            t.SourceFileLocalPath = typeFile.AbsolutePath;

            //TypeSignature
            t.Signatures = new VersionedSignatures(tRoot.Elements("TypeSignature"));
            t.Modifiers  = t.Signatures.CombinedModifiers;
            t.DocId      = t.Signatures.DocId;

            //AssemblyInfo
            t.AssemblyInfo = tRoot.Elements("AssemblyInfo")?.SelectMany(a => ParseAssemblyInfo(a)).ToList();

            //TypeParameters
            var tpElement = tRoot.Element("TypeParameters");

            if (tpElement != null)
            {
                t.TypeParameters = ParameterBase.LoadVersionedParameters <TypeParameter>(tpElement.Elements("TypeParameter"));
            }

            //Parameters
            var pElement = tRoot.Element("Parameters");

            if (pElement != null)
            {
                t.Parameters = ParameterBase.LoadVersionedParameters <Parameter>(pElement.Elements("Parameter"));
            }

            var rvalElement = tRoot.Element("ReturnValue");

            if (rvalElement != null)
            {
                t.ReturnValueType = MonikerizeReturnValue(rvalElement);
            }

            //BaseTypeName
            t.BaseTypes = LoadBaseType(tRoot.Element("Base"));

            //Interfaces
            var interfacesElement = tRoot.Element("Interfaces");

            if (interfacesElement != null)
            {
                t.Interfaces = interfacesElement.Elements("Interface")
                               .Select(i => new VersionedString(LoadFrameworkAlternate(i), i?.Element("InterfaceName")?.Value))
                               .ToList();
            }

            //Attributes
            var attrs = tRoot.Element("Attributes");

            if (attrs != null)
            {
                t.Attributes = attrs.Elements("Attribute").Select(a => LoadAttribute(a)).ToList();
            }

            //TypeForwardingChain
            var forwardingChain = tRoot.Element("TypeForwardingChain");

            if (forwardingChain != null)
            {
                var fwds = forwardingChain.Elements("TypeForwarding").Select(fwd => LoadTypeForwarding(fwd)).ToList();
                t.TypeForwardingChain = new TypeForwardingChain(fwds);
            }

            //Members
            var membersElement = tRoot.Element("Members");

            if (membersElement != null)
            {
                t.Members = membersElement.Elements("Member")?.Select(m => LoadMember(t, m)).ToList();
                t.Members.Sort((m1, m2) =>
                {
                    if (m1.IsEII == m2.IsEII)
                    {
                        return(string.Compare(m1.Name, m2.Name));
                    }
                    else
                    {
                        return(m1.IsEII ? 1 : -1); //non-EII first, EII later
                    }
                });
                if (t.Members != null)
                {
                    foreach (var m in t.Members)
                    {
                        m.SourceFileLocalPath = typeFile.AbsolutePath;
                    }
                }
                t.Overloads = membersElement.Elements("MemberGroup")?.Select(m => LoadMemberGroup(t, m)).ToList();
                if (t.Overloads != null)
                {
                    var distinctList = new List <Member>();
                    foreach (var og in t.Overloads.GroupBy(o => o.Name))
                    {
                        if (og.Count() > 1)
                        {
                            OPSLogger.LogUserWarning(LogCode.ECMA2Yaml_MemberGroup_Duplicated, typeFile.AbsolutePath, og.Key);
                        }
                        og.First().SourceFileLocalPath = typeFile.AbsolutePath;
                        distinctList.Add(og.First());
                    }
                    t.Overloads = distinctList;
                }
            }

            //Docs
            t.Docs = LoadDocs(tRoot.Element("Docs"), typeFile.AbsolutePath);

            //MemberType
            t.ItemType = InferTypeOfType(t);

            if (t.ItemType == ItemType.Enum && t.Members?.Count > 0)
            {
                foreach (var m in t.Members)
                {
                    if (!string.IsNullOrEmpty(m.Docs.Remarks))
                    {
                        OPSLogger.LogUserSuggestion(LogCode.ECMA2Yaml_Enum_NoRemarks, typeFile.AbsolutePath);
                    }
                }
            }

            // Metadata
            LoadMetadata(t, tRoot);

            return(t);
        }