/// <summary>
        /// Returns true if this cross-targeting aggregate project context has the same set of target frameworks and active target framework as the given active and known configurations.
        /// </summary>
        public bool HasMatchingTargetFrameworks(ProjectConfiguration activeProjectConfiguration, IEnumerable <ProjectConfiguration> knownProjectConfigurations)
        {
            Assumes.True(IsCrossTargeting);
            Assumes.True(activeProjectConfiguration.IsCrossTargeting());
            Assumes.True(knownProjectConfigurations.All(c => c.IsCrossTargeting()));

            var activeTargetFramework = activeProjectConfiguration.Dimensions[ConfigurationGeneral.TargetFrameworkProperty];

            if (!string.Equals(activeTargetFramework, _activeTargetFramework))
            {
                // Active target framework is different.
                return(false);
            }

            var targetFrameworks = knownProjectConfigurations.Select(c => c.Dimensions[ConfigurationGeneral.TargetFrameworkProperty]).ToImmutableHashSet();

            if (targetFrameworks.Count != _configuredProjectContextsByTargetFramework.Count)
            {
                // Different number of target frameworks.
                return(false);
            }

            foreach (var targetFramework in targetFrameworks)
            {
                if (!_configuredProjectContextsByTargetFramework.ContainsKey(targetFramework))
                {
                    // Differing TargetFramework
                    return(false);
                }
            }

            return(true);
        }
        /// <summary>
        /// Returns true if the given project configurations are equal ignoring the "TargetFramework" dimension.
        /// </summary>
        internal static bool EqualIgnoringTargetFramework(this ProjectConfiguration projectConfiguration1, ProjectConfiguration projectConfiguration2)
        {
            Requires.NotNull(projectConfiguration1, nameof(projectConfiguration1));
            Requires.NotNull(projectConfiguration2, nameof(projectConfiguration2));

            if (projectConfiguration1.Dimensions.Count != projectConfiguration2.Dimensions.Count)
            {
                return(false);
            }

            if (!projectConfiguration1.IsCrossTargeting() || !projectConfiguration2.IsCrossTargeting())
            {
                return(projectConfiguration1.Equals(projectConfiguration2));
            }

            foreach ((string dimensionName, string dimensionValue) in projectConfiguration1.Dimensions)
            {
                // Ignore the TargetFramework.
                if (StringComparers.ConfigurationDimensionNames.Equals(dimensionName, ConfigurationGeneral.TargetFrameworkProperty))
                {
                    continue;
                }

                // Dimension values must be compared in a case-sensitive manner.
                if (!projectConfiguration2.Dimensions.TryGetValue(dimensionName, out string activeValue) ||
                    !string.Equals(dimensionValue, activeValue, StringComparisons.ConfigurationDimensionNames))
                {
                    return(false);
                }
            }

            return(true);
        }
예제 #3
0
        public ITargetedProjectContext GetInnerProjectContext(ProjectConfiguration projectConfiguration, out bool isActiveConfiguration)
        {
            if (projectConfiguration.IsCrossTargeting())
            {
                string targetFrameworkMoniker =
                    projectConfiguration.Dimensions[ConfigurationGeneral.TargetFrameworkProperty];
                ITargetFramework targetFramework = TargetFrameworkProvider.GetTargetFramework(targetFrameworkMoniker);

                isActiveConfiguration = _activeTargetFramework.Equals(targetFramework);

                return(_configuredProjectContextsByTargetFramework.TryGetValue(targetFramework, out ITargetedProjectContext projectContext)
                    ? projectContext
                    : null);
            }
            else
            {
                isActiveConfiguration = true;
                if (_configuredProjectContextsByTargetFramework.Count > 1)
                {
                    return(null);
                }

                return(InnerProjectContexts.Single());
            }
        }
        public ITargetFramework GetProjectFramework(ProjectConfiguration projectConfiguration)
        {
            if (projectConfiguration.IsCrossTargeting())
            {
                string targetFrameworkMoniker = projectConfiguration.Dimensions[ConfigurationGeneral.TargetFrameworkProperty];

                return(_targetFrameworkProvider.GetTargetFramework(targetFrameworkMoniker));
            }
            else
            {
                return(TargetFrameworks.Length > 1 ? null : TargetFrameworks[0]);
            }
        }
        public IWorkspaceProjectContext GetInnerProjectContext(ProjectConfiguration projectConfiguration, out bool isActiveConfiguration)
        {
            if (projectConfiguration.IsCrossTargeting())
            {
                var targetFramework = projectConfiguration.Dimensions[TargetFrameworkProjectConfigurationDimensionProvider.TargetFrameworkPropertyName];
                isActiveConfiguration = string.Equals(targetFramework, _activeTargetFramework);
                return(_configuredProjectContextsByTargetFramework.TryGetValue(targetFramework, out IWorkspaceProjectContext projectContext) ?
                       projectContext :
                       null);
            }
            else
            {
                isActiveConfiguration = true;
                if (_configuredProjectContextsByTargetFramework.Count > 1)
                {
                    return(null);
                }

                return(InnerProjectContexts.Single());
            }
        }
        /// <summary>
        /// Returns true if this cross-targeting aggregate project context has the same set of target frameworks and active target framework as the given active and known configurations.
        /// </summary>
        public bool HasMatchingTargetFrameworks(ProjectConfiguration activeProjectConfiguration,
                                                IReadOnlyCollection <ProjectConfiguration> knownProjectConfigurations)
        {
            Assumes.True(IsCrossTargeting);
            Assumes.True(activeProjectConfiguration.IsCrossTargeting());
            Assumes.True(knownProjectConfigurations.All(c => c.IsCrossTargeting()));

            ITargetFramework activeTargetFramework = _targetFrameworkProvider.GetTargetFramework(activeProjectConfiguration.Dimensions[ConfigurationGeneral.TargetFrameworkProperty]);

            if (!ActiveTargetFramework.Equals(activeTargetFramework))
            {
                // Active target framework is different.
                return(false);
            }

            var targetFrameworkMonikers = knownProjectConfigurations
                                          .Select(c => c.Dimensions[ConfigurationGeneral.TargetFrameworkProperty])
                                          .Distinct()
                                          .ToList();

            if (targetFrameworkMonikers.Count != TargetFrameworks.Length)
            {
                // Different number of target frameworks.
                return(false);
            }

            foreach (string targetFrameworkMoniker in targetFrameworkMonikers)
            {
                ITargetFramework targetFramework = _targetFrameworkProvider.GetTargetFramework(targetFrameworkMoniker);

                if (!TargetFrameworks.Contains(targetFramework))
                {
                    // Differing TargetFramework
                    return(false);
                }
            }

            return(true);
        }
        /// <summary>
        /// Returns true if the given project configurations are equal ignoring the "TargetFramework" dimension.
        /// </summary>
        internal static bool EqualIgnoringTargetFramework(this ProjectConfiguration projectConfiguration1, ProjectConfiguration projectConfiguration2)
        {
            Requires.NotNull(projectConfiguration1, nameof(projectConfiguration1));
            Requires.NotNull(projectConfiguration2, nameof(projectConfiguration2));

            if (projectConfiguration1.Dimensions.Count != projectConfiguration2.Dimensions.Count)
            {
                return(false);
            }

            if (!projectConfiguration1.IsCrossTargeting() || !projectConfiguration2.IsCrossTargeting())
            {
                return(projectConfiguration1.Equals(projectConfiguration2));
            }

            foreach (var dimensionKvp in projectConfiguration1.Dimensions)
            {
                var dimensionName  = dimensionKvp.Key;
                var dimensionValue = dimensionKvp.Value;

                // Ignore the TargetFramework.
                if (string.Equals(dimensionName, TargetFrameworkProjectConfigurationDimensionProvider.TargetFrameworkPropertyName, StringComparison.OrdinalIgnoreCase))
                {
                    continue;
                }

                // Dimension values must be compared in a case-sensitive manner.
                string activeValue;
                if (!projectConfiguration2.Dimensions.TryGetValue(dimensionName, out activeValue) ||
                    !string.Equals(dimensionValue, activeValue, StringComparison.Ordinal))
                {
                    return(false);
                }
            }

            return(true);
        }