diff --git a/src/EditorFeatures/CSharpTest/ChangeSignature/RemoveParametersTests.cs b/src/EditorFeatures/CSharpTest/ChangeSignature/RemoveParametersTests.cs index 96ff6d6be5f36f55f489763a75556bac9c2a592d..767cd97997c3bb6a11fa60c4d19296f306dcb423 100644 --- a/src/EditorFeatures/CSharpTest/ChangeSignature/RemoveParametersTests.cs +++ b/src/EditorFeatures/CSharpTest/ChangeSignature/RemoveParametersTests.cs @@ -248,7 +248,7 @@ void M() var updatedSignature = new[] { new AddedParameterOrExistingIndex(0), new AddedParameterOrExistingIndex(2), - new AddedParameterOrExistingIndex(new AddedParameter(null, "int", "newIntegerParameter", "123"), "int") }; + new AddedParameterOrExistingIndex(new AddedParameter(null, "int", "newIntegerParameter", callSiteValue:"", true, defaultValue: "123", isCallsiteOmitted:false, isCallsiteError: false), "int") }; using var testState = ChangeSignatureTestState.Create(XElement.Parse(workspaceXml)); testState.TestChangeSignatureOptionsService.UpdatedSignature = updatedSignature; diff --git a/src/EditorFeatures/TestUtilities/ChangeSignature/AddedParameterOrExistingIndex.cs b/src/EditorFeatures/TestUtilities/ChangeSignature/AddedParameterOrExistingIndex.cs index b61c57ddad78230d5d6ac944203589dc17db4560..a443962cee5eac2441f431f4e1ae6d306c6ca94d 100644 --- a/src/EditorFeatures/TestUtilities/ChangeSignature/AddedParameterOrExistingIndex.cs +++ b/src/EditorFeatures/TestUtilities/ChangeSignature/AddedParameterOrExistingIndex.cs @@ -48,7 +48,15 @@ internal AddedParameter GetAddedParameter(Document document) _ => throw new ArgumentException("Unsupported language") }; - return new AddedParameter(type!, _addedParameterWithoutTypeSymbol!.TypeNameDisplayWithErrorIndicator, _addedParameterWithoutTypeSymbol.ParameterName, _addedParameterWithoutTypeSymbol.CallSiteValue); + return new AddedParameter( + type!, + _addedParameterWithoutTypeSymbol!.TypeNameDisplayWithErrorIndicator, + _addedParameterWithoutTypeSymbol.ParameterName, + _addedParameterWithoutTypeSymbol.CallSiteValue, + _addedParameterWithoutTypeSymbol.IsRequired, + _addedParameterWithoutTypeSymbol.DefaultValue, + _addedParameterWithoutTypeSymbol.IsCallsiteOmitted, + _addedParameterWithoutTypeSymbol.IsCallsiteError); } } } diff --git a/src/Features/Core/Portable/ChangeSignature/Parameter.cs b/src/Features/Core/Portable/ChangeSignature/Parameter.cs index 6c85fc46b3183b066534213712c04cd7d0a1b1b7..4bfbcfe4a74032e9ced1c82cda545e353e162a50 100644 --- a/src/Features/Core/Portable/ChangeSignature/Parameter.cs +++ b/src/Features/Core/Portable/ChangeSignature/Parameter.cs @@ -25,19 +25,50 @@ public ExistingParameter(IParameterSymbol param) internal sealed class AddedParameter : Parameter { - public AddedParameter(ITypeSymbol type, string typeNameDisplayWithErrorIndicator, string parameter, string callSiteValue) + public AddedParameter( + ITypeSymbol type, + string typeNameDisplayWithErrorIndicator, + string parameter, + string callSiteValue, + bool isRequired = true, + string defaultValue = "", + bool isCallsiteOmitted = false, + bool isCallsiteError = false) { Type = type; TypeNameDisplayWithErrorIndicator = typeNameDisplayWithErrorIndicator; ParameterName = parameter; CallSiteValue = callSiteValue; + + IsRequired = isRequired; + DefaultValue = defaultValue; + IsCallsiteError = isCallsiteError; + IsCallsiteOmitted = isCallsiteOmitted; + + if (IsCallsiteError) + { + CallSiteValue = ""; + } + else if (isCallsiteOmitted) + { + CallSiteValue = ""; + } + else + { + CallSiteValue = callSiteValue; + } } public ITypeSymbol Type { get; set; } public string ParameterName { get; set; } public string CallSiteValue { get; set; } - public override bool HasExplicitDefaultValue => false; + public bool IsRequired { get; set; } + public string DefaultValue { get; set; } + public bool IsCallsiteOmitted { get; set; } + public bool IsCallsiteError { get; set; } + + public override bool HasExplicitDefaultValue => !string.IsNullOrWhiteSpace(DefaultValue); public override string Name => ParameterName; public string TypeNameDisplayWithErrorIndicator { get; set; } diff --git a/src/VisualStudio/CSharp/Impl/ChangeSignature/CSharpChangeSignatureViewModelFactoryService.cs b/src/VisualStudio/CSharp/Impl/ChangeSignature/CSharpChangeSignatureViewModelFactoryService.cs index f8cbd2fb31daec933dfa96e60e0a9f2a4e5e1ad5..61b0d9139b6d20798962cbe3f1b2c1391d9633a1 100644 --- a/src/VisualStudio/CSharp/Impl/ChangeSignature/CSharpChangeSignatureViewModelFactoryService.cs +++ b/src/VisualStudio/CSharp/Impl/ChangeSignature/CSharpChangeSignatureViewModelFactoryService.cs @@ -1,7 +1,9 @@ // Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; using System.Composition; +using System.Windows.Documents; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Editor; @@ -44,10 +46,22 @@ protected override ITrackingSpan[] CreateSpansMethod(ITextSnapshot textSnapshot, protected override string ContentTypeName => ContentTypeNames.CSharpContentType; public override SymbolDisplayPart[] GeneratePreviewDisplayParts(AddedParameterViewModel addedParameterViewModel) - => new[] { - new SymbolDisplayPart(SymbolDisplayPartKind.Keyword, null, addedParameterViewModel.Type), - new SymbolDisplayPart(SymbolDisplayPartKind.Space, null, " "), - new SymbolDisplayPart(SymbolDisplayPartKind.ParameterName, null, addedParameterViewModel.ParameterName)}; + { + var parts = new List(); + parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.Keyword, null, addedParameterViewModel.Type)); + parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.Space, null, " ")); + parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.ParameterName, null, addedParameterViewModel.ParameterName)); + + if (!string.IsNullOrWhiteSpace(addedParameterViewModel.Default)) + { + parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.Space, null, " ")); + parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, null, "=")); + parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.Space, null, " ")); + parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.Text, null, addedParameterViewModel.Default)); + } + + return parts.ToArray(); + } public override bool IsTypeNameValid(string typeName) => !SyntaxFactory.ParseTypeName(typeName).ContainsDiagnostics; diff --git a/src/VisualStudio/Core/Def/Implementation/ChangeSignature/AddParameterDialog.xaml b/src/VisualStudio/Core/Def/Implementation/ChangeSignature/AddParameterDialog.xaml index 14d4bd4b9b065ffd7b98e6f9e38bf95a71e6efe2..4be47a1f92c58817775f3a846ebe62193e39f61a 100644 --- a/src/VisualStudio/Core/Def/Implementation/ChangeSignature/AddParameterDialog.xaml +++ b/src/VisualStudio/Core/Def/Implementation/ChangeSignature/AddParameterDialog.xaml @@ -65,7 +65,7 @@ - + diff --git a/src/VisualStudio/Core/Def/Implementation/ChangeSignature/AddParameterDialog.xaml.cs b/src/VisualStudio/Core/Def/Implementation/ChangeSignature/AddParameterDialog.xaml.cs index cb07f1f2e93892f0618c5b7e1c0ba7444bf6640e..81b6afc7b23d2f406d8e213f59e5f036d7af4b5a 100644 --- a/src/VisualStudio/Core/Def/Implementation/ChangeSignature/AddParameterDialog.xaml.cs +++ b/src/VisualStudio/Core/Def/Implementation/ChangeSignature/AddParameterDialog.xaml.cs @@ -61,9 +61,17 @@ private void OK_Click(object sender, RoutedEventArgs e) { // TODO take these values from IntellisenseTextBoxViewModels not from controls. // https://github.com/dotnet/roslyn/issues/41149 - _viewModel.ParameterName = ((IntellisenseTextBox)NameContentControl.Content).Text; - //_viewModel.CallSiteValue = CallSiteValueTextBox.Text; + _viewModel.UpdateTypeSymbol(((IntellisenseTextBox)TypeContentControl.Content).Text); + _viewModel.ParameterName = ((IntellisenseTextBox)NameContentControl.Content).Text; + + _viewModel.IsRequired = RequiredParameterRadioButton.IsChecked ?? false; + _viewModel.DefaultValue = _viewModel.IsRequired ? "" : DefaultValue.Text; + + _viewModel.IsCallsiteError = IntroduceErrorRadioButton.IsChecked ?? false; + _viewModel.IsCallsiteOmitted = OmitArgumentRadioButton.IsChecked ?? false; + + _viewModel.CallSiteValue = CallsiteValueTextBox.Text; if (_viewModel.TrySubmit(_document)) { diff --git a/src/VisualStudio/Core/Def/Implementation/ChangeSignature/AddParameterDialogViewModel.cs b/src/VisualStudio/Core/Def/Implementation/ChangeSignature/AddParameterDialogViewModel.cs index f59054ffd087a927db996b2947fe7a68f0aed6a5..7f670d6e0286a832b5cbb8d887f7d9816a0fe4a8 100644 --- a/src/VisualStudio/Core/Def/Implementation/ChangeSignature/AddParameterDialogViewModel.cs +++ b/src/VisualStudio/Core/Def/Implementation/ChangeSignature/AddParameterDialogViewModel.cs @@ -1,7 +1,5 @@ // Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -#nullable enable - using System.Threading; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.LanguageServices; @@ -14,7 +12,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Implementation.ChangeSignature { internal class AddParameterDialogViewModel : AbstractNotifyPropertyChanged { - private readonly INotificationService? _notificationService; + private readonly INotificationService _notificationService; public readonly Document Document; public readonly int InsertPosition; @@ -48,7 +46,7 @@ private string TypeNameWithoutErrorIndicator genericsOptions: SymbolDisplayGenericsOptions.IncludeTypeParameters, miscellaneousOptions: SymbolDisplayMiscellaneousOptions.UseSpecialTypes); - public ITypeSymbol? TypeSymbol { get; set; } + public ITypeSymbol TypeSymbol { get; set; } public string TypeName { @@ -58,6 +56,11 @@ public string TypeName } } + public bool IsRequired { get; internal set; } + public string DefaultValue { get; internal set; } + public bool IsCallsiteError { get; internal set; } + public bool IsCallsiteOmitted { get; internal set; } + internal void UpdateTypeSymbol(string typeName) { var languageService = Document.GetRequiredLanguageService(); diff --git a/src/VisualStudio/Core/Def/Implementation/ChangeSignature/ChangeSignatureDialog.xaml b/src/VisualStudio/Core/Def/Implementation/ChangeSignature/ChangeSignatureDialog.xaml index e0dcae21e78625dda8f8149c8801af82713a2b80..f0a892663cc11a0e813099ec46a2b58b41519614 100644 --- a/src/VisualStudio/Core/Def/Implementation/ChangeSignature/ChangeSignatureDialog.xaml +++ b/src/VisualStudio/Core/Def/Implementation/ChangeSignature/ChangeSignatureDialog.xaml @@ -210,7 +210,7 @@ - +