private VariableState MergeVariableState(ExpressionSyntax expression,
                                                 VariableState newVariableState,
                                                 ExecutionState state,
                                                 VariableState currentScope = null)
        {
            var variableStateToMerge = newVariableState ?? new VariableState(expression, VariableTaint.Unset);

            if (!(expression is MemberAccessExpressionSyntax memberAccessExpressionSyntax))
            {
                var identifier = "";
                if (expression is IdentifierNameSyntax identifierNameSyntax)
                {
                    identifier = ResolveIdentifier(identifierNameSyntax.Identifier);
                }
                else if (expression is MeExpressionSyntax)
                {
                    identifier = "this";
                }

                if (currentScope != null)
                {
                    currentScope.AddOrMergeProperty(identifier, variableStateToMerge);
                    return(currentScope.PropertyStates[identifier]);
                }

                state.AddOrUpdateValue(identifier, variableStateToMerge);
                return(state.VariableStates[identifier]);
            }

            var variableState = MergeVariableState(memberAccessExpressionSyntax.Expression, null, state, currentScope);

            var stateIdentifier = ResolveIdentifier(memberAccessExpressionSyntax.Name.Identifier);

            //make sure this identifier exists
            variableState.AddOrMergeProperty(stateIdentifier, variableStateToMerge);
            return(variableState.PropertyStates[stateIdentifier]);
        }