/// <summary> /// Get enabled experimental features based on the specified name patterns. /// </summary> private IEnumerable <ExperimentalFeature> GetEnabledExperimentalFeatures(IEnumerable <WildcardPattern> namePatterns) { var moduleFeatures = new List <string>(); var moduleNames = new HashSet <string>(StringComparer.OrdinalIgnoreCase); foreach (string featureName in ExperimentalFeature.EnabledExperimentalFeatureNames) { // Only process the feature names that matches any name patterns. if (SessionStateUtilities.MatchesAnyWildcardPattern(featureName, namePatterns, defaultValue: true)) { if (ExperimentalFeature.EngineExperimentalFeatureMap.TryGetValue(featureName, out ExperimentalFeature feature)) { yield return(feature); } else { moduleFeatures.Add(featureName); int lastDotIndex = featureName.LastIndexOf('.'); moduleNames.Add(featureName.Substring(0, lastDotIndex)); } } } if (moduleFeatures.Count > 0) { var featuresFromGivenModules = new Dictionary <string, ExperimentalFeature>(StringComparer.OrdinalIgnoreCase); foreach (string moduleFile in GetValidModuleFiles(moduleNames)) { foreach (var feature in ModuleIntrinsics.GetExperimentalFeature(moduleFile)) { featuresFromGivenModules.TryAdd(feature.Name, feature); } } foreach (string featureName in moduleFeatures) { if (featuresFromGivenModules.TryGetValue(featureName, out ExperimentalFeature feature)) { yield return(feature); } else { yield return(new ExperimentalFeature(featureName, description: null, source: null, isEnabled: true)); } } } }
/// <summary> /// Get available experimental features based on the specified name patterns. /// </summary> internal IEnumerable <ExperimentalFeature> GetAvailableExperimentalFeatures(IEnumerable <WildcardPattern> namePatterns) { foreach (ExperimentalFeature feature in ExperimentalFeature.EngineExperimentalFeatures) { if (SessionStateUtilities.MatchesAnyWildcardPattern(feature.Name, namePatterns, defaultValue: true)) { yield return(feature); } } foreach (string moduleFile in GetValidModuleFiles(moduleNamesToFind: null)) { ExperimentalFeature[] features = ModuleIntrinsics.GetExperimentalFeature(moduleFile); foreach (var feature in features) { if (SessionStateUtilities.MatchesAnyWildcardPattern(feature.Name, namePatterns, defaultValue: true)) { yield return(feature); } } } }