Beispiel #1
0
        bool IXmlHandler.CanAutoComplete(bool textChanged)
        {
            var node = bindingEditor.GetNodeAt(bindingEditor.SelectionStart - 1);

            _lastValueNode = node as XmlValueExpressionNode;
            if (_lastValueNode != null)
            {
                return(_lastValueNode.Type == XmlValueExpressionType.ElementStartTag ||
                       _lastValueNode.Type == XmlValueExpressionType.AttributeName);
            }

            if (textChanged)
            {
                return(false);
            }
            var invalidExpressionNode = node as XmlInvalidExpressionNode;

            if (invalidExpressionNode != null && invalidExpressionNode.Nodes != null)
            {
                _lastElement = invalidExpressionNode.Nodes.OfType <XmlElementExpressionNode>().FirstOrDefault();
            }
            else
            {
                _lastElement = node as XmlElementExpressionNode;
            }
            return(_lastElement != null);
        }
Beispiel #2
0
        private XmlExpressionNode TryParseAttribute(XmlElementExpressionNode element)
        {
            int startPosition = _tokenizer.FirstCharPosition;
            var name          = new XmlValueExpressionNode(element, XmlValueExpressionType.AttributeName, startPosition,
                                                           _tokenizer.Position);

            if (_tokenizer.NextToken(true) != TokenType.Equal)
            {
                return(InvalidExpression(XmlInvalidExpressionType.Attribute, startPosition, EndElementTokens, name));
            }
            var equal = new XmlValueExpressionNode(element, XmlValueExpressionType.AttributeEqual, name.End, _tokenizer.Position);

            if (_tokenizer.NextToken(true) != TokenType.StringLiteral)
            {
                return(InvalidExpression(XmlInvalidExpressionType.Attribute, startPosition, EndElementTokens, name,
                                         equal));
            }
            var value = new XmlValueExpressionNode(XmlValueExpressionType.AttributeValue, _tokenizer.FirstCharPosition,
                                                   _tokenizer.Position);
            int position = _tokenizer.Position;

            _tokenizer.NextToken(true);
            return(new XmlAttributeExpressionNode(name, equal, value, startPosition, position));
        }
Beispiel #3
0
        private XmlExpressionNode TryParseElement()
        {
            int startPosition = _tokenizer.FirstCharPosition;
            var tagEnd        = _tokenizer.Position;

            _tokenizer.NextToken(false);
            if (!IsXmlIdentifier())
            {
                var node = new XmlValueExpressionNode(XmlValueExpressionType.ElementStartTag, startPosition, tagEnd);
                return(InvalidExpression(XmlInvalidExpressionType.Element, startPosition, node));
            }

            var startTag = new XmlValueExpressionNode(XmlValueExpressionType.ElementStartTag, startPosition,
                                                      _tokenizer.Position);
            string nameString = _tokenizer.Value;

            _tokenizer.NextToken(true);
            var elementNode = new XmlElementExpressionNode(startTag, nameString, startPosition, -1);

            while (_tokenizer.Token != TokenType.Eof)
            {
                if (IsXmlIdentifier())
                {
                    XmlExpressionNode attribute = TryParseAttribute(elementNode);
                    elementNode.AddAttribute(attribute);
                    continue;
                }

                if (_tokenizer.Token == XmlTokens.CloseElement)
                {
                    elementNode.UpdateCloseTag(
                        new XmlValueExpressionNode(XmlValueExpressionType.ElementEndTag, _tokenizer.FirstCharPosition,
                                                   _tokenizer.Position),
                        _tokenizer.Position);
                    _tokenizer.NextToken(false);
                    return(elementNode);
                }

                if (_tokenizer.Token == TokenType.GreaterThan)
                {
                    elementNode.UpdateStartTagEnd(new XmlValueExpressionNode(XmlValueExpressionType.ElementStartTagEnd,
                                                                             _tokenizer.FirstCharPosition,
                                                                             _tokenizer.Position));
                    _tokenizer.NextToken(false);
                    IList <XmlExpressionNode> nodes = TryParseElementValue();
                    for (int i = 0; i < nodes.Count; i++)
                    {
                        elementNode.AddElement(nodes[i]);
                    }

                    int closeElementPosition = _tokenizer.FirstCharPosition;
                    if (_tokenizer.Token != XmlTokens.ComplexCloseElement)
                    {
                        return(InvalidExpression(XmlInvalidExpressionType.Element, startPosition, elementNode));
                    }
                    _tokenizer.NextToken(false);
                    if (_tokenizer.Value != nameString)
                    {
                        return(InvalidExpression(XmlInvalidExpressionType.Element, startPosition, elementNode));
                    }
                    if (_tokenizer.NextToken(false) != TokenType.GreaterThan)
                    {
                        return(InvalidExpression(XmlInvalidExpressionType.Element, startPosition, elementNode));
                    }
                    elementNode.UpdateCloseTag(
                        new XmlValueExpressionNode(XmlValueExpressionType.ElementEndTag, closeElementPosition,
                                                   _tokenizer.Position),
                        _tokenizer.Position);
                    _tokenizer.NextToken(false);
                    return(elementNode);
                }
                if (_tokenizer.Token == TokenType.Whitespace)
                {
                    _tokenizer.NextToken(true);
                }
                return(InvalidExpression(XmlInvalidExpressionType.Element, startPosition, elementNode));
            }
            return(InvalidExpression(XmlInvalidExpressionType.Element, startPosition, elementNode));
        }