提交 2ad4d952 编写于 作者: A Andrew Hall (METAL)

Hook up to optionservice for run-nullable-analysis value calculation

上级 57476d01
...@@ -2,7 +2,9 @@ ...@@ -2,7 +2,9 @@
using System.Collections.Immutable; using System.Collections.Immutable;
using System.IO; using System.IO;
using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Editor.Shared.Options;
using Microsoft.CodeAnalysis.Host; using Microsoft.CodeAnalysis.Host;
using Microsoft.CodeAnalysis.Options;
using Roslyn.Utilities; using Roslyn.Utilities;
namespace Microsoft.VisualStudio.LanguageServices.Implementation.ProjectSystem namespace Microsoft.VisualStudio.LanguageServices.Implementation.ProjectSystem
...@@ -12,6 +14,7 @@ internal class VisualStudioProjectOptionsProcessor : IDisposable ...@@ -12,6 +14,7 @@ internal class VisualStudioProjectOptionsProcessor : IDisposable
private readonly VisualStudioProject _project; private readonly VisualStudioProject _project;
private readonly HostWorkspaceServices _workspaceServices; private readonly HostWorkspaceServices _workspaceServices;
private readonly ICommandLineParserService _commandLineParserService; private readonly ICommandLineParserService _commandLineParserService;
private IOptionService _optionService;
/// <summary> /// <summary>
/// Gate to guard all mutable fields in this class. /// Gate to guard all mutable fields in this class.
...@@ -28,11 +31,27 @@ public VisualStudioProjectOptionsProcessor(VisualStudioProject project, HostWork ...@@ -28,11 +31,27 @@ public VisualStudioProjectOptionsProcessor(VisualStudioProject project, HostWork
_project = project ?? throw new ArgumentNullException(nameof(project)); _project = project ?? throw new ArgumentNullException(nameof(project));
_workspaceServices = workspaceServices; _workspaceServices = workspaceServices;
_commandLineParserService = workspaceServices.GetLanguageServices(project.Language).GetRequiredService<ICommandLineParserService>(); _commandLineParserService = workspaceServices.GetLanguageServices(project.Language).GetRequiredService<ICommandLineParserService>();
_optionService = workspaceServices.GetRequiredService<IOptionService>();
if (project.Language == LanguageNames.CSharp)
{
// For C#, we need to listen to the options for NRT analysis
// that can change in VS through tools > options
_optionService.OptionChanged += OptionService_OptionChanged;
}
// Set up _commandLineArgumentsForCommandLine to a default. No lock taken since we're in the constructor so nothing can race. // Set up _commandLineArgumentsForCommandLine to a default. No lock taken since we're in the constructor so nothing can race.
ReparseCommandLine_NoLock(); ReparseCommandLine_NoLock();
} }
private void OptionService_OptionChanged(object sender, OptionChangedEventArgs e)
{
if (e.Option.Feature == FeatureOnOffOptions.UseNullableReferenceTypes.Feature)
{
UpdateProjectForNewHostValues();
}
}
public string CommandLine public string CommandLine
{ {
get get
...@@ -159,6 +178,18 @@ private void UpdateProjectOptions_NoLock() ...@@ -159,6 +178,18 @@ private void UpdateProjectOptions_NoLock()
compilationOptions = ComputeCompilationOptionsWithHostValues(compilationOptions, this._ruleSetFile?.Target.Value); compilationOptions = ComputeCompilationOptionsWithHostValues(compilationOptions, this._ruleSetFile?.Target.Value);
parseOptions = ComputeParseOptionsWithHostValues(parseOptions); parseOptions = ComputeParseOptionsWithHostValues(parseOptions);
if (_project.Language == LanguageNames.CSharp)
{
var useNullableReferenceTypesOption = _optionService.GetOption(FeatureOnOffOptions.UseNullableReferenceTypes);
parseOptions = useNullableReferenceTypesOption switch
{
-1 => parseOptions.WithFeatures(new[] { KeyValuePairUtil.Create("run-nullable-analysis", "false") }),
1 => parseOptions.WithFeatures(new[] { KeyValuePairUtil.Create("run-nullable-analysis", "true") }),
_ => parseOptions
};
}
// For managed projects, AssemblyName has to be non-null, but the command line we get might be a partial command line // For managed projects, AssemblyName has to be non-null, but the command line we get might be a partial command line
// and not contain the existing value. Only update if we have one. // and not contain the existing value. Only update if we have one.
_project.AssemblyName = _commandLineArgumentsForCommandLine.CompilationName ?? _project.AssemblyName; _project.AssemblyName = _commandLineArgumentsForCommandLine.CompilationName ?? _project.AssemblyName;
...@@ -225,6 +256,12 @@ public void Dispose() ...@@ -225,6 +256,12 @@ public void Dispose()
lock (_gate) lock (_gate)
{ {
DisposeOfRuleSetFile_NoLock(); DisposeOfRuleSetFile_NoLock();
if (_optionService != null)
{
_optionService.OptionChanged -= OptionService_OptionChanged;
_optionService = null;
}
} }
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册