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); }
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); }
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; }