private void T(string text, params string[] expectedParts) { var actual = MSBuildExpressionParser.SplitStringByPropertiesAndItems(text); var equal = expectedParts.SequenceEqual(actual); Assert.IsTrue(equal); }
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; } }