void VisitElementValue(XElement element, MSBuildLanguageElement resolved)
        {
            if (element.FirstChild != null || resolved.ValueKind == MSBuildValueKind.Data || resolved.ValueKind == MSBuildValueKind.Nothing)
            {
                return;
            }

            if (element.IsSelfClosing || !(element.ClosingTag is XClosingTag closing))
            {
                return;
            }

            var begin = element.Span.End;
            int end   = element.ClosingTag.Span.Start;
            var value = TextSource.GetTextBetween(begin, end);

            var info = Document.GetSchemas().GetElementInfo(resolved, (element.Parent as XElement)?.Name.Name, element.Name.Name, true);

            if (info == null)
            {
                return;
            }

            VisitValue(element, null, resolved, null, info, value, begin);
        }
示例#2
0
        void VisitElementValue(XElement element, MSBuildLanguageElement resolved)
        {
            if (element.IsSelfClosing || !element.IsEnded)
            {
                return;
            }

            var begin = element.Span.End;
            int end   = begin;

            if (element.IsClosed && element.FirstChild == null)
            {
                end = element.ClosingTag.Span.Start;
            }
            else
            {
                //HACK: in some cases GetCharAt can throw at the end of the document even with TextDocument.Length check
                try {
                    for (; end < (TextSource.Length + 1) && TextSource.GetCharAt(end) != '<'; end++)
                    {
                    }
                } catch {
                    end--;
                }
            }
            var text = TextSource.GetTextBetween(begin, end);

            VisitElementValue(element, resolved, text, begin);
        }
        void VisitElementValue(XElement element, MSBuildElementSyntax resolved)
        {
            if (element.IsSelfClosing || !element.IsEnded)
            {
                return;
            }

            //FIXME: handle case with multiple text nodes with comments between them
            string value    = string.Empty;
            var    begin    = element.Span.End;
            var    textNode = element.Nodes.OfType <XText> ().FirstOrDefault();

            if (textNode != null)
            {
                begin = textNode.Span.Start;
                value = TextSource.GetTextBetween(begin, textNode.Span.End);
            }

            VisitElementValue(element, resolved, value, begin);
        }