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);
 | |
|     }
 | |
| }
 |