From f3b26e23c77984d3a48eda4c05389e9716116a1c Mon Sep 17 00:00:00 2001 From: Chris Sienkiewicz Date: Mon, 21 Sep 2020 12:56:32 -0700 Subject: [PATCH] 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. --- .../Test/CommandLine/CommandLineTests.cs | 6 +- .../Analyzers/AnalyzerConfigTests.cs | 133 ++++++++++++++---- .../Core/Portable/CodeAnalysisResources.resx | 7 + .../AnalyzerConfig.SectionNameMatching.cs | 76 ++++++++++ .../Portable/CommandLine/AnalyzerConfigSet.cs | 29 +++- .../Portable/xlf/CodeAnalysisResources.cs.xlf | 10 ++ .../Portable/xlf/CodeAnalysisResources.de.xlf | 10 ++ .../Portable/xlf/CodeAnalysisResources.es.xlf | 10 ++ .../Portable/xlf/CodeAnalysisResources.fr.xlf | 10 ++ .../Portable/xlf/CodeAnalysisResources.it.xlf | 10 ++ .../Portable/xlf/CodeAnalysisResources.ja.xlf | 10 ++ .../Portable/xlf/CodeAnalysisResources.ko.xlf | 10 ++ .../Portable/xlf/CodeAnalysisResources.pl.xlf | 10 ++ .../xlf/CodeAnalysisResources.pt-BR.xlf | 10 ++ .../Portable/xlf/CodeAnalysisResources.ru.xlf | 10 ++ .../Portable/xlf/CodeAnalysisResources.tr.xlf | 10 ++ .../xlf/CodeAnalysisResources.zh-Hans.xlf | 10 ++ .../xlf/CodeAnalysisResources.zh-Hant.xlf | 10 ++ 18 files changed, 343 insertions(+), 38 deletions(-) diff --git a/src/Compilers/CSharp/Test/CommandLine/CommandLineTests.cs b/src/Compilers/CSharp/Test/CommandLine/CommandLineTests.cs index e25e98557f1..d888635200c 100644 --- a/src/Compilers/CSharp/Test/CommandLine/CommandLineTests.cs +++ b/src/Compilers/CSharp/Test/CommandLine/CommandLineTests.cs @@ -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] diff --git a/src/Compilers/Core/CodeAnalysisTest/Analyzers/AnalyzerConfigTests.cs b/src/Compilers/Core/CodeAnalysisTest/Analyzers/AnalyzerConfigTests.cs index 0c015cd08e2..ac7cc76f5f8 100644 --- a/src/Compilers/Core/CodeAnalysisTest/Analyzers/AnalyzerConfigTests.cs +++ b/src/Compilers/Core/CodeAnalysisTest/Analyzers/AnalyzerConfigTests.cs @@ -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.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.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.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.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.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.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.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 } diff --git a/src/Compilers/Core/Portable/CodeAnalysisResources.resx b/src/Compilers/Core/Portable/CodeAnalysisResources.resx index cd36b4e6959..f4c53551bfd 100644 --- a/src/Compilers/Core/Portable/CodeAnalysisResources.resx +++ b/src/Compilers/Core/Portable/CodeAnalysisResources.resx @@ -714,4 +714,11 @@ The assembly containing type '{0}' references .NET Framework, which is not supported. + + 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}' + {0}: invalid section name, {1} path to global config + + + Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored. + \ No newline at end of file diff --git a/src/Compilers/Core/Portable/CommandLine/AnalyzerConfig.SectionNameMatching.cs b/src/Compilers/Core/Portable/CommandLine/AnalyzerConfig.SectionNameMatching.cs index 2464e31a8a9..23d937b4a44 100644 --- a/src/Compilers/Core/Portable/CommandLine/AnalyzerConfig.SectionNameMatching.cs +++ b/src/Compilers/Core/Portable/CommandLine/AnalyzerConfig.SectionNameMatching.cs @@ -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()); } + /// + /// Test if a section name is an absolute path with no special chars + /// + 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; + } + /// /// ::= | diff --git a/src/Compilers/Core/Portable/CommandLine/AnalyzerConfigSet.cs b/src/Compilers/Core/Portable/CommandLine/AnalyzerConfigSet.cs index bcd0737c6d9..1803cf31ce0 100644 --- a/src/Compilers/Core/Portable/CommandLine/AnalyzerConfigSet.cs +++ b/src/Compilers/Core/Portable/CommandLine/AnalyzerConfigSet.cs @@ -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
? x, List
? 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 analyzerConfigs) where TList : IReadOnlyCollection { return Create(analyzerConfigs, out _); @@ -452,17 +462,17 @@ private static void ParseSectionOptions(Section section, TreeOptions.Builder tre internal static GlobalAnalyzerConfig MergeGlobalConfigs(ArrayBuilder analyzerConfigs, out ImmutableArray 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 = ""; 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)); + } } } diff --git a/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.cs.xlf b/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.cs.xlf index 9cd778a7a1d..b2800863f5f 100644 --- a/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.cs.xlf +++ b/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.cs.xlf @@ -569,6 +569,16 @@ Neplatný název jazykové verze: {0} + + 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}' + 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}' + {0}: invalid section name, {1} path to global config + + + Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored. + Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored. + + The diagnostic '{0}' was given an invalid severity '{1}' in the analyzer config file at '{2}'. Při diagnostice {0} byla v konfiguračním souboru analyzátoru v {2} předána neplatná závažnost {1}. diff --git a/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.de.xlf b/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.de.xlf index b8c9ffa5070..58aaa24f95c 100644 --- a/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.de.xlf +++ b/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.de.xlf @@ -569,6 +569,16 @@ Ungültiger Kulturname: '{0}' + + 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}' + 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}' + {0}: invalid section name, {1} path to global config + + + Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored. + Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored. + + The diagnostic '{0}' was given an invalid severity '{1}' in the analyzer config file at '{2}'. Der Diagnose "{0}" wurde ein ungültiger Schweregrad "{1}" in der Konfigurationsdatei des Analysetools unter "{2}" zugewiesen. diff --git a/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.es.xlf b/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.es.xlf index b95a080c5b2..a7e7cd98e67 100644 --- a/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.es.xlf +++ b/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.es.xlf @@ -569,6 +569,16 @@ Nombre de referencia cultural no válido: '{0}' + + 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}' + 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}' + {0}: invalid section name, {1} path to global config + + + Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored. + Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored. + + The diagnostic '{0}' was given an invalid severity '{1}' in the analyzer config file at '{2}'. Se proporcionó al diagnóstico "{0}" una gravedad no válida "{1}" en el archivo de configuración del analizador en "{2}". diff --git a/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.fr.xlf b/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.fr.xlf index cdc2528d03d..5ef1f536117 100644 --- a/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.fr.xlf +++ b/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.fr.xlf @@ -569,6 +569,16 @@ Nom de culture non valide : '{0}' + + 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}' + 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}' + {0}: invalid section name, {1} path to global config + + + Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored. + Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored. + + The diagnostic '{0}' was given an invalid severity '{1}' in the analyzer config file at '{2}'. Le diagnostic '{0}' a reçu un niveau de gravité non valide '{1}' dans le fichier config de l'analyseur sur '{2}'. diff --git a/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.it.xlf b/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.it.xlf index 6e7d800ba69..f967e39475f 100644 --- a/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.it.xlf +++ b/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.it.xlf @@ -569,6 +569,16 @@ Il nome delle impostazioni cultura '{0}' non è valido + + 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}' + 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}' + {0}: invalid section name, {1} path to global config + + + Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored. + Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored. + + The diagnostic '{0}' was given an invalid severity '{1}' in the analyzer config file at '{2}'. Alla diagnostica ' {0}' è stato assegnato un livello di gravità non valido '{1}' nel file di configurazione dell'analizzatore alla posizione '{2}'. diff --git a/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.ja.xlf b/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.ja.xlf index 5e32888c6d7..992e1e83be2 100644 --- a/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.ja.xlf +++ b/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.ja.xlf @@ -569,6 +569,16 @@ 無効なカルチャ名: '{0}' + + 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}' + 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}' + {0}: invalid section name, {1} path to global config + + + Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored. + Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored. + + The diagnostic '{0}' was given an invalid severity '{1}' in the analyzer config file at '{2}'. アナライザー構成ファイルの '{2}' で、診断 '{0}' に無効な重要度 '{1}' が指定されました。 diff --git a/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.ko.xlf b/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.ko.xlf index c95fa3035e4..2ceadef5cff 100644 --- a/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.ko.xlf +++ b/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.ko.xlf @@ -569,6 +569,16 @@ 잘못된 문화권 이름입니다('{0}'). + + 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}' + 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}' + {0}: invalid section name, {1} path to global config + + + Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored. + Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored. + + The diagnostic '{0}' was given an invalid severity '{1}' in the analyzer config file at '{2}'. '{2}'의 분석기 구성 파일에 있는 진단 '{0}'에 잘못된 심각도 '{1}'이(가) 지정되었습니다. diff --git a/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.pl.xlf b/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.pl.xlf index ae00665e949..b6bcce702ab 100644 --- a/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.pl.xlf +++ b/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.pl.xlf @@ -569,6 +569,16 @@ Nieprawidłowa nazwa kultury: „{0}” + + 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}' + 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}' + {0}: invalid section name, {1} path to global config + + + Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored. + Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored. + + The diagnostic '{0}' was given an invalid severity '{1}' in the analyzer config file at '{2}'. Dla elementu diagnostyki „{0}” określono nieprawidłową ważność „{1}” w pliku konfiguracji analizatora — „{2}”. diff --git a/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.pt-BR.xlf b/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.pt-BR.xlf index e8e48b7e610..61bc078bb64 100644 --- a/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.pt-BR.xlf +++ b/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.pt-BR.xlf @@ -569,6 +569,16 @@ Nome de cultura inválido: "{0}" + + 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}' + 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}' + {0}: invalid section name, {1} path to global config + + + Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored. + Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored. + + The diagnostic '{0}' was given an invalid severity '{1}' in the analyzer config file at '{2}'. O diagnóstico '{0}' recebeu uma gravidade inválida '{1}' no arquivo de configuração do analisador em '{2}'. diff --git a/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.ru.xlf b/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.ru.xlf index e3f19e0cb23..cb7663ebaf4 100644 --- a/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.ru.xlf +++ b/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.ru.xlf @@ -569,6 +569,16 @@ Недопустимое название языка и региональных параметров: "{0}" + + 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}' + 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}' + {0}: invalid section name, {1} path to global config + + + Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored. + Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored. + + The diagnostic '{0}' was given an invalid severity '{1}' in the analyzer config file at '{2}'. Для диагностики "{0}" указана недопустимая серьезность "{1}" в файле конфигурации анализатора в "{2}". diff --git a/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.tr.xlf b/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.tr.xlf index b4c17876d86..74a2df032e4 100644 --- a/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.tr.xlf +++ b/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.tr.xlf @@ -569,6 +569,16 @@ Geçersiz kültür adı: '{0}' + + 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}' + 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}' + {0}: invalid section name, {1} path to global config + + + Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored. + Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored. + + The diagnostic '{0}' was given an invalid severity '{1}' in the analyzer config file at '{2}'. '{0}' tanılamasına '{2}' konumundaki çözümleyici yapılandırma dosyasında geçersiz bir önem derecesi ('{1}') verildi. diff --git a/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.zh-Hans.xlf b/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.zh-Hans.xlf index a35db1caecd..949a9c336af 100644 --- a/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.zh-Hans.xlf +++ b/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.zh-Hans.xlf @@ -569,6 +569,16 @@ 无效的区域性名称:“{0}” + + 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}' + 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}' + {0}: invalid section name, {1} path to global config + + + Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored. + Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored. + + The diagnostic '{0}' was given an invalid severity '{1}' in the analyzer config file at '{2}'. 在 "{2}" 的分析器配置文件中为诊断 "{0}" 给定了无效的严重性 "{1}"。 diff --git a/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.zh-Hant.xlf b/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.zh-Hant.xlf index 85fa1c2a155..63124e47d31 100644 --- a/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.zh-Hant.xlf +++ b/src/Compilers/Core/Portable/xlf/CodeAnalysisResources.zh-Hant.xlf @@ -569,6 +569,16 @@ 文化特性名稱無效: '{0}' + + 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}' + 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}' + {0}: invalid section name, {1} path to global config + + + Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored. + Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored. + + The diagnostic '{0}' was given an invalid severity '{1}' in the analyzer config file at '{2}'. 在分析器組態檔的 '{2}' 處,為診斷 '{0}' 提供了無效的嚴重性 '{1}'。 -- GitLab