private bool UpdateSdkRef()

in codegen/src/Azure.Iot.Operations.ProtocolCompiler/T4/communication/dotnet/Project/code/DotNetProject.cs [122:197]


        private bool UpdateSdkRef(XmlDocument xmlDoc, XmlElement itemGroupElt)
        {
            bool sdkRefUpdated = false;
            bool sdkRefNeeded = true;

            XmlElement? projectRefElt = (XmlElement?)xmlDoc.DocumentElement!.SelectSingleNode($"/{ProjectTag}/{ItemGroupTag}/{ProjectReferenceTag}[contains(@{IncludeAttr}, '{SdkProjectName}')]");
            XmlElement? packageRefElt = (XmlElement?)xmlDoc.DocumentElement!.SelectSingleNode($"/{ProjectTag}/{ItemGroupTag}/{PackageReferenceTag}[@{IncludeAttr}='{SdkPackageName}']");

            if (projectRefElt != null) // found a project reference
            {
                if (sdkProjPath == null) // but need a package reference
                {
                    XmlNode itemGroupNode = projectRefElt.ParentNode!;
                    itemGroupNode.RemoveChild(projectRefElt);
                    if (!itemGroupNode.HasChildNodes)
                    {
                        itemGroupNode.ParentNode!.RemoveChild(itemGroupNode);
                    }
                }
                else // update project reference as needed
                {
                    sdkRefNeeded = false;
                    if (projectRefElt.GetAttribute(IncludeAttr) != sdkProjPath)
                    {
                        projectRefElt.SetAttribute(IncludeAttr, sdkProjPath);
                        sdkRefUpdated = true;
                    }
                }
            }

            if (packageRefElt != null) // found a package reference
            {
                if (sdkProjPath != null) // but need a project reference
                {
                    XmlNode itemGroupNode = packageRefElt.ParentNode!;
                    itemGroupNode.RemoveChild(packageRefElt);
                    if (!itemGroupNode.HasChildNodes)
                    {
                        itemGroupNode.ParentNode!.RemoveChild(itemGroupNode);
                    }
                }
                else // update package reference as needed
                {
                    sdkRefNeeded = false;
                    if (sdkVersion != null && (!packageRefElt.HasAttribute(VersionAttr) || packageRefElt.GetAttribute(VersionAttr) != sdkVersion))
                    {
                        packageRefElt.SetAttribute(VersionAttr, sdkVersion);
                        sdkRefUpdated = true;
                    }
                }
            }

            if (sdkRefNeeded)
            {
                if (sdkProjPath != null)
                {
                    XmlElement newRefElt = xmlDoc.CreateElement(ProjectReferenceTag);
                    newRefElt.SetAttribute(IncludeAttr, sdkProjPath);
                    itemGroupElt.AppendChild(newRefElt);
                }
                else
                {
                    XmlElement newRefElt = xmlDoc.CreateElement(PackageReferenceTag);
                    newRefElt.SetAttribute(IncludeAttr, SdkPackageName);
                    if (sdkVersion != null)
                    {
                        newRefElt.SetAttribute(VersionAttr, sdkVersion);
                    }

                    itemGroupElt.AppendChild(newRefElt);
                }

            }

            return sdkRefUpdated;
        }