84 lines
2.8 KiB
C#
84 lines
2.8 KiB
C#
using Google.Protobuf.Reflection;
|
|
using System;
|
|
|
|
namespace ProtoBuf.Reflection
|
|
{
|
|
internal struct Token
|
|
{
|
|
|
|
public static bool operator ==(Token x, Token y)
|
|
{
|
|
return x.Offset == y.Offset && x.File == y.File;
|
|
}
|
|
public static bool operator !=(Token x, Token y)
|
|
{
|
|
return x.Offset != y.Offset || x.File != y.File;
|
|
}
|
|
public override int GetHashCode() => Offset;
|
|
public override bool Equals(object obj) => (obj is Token) && ((Token)obj).Offset == this.Offset;
|
|
public bool Equals(Token token) => token.Offset == this.Offset;
|
|
public int Offset { get; }
|
|
public int LineNumber { get; }
|
|
public string File { get; }
|
|
public int ColumnNumber { get; }
|
|
public TokenType Type { get; }
|
|
public string Value { get; }
|
|
public string LineContents { get; }
|
|
internal Token(string value, int lineNumber, int columnNumber, TokenType type, string lineContents, int offset, string file)
|
|
{
|
|
Value = value;
|
|
LineNumber = lineNumber;
|
|
ColumnNumber = columnNumber;
|
|
File = file;
|
|
Type = type;
|
|
LineContents = lineContents;
|
|
Offset = offset;
|
|
}
|
|
public override string ToString() => $"({LineNumber},{ColumnNumber}) '{Value}'";
|
|
|
|
|
|
internal Exception Throw(string error = null, bool isError = true)
|
|
{
|
|
throw new ParserException(this, string.IsNullOrWhiteSpace(error) ? $"syntax error: '{Value}'" : error, isError);
|
|
}
|
|
|
|
internal void Assert(TokenType type, string value = null)
|
|
{
|
|
if (value != null)
|
|
{
|
|
if (type != Type || value != Value)
|
|
{
|
|
Throw($"expected {type} '{value}'");
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
if (type != Type)
|
|
{
|
|
Throw($"expected {type}");
|
|
}
|
|
}
|
|
}
|
|
|
|
internal bool Is(TokenType type, string value = null)
|
|
{
|
|
if (type != Type) return false;
|
|
if (value != null && value != Value) return false;
|
|
return true;
|
|
}
|
|
|
|
internal void RequireProto2(ParserContext ctx)
|
|
{
|
|
if(ctx.Syntax != FileDescriptorProto.SyntaxProto2)
|
|
{
|
|
var msg = "'" + Value + "' requires " + FileDescriptorProto.SyntaxProto2 + " syntax";
|
|
ctx.Errors.Error(this, msg);
|
|
}
|
|
}
|
|
|
|
internal Error TypeNotFound(string typeName = null) => new Error(this,
|
|
$"type not found: '{(string.IsNullOrWhiteSpace(typeName) ? Value : typeName)}'", true);
|
|
}
|
|
}
|