Microsoft.VisualStudio.Project.ConfigProvider.CloneConfiguration C# (CSharp) Method

CloneConfiguration() protected method

protected CloneConfiguration ( Microsoft.Build.Evaluation project, string existingConfigurationName, string newConfigurationName ) : int
project Microsoft.Build.Evaluation
existingConfigurationName string
newConfigurationName string
return int
        protected virtual int CloneConfiguration(MSBuild.Project project, string existingConfigurationName, string newConfigurationName)
        {
            if (project == null)
                throw new ArgumentNullException("project");
            if (existingConfigurationName == null)
                throw new ArgumentNullException("existingConfigurationName");
            if (newConfigurationName == null)
                throw new ArgumentNullException("newConfigurationName");
            if (string.IsNullOrEmpty(existingConfigurationName))
                throw new ArgumentException("existingConfigurationName cannot be null or empty");
            if (string.IsNullOrEmpty(newConfigurationName))
                throw new ArgumentException("newConfigurationName cannot be null or empty");

            string[] platformNames = GetPlatformsFromProject();

            string existingConfigurationCondition = GetConfigurationCondition(existingConfigurationName).Trim();
            string newConfigurationCondition = GetConfigurationCondition(newConfigurationName);

            string[] existingConfigurationPlatformConditions = new string[platformNames.Length];
            string[] newConfigurationPlatformConditions = new string[platformNames.Length];

            for (int i = 0; i < existingConfigurationPlatformConditions.Length; i++)
            {
                existingConfigurationPlatformConditions[i] = GetConfigurationPlatformCondition(existingConfigurationName, platformNames[i]).Trim();
                newConfigurationPlatformConditions[i] = GetConfigurationPlatformCondition(newConfigurationName, platformNames[i]);
            }

            foreach (var group in project.Xml.PropertyGroups.ToArray())
            {
                if (string.IsNullOrEmpty(group.Condition))
                    continue;

                if (string.Equals(group.Condition.Trim(), existingConfigurationCondition, StringComparison.OrdinalIgnoreCase))
                {
                    ProjectPropertyGroupElement clonedGroup = ClonePropertyGroup(project, group);
                    clonedGroup.Condition = newConfigurationCondition;
                }
                else
                {
                    int index = Array.FindIndex(existingConfigurationPlatformConditions, i => StringComparer.OrdinalIgnoreCase.Equals(i, group.Condition.Trim()));
                    if (index < 0)
                        continue;

                    ProjectPropertyGroupElement clonedGroup = ClonePropertyGroup(project, group);
                    clonedGroup.Condition = newConfigurationPlatformConditions[index];

                    // update the OutputPath property if it exists and isn't conditioned on $(Configuration)
                    foreach (var property in clonedGroup.Properties)
                    {
                        if (!string.Equals(property.Name, "OutputPath", StringComparison.OrdinalIgnoreCase))
                            continue;

                        if (!string.IsNullOrEmpty(property.Condition))
                            continue;

                        if (property.Value.IndexOf("$(Configuration)", StringComparison.OrdinalIgnoreCase) >= 0)
                            continue;

                        // update the output path
                        property.Value = GetDefaultOutputPath(newConfigurationName, platformNames[index]);
                    }
                }
            }

            return VSConstants.S_OK;
        }