From c402fa7507bf6caf6963a7736b168447938cd10a Mon Sep 17 00:00:00 2001 From: Sam Harwell Date: Mon, 2 Oct 2023 08:25:55 -0500 Subject: [PATCH 1/2] Use raw strings in GenerateDocumentationAndConfigFiles --- .../Program.cs | 442 ++++++++++-------- 1 file changed, 240 insertions(+), 202 deletions(-) diff --git a/src/Tools/GenerateDocumentationAndConfigFiles/Program.cs b/src/Tools/GenerateDocumentationAndConfigFiles/Program.cs index d6858290ad..e0e66397dd 100644 --- a/src/Tools/GenerateDocumentationAndConfigFiles/Program.cs +++ b/src/Tools/GenerateDocumentationAndConfigFiles/Program.cs @@ -251,9 +251,11 @@ void createPropsFiles() var disableNetAnalyzersImport = getDisableNetAnalyzersImport(); var fileContents = -$@" - {disableNetAnalyzersImport}{getCodeAnalysisTreatWarningsAsErrors()}{getCompilerVisibleProperties()} -"; + $""" + + {disableNetAnalyzersImport}{getCodeAnalysisTreatWarningsAsErrors()}{getCompilerVisibleProperties()} + + """; var directory = Directory.CreateDirectory(propsFileDir); var fileWithPath = Path.Combine(directory.FullName, propsFileName); @@ -266,16 +268,18 @@ void createPropsFiles() fileWithPath = Path.Combine(directory.FullName, propsFileToDisableNetAnalyzersInNuGetPackageName); fileContents = -$@" - - - false - <{NetAnalyzersNugetAssemblyVersionPropertyName}>{analyzerVersion} - -"; + $""" + + + + false + <{NetAnalyzersNugetAssemblyVersionPropertyName}>{analyzerVersion} + + + """; // This doesn't need validation as the generated file is part of artifacts. File.WriteAllText(fileWithPath, fileContents); } @@ -288,21 +292,23 @@ string getDisableNetAnalyzersImport() { Debug.Assert(analyzerPackageName is NetAnalyzersPackageName or TextAnalyzersPackageName); - return $@" - - - - - - <{NetAnalyzersSDKAssemblyVersionPropertyName}>{analyzerVersion} - -"; + return $""" + + + + + + + <{NetAnalyzersSDKAssemblyVersionPropertyName}>{analyzerVersion} + + + """; } Debug.Assert(!containsPortedFxCopRules); @@ -313,34 +319,38 @@ We rely on the additional props file '{propsFileToDisableNetAnalyzersInNuGetPack string getCodeAnalysisTreatWarningsAsErrors() { var allRuleIds = string.Join(';', allRulesById.Keys); - return $@" - - - {allRuleIds} - $(CodeAnalysisTreatWarningsAsErrors) - $(WarningsNotAsErrors);$(CodeAnalysisRuleIds) - "; + return $""" + + + + {allRuleIds} + $(CodeAnalysisTreatWarningsAsErrors) + $(WarningsNotAsErrors);$(CodeAnalysisRuleIds) + + """; } string getCompilerVisibleProperties() { return analyzerPackageName switch { - ResxSourceGeneratorPackageName => @" - - - - - - - - - - - -", + ResxSourceGeneratorPackageName => """ + + + + + + + + + + + + + + """, _ => "", }; } @@ -582,11 +592,13 @@ async ValueTask createAnalyzerRulesMissingDocumentationFileAsync() var fileWithPath = Path.Combine(directory.FullName, "RulesMissingDocumentation.md"); var builder = new StringBuilder(); - builder.Append(@"# Rules without documentation + builder.Append(""" + # Rules without documentation + + Rule ID | Missing Help Link | Title | + --------|-------------------|-------| -Rule ID | Missing Help Link | Title | ---------|-------------------|-------| -"); + """); var actualContent = Array.Empty(); if (validateOnly) { @@ -1403,8 +1415,10 @@ private static void CreateTargetsFile(string targetsFileDir, string targetsFileN } var fileContents = -$@"{GetCommonContents(packageName, categories)}{GetPackageSpecificContents(packageName)} -"; + $""" + {GetCommonContents(packageName, categories)}{GetPackageSpecificContents(packageName)} + + """; var directory = Directory.CreateDirectory(targetsFileDir); var fileWithPath = Path.Combine(directory.FullName, targetsFileName); File.WriteAllText(fileWithPath, fileContents); @@ -1457,36 +1471,38 @@ static string GetGlobalAnalyzerConfigTargetContents(string packageName, string? packageName, packageVersionPropName, category, analysisLevelPropName, analysisLevelPrefixPropName, analysisLevelSuffixPropName, effectiveAnalysisLevelPropName); - return $@" - - - {propertyStringForSettingDefaultPropertyValues} - - <_GlobalAnalyzerConfigAnalysisMode_{trimmedPackageName}>$({analysisLevelSuffixPropName}) - <_GlobalAnalyzerConfigAnalysisMode_{trimmedPackageName} Condition=""'$(_GlobalAnalyzerConfigAnalysisMode_{trimmedPackageName})' == ''"">$({analysisModePropName}) - <_GlobalAnalyzerConfigAnalysisMode_{trimmedPackageName} Condition=""'$(_GlobalAnalyzerConfigAnalysisMode_{trimmedPackageName})' == 'AllEnabledByDefault'"">{nameof(AnalysisMode.All)} - <_GlobalAnalyzerConfigAnalysisMode_{trimmedPackageName} Condition=""'$(_GlobalAnalyzerConfigAnalysisMode_{trimmedPackageName})' == 'AllDisabledByDefault'"">{nameof(AnalysisMode.None)} - <_GlobalAnalyzerConfigAnalysisMode_{trimmedPackageName} Condition=""'$(_GlobalAnalyzerConfigAnalysisMode_{trimmedPackageName})' == ''"">{nameof(AnalysisMode.Default)} - - - - $(CodeAnalysisTreatWarningsAsErrors) - - <_GlobalAnalyzerConfigFileName_{trimmedPackageName}_WarnAsErrorSuffix Condition=""'$(EffectiveCodeAnalysisTreatWarningsAsErrors)' == 'true'"">_warnaserror - - - <_GlobalAnalyzerConfigFileName_{trimmedPackageName} Condition=""'$({packageVersionPropName})' != ''"">{analysisLevelPropName}_$({packageVersionPropName}.Replace(""."",""_""))_$(_GlobalAnalyzerConfigAnalysisMode_{trimmedPackageName})$(_GlobalAnalyzerConfigFileName_{trimmedPackageName}_WarnAsErrorSuffix).globalconfig - <_GlobalAnalyzerConfigFileName_{trimmedPackageName}>$(_GlobalAnalyzerConfigFileName_{trimmedPackageName}.ToLowerInvariant()) - - <_GlobalAnalyzerConfigDir_{trimmedPackageName} Condition=""'$(_GlobalAnalyzerConfigDir_{trimmedPackageName})' == ''"">$(MSBuildThisFileDirectory)config - <_GlobalAnalyzerConfigFile_{trimmedPackageName} Condition=""'$(_GlobalAnalyzerConfigFileName_{trimmedPackageName})' != ''"">$(_GlobalAnalyzerConfigDir_{trimmedPackageName})\$(_GlobalAnalyzerConfigFileName_{trimmedPackageName}) - - - - - - -"; + return $""" + + + + {propertyStringForSettingDefaultPropertyValues} + + <_GlobalAnalyzerConfigAnalysisMode_{trimmedPackageName}>$({analysisLevelSuffixPropName}) + <_GlobalAnalyzerConfigAnalysisMode_{trimmedPackageName} Condition="'$(_GlobalAnalyzerConfigAnalysisMode_{trimmedPackageName})' == ''">$({analysisModePropName}) + <_GlobalAnalyzerConfigAnalysisMode_{trimmedPackageName} Condition="'$(_GlobalAnalyzerConfigAnalysisMode_{trimmedPackageName})' == 'AllEnabledByDefault'">{nameof(AnalysisMode.All)} + <_GlobalAnalyzerConfigAnalysisMode_{trimmedPackageName} Condition="'$(_GlobalAnalyzerConfigAnalysisMode_{trimmedPackageName})' == 'AllDisabledByDefault'">{nameof(AnalysisMode.None)} + <_GlobalAnalyzerConfigAnalysisMode_{trimmedPackageName} Condition="'$(_GlobalAnalyzerConfigAnalysisMode_{trimmedPackageName})' == ''">{nameof(AnalysisMode.Default)} + + + + $(CodeAnalysisTreatWarningsAsErrors) + + <_GlobalAnalyzerConfigFileName_{trimmedPackageName}_WarnAsErrorSuffix Condition="'$(EffectiveCodeAnalysisTreatWarningsAsErrors)' == 'true'">_warnaserror + + + <_GlobalAnalyzerConfigFileName_{trimmedPackageName} Condition="'$({packageVersionPropName})' != ''">{analysisLevelPropName}_$({packageVersionPropName}.Replace(".","_"))_$(_GlobalAnalyzerConfigAnalysisMode_{trimmedPackageName})$(_GlobalAnalyzerConfigFileName_{trimmedPackageName}_WarnAsErrorSuffix).globalconfig + <_GlobalAnalyzerConfigFileName_{trimmedPackageName}>$(_GlobalAnalyzerConfigFileName_{trimmedPackageName}.ToLowerInvariant()) + + <_GlobalAnalyzerConfigDir_{trimmedPackageName} Condition="'$(_GlobalAnalyzerConfigDir_{trimmedPackageName})' == ''">$(MSBuildThisFileDirectory)config + <_GlobalAnalyzerConfigFile_{trimmedPackageName} Condition="'$(_GlobalAnalyzerConfigFileName_{trimmedPackageName})' != ''">$(_GlobalAnalyzerConfigDir_{trimmedPackageName})\$(_GlobalAnalyzerConfigFileName_{trimmedPackageName}) + + + + + + + + """; static string GetPropertyStringForSettingDefaultPropertyValues( string packageName, @@ -1507,39 +1523,43 @@ static string GetPropertyStringForSettingDefaultPropertyValues( // category-specific AnalysisLevel property values. In future, we should consider removing similar logic from // SDK targets for core AnalysisLevel and instead generalize this logic. - propertyStr += $@" - - <{analysisLevelPropName} Condition=""'$({analysisLevelPropName})' == ''"">$(AnalysisLevel) - - - <{analysisLevelPrefixPropName} Condition=""$({analysisLevelPropName}.Contains('-'))"">$([System.Text.RegularExpressions.Regex]::Replace($({analysisLevelPropName}), '-(.)*', '')) - <{analysisLevelSuffixPropName} Condition=""'$({analysisLevelPrefixPropName})' != ''"">$([System.Text.RegularExpressions.Regex]::Replace($({analysisLevelPropName}), '$({analysisLevelPrefixPropName})-', '')) - - - <{effectiveAnalysisLevelPropName} Condition=""'$({analysisLevelPropName})' == 'none' or '$({analysisLevelPrefixPropName})' == 'none'"">$(_NoneAnalysisLevel) - <{effectiveAnalysisLevelPropName} Condition=""'$({analysisLevelPropName})' == 'latest' or '$({analysisLevelPrefixPropName})' == 'latest'"">$(_LatestAnalysisLevel) - <{effectiveAnalysisLevelPropName} Condition=""'$({analysisLevelPropName})' == 'preview' or '$({analysisLevelPrefixPropName})' == 'preview'"">$(_PreviewAnalysisLevel) - - - <{effectiveAnalysisLevelPropName} Condition=""'$({effectiveAnalysisLevelPropName})' == '' And - '$({analysisLevelPrefixPropName})' != ''"">$({analysisLevelPrefixPropName}) - <{effectiveAnalysisLevelPropName} Condition=""'$({effectiveAnalysisLevelPropName})' == '' And - '$({analysisLevelPropName})' != ''"">$({analysisLevelPropName}) -"; + propertyStr += $""" + + + <{analysisLevelPropName} Condition="'$({analysisLevelPropName})' == ''">$(AnalysisLevel) + + + <{analysisLevelPrefixPropName} Condition="$({analysisLevelPropName}.Contains('-'))">$([System.Text.RegularExpressions.Regex]::Replace($({analysisLevelPropName}), '-(.)*', '')) + <{analysisLevelSuffixPropName} Condition="'$({analysisLevelPrefixPropName})' != ''">$([System.Text.RegularExpressions.Regex]::Replace($({analysisLevelPropName}), '$({analysisLevelPrefixPropName})-', '')) + + + <{effectiveAnalysisLevelPropName} Condition="'$({analysisLevelPropName})' == 'none' or '$({analysisLevelPrefixPropName})' == 'none'">$(_NoneAnalysisLevel) + <{effectiveAnalysisLevelPropName} Condition="'$({analysisLevelPropName})' == 'latest' or '$({analysisLevelPrefixPropName})' == 'latest'">$(_LatestAnalysisLevel) + <{effectiveAnalysisLevelPropName} Condition="'$({analysisLevelPropName})' == 'preview' or '$({analysisLevelPrefixPropName})' == 'preview'">$(_PreviewAnalysisLevel) + + + <{effectiveAnalysisLevelPropName} Condition="'$({effectiveAnalysisLevelPropName})' == '' And + '$({analysisLevelPrefixPropName})' != ''">$({analysisLevelPrefixPropName}) + <{effectiveAnalysisLevelPropName} Condition="'$({effectiveAnalysisLevelPropName})' == '' And + '$({analysisLevelPropName})' != ''">$({analysisLevelPropName}) + + """; } - propertyStr += $@" - - <{packageVersionPropName} Condition=""'$({packageVersionPropName})' == '' and $({effectiveAnalysisLevelPropName}) != ''"">$([System.Text.RegularExpressions.Regex]::Replace($({effectiveAnalysisLevelPropName}), '(.0)*$', '')) -"; + propertyStr += $""" + + + <{packageVersionPropName} Condition="'$({packageVersionPropName})' == '' and $({effectiveAnalysisLevelPropName}) != ''">$([System.Text.RegularExpressions.Regex]::Replace($({effectiveAnalysisLevelPropName}), '(.0)*$', '')) + + """; return propertyStr; } @@ -1570,9 +1590,11 @@ static void AddMSBuildContentForPropertyOptions(StringBuilder builder) static void AddItemGroupForCompilerVisibleProperties(List compilerVisibleProperties, StringBuilder builder) { - builder.AppendLine($@" - - "); + builder.AppendLine($""" + + + + """); foreach (var compilerVisibleProperty in compilerVisibleProperties) { builder.AppendLine($@" "); @@ -1588,10 +1610,12 @@ static void AddMSBuildContentForItemOptions(StringBuilder builder) // - Key: Item name prefixed with an '_' and suffixed with a 'List' to reduce chances of conflicts with any existing project property. // - Value: Concatenated item metadata values, separated by a ',' character. See https://github.com/dotnet/sdk/issues/12706#issuecomment-668219422 for details. - builder.Append($@" - - -"); + builder.Append($""" + + + + + """); var compilerVisibleProperties = new List(); foreach (var field in typeof(MSBuildItemOptionNames).GetFields()) { @@ -1612,90 +1636,104 @@ static void AddMSBuildContentForItemOptions(StringBuilder builder) static string GetCodeAnalysisTreatWarningsAsErrorsTargetContents() { - return $@" - - - - $(CodeAnalysisTreatWarningsAsErrors) - $(WarningsNotAsErrors);$(CodeAnalysisRuleIds) - - -"; + return $""" + + + + + $(CodeAnalysisTreatWarningsAsErrors) + $(WarningsNotAsErrors);$(CodeAnalysisRuleIds) + + + + """; } - const string AddAllResxFilesAsAdditionalFilesTarget = @" - - - - - - "; + const string AddAllResxFilesAsAdditionalFilesTarget = """ + + + + + + + + """; static string GetPackageSpecificContents(string packageName) => packageName switch { - CodeAnalysisAnalyzersPackageName => $@" -{AddAllResxFilesAsAdditionalFilesTarget} - - - - - - - - ", - PublicApiAnalyzersPackageName => @" - - - - - - - - ", - PerformanceSensitiveAnalyzersPackageName => @" - - true - $(MSBuildThisFileDirectory)PerformanceSensitiveAttribute$(DefaultLanguageSourceExtension) - - - - - - - - ", - NetAnalyzersPackageName => $@" - - - - ", - ResxSourceGeneratorPackageName => $@" - - - - - - -{AddAllResxFilesAsAdditionalFilesTarget} - - - - - - - - -", + CodeAnalysisAnalyzersPackageName => $""" + + {AddAllResxFilesAsAdditionalFilesTarget} + + + + + + + + + """, + PublicApiAnalyzersPackageName => """ + + + + + + + + + + """, + PerformanceSensitiveAnalyzersPackageName => """ + + + true + $(MSBuildThisFileDirectory)PerformanceSensitiveAttribute$(DefaultLanguageSourceExtension) + + + + + + + + + """, + NetAnalyzersPackageName => $""" + + + + + + """, + ResxSourceGeneratorPackageName => $""" + + + + + + + + {AddAllResxFilesAsAdditionalFilesTarget} + + + + + + + + + + """, _ => string.Empty, }; } From 1cd93bf70be215e0449fe053ca229f214faaf097 Mon Sep 17 00:00:00 2001 From: Sam Harwell Date: Mon, 2 Oct 2023 08:22:49 -0500 Subject: [PATCH 2/2] AddAllResxFilesAsAdditionalFiles depends on PrepareResourceNames --- src/Tools/GenerateDocumentationAndConfigFiles/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Tools/GenerateDocumentationAndConfigFiles/Program.cs b/src/Tools/GenerateDocumentationAndConfigFiles/Program.cs index e0e66397dd..1d364a99c6 100644 --- a/src/Tools/GenerateDocumentationAndConfigFiles/Program.cs +++ b/src/Tools/GenerateDocumentationAndConfigFiles/Program.cs @@ -1654,7 +1654,7 @@ Note that a similar 'WarningsNotAsErrors' property group is present in the gener const string AddAllResxFilesAsAdditionalFilesTarget = """ - +