提交 00116264 编写于 作者: O Omar Tawfik 提交者: GitHub

Merge pull request #15285 from vslsnap/merge-dev15-rc2-into-master20161116-160049

Merge dev15-rc2 into master
......@@ -745,6 +745,7 @@ private static void FlattenDeconstructVariables(ArrayBuilder<DeconstructionVaria
if (!isVar)
{
CheckRestrictedTypeInAsync(this.ContainingMemberOrLambda, declType, diagnostics, typeSyntax);
return new BoundLocal(designation, localSymbol, constantValueOpt: null, type: declType, hasErrors: hasErrors);
}
......
......@@ -2120,12 +2120,7 @@ private BoundExpression BindOutVariableArgument(DeclarationExpressionSyntax decl
return new OutVariablePendingInference(declarationExpression, localSymbol, null);
}
if (this.ContainingMemberOrLambda.Kind == SymbolKind.Method
&& ((MethodSymbol)this.ContainingMemberOrLambda).IsAsync
&& declType.IsRestrictedType())
{
Error(diagnostics, ErrorCode.ERR_BadSpecialByRefLocal, typeSyntax, declType);
}
CheckRestrictedTypeInAsync(this.ContainingMemberOrLambda, declType, diagnostics, typeSyntax);
return new BoundLocal(declarationExpression, localSymbol, constantValueOpt: null, type: declType);
}
......@@ -2159,6 +2154,21 @@ private BoundExpression BindOutVariableArgument(DeclarationExpressionSyntax decl
expressionVariableField, null, LookupResultKind.Viable, fieldType);
}
/// <summary>
/// Returns true if a bad special by ref local was found.
/// </summary>
internal static bool CheckRestrictedTypeInAsync(Symbol containingSymbol, TypeSymbol type, DiagnosticBag diagnostics, SyntaxNode syntax)
{
if (containingSymbol.Kind == SymbolKind.Method
&& ((MethodSymbol)containingSymbol).IsAsync
&& type.IsRestrictedType())
{
Error(diagnostics, ErrorCode.ERR_BadSpecialByRefLocal, syntax, type);
return true;
}
return false;
}
internal GlobalExpressionVariable LookupDeclaredField(SingleVariableDesignationSyntax variableDesignator)
{
return LookupDeclaredField(variableDesignator, variableDesignator.Identifier.ValueText);
......
......@@ -291,13 +291,9 @@ internal BoundExpression ConvertPatternExpression(TypeSymbol inputType, CSharpSy
// Check for variable declaration errors.
hasErrors |= localSymbol.ScopeBinder.ValidateDeclarationNameConflictsInScope(localSymbol, diagnostics);
if (this.ContainingMemberOrLambda.Kind == SymbolKind.Method
&& ((MethodSymbol)this.ContainingMemberOrLambda).IsAsync
&& declType.IsRestrictedType()
&& !hasErrors)
if (!hasErrors)
{
Error(diagnostics, ErrorCode.ERR_BadSpecialByRefLocal, typeSyntax, declType);
hasErrors = true;
hasErrors = CheckRestrictedTypeInAsync(this.ContainingMemberOrLambda, declType, diagnostics, typeSyntax);
}
return new BoundDeclarationPattern(node, localSymbol, boundDeclType, isVar, hasErrors);
......
......@@ -882,11 +882,8 @@ private TypeSymbol BindVariableType(CSharpSyntaxNode declarationNode, Diagnostic
}
}
if (this.ContainingMemberOrLambda.Kind == SymbolKind.Method
&& ((MethodSymbol)this.ContainingMemberOrLambda).IsAsync
&& declTypeOpt.IsRestrictedType())
if (CheckRestrictedTypeInAsync(this.ContainingMemberOrLambda, declTypeOpt, localDiagnostics, typeSyntax))
{
Error(localDiagnostics, ErrorCode.ERR_BadSpecialByRefLocal, typeSyntax, declTypeOpt);
hasErrors = true;
}
......
......@@ -29,6 +29,11 @@ public BoundExpression SetInferredType(TypeSymbol type, Binder binderOpt, Diagno
{
ReportInferenceFailure(diagnostics);
}
else
{
Binder.CheckRestrictedTypeInAsync(local.ContainingSymbol, type, diagnostics, this.Syntax);
}
local.SetType(type);
return new BoundLocal(this.Syntax, local, constantValueOpt: null, type: type, hasErrors: this.HasErrors || inferenceFailed);
......
......@@ -39,12 +39,10 @@ private BoundExpression SetInferredType(TypeSymbol type, Binder binderOpt, Diagn
{
ReportInferenceFailure(diagnosticsOpt);
}
else if (localSymbol.ContainingSymbol.Kind == SymbolKind.Method &&
((MethodSymbol)localSymbol.ContainingSymbol).IsAsync &&
type.IsRestrictedType())
else
{
var declaration = (DeclarationExpressionSyntax)this.Syntax;
Binder.Error(diagnosticsOpt, ErrorCode.ERR_BadSpecialByRefLocal, declaration.Type, type);
TypeSyntax typeSyntax = ((DeclarationExpressionSyntax)Syntax).Type;
Binder.CheckRestrictedTypeInAsync(localSymbol.ContainingSymbol, type, diagnosticsOpt, typeSyntax);
}
}
......
......@@ -1163,6 +1163,81 @@ public void Deconstruct(out int a, out int b)
);
}
[Fact]
public void NoArgIteratorTypeInAsync()
{
string source = @"
using System;
class C
{
public async void M()
{
(int x, var (err1, y)) = (0, new C());
(ArgIterator err2, var err3) = M2();
foreach ((ArgIterator err4, var err5) in new[] { M2() })
{
}
}
public static (ArgIterator, ArgIterator) M2()
{
return (default(ArgIterator), default(ArgIterator));
}
public void Deconstruct(out ArgIterator a, out int b)
{
a = default(ArgIterator);
b = 2;
}
public void M3()
{
(int x, var (err1, y)) = (0, new C());
(ArgIterator err2, var err3) = M2();
foreach ((ArgIterator err4, var err5) in new[] { M2() })
{
}
}
}
";
var comp = CreateCompilationWithMscorlib(source, references: new[] { ValueTupleRef, SystemRuntimeFacadeRef });
comp.VerifyDiagnostics(
// (14,20): error CS0610: Field or property cannot be of type 'ArgIterator'
// public static (ArgIterator, ArgIterator) M2()
Diagnostic(ErrorCode.ERR_FieldCantBeRefAny, "ArgIterator").WithArguments("System.ArgIterator").WithLocation(14, 20),
// (14,33): error CS0610: Field or property cannot be of type 'ArgIterator'
// public static (ArgIterator, ArgIterator) M2()
Diagnostic(ErrorCode.ERR_FieldCantBeRefAny, "ArgIterator").WithArguments("System.ArgIterator").WithLocation(14, 33),
// (18,29): error CS1601: Cannot make reference to variable of type 'ArgIterator'
// public void Deconstruct(out ArgIterator a, out int b)
Diagnostic(ErrorCode.ERR_MethodArgCantBeRefAny, "out ArgIterator a").WithArguments("System.ArgIterator").WithLocation(18, 29),
// (7,22): error CS4012: Parameters or locals of type 'ArgIterator' cannot be declared in async methods or lambda expressions.
// (int x, var (err1, y)) = (0, new C());
Diagnostic(ErrorCode.ERR_BadSpecialByRefLocal, "err1").WithArguments("System.ArgIterator").WithLocation(7, 22),
// (8,10): error CS4012: Parameters or locals of type 'ArgIterator' cannot be declared in async methods or lambda expressions.
// (ArgIterator err2, var err3) = M2();
Diagnostic(ErrorCode.ERR_BadSpecialByRefLocal, "ArgIterator").WithArguments("System.ArgIterator").WithLocation(8, 10),
// (8,32): error CS4012: Parameters or locals of type 'ArgIterator' cannot be declared in async methods or lambda expressions.
// (ArgIterator err2, var err3) = M2();
Diagnostic(ErrorCode.ERR_BadSpecialByRefLocal, "err3").WithArguments("System.ArgIterator").WithLocation(8, 32),
// (9,19): error CS4012: Parameters or locals of type 'ArgIterator' cannot be declared in async methods or lambda expressions.
// foreach ((ArgIterator err4, var err5) in new[] { M2() })
Diagnostic(ErrorCode.ERR_BadSpecialByRefLocal, "ArgIterator").WithArguments("System.ArgIterator").WithLocation(9, 19),
// (9,41): error CS4012: Parameters or locals of type 'ArgIterator' cannot be declared in async methods or lambda expressions.
// foreach ((ArgIterator err4, var err5) in new[] { M2() })
Diagnostic(ErrorCode.ERR_BadSpecialByRefLocal, "err5").WithArguments("System.ArgIterator").WithLocation(9, 41),
// (5,23): warning CS1998: This async method lacks 'await' operators and will run synchronously. Consider using the 'await' operator to await non-blocking API calls, or 'await Task.Run(...)' to do CPU-bound work on a background thread.
// public async void M()
Diagnostic(ErrorCode.WRN_AsyncLacksAwaits, "M").WithLocation(5, 23),
// (16,17): error CS0610: Field or property cannot be of type 'ArgIterator'
// return (default(ArgIterator), default(ArgIterator));
Diagnostic(ErrorCode.ERR_FieldCantBeRefAny, "default(ArgIterator)").WithArguments("System.ArgIterator").WithLocation(16, 17),
// (16,39): error CS0610: Field or property cannot be of type 'ArgIterator'
// return (default(ArgIterator), default(ArgIterator));
Diagnostic(ErrorCode.ERR_FieldCantBeRefAny, "default(ArgIterator)").WithArguments("System.ArgIterator").WithLocation(16, 39)
);
}
[Fact]
public void MixedDeconstructionCannotBeParsed()
{
......
......@@ -487,6 +487,15 @@ internal class ServicesVSResources {
}
}
/// <summary>
/// Looks up a localized string similar to Description.
/// </summary>
internal static string Description {
get {
return ResourceManager.GetString("Description", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to _Deselect All.
/// </summary>
......@@ -1437,6 +1446,15 @@ internal class ServicesVSResources {
}
}
/// <summary>
/// Looks up a localized string similar to Preference.
/// </summary>
internal static string Preference {
get {
return ResourceManager.GetString("Preference", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Preview method signature:.
/// </summary>
......
......@@ -816,4 +816,10 @@ Additional information: {1}</value>
<data name="Prefer_null_propagation" xml:space="preserve">
<value>Prefer null propagation</value>
</data>
<data name="Description" xml:space="preserve">
<value>Description</value>
</data>
<data name="Preference" xml:space="preserve">
<value>Preference</value>
</data>
</root>
\ No newline at end of file
......@@ -82,7 +82,7 @@
<DataGrid.Columns>
<DataGridTextColumn
x:Name="description"
Header="Description"
Header="{x:Static local:GridOptionPreviewControl.DescriptionHeader}"
Binding="{Binding Description, Mode=OneWay}"
Width="4.5*"
IsReadOnly="True">
......@@ -98,7 +98,7 @@
</DataGridTextColumn>
<DataGridTemplateColumn
x:Name="preference"
Header="Preference"
Header="{x:Static local:GridOptionPreviewControl.PreferenceHeader}"
Width="3*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
......@@ -113,7 +113,7 @@
</DataGridTemplateColumn>
<DataGridTemplateColumn
x:Name="severity"
Header="Severity"
Header="{x:Static local:GridOptionPreviewControl.SeverityHeader}"
Width="2.5*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
......
......@@ -14,6 +14,10 @@ internal partial class GridOptionPreviewControl : AbstractOptionPageControl
private readonly IServiceProvider _serviceProvider;
private readonly Func<OptionSet, IServiceProvider, AbstractOptionPreviewViewModel> _createViewModel;
public static string DescriptionHeader => ServicesVSResources.Description;
public static string PreferenceHeader => ServicesVSResources.Preference;
public static string SeverityHeader => ServicesVSResources.Severity;
internal GridOptionPreviewControl(IServiceProvider serviceProvider,
Func<OptionSet, IServiceProvider,
AbstractOptionPreviewViewModel> createViewModel)
......
// 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 Microsoft.CodeAnalysis;
using Microsoft.VisualStudio.Imaging;
using Microsoft.VisualStudio.Imaging.Interop;
namespace Microsoft.VisualStudio.LanguageServices.Implementation.Options.Style.NamingPreferences
{
public class EnforcementLevel
{
public EnforcementLevel(DiagnosticSeverity severity)
{
Value = severity;
switch (severity)
{
case DiagnosticSeverity.Hidden:
Name = "None";
Moniker = KnownMonikers.None;
return;
case DiagnosticSeverity.Info:
Name = "Suggestion";
Moniker = KnownMonikers.StatusInformation;
return;
case DiagnosticSeverity.Warning:
Name = "Warning";
Moniker = KnownMonikers.StatusWarning;
return;
case DiagnosticSeverity.Error:
Name = "Error";
Moniker = KnownMonikers.StatusError;
return;
default:
throw new ArgumentException("Unexpected DiagnosticSeverity", nameof(severity));
}
}
public EnforcementLevel(string name, DiagnosticSeverity value, ImageMoniker moniker)
{
Name = name;
Value = value;
Moniker = moniker;
}
public ImageMoniker Moniker { get; private set; }
public string Name { get; private set; }
public DiagnosticSeverity Value { get; private set; }
}
}
......@@ -109,7 +109,7 @@
<DataGrid.Columns>
<DataGridTemplateColumn
x:Name="selectable"
Header="Reorder"
Header="{x:Static style:NamingStyleOptionPageControl.ReorderHeader}"
Width="Auto">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
......@@ -145,7 +145,7 @@
</DataGridTemplateColumn>
<DataGridTemplateColumn
x:Name="symbolSpec"
Header="Specification"
Header="{x:Static style:NamingStyleOptionPageControl.SpecificationHeader}"
Width="3*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
......@@ -162,7 +162,7 @@
</DataGridTemplateColumn>
<DataGridTemplateColumn
x:Name="style"
Header="Style"
Header="{x:Static style:NamingStyleOptionPageControl.StyleHeader}"
Width="3*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
......
......@@ -8,9 +8,11 @@
using System.Windows.Controls;
using System.Xml.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CodeStyle;
using Microsoft.CodeAnalysis.Diagnostics.Analyzers.NamingStyles;
using Microsoft.CodeAnalysis.Notification;
using Microsoft.CodeAnalysis.Simplification;
using Microsoft.VisualStudio.Imaging;
using Microsoft.VisualStudio.LanguageServices.Implementation.Options.Style.NamingPreferences;
using Microsoft.VisualStudio.PlatformUI;
......@@ -18,15 +20,21 @@ namespace Microsoft.VisualStudio.LanguageServices.Implementation.Options.Style
{
internal partial class NamingStyleOptionPageControl : AbstractOptionPageControl
{
public static string ReorderHeader => ServicesVSResources.Reorder;
public static string SpecificationHeader => ServicesVSResources.Specification;
public static string StyleHeader => ServicesVSResources.Style;
private NamingStyleOptionPageViewModel _viewModel;
private readonly string _languageName;
private readonly INotificationService _notificationService;
private readonly ImmutableArray<EnforcementLevel> _notifications = ImmutableArray.Create(
new EnforcementLevel(DiagnosticSeverity.Hidden),
new EnforcementLevel(DiagnosticSeverity.Info),
new EnforcementLevel(DiagnosticSeverity.Warning),
new EnforcementLevel(DiagnosticSeverity.Error));
private readonly NotificationOptionViewModel[] _notifications = new[]
{
new NotificationOptionViewModel(NotificationOption.None, KnownMonikers.None),
new NotificationOptionViewModel(NotificationOption.Suggestion, KnownMonikers.StatusInformation),
new NotificationOptionViewModel(NotificationOption.Warning, KnownMonikers.StatusWarning),
new NotificationOptionViewModel(NotificationOption.Error, KnownMonikers.StatusError)
};
internal NamingStyleOptionPageControl(IServiceProvider serviceProvider, INotificationService notificationService, string languageName)
: base(serviceProvider)
......@@ -137,7 +145,7 @@ internal override void SaveSettings()
var rule = new SerializableNamingRule()
{
EnforcementLevel = item.SelectedNotificationPreference.Value,
EnforcementLevel = item.SelectedNotificationPreference.Notification.Value,
NamingStyleID = item.SelectedStyle.ID,
SymbolSpecificationID = item.SelectedSpecification.ID
};
......
......@@ -3,7 +3,9 @@
using System.Collections.ObjectModel;
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CodeStyle;
using Microsoft.CodeAnalysis.Diagnostics.Analyzers.NamingStyles;
using Microsoft.VisualStudio.Imaging;
using Microsoft.VisualStudio.LanguageServices.Implementation.Options.Style.NamingPreferences;
using Microsoft.VisualStudio.LanguageServices.Implementation.Utilities;
......@@ -14,12 +16,12 @@ internal class NamingStyleOptionPageViewModel : AbstractNotifyPropertyChanged
public string ManageSpecificationsButtonText => ServicesVSResources.Manage_specifications;
public string ManageStylesButtonText => ServicesVSResources.Manage_styles;
private readonly EnforcementLevel[] _notifications = new[]
private readonly NotificationOptionViewModel[] _notifications = new[]
{
new EnforcementLevel(DiagnosticSeverity.Hidden),
new EnforcementLevel(DiagnosticSeverity.Info),
new EnforcementLevel(DiagnosticSeverity.Warning),
new EnforcementLevel(DiagnosticSeverity.Error),
new NotificationOptionViewModel(NotificationOption.None, KnownMonikers.None),
new NotificationOptionViewModel(NotificationOption.Suggestion, KnownMonikers.StatusInformation),
new NotificationOptionViewModel(NotificationOption.Warning, KnownMonikers.StatusWarning),
new NotificationOptionViewModel(NotificationOption.Error, KnownMonikers.StatusError)
};
public ObservableCollection<NamingRuleViewModel> CodeStyleItems { get; set; }
......@@ -35,11 +37,11 @@ public NamingStyleOptionPageViewModel(SerializableNamingStylePreferencesInfo inf
viewModel.NamingStyles = new ObservableCollection<NamingStyle>(info.NamingStyles);
viewModel.Specifications = new ObservableCollection<SymbolSpecification>(info.SymbolSpecifications);
viewModel.NotificationPreferences = new List<EnforcementLevel>(_notifications);
viewModel.NotificationPreferences = new List<NotificationOptionViewModel>(_notifications);
viewModel.SelectedSpecification = viewModel.Specifications.Single(s => s.ID == namingRule.SymbolSpecificationID);
viewModel.SelectedStyle= viewModel.NamingStyles.Single(s => s.ID == namingRule.NamingStyleID);
viewModel.SelectedNotificationPreference = viewModel.NotificationPreferences.Single(n => n.Name == new EnforcementLevel(namingRule.EnforcementLevel).Name);
viewModel.SelectedNotificationPreference = viewModel.NotificationPreferences.Single(n => n.Notification.Value == namingRule.EnforcementLevel);
viewModels.Add(viewModel);
}
......@@ -196,16 +198,16 @@ public NamingRuleViewModel()
{
Specifications = new ObservableCollection<SymbolSpecification>();
NamingStyles = new ObservableCollection<NamingStyle>();
NotificationPreferences = new List<EnforcementLevel>();
NotificationPreferences = new List<NotificationOptionViewModel>();
}
private SymbolSpecification _selectedSpecification;
private NamingStyle _selectedNamingStyle;
private EnforcementLevel _selectedNotification;
private NotificationOptionViewModel _selectedNotification;
public ObservableCollection<SymbolSpecification> Specifications { get; set; }
public ObservableCollection<NamingStyle> NamingStyles { get; set; }
public IEnumerable<EnforcementLevel> NotificationPreferences { get; set; }
public IEnumerable<NotificationOptionViewModel> NotificationPreferences { get; set; }
public SymbolSpecification SelectedSpecification
{
......@@ -230,7 +232,7 @@ public NamingStyle SelectedStyle
SetProperty(ref _selectedNamingStyle, value);
}
}
public EnforcementLevel SelectedNotificationPreference
public NotificationOptionViewModel SelectedNotificationPreference
{
get
{
......
......@@ -256,7 +256,6 @@
<Compile Include="Options\Style\NamingPreferences\NamingStyleOptionPageControl.xaml.cs">
<DependentUpon>NamingStyleOptionPageControl.xaml</DependentUpon>
</Compile>
<Compile Include="Options\Style\NamingPreferences\EnforcementLevel.cs" />
<Compile Include="Options\Style\NamingPreferences\NamingStyleOptionPageViewModel.cs" />
<Compile Include="Options\Style\NamingPreferences\SymbolSpecification\SymbolSpecificationDialog.xaml.cs">
<DependentUpon>SymbolSpecificationDialog.xaml</DependentUpon>
......
......@@ -16,10 +16,10 @@ public class NotificationOption
public DiagnosticSeverity Value { get; set; }
public static readonly NotificationOption None = new NotificationOption(nameof(None), DiagnosticSeverity.Hidden);
public static readonly NotificationOption Suggestion = new NotificationOption(nameof(Suggestion), DiagnosticSeverity.Info);
public static readonly NotificationOption Warning = new NotificationOption(nameof(Warning), DiagnosticSeverity.Warning);
public static readonly NotificationOption Error = new NotificationOption(nameof(Error), DiagnosticSeverity.Error);
public static readonly NotificationOption None = new NotificationOption(WorkspacesResources.None, DiagnosticSeverity.Hidden);
public static readonly NotificationOption Suggestion = new NotificationOption(WorkspacesResources.Suggestion, DiagnosticSeverity.Info);
public static readonly NotificationOption Warning = new NotificationOption(WorkspacesResources.Warning, DiagnosticSeverity.Warning);
public static readonly NotificationOption Error = new NotificationOption(WorkspacesResources.Error, DiagnosticSeverity.Error);
private NotificationOption(string name, DiagnosticSeverity severity)
{
......
......@@ -620,6 +620,15 @@ internal class WorkspacesResources {
}
}
/// <summary>
/// Looks up a localized string similar to Error.
/// </summary>
internal static string Error {
get {
return ResourceManager.GetString("Error", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Event.
/// </summary>
......@@ -909,21 +918,30 @@ internal class WorkspacesResources {
}
/// <summary>
/// Looks up a localized string similar to Option &apos;{0}&apos; has an unsupported type to use with {1}. You should specify a parsing function..
/// Looks up a localized string similar to Non-Field Members.
/// </summary>
internal static string Option_0_has_an_unsupported_type_to_use_with_1_You_should_specify_a_parsing_function {
internal static string Non_Field_Members {
get {
return ResourceManager.GetString("Option_0_has_an_unsupported_type_to_use_with_1_You_should_specify_a_parsing_funct" +
"ion", resourceCulture);
return ResourceManager.GetString("Non_Field_Members", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Non-Field Members.
/// Looks up a localized string similar to None.
/// </summary>
internal static string Non_Field_Members {
internal static string None {
get {
return ResourceManager.GetString("Non_Field_Members", resourceCulture);
return ResourceManager.GetString("None", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Option &apos;{0}&apos; has an unsupported type to use with {1}. You should specify a parsing function..
/// </summary>
internal static string Option_0_has_an_unsupported_type_to_use_with_1_You_should_specify_a_parsing_function {
get {
return ResourceManager.GetString("Option_0_has_an_unsupported_type_to_use_with_1_You_should_specify_a_parsing_funct" +
"ion", resourceCulture);
}
}
......@@ -1144,6 +1162,15 @@ internal class WorkspacesResources {
}
}
/// <summary>
/// Looks up a localized string similar to Suggestion.
/// </summary>
internal static string Suggestion {
get {
return ResourceManager.GetString("Suggestion", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Supplied diagnostic cannot be null..
/// </summary>
......
......@@ -575,4 +575,13 @@
<value>Method</value>
<comment>{locked:method} unless the capitalization should be handled differently</comment>
</data>
<data name="Error" xml:space="preserve">
<value>Error</value>
</data>
<data name="None" xml:space="preserve">
<value>None</value>
</data>
<data name="Suggestion" xml:space="preserve">
<value>Suggestion</value>
</data>
</root>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册