/// <summary>
        ///     Get the expression's containing range.
        /// </summary>
        /// <param name="expression">
        ///     The MSBuild expression.
        /// </param>
        /// <param name="relativeToPosition">
        ///     The starting position of the <see cref="SourceNode"/> that contains the expression.
        /// </param>
        /// <returns>
        ///     The containing <see cref="Range"/>.
        /// </returns>
        public Range GetRange(ExpressionNode expression, Position relativeToPosition)
        {
            if (expression == null)
            {
                throw new ArgumentNullException(nameof(expression));
            }

            if (relativeToPosition == null)
            {
                throw new ArgumentNullException(nameof(relativeToPosition));
            }

            int absoluteBasePosition = SourcePositions.GetAbsolutePosition(relativeToPosition);

            return(SourcePositions.GetRange(
                       absoluteBasePosition + expression.AbsoluteStart,
                       absoluteBasePosition + expression.AbsoluteEnd
                       ));
        }