MParser/Parser/SyntaxNodeOrToken.cs

55 lines
1.3 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;
}
internal SyntaxNodeOrToken(SyntaxNode parent, Internal.GreenNode token)
{
_token = token;
_nodeOrParent = parent;
_isToken = true;
}
public bool IsToken => _isToken;
public bool IsNode => !IsToken;
public SyntaxNode AsNode()
{
if (_isToken)
{
return default(SyntaxNode);
}
return _nodeOrParent;
}
public SyntaxToken AsToken()
{
if (!_isToken)
{
return default(SyntaxToken);
}
return new SyntaxToken(_nodeOrParent, _token);
}
public static implicit operator SyntaxNodeOrToken(SyntaxToken token)
{
return new SyntaxNodeOrToken(token.Parent, token.Token);
}
public static implicit operator SyntaxNodeOrToken(SyntaxNode node)
{
return new SyntaxNodeOrToken(node);
}
}
}