private IEnumerable <ISymbol> GetAssignedFieldsFromType(TypeDeclarationWithSymbol typeDeclarationWithSymbol, SemanticModel model)
        {
            var typeDeclaration = typeDeclarationWithSymbol.TypeDeclaration;
            var descendants     = typeDeclaration.DescendantNodes(p => SkipNestedTypes(typeDeclaration, p));

            return(descendants
                   .OfType <AssignmentExpressionSyntax>()
                   .Select(s => s.Left)
                   .Union(
                       descendants
                       .OfType <PostfixUnaryExpressionSyntax>()
                       .Select(s => s.Operand))
                   .Union(
                       descendants
                       .OfType <PrefixUnaryExpressionSyntax>()
                       .Select(s => s.Operand)
                       )
                   .Union(
                       descendants
                       .OfType <InvocationExpressionSyntax>()
                       .SelectMany(s => s.ArgumentList.Arguments.Where(p => !p.RefOrOutKeyword.IsKind(SyntaxKind.None)))
                       .Select(s => s.Expression)
                       )
                   .Select(s => new { Symbol = model.GetSymbolInfo(s).Symbol, Expression = s })
                   .Where(p => p.Symbol != null)
                   .Where(p => SkipFieldsFromItsOwnConstructor(typeDeclarationWithSymbol, p.Expression, p.Symbol))
                   .Select(s => s.Symbol));
        }
        private void CaptureAssignedFields(TypeDeclarationSyntax typeDeclaration, SemanticModel semanticModel, List <ISymbol> assignedFields)
        {
            var t = new TypeDeclarationWithSymbol {
                TypeDeclaration = typeDeclaration, NamedTypeSymbol = semanticModel.GetDeclaredSymbol(typeDeclaration)
            };
            var fields = GetAssignedFieldsFromType(t, semanticModel);

            assignedFields.AddRange(fields);
        }
        private bool SkipFieldsFromItsOwnConstructor(TypeDeclarationWithSymbol type, ExpressionSyntax assignmentExpression, ISymbol assignmentSymbol)
        {
            var parentConstructor = assignmentExpression.Ancestors().OfType <ConstructorDeclarationSyntax>().FirstOrDefault();

            if (parentConstructor == null)
            {
                return(true);
            }

            return
                (assignmentSymbol.ContainingType != type.NamedTypeSymbol ||
                 assignmentSymbol.IsStatic != parentConstructor.Modifiers.Any(p => p.IsKind(SyntaxKind.StaticKeyword)));
        }
 private static IEnumerable<ISymbol> GetAssignedFieldsFromType(TypeDeclarationWithSymbol typeDeclarationWithSymbol, SemanticModel model)
 {
     var typeDeclaration = typeDeclarationWithSymbol.TypeDeclaration;
     var descendants = typeDeclaration.DescendantNodes(p => SkipNestedTypes(typeDeclaration, p));
     return descendants
         .OfType<AssignmentExpressionSyntax>()
         .Select(s => s.Left)
         .Union(
             descendants
                 .OfType<PostfixUnaryExpressionSyntax>()
                 .Select(s => s.Operand))
         .Union(
             descendants
                 .OfType<PrefixUnaryExpressionSyntax>()
                 .Select(s => s.Operand)
         )
         .Union(
             descendants
                 .OfType<InvocationExpressionSyntax>()
                 .SelectMany(s => s.ArgumentList.Arguments.Where(p => !p.RefOrOutKeyword.IsKind(SyntaxKind.None)))
                 .Select(s => s.Expression)
         )
         .Select(s => new { Symbol = model.GetSymbolInfo(s).Symbol, Expression = s })
         .Where(p => p.Symbol != null)
         .Where(p => SkipFieldsFromItsOwnConstructor(typeDeclarationWithSymbol, p.Expression, p.Symbol))
         .Select(s => s.Symbol);
 }
 private static void CaptureAssignedFields(TypeDeclarationSyntax typeDeclaration, SemanticModel semanticModel, List<ISymbol> assignedFields)
 {
     var t = new TypeDeclarationWithSymbol { TypeDeclaration = typeDeclaration, NamedTypeSymbol = semanticModel.GetDeclaredSymbol(typeDeclaration) };
     var fields = GetAssignedFieldsFromType(t, semanticModel);
     assignedFields.AddRange(fields);
 }
        private static bool SkipFieldsFromItsOwnConstructor(TypeDeclarationWithSymbol type, ExpressionSyntax assignmentExpression, ISymbol assignmentSymbol)
        {
            var parentConstructor = assignmentExpression.Ancestors().OfType<ConstructorDeclarationSyntax>().FirstOrDefault();

            if (parentConstructor == null)
                return true;

            return
                assignmentSymbol.ContainingType != type.NamedTypeSymbol ||
                assignmentSymbol.IsStatic != parentConstructor.Modifiers.Any(p => p.IsKind(SyntaxKind.StaticKeyword));
        }