Example #1
0
        /// <summary>
        /// Checks if this tagged template is a path interpolation such that it can contains path separators
        /// </summary>
        public static bool IsPathInterpolation(this ITaggedTemplateExpression taggedTemplateExpression)
        {
            switch (taggedTemplateExpression.GetInterpolationKind())
            {
            case InterpolationKind.FileInterpolation:
            case InterpolationKind.DirectoryInterpolation:
            case InterpolationKind.PathInterpolation:
            case InterpolationKind.RelativePathInterpolation:
                return(true);

            default:
                return(false);
            }
        }
        private static int CompareTaggedTemplateExpression(ITaggedTemplateExpression left, ITaggedTemplateExpression right)
        {
            // Standard left,right and null checks
            if (left == null && right == null)
            {
                return(0);
            }
            if (left == null)
            {
                return(1);
            }
            if (right == null)
            {
                return(-1);
            }

            // Compare tag
            var result = CompareNodeAsText(left.Tag, right.Tag);

            if (result != 0)
            {
                return(result);
            }

            // Special case check for path literal.
            var  interpolationKind       = left.GetInterpolationKind();
            bool usePathCompareSemantics = false;

            switch (interpolationKind)
            {
            case InterpolationKind.PathInterpolation:
            case InterpolationKind.FileInterpolation:
            case InterpolationKind.DirectoryInterpolation:
            case InterpolationKind.RelativePathInterpolation:
                usePathCompareSemantics = true;
                break;
            }

            var leftIsLiteral  = IsTemplateLiteral(left.TemplateExpression);
            var rightIsLiteral = IsTemplateLiteral(right.TemplateExpression);

            ITemplateExpression leftTemplate;
            ITemplateExpression rightTemplate;

            if (leftIsLiteral)
            {
                if (rightIsLiteral)
                {
                    return(CompareStringLiteralExpression(left.TemplateExpression.Cast <ILiteralExpression>(), right.TemplateExpression.Cast <ILiteralExpression>(), usePathCompareSemantics));
                }

                leftTemplate = new TemplateExpression()
                {
                    Head = new TemplateLiteralFragment()
                    {
                        Text = left.TemplateExpression.GetTemplateText()
                    }, TemplateSpans = NodeArray <ITemplateSpan> .Empty
                };
                rightTemplate = right.TemplateExpression.Cast <ITemplateExpression>();
            }
            else if (rightIsLiteral)
            {
                leftTemplate  = left.TemplateExpression.Cast <ITemplateExpression>();
                rightTemplate = new TemplateExpression()
                {
                    Head = new TemplateLiteralFragment()
                    {
                        Text = right.TemplateExpression.GetTemplateText()
                    }, TemplateSpans = NodeArray <ITemplateSpan> .Empty
                };
            }
            else
            {
                leftTemplate  = left.TemplateExpression.Cast <ITemplateExpression>();
                rightTemplate = right.TemplateExpression.Cast <ITemplateExpression>();
            }

            return(CompareTemplateExpression(leftTemplate, rightTemplate, usePathCompareSemantics));
        }