Skip to content

Commit

Permalink
Merge branch 'master' into prerelease
Browse files Browse the repository at this point in the history
Arthurvdv committed May 25, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
2 parents c09d39d + bc2b3e5 commit ce5812d
Showing 3 changed files with 84 additions and 4 deletions.
3 changes: 3 additions & 0 deletions Design/Rule0003DoNotUseObjectIDsInVariablesOrProperties.cs
Original file line number Diff line number Diff line change
@@ -87,6 +87,9 @@ private void CheckForObjectIDsInVariablesOrProperties(SyntaxNodeAnalysisContext
else
correctName = parameter.ParameterType.Name;

if (string.IsNullOrEmpty(correctName))
continue;

if (ctx.Node.GetLastToken().ToString().Trim('"').ToUpper() != correctName.ToUpper())
ctx.ReportDiagnostic(Diagnostic.Create(DiagnosticDescriptors.Rule0003DoNotUseObjectIDsInVariablesOrProperties, ctx.Node.GetLocation(), new object[] { ctx.Node.ToString().Trim('"'), correctName }));

72 changes: 71 additions & 1 deletion Design/Rule0005VariableCasingShouldNotDifferFromDeclaration.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
using BusinessCentral.LinterCop.AnalysisContextExtension;
using Microsoft.Dynamics.Nav.CodeAnalysis;
using Microsoft.Dynamics.Nav.CodeAnalysis.Diagnostics;
using Microsoft.Dynamics.Nav.CodeAnalysis.Symbols;
using Microsoft.Dynamics.Nav.CodeAnalysis.Syntax;
using Microsoft.Dynamics.Nav.CodeAnalysis.Symbols;
using Microsoft.Dynamics.Nav.CodeAnalysis.Utilities;
using System.Collections.Immutable;

namespace BusinessCentral.LinterCop.Design
@@ -31,6 +32,9 @@ public override void Initialize(AnalysisContext context)
context.RegisterSyntaxNodeAction(new Action<SyntaxNodeAnalysisContext>(this.AnalyzeAreaSectionName), SyntaxKind.PageArea);
context.RegisterSyntaxNodeAction(new Action<SyntaxNodeAnalysisContext>(this.AnalyzeActionAreaSectionName), SyntaxKind.PageActionArea);
context.RegisterSyntaxNodeAction(new Action<SyntaxNodeAnalysisContext>(this.AnalyzeTriggerDeclaration), SyntaxKind.TriggerDeclaration);
context.RegisterSyntaxNodeAction(new Action<SyntaxNodeAnalysisContext>(this.AnalyzeIdentifierName), SyntaxKind.IdentifierName);
context.RegisterSyntaxNodeAction(new Action<SyntaxNodeAnalysisContext>(this.AnalyzeQualifiedName), SyntaxKind.QualifiedName);
context.RegisterSyntaxNodeAction(new Action<SyntaxNodeAnalysisContext>(this.AnalyzeQualifiedNameWithoutNamespace), SyntaxKind.QualifiedName);

context.RegisterOperationAction(new Action<OperationAnalysisContext>(this.CheckForBuiltInMethodsWithCasingMismatch), new OperationKind[] {
OperationKind.InvocationExpression,
@@ -188,6 +192,72 @@ private void AnalyzeTriggerDeclaration(SyntaxNodeAnalysisContext ctx)
ctx.ReportDiagnostic(Diagnostic.Create(DiagnosticDescriptors.Rule0005VariableCasingShouldNotDifferFromDeclaration, syntax.Name.GetLocation(), new object[] { targetName, "" }));
}

private void AnalyzeIdentifierName(SyntaxNodeAnalysisContext ctx)
{
if (ctx.Node is not IdentifierNameSyntax node)
return;

ISymbol fieldSymbol = ctx.SemanticModel.GetSymbolInfo(ctx.Node, ctx.CancellationToken).Symbol;
if (fieldSymbol == null)
return;

// TODO: Support more SymbolKinds
if (fieldSymbol.Kind != SymbolKind.Field)
return;

string identifierName = StringExtensions.UnquoteIdentifier(node.Identifier.ValueText);

if (!identifierName.AsSpan().Equals(fieldSymbol.Name.AsSpan(), StringComparison.Ordinal))
ctx.ReportDiagnostic(Diagnostic.Create(DiagnosticDescriptors.Rule0005VariableCasingShouldNotDifferFromDeclaration, node.GetLocation(), new object[] { StringExtensions.QuoteIdentifierIfNeeded(fieldSymbol.Name), "" }));
}

private void AnalyzeQualifiedName(SyntaxNodeAnalysisContext ctx)
{
if (ctx.Node is not QualifiedNameSyntax node)
return;

ISymbol fieldSymbol = ctx.SemanticModel.GetSymbolInfo(ctx.Node, ctx.CancellationToken).Symbol;
if (fieldSymbol == null)
return;

string identifierName = StringExtensions.UnquoteIdentifier(node.Right.Identifier.ValueText);

if (!identifierName.AsSpan().Equals(fieldSymbol.Name.AsSpan(), StringComparison.Ordinal))
ctx.ReportDiagnostic(Diagnostic.Create(DiagnosticDescriptors.Rule0005VariableCasingShouldNotDifferFromDeclaration, node.Right.GetLocation(), new object[] { StringExtensions.QuoteIdentifierIfNeeded(fieldSymbol.Name), "" }));
}

private void AnalyzeQualifiedNameWithoutNamespace(SyntaxNodeAnalysisContext ctx)
{
if (ctx.Node is not QualifiedNameSyntax node)
return;

if (node.Left.Kind != SyntaxKind.IdentifierName)
return;

ISymbol fieldSymbol = ctx.SemanticModel.GetSymbolInfo(ctx.Node, ctx.CancellationToken).Symbol;
if (fieldSymbol == null)
return;

if (fieldSymbol.ContainingSymbol is not IObjectTypeSymbol objectTypeSymbol)
return;

if (fieldSymbol.ContainingSymbol.Kind == SymbolKind.TableExtension)
{
ITableExtensionTypeSymbol tableExtension = (ITableExtensionTypeSymbol)fieldSymbol.ContainingSymbol;
objectTypeSymbol = tableExtension.Target as IObjectTypeSymbol;
}

IdentifierNameSyntax identifierNameSyntax = (IdentifierNameSyntax)node.Left;
SyntaxToken identifier = identifierNameSyntax.Identifier;
if (identifier == null)
return;

string identifierName = StringExtensions.UnquoteIdentifier(identifier.ValueText);

if (!identifierName.AsSpan().Equals(objectTypeSymbol.Name.AsSpan(), StringComparison.Ordinal))
ctx.ReportDiagnostic(Diagnostic.Create(DiagnosticDescriptors.Rule0005VariableCasingShouldNotDifferFromDeclaration, identifierNameSyntax.GetLocation(), new object[] { StringExtensions.QuoteIdentifierIfNeeded(objectTypeSymbol.Name), "" }));
}

private void CheckForBuiltInTypeCasingMismatch(SymbolAnalysisContext ctx)
{
AnalyseTokens(ctx);
13 changes: 10 additions & 3 deletions Design/Rule0044AnalyzeTransferField.cs
Original file line number Diff line number Diff line change
@@ -15,7 +15,7 @@ public class Rule0044AnalyzeTransferFields : DiagnosticAnalyzer
{
private List<Tuple<string, string>> tablePairs = new List<Tuple<string, string>>();

public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } = ImmutableArray.Create<DiagnosticDescriptor>(DiagnosticDescriptors.Rule0044AnalyzeTransferFields);
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } = ImmutableArray.Create<DiagnosticDescriptor>(DiagnosticDescriptors.Rule0044AnalyzeTransferFields, DiagnosticDescriptors.Rule0000ErrorInRule);

public override void Initialize(AnalysisContext context)
{
@@ -77,7 +77,14 @@ private async void AnalyzeTransferFields(OperationAnalysisContext ctx)
List<VariableDeclarationBaseSyntax> variables = new List<VariableDeclarationBaseSyntax>();

SyntaxNode localVariables = await localVariablesTask;
variables.AddRange(FindLocalVariables(localVariables));
try
{
variables.AddRange(FindLocalVariables(localVariables));
}
catch (InvalidCastException)
{
ctx.ReportDiagnostic(Diagnostic.Create(DiagnosticDescriptors.Rule0000ErrorInRule, ctx.Operation.Syntax.GetLocation(), new Object[] { "Rule0044", "InvalidCastException", "at Line 82" }));
}
SyntaxNode globalVariables = await globalVariablesTask;
variables.AddRange(FindGlobalVariables(globalVariables));

@@ -444,7 +451,7 @@ private void LoadTablePairs()
new Tuple<string, string>("Contact", "Employee"),
new Tuple<string, string>("Contact", "Bank Account"),
new Tuple<string, string>("Contact", "Customer Templ."),

new Tuple<string, string>("Contact Business Relation", "Office Contact Details"),

new Tuple<string, string>("Deferral Line", "Deferral Line Archive"),

0 comments on commit ce5812d

Please sign in to comment.