Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void Method()
- {
- bool hasInstanceUsage = false;
- bool hasStaticUsage = false;
- foreach (var identifier in outerClass.DescendantNodes().OfType<IdentifierNameSyntax>())
- {
- var memberSymbol = context.SemanticModel.GetSymbolInfo(identifier);
- if (memberSymbol.Symbol.Equals(propertySymbol))
- {
- var constructor = identifier.Ancestors().OfType<ConstructorDeclarationSyntax>().FirstOrDefault();
- var isInConstructor = constructor != null;
- var isAssignmentExpression = identifier.Ancestors().OfType<AssignmentExpressionSyntax>().FirstOrDefault() != null;
- // Skip anything that isn't a setter
- if (!isAssignmentExpression)
- {
- continue;
- }
- // if it is a setter but outside the constructor, we don't report any diagnostic
- if (!isInConstructor)
- {
- return;
- }
- var isStaticConstructor = context.SemanticModel.GetDeclaredSymbol(constructor).IsStatic;
- if (isStaticConstructor && isStaticProperty)
- {
- hasStaticUsage = true;
- }
- if (!isStaticConstructor && !isStaticProperty)
- {
- hasInstanceUsage = true;
- }
- }
- }
- // We can't set it to readonly if it's set in both the instance and the static constructor
- // We need a NAND operation: either it's never set, it's set in ctor 1 or it's set in ctor 2
- if (!(hasStaticUsage & hasInstanceUsage))
- {
- context.ReportDiagnostic(Diagnostic.Create(Rule, property.Identifier.GetLocation(), propertySymbol.Name));
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement