未验证 提交 14f447e8 编写于 作者: M msftbot[bot] 提交者: GitHub

Merge pull request #42882 from mavasani/PortValidateFormatString

Port ValidateFormatString analyzer and tests to shared layer
......@@ -63,6 +63,7 @@
<Compile Include="$(MSBuildThisFileDirectory)UsePatternMatching\CSharpAsAndNullCheckDiagnosticAnalyzer.cs" />
<Compile Include="$(MSBuildThisFileDirectory)UsePatternMatching\CSharpIsAndCastCheckDiagnosticAnalyzer.cs" />
<Compile Include="$(MSBuildThisFileDirectory)UseThrowExpression\CSharpUseThrowExpressionDiagnosticAnalyzer.cs" />
<Compile Include="$(MSBuildThisFileDirectory)ValidateFormatString\CSharpValidateFormatStringDiagnosticAnalyzer.cs" />
</ItemGroup>
<ItemGroup Condition="'$(DefaultLanguageSourceExtension)' != '' AND '$(BuildingInsideVisualStudio)' != 'true'">
<ExpectedCompile Include="$(MSBuildThisFileDirectory)**\*$(DefaultLanguageSourceExtension)" />
......
......@@ -65,6 +65,7 @@
<Compile Include="$(MSBuildThisFileDirectory)UsePatternMatching\CSharpIsAndCastCheckDiagnosticAnalyzerTests_FixAllTests.cs" />
<Compile Include="$(MSBuildThisFileDirectory)UseThrowExpression\UseThrowExpressionTests.cs" />
<Compile Include="$(MSBuildThisFileDirectory)UseThrowExpression\UseThrowExpressionTests_FixAllTests.cs" />
<Compile Include="$(MSBuildThisFileDirectory)ValidateFormatString\ValidateFormatStringTests.cs" />
</ItemGroup>
<ItemGroup Condition="'$(DefaultLanguageSourceExtension)' != '' AND '$(BuildingInsideVisualStudio)' != 'true'">
<ExpectedCompile Include="$(MSBuildThisFileDirectory)**\*$(DefaultLanguageSourceExtension)" />
......
......@@ -8,6 +8,7 @@
using Microsoft.CodeAnalysis.CSharp.ValidateFormatString;
using Microsoft.CodeAnalysis.Diagnostics;
using Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.Diagnostics;
using Microsoft.CodeAnalysis.Editor.UnitTests.CodeActions;
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Test.Utilities;
using Microsoft.CodeAnalysis.ValidateFormatString;
......@@ -21,21 +22,13 @@ public class ValidateFormatStringTests : AbstractCSharpDiagnosticProviderBasedUs
internal override (DiagnosticAnalyzer, CodeFixProvider) CreateDiagnosticProviderAndFixer(Workspace workspace)
=> (new CSharpValidateFormatStringDiagnosticAnalyzer(), null);
private IDictionary<OptionKey2, object> CSharpOptionOffVBOptionOn()
{
var optionsSet = new Dictionary<OptionKey2, object>();
optionsSet.Add(new OptionKey2(ValidateFormatStringOption.ReportInvalidPlaceholdersInStringDotFormatCalls, LanguageNames.CSharp), false);
optionsSet.Add(new OptionKey2(ValidateFormatStringOption.ReportInvalidPlaceholdersInStringDotFormatCalls, LanguageNames.VisualBasic), true);
return optionsSet;
}
private IOptionsCollection CSharpOptionOffVBOptionOn() => OptionsSet(
(new OptionKey2(ValidateFormatStringOption.ReportInvalidPlaceholdersInStringDotFormatCalls, LanguageNames.CSharp), false),
(new OptionKey2(ValidateFormatStringOption.ReportInvalidPlaceholdersInStringDotFormatCalls, LanguageNames.VisualBasic), true));
private IDictionary<OptionKey2, object> CSharpOptionOnVBOptionOff()
{
var optionsSet = new Dictionary<OptionKey2, object>();
optionsSet.Add(new OptionKey2(ValidateFormatStringOption.ReportInvalidPlaceholdersInStringDotFormatCalls, LanguageNames.CSharp), true);
optionsSet.Add(new OptionKey2(ValidateFormatStringOption.ReportInvalidPlaceholdersInStringDotFormatCalls, LanguageNames.VisualBasic), false);
return optionsSet;
}
private IOptionsCollection CSharpOptionOnVBOptionOff() => OptionsSet(
(new OptionKey2(ValidateFormatStringOption.ReportInvalidPlaceholdersInStringDotFormatCalls, LanguageNames.CSharp), true),
(new OptionKey2(ValidateFormatStringOption.ReportInvalidPlaceholdersInStringDotFormatCalls, LanguageNames.VisualBasic), false));
[Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)]
public async Task OnePlaceholder()
......@@ -544,33 +537,35 @@ static void Main(string[] args)
");
}
[Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)]
public async Task WarningTurnedOff()
{
await TestDiagnosticMissingAsync(@" class Program
{
static void Main(string[] args)
{
string.Format(""This {1[||]} works"", ""test"");
}
}
", new TestParameters(options: CSharpOptionOffVBOptionOn()));
}
[Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)]
public async Task WarningTurnedOn()
#if CODE_STYLE
[InlineData(false, true)] // Option has no effect on CodeStyle layer CI execution as it is not an editorconfig option.
#else
[InlineData(false, false)]
#endif
[InlineData(true, true)]
[Theory, Trait(Traits.Feature, Traits.Features.ValidateFormatString)]
public async Task TestOption(bool optionOn, bool expectDiagnostic)
{
await TestDiagnosticInfoAsync(@" class Program
var source = @" class Program
{
static void Main(string[] args)
{
string.Format(""This [|{1}|] is my test"", ""teststring1"");
}
}",
options: CSharpOptionOnVBOptionOff(),
diagnosticId: IDEDiagnosticIds.ValidateFormatStringDiagnosticID,
diagnosticSeverity: DiagnosticSeverity.Warning,
diagnosticMessage: FeaturesResources.Format_string_contains_invalid_placeholder);
}";
var options = optionOn ? CSharpOptionOnVBOptionOff() : CSharpOptionOffVBOptionOn();
if (!expectDiagnostic)
{
await TestDiagnosticMissingAsync(source, new TestParameters(options: options));
}
else
{
await TestDiagnosticInfoAsync(source,
options,
diagnosticId: IDEDiagnosticIds.ValidateFormatStringDiagnosticID,
diagnosticSeverity: DiagnosticSeverity.Warning,
diagnosticMessage: AnalyzersResources.Format_string_contains_invalid_placeholder);
}
}
[Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)]
......@@ -586,7 +581,7 @@ static void Main(string[] args)
options: null,
diagnosticId: IDEDiagnosticIds.ValidateFormatStringDiagnosticID,
diagnosticSeverity: DiagnosticSeverity.Warning,
diagnosticMessage: FeaturesResources.Format_string_contains_invalid_placeholder);
diagnosticMessage: AnalyzersResources.Format_string_contains_invalid_placeholder);
}
[Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)]
......@@ -602,7 +597,7 @@ static void Main(string[] args)
options: null,
diagnosticId: IDEDiagnosticIds.ValidateFormatStringDiagnosticID,
diagnosticSeverity: DiagnosticSeverity.Warning,
diagnosticMessage: FeaturesResources.Format_string_contains_invalid_placeholder);
diagnosticMessage: AnalyzersResources.Format_string_contains_invalid_placeholder);
}
[Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)]
......@@ -618,7 +613,7 @@ static void Main(string[] args)
options: null,
diagnosticId: IDEDiagnosticIds.ValidateFormatStringDiagnosticID,
diagnosticSeverity: DiagnosticSeverity.Warning,
diagnosticMessage: FeaturesResources.Format_string_contains_invalid_placeholder);
diagnosticMessage: AnalyzersResources.Format_string_contains_invalid_placeholder);
}
[Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)]
......@@ -635,7 +630,7 @@ static void Main(string[] args)
options: null,
diagnosticId: IDEDiagnosticIds.ValidateFormatStringDiagnosticID,
diagnosticSeverity: DiagnosticSeverity.Warning,
diagnosticMessage: FeaturesResources.Format_string_contains_invalid_placeholder);
diagnosticMessage: AnalyzersResources.Format_string_contains_invalid_placeholder);
}
[Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)]
......@@ -652,7 +647,7 @@ static void Main(string[] args)
options: null,
diagnosticId: IDEDiagnosticIds.ValidateFormatStringDiagnosticID,
diagnosticSeverity: DiagnosticSeverity.Warning,
diagnosticMessage: FeaturesResources.Format_string_contains_invalid_placeholder);
diagnosticMessage: AnalyzersResources.Format_string_contains_invalid_placeholder);
}
[Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)]
......@@ -669,7 +664,7 @@ static void Main(string[] args)
options: null,
diagnosticId: IDEDiagnosticIds.ValidateFormatStringDiagnosticID,
diagnosticSeverity: DiagnosticSeverity.Warning,
diagnosticMessage: FeaturesResources.Format_string_contains_invalid_placeholder);
diagnosticMessage: AnalyzersResources.Format_string_contains_invalid_placeholder);
}
[Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)]
......@@ -687,7 +682,7 @@ static void Main(string[] args)
options: null,
diagnosticId: IDEDiagnosticIds.ValidateFormatStringDiagnosticID,
diagnosticSeverity: DiagnosticSeverity.Warning,
diagnosticMessage: FeaturesResources.Format_string_contains_invalid_placeholder);
diagnosticMessage: AnalyzersResources.Format_string_contains_invalid_placeholder);
}
[Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)]
......@@ -705,7 +700,7 @@ static void Main(string[] args)
options: null,
diagnosticId: IDEDiagnosticIds.ValidateFormatStringDiagnosticID,
diagnosticSeverity: DiagnosticSeverity.Warning,
diagnosticMessage: FeaturesResources.Format_string_contains_invalid_placeholder);
diagnosticMessage: AnalyzersResources.Format_string_contains_invalid_placeholder);
}
[Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)]
......@@ -721,7 +716,7 @@ static void Main(string[] args)
options: null,
diagnosticId: IDEDiagnosticIds.ValidateFormatStringDiagnosticID,
diagnosticSeverity: DiagnosticSeverity.Warning,
diagnosticMessage: FeaturesResources.Format_string_contains_invalid_placeholder);
diagnosticMessage: AnalyzersResources.Format_string_contains_invalid_placeholder);
}
[Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)]
......@@ -737,7 +732,7 @@ static void Main(string[] args)
options: null,
diagnosticId: IDEDiagnosticIds.ValidateFormatStringDiagnosticID,
diagnosticSeverity: DiagnosticSeverity.Warning,
diagnosticMessage: FeaturesResources.Format_string_contains_invalid_placeholder);
diagnosticMessage: AnalyzersResources.Format_string_contains_invalid_placeholder);
}
[Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)]
......@@ -753,7 +748,7 @@ static void Main(string[] args)
options: null,
diagnosticId: IDEDiagnosticIds.ValidateFormatStringDiagnosticID,
diagnosticSeverity: DiagnosticSeverity.Warning,
diagnosticMessage: FeaturesResources.Format_string_contains_invalid_placeholder);
diagnosticMessage: AnalyzersResources.Format_string_contains_invalid_placeholder);
}
[Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)]
......@@ -769,7 +764,7 @@ static void Main(string[] args)
options: null,
diagnosticId: IDEDiagnosticIds.ValidateFormatStringDiagnosticID,
diagnosticSeverity: DiagnosticSeverity.Warning,
diagnosticMessage: FeaturesResources.Format_string_contains_invalid_placeholder);
diagnosticMessage: AnalyzersResources.Format_string_contains_invalid_placeholder);
}
[Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)]
......@@ -786,7 +781,7 @@ static void Main(string[] args)
options: null,
diagnosticId: IDEDiagnosticIds.ValidateFormatStringDiagnosticID,
diagnosticSeverity: DiagnosticSeverity.Warning,
diagnosticMessage: FeaturesResources.Format_string_contains_invalid_placeholder);
diagnosticMessage: AnalyzersResources.Format_string_contains_invalid_placeholder);
}
[Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)]
......@@ -803,7 +798,7 @@ static void Main(string[] args)
options: null,
diagnosticId: IDEDiagnosticIds.ValidateFormatStringDiagnosticID,
diagnosticSeverity: DiagnosticSeverity.Warning,
diagnosticMessage: FeaturesResources.Format_string_contains_invalid_placeholder);
diagnosticMessage: AnalyzersResources.Format_string_contains_invalid_placeholder);
}
[Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)]
......@@ -820,7 +815,7 @@ static void Main(string[] args)
options: null,
diagnosticId: IDEDiagnosticIds.ValidateFormatStringDiagnosticID,
diagnosticSeverity: DiagnosticSeverity.Warning,
diagnosticMessage: FeaturesResources.Format_string_contains_invalid_placeholder);
diagnosticMessage: AnalyzersResources.Format_string_contains_invalid_placeholder);
}
[Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)]
......@@ -846,7 +841,7 @@ static void Main(string[] args)
options: null,
diagnosticId: IDEDiagnosticIds.ValidateFormatStringDiagnosticID,
diagnosticSeverity: DiagnosticSeverity.Warning,
diagnosticMessage: FeaturesResources.Format_string_contains_invalid_placeholder);
diagnosticMessage: AnalyzersResources.Format_string_contains_invalid_placeholder);
}
[Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)]
......@@ -863,7 +858,7 @@ static void Main(string[] args)
options: null,
diagnosticId: IDEDiagnosticIds.ValidateFormatStringDiagnosticID,
diagnosticSeverity: DiagnosticSeverity.Warning,
diagnosticMessage: FeaturesResources.Format_string_contains_invalid_placeholder);
diagnosticMessage: AnalyzersResources.Format_string_contains_invalid_placeholder);
}
[Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)]
......@@ -880,7 +875,7 @@ static void Main(string[] args)
options: null,
diagnosticId: IDEDiagnosticIds.ValidateFormatStringDiagnosticID,
diagnosticSeverity: DiagnosticSeverity.Warning,
diagnosticMessage: FeaturesResources.Format_string_contains_invalid_placeholder);
diagnosticMessage: AnalyzersResources.Format_string_contains_invalid_placeholder);
}
[Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)]
......@@ -897,7 +892,7 @@ static void Main(string[] args)
options: null,
diagnosticId: IDEDiagnosticIds.ValidateFormatStringDiagnosticID,
diagnosticSeverity: DiagnosticSeverity.Warning,
diagnosticMessage: FeaturesResources.Format_string_contains_invalid_placeholder);
diagnosticMessage: AnalyzersResources.Format_string_contains_invalid_placeholder);
}
[Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)]
......@@ -914,7 +909,7 @@ static void Main(string[] args)
options: null,
diagnosticId: IDEDiagnosticIds.ValidateFormatStringDiagnosticID,
diagnosticSeverity: DiagnosticSeverity.Warning,
diagnosticMessage: FeaturesResources.Format_string_contains_invalid_placeholder);
diagnosticMessage: AnalyzersResources.Format_string_contains_invalid_placeholder);
}
[Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)]
......@@ -931,7 +926,7 @@ static void Main(string[] args)
options: null,
diagnosticId: IDEDiagnosticIds.ValidateFormatStringDiagnosticID,
diagnosticSeverity: DiagnosticSeverity.Warning,
diagnosticMessage: FeaturesResources.Format_string_contains_invalid_placeholder);
diagnosticMessage: AnalyzersResources.Format_string_contains_invalid_placeholder);
}
[Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)]
......@@ -948,7 +943,7 @@ static void Main(string[] args)
options: null,
diagnosticId: IDEDiagnosticIds.ValidateFormatStringDiagnosticID,
diagnosticSeverity: DiagnosticSeverity.Warning,
diagnosticMessage: FeaturesResources.Format_string_contains_invalid_placeholder);
diagnosticMessage: AnalyzersResources.Format_string_contains_invalid_placeholder);
}
[Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)]
......@@ -965,7 +960,7 @@ static void Main(string[] args)
options: null,
diagnosticId: IDEDiagnosticIds.ValidateFormatStringDiagnosticID,
diagnosticSeverity: DiagnosticSeverity.Warning,
diagnosticMessage: FeaturesResources.Format_string_contains_invalid_placeholder);
diagnosticMessage: AnalyzersResources.Format_string_contains_invalid_placeholder);
}
[WorkItem(29398, "https://github.com/dotnet/roslyn/issues/29398")]
......
......@@ -61,6 +61,8 @@
<Compile Include="$(MSBuildThisFileDirectory)UseObjectInitializer\AbstractUseObjectInitializerDiagnosticAnalyzer.cs" />
<Compile Include="$(MSBuildThisFileDirectory)UseObjectInitializer\ObjectCreationExpressionAnalyzer.cs" />
<Compile Include="$(MSBuildThisFileDirectory)UseThrowExpression\AbstractUseThrowExpressionDiagnosticAnalyzer.cs" />
<Compile Include="$(MSBuildThisFileDirectory)ValidateFormatString\AbstractValidateFormatStringDiagnosticAnalyzer.cs" />
<Compile Include="$(MSBuildThisFileDirectory)ValidateFormatString\ValidateFormatStringOption.cs" />
</ItemGroup>
<ItemGroup Condition="'$(DefaultLanguageSourceExtension)' != '' AND '$(BuildingInsideVisualStudio)' != 'true'">
<ExpectedCompile Include="$(MSBuildThisFileDirectory)**\*$(DefaultLanguageSourceExtension)" />
......
......@@ -256,4 +256,10 @@
<data name="Use_null_propagation" xml:space="preserve">
<value>Use null propagation</value>
</data>
<data name="Format_string_contains_invalid_placeholder" xml:space="preserve">
<value>Format string contains invalid placeholder</value>
</data>
<data name="Invalid_format_string" xml:space="preserve">
<value>Invalid format string</value>
</data>
</root>
\ No newline at end of file
......@@ -19,19 +19,19 @@ internal abstract class AbstractValidateFormatStringDiagnosticAnalyzer<TSyntaxKi
private const string DiagnosticID = IDEDiagnosticIds.ValidateFormatStringDiagnosticID;
private static readonly LocalizableString Title = new LocalizableResourceString(
nameof(FeaturesResources.Invalid_format_string),
FeaturesResources.ResourceManager,
typeof(FeaturesResources));
nameof(AnalyzersResources.Invalid_format_string),
AnalyzersResources.ResourceManager,
typeof(AnalyzersResources));
private static readonly LocalizableString MessageFormat = new LocalizableResourceString(
nameof(FeaturesResources.Format_string_contains_invalid_placeholder),
FeaturesResources.ResourceManager,
typeof(FeaturesResources));
nameof(AnalyzersResources.Format_string_contains_invalid_placeholder),
AnalyzersResources.ResourceManager,
typeof(AnalyzersResources));
private static readonly LocalizableString Description = new LocalizableResourceString(
nameof(FeaturesResources.Invalid_format_string),
FeaturesResources.ResourceManager,
typeof(FeaturesResources));
nameof(AnalyzersResources.Invalid_format_string),
AnalyzersResources.ResourceManager,
typeof(AnalyzersResources));
private static readonly DiagnosticDescriptor Rule = new DiagnosticDescriptor(
DiagnosticID,
......
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
#nullable enable
using Microsoft.CodeAnalysis.Options;
namespace Microsoft.CodeAnalysis.ValidateFormatString
{
internal class ValidateFormatStringOption
{
public static PerLanguageOption2<bool> ReportInvalidPlaceholdersInStringDotFormatCalls =
new PerLanguageOption2<bool>(
nameof(ValidateFormatStringOption),
nameof(ReportInvalidPlaceholdersInStringDotFormatCalls),
defaultValue: true,
storageLocations: new RoamingProfileStorageLocation("TextEditor.%LANGUAGE%.Specific.WarnOnInvalidStringDotFormatCalls"));
}
}
......@@ -62,6 +62,16 @@
<target state="new">Collection initialization can be simplified</target>
<note />
</trans-unit>
<trans-unit id="Format_string_contains_invalid_placeholder">
<source>Format string contains invalid placeholder</source>
<target state="new">Format string contains invalid placeholder</target>
<note />
</trans-unit>
<trans-unit id="Invalid_format_string">
<source>Invalid format string</source>
<target state="new">Invalid format string</target>
<note />
</trans-unit>
<trans-unit id="Make_field_readonly">
<source>Make field readonly</source>
<target state="new">Make field readonly</target>
......
......@@ -62,6 +62,16 @@
<target state="new">Collection initialization can be simplified</target>
<note />
</trans-unit>
<trans-unit id="Format_string_contains_invalid_placeholder">
<source>Format string contains invalid placeholder</source>
<target state="new">Format string contains invalid placeholder</target>
<note />
</trans-unit>
<trans-unit id="Invalid_format_string">
<source>Invalid format string</source>
<target state="new">Invalid format string</target>
<note />
</trans-unit>
<trans-unit id="Make_field_readonly">
<source>Make field readonly</source>
<target state="new">Make field readonly</target>
......
......@@ -62,6 +62,16 @@
<target state="new">Collection initialization can be simplified</target>
<note />
</trans-unit>
<trans-unit id="Format_string_contains_invalid_placeholder">
<source>Format string contains invalid placeholder</source>
<target state="new">Format string contains invalid placeholder</target>
<note />
</trans-unit>
<trans-unit id="Invalid_format_string">
<source>Invalid format string</source>
<target state="new">Invalid format string</target>
<note />
</trans-unit>
<trans-unit id="Make_field_readonly">
<source>Make field readonly</source>
<target state="new">Make field readonly</target>
......
......@@ -62,6 +62,16 @@
<target state="new">Collection initialization can be simplified</target>
<note />
</trans-unit>
<trans-unit id="Format_string_contains_invalid_placeholder">
<source>Format string contains invalid placeholder</source>
<target state="new">Format string contains invalid placeholder</target>
<note />
</trans-unit>
<trans-unit id="Invalid_format_string">
<source>Invalid format string</source>
<target state="new">Invalid format string</target>
<note />
</trans-unit>
<trans-unit id="Make_field_readonly">
<source>Make field readonly</source>
<target state="new">Make field readonly</target>
......
......@@ -62,6 +62,16 @@
<target state="new">Collection initialization can be simplified</target>
<note />
</trans-unit>
<trans-unit id="Format_string_contains_invalid_placeholder">
<source>Format string contains invalid placeholder</source>
<target state="new">Format string contains invalid placeholder</target>
<note />
</trans-unit>
<trans-unit id="Invalid_format_string">
<source>Invalid format string</source>
<target state="new">Invalid format string</target>
<note />
</trans-unit>
<trans-unit id="Make_field_readonly">
<source>Make field readonly</source>
<target state="new">Make field readonly</target>
......
......@@ -62,6 +62,16 @@
<target state="new">Collection initialization can be simplified</target>
<note />
</trans-unit>
<trans-unit id="Format_string_contains_invalid_placeholder">
<source>Format string contains invalid placeholder</source>
<target state="new">Format string contains invalid placeholder</target>
<note />
</trans-unit>
<trans-unit id="Invalid_format_string">
<source>Invalid format string</source>
<target state="new">Invalid format string</target>
<note />
</trans-unit>
<trans-unit id="Make_field_readonly">
<source>Make field readonly</source>
<target state="new">Make field readonly</target>
......
......@@ -62,6 +62,16 @@
<target state="new">Collection initialization can be simplified</target>
<note />
</trans-unit>
<trans-unit id="Format_string_contains_invalid_placeholder">
<source>Format string contains invalid placeholder</source>
<target state="new">Format string contains invalid placeholder</target>
<note />
</trans-unit>
<trans-unit id="Invalid_format_string">
<source>Invalid format string</source>
<target state="new">Invalid format string</target>
<note />
</trans-unit>
<trans-unit id="Make_field_readonly">
<source>Make field readonly</source>
<target state="new">Make field readonly</target>
......
......@@ -62,6 +62,16 @@
<target state="new">Collection initialization can be simplified</target>
<note />
</trans-unit>
<trans-unit id="Format_string_contains_invalid_placeholder">
<source>Format string contains invalid placeholder</source>
<target state="new">Format string contains invalid placeholder</target>
<note />
</trans-unit>
<trans-unit id="Invalid_format_string">
<source>Invalid format string</source>
<target state="new">Invalid format string</target>
<note />
</trans-unit>
<trans-unit id="Make_field_readonly">
<source>Make field readonly</source>
<target state="new">Make field readonly</target>
......
......@@ -62,6 +62,16 @@
<target state="new">Collection initialization can be simplified</target>
<note />
</trans-unit>
<trans-unit id="Format_string_contains_invalid_placeholder">
<source>Format string contains invalid placeholder</source>
<target state="new">Format string contains invalid placeholder</target>
<note />
</trans-unit>
<trans-unit id="Invalid_format_string">
<source>Invalid format string</source>
<target state="new">Invalid format string</target>
<note />
</trans-unit>
<trans-unit id="Make_field_readonly">
<source>Make field readonly</source>
<target state="new">Make field readonly</target>
......
......@@ -62,6 +62,16 @@
<target state="new">Collection initialization can be simplified</target>
<note />
</trans-unit>
<trans-unit id="Format_string_contains_invalid_placeholder">
<source>Format string contains invalid placeholder</source>
<target state="new">Format string contains invalid placeholder</target>
<note />
</trans-unit>
<trans-unit id="Invalid_format_string">
<source>Invalid format string</source>
<target state="new">Invalid format string</target>
<note />
</trans-unit>
<trans-unit id="Make_field_readonly">
<source>Make field readonly</source>
<target state="new">Make field readonly</target>
......
......@@ -62,6 +62,16 @@
<target state="new">Collection initialization can be simplified</target>
<note />
</trans-unit>
<trans-unit id="Format_string_contains_invalid_placeholder">
<source>Format string contains invalid placeholder</source>
<target state="new">Format string contains invalid placeholder</target>
<note />
</trans-unit>
<trans-unit id="Invalid_format_string">
<source>Invalid format string</source>
<target state="new">Invalid format string</target>
<note />
</trans-unit>
<trans-unit id="Make_field_readonly">
<source>Make field readonly</source>
<target state="new">Make field readonly</target>
......
......@@ -62,6 +62,16 @@
<target state="new">Collection initialization can be simplified</target>
<note />
</trans-unit>
<trans-unit id="Format_string_contains_invalid_placeholder">
<source>Format string contains invalid placeholder</source>
<target state="new">Format string contains invalid placeholder</target>
<note />
</trans-unit>
<trans-unit id="Invalid_format_string">
<source>Invalid format string</source>
<target state="new">Invalid format string</target>
<note />
</trans-unit>
<trans-unit id="Make_field_readonly">
<source>Make field readonly</source>
<target state="new">Make field readonly</target>
......
......@@ -62,6 +62,16 @@
<target state="new">Collection initialization can be simplified</target>
<note />
</trans-unit>
<trans-unit id="Format_string_contains_invalid_placeholder">
<source>Format string contains invalid placeholder</source>
<target state="new">Format string contains invalid placeholder</target>
<note />
</trans-unit>
<trans-unit id="Invalid_format_string">
<source>Invalid format string</source>
<target state="new">Invalid format string</target>
<note />
</trans-unit>
<trans-unit id="Make_field_readonly">
<source>Make field readonly</source>
<target state="new">Make field readonly</target>
......
......@@ -33,6 +33,7 @@
<Compile Include="$(MSBuildThisFileDirectory)UseIsNullCheck\VisualBasicUseIsNullCheckForReferenceEqualsDiagnosticAnalyzer.vb" />
<Compile Include="$(MSBuildThisFileDirectory)UseNullPropagation\VisualBasicUseNullPropagationDiagnosticAnalyzer.vb" />
<Compile Include="$(MSBuildThisFileDirectory)UseObjectInitializer\VisualBasicUseObjectInitializerDiagnosticAnalyzer.vb" />
<Compile Include="$(MSBuildThisFileDirectory)ValidateFormatString\VisualBasicValidateFormatStringDiagnosticAnalyzer.vb" />
</ItemGroup>
<ItemGroup Condition="'$(DefaultLanguageSourceExtension)' != '' AND '$(BuildingInsideVisualStudio)' != 'true'">
<ExpectedCompile Include="$(MSBuildThisFileDirectory)**\*$(DefaultLanguageSourceExtension)" />
......
......@@ -4,6 +4,7 @@
Imports Microsoft.CodeAnalysis.CodeFixes
Imports Microsoft.CodeAnalysis.Diagnostics
Imports Microsoft.CodeAnalysis.Editor.UnitTests.CodeActions
Imports Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.Diagnostics
Imports Microsoft.CodeAnalysis.Options
Imports Microsoft.CodeAnalysis.ValidateFormatString
......@@ -18,24 +19,16 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.ValidateFormatStri
Return (New VisualBasicValidateFormatStringDiagnosticAnalyzer, Nothing)
End Function
Private Function VBOptionOnCSharpOptionOff() As IDictionary(Of OptionKey2, Object)
Dim optionsSet = New Dictionary(Of OptionKey2, Object) From
{
{New OptionKey2(ValidateFormatStringOption.ReportInvalidPlaceholdersInStringDotFormatCalls, LanguageNames.CSharp), False},
{New OptionKey2(ValidateFormatStringOption.ReportInvalidPlaceholdersInStringDotFormatCalls, LanguageNames.VisualBasic), True}
}
Return optionsSet
Private Function VBOptionOnCSharpOptionOff() As IOptionsCollection
Return OptionsSet(
(New OptionKey2(ValidateFormatStringOption.ReportInvalidPlaceholdersInStringDotFormatCalls, LanguageNames.CSharp), False),
(New OptionKey2(ValidateFormatStringOption.ReportInvalidPlaceholdersInStringDotFormatCalls, LanguageNames.VisualBasic), True))
End Function
Private Function VBOptionOffCSharpOptionOn() As IDictionary(Of OptionKey2, Object)
Dim optionsSet = New Dictionary(Of OptionKey2, Object) From
{
{New OptionKey2(ValidateFormatStringOption.ReportInvalidPlaceholdersInStringDotFormatCalls, LanguageNames.CSharp), True},
{New OptionKey2(ValidateFormatStringOption.ReportInvalidPlaceholdersInStringDotFormatCalls, LanguageNames.VisualBasic), False}
}
Return optionsSet
Private Function VBOptionOffCSharpOptionOn() As IOptionsCollection
Return OptionsSet(
(New OptionKey2(ValidateFormatStringOption.ReportInvalidPlaceholdersInStringDotFormatCalls, LanguageNames.CSharp), True),
(New OptionKey2(ValidateFormatStringOption.ReportInvalidPlaceholdersInStringDotFormatCalls, LanguageNames.VisualBasic), False))
End Function
<Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)>
......@@ -81,7 +74,7 @@ End Class",
options:=Nothing,
diagnosticId:=IDEDiagnosticIds.ValidateFormatStringDiagnosticID,
diagnosticSeverity:=DiagnosticSeverity.Warning,
diagnosticMessage:=FeaturesResources.Format_string_contains_invalid_placeholder)
diagnosticMessage:=AnalyzersResources.Format_string_contains_invalid_placeholder)
End Function
<Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)>
......@@ -95,7 +88,7 @@ End Class",
options:=Nothing,
diagnosticId:=IDEDiagnosticIds.ValidateFormatStringDiagnosticID,
diagnosticSeverity:=DiagnosticSeverity.Warning,
diagnosticMessage:=FeaturesResources.Format_string_contains_invalid_placeholder)
diagnosticMessage:=AnalyzersResources.Format_string_contains_invalid_placeholder)
End Function
<Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)>
......@@ -111,7 +104,7 @@ End Class",
options:=Nothing,
diagnosticId:=IDEDiagnosticIds.ValidateFormatStringDiagnosticID,
diagnosticSeverity:=DiagnosticSeverity.Warning,
diagnosticMessage:=FeaturesResources.Format_string_contains_invalid_placeholder)
diagnosticMessage:=AnalyzersResources.Format_string_contains_invalid_placeholder)
End Function
<Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)>
......@@ -135,7 +128,7 @@ End Class",
options:=Nothing,
diagnosticId:=IDEDiagnosticIds.ValidateFormatStringDiagnosticID,
diagnosticSeverity:=DiagnosticSeverity.Warning,
diagnosticMessage:=FeaturesResources.Format_string_contains_invalid_placeholder)
diagnosticMessage:=AnalyzersResources.Format_string_contains_invalid_placeholder)
End Function
<Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)>
......@@ -291,28 +284,33 @@ End Class")
End Module")
End Function
<Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)>
Public Async Function WarningTurnedOff() As Task
Await TestDiagnosticMissingAsync("
Class C
Sub Main
string.Format(""This {0} {1} {[||]2} works"", New Object { ""test"", ""test2"", ""test3"" })
End Sub
End Class", New TestParameters(options:=VBOptionOffCSharpOptionOn))
End Function
<Fact, Trait(Traits.Feature, Traits.Features.ValidateFormatString)>
Public Async Function WarningTurnedOn() As Task
Await TestDiagnosticInfoAsync("
#If CODE_STYLE Then
<InlineData(False, True)> ' Option has no effect on CodeStyle layer CI execution as it is not an editorconfig option.
<InlineData(True, True)>
<Theory, Trait(Traits.Feature, Traits.Features.ValidateFormatString)>
Public Async Function TestOption(optionOn As Boolean, expectDiagnostic As Boolean) As Task
#Else
<InlineData(False, False)>
<InlineData(True, True)>
<Theory, Trait(Traits.Feature, Traits.Features.ValidateFormatString)>
Public Async Function TestOption(optionOn As Boolean, expectDiagnostic As Boolean) As Task
#End If
Dim source = "
Class C
Sub Main
string.Format(""This {0} [|{2}|] works"", ""test"", ""also"")
End Sub
End Class",
options:=VBOptionOnCSharpOptionOff,
diagnosticId:=IDEDiagnosticIds.ValidateFormatStringDiagnosticID,
diagnosticSeverity:=DiagnosticSeverity.Warning,
diagnosticMessage:=FeaturesResources.Format_string_contains_invalid_placeholder)
End Class"
Dim options = If(optionOn, VBOptionOnCSharpOptionOff(), VBOptionOffCSharpOptionOn())
If Not expectDiagnostic Then
Await TestDiagnosticMissingAsync(source, New TestParameters(options:=options))
Else
Await TestDiagnosticInfoAsync(source,
options,
diagnosticId:=IDEDiagnosticIds.ValidateFormatStringDiagnosticID,
diagnosticSeverity:=DiagnosticSeverity.Warning,
diagnosticMessage:=AnalyzersResources.Format_string_contains_invalid_placeholder)
End If
End Function
End Class
End Namespace
......@@ -36,6 +36,7 @@
<Compile Include="$(MSBuildThisFileDirectory)UseExplicitTupleName\UseExplicitTupleNameTests.vb" />
<Compile Include="$(MSBuildThisFileDirectory)UseNullPropagation\UseNullPropagationTests.vb" />
<Compile Include="$(MSBuildThisFileDirectory)UseObjectInitializer\UseObjectInitializerTests.vb" />
<Compile Include="$(MSBuildThisFileDirectory)ValidateFormatString\ValidateFormatStringTests.vb" />
</ItemGroup>
<ItemGroup Condition="'$(DefaultLanguageSourceExtension)' != '' AND '$(BuildingInsideVisualStudio)' != 'true'">
<ExpectedCompile Include="$(MSBuildThisFileDirectory)**\*$(DefaultLanguageSourceExtension)" />
......
......@@ -1126,12 +1126,6 @@ This version used in: {2}</value>
<data name="Implement_0" xml:space="preserve">
<value>Implement {0}</value>
</data>
<data name="Format_string_contains_invalid_placeholder" xml:space="preserve">
<value>Format string contains invalid placeholder</value>
</data>
<data name="Invalid_format_string" xml:space="preserve">
<value>Invalid format string</value>
</data>
<data name="Use_inferred_member_name" xml:space="preserve">
<value>Use inferred member name</value>
</data>
......
......@@ -13,16 +13,6 @@
namespace Microsoft.CodeAnalysis.ValidateFormatString
{
internal class ValidateFormatStringOption
{
public static PerLanguageOption2<bool> ReportInvalidPlaceholdersInStringDotFormatCalls =
new PerLanguageOption2<bool>(
nameof(ValidateFormatStringOption),
nameof(ReportInvalidPlaceholdersInStringDotFormatCalls),
defaultValue: true,
storageLocations: new RoamingProfileStorageLocation("TextEditor.%LANGUAGE%.Specific.WarnOnInvalidStringDotFormatCalls"));
}
[ExportOptionProvider, Shared]
internal class ValidateFormatStringOptionProvider : IOptionProvider
{
......
......@@ -2230,16 +2230,6 @@ Tato verze se používá zde: {2}.</target>
<target state="translated">Implementovat {0}</target>
<note />
</trans-unit>
<trans-unit id="Format_string_contains_invalid_placeholder">
<source>Format string contains invalid placeholder</source>
<target state="translated">Formátovací řetězec obsahuje neplatný zástupný symbol.</target>
<note />
</trans-unit>
<trans-unit id="Invalid_format_string">
<source>Invalid format string</source>
<target state="translated">Neplatný formátovací řetězec</target>
<note />
</trans-unit>
<trans-unit id="Use_inferred_member_name">
<source>Use inferred member name</source>
<target state="translated">Použít odvozený název člena</target>
......
......@@ -2230,16 +2230,6 @@ Diese Version wird verwendet in: {2}</target>
<target state="translated">{0} implementieren</target>
<note />
</trans-unit>
<trans-unit id="Format_string_contains_invalid_placeholder">
<source>Format string contains invalid placeholder</source>
<target state="translated">Die Formatzeichenfolge enthält einen ungültigen Platzhalter.</target>
<note />
</trans-unit>
<trans-unit id="Invalid_format_string">
<source>Invalid format string</source>
<target state="translated">Ungültige Formatzeichenfolge</target>
<note />
</trans-unit>
<trans-unit id="Use_inferred_member_name">
<source>Use inferred member name</source>
<target state="translated">Abgeleiteten Membernamen verwenden</target>
......
......@@ -2230,16 +2230,6 @@ Esta versión se utiliza en: {2}</target>
<target state="translated">Implementar {0}</target>
<note />
</trans-unit>
<trans-unit id="Format_string_contains_invalid_placeholder">
<source>Format string contains invalid placeholder</source>
<target state="translated">La cadena de formato contiene un marcador de posición no válido.</target>
<note />
</trans-unit>
<trans-unit id="Invalid_format_string">
<source>Invalid format string</source>
<target state="translated">Cadena de formato no válida</target>
<note />
</trans-unit>
<trans-unit id="Use_inferred_member_name">
<source>Use inferred member name</source>
<target state="translated">Usar nombre de miembro inferido</target>
......
......@@ -2230,16 +2230,6 @@ Version utilisée dans : {2}</target>
<target state="translated">Implémenter {0}</target>
<note />
</trans-unit>
<trans-unit id="Format_string_contains_invalid_placeholder">
<source>Format string contains invalid placeholder</source>
<target state="translated">La chaîne de format contient un espace réservé non valide</target>
<note />
</trans-unit>
<trans-unit id="Invalid_format_string">
<source>Invalid format string</source>
<target state="translated">Chaîne de format non valide</target>
<note />
</trans-unit>
<trans-unit id="Use_inferred_member_name">
<source>Use inferred member name</source>
<target state="translated">Utiliser un nom de membre déduit</target>
......
......@@ -2230,16 +2230,6 @@ Questa versione è usata {2}</target>
<target state="translated">Implementa {0}</target>
<note />
</trans-unit>
<trans-unit id="Format_string_contains_invalid_placeholder">
<source>Format string contains invalid placeholder</source>
<target state="translated">La stringa di formato contiene un segnaposto non valido</target>
<note />
</trans-unit>
<trans-unit id="Invalid_format_string">
<source>Invalid format string</source>
<target state="translated">Stringa di formato non valida</target>
<note />
</trans-unit>
<trans-unit id="Use_inferred_member_name">
<source>Use inferred member name</source>
<target state="translated">Usa il nome di membro dedotto</target>
......
......@@ -2230,16 +2230,6 @@ This version used in: {2}</source>
<target state="translated">{0} を実装する</target>
<note />
</trans-unit>
<trans-unit id="Format_string_contains_invalid_placeholder">
<source>Format string contains invalid placeholder</source>
<target state="translated">書式設定文字列に無効なプレース ホルダーが含まれています</target>
<note />
</trans-unit>
<trans-unit id="Invalid_format_string">
<source>Invalid format string</source>
<target state="translated">無効な書式設定文字列</target>
<note />
</trans-unit>
<trans-unit id="Use_inferred_member_name">
<source>Use inferred member name</source>
<target state="translated">推定メンバーの名前を使用します</target>
......
......@@ -2230,16 +2230,6 @@ This version used in: {2}</source>
<target state="translated">{0} 구현</target>
<note />
</trans-unit>
<trans-unit id="Format_string_contains_invalid_placeholder">
<source>Format string contains invalid placeholder</source>
<target state="translated">형식 문자열에 잘못된 자리 표시자가 포함되어 있습니다.</target>
<note />
</trans-unit>
<trans-unit id="Invalid_format_string">
<source>Invalid format string</source>
<target state="translated">잘못된 형식 문자열</target>
<note />
</trans-unit>
<trans-unit id="Use_inferred_member_name">
<source>Use inferred member name</source>
<target state="translated">유추 멤버 이름 사용</target>
......
......@@ -2230,16 +2230,6 @@ Ta wersja jest używana wersja: {2}</target>
<target state="translated">Implementuj {0}</target>
<note />
</trans-unit>
<trans-unit id="Format_string_contains_invalid_placeholder">
<source>Format string contains invalid placeholder</source>
<target state="translated">Ciąg formatu zawiera nieprawidłowy symbol zastępczy</target>
<note />
</trans-unit>
<trans-unit id="Invalid_format_string">
<source>Invalid format string</source>
<target state="translated">Nieprawidłowy ciąg formatu</target>
<note />
</trans-unit>
<trans-unit id="Use_inferred_member_name">
<source>Use inferred member name</source>
<target state="translated">Użyj nazwy wywnioskowanego elementu członkowskiego</target>
......
......@@ -2230,16 +2230,6 @@ Essa versão é usada no: {2}</target>
<target state="translated">Implementar {0}</target>
<note />
</trans-unit>
<trans-unit id="Format_string_contains_invalid_placeholder">
<source>Format string contains invalid placeholder</source>
<target state="translated">A cadeia de formato contém espaço reservado inválido</target>
<note />
</trans-unit>
<trans-unit id="Invalid_format_string">
<source>Invalid format string</source>
<target state="translated">Cadeia de formato inválida</target>
<note />
</trans-unit>
<trans-unit id="Use_inferred_member_name">
<source>Use inferred member name</source>
<target state="translated">Usar o nome do membro inferido</target>
......
......@@ -2230,16 +2230,6 @@ This version used in: {2}</source>
<target state="translated">Реализация {0}</target>
<note />
</trans-unit>
<trans-unit id="Format_string_contains_invalid_placeholder">
<source>Format string contains invalid placeholder</source>
<target state="translated">Строка формата содержит недопустимый заполнитель</target>
<note />
</trans-unit>
<trans-unit id="Invalid_format_string">
<source>Invalid format string</source>
<target state="translated">Недопустимая строка формата</target>
<note />
</trans-unit>
<trans-unit id="Use_inferred_member_name">
<source>Use inferred member name</source>
<target state="translated">Использовать имя выводимого элемента</target>
......
......@@ -2230,16 +2230,6 @@ Bu sürüm şurada kullanılır: {2}</target>
<target state="translated">{0} uygula</target>
<note />
</trans-unit>
<trans-unit id="Format_string_contains_invalid_placeholder">
<source>Format string contains invalid placeholder</source>
<target state="translated">Biçim dizesi, geçersiz yer tutucu içeriyor</target>
<note />
</trans-unit>
<trans-unit id="Invalid_format_string">
<source>Invalid format string</source>
<target state="translated">Geçersiz biçim dizesi</target>
<note />
</trans-unit>
<trans-unit id="Use_inferred_member_name">
<source>Use inferred member name</source>
<target state="translated">Gösterilen üye adı kullan</target>
......
......@@ -2230,16 +2230,6 @@ This version used in: {2}</source>
<target state="translated">实现 {0}</target>
<note />
</trans-unit>
<trans-unit id="Format_string_contains_invalid_placeholder">
<source>Format string contains invalid placeholder</source>
<target state="translated">格式字符串包含无效的占位符</target>
<note />
</trans-unit>
<trans-unit id="Invalid_format_string">
<source>Invalid format string</source>
<target state="translated">无效的格式字符串</target>
<note />
</trans-unit>
<trans-unit id="Use_inferred_member_name">
<source>Use inferred member name</source>
<target state="translated">使用推断的成员名称</target>
......
......@@ -2230,16 +2230,6 @@ This version used in: {2}</source>
<target state="translated">實作 {0}</target>
<note />
</trans-unit>
<trans-unit id="Format_string_contains_invalid_placeholder">
<source>Format string contains invalid placeholder</source>
<target state="translated">格式字串包含無效的預留位置</target>
<note />
</trans-unit>
<trans-unit id="Invalid_format_string">
<source>Invalid format string</source>
<target state="translated">格式字串無效</target>
<note />
</trans-unit>
<trans-unit id="Use_inferred_member_name">
<source>Use inferred member name</source>
<target state="translated">使用推斷的成員名稱</target>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册