private string FindConfigurationForSolution(
            IEnumerable <string> configurations, ProjectConfigurationType type,
            IReadOnlyDictionary <string, string> config)
        {
            var typeStr = type.ToString();

            // Find in config.
            if (config != null && config.TryGetValue(typeStr, out var targetConfiguration))
            {
                if (configurations.Contains(targetConfiguration))
                {
                    return(targetConfiguration);
                }
            }

            // Find according to default rule.
            configurations = configurations.Where(c => c.StartsWith(typeStr));
            foreach (var configuration in configurations)
            {
                var version = VersionOfConfiguration(configuration);
                if (version != null && version.MajorEquals(ProjectVersion))
                {
                    return(configuration);
                }
            }
            return(configurations.FirstOrDefault());
        }
 private static Conditions CreateCondition(ProjectConfigurationType type, UnityVersion version)
 {
     return(new Conditions(new[]
     {
         new Condition(ConditionNames.Configuration, $"{type}-{version.ToString(true)}"),
         new Condition(ConditionNames.Platform, "AnyCPU")
     }));
 }
        private static void SetupConfigurationGroupForUnity(
            XmlPropertyGroup group, ProjectConfigurationType type, bool forEditor, UnityVersion version)
        {
            var condition = CreateCondition(type, version);

            group.Condition = condition.ToString();

            bool isDebug = type == ProjectConfigurationType.Debug;

            if (isDebug)
            {
                group.SetProperty("DebugSymbols", "true");
            }

            group.SetProperty("DebugType", isDebug ? "full" : "pdbonly");
            group.SetProperty("Optimize", (!isDebug).ToString().ToLower());
            group.SetProperty("OutputPath", $@"bin\{condition[ConditionNames.Configuration]}");
            group.SetProperty("DefineConstants", GetDefineConstantsForUnity(isDebug, forEditor, version));
            group.SetProperty("ErrorReport", "prompt");
            group.SetProperty("WarningLevel", "4");
        }
        private static void SetupReferenceGroupForUnity(XmlItemGroup group,
                                                        ProjectConfigurationType type, bool forEditor, UnityVersion version,
                                                        IEnumerable <AssemblyReference> references)
        {
            var condition = CreateCondition(type, version);

            group.Condition = condition.ToString();

            foreach (var asmRef in references)
            {
                var env = UnityEnvironmentTypesConverter.FromStrings(asmRef.Environments);
                if (env == UnityEnvironmentTypes.Editor && !forEditor)
                {
                    continue;
                }

                var path    = asmRef.Path;
                var include = asmRef.Name ?? Path.GetFileNameWithoutExtension(path);
                var item    = group.AddItem("Reference", include);
                item.AddMetadata("HintPath", path);
            }
        }
 private static string GetOutputPath(VSProject project, ProjectConfigurationType type)
 => $@"Temp\{project.Name}_bin\{type}";
 private static string GetIntermediateOutputPath(VSProject project, ProjectConfigurationType type)
 => $@"Temp\{project.Name}_obj\{type}";