MParser/Parser/SyntaxNodeOrToken.cs

59 lines
1.5 KiB
C#

namespace Parser
{
public struct SyntaxNodeOrToken
{
private readonly Internal.GreenNode _token;
private readonly SyntaxNode _nodeOrParent;
private readonly bool _isToken;
internal SyntaxNodeOrToken(SyntaxNode node)
{
_token = null;
_nodeOrParent = node;
_isToken = false;
Position = node.Position;
}
internal SyntaxNodeOrToken(SyntaxNode parent, Internal.GreenNode token, int position)
{
_token = token;
_nodeOrParent = parent;
_isToken = true;
Position = position;
}
public bool IsToken => _isToken;
public bool IsNode => !IsToken;
public int Position { get; }
public SyntaxNode AsNode()
{
if (_isToken)
{
return default(SyntaxNode);
}
return _nodeOrParent;
}
public SyntaxToken AsToken()
{
if (!_isToken)
{
return default(SyntaxToken);
}
return new SyntaxToken(_nodeOrParent, _token, Position);
}
public static implicit operator SyntaxNodeOrToken(SyntaxToken token)
{
return new SyntaxNodeOrToken(token.Parent, token.Token, token.Position);
}
public static implicit operator SyntaxNodeOrToken(SyntaxNode node)
{
return new SyntaxNodeOrToken(node);
}
}
}