Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
add error codes for ParserException/Throw
  • Loading branch information
mgravell committed Aug 3, 2018
1 parent 16ebefb commit 1de4e4d
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 22 deletions.
3 changes: 2 additions & 1 deletion src/protobuf-net.Reflection/CodeGenerator.cs
Expand Up @@ -58,7 +58,8 @@ public CompilerResult Compile(params CodeFile[] files)
}
catch (Exception ex)
{
set.Errors.Add(new Error(default, ex.Message, true, ErrorCode.Undefined));
var errorCode = ex is ParserException pe ? pe.ErrorCode : ErrorCode.Undefined;
set.Errors.Add(new Error(default, ex.Message, true, errorCode));
}
var errors = set.GetErrors();

Expand Down
9 changes: 9 additions & 0 deletions src/protobuf-net.Reflection/ErrorCode.cs
Expand Up @@ -37,5 +37,14 @@ internal enum ErrorCode
InvalidEscapeSequence = 29,
GroupNamesStartUpperCase = 30,
UnknownParseError = 31,
ExpectedToken = 32,
ExpectedArity = 33,
InvalidMapUsage = 34,
ParseFailExtensionRange = 35,
ParseFailReservedRange = 36,
InvalidEnum = 37,
UnexpectedEOF = 38,
InvalidString = 39,
SyntaxErrorUnknownEntity = 40,
}
}
4 changes: 3 additions & 1 deletion src/protobuf-net.Reflection/NameNormalizer.cs
Expand Up @@ -15,7 +15,8 @@ internal class ParserException : Exception
public string Text { get; }
public string LineContents { get; }
public bool IsError { get; }
internal ParserException(Token token, string message, bool isError)
internal ErrorCode ErrorCode { get; }
internal ParserException(Token token, string message, bool isError, ErrorCode errorCode)
: base(message ?? "error")
{
ColumnNumber = token.ColumnNumber;
Expand All @@ -24,6 +25,7 @@ internal ParserException(Token token, string message, bool isError)
LineContents = token.LineContents;
Text = token.Value ?? "";
IsError = isError;
ErrorCode = errorCode;
}
}
/// <summary>
Expand Down
16 changes: 8 additions & 8 deletions src/protobuf-net.Reflection/Parsers.cs
Expand Up @@ -461,7 +461,7 @@ private void ParseExtensionRange(ParserContext ctx)
}
else
{
tokens.Read().Throw("unable to parse extension range");
tokens.Read().Throw(ErrorCode.ParseFailExtensionRange, "unable to parse extension range");
}
}
ctx.AbortState = AbortState.None;
Expand Down Expand Up @@ -494,7 +494,7 @@ private void ParseReservedRanges(ParserContext ctx)
}
else
{
tokens.Read().Throw("unable to parse reserved range");
tokens.Read().Throw(ErrorCode.ParseFailReservedRange, "unable to parse reserved range");
}
}
break;
Expand Down Expand Up @@ -527,12 +527,12 @@ private void ParseReservedRanges(ParserContext ctx)
}
else
{
token.Throw();
token.Throw(ErrorCode.ParseFailReservedRange);
}
}
break;
default:
throw token.Throw();
throw token.Throw(ErrorCode.ParseFailReservedRange);
}
ctx.AbortState = AbortState.None;
}
Expand Down Expand Up @@ -716,7 +716,7 @@ void ISchemaObject.ReadOne(ParserContext ctx)
}
else if (tokens.Peek(out var token))
{
token.Throw();
token.Throw(ErrorCode.SyntaxErrorUnknownEntity);
} // else EOF
}

Expand Down Expand Up @@ -1748,13 +1748,13 @@ void NotAllowedOneOf(ParserContext context, ErrorCode errorCode)
else if (ctx.Syntax == FileDescriptorProto.SyntaxProto2 && !isOneOf)
{
// required in proto2
throw tokens.Read().Throw("expected 'repeated' / 'required' / 'optional'");
throw tokens.Read().Throw(ErrorCode.ExpectedArity, "expected 'repeated' / 'required' / 'optional'");
}

var typeToken = tokens.Read();
if (typeToken.Is(TokenType.AlphaNumeric, "map"))
{
tokens.Previous.Throw($"'{tokens.Previous.Value}' can not be used with 'map'");
tokens.Previous.Throw(ErrorCode.InvalidMapUsage, $"'{tokens.Previous.Value}' can not be used with 'map'");
}
string typeName = tokens.Consume(TokenType.AlphaNumeric);

Expand Down Expand Up @@ -2387,7 +2387,7 @@ internal Error(ParserException ex)
Message = ex.Message;
IsError = ex.IsError;
Text = ex.Text ?? "";
TypedCode = ProtoBuf.ErrorCode.Undefined;
TypedCode = ex.ErrorCode;
}
/// <summary>
/// True if this instance represents a non-fatal warning
Expand Down
8 changes: 4 additions & 4 deletions src/protobuf-net.Reflection/Token.cs
Expand Up @@ -35,23 +35,23 @@ internal Token(string value, int lineNumber, int columnNumber, TokenType type, s
}
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 Exception Throw(ErrorCode errorCode, string error = null, bool isError = true) =>
throw new ParserException(this, string.IsNullOrWhiteSpace(error) ? $"syntax error: '{Value}'" : error, isError, errorCode);

internal void Assert(TokenType type, string value = null)
{
if (value != null)
{
if (type != Type || value != Value)
{
Throw($"expected {type} '{value}'");
Throw(ErrorCode.ExpectedToken, $"expected {type} '{value}'");
}
}
else
{
if (type != Type)
{
Throw($"expected {type}");
Throw(ErrorCode.ExpectedToken, $"expected {type}");
}
}
}
Expand Down
16 changes: 8 additions & 8 deletions src/protobuf-net.Reflection/TokenExtensions.cs
Expand Up @@ -33,7 +33,7 @@ public static Token Read(this Peekable<Token> tokens)
{
if (!tokens.Peek(out Token val))
{
throw new ParserException(tokens.Previous, "Unexpected end of file", true);
throw new ParserException(tokens.Previous, "Unexpected end of file", true, ErrorCode.UnexpectedEOF);
}
return val;
}
Expand Down Expand Up @@ -118,7 +118,7 @@ static EnumCache()
var value = tokens.ConsumeString();

if (!EnumCache<T>.TryGet(token.Value, out T val))
token.Throw("Unable to parse " + typeof(T).Name);
token.Throw(ErrorCode.InvalidEnum, "Unable to parse " + typeof(T).Name);
return val;
}

Expand Down Expand Up @@ -201,7 +201,7 @@ internal static int ConsumeInt32(this Peekable<Token> tokens, int? max = null)
tokens.Consume();

if (TryParseInt32(token.Value, out int val, max)) return val;
throw token.Throw("Unable to parse integer");
throw token.Throw(ErrorCode.InvalidInteger, "Unable to parse integer");
}

internal static string ConsumeString(this Peekable<Token> tokens, bool asBytes = false)
Expand Down Expand Up @@ -270,7 +270,7 @@ internal static string ConsumeString(this Peekable<Token> tokens, bool asBytes =
tokens.Consume();
return token.Value;
default:
throw token.Throw();
throw token.Throw(ErrorCode.InvalidString);
}
}

Expand Down Expand Up @@ -462,7 +462,7 @@ internal static bool ConsumeBoolean(this Peekable<Token> tokens)
tokens.Consume();
if (string.Equals("true", token.Value, StringComparison.OrdinalIgnoreCase)) return true;
if (string.Equals("false", token.Value, StringComparison.OrdinalIgnoreCase)) return false;
throw token.Throw("Unable to parse boolean");
throw token.Throw(ErrorCode.InvalidBoolean, "Unable to parse boolean");
}

private static TokenType Identify(char c)
Expand Down Expand Up @@ -609,17 +609,17 @@ internal static bool TryParseSingle(string token, out float val)
}
internal static bool TryParseDouble(string token, out double val)
{
if(token == "nan")
if (token == "nan")
{
val = double.NaN;
return true;
}
if(token == "inf")
if (token == "inf")
{
val = double.PositiveInfinity;
return true;
}
if(token == "-inf")
if (token == "-inf")
{
val = double.NegativeInfinity;
return true;
Expand Down

0 comments on commit 1de4e4d

Please sign in to comment.