|  | @@ -88,6 +88,7 @@ namespace Google.Protobuf
 | 
	
		
			
				|  |  |          /// </remarks>
 | 
	
		
			
				|  |  |          /// <returns>The next token in the stream. This is never null.</returns>
 | 
	
		
			
				|  |  |          /// <exception cref="InvalidOperationException">This method is called after an EndDocument token has been returned</exception>
 | 
	
		
			
				|  |  | +        /// <exception cref="InvalidJsonException">The input text does not comply with RFC 7159</exception>
 | 
	
		
			
				|  |  |          internal JsonToken Next()
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              if (bufferedToken != null)
 | 
	
	
		
			
				|  | @@ -182,7 +183,7 @@ namespace Google.Protobuf
 | 
	
		
			
				|  |  |                          ValidateAndModifyStateForValue("Invalid state to read a number token: ");
 | 
	
		
			
				|  |  |                          return JsonToken.Value(number);
 | 
	
		
			
				|  |  |                      default:
 | 
	
		
			
				|  |  | -                        throw new InvalidProtocolBufferException("Invalid first character of token: " + next.Value);
 | 
	
		
			
				|  |  | +                        throw new InvalidJsonException("Invalid first character of token: " + next.Value);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -191,7 +192,7 @@ namespace Google.Protobuf
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              if ((validStates & state) == 0)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                throw new InvalidProtocolBufferException(errorPrefix + state);
 | 
	
		
			
				|  |  | +                throw reader.CreateException(errorPrefix + state);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -207,13 +208,13 @@ namespace Google.Protobuf
 | 
	
		
			
				|  |  |                  char c = reader.ReadOrFail("Unexpected end of text while reading string");
 | 
	
		
			
				|  |  |                  if (c < ' ')
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  | -                    throw new InvalidProtocolBufferException(string.Format(CultureInfo.InvariantCulture, "Invalid character in string literal: U+{0:x4}", (int) c));
 | 
	
		
			
				|  |  | +                    throw reader.CreateException(string.Format(CultureInfo.InvariantCulture, "Invalid character in string literal: U+{0:x4}", (int) c));
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                  if (c == '"')
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  |                      if (haveHighSurrogate)
 | 
	
		
			
				|  |  |                      {
 | 
	
		
			
				|  |  | -                        throw new InvalidProtocolBufferException("Invalid use of surrogate pair code units");
 | 
	
		
			
				|  |  | +                        throw reader.CreateException("Invalid use of surrogate pair code units");
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                      return value.ToString();
 | 
	
		
			
				|  |  |                  }
 | 
	
	
		
			
				|  | @@ -226,7 +227,7 @@ namespace Google.Protobuf
 | 
	
		
			
				|  |  |                  // followed by an escaped low surrogate or vice versa... and that couldn't even be represented in UTF-8.
 | 
	
		
			
				|  |  |                  if (haveHighSurrogate != char.IsLowSurrogate(c))
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  | -                    throw new InvalidProtocolBufferException("Invalid use of surrogate pair code units");
 | 
	
		
			
				|  |  | +                    throw reader.CreateException("Invalid use of surrogate pair code units");
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                  haveHighSurrogate = char.IsHighSurrogate(c);
 | 
	
		
			
				|  |  |                  value.Append(c);
 | 
	
	
		
			
				|  | @@ -260,7 +261,7 @@ namespace Google.Protobuf
 | 
	
		
			
				|  |  |                  case 'u':
 | 
	
		
			
				|  |  |                      return ReadUnicodeEscape();
 | 
	
		
			
				|  |  |                  default:
 | 
	
		
			
				|  |  | -                    throw new InvalidProtocolBufferException(string.Format(CultureInfo.InvariantCulture, "Invalid character in character escape sequence: U+{0:x4}", (int) c));
 | 
	
		
			
				|  |  | +                    throw reader.CreateException(string.Format(CultureInfo.InvariantCulture, "Invalid character in character escape sequence: U+{0:x4}", (int) c));
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -288,7 +289,7 @@ namespace Google.Protobuf
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                  else
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  | -                    throw new InvalidProtocolBufferException(string.Format(CultureInfo.InvariantCulture, "Invalid character in character escape sequence: U+{0:x4}", (int) c));
 | 
	
		
			
				|  |  | +                    throw reader.CreateException(string.Format(CultureInfo.InvariantCulture, "Invalid character in character escape sequence: U+{0:x4}", (int) c));
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                  result = (result << 4) + nybble;
 | 
	
		
			
				|  |  |              }
 | 
	
	
		
			
				|  | @@ -306,11 +307,11 @@ namespace Google.Protobuf
 | 
	
		
			
				|  |  |                  char? next = reader.Read();
 | 
	
		
			
				|  |  |                  if (next == null)
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  | -                    throw new InvalidProtocolBufferException("Unexpected end of text while reading literal token " + text);
 | 
	
		
			
				|  |  | +                    throw reader.CreateException("Unexpected end of text while reading literal token " + text);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                  if (next.Value != text[i])
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  | -                    throw new InvalidProtocolBufferException("Unexpected character while reading literal token " + text);
 | 
	
		
			
				|  |  | +                    throw reader.CreateException("Unexpected character while reading literal token " + text);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -354,7 +355,7 @@ namespace Google.Protobuf
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              catch (OverflowException)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                throw new InvalidProtocolBufferException("Numeric value out of range: " + builder);
 | 
	
		
			
				|  |  | +                throw reader.CreateException("Numeric value out of range: " + builder);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -363,14 +364,14 @@ namespace Google.Protobuf
 | 
	
		
			
				|  |  |              char first = reader.ReadOrFail("Invalid numeric literal");
 | 
	
		
			
				|  |  |              if (first < '0' || first > '9')
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                throw new InvalidProtocolBufferException("Invalid numeric literal");
 | 
	
		
			
				|  |  | +                throw reader.CreateException("Invalid numeric literal");
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              builder.Append(first);
 | 
	
		
			
				|  |  |              int digitCount;
 | 
	
		
			
				|  |  |              char? next = ConsumeDigits(builder, out digitCount);
 | 
	
		
			
				|  |  |              if (first == '0' && digitCount != 0)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                throw new InvalidProtocolBufferException("Invalid numeric literal: leading 0 for non-zero value.");
 | 
	
		
			
				|  |  | +                throw reader.CreateException("Invalid numeric literal: leading 0 for non-zero value.");
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              return next;
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -382,7 +383,7 @@ namespace Google.Protobuf
 | 
	
		
			
				|  |  |              char? next = ConsumeDigits(builder, out digitCount);
 | 
	
		
			
				|  |  |              if (digitCount == 0)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                throw new InvalidProtocolBufferException("Invalid numeric literal: fraction with no trailing digits");
 | 
	
		
			
				|  |  | +                throw reader.CreateException("Invalid numeric literal: fraction with no trailing digits");
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              return next;
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -393,7 +394,7 @@ namespace Google.Protobuf
 | 
	
		
			
				|  |  |              char? next = reader.Read();
 | 
	
		
			
				|  |  |              if (next == null)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                throw new InvalidProtocolBufferException("Invalid numeric literal: exponent with no trailing digits");
 | 
	
		
			
				|  |  | +                throw reader.CreateException("Invalid numeric literal: exponent with no trailing digits");
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              if (next == '-' || next == '+')
 | 
	
		
			
				|  |  |              {
 | 
	
	
		
			
				|  | @@ -407,7 +408,7 @@ namespace Google.Protobuf
 | 
	
		
			
				|  |  |              next = ConsumeDigits(builder, out digitCount);
 | 
	
		
			
				|  |  |              if (digitCount == 0)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                throw new InvalidProtocolBufferException("Invalid numeric literal: exponent without value");
 | 
	
		
			
				|  |  | +                throw reader.CreateException("Invalid numeric literal: exponent without value");
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              return next;
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -615,7 +616,7 @@ namespace Google.Protobuf
 | 
	
		
			
				|  |  |                  char? next = Read();
 | 
	
		
			
				|  |  |                  if (next == null)
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  | -                    throw new InvalidProtocolBufferException(messageOnFailure);
 | 
	
		
			
				|  |  | +                    throw CreateException(messageOnFailure);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                  return next.Value;
 | 
	
		
			
				|  |  |              }
 | 
	
	
		
			
				|  | @@ -628,6 +629,15 @@ namespace Google.Protobuf
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                  nextChar = c;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            /// <summary>
 | 
	
		
			
				|  |  | +            /// Creates a new exception appropriate for the current state of the reader.
 | 
	
		
			
				|  |  | +            /// </summary>
 | 
	
		
			
				|  |  | +            internal InvalidJsonException CreateException(string message)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                // TODO: Keep track of and use the location.
 | 
	
		
			
				|  |  | +                return new InvalidJsonException(message);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  }
 |