示例#1
0
        protected override IExpressionNode CloneInternal()
        {
            var node = new XmlElementExpressionNode((XmlValueExpressionNode)_startTag.Clone(), _name, Start, End)
            {
                EndTag      = (XmlValueExpressionNode)_endTag.Clone(),
                StartTagEnd = (XmlValueExpressionNode)_startTagEnd.Clone()
            };

            foreach (XmlExpressionNode element in _elements)
            {
                node.AddElement((XmlExpressionNode)element.Clone());
            }

            foreach (XmlExpressionNode element in _attributes)
            {
                node.AddAttribute((XmlAttributeExpressionNode)element.Clone());
            }
            return(node);
        }
示例#2
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);
        }
示例#3
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);
        }
        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;
        }
        private ICollection<AutoCompleteItem> ProvideAttributeAutoCompleteItems(XmlElementExpressionNode parent, ref int startIndexToReplace, ref int endIndexToReplace)
        {
            SortedDictionary<string, AutoCompleteItem> list;
            if (!_controlsDictionary.TryGetValue(parent.Name, out list))
                return null;

            var attributeName = _lastValueNode.GetValue(bindingEditor.Text);
            var members = attributeName.Split(DotSeparator, StringSplitOptions.None);
            var path = members[0];
            var cursorIndex = bindingEditor.SelectionStart - _lastValueNode.Start;
            AutoCompleteItem member;
            if (members.Length == 1 || path.Length >= cursorIndex || !list.TryGetValue(path, out member))
            {
                startIndexToReplace = _lastValueNode.Start;
                endIndexToReplace = startIndexToReplace + path.Length;
                return FindItems(list, attributeName.Substring(0, cursorIndex));
            }

            Type type = member.Type;
            int currentLength = members[0].Length;
            int startIndex = currentLength + 1;
            for (int i = 1; i < members.Length; i++)
            {
                path = members[i];
                currentLength += path.Length;
                if (startIndex + path.Length >= cursorIndex)
                {
                    startIndexToReplace = startIndex + _lastValueNode.Start;
                    endIndexToReplace = startIndexToReplace + path.Length;
                    if (!string.IsNullOrEmpty(path) && cursorIndex > startIndex)
                        path = path.Substring(0, cursorIndex - startIndex);
                    return FindControlMemberItems(type, path);
                }
                var bindingMember = BindingServiceProvider
                    .MemberProvider
                    .GetBindingMember(type, path, false, false);
                type = bindingMember == null ? typeof(object) : bindingMember.Type;
                startIndex += path.Length + 1;
            }
            return null;
        }
        protected override IExpressionNode CloneInternal()
        {
            var node = new XmlElementExpressionNode((XmlValueExpressionNode)_startTag.Clone(), _name, Start, End)
            {
                EndTag = (XmlValueExpressionNode)_endTag.Clone(),
                StartTagEnd = (XmlValueExpressionNode)_startTagEnd.Clone()
            };
            foreach (XmlExpressionNode element in _elements)
                node.AddElement((XmlExpressionNode)element.Clone());

            foreach (XmlExpressionNode element in _attributes)
                node.AddAttribute((XmlAttributeExpressionNode)element.Clone());
            return node;
        }