提交 4ce2c525 编写于 作者: D David Poeschl

UI Parity with prototype branch

No engine work
上级 526b3112
......@@ -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;
......
......@@ -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);
}
}
}
......@@ -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 = "<TODO>";
}
else if (isCallsiteOmitted)
{
CallSiteValue = "<omit>";
}
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; }
......
// 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<SymbolDisplayPart>();
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;
......
......@@ -65,7 +65,7 @@
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<RadioButton x:Name="CallsiteValueRadioButton" Grid.Row="0" Grid.Column="0" GroupName="CallsiteKind" VerticalContentAlignment="Center" IsChecked="True" Content="{Binding ElementName=dialog, Path=Value}" />
<TextBox Grid.Column="1" Grid.Row="0" Margin="5,0,0,0" IsEnabled="{Binding IsChecked, ElementName=CallsiteValueRadioButton}" Text="{Binding CallsiteValue, Mode=TwoWay}"></TextBox>
<TextBox x:Name="CallsiteValueTextBox" Grid.Column="1" Grid.Row="0" Margin="5,0,0,0" IsEnabled="{Binding IsChecked, ElementName=CallsiteValueRadioButton}" Text="{Binding CallsiteValue, Mode=TwoWay}"></TextBox>
<CheckBox Grid.Row="1" Grid.ColumnSpan="2" Margin="25,5,0,0" Content="{Binding ElementName=dialog, Path=UseNamedArgument}" />
</Grid>
<RadioButton x:Name="IntroduceErrorRadioButton" Grid.Row="9" Margin="5,5,0,0" Grid.Column="0" GroupName="CallsiteKind" VerticalContentAlignment="Center" Content="{Binding ElementName=dialog, Path=IntroduceUndefinedTodoVariables}"/>
......
......@@ -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))
{
......
// 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<IChangeSignatureViewModelFactoryService>();
......
......@@ -210,7 +210,7 @@
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn x:Name="defaultHeader" Binding="{Binding Default, Mode=OneWay}" Width="*" IsReadOnly="True">
<DataGridTextColumn x:Name="defaultHeader" Binding="{Binding DefaultValue, Mode=OneWay}" Width="*" IsReadOnly="True">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="Padding" Value="{StaticResource ResourceKey=cellPadding}" />
......
......@@ -143,9 +143,11 @@ private void Add_Click(object sender, RoutedEventArgs e)
addParameterViewModel.TypeSymbol,
addParameterViewModel.TypeName,
addParameterViewModel.ParameterName,
string.IsNullOrWhiteSpace(addParameterViewModel.CallSiteValue)
? ServicesVSResources.ChangeSignature_NewParameterIntroduceTODOVariable
: addParameterViewModel.CallSiteValue);
addParameterViewModel.CallSiteValue,
addParameterViewModel.IsRequired,
addParameterViewModel.DefaultValue,
addParameterViewModel.IsCallsiteOmitted,
addParameterViewModel.IsCallsiteError);
_viewModel.AddParameter(addedParameter);
}
......
......@@ -244,7 +244,14 @@ internal void Restore()
internal void AddParameter(AddedParameter addedParameter)
{
_parametersWithoutDefaultValues.Add(new AddedParameterViewModel(this, addedParameter));
if (addedParameter.IsRequired)
{
_parametersWithoutDefaultValues.Add(new AddedParameterViewModel(this, addedParameter));
}
else
{
_parametersWithDefaultValues.Add(new AddedParameterViewModel(this, addedParameter));
}
RemoveRestoreNotifyPropertyChanged();
}
......@@ -576,6 +583,8 @@ public abstract class ParameterViewModel
public abstract string ShortAutomationText { get; }
public abstract bool IsDisabled { get; }
public abstract string CallSite { get; }
public abstract bool IsRequired { get; }
public abstract string DefaultValue { get; }
public ParameterViewModel(ChangeSignatureDialogViewModel changeSignatureDialogViewModel)
{
......@@ -599,6 +608,31 @@ public virtual string FullAutomationText
return text;
}
}
public bool NeedsBottomBorder
{
get
{
if (this == changeSignatureDialogViewModel._thisParameter)
{
return true;
}
if (this == changeSignatureDialogViewModel._parametersWithoutDefaultValues.LastOrDefault() &&
(changeSignatureDialogViewModel._parametersWithDefaultValues.Any() || changeSignatureDialogViewModel._paramsParameter != null))
{
return true;
}
if (this == changeSignatureDialogViewModel._parametersWithDefaultValues.LastOrDefault() &&
changeSignatureDialogViewModel._paramsParameter != null)
{
return true;
}
return false;
}
}
}
public class AddedParameterViewModel : ParameterViewModel
......@@ -632,13 +666,16 @@ public override string FullAutomationText
public override string CallSite => _addedParameter.CallSiteValue;
public override string InitialIndex => ServicesVSResources.ChangeSignature_NewParameterIndicator;
public override string InitialIndex => "+";
// Newly added parameters cannot have modifiers yet
public override string Modifier => string.Empty;
// Only required parameters are supported currently
public override string Default => string.Empty;
public override bool IsRequired => _addedParameter.IsRequired;
public override string DefaultValue => _addedParameter.DefaultValue;
}
#nullable enable
......@@ -741,32 +778,10 @@ string NullText(string @null)
public override bool IsDisabled => changeSignatureDialogViewModel.IsDisabled(this);
public bool NeedsBottomBorder
{
get
{
if (this == changeSignatureDialogViewModel._thisParameter)
{
return true;
}
if (this == changeSignatureDialogViewModel._parametersWithoutDefaultValues.LastOrDefault() &&
(changeSignatureDialogViewModel._parametersWithDefaultValues.Any() || changeSignatureDialogViewModel._paramsParameter != null))
{
return true;
}
if (this == changeSignatureDialogViewModel._parametersWithDefaultValues.LastOrDefault() &&
changeSignatureDialogViewModel._paramsParameter != null)
{
return true;
}
return false;
}
}
public override bool IsRemoved { get; set; }
public override bool IsRequired => !ParameterSymbol.HasExplicitDefaultValue;
public override string DefaultValue => Default;
}
}
}
......@@ -623,15 +623,6 @@ internal class ServicesVSResources {
}
}
/// <summary>
/// Looks up a localized string similar to &lt;new&gt;.
/// </summary>
internal static string ChangeSignature_NewParameterIndicator {
get {
return ResourceManager.GetString("ChangeSignature_NewParameterIndicator", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to TODO.
/// </summary>
......
......@@ -1402,9 +1402,6 @@ I agree to all of the foregoing:</value>
<value>You must change the signature</value>
<comment>"signature" here means the definition of a method</comment>
</data>
<data name="ChangeSignature_NewParameterIndicator" xml:space="preserve">
<value>&lt;new&gt;</value>
</data>
<data name="ChangeSignature_NewParameterIntroduceTODOVariable" xml:space="preserve">
<value>TODO</value>
<comment>"TODO" is an indication that there is work to be done still</comment>
......
......@@ -112,11 +112,6 @@
<target state="new">Call site</target>
<note />
</trans-unit>
<trans-unit id="ChangeSignature_NewParameterIndicator">
<source>&lt;new&gt;</source>
<target state="new">&lt;new&gt;</target>
<note />
</trans-unit>
<trans-unit id="ChangeSignature_NewParameterIntroduceTODOVariable">
<source>TODO</source>
<target state="new">TODO</target>
......
......@@ -112,11 +112,6 @@
<target state="new">Call site</target>
<note />
</trans-unit>
<trans-unit id="ChangeSignature_NewParameterIndicator">
<source>&lt;new&gt;</source>
<target state="new">&lt;new&gt;</target>
<note />
</trans-unit>
<trans-unit id="ChangeSignature_NewParameterIntroduceTODOVariable">
<source>TODO</source>
<target state="new">TODO</target>
......
......@@ -112,11 +112,6 @@
<target state="new">Call site</target>
<note />
</trans-unit>
<trans-unit id="ChangeSignature_NewParameterIndicator">
<source>&lt;new&gt;</source>
<target state="new">&lt;new&gt;</target>
<note />
</trans-unit>
<trans-unit id="ChangeSignature_NewParameterIntroduceTODOVariable">
<source>TODO</source>
<target state="new">TODO</target>
......
......@@ -112,11 +112,6 @@
<target state="new">Call site</target>
<note />
</trans-unit>
<trans-unit id="ChangeSignature_NewParameterIndicator">
<source>&lt;new&gt;</source>
<target state="new">&lt;new&gt;</target>
<note />
</trans-unit>
<trans-unit id="ChangeSignature_NewParameterIntroduceTODOVariable">
<source>TODO</source>
<target state="new">TODO</target>
......
......@@ -112,11 +112,6 @@
<target state="new">Call site</target>
<note />
</trans-unit>
<trans-unit id="ChangeSignature_NewParameterIndicator">
<source>&lt;new&gt;</source>
<target state="new">&lt;new&gt;</target>
<note />
</trans-unit>
<trans-unit id="ChangeSignature_NewParameterIntroduceTODOVariable">
<source>TODO</source>
<target state="new">TODO</target>
......
......@@ -112,11 +112,6 @@
<target state="new">Call site</target>
<note />
</trans-unit>
<trans-unit id="ChangeSignature_NewParameterIndicator">
<source>&lt;new&gt;</source>
<target state="new">&lt;new&gt;</target>
<note />
</trans-unit>
<trans-unit id="ChangeSignature_NewParameterIntroduceTODOVariable">
<source>TODO</source>
<target state="new">TODO</target>
......
......@@ -112,11 +112,6 @@
<target state="new">Call site</target>
<note />
</trans-unit>
<trans-unit id="ChangeSignature_NewParameterIndicator">
<source>&lt;new&gt;</source>
<target state="new">&lt;new&gt;</target>
<note />
</trans-unit>
<trans-unit id="ChangeSignature_NewParameterIntroduceTODOVariable">
<source>TODO</source>
<target state="new">TODO</target>
......
......@@ -112,11 +112,6 @@
<target state="new">Call site</target>
<note />
</trans-unit>
<trans-unit id="ChangeSignature_NewParameterIndicator">
<source>&lt;new&gt;</source>
<target state="new">&lt;new&gt;</target>
<note />
</trans-unit>
<trans-unit id="ChangeSignature_NewParameterIntroduceTODOVariable">
<source>TODO</source>
<target state="new">TODO</target>
......
......@@ -112,11 +112,6 @@
<target state="new">Call site</target>
<note />
</trans-unit>
<trans-unit id="ChangeSignature_NewParameterIndicator">
<source>&lt;new&gt;</source>
<target state="new">&lt;new&gt;</target>
<note />
</trans-unit>
<trans-unit id="ChangeSignature_NewParameterIntroduceTODOVariable">
<source>TODO</source>
<target state="new">TODO</target>
......
......@@ -112,11 +112,6 @@
<target state="new">Call site</target>
<note />
</trans-unit>
<trans-unit id="ChangeSignature_NewParameterIndicator">
<source>&lt;new&gt;</source>
<target state="new">&lt;new&gt;</target>
<note />
</trans-unit>
<trans-unit id="ChangeSignature_NewParameterIntroduceTODOVariable">
<source>TODO</source>
<target state="new">TODO</target>
......
......@@ -112,11 +112,6 @@
<target state="new">Call site</target>
<note />
</trans-unit>
<trans-unit id="ChangeSignature_NewParameterIndicator">
<source>&lt;new&gt;</source>
<target state="new">&lt;new&gt;</target>
<note />
</trans-unit>
<trans-unit id="ChangeSignature_NewParameterIntroduceTODOVariable">
<source>TODO</source>
<target state="new">TODO</target>
......
......@@ -112,11 +112,6 @@
<target state="new">Call site</target>
<note />
</trans-unit>
<trans-unit id="ChangeSignature_NewParameterIndicator">
<source>&lt;new&gt;</source>
<target state="new">&lt;new&gt;</target>
<note />
</trans-unit>
<trans-unit id="ChangeSignature_NewParameterIntroduceTODOVariable">
<source>TODO</source>
<target state="new">TODO</target>
......
......@@ -112,11 +112,6 @@
<target state="new">Call site</target>
<note />
</trans-unit>
<trans-unit id="ChangeSignature_NewParameterIndicator">
<source>&lt;new&gt;</source>
<target state="new">&lt;new&gt;</target>
<note />
</trans-unit>
<trans-unit id="ChangeSignature_NewParameterIntroduceTODOVariable">
<source>TODO</source>
<target state="new">TODO</target>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册