using System;
namespace ICSharpCode.NRefactory.CSharp
{
///
/// A New line node represents a line break in the text.
///
public sealed class NewLineNode : AstNode
{
public override NodeType NodeType {
get {
return NodeType.Whitespace;
}
}
const uint newLineMask = 0xfu << AstNodeFlagsUsedBits;
static readonly UnicodeNewline[] newLineTypes = {
UnicodeNewline.Unknown,
UnicodeNewline.LF,
UnicodeNewline.CRLF,
UnicodeNewline.CR,
UnicodeNewline.NEL,
UnicodeNewline.VT,
UnicodeNewline.FF,
UnicodeNewline.LS,
UnicodeNewline.PS
};
public UnicodeNewline NewLineType {
get {
return newLineTypes[(flags & newLineMask) >> AstNodeFlagsUsedBits];
}
set {
ThrowIfFrozen();
int pos = Array.IndexOf(newLineTypes, value);
if (pos < 0)
pos = 0;
flags &= ~newLineMask; // clear old newline type
flags |= (uint)pos << AstNodeFlagsUsedBits;
}
}
TextLocation startLocation;
public override TextLocation StartLocation {
get {
return startLocation;
}
}
public override TextLocation EndLocation {
get {
return new TextLocation (startLocation.Line + 1, 1);
}
}
public NewLineNode() : this (TextLocation.Empty)
{
}
public NewLineNode(TextLocation startLocation)
{
this.startLocation = startLocation;
}
public sealed override string ToString(CSharpFormattingOptions formattingOptions)
{
return NewLine.GetString (NewLineType);
}
public override void AcceptVisitor(IAstVisitor visitor)
{
visitor.VisitNewLine (this);
}
public override T AcceptVisitor(IAstVisitor visitor)
{
return visitor.VisitNewLine (this);
}
public override S AcceptVisitor(IAstVisitor visitor, T data)
{
return visitor.VisitNewLine (this, data);
}
protected internal override bool DoMatch(AstNode other, ICSharpCode.NRefactory.PatternMatching.Match match)
{
return other is NewLineNode;
}
}
}