/// <summary>
        /// Gets the rule(s) that applies to a reference.
        /// </summary>
        /// <param name="itemType">The item type on the unresolved reference.</param>
        /// <param name="resolved">
        /// A value indicating whether to return rules for resolved or unresolved reference state.
        /// </param>
        /// <param name="namedCatalogs">The dictionary of catalogs.</param>
        /// <returns>The sequence of matching rules.  Hopefully having exactly one element.</returns>
        private IEnumerable <Rule> GetSchemaForReference(string itemType,
                                                         bool resolved,
                                                         IImmutableDictionary <string, IPropertyPagesCatalog> namedCatalogs)
        {
            Requires.NotNull(namedCatalogs, nameof(namedCatalogs));

            // Note: usually for default/generic dependencies we have sets of 2 rule schemas:
            //  - rule for unresolved dependency, they persist in ProjectFile
            //  - rule for resolved dependency, they persist in ResolvedReference
            // So to be able to find rule for resolved or unresolved reference we need to be consistent there
            // and make sure we do set ResolvedReference persistense for resolved dependnecies, since we rely
            // on that here when pick correct rule schema.
            // (old code used to check if rule datasource has SourceType=TargetResults, which was true for Resolved,
            // dependencies. However now we have custom logic for collecting unresolved dependencies too and use
            // DesignTime build results there too. Thats why we swicthed to check for persistence).
            IPropertyPagesCatalog        browseObjectCatalog = namedCatalogs[PropertyPageContexts.BrowseObject];
            IReadOnlyCollection <string> schemas             = browseObjectCatalog.GetPropertyPagesSchemas(itemType);

            return(from schemaName in browseObjectCatalog.GetPropertyPagesSchemas(itemType)
                   let schema = browseObjectCatalog.GetSchema(schemaName)
                                where schema.DataSource != null &&
                                string.Equals(itemType, schema.DataSource.ItemType, StringComparison.OrdinalIgnoreCase) &&
                                (resolved == string.Equals(schema.DataSource.Persistence,
                                                           RuleDataSourceTypes.PersistenceResolvedReference,
                                                           StringComparison.OrdinalIgnoreCase))
                                select schema);
        }
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        public Dictionary <string, string> ProjectPropertiesToDictionary()
        {
            Dictionary <string, string> evaluatedProperties = new Dictionary <string, string> ();

            IPropertyPagesCatalog projectPropertyList = ConfiguredProject.Services.PropertyPagesCatalog.GetCatalog("Project");

            IEnumerable <string> projectPropertySchemas = projectPropertyList.GetPropertyPagesSchemas();

            foreach (string schema in projectPropertySchemas)
            {
                IRule schemaRules = projectPropertyList.BindToContext(schema, File, ItemType, ItemName);

                foreach (IProperty properties in schemaRules.Properties)
                {
                    try
                    {
                        IEvaluatedProperty evaluatedProperty = (IEvaluatedProperty)properties;

                        string schemaGroupedKey = schema + "." + properties.Name;

                        evaluatedProperties [schemaGroupedKey] = evaluatedProperty.EvaluatedValueAtEnd;
                    }
                    catch (Exception e)
                    {
                        LoggingUtils.HandleException(e);
                    }
                }
            }

            return(evaluatedProperties);
        }
 public static IEnumerable <Rule> GetDebugChildRules(IPropertyPagesCatalog projectCatalog)
 {
     foreach (string schemaName in projectCatalog.GetPropertyPagesSchemas(itemType: "LaunchProfile"))
     {
         if (projectCatalog.GetSchema(schemaName) is { PropertyPagesHidden: false, PageTemplate: CommandNameBasedDebuggerPageTemplate } possibleChildRule)
         {
             yield return(possibleChildRule);
         }
     }
 }
        private async Task <string> GetPropertyValueAsync()
        {
            // Infinite timeout means this will not actually be null.
            ILaunchSettings?launchSettings = await _launchSettingsProvider.WaitForFirstSnapshot(Timeout.Infinite);

            Assumes.NotNull(launchSettings);

            string?commandName = launchSettings.ActiveProfile?.CommandName;

            if (commandName == null)
            {
                return(string.Empty);
            }

            ConfiguredProject?configuredProject = await _project.GetSuggestedConfiguredProjectAsync();

            IPropertyPagesCatalogProvider?catalogProvider = configuredProject?.Services.PropertyPagesCatalog;

            if (catalogProvider == null)
            {
                return(string.Empty);
            }

            IPropertyPagesCatalog catalog = await catalogProvider.GetCatalogAsync(PropertyPageContexts.Project);

            foreach (string schemaName in catalog.GetPropertyPagesSchemas())
            {
                Rule?rule = catalog.GetSchema(schemaName);
                if (rule != null &&
                    string.Equals(rule.PageTemplate, "CommandNameBasedDebugger", StringComparison.OrdinalIgnoreCase) &&
                    rule.Metadata.TryGetValue("CommandName", out object pageCommandNameObj) &&
                    pageCommandNameObj is string pageCommandName &&
                    pageCommandName.Equals(commandName))
                {
                    return(schemaName);
                }
            }

            return(string.Empty);
        }
            public async Task <ICollection <IEnumValue> > GetListedValuesAsync()
            {
                var catalogProvider = _configuredProject.Services.PropertyPagesCatalog;

                if (catalogProvider == null)
                {
                    return(Array.Empty <IEnumValue>());
                }

                IPropertyPagesCatalog catalog = await catalogProvider.GetCatalogAsync(PropertyPageContexts.Project);

                return(catalog.GetPropertyPagesSchemas()
                       .Select(catalog.GetSchema)
                       .WhereNotNull()
                       .Where(rule => string.Equals(rule.PageTemplate, "CommandNameBasedDebugger", StringComparison.OrdinalIgnoreCase) &&
                              rule.Metadata.TryGetValue("CommandName", out object pageCommandNameObj))
                       .Select(rule => new PageEnumValue(new EnumValue
                {
                    Name = rule.Name,
                    DisplayName = rule.DisplayName
                }))
                       .ToArray <IEnumValue>());
            }