Skip to content

Commit

Permalink
Use new way of reading should analyze generated parameter (#6865)
Browse files Browse the repository at this point in the history
  • Loading branch information
csaba-sagi-sonarsource authored and pavel-mikula-sonarsource committed Mar 14, 2023
1 parent 1b1d79d commit f4908db
Show file tree
Hide file tree
Showing 8 changed files with 8 additions and 194 deletions.
Expand Up @@ -30,19 +30,11 @@ public class SonarAnalysisContextBase
protected static readonly SourceTextValueProvider<ProjectConfigReader> ProjectConfigProvider = new(x => new ProjectConfigReader(x));
protected static readonly SourceTextValueProvider<SonarLintXmlReader> SonarLintXmlProviderCS = new(x => new SonarLintXmlReader(x, LanguageNames.CSharp));
protected static readonly SourceTextValueProvider<SonarLintXmlReader> SonarLintXmlProviderVB = new(x => new SonarLintXmlReader(x, LanguageNames.VisualBasic));
private static readonly Lazy<SourceTextValueProvider<bool>> ShouldAnalyzeGeneratedCS = new(() => CreateAnalyzeGeneratedProvider(LanguageNames.CSharp));
private static readonly Lazy<SourceTextValueProvider<bool>> ShouldAnalyzeGeneratedVB = new(() => CreateAnalyzeGeneratedProvider(LanguageNames.VisualBasic));

protected SonarAnalysisContextBase() { }

protected static SourceTextValueProvider<SonarLintXmlReader> SonarLintXmlReader(string language) =>
language == LanguageNames.CSharp ? SonarLintXmlProviderCS : SonarLintXmlProviderVB;

protected static SourceTextValueProvider<bool> ShouldAnalyzeGeneratedProvider(string language) =>
language == LanguageNames.CSharp ? ShouldAnalyzeGeneratedCS.Value : ShouldAnalyzeGeneratedVB.Value;

private static SourceTextValueProvider<bool> CreateAnalyzeGeneratedProvider(string language) =>
new(x => PropertiesHelper.ReadAnalyzeGeneratedCodeProperty(PropertiesHelper.ParseXmlSettings(x), language));
}

public abstract class SonarAnalysisContextBase<TContext> : SonarAnalysisContextBase
Expand All @@ -63,7 +55,7 @@ protected SonarAnalysisContextBase(SonarAnalysisContext analysisContext, TContex
/// <param name="tree">Tree to decide on. Can be null for Symbol-based and Compilation-based scenarios. And we want to analyze those too.</param>
/// <param name="generatedCodeRecognizer">When set, generated trees are analyzed only when language-specific 'analyzeGeneratedCode' configuration property is also set.</param>
public bool ShouldAnalyzeTree(SyntaxTree tree, GeneratedCodeRecognizer generatedCodeRecognizer) =>
(generatedCodeRecognizer is null || ShouldAnalyzeGenerated() || !tree.IsGenerated(generatedCodeRecognizer, Compilation))
(generatedCodeRecognizer is null || SonarLintFile().AnalyzeGeneratedCode || !tree.IsGenerated(generatedCodeRecognizer, Compilation))
&& (tree is null || !IsUnchanged(tree));

/// <summary>
Expand Down Expand Up @@ -132,9 +124,4 @@ public bool HasMatchingScope(DiagnosticDescriptor descriptor)

private ImmutableHashSet<string> CreateUnchangedFilesHashSet() =>
ImmutableHashSet.Create(StringComparer.OrdinalIgnoreCase, ProjectConfiguration().AnalysisConfig?.UnchangedFiles() ?? Array.Empty<string>());

private bool ShouldAnalyzeGenerated() =>
Options.SonarLintXml() is { } sonarLintXml
&& AnalysisContext.TryGetValue(sonarLintXml.GetText(), ShouldAnalyzeGeneratedProvider(Compilation.Language), out var shouldAnalyzeGenerated)
&& shouldAnalyzeGenerated;
}
Expand Up @@ -19,7 +19,6 @@
*/

using System.IO;
using System.Xml.Linq;

namespace SonarAnalyzer.Extensions;

Expand All @@ -34,9 +33,6 @@ public static class AnalyzerOptionsExtensions
public static AdditionalText ProjectOutFolderPath(this AnalyzerOptions options) =>
options.AdditionalFile("ProjectOutFolderPath.txt");

public static XElement[] ParseSonarLintXmlSettings(this AnalyzerOptions options) =>
options.SonarLintXml() is { } sonarLintXml ? PropertiesHelper.ParseXmlSettings(sonarLintXml.GetText()) : Array.Empty<XElement>();

private static AdditionalText AdditionalFile(this AnalyzerOptions options, string fileName) =>
options.AdditionalFiles.FirstOrDefault(x => x.Path is not null && Path.GetFileName(x.Path).Equals(fileName, StringComparison.OrdinalIgnoreCase));
}
57 changes: 0 additions & 57 deletions analyzers/src/SonarAnalyzer.Common/Helpers/PropertiesHelper.cs

This file was deleted.

Expand Up @@ -52,19 +52,18 @@ public abstract class UtilityAnalyzerBase : SonarDiagnosticAnalyzer

protected void ReadParameters(SonarCompilationStartAnalysisContext context)
{
var settings = context.Options.ParseSonarLintXmlSettings();
var outPath = context.ProjectConfiguration().OutPath;
// For backward compatibility with S4MSB <= 5.0
if (outPath == null && context.Options.ProjectOutFolderPath() is { } projectOutFolderAdditionalFile)
{
outPath = projectOutFolderAdditionalFile.GetText().ToString().TrimEnd();
}
if (settings.Any() && !string.IsNullOrEmpty(outPath))
if (context.Options.SonarLintXml() != null && !string.IsNullOrEmpty(outPath))
{
var language = context.Compilation.Language;
IgnoreHeaderComments = context.SonarLintFile().IgnoreHeaderComments;
AnalyzeGeneratedCode = PropertiesHelper.ReadAnalyzeGeneratedCodeProperty(settings, language);
OutPath = Path.Combine(outPath, language == LanguageNames.CSharp ? "output-cs" : "output-vbnet");
var sonarLintXml = context.SonarLintFile();
IgnoreHeaderComments = sonarLintXml.IgnoreHeaderComments;
AnalyzeGeneratedCode = sonarLintXml.AnalyzeGeneratedCode;
OutPath = Path.Combine(outPath, context.Compilation.Language == LanguageNames.CSharp ? "output-cs" : "output-vbnet");
IsAnalyzerEnabled = true;
IsTestProject = context.IsTestProject();
}
Expand Down
Expand Up @@ -225,6 +225,8 @@ public void SonarLintFile_WhenFileChanges_RebuildsCache()
[DataRow(null)]
[DataRow("\\foo\\bar\\does-not-exit")]
[DataRow("\\foo\\bar\\x.xml")]
[DataRow("path//aSonarLint.xml")] // different name
[DataRow("path//SonarLint.xmla")] // different extension
public void SonarLintFile_WhenAdditionalFileNotPresent_ReturnsDefaultValues(string folder)
{
var sut = CreateSut(AnalysisScaffolding.CreateOptions(folder)).SonarLintFile();
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

0 comments on commit f4908db

Please sign in to comment.