未验证 提交 f3b26e23 编写于 作者: C Chris Sienkiewicz 提交者: GitHub

Issue a warning when a global analyzer config contains an invalid section name. (#47728)

* Issue a warning when a global analyzer config contains an invalid section name.
上级 55bc9ff2
......@@ -12676,12 +12676,12 @@ class C
analyzerConfig = analyzerConfigFile.WriteAllText(@"
is_global = true
[file.cs]
[/file.cs]
option1 = abc");
analyzerConfig2 = analyzerConfigFile2.WriteAllText(@"
is_global = true
[file.cs]
[/file.cs]
option1 = def");
output = VerifyOutput(dir, src, additionalFlags: new[] { "/analyzerconfig:" + analyzerConfig.Path + "," + analyzerConfig2.Path }, expectedWarningCount: 1, includeCurrentAssemblyAsAnalyzerReference: false);
......@@ -12689,7 +12689,7 @@ class C
// warning MultipleGlobalAnalyzerKeys: Multiple global analyzer config files set the same key 'option1' in section 'file.cs'. It has been unset. Key was set by the following files: ...
Assert.Contains("MultipleGlobalAnalyzerKeys:", output, StringComparison.Ordinal);
Assert.Contains("'option1'", output, StringComparison.Ordinal);
Assert.Contains("'file.cs'", output, StringComparison.Ordinal);
Assert.Contains("'/file.cs'", output, StringComparison.Ordinal);
}
[Fact]
......
......@@ -1552,20 +1552,20 @@ public void FilterCombinesSections()
configs.Add(Parse(@"is_global = true
option1 = value1
[c:/path/to/file1.cs]
[/path/to/file1.cs]
option1 = value1
[c:/path/to/file2.cs]
[/path/to/file2.cs]
option1 = value1
", "/.globalconfig1"));
configs.Add(Parse(@"is_global = true
option2 = value2
[c:/path/to/file1.cs]
[/path/to/file1.cs]
option2 = value2
[c:/path/to/file3.cs]
[/path/to/file3.cs]
option1 = value1",
"/.globalconfig2"));
......@@ -1581,16 +1581,16 @@ public void FilterCombinesSections()
var file2Section = globalConfig.NamedSections[1];
var file3Section = globalConfig.NamedSections[2];
Assert.Equal(@"c:/path/to/file1.cs", file1Section.Name);
Assert.Equal(@"/path/to/file1.cs", file1Section.Name);
Assert.Equal(2, file1Section.Properties.Count);
Assert.Equal("value1", file1Section.Properties["option1"]);
Assert.Equal("value2", file1Section.Properties["option2"]);
Assert.Equal(@"c:/path/to/file2.cs", file2Section.Name);
Assert.Equal(@"/path/to/file2.cs", file2Section.Name);
Assert.Equal(1, file2Section.Properties.Count);
Assert.Equal("value1", file2Section.Properties["option1"]);
Assert.Equal(@"c:/path/to/file3.cs", file3Section.Name);
Assert.Equal(@"/path/to/file3.cs", file3Section.Name);
Assert.Equal(1, file3Section.Properties.Count);
Assert.Equal("value1", file3Section.Properties["option1"]);
configs.Free();
......@@ -1618,19 +1618,19 @@ public void DuplicateOptionsInGlobalConfigsSectionsAreUnset()
{
var configs = ArrayBuilder<AnalyzerConfig>.GetInstance();
configs.Add(Parse(@"is_global = true
[c:/path/to/file1.cs]
[/path/to/file1.cs]
option1 = value1
", "/.globalconfig1"));
configs.Add(Parse(@"is_global = true
[c:/path/to/file1.cs]
[/path/to/file1.cs]
option1 = value2",
"/.globalconfig2"));
var globalConfig = AnalyzerConfigSet.MergeGlobalConfigs(configs, out var diagnostics);
diagnostics.Verify(
Diagnostic("MultipleGlobalAnalyzerKeys").WithArguments("option1", "c:/path/to/file1.cs", "/.globalconfig1, /.globalconfig2").WithLocation(1, 1)
Diagnostic("MultipleGlobalAnalyzerKeys").WithArguments("option1", "/path/to/file1.cs", "/.globalconfig1, /.globalconfig2").WithLocation(1, 1)
);
}
......@@ -1653,12 +1653,12 @@ public void DuplicateSectionOptionsInNonGlobalConfigsAreKept()
{
var configs = ArrayBuilder<AnalyzerConfig>.GetInstance();
configs.Add(Parse(@"is_global = true
[c:/path/to/file1.cs]
[/path/to/file1.cs]
option1 = value1
", "/.globalconfig1"));
configs.Add(Parse(@"
[c:/path/to/file1.cs]
[/path/to/file1.cs]
option1 = value2",
"/.globalconfig2"));
......@@ -1675,14 +1675,13 @@ public void GlobalConfigsPropertiesAreGlobal()
", "/.globalconfig1"));
var options = GetAnalyzerConfigOptions(
new[] { "/file1.cs", "/path/to/file1.cs", "c:/path/to/file1.cs", "/file1.vb" },
new[] { "/file1.cs", "/path/to/file1.cs", "/file1.vb" },
configs);
configs.Free();
VerifyAnalyzerOptions(
new[]
{
new[] { ("option1", "value1") },
new[] { ("option1", "value1") },
new[] { ("option1", "value1") },
new[] { ("option1", "value1") }
......@@ -1695,7 +1694,7 @@ public void GlobalConfigsSectionsMustBeFullPath()
{
var configs = ArrayBuilder<AnalyzerConfig>.GetInstance();
configs.Add(Parse(@"is_global = true
[c:/path/to/file1.cs]
[/path/to/file1.cs]
option1 = value1
[*.cs]
......@@ -1704,12 +1703,12 @@ public void GlobalConfigsSectionsMustBeFullPath()
[.*/path/*.cs]
option3 = value3
[c:/.*/*.cs]
[/.*/*.cs]
option4 = value4
", "/.globalconfig1"));
var options = GetAnalyzerConfigOptions(
new[] { "/file1.cs", "/path/to/file1.cs", "c:/path/to/file1.cs", "/file1.vb" },
new[] { "/file1.cs", "/path/to/file2.cs", "/path/to/file1.cs", "/file1.vb" },
configs);
configs.Free();
......@@ -1789,12 +1788,12 @@ public void GlobalConfigSectionsAreCaseSensitive()
{
var configs = ArrayBuilder<AnalyzerConfig>.GetInstance();
configs.Add(Parse(@"is_global = true
[c:/path/to/file1.cs]
[/path/to/file1.cs]
option1 = value1
", "/.globalconfig1"));
configs.Add(Parse(@"is_global = true
[c:/pAth/To/fiLe1.cs]
[/pAth/To/fiLe1.cs]
option1 = value2",
"/.globalconfig2"));
......@@ -1810,18 +1809,18 @@ public void GlobalConfigSectionsPropertiesAreNotCaseSensitive()
{
var configs = ArrayBuilder<AnalyzerConfig>.GetInstance();
configs.Add(Parse(@"is_global = true
[c:/path/to/file1.cs]
[/path/to/file1.cs]
option1 = value1
", "/.globalconfig1"));
configs.Add(Parse(@"is_global = true
[c:/path/to/file1.cs]
[/path/to/file1.cs]
opTioN1 = value2",
"/.globalconfig2"));
var globalConfig = AnalyzerConfigSet.MergeGlobalConfigs(configs, out var diagnostics);
diagnostics.Verify(
Diagnostic("MultipleGlobalAnalyzerKeys").WithArguments("option1", "c:/path/to/file1.cs", "/.globalconfig1, /.globalconfig2").WithLocation(1, 1)
Diagnostic("MultipleGlobalAnalyzerKeys").WithArguments("option1", "/path/to/file1.cs", "/.globalconfig1, /.globalconfig2").WithLocation(1, 1)
);
configs.Free();
}
......@@ -1850,16 +1849,16 @@ public void GlobalConfigSectionPathsMustBeNormalized()
{
var configs = ArrayBuilder<AnalyzerConfig>.GetInstance();
configs.Add(Parse(@"is_global = true
[c:/path/to/file1.cs]
[/path/to/file1.cs]
option1 = value1
[c:\path\to\file2.cs]
[\path\to\file2.cs]
option1 = value1
", "/.globalconfig1"));
var options = GetAnalyzerConfigOptions(
new[] { "c:/path/to/file1.cs", "c:/path/to/file2.cs" },
new[] { "/path/to/file1.cs", "/path/to/file2.cs" },
configs);
configs.Free();
......@@ -1900,12 +1899,12 @@ public void GlobalConfigCanSetSeverityInSection()
configs.Add(Parse(@"
is_global = true
[c:/path/to/file.cs]
[/path/to/file.cs]
dotnet_diagnostic.cs000.severity = error
", "/.editorconfig"));
var options = GetAnalyzerConfigOptions(
new[] { "/test.cs", "c:/path/to/file.cs" },
new[] { "/test.cs", "/path/to/file.cs" },
configs);
configs.Free();
......@@ -1924,12 +1923,12 @@ public void GlobalConfigInvalidSeverity()
is_global = true
dotnet_diagnostic.cs000.severity = foo
[c:/path/to/file.cs]
[/path/to/file.cs]
dotnet_diagnostic.cs001.severity = bar
", "/.editorconfig"));
var set = AnalyzerConfigSet.Create(configs);
var options = new[] { "/test.cs", "c:/path/to/file.cs" }.Select(f => set.GetOptionsForSourcePath(f)).ToArray();
var options = new[] { "/test.cs", "/path/to/file.cs" }.Select(f => set.GetOptionsForSourcePath(f)).ToArray();
configs.Free();
set.GlobalConfigOptions.Diagnostics.Verify(
......@@ -1949,12 +1948,12 @@ public void GlobalConfigSeverityInSectionOverridesGlobal()
is_global = true
dotnet_diagnostic.cs000.severity = none
[c:/path/to/file.cs]
[/path/to/file.cs]
dotnet_diagnostic.cs000.severity = error
", "/.editorconfig"));
var options = GetAnalyzerConfigOptions(
new[] { "c:/path/to/file.cs" },
new[] { "/path/to/file.cs" },
configs);
configs.Free();
......@@ -2101,6 +2100,78 @@ public void GlobalConfigOptionsAreEmptyWhenNoGlobalConfig()
Assert.Empty(globalOptions.TreeOptions);
}
[Theory]
[InlineData("/path/to/file.cs", true)]
[InlineData("file.cs", false)]
[InlineData("../file.cs", false)]
[InlineData("**", false)]
[InlineData("*.cs", false)]
[InlineData("?abc.cs", false)]
[InlineData("/path/to/**", false)]
[InlineData("/path/[a]/to/*.cs", false)]
[InlineData("/path{", false)]
[InlineData("/path}", false)]
[InlineData("/path?", false)]
[InlineData("/path,", false)]
[InlineData("/path\"", true)]
[InlineData(@"/path\", false)] //editorconfig sees a single escape character (special)
[InlineData(@"/path\\", true)] //editorconfig sees an escaped backslash
[InlineData("//path", true)]
[InlineData("//", true)]
[InlineData(@"\", false)] //invalid: editorconfig sees a single escape character
[InlineData(@"\\", false)] //invalid: editorconfig sees an escaped, literal backslash
[InlineData(@"/\{\}\,\[\]\*", true)]
[InlineData(@"c:\my\file.cs", false)] // invalid: editorconfig sees a single file called 'c:(\m)y(\f)ile.cs' (i.e. \m and \f are escape chars)
[InlineData(@"\my\file.cs", false)] // invalid: editorconfig sees a single file called '(\m)y(\f)ile.cs'
[InlineData(@"\\my\\file.cs", false)] // invalid: editorconfig sees a single file called '\my\file.cs' with literal backslashes
[InlineData(@"\\\\my\\file.cs", false)] // invalid: editorconfig sees a single file called '\\my\file.cs' not a UNC path
[InlineData("//server/file.cs", true)]
[InlineData(@"//server\file.cs", true)]
[InlineData(@"\/file.cs", true)] // allow escaped chars
[InlineData("<>a??/b.cs", false)]
[InlineData(".", false)]
[InlineData("/", true)]
[InlineData("", true)] // only true because [] isn't a valid editorconfig section name either and thus never gets parsed
public void GlobalConfigIssuesWarningWithInvalidSectionNames(string sectionName, bool isValid)
{
var configs = ArrayBuilder<AnalyzerConfig>.GetInstance();
configs.Add(Parse($@"
is_global = true
[{sectionName}]
", "/.editorconfig"));
_ = AnalyzerConfigSet.Create(configs, out var diagnostics);
configs.Free();
if (isValid)
{
diagnostics.Verify();
}
else
{
diagnostics.Verify(
Diagnostic("InvalidGlobalSectionName", isSuppressed: false).WithArguments(sectionName, "/.editorconfig").WithLocation(1, 1)
);
}
}
[Theory]
[InlineData("c:/myfile.cs", true, false)]
[InlineData("cd:/myfile.cs", false, false)] // windows only allows a single character as a drive specifier
[InlineData(@"\c\:\/myfile.cs", true, false)] // allow escaped characters
[InlineData("/myfile.cs", true, true)] //absolute, with a relative drive root
[InlineData("c:myfile.cs", false, false)] //relative, wit2h an absolute drive root
[InlineData(@"c:\myfile.cs", false, false)] //not a valid editorconfig path
[InlineData("//?/C:/Test/Foo.txt", false, false)] // ? is a special char in editorconfig
[InlineData(@"//\?/C:/Test/Foo.txt", true, true)]
[InlineData(@"\\?\C:\Test\Foo.txt", false, false)]
[InlineData(@"c:", false, false)]
[InlineData(@"c\", false, false)]
[InlineData(@"\c\:", false, false)]
[InlineData("c:/", true, false)]
[InlineData("c:/*.cs", false, false)]
public void GlobalConfigIssuesWarningWithInvalidSectionNames_PlatformSpecific(string sectionName, bool isValidWindows, bool isValidOther)
=> GlobalConfigIssuesWarningWithInvalidSectionNames(sectionName, ExecutionConditionUtil.IsWindows ? isValidWindows : isValidOther);
#endregion
}
......
......@@ -714,4 +714,11 @@
<data name="AssemblyReferencesNetFramework" xml:space="preserve">
<value>The assembly containing type '{0}' references .NET Framework, which is not supported.</value>
</data>
<data name="WRN_InvalidGlobalSectionName" xml:space="preserve">
<value>Global analyzer config section name '{0}' is invalid as it is not an absolute path. Section will be ignored. Section was declared in file: '{1}'</value>
<comment>{0}: invalid section name, {1} path to global config</comment>
</data>
<data name="WRN_InvalidGlobalSectionName_Title" xml:space="preserve">
<value>Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored.</value>
</data>
</root>
\ No newline at end of file
......@@ -5,6 +5,7 @@
using System;
using System.Collections.Immutable;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using Microsoft.CodeAnalysis.PooledObjects;
......@@ -113,6 +114,81 @@ public bool IsMatch(string s)
numberRangePairs.ToImmutableAndFree());
}
/// <summary>
/// Test if a section name is an absolute path with no special chars
/// </summary>
internal static bool IsAbsoluteEditorConfigPath(string sectionName)
{
// NOTE: editorconfig paths must use '/' as a directory separator character on all OS.
// on all unix systems this is thus a simple test: does the path start with '/'
// and contain no special chars?
// on windows, a path can be either drive rooted or not (e.g. start with 'c:' or just '')
// in addition to being absolute or relative.
// for example c:myfile.cs is a relative path, but rooted on drive c:
// /myfile2.cs is an absolute path but rooted to the current drive.
// in addition there are UNC paths and volume guids (see https://docs.microsoft.com/en-us/dotnet/standard/io/file-path-formats)
// but these start with \\ (and thus '/' in editor config terminology)
// in this implementation we choose to ignore the drive root for the purposes of
// determining validity. On windows c:/file.cs and /file.cs are both assumed to be
// valid absolute paths, even though the second one is technically relative to
// the current drive of the compiler working directory.
// Note that this check has no impact on config correctness. Files on windows
// will still be compared using their full path (including drive root) so it's
// not possible to target the wrong file. It's just possible that the user won't
// receive a warning that this section is ignored on windows in this edge case.
SectionNameLexer nameLexer = new SectionNameLexer(sectionName);
bool sawStartChar = false;
int logicalIndex = 0;
while (!nameLexer.IsDone)
{
if (nameLexer.Lex() != TokenKind.SimpleCharacter)
{
return false;
}
var simpleChar = nameLexer.EatCurrentCharacter();
// check the path starts with '/'
if (logicalIndex == 0)
{
if (simpleChar == '/')
{
sawStartChar = true;
}
else if (Path.DirectorySeparatorChar == '/')
{
return false;
}
}
// on windows we get a second chance to find the start char
else if (!sawStartChar && Path.DirectorySeparatorChar == '\\')
{
if (logicalIndex == 1 && simpleChar != ':')
{
return false;
}
else if (logicalIndex == 2)
{
if (simpleChar != '/')
{
return false;
}
else
{
sawStartChar = true;
}
}
}
logicalIndex++;
}
return sawStartChar;
}
/// <summary>
/// <![CDATA[
/// <path-list> ::= <path-item> | <path-item> <path-list>
......
......@@ -10,6 +10,7 @@
using System.Collections.Immutable;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Runtime.CompilerServices;
using System.Threading;
using Microsoft.CodeAnalysis.Diagnostics;
......@@ -108,6 +109,15 @@ public bool Equals(List<Section>? x, List<Section>? y)
DiagnosticSeverity.Warning,
isEnabledByDefault: true);
private static readonly DiagnosticDescriptor InvalidGlobalAnalyzerSectionDescriptor
= new DiagnosticDescriptor(
"InvalidGlobalSectionName",
CodeAnalysisResources.WRN_InvalidGlobalSectionName_Title,
CodeAnalysisResources.WRN_InvalidGlobalSectionName,
"AnalyzerConfig",
DiagnosticSeverity.Warning,
isEnabledByDefault: true);
public static AnalyzerConfigSet Create<TList>(TList analyzerConfigs) where TList : IReadOnlyCollection<AnalyzerConfig>
{
return Create(analyzerConfigs, out _);
......@@ -452,17 +462,17 @@ private static void ParseSectionOptions(Section section, TreeOptions.Builder tre
internal static GlobalAnalyzerConfig MergeGlobalConfigs(ArrayBuilder<AnalyzerConfig> analyzerConfigs, out ImmutableArray<Diagnostic> diagnostics)
{
GlobalAnalyzerConfigBuilder globalAnalyzerConfigBuilder = new GlobalAnalyzerConfigBuilder();
DiagnosticBag diagnosticBag = DiagnosticBag.GetInstance();
for (int i = 0; i < analyzerConfigs.Count; i++)
{
if (analyzerConfigs[i].IsGlobal)
{
globalAnalyzerConfigBuilder.MergeIntoGlobalConfig(analyzerConfigs[i]);
globalAnalyzerConfigBuilder.MergeIntoGlobalConfig(analyzerConfigs[i], diagnosticBag);
analyzerConfigs.RemoveAt(i);
i--;
}
}
DiagnosticBag diagnosticBag = DiagnosticBag.GetInstance();
var globalConfig = globalAnalyzerConfigBuilder.Build(diagnosticBag);
diagnostics = diagnosticBag.ToReadOnlyAndFree();
return globalConfig;
......@@ -479,7 +489,7 @@ internal struct GlobalAnalyzerConfigBuilder
internal const string GlobalConfigPath = "<Global Config>";
internal const string GlobalSectionName = "Global Section";
internal void MergeIntoGlobalConfig(AnalyzerConfig config)
internal void MergeIntoGlobalConfig(AnalyzerConfig config, DiagnosticBag diagnostics)
{
if (_values is null)
{
......@@ -490,7 +500,18 @@ internal void MergeIntoGlobalConfig(AnalyzerConfig config)
MergeSection(config.PathToFile, config.GlobalSection, isGlobalSection: true);
foreach (var section in config.NamedSections)
{
MergeSection(config.PathToFile, section, isGlobalSection: false);
if (IsAbsoluteEditorConfigPath(section.Name))
{
MergeSection(config.PathToFile, section, isGlobalSection: false);
}
else
{
diagnostics.Add(Diagnostic.Create(
InvalidGlobalAnalyzerSectionDescriptor,
Location.None,
section.Name,
config.PathToFile));
}
}
}
......
......@@ -569,6 +569,16 @@
<target state="translated">Neplatný název jazykové verze: {0}</target>
<note />
</trans-unit>
<trans-unit id="WRN_InvalidGlobalSectionName">
<source>Global analyzer config section name '{0}' is invalid as it is not an absolute path. Section will be ignored. Section was declared in file: '{1}'</source>
<target state="new">Global analyzer config section name '{0}' is invalid as it is not an absolute path. Section will be ignored. Section was declared in file: '{1}'</target>
<note>{0}: invalid section name, {1} path to global config</note>
</trans-unit>
<trans-unit id="WRN_InvalidGlobalSectionName_Title">
<source>Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored.</source>
<target state="new">Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored.</target>
<note />
</trans-unit>
<trans-unit id="WRN_InvalidSeverityInAnalyzerConfig">
<source>The diagnostic '{0}' was given an invalid severity '{1}' in the analyzer config file at '{2}'.</source>
<target state="translated">Při diagnostice {0} byla v konfiguračním souboru analyzátoru v {2} předána neplatná závažnost {1}.</target>
......
......@@ -569,6 +569,16 @@
<target state="translated">Ungültiger Kulturname: '{0}'</target>
<note />
</trans-unit>
<trans-unit id="WRN_InvalidGlobalSectionName">
<source>Global analyzer config section name '{0}' is invalid as it is not an absolute path. Section will be ignored. Section was declared in file: '{1}'</source>
<target state="new">Global analyzer config section name '{0}' is invalid as it is not an absolute path. Section will be ignored. Section was declared in file: '{1}'</target>
<note>{0}: invalid section name, {1} path to global config</note>
</trans-unit>
<trans-unit id="WRN_InvalidGlobalSectionName_Title">
<source>Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored.</source>
<target state="new">Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored.</target>
<note />
</trans-unit>
<trans-unit id="WRN_InvalidSeverityInAnalyzerConfig">
<source>The diagnostic '{0}' was given an invalid severity '{1}' in the analyzer config file at '{2}'.</source>
<target state="translated">Der Diagnose "{0}" wurde ein ungültiger Schweregrad "{1}" in der Konfigurationsdatei des Analysetools unter "{2}" zugewiesen.</target>
......
......@@ -569,6 +569,16 @@
<target state="translated">Nombre de referencia cultural no válido: '{0}'</target>
<note />
</trans-unit>
<trans-unit id="WRN_InvalidGlobalSectionName">
<source>Global analyzer config section name '{0}' is invalid as it is not an absolute path. Section will be ignored. Section was declared in file: '{1}'</source>
<target state="new">Global analyzer config section name '{0}' is invalid as it is not an absolute path. Section will be ignored. Section was declared in file: '{1}'</target>
<note>{0}: invalid section name, {1} path to global config</note>
</trans-unit>
<trans-unit id="WRN_InvalidGlobalSectionName_Title">
<source>Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored.</source>
<target state="new">Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored.</target>
<note />
</trans-unit>
<trans-unit id="WRN_InvalidSeverityInAnalyzerConfig">
<source>The diagnostic '{0}' was given an invalid severity '{1}' in the analyzer config file at '{2}'.</source>
<target state="translated">Se proporcionó al diagnóstico "{0}" una gravedad no válida "{1}" en el archivo de configuración del analizador en "{2}".</target>
......
......@@ -569,6 +569,16 @@
<target state="translated">Nom de culture non valide : '{0}'</target>
<note />
</trans-unit>
<trans-unit id="WRN_InvalidGlobalSectionName">
<source>Global analyzer config section name '{0}' is invalid as it is not an absolute path. Section will be ignored. Section was declared in file: '{1}'</source>
<target state="new">Global analyzer config section name '{0}' is invalid as it is not an absolute path. Section will be ignored. Section was declared in file: '{1}'</target>
<note>{0}: invalid section name, {1} path to global config</note>
</trans-unit>
<trans-unit id="WRN_InvalidGlobalSectionName_Title">
<source>Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored.</source>
<target state="new">Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored.</target>
<note />
</trans-unit>
<trans-unit id="WRN_InvalidSeverityInAnalyzerConfig">
<source>The diagnostic '{0}' was given an invalid severity '{1}' in the analyzer config file at '{2}'.</source>
<target state="translated">Le diagnostic '{0}' a reçu un niveau de gravité non valide '{1}' dans le fichier config de l'analyseur sur '{2}'.</target>
......
......@@ -569,6 +569,16 @@
<target state="translated">Il nome delle impostazioni cultura '{0}' non è valido</target>
<note />
</trans-unit>
<trans-unit id="WRN_InvalidGlobalSectionName">
<source>Global analyzer config section name '{0}' is invalid as it is not an absolute path. Section will be ignored. Section was declared in file: '{1}'</source>
<target state="new">Global analyzer config section name '{0}' is invalid as it is not an absolute path. Section will be ignored. Section was declared in file: '{1}'</target>
<note>{0}: invalid section name, {1} path to global config</note>
</trans-unit>
<trans-unit id="WRN_InvalidGlobalSectionName_Title">
<source>Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored.</source>
<target state="new">Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored.</target>
<note />
</trans-unit>
<trans-unit id="WRN_InvalidSeverityInAnalyzerConfig">
<source>The diagnostic '{0}' was given an invalid severity '{1}' in the analyzer config file at '{2}'.</source>
<target state="translated">Alla diagnostica ' {0}' è stato assegnato un livello di gravità non valido '{1}' nel file di configurazione dell'analizzatore alla posizione '{2}'.</target>
......
......@@ -569,6 +569,16 @@
<target state="translated">無効なカルチャ名: '{0}'</target>
<note />
</trans-unit>
<trans-unit id="WRN_InvalidGlobalSectionName">
<source>Global analyzer config section name '{0}' is invalid as it is not an absolute path. Section will be ignored. Section was declared in file: '{1}'</source>
<target state="new">Global analyzer config section name '{0}' is invalid as it is not an absolute path. Section will be ignored. Section was declared in file: '{1}'</target>
<note>{0}: invalid section name, {1} path to global config</note>
</trans-unit>
<trans-unit id="WRN_InvalidGlobalSectionName_Title">
<source>Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored.</source>
<target state="new">Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored.</target>
<note />
</trans-unit>
<trans-unit id="WRN_InvalidSeverityInAnalyzerConfig">
<source>The diagnostic '{0}' was given an invalid severity '{1}' in the analyzer config file at '{2}'.</source>
<target state="translated">アナライザー構成ファイルの '{2}' で、診断 '{0}' に無効な重要度 '{1}' が指定されました。</target>
......
......@@ -569,6 +569,16 @@
<target state="translated">잘못된 문화권 이름입니다('{0}').</target>
<note />
</trans-unit>
<trans-unit id="WRN_InvalidGlobalSectionName">
<source>Global analyzer config section name '{0}' is invalid as it is not an absolute path. Section will be ignored. Section was declared in file: '{1}'</source>
<target state="new">Global analyzer config section name '{0}' is invalid as it is not an absolute path. Section will be ignored. Section was declared in file: '{1}'</target>
<note>{0}: invalid section name, {1} path to global config</note>
</trans-unit>
<trans-unit id="WRN_InvalidGlobalSectionName_Title">
<source>Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored.</source>
<target state="new">Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored.</target>
<note />
</trans-unit>
<trans-unit id="WRN_InvalidSeverityInAnalyzerConfig">
<source>The diagnostic '{0}' was given an invalid severity '{1}' in the analyzer config file at '{2}'.</source>
<target state="translated">'{2}'의 분석기 구성 파일에 있는 진단 '{0}'에 잘못된 심각도 '{1}'이(가) 지정되었습니다.</target>
......
......@@ -569,6 +569,16 @@
<target state="translated">Nieprawidłowa nazwa kultury: „{0}”</target>
<note />
</trans-unit>
<trans-unit id="WRN_InvalidGlobalSectionName">
<source>Global analyzer config section name '{0}' is invalid as it is not an absolute path. Section will be ignored. Section was declared in file: '{1}'</source>
<target state="new">Global analyzer config section name '{0}' is invalid as it is not an absolute path. Section will be ignored. Section was declared in file: '{1}'</target>
<note>{0}: invalid section name, {1} path to global config</note>
</trans-unit>
<trans-unit id="WRN_InvalidGlobalSectionName_Title">
<source>Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored.</source>
<target state="new">Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored.</target>
<note />
</trans-unit>
<trans-unit id="WRN_InvalidSeverityInAnalyzerConfig">
<source>The diagnostic '{0}' was given an invalid severity '{1}' in the analyzer config file at '{2}'.</source>
<target state="translated">Dla elementu diagnostyki „{0}” określono nieprawidłową ważność „{1}” w pliku konfiguracji analizatora — „{2}”.</target>
......
......@@ -569,6 +569,16 @@
<target state="translated">Nome de cultura inválido: "{0}"</target>
<note />
</trans-unit>
<trans-unit id="WRN_InvalidGlobalSectionName">
<source>Global analyzer config section name '{0}' is invalid as it is not an absolute path. Section will be ignored. Section was declared in file: '{1}'</source>
<target state="new">Global analyzer config section name '{0}' is invalid as it is not an absolute path. Section will be ignored. Section was declared in file: '{1}'</target>
<note>{0}: invalid section name, {1} path to global config</note>
</trans-unit>
<trans-unit id="WRN_InvalidGlobalSectionName_Title">
<source>Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored.</source>
<target state="new">Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored.</target>
<note />
</trans-unit>
<trans-unit id="WRN_InvalidSeverityInAnalyzerConfig">
<source>The diagnostic '{0}' was given an invalid severity '{1}' in the analyzer config file at '{2}'.</source>
<target state="translated">O diagnóstico '{0}' recebeu uma gravidade inválida '{1}' no arquivo de configuração do analisador em '{2}'.</target>
......
......@@ -569,6 +569,16 @@
<target state="translated">Недопустимое название языка и региональных параметров: "{0}"</target>
<note />
</trans-unit>
<trans-unit id="WRN_InvalidGlobalSectionName">
<source>Global analyzer config section name '{0}' is invalid as it is not an absolute path. Section will be ignored. Section was declared in file: '{1}'</source>
<target state="new">Global analyzer config section name '{0}' is invalid as it is not an absolute path. Section will be ignored. Section was declared in file: '{1}'</target>
<note>{0}: invalid section name, {1} path to global config</note>
</trans-unit>
<trans-unit id="WRN_InvalidGlobalSectionName_Title">
<source>Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored.</source>
<target state="new">Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored.</target>
<note />
</trans-unit>
<trans-unit id="WRN_InvalidSeverityInAnalyzerConfig">
<source>The diagnostic '{0}' was given an invalid severity '{1}' in the analyzer config file at '{2}'.</source>
<target state="translated">Для диагностики "{0}" указана недопустимая серьезность "{1}" в файле конфигурации анализатора в "{2}".</target>
......
......@@ -569,6 +569,16 @@
<target state="translated">Geçersiz kültür adı: '{0}'</target>
<note />
</trans-unit>
<trans-unit id="WRN_InvalidGlobalSectionName">
<source>Global analyzer config section name '{0}' is invalid as it is not an absolute path. Section will be ignored. Section was declared in file: '{1}'</source>
<target state="new">Global analyzer config section name '{0}' is invalid as it is not an absolute path. Section will be ignored. Section was declared in file: '{1}'</target>
<note>{0}: invalid section name, {1} path to global config</note>
</trans-unit>
<trans-unit id="WRN_InvalidGlobalSectionName_Title">
<source>Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored.</source>
<target state="new">Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored.</target>
<note />
</trans-unit>
<trans-unit id="WRN_InvalidSeverityInAnalyzerConfig">
<source>The diagnostic '{0}' was given an invalid severity '{1}' in the analyzer config file at '{2}'.</source>
<target state="translated">'{0}' tanılamasına '{2}' konumundaki çözümleyici yapılandırma dosyasında geçersiz bir önem derecesi ('{1}') verildi.</target>
......
......@@ -569,6 +569,16 @@
<target state="translated">无效的区域性名称:“{0}”</target>
<note />
</trans-unit>
<trans-unit id="WRN_InvalidGlobalSectionName">
<source>Global analyzer config section name '{0}' is invalid as it is not an absolute path. Section will be ignored. Section was declared in file: '{1}'</source>
<target state="new">Global analyzer config section name '{0}' is invalid as it is not an absolute path. Section will be ignored. Section was declared in file: '{1}'</target>
<note>{0}: invalid section name, {1} path to global config</note>
</trans-unit>
<trans-unit id="WRN_InvalidGlobalSectionName_Title">
<source>Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored.</source>
<target state="new">Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored.</target>
<note />
</trans-unit>
<trans-unit id="WRN_InvalidSeverityInAnalyzerConfig">
<source>The diagnostic '{0}' was given an invalid severity '{1}' in the analyzer config file at '{2}'.</source>
<target state="translated">在 "{2}" 的分析器配置文件中为诊断 "{0}" 给定了无效的严重性 "{1}"。</target>
......
......@@ -569,6 +569,16 @@
<target state="translated">文化特性名稱無效: '{0}'</target>
<note />
</trans-unit>
<trans-unit id="WRN_InvalidGlobalSectionName">
<source>Global analyzer config section name '{0}' is invalid as it is not an absolute path. Section will be ignored. Section was declared in file: '{1}'</source>
<target state="new">Global analyzer config section name '{0}' is invalid as it is not an absolute path. Section will be ignored. Section was declared in file: '{1}'</target>
<note>{0}: invalid section name, {1} path to global config</note>
</trans-unit>
<trans-unit id="WRN_InvalidGlobalSectionName_Title">
<source>Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored.</source>
<target state="new">Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored.</target>
<note />
</trans-unit>
<trans-unit id="WRN_InvalidSeverityInAnalyzerConfig">
<source>The diagnostic '{0}' was given an invalid severity '{1}' in the analyzer config file at '{2}'.</source>
<target state="translated">在分析器組態檔的 '{2}' 處,為診斷 '{0}' 提供了無效的嚴重性 '{1}'。</target>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册