59 lines
1.5 KiB
C#
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);
|
|
}
|
|
}
|
|
} |