diff --git a/src/VisualStudio/Core/Def/Experimentation/VisualStudioExperimentationService.cs b/src/VisualStudio/Core/Def/Experimentation/VisualStudioExperimentationService.cs index 0db9d51490f08c3d62d24ae9c821b9ef68b9651e..370ef27d4e7d018b8cc4e4051a025255c0861914 100644 --- a/src/VisualStudio/Core/Def/Experimentation/VisualStudioExperimentationService.cs +++ b/src/VisualStudio/Core/Def/Experimentation/VisualStudioExperimentationService.cs @@ -17,6 +17,7 @@ internal class VisualStudioExperimentationService : ForegroundThreadAffinitizedO { private readonly object _experimentationServiceOpt; private readonly MethodInfo _isCachedFlightEnabledInfo; + private readonly IVsFeatureFlags _featureFlags; [ImportingConstructor] [Obsolete(MefConstruction.ImportingConstructorMessage, error: true)] @@ -25,11 +26,13 @@ public VisualStudioExperimentationService(IThreadingContext threadingContext, SV { object experimentationServiceOpt = null; MethodInfo isCachedFlightEnabledInfo = null; + IVsFeatureFlags featureFlags = null; threadingContext.JoinableTaskFactory.Run(async () => { try { + featureFlags = (IVsFeatureFlags)await ((IAsyncServiceProvider)serviceProvider).GetServiceAsync(typeof(SVsFeatureFlags)).ConfigureAwait(false); experimentationServiceOpt = await ((IAsyncServiceProvider)serviceProvider).GetServiceAsync(typeof(SVsExperimentationService)).ConfigureAwait(false); if (experimentationServiceOpt != null) { @@ -42,6 +45,7 @@ public VisualStudioExperimentationService(IThreadingContext threadingContext, SV } }); + _featureFlags = featureFlags; _experimentationServiceOpt = experimentationServiceOpt; _isCachedFlightEnabledInfo = isCachedFlightEnabledInfo; } @@ -51,6 +55,20 @@ public bool IsExperimentEnabled(string experimentName) ThisCanBeCalledOnAnyThread(); if (_isCachedFlightEnabledInfo != null) { + try + { + var enabled = _featureFlags.IsFeatureEnabled(experimentName, defaultValue: false); + if (enabled) + { + return enabled; + } + } + catch + { + // featureFlags can throw if given name is in incorrect format which can happen for us + // since we use this for experimentation service as well + } + try { return (bool)_isCachedFlightEnabledInfo.Invoke(_experimentationServiceOpt, new object[] { experimentName });