// Returns the fingerprint chain + captured constants list for this expression, or null
        // if the expression couldn't be fingerprinted.
        public static ExpressionFingerprintChain GetFingerprintChain(Expression expr, out List <object> capturedConstants)
        {
            FingerprintingExpressionVisitor visitor = new FingerprintingExpressionVisitor();

            visitor.Visit(expr);

            if (visitor._gaveUp)
            {
                capturedConstants = null;
                return(null);
            }
            else
            {
                capturedConstants = visitor._seenConstants;
                return(visitor._currentChain);
            }
        }