public static void CalcAssignmentValue(ExpressionSyntax variable, BlockSyntax block, SemanticModel semanticModel, CancellationToken cancellationToken, RefCounterStatus refCounterStatus) { if (InitializeFromCreation(variable)) { refCounterStatus.IncAssignCounter("initialize from new", variable.GetLocation()); refCounterStatus.AcquireReference("init from new", variable.GetLocation()); } else if (InitializeFromTypeCastParameter(variable, semanticModel, cancellationToken, out var param)) { refCounterStatus.IncAssignCounter("init cast from param", variable.GetLocation()); refCounterStatus.RemainRef("init cast from param", variable.GetLocation()); if (RightOfAssignmentUtils.RightSideOfAssignmentCount(param, block, semanticModel, cancellationToken) > 1) { refCounterStatus.Skip("cast from param also assigned to others", variable.GetLocation()); } } else if (InitializeFromNonGetMethod(variable, semanticModel, cancellationToken)) { refCounterStatus.IncAssignCounter("initialize from non-get method", variable.GetLocation()); refCounterStatus.AcquireReference("init from non-get method", variable.GetLocation()); } else if (InitializeFromGetMethod(variable, semanticModel, cancellationToken)) { refCounterStatus.IncAssignCounter("initialize from get method", variable.GetLocation()); refCounterStatus.RemainRef("init from get method", variable.GetLocation()); } else if (InitializeFromProperty(variable, semanticModel, cancellationToken)) { refCounterStatus.IncAssignCounter("initialize from field/property", variable.GetLocation()); refCounterStatus.RemainRef("init from property", variable.GetLocation()); // nothing } else if (InitializeFromElement(variable, semanticModel, cancellationToken)) { refCounterStatus.IncAssignCounter("initialize from element access", variable.GetLocation()); refCounterStatus.RemainRef("init from element access", variable.GetLocation()); } else // assigned from other local variable, class field, or other expression { refCounterStatus.IncAssignCounter("initialize from unkown", variable.GetLocation()); refCounterStatus.Skip("unsupported initialization", variable.GetLocation()); } }
private static void ProcessLocalOrParamenterVar(SyntaxNodeAnalysisContext context, ISymbol local, BlockSyntax block, RefCounterStatus status) { RightOfAssignmentUtils.ProcessRightSideOfAssignment(local, block, context.SemanticModel, context.CancellationToken, status); SystemCollectionUtils.ProcessAddedToCollection(local, block, context.SemanticModel, context.CancellationToken, status); LeftOfAssignmentUtils.ProcessLeftSideOfAssignment(local, block, context.SemanticModel, context.CancellationToken, status); ChangeReferenceMethodUtils.ProcessIncDelRefInvocation(local, block, context.SemanticModel, context.CancellationToken, status); AssignmentUtils.ProcessOutRefInvocation(local, block, context.SemanticModel, context.CancellationToken, status); ReturnUtils.ProcessReturnStatement(local, block, context.SemanticModel, context.CancellationToken, status); ReportError(context, local, status); }