Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Resolve false positive for global variable #691

Merged
merged 1 commit into from
Jul 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using BusinessCentral.LinterCop.AnalysisContextExtension;
using Microsoft.Dynamics.Nav.CodeAnalysis;
using Microsoft.Dynamics.Nav.CodeAnalysis.Diagnostics;
using Microsoft.Dynamics.Nav.CodeAnalysis.Syntax;
using System.Collections.Immutable;

namespace BusinessCentral.LinterCop.Design
Expand All @@ -17,9 +18,9 @@ public class Rule0063GiveFieldMoreDescriptiveName : DiagnosticAnalyzer
};

public override void Initialize(AnalysisContext context)
=> context.RegisterSymbolAction(new Action<SymbolAnalysisContext>(this.AnalyzePropertyApplicationAreaOnFieldsOfApiPage), SymbolKind.Page);
=> context.RegisterSymbolAction(new Action<SymbolAnalysisContext>(this.AnalyzeFieldNames), SymbolKind.Page);

private void AnalyzePropertyApplicationAreaOnFieldsOfApiPage(SymbolAnalysisContext ctx)
private void AnalyzeFieldNames(SymbolAnalysisContext ctx)
{
if (ctx.IsObsoletePendingOrRemoved()) return;

Expand All @@ -31,6 +32,7 @@ private void AnalyzePropertyApplicationAreaOnFieldsOfApiPage(SymbolAnalysisConte

IEnumerable<IControlSymbol> pageFields = pageTypeSymbol.FlattenedControls
.Where(e => e.ControlKind == ControlKind.Field)
.Where(e => IsIdentifierValueTextRec(e, ctx))
.Where(e => e.RelatedFieldSymbol != null);

foreach (IControlSymbol field in pageFields)
Expand All @@ -56,11 +58,37 @@ private static string GetDescriptiveName(IControlSymbol field)

return null;
}
public static string ReplaceNoWithNumber(string input)
private static string ReplaceNoWithNumber(string input)
{
input = input.Replace("No", "Number");
input = input.Replace("no", "number");
return input;
}

private static bool IsIdentifierValueTextRec(IControlSymbol controlSymbol, SymbolAnalysisContext ctx)
{
if (controlSymbol.DeclaringSyntaxReference.GetSyntax(ctx.CancellationToken) is not PageFieldSyntax pageFieldSyntax)
return false;

if (pageFieldSyntax.Expression is not MemberAccessExpressionSyntax memberAccessExpressionSyntax)
return false;

if (memberAccessExpressionSyntax.Expression is not IdentifierNameSyntax identifierNameSyntax)
return false;

return SemanticFacts.IsSameName(identifierNameSyntax.Identifier.ValueText, "Rec");
}

public static class DiagnosticDescriptors
{
public static readonly DiagnosticDescriptor Rule0063GiveFieldMoreDescriptiveName = new(
id: LinterCopAnalyzers.AnalyzerPrefix + "0063",
title: LinterCopAnalyzers.GetLocalizableString("Rule0063GiveFieldMoreDescriptiveNameTitle"),
messageFormat: LinterCopAnalyzers.GetLocalizableString("Rule0063GiveFieldMoreDescriptiveNameFormat"),
category: "Design",
defaultSeverity: DiagnosticSeverity.Info, isEnabledByDefault: true,
description: LinterCopAnalyzers.GetLocalizableString("Rule0063GiveFieldMoreDescriptiveNameDescription"),
helpLinkUri: "https://github.com/StefanMaron/BusinessCentral.LinterCop/wiki/LC0063");
}
}
}
}
1 change: 0 additions & 1 deletion BusinessCentral.LinterCop/LinterCopAnalyzers.Generated.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,6 @@ public static class DiagnosticDescriptors
public static readonly DiagnosticDescriptor Rule0060PropertyApplicationAreaOnApiPage = new DiagnosticDescriptor(LinterCopAnalyzers.AnalyzerPrefix + "0060", (LocalizableString)new LocalizableResourceString("Rule0060PropertyApplicationAreaOnApiPageTitle", LinterCopAnalyzers.ResourceManager, typeof(LinterCopAnalyzers)), (LocalizableString)new LocalizableResourceString("Rule0060PropertyApplicationAreaOnApiPageFormat", LinterCopAnalyzers.ResourceManager, typeof(LinterCopAnalyzers)), "Design", DiagnosticSeverity.Info, true, (LocalizableString)new LocalizableResourceString("Rule0060PropertyApplicationAreaOnApiPageDescription", LinterCopAnalyzers.ResourceManager, typeof(LinterCopAnalyzers)), "https://github.com/StefanMaron/BusinessCentral.LinterCop/wiki/LC0060");
public static readonly DiagnosticDescriptor Rule0061SetODataKeyFieldsWithSystemIdField = new DiagnosticDescriptor(LinterCopAnalyzers.AnalyzerPrefix + "0061", (LocalizableString)new LocalizableResourceString("Rule0061SetODataKeyFieldsWithSystemIdFieldTitle", LinterCopAnalyzers.ResourceManager, typeof(LinterCopAnalyzers)), (LocalizableString)new LocalizableResourceString("Rule0061SetODataKeyFieldsWithSystemIdFieldFormat", LinterCopAnalyzers.ResourceManager, typeof(LinterCopAnalyzers)), "Design", DiagnosticSeverity.Info, true, (LocalizableString)new LocalizableResourceString("Rule0061SetODataKeyFieldsWithSystemIdFieldDescription", LinterCopAnalyzers.ResourceManager, typeof(LinterCopAnalyzers)), "https://github.com/StefanMaron/BusinessCentral.LinterCop/wiki/LC0061");
public static readonly DiagnosticDescriptor Rule0062MandatoryFieldMissingOnApiPage = new DiagnosticDescriptor(LinterCopAnalyzers.AnalyzerPrefix + "0062", (LocalizableString)new LocalizableResourceString("Rule0062MandatoryFieldMissingOnApiPageTitle", LinterCopAnalyzers.ResourceManager, typeof(LinterCopAnalyzers)), (LocalizableString)new LocalizableResourceString("Rule0062MandatoryFieldMissingOnApiPageFormat", LinterCopAnalyzers.ResourceManager, typeof(LinterCopAnalyzers)), "Design", DiagnosticSeverity.Info, true, (LocalizableString)new LocalizableResourceString("Rule0062MandatoryFieldMissingOnApiPageDescription", LinterCopAnalyzers.ResourceManager, typeof(LinterCopAnalyzers)), "https://github.com/StefanMaron/BusinessCentral.LinterCop/wiki/LC0062");
public static readonly DiagnosticDescriptor Rule0063GiveFieldMoreDescriptiveName = new DiagnosticDescriptor(LinterCopAnalyzers.AnalyzerPrefix + "0063", (LocalizableString)new LocalizableResourceString("Rule0063GiveFieldMoreDescriptiveNameTitle", LinterCopAnalyzers.ResourceManager, typeof(LinterCopAnalyzers)), (LocalizableString)new LocalizableResourceString("Rule0063GiveFieldMoreDescriptiveNameFormat", LinterCopAnalyzers.ResourceManager, typeof(LinterCopAnalyzers)), "Design", DiagnosticSeverity.Info, true, (LocalizableString)new LocalizableResourceString("Rule0063GiveFieldMoreDescriptiveNameDescription", LinterCopAnalyzers.ResourceManager, typeof(LinterCopAnalyzers)), "https://github.com/StefanMaron/BusinessCentral.LinterCop/wiki/LC0063");
public static readonly DiagnosticDescriptor Rule0064UseTableFieldToolTipInsteadOfPageFieldToolTip = new DiagnosticDescriptor(LinterCopAnalyzers.AnalyzerPrefix + "0064", (LocalizableString)new LocalizableResourceString("Rule0064UseTableFieldToolTipInsteadOfPageFieldToolTipTitle", LinterCopAnalyzers.ResourceManager, typeof(LinterCopAnalyzers)), (LocalizableString)new LocalizableResourceString("Rule0064UseTableFieldToolTipInsteadOfPageFieldToolTipFormat", LinterCopAnalyzers.ResourceManager, typeof(LinterCopAnalyzers)), "Design", DiagnosticSeverity.Info, true, (LocalizableString)new LocalizableResourceString("Rule0064UseTableFieldToolTipInsteadOfPageFieldToolTipDescription", LinterCopAnalyzers.ResourceManager, typeof(LinterCopAnalyzers)), "https://github.com/StefanMaron/BusinessCentral.LinterCop/wiki/LC0064");
}
}
4 changes: 2 additions & 2 deletions BusinessCentral.LinterCop/LinterCopAnalyzers.resx
Original file line number Diff line number Diff line change
Expand Up @@ -673,13 +673,13 @@
<value>"Field 'Rec.{0}' exposed with the name '{1}' should always be included on API Pages."</value>
</data>
<data name="Rule0063GiveFieldMoreDescriptiveNameTitle" xml:space="preserve">
<value>Consider naming field with a more descriptive name: '{0}'.</value>
<value>Give field more describing name.</value>
</data>
<data name="Rule0063GiveFieldMoreDescriptiveNameFormat" xml:space="preserve">
<value>Consider naming field with a more descriptive name: '{0}'.</value>
</data>
<data name="Rule0063GiveFieldMoreDescriptiveNameDescription" xml:space="preserve">
<value>Consider naming field with a more descriptive name: '{0}'.</value>
<value>It is common for API pages to give certain fields a more describing name.</value>
</data>
<data name="Rule0064UseTableFieldToolTipInsteadOfPageFieldToolTipTitle" xml:space="preserve">
<value>Use table field ToolTip instead of page field ToolTip.</value>
Expand Down