Index: third_party/protobuf/src/google/protobuf/text_format.h |
=================================================================== |
--- third_party/protobuf/src/google/protobuf/text_format.h (revision 216642) |
+++ third_party/protobuf/src/google/protobuf/text_format.h (working copy) |
@@ -38,7 +38,10 @@ |
#ifndef GOOGLE_PROTOBUF_TEXT_FORMAT_H__ |
#define GOOGLE_PROTOBUF_TEXT_FORMAT_H__ |
+#include <map> |
#include <string> |
+#include <vector> |
+#include <google/protobuf/stubs/common.h> |
#include <google/protobuf/message.h> |
#include <google/protobuf/descriptor.h> |
@@ -220,6 +223,57 @@ |
const string& name) const = 0; |
}; |
+ // A location in the parsed text. |
+ struct ParseLocation { |
+ int line; |
+ int column; |
+ |
+ ParseLocation() : line(-1), column(-1) {} |
+ ParseLocation(int line_param, int column_param) |
+ : line(line_param), column(column_param) {} |
+ }; |
+ |
+ // Data structure which is populated with the locations of each field |
+ // value parsed from the text. |
+ class LIBPROTOBUF_EXPORT ParseInfoTree { |
+ public: |
+ ParseInfoTree(); |
+ ~ParseInfoTree(); |
+ |
+ // Returns the parse location for index-th value of the field in the parsed |
+ // text. If none exists, returns a location with line = -1. Index should be |
+ // -1 for not-repeated fields. |
+ ParseLocation GetLocation(const FieldDescriptor* field, int index) const; |
+ |
+ // Returns the parse info tree for the given field, which must be a message |
+ // type. The nested information tree is owned by the root tree and will be |
+ // deleted when it is deleted. |
+ ParseInfoTree* GetTreeForNested(const FieldDescriptor* field, |
+ int index) const; |
+ |
+ private: |
+ // Allow the text format parser to record information into the tree. |
+ friend class TextFormat; |
+ |
+ // Records the starting location of a single value for a field. |
+ void RecordLocation(const FieldDescriptor* field, ParseLocation location); |
+ |
+ // Create and records a nested tree for a nested message field. |
+ ParseInfoTree* CreateNested(const FieldDescriptor* field); |
+ |
+ // Defines the map from the index-th field descriptor to its parse location. |
+ typedef map<const FieldDescriptor*, vector<ParseLocation> > LocationMap; |
+ |
+ // Defines the map from the index-th field descriptor to the nested parse |
+ // info tree. |
+ typedef map<const FieldDescriptor*, vector<ParseInfoTree*> > NestedMap; |
+ |
+ LocationMap locations_; |
+ NestedMap nested_; |
+ |
+ GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ParseInfoTree); |
+ }; |
+ |
// For more control over parsing, use this class. |
class LIBPROTOBUF_EXPORT Parser { |
public: |
@@ -248,6 +302,12 @@ |
finder_ = finder; |
} |
+ // Sets where location information about the parse will be written. If NULL |
+ // (the default), then no location will be written. |
+ void WriteLocationsTo(ParseInfoTree* tree) { |
+ parse_info_tree_ = tree; |
+ } |
+ |
// Normally parsing fails if, after parsing, output->IsInitialized() |
// returns false. Call AllowPartialMessage(true) to skip this check. |
void AllowPartialMessage(bool allow) { |
@@ -259,6 +319,7 @@ |
const FieldDescriptor* field, |
Message* output); |
+ |
private: |
// Forward declaration of an internal class used to parse text |
// representations (see text_format.cc for implementation). |
@@ -272,7 +333,9 @@ |
io::ErrorCollector* error_collector_; |
Finder* finder_; |
+ ParseInfoTree* parse_info_tree_; |
bool allow_partial_; |
+ bool allow_unknown_field_; |
}; |
private: |