Browse Source

Don't report property name mismatches if the field being assigned to is private

pull/10244/head
Tom Edwards 3 years ago
parent
commit
ebcb512c83
  1. 17
      src/tools/PublicAnalyzers/AvaloniaPropertyAnalyzer.CompileAnalyzer.cs
  2. 2
      src/tools/PublicAnalyzers/AvaloniaPropertyAnalyzer.cs

17
src/tools/PublicAnalyzers/AvaloniaPropertyAnalyzer.CompileAnalyzer.cs

@ -61,7 +61,7 @@ public partial class AvaloniaPropertyAnalyzer
_avaloniaPropertyAddOwnerMethods = _allAvaloniaPropertyTypes
.SelectMany(t => t.GetMembers("AddOwner").OfType<IMethodSymbol>()).ToImmutableHashSet(methodComparer);
FindAvaloniaPropertySymbols(context.Compilation, context.CancellationToken);
RegisterAvaloniaPropertySymbols(context.Compilation, context.CancellationToken);
context.RegisterOperationAction(AnalyzeFieldInitializer, OperationKind.FieldInitializer);
context.RegisterOperationAction(AnalyzePropertyInitializer, OperationKind.PropertyInitializer);
@ -80,7 +80,7 @@ public partial class AvaloniaPropertyAnalyzer
private bool IsAvaloniaPropertyStorage(IFieldSymbol symbol) => symbol.Type is INamedTypeSymbol namedType && IsAvaloniaPropertyType(namedType, _allAvaloniaPropertyTypes);
private bool IsAvaloniaPropertyStorage(IPropertySymbol symbol) => symbol.Type is INamedTypeSymbol namedType && IsAvaloniaPropertyType(namedType, _allAvaloniaPropertyTypes);
private void FindAvaloniaPropertySymbols(Compilation compilation, CancellationToken cancellationToken)
private void RegisterAvaloniaPropertySymbols(Compilation compilation, CancellationToken cancellationToken)
{
var namespaceStack = new Stack<INamespaceSymbol>();
namespaceStack.Push(compilation.GlobalNamespace);
@ -394,6 +394,7 @@ public partial class AvaloniaPropertyAnalyzer
}
}
/// <seealso cref="InappropriatePropertyAssignment"/>
private void AnalyzeFieldInitializer(OperationAnalysisContext context)
{
var operation = (IFieldInitializerOperation)context.Operation;
@ -422,6 +423,7 @@ public partial class AvaloniaPropertyAnalyzer
}
}
/// <seealso cref="InappropriatePropertyAssignment"/>
private void AnalyzePropertyInitializer(OperationAnalysisContext context)
{
var operation = (IPropertyInitializerOperation)context.Operation;
@ -449,6 +451,7 @@ public partial class AvaloniaPropertyAnalyzer
}
}
/// <seealso cref="InappropriatePropertyAssignment"/>
private void AnalyzeAssignment(OperationAnalysisContext context)
{
var operation = (IAssignmentOperation)context.Operation;
@ -480,9 +483,11 @@ public partial class AvaloniaPropertyAnalyzer
}
}
/// <seealso cref="PropertyNameMismatch"/>
/// <seealso cref="OwnerDoesNotMatchOuterType"/>
private void AnalyzeInitializer_Shared(OperationAnalysisContext context, ISymbol assignmentSymbol, AvaloniaPropertyDescription description)
{
if (!assignmentSymbol.Name.Contains(description.Name))
if (!assignmentSymbol.Name.Contains(description.Name) && assignmentSymbol.DeclaredAccessibility != Accessibility.Private)
{
context.ReportDiagnostic(Diagnostic.Create(PropertyNameMismatch, assignmentSymbol.Locations[0],
description.Name, assignmentSymbol));
@ -503,6 +508,11 @@ public partial class AvaloniaPropertyAnalyzer
}
}
/// <seealso cref="AmbiguousPropertyName"/>
/// <seealso cref="PropertyTypeMismatch"/>
/// <seealso cref="AssociatedAvaloniaProperty"/>
/// <seealso cref="InconsistentAccessibility"/>
/// <seealso cref="MissingAccessor"/>
private void StartPropertySymbolAnalysis(SymbolStartAnalysisContext context)
{
var property = (IPropertySymbol)context.Symbol;
@ -571,6 +581,7 @@ public partial class AvaloniaPropertyAnalyzer
}
}
/// <seealso cref="AccessorSideEffects"/>
private void AnalyzePropertyMethods(CodeBlockAnalysisContext context)
{
if (context.OwningSymbol is not IMethodSymbol { AssociatedSymbol: IPropertySymbol property } method)

2
src/tools/PublicAnalyzers/AvaloniaPropertyAnalyzer.cs

@ -76,7 +76,7 @@ public partial class AvaloniaPropertyAnalyzer : DiagnosticAnalyzer
Category,
DiagnosticSeverity.Warning,
isEnabledByDefault: true,
"An AvaloniaProperty should be stored in a field or property which contains its name. For example, a property named \"Brush\" should be assigned to a field called \"BrushProperty\".",
"An AvaloniaProperty should be stored in a field or property which contains its name. For example, a property named \"Brush\" should be assigned to a field called \"BrushProperty\".\nPrivate symbols are exempt from this diagnostic.",
NameCollisionTag);
private static readonly DiagnosticDescriptor AccessorSideEffects = new(

Loading…
Cancel
Save