private void T(string text, params string[] expectedParts)
        {
            var actual = MSBuildExpressionParser.SplitStringByPropertiesAndItems(text);
            var equal  = expectedParts.SequenceEqual(actual);

            Assert.IsTrue(equal);
        }
예제 #2
0
        private static IEnumerable <ReferenceSpan> ProcessExpressions(int start, string text, ExpressionProcessor customStringProcessor = null, string referencingItemName = null)
        {
            var parts = MSBuildExpressionParser.SplitStringByPropertiesAndItems(text);

            int lengthSoFar = 0;

            foreach (var part in parts)
            {
                if (part.StartsWith("$(") && part.EndsWith(")"))
                {
                    var    propertyName = part.Substring(2, part.Length - 3);
                    string suffix       = "";
                    int    dot          = propertyName.IndexOf('.');
                    if (dot > -1)
                    {
                        suffix       = propertyName.Substring(dot);
                        propertyName = propertyName.Substring(0, dot);
                    }

                    var currentPosition = start + lengthSoFar + 2;
                    yield return(new ReferenceSpan()
                    {
                        Start = currentPosition,
                        Length = propertyName.Length,
                        Reference = CreatePropertyReference(propertyName, isAssignment: false)
                    });
                }
                else if (
                    part.StartsWith("@(") &&
                    (part.EndsWith(")") || part.EndsWith("-") || part.EndsWith(",")) &&
                    !part.Contains("%"))
                {
                    int    suffixLength = 1;
                    var    itemName     = part.Substring(2, part.Length - 2 - suffixLength);
                    string suffix       = part.Substring(part.Length - suffixLength, suffixLength);

                    var currentPosition = start + lengthSoFar + 2;
                    yield return(new ReferenceSpan()
                    {
                        Start = currentPosition,
                        Length = itemName.Length,
                        Reference = CreateItemReference(itemName, isAssignment: false)
                    });
                }

                else if (part.StartsWith("%(") && part.EndsWith(")"))
                {
                    int    suffixLength = 1;
                    var    metadataName = part.Substring(2, part.Length - 2 - suffixLength);
                    var    length       = metadataName.Length;
                    string suffix       = part.Substring(part.Length - suffixLength, suffixLength);

                    string itemName = referencingItemName;

                    int lastDot = metadataName.LastIndexOf(".");
                    if (lastDot > -1)
                    {
                        itemName     = metadataName.Substring(0, lastDot);
                        metadataName = metadataName.Substring(lastDot + 1);
                    }

                    var currentPosition = start + lengthSoFar + 2;
                    yield return(new ReferenceSpan()
                    {
                        Start = currentPosition,
                        Length = length,
                        Reference = CreateItemMetadataReference(itemName, metadataName, isAssignment: false)
                    });
                }
                else
                {
                    var processed = part;
                    if (customStringProcessor != null)
                    {
                        var currentPosition = start + lengthSoFar;
                        foreach (var span in customStringProcessor(currentPosition, processed))
                        {
                            yield return(span);
                        }
                    }
                }

                lengthSoFar += part.Length;
            }
        }