diff --git a/src/Tools/GenerateDocumentationAndConfigFiles/Program.cs b/src/Tools/GenerateDocumentationAndConfigFiles/Program.cs
index d6858290ad..1d364a99c6 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}{NetAnalyzersNugetAssemblyVersionPropertyName}>
-
-";
+ $"""
+
+
+
+ false
+ <{NetAnalyzersNugetAssemblyVersionPropertyName}>{analyzerVersion}{NetAnalyzersNugetAssemblyVersionPropertyName}>
+
+
+ """;
// 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}{NetAnalyzersSDKAssemblyVersionPropertyName}>
-
-";
+ return $"""
+
+
+
+
+
+
+ <{NetAnalyzersSDKAssemblyVersionPropertyName}>{analyzerVersion}{NetAnalyzersSDKAssemblyVersionPropertyName}>
+
+
+ """;
}
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){analysisLevelPropName}>
-
-
- <{analysisLevelPrefixPropName} Condition=""$({analysisLevelPropName}.Contains('-'))"">$([System.Text.RegularExpressions.Regex]::Replace($({analysisLevelPropName}), '-(.)*', '')){analysisLevelPrefixPropName}>
- <{analysisLevelSuffixPropName} Condition=""'$({analysisLevelPrefixPropName})' != ''"">$([System.Text.RegularExpressions.Regex]::Replace($({analysisLevelPropName}), '$({analysisLevelPrefixPropName})-', '')){analysisLevelSuffixPropName}>
-
-
- <{effectiveAnalysisLevelPropName} Condition=""'$({analysisLevelPropName})' == 'none' or '$({analysisLevelPrefixPropName})' == 'none'"">$(_NoneAnalysisLevel){effectiveAnalysisLevelPropName}>
- <{effectiveAnalysisLevelPropName} Condition=""'$({analysisLevelPropName})' == 'latest' or '$({analysisLevelPrefixPropName})' == 'latest'"">$(_LatestAnalysisLevel){effectiveAnalysisLevelPropName}>
- <{effectiveAnalysisLevelPropName} Condition=""'$({analysisLevelPropName})' == 'preview' or '$({analysisLevelPrefixPropName})' == 'preview'"">$(_PreviewAnalysisLevel){effectiveAnalysisLevelPropName}>
-
-
- <{effectiveAnalysisLevelPropName} Condition=""'$({effectiveAnalysisLevelPropName})' == '' And
- '$({analysisLevelPrefixPropName})' != ''"">$({analysisLevelPrefixPropName}){effectiveAnalysisLevelPropName}>
- <{effectiveAnalysisLevelPropName} Condition=""'$({effectiveAnalysisLevelPropName})' == '' And
- '$({analysisLevelPropName})' != ''"">$({analysisLevelPropName}){effectiveAnalysisLevelPropName}>
-";
+ propertyStr += $"""
+
+
+ <{analysisLevelPropName} Condition="'$({analysisLevelPropName})' == ''">$(AnalysisLevel){analysisLevelPropName}>
+
+
+ <{analysisLevelPrefixPropName} Condition="$({analysisLevelPropName}.Contains('-'))">$([System.Text.RegularExpressions.Regex]::Replace($({analysisLevelPropName}), '-(.)*', '')){analysisLevelPrefixPropName}>
+ <{analysisLevelSuffixPropName} Condition="'$({analysisLevelPrefixPropName})' != ''">$([System.Text.RegularExpressions.Regex]::Replace($({analysisLevelPropName}), '$({analysisLevelPrefixPropName})-', '')){analysisLevelSuffixPropName}>
+
+
+ <{effectiveAnalysisLevelPropName} Condition="'$({analysisLevelPropName})' == 'none' or '$({analysisLevelPrefixPropName})' == 'none'">$(_NoneAnalysisLevel){effectiveAnalysisLevelPropName}>
+ <{effectiveAnalysisLevelPropName} Condition="'$({analysisLevelPropName})' == 'latest' or '$({analysisLevelPrefixPropName})' == 'latest'">$(_LatestAnalysisLevel){effectiveAnalysisLevelPropName}>
+ <{effectiveAnalysisLevelPropName} Condition="'$({analysisLevelPropName})' == 'preview' or '$({analysisLevelPrefixPropName})' == 'preview'">$(_PreviewAnalysisLevel){effectiveAnalysisLevelPropName}>
+
+
+ <{effectiveAnalysisLevelPropName} Condition="'$({effectiveAnalysisLevelPropName})' == '' And
+ '$({analysisLevelPrefixPropName})' != ''">$({analysisLevelPrefixPropName}){effectiveAnalysisLevelPropName}>
+ <{effectiveAnalysisLevelPropName} Condition="'$({effectiveAnalysisLevelPropName})' == '' And
+ '$({analysisLevelPropName})' != ''">$({analysisLevelPropName}){effectiveAnalysisLevelPropName}>
+
+ """;
}
- propertyStr += $@"
-
- <{packageVersionPropName} Condition=""'$({packageVersionPropName})' == '' and $({effectiveAnalysisLevelPropName}) != ''"">$([System.Text.RegularExpressions.Regex]::Replace($({effectiveAnalysisLevelPropName}), '(.0)*$', '')){packageVersionPropName}>
-";
+ propertyStr += $"""
+
+
+ <{packageVersionPropName} Condition="'$({packageVersionPropName})' == '' and $({effectiveAnalysisLevelPropName}) != ''">$([System.Text.RegularExpressions.Regex]::Replace($({effectiveAnalysisLevelPropName}), '(.0)*$', '')){packageVersionPropName}>
+
+ """;
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,
};
}