private ProgramState VisitMemberAccess(MemberAccessExpressionSyntax memberAccess, ProgramState programState)
        {
            var           newProgramState = programState.PopValue(out var memberExpression);
            SymbolicValue sv = null;

            if (memberAccess.Name is IdentifierNameSyntax identifier)
            {
                var symbol = SemanticModel.GetSymbolInfo(identifier).Symbol;
                if (symbol is IFieldSymbol fieldSymbol && (memberAccess.IsOnThis() || fieldSymbol.IsConst))
                {
                    sv = newProgramState.GetSymbolValue(symbol);
                    if (sv == null)
                    {
                        sv = fieldSymbol.CreateFieldSymbolicValue();
                        newProgramState = newProgramState.StoreSymbolicValue(symbol, sv);
                    }
                }
            }
            if (sv == null)
            {
                sv = new MemberAccessSymbolicValue(memberExpression, memberAccess.Name.Identifier.ValueText);
            }

            newProgramState = SetNonNullConstraintIfValueType(memberAccess, sv, newProgramState);
            return(newProgramState.PushValue(sv));
        }