Browse Source

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

pull/10244/head
Tom Edwards 4 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 _avaloniaPropertyAddOwnerMethods = _allAvaloniaPropertyTypes
.SelectMany(t => t.GetMembers("AddOwner").OfType<IMethodSymbol>()).ToImmutableHashSet(methodComparer); .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(AnalyzeFieldInitializer, OperationKind.FieldInitializer);
context.RegisterOperationAction(AnalyzePropertyInitializer, OperationKind.PropertyInitializer); 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(IFieldSymbol symbol) => symbol.Type is INamedTypeSymbol namedType && IsAvaloniaPropertyType(namedType, _allAvaloniaPropertyTypes);
private bool IsAvaloniaPropertyStorage(IPropertySymbol 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>(); var namespaceStack = new Stack<INamespaceSymbol>();
namespaceStack.Push(compilation.GlobalNamespace); namespaceStack.Push(compilation.GlobalNamespace);
@ -394,6 +394,7 @@ public partial class AvaloniaPropertyAnalyzer
} }
} }
/// <seealso cref="InappropriatePropertyAssignment"/>
private void AnalyzeFieldInitializer(OperationAnalysisContext context) private void AnalyzeFieldInitializer(OperationAnalysisContext context)
{ {
var operation = (IFieldInitializerOperation)context.Operation; var operation = (IFieldInitializerOperation)context.Operation;
@ -422,6 +423,7 @@ public partial class AvaloniaPropertyAnalyzer
} }
} }
/// <seealso cref="InappropriatePropertyAssignment"/>
private void AnalyzePropertyInitializer(OperationAnalysisContext context) private void AnalyzePropertyInitializer(OperationAnalysisContext context)
{ {
var operation = (IPropertyInitializerOperation)context.Operation; var operation = (IPropertyInitializerOperation)context.Operation;
@ -449,6 +451,7 @@ public partial class AvaloniaPropertyAnalyzer
} }
} }
/// <seealso cref="InappropriatePropertyAssignment"/>
private void AnalyzeAssignment(OperationAnalysisContext context) private void AnalyzeAssignment(OperationAnalysisContext context)
{ {
var operation = (IAssignmentOperation)context.Operation; 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) 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], context.ReportDiagnostic(Diagnostic.Create(PropertyNameMismatch, assignmentSymbol.Locations[0],
description.Name, assignmentSymbol)); 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) private void StartPropertySymbolAnalysis(SymbolStartAnalysisContext context)
{ {
var property = (IPropertySymbol)context.Symbol; var property = (IPropertySymbol)context.Symbol;
@ -571,6 +581,7 @@ public partial class AvaloniaPropertyAnalyzer
} }
} }
/// <seealso cref="AccessorSideEffects"/>
private void AnalyzePropertyMethods(CodeBlockAnalysisContext context) private void AnalyzePropertyMethods(CodeBlockAnalysisContext context)
{ {
if (context.OwningSymbol is not IMethodSymbol { AssociatedSymbol: IPropertySymbol property } method) 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, Category,
DiagnosticSeverity.Warning, DiagnosticSeverity.Warning,
isEnabledByDefault: true, 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); NameCollisionTag);
private static readonly DiagnosticDescriptor AccessorSideEffects = new( private static readonly DiagnosticDescriptor AccessorSideEffects = new(

Loading…
Cancel
Save