| OLD | NEW |
| 1 // Protocol Buffers - Google's data interchange format | 1 // Protocol Buffers - Google's data interchange format |
| 2 // Copyright 2008 Google Inc. All rights reserved. | 2 // Copyright 2008 Google Inc. All rights reserved. |
| 3 // http://code.google.com/p/protobuf/ | 3 // https://developers.google.com/protocol-buffers/ |
| 4 // | 4 // |
| 5 // Redistribution and use in source and binary forms, with or without | 5 // Redistribution and use in source and binary forms, with or without |
| 6 // modification, are permitted provided that the following conditions are | 6 // modification, are permitted provided that the following conditions are |
| 7 // met: | 7 // met: |
| 8 // | 8 // |
| 9 // * Redistributions of source code must retain the above copyright | 9 // * Redistributions of source code must retain the above copyright |
| 10 // notice, this list of conditions and the following disclaimer. | 10 // notice, this list of conditions and the following disclaimer. |
| 11 // * Redistributions in binary form must reproduce the above | 11 // * Redistributions in binary form must reproduce the above |
| 12 // copyright notice, this list of conditions and the following disclaimer | 12 // copyright notice, this list of conditions and the following disclaimer |
| 13 // in the documentation and/or other materials provided with the | 13 // in the documentation and/or other materials provided with the |
| (...skipping 19 matching lines...) Expand all Loading... |
| 33 // Sanjay Ghemawat, Jeff Dean, and others. | 33 // Sanjay Ghemawat, Jeff Dean, and others. |
| 34 // | 34 // |
| 35 // Implements parsing of .proto files to FileDescriptorProtos. | 35 // Implements parsing of .proto files to FileDescriptorProtos. |
| 36 | 36 |
| 37 #ifndef GOOGLE_PROTOBUF_COMPILER_PARSER_H__ | 37 #ifndef GOOGLE_PROTOBUF_COMPILER_PARSER_H__ |
| 38 #define GOOGLE_PROTOBUF_COMPILER_PARSER_H__ | 38 #define GOOGLE_PROTOBUF_COMPILER_PARSER_H__ |
| 39 | 39 |
| 40 #include <map> | 40 #include <map> |
| 41 #include <string> | 41 #include <string> |
| 42 #include <utility> | 42 #include <utility> |
| 43 #include <google/protobuf/stubs/common.h> | |
| 44 #include <google/protobuf/descriptor.h> | 43 #include <google/protobuf/descriptor.h> |
| 45 #include <google/protobuf/descriptor.pb.h> | 44 #include <google/protobuf/descriptor.pb.h> |
| 46 #include <google/protobuf/repeated_field.h> | 45 #include <google/protobuf/repeated_field.h> |
| 47 #include <google/protobuf/io/tokenizer.h> | 46 #include <google/protobuf/io/tokenizer.h> |
| 48 | 47 |
| 49 namespace google { | 48 namespace google { |
| 50 namespace protobuf { class Message; } | 49 namespace protobuf { class Message; } |
| 51 | 50 |
| 52 namespace protobuf { | 51 namespace protobuf { |
| 53 namespace compiler { | 52 namespace compiler { |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 179 | 178 |
| 180 // Consume a token representing the end of the statement. Comments between | 179 // Consume a token representing the end of the statement. Comments between |
| 181 // this token and the next will be harvested for documentation. The given | 180 // this token and the next will be harvested for documentation. The given |
| 182 // LocationRecorder should refer to the declaration that was just parsed; | 181 // LocationRecorder should refer to the declaration that was just parsed; |
| 183 // it will be populated with these comments. | 182 // it will be populated with these comments. |
| 184 // | 183 // |
| 185 // TODO(kenton): The LocationRecorder is const because historically locations | 184 // TODO(kenton): The LocationRecorder is const because historically locations |
| 186 // have been passed around by const reference, for no particularly good | 185 // have been passed around by const reference, for no particularly good |
| 187 // reason. We should probably go through and change them all to mutable | 186 // reason. We should probably go through and change them all to mutable |
| 188 // pointer to make this more intuitive. | 187 // pointer to make this more intuitive. |
| 189 bool TryConsumeEndOfDeclaration(const char* text, | 188 bool TryConsumeEndOfDeclaration( |
| 190 const LocationRecorder* location); | 189 const char* text, const LocationRecorder* location); |
| 191 bool ConsumeEndOfDeclaration(const char* text, | 190 bool TryConsumeEndOfDeclarationFinishScope( |
| 192 const LocationRecorder* location); | 191 const char* text, const LocationRecorder* location); |
| 192 |
| 193 bool ConsumeEndOfDeclaration( |
| 194 const char* text, const LocationRecorder* location); |
| 193 | 195 |
| 194 // ----------------------------------------------------------------- | 196 // ----------------------------------------------------------------- |
| 195 // Error logging helpers | 197 // Error logging helpers |
| 196 | 198 |
| 197 // Invokes error_collector_->AddError(), if error_collector_ is not NULL. | 199 // Invokes error_collector_->AddError(), if error_collector_ is not NULL. |
| 198 void AddError(int line, int column, const string& error); | 200 void AddError(int line, int column, const string& error); |
| 199 | 201 |
| 200 // Invokes error_collector_->AddError() with the line and column number | 202 // Invokes error_collector_->AddError() with the line and column number |
| 201 // of the current token. | 203 // of the current token. |
| 202 void AddError(const string& error); | 204 void AddError(const string& error); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 226 | 228 |
| 227 // Add a path component. See SourceCodeInfo.Location.path in | 229 // Add a path component. See SourceCodeInfo.Location.path in |
| 228 // descriptor.proto. | 230 // descriptor.proto. |
| 229 void AddPath(int path_component); | 231 void AddPath(int path_component); |
| 230 | 232 |
| 231 // By default the location is considered to start at the current token at | 233 // By default the location is considered to start at the current token at |
| 232 // the time the LocationRecorder is created. StartAt() sets the start | 234 // the time the LocationRecorder is created. StartAt() sets the start |
| 233 // location to the given token instead. | 235 // location to the given token instead. |
| 234 void StartAt(const io::Tokenizer::Token& token); | 236 void StartAt(const io::Tokenizer::Token& token); |
| 235 | 237 |
| 238 // Start at the same location as some other LocationRecorder. |
| 239 void StartAt(const LocationRecorder& other); |
| 240 |
| 236 // By default the location is considered to end at the previous token at | 241 // By default the location is considered to end at the previous token at |
| 237 // the time the LocationRecorder is destroyed. EndAt() sets the end | 242 // the time the LocationRecorder is destroyed. EndAt() sets the end |
| 238 // location to the given token instead. | 243 // location to the given token instead. |
| 239 void EndAt(const io::Tokenizer::Token& token); | 244 void EndAt(const io::Tokenizer::Token& token); |
| 240 | 245 |
| 241 // Records the start point of this location to the SourceLocationTable that | 246 // Records the start point of this location to the SourceLocationTable that |
| 242 // was passed to RecordSourceLocationsTo(), if any. SourceLocationTable | 247 // was passed to RecordSourceLocationsTo(), if any. SourceLocationTable |
| 243 // is an older way of keeping track of source locations which is still | 248 // is an older way of keeping track of source locations which is still |
| 244 // used in some places. | 249 // used in some places. |
| 245 void RecordLegacyLocation(const Message* descriptor, | 250 void RecordLegacyLocation(const Message* descriptor, |
| 246 DescriptorPool::ErrorCollector::ErrorLocation location); | 251 DescriptorPool::ErrorCollector::ErrorLocation location); |
| 247 | 252 |
| 248 // Attaches leading and trailing comments to the location. The two strings | 253 // Attaches leading and trailing comments to the location. The two strings |
| 249 // will be swapped into place, so after this is called *leading and | 254 // will be swapped into place, so after this is called *leading and |
| 250 // *trailing will be empty. | 255 // *trailing will be empty. |
| 251 // | 256 // |
| 252 // TODO(kenton): See comment on TryConsumeEndOfDeclaration(), above, for | 257 // TODO(kenton): See comment on TryConsumeEndOfDeclaration(), above, for |
| 253 // why this is const. | 258 // why this is const. |
| 254 void AttachComments(string* leading, string* trailing) const; | 259 void AttachComments(string* leading, string* trailing, |
| 260 vector<string>* detached_comments) const; |
| 255 | 261 |
| 256 private: | 262 private: |
| 263 // Indexes of parent and current location in the parent |
| 264 // SourceCodeInfo.location repeated field. For top-level elements, |
| 265 // parent_index_ is -1. |
| 257 Parser* parser_; | 266 Parser* parser_; |
| 258 SourceCodeInfo::Location* location_; | 267 SourceCodeInfo::Location* location_; |
| 259 | 268 |
| 260 void Init(const LocationRecorder& parent); | 269 void Init(const LocationRecorder& parent); |
| 261 }; | 270 }; |
| 262 | 271 |
| 263 // ================================================================= | 272 // ================================================================= |
| 264 // Parsers for various language constructs | 273 // Parsers for various language constructs |
| 265 | 274 |
| 266 // Parses the "syntax = \"proto2\";" line at the top of the file. Returns | 275 // Parses the "syntax = \"proto2\";" line at the top of the file. Returns |
| 267 // false if it failed to parse or if the syntax identifier was not | 276 // false if it failed to parse or if the syntax identifier was not |
| 268 // recognized. | 277 // recognized. |
| 269 bool ParseSyntaxIdentifier(); | 278 bool ParseSyntaxIdentifier(const LocationRecorder& parent); |
| 270 | 279 |
| 271 // These methods parse various individual bits of code. They return | 280 // These methods parse various individual bits of code. They return |
| 272 // false if they completely fail to parse the construct. In this case, | 281 // false if they completely fail to parse the construct. In this case, |
| 273 // it is probably necessary to skip the rest of the statement to recover. | 282 // it is probably necessary to skip the rest of the statement to recover. |
| 274 // However, if these methods return true, it does NOT mean that there | 283 // However, if these methods return true, it does NOT mean that there |
| 275 // were no errors; only that there were no *syntax* errors. For instance, | 284 // were no errors; only that there were no *syntax* errors. For instance, |
| 276 // if a service method is defined using proper syntax but uses a primitive | 285 // if a service method is defined using proper syntax but uses a primitive |
| 277 // type as its input or output, ParseMethodField() still returns true | 286 // type as its input or output, ParseMethodField() still returns true |
| 278 // and only reports the error by calling AddError(). In practice, this | 287 // and only reports the error by calling AddError(). In practice, this |
| 279 // makes logic much simpler for the caller. | 288 // makes logic much simpler for the caller. |
| 280 | 289 |
| 281 // Parse a top-level message, enum, service, etc. | 290 // Parse a top-level message, enum, service, etc. |
| 282 bool ParseTopLevelStatement(FileDescriptorProto* file, | 291 bool ParseTopLevelStatement(FileDescriptorProto* file, |
| 283 const LocationRecorder& root_location); | 292 const LocationRecorder& root_location); |
| 284 | 293 |
| 285 // Parse various language high-level language construrcts. | 294 // Parse various language high-level language construrcts. |
| 286 bool ParseMessageDefinition(DescriptorProto* message, | 295 bool ParseMessageDefinition(DescriptorProto* message, |
| 287 const LocationRecorder& message_location); | 296 const LocationRecorder& message_location, |
| 297 const FileDescriptorProto* containing_file); |
| 288 bool ParseEnumDefinition(EnumDescriptorProto* enum_type, | 298 bool ParseEnumDefinition(EnumDescriptorProto* enum_type, |
| 289 const LocationRecorder& enum_location); | 299 const LocationRecorder& enum_location, |
| 300 const FileDescriptorProto* containing_file); |
| 290 bool ParseServiceDefinition(ServiceDescriptorProto* service, | 301 bool ParseServiceDefinition(ServiceDescriptorProto* service, |
| 291 const LocationRecorder& service_location); | 302 const LocationRecorder& service_location, |
| 303 const FileDescriptorProto* containing_file); |
| 292 bool ParsePackage(FileDescriptorProto* file, | 304 bool ParsePackage(FileDescriptorProto* file, |
| 293 const LocationRecorder& root_location); | 305 const LocationRecorder& root_location, |
| 306 const FileDescriptorProto* containing_file); |
| 294 bool ParseImport(RepeatedPtrField<string>* dependency, | 307 bool ParseImport(RepeatedPtrField<string>* dependency, |
| 295 RepeatedField<int32>* public_dependency, | 308 RepeatedField<int32>* public_dependency, |
| 296 RepeatedField<int32>* weak_dependency, | 309 RepeatedField<int32>* weak_dependency, |
| 297 const LocationRecorder& root_location); | 310 const LocationRecorder& root_location, |
| 298 bool ParseOption(Message* options, | 311 const FileDescriptorProto* containing_file); |
| 299 const LocationRecorder& options_location); | |
| 300 | 312 |
| 301 // These methods parse the contents of a message, enum, or service type and | 313 // These methods parse the contents of a message, enum, or service type and |
| 302 // add them to the given object. They consume the entire block including | 314 // add them to the given object. They consume the entire block including |
| 303 // the beginning and ending brace. | 315 // the beginning and ending brace. |
| 304 bool ParseMessageBlock(DescriptorProto* message, | 316 bool ParseMessageBlock(DescriptorProto* message, |
| 305 const LocationRecorder& message_location); | 317 const LocationRecorder& message_location, |
| 318 const FileDescriptorProto* containing_file); |
| 306 bool ParseEnumBlock(EnumDescriptorProto* enum_type, | 319 bool ParseEnumBlock(EnumDescriptorProto* enum_type, |
| 307 const LocationRecorder& enum_location); | 320 const LocationRecorder& enum_location, |
| 321 const FileDescriptorProto* containing_file); |
| 308 bool ParseServiceBlock(ServiceDescriptorProto* service, | 322 bool ParseServiceBlock(ServiceDescriptorProto* service, |
| 309 const LocationRecorder& service_location); | 323 const LocationRecorder& service_location, |
| 324 const FileDescriptorProto* containing_file); |
| 310 | 325 |
| 311 // Parse one statement within a message, enum, or service block, inclunding | 326 // Parse one statement within a message, enum, or service block, including |
| 312 // final semicolon. | 327 // final semicolon. |
| 313 bool ParseMessageStatement(DescriptorProto* message, | 328 bool ParseMessageStatement(DescriptorProto* message, |
| 314 const LocationRecorder& message_location); | 329 const LocationRecorder& message_location, |
| 330 const FileDescriptorProto* containing_file); |
| 315 bool ParseEnumStatement(EnumDescriptorProto* message, | 331 bool ParseEnumStatement(EnumDescriptorProto* message, |
| 316 const LocationRecorder& enum_location); | 332 const LocationRecorder& enum_location, |
| 333 const FileDescriptorProto* containing_file); |
| 317 bool ParseServiceStatement(ServiceDescriptorProto* message, | 334 bool ParseServiceStatement(ServiceDescriptorProto* message, |
| 318 const LocationRecorder& service_location); | 335 const LocationRecorder& service_location, |
| 336 const FileDescriptorProto* containing_file); |
| 319 | 337 |
| 320 // Parse a field of a message. If the field is a group, its type will be | 338 // Parse a field of a message. If the field is a group, its type will be |
| 321 // added to "messages". | 339 // added to "messages". |
| 322 // | 340 // |
| 323 // parent_location and location_field_number_for_nested_type are needed when | 341 // parent_location and location_field_number_for_nested_type are needed when |
| 324 // parsing groups -- we need to generate a nested message type within the | 342 // parsing groups -- we need to generate a nested message type within the |
| 325 // parent and record its location accordingly. Since the parent could be | 343 // parent and record its location accordingly. Since the parent could be |
| 326 // either a FileDescriptorProto or a DescriptorProto, we must pass in the | 344 // either a FileDescriptorProto or a DescriptorProto, we must pass in the |
| 327 // correct field number to use. | 345 // correct field number to use. |
| 328 bool ParseMessageField(FieldDescriptorProto* field, | 346 bool ParseMessageField(FieldDescriptorProto* field, |
| 329 RepeatedPtrField<DescriptorProto>* messages, | 347 RepeatedPtrField<DescriptorProto>* messages, |
| 330 const LocationRecorder& parent_location, | 348 const LocationRecorder& parent_location, |
| 331 int location_field_number_for_nested_type, | 349 int location_field_number_for_nested_type, |
| 332 const LocationRecorder& field_location); | 350 const LocationRecorder& field_location, |
| 351 const FileDescriptorProto* containing_file); |
| 352 |
| 353 // Like ParseMessageField() but expects the label has already been filled in |
| 354 // by the caller. |
| 355 bool ParseMessageFieldNoLabel(FieldDescriptorProto* field, |
| 356 RepeatedPtrField<DescriptorProto>* messages, |
| 357 const LocationRecorder& parent_location, |
| 358 int location_field_number_for_nested_type, |
| 359 const LocationRecorder& field_location, |
| 360 const FileDescriptorProto* containing_file); |
| 333 | 361 |
| 334 // Parse an "extensions" declaration. | 362 // Parse an "extensions" declaration. |
| 335 bool ParseExtensions(DescriptorProto* message, | 363 bool ParseExtensions(DescriptorProto* message, |
| 336 const LocationRecorder& extensions_location); | 364 const LocationRecorder& extensions_location, |
| 365 const FileDescriptorProto* containing_file); |
| 366 |
| 367 // Parse a "reserved" declaration. |
| 368 bool ParseReserved(DescriptorProto* message, |
| 369 const LocationRecorder& message_location); |
| 370 bool ParseReservedNames(DescriptorProto* message, |
| 371 const LocationRecorder& parent_location); |
| 372 bool ParseReservedNumbers(DescriptorProto* message, |
| 373 const LocationRecorder& parent_location); |
| 337 | 374 |
| 338 // Parse an "extend" declaration. (See also comments for | 375 // Parse an "extend" declaration. (See also comments for |
| 339 // ParseMessageField().) | 376 // ParseMessageField().) |
| 340 bool ParseExtend(RepeatedPtrField<FieldDescriptorProto>* extensions, | 377 bool ParseExtend(RepeatedPtrField<FieldDescriptorProto>* extensions, |
| 341 RepeatedPtrField<DescriptorProto>* messages, | 378 RepeatedPtrField<DescriptorProto>* messages, |
| 342 const LocationRecorder& parent_location, | 379 const LocationRecorder& parent_location, |
| 343 int location_field_number_for_nested_type, | 380 int location_field_number_for_nested_type, |
| 344 const LocationRecorder& extend_location); | 381 const LocationRecorder& extend_location, |
| 382 const FileDescriptorProto* containing_file); |
| 383 |
| 384 // Parse a "oneof" declaration. The caller is responsible for setting |
| 385 // oneof_decl->label() since it will have had to parse the label before it |
| 386 // knew it was parsing a oneof. |
| 387 bool ParseOneof(OneofDescriptorProto* oneof_decl, |
| 388 DescriptorProto* containing_type, |
| 389 int oneof_index, |
| 390 const LocationRecorder& oneof_location, |
| 391 const LocationRecorder& containing_type_location, |
| 392 const FileDescriptorProto* containing_file); |
| 345 | 393 |
| 346 // Parse a single enum value within an enum block. | 394 // Parse a single enum value within an enum block. |
| 347 bool ParseEnumConstant(EnumValueDescriptorProto* enum_value, | 395 bool ParseEnumConstant(EnumValueDescriptorProto* enum_value, |
| 348 const LocationRecorder& enum_value_location); | 396 const LocationRecorder& enum_value_location, |
| 397 const FileDescriptorProto* containing_file); |
| 349 | 398 |
| 350 // Parse enum constant options, i.e. the list in square brackets at the end | 399 // Parse enum constant options, i.e. the list in square brackets at the end |
| 351 // of the enum constant value definition. | 400 // of the enum constant value definition. |
| 352 bool ParseEnumConstantOptions(EnumValueDescriptorProto* value, | 401 bool ParseEnumConstantOptions(EnumValueDescriptorProto* value, |
| 353 const LocationRecorder& enum_value_location); | 402 const LocationRecorder& enum_value_location, |
| 403 const FileDescriptorProto* containing_file); |
| 354 | 404 |
| 355 // Parse a single method within a service definition. | 405 // Parse a single method within a service definition. |
| 356 bool ParseServiceMethod(MethodDescriptorProto* method, | 406 bool ParseServiceMethod(MethodDescriptorProto* method, |
| 357 const LocationRecorder& method_location); | 407 const LocationRecorder& method_location, |
| 408 const FileDescriptorProto* containing_file); |
| 358 | 409 |
| 359 | 410 |
| 360 // Parse options of a single method or stream. | 411 // Parse options of a single method or stream. |
| 361 bool ParseOptions(const LocationRecorder& parent_location, | 412 bool ParseMethodOptions(const LocationRecorder& parent_location, |
| 362 const int optionsFieldNumber, | 413 const FileDescriptorProto* containing_file, |
| 363 Message* mutable_options); | 414 const int optionsFieldNumber, |
| 415 Message* mutable_options); |
| 364 | 416 |
| 365 // Parse "required", "optional", or "repeated" and fill in "label" | 417 // Parse "required", "optional", or "repeated" and fill in "label" |
| 366 // with the value. | 418 // with the value. Returns true if such a label is consumed. |
| 367 bool ParseLabel(FieldDescriptorProto::Label* label); | 419 bool ParseLabel(FieldDescriptorProto::Label* label, |
| 420 const FileDescriptorProto* containing_file); |
| 368 | 421 |
| 369 // Parse a type name and fill in "type" (if it is a primitive) or | 422 // Parse a type name and fill in "type" (if it is a primitive) or |
| 370 // "type_name" (if it is not) with the type parsed. | 423 // "type_name" (if it is not) with the type parsed. |
| 371 bool ParseType(FieldDescriptorProto::Type* type, | 424 bool ParseType(FieldDescriptorProto::Type* type, |
| 372 string* type_name); | 425 string* type_name); |
| 373 // Parse a user-defined type and fill in "type_name" with the name. | 426 // Parse a user-defined type and fill in "type_name" with the name. |
| 374 // If a primitive type is named, it is treated as an error. | 427 // If a primitive type is named, it is treated as an error. |
| 375 bool ParseUserDefinedType(string* type_name); | 428 bool ParseUserDefinedType(string* type_name); |
| 376 | 429 |
| 377 // Parses field options, i.e. the stuff in square brackets at the end | 430 // Parses field options, i.e. the stuff in square brackets at the end |
| 378 // of a field definition. Also parses default value. | 431 // of a field definition. Also parses default value. |
| 379 bool ParseFieldOptions(FieldDescriptorProto* field, | 432 bool ParseFieldOptions(FieldDescriptorProto* field, |
| 380 const LocationRecorder& field_location); | 433 const LocationRecorder& field_location, |
| 434 const FileDescriptorProto* containing_file); |
| 381 | 435 |
| 382 // Parse the "default" option. This needs special handling because its | 436 // Parse the "default" option. This needs special handling because its |
| 383 // type is the field's type. | 437 // type is the field's type. |
| 384 bool ParseDefaultAssignment(FieldDescriptorProto* field, | 438 bool ParseDefaultAssignment(FieldDescriptorProto* field, |
| 385 const LocationRecorder& field_location); | 439 const LocationRecorder& field_location, |
| 440 const FileDescriptorProto* containing_file); |
| 441 |
| 442 bool ParseJsonName(FieldDescriptorProto* field, |
| 443 const LocationRecorder& field_location, |
| 444 const FileDescriptorProto* containing_file); |
| 386 | 445 |
| 387 enum OptionStyle { | 446 enum OptionStyle { |
| 388 OPTION_ASSIGNMENT, // just "name = value" | 447 OPTION_ASSIGNMENT, // just "name = value" |
| 389 OPTION_STATEMENT // "option name = value;" | 448 OPTION_STATEMENT // "option name = value;" |
| 390 }; | 449 }; |
| 391 | 450 |
| 392 // Parse a single option name/value pair, e.g. "ctype = CORD". The name | 451 // Parse a single option name/value pair, e.g. "ctype = CORD". The name |
| 393 // identifies a field of the given Message, and the value of that field | 452 // identifies a field of the given Message, and the value of that field |
| 394 // is set to the parsed value. | 453 // is set to the parsed value. |
| 395 bool ParseOption(Message* options, | 454 bool ParseOption(Message* options, |
| 396 const LocationRecorder& options_location, | 455 const LocationRecorder& options_location, |
| 456 const FileDescriptorProto* containing_file, |
| 397 OptionStyle style); | 457 OptionStyle style); |
| 398 | 458 |
| 399 // Parses a single part of a multipart option name. A multipart name consists | 459 // Parses a single part of a multipart option name. A multipart name consists |
| 400 // of names separated by dots. Each name is either an identifier or a series | 460 // of names separated by dots. Each name is either an identifier or a series |
| 401 // of identifiers separated by dots and enclosed in parentheses. E.g., | 461 // of identifiers separated by dots and enclosed in parentheses. E.g., |
| 402 // "foo.(bar.baz).qux". | 462 // "foo.(bar.baz).qux". |
| 403 bool ParseOptionNamePart(UninterpretedOption* uninterpreted_option, | 463 bool ParseOptionNamePart(UninterpretedOption* uninterpreted_option, |
| 404 const LocationRecorder& part_location); | 464 const LocationRecorder& part_location, |
| 465 const FileDescriptorProto* containing_file); |
| 405 | 466 |
| 406 // Parses a string surrounded by balanced braces. Strips off the outer | 467 // Parses a string surrounded by balanced braces. Strips off the outer |
| 407 // braces and stores the enclosed string in *value. | 468 // braces and stores the enclosed string in *value. |
| 408 // E.g., | 469 // E.g., |
| 409 // { foo } *value gets 'foo' | 470 // { foo } *value gets 'foo' |
| 410 // { foo { bar: box } } *value gets 'foo { bar: box }' | 471 // { foo { bar: box } } *value gets 'foo { bar: box }' |
| 411 // {} *value gets '' | 472 // {} *value gets '' |
| 412 // | 473 // |
| 413 // REQUIRES: LookingAt("{") | 474 // REQUIRES: LookingAt("{") |
| 414 // When finished successfully, we are looking at the first token past | 475 // When finished successfully, we are looking at the first token past |
| 415 // the ending brace. | 476 // the ending brace. |
| 416 bool ParseUninterpretedBlock(string* value); | 477 bool ParseUninterpretedBlock(string* value); |
| 417 | 478 |
| 479 struct MapField { |
| 480 // Whether the field is a map field. |
| 481 bool is_map_field; |
| 482 // The types of the key and value if they are primitive types. |
| 483 FieldDescriptorProto::Type key_type; |
| 484 FieldDescriptorProto::Type value_type; |
| 485 // Or the type names string if the types are customized types. |
| 486 string key_type_name; |
| 487 string value_type_name; |
| 488 |
| 489 MapField() : is_map_field(false) {} |
| 490 }; |
| 491 // Desugar the map syntax to generate a nested map entry message. |
| 492 void GenerateMapEntry(const MapField& map_field, FieldDescriptorProto* field, |
| 493 RepeatedPtrField<DescriptorProto>* messages); |
| 494 |
| 495 // Whether fields without label default to optional fields. |
| 496 bool DefaultToOptionalFields() const { |
| 497 return syntax_identifier_ == "proto3"; |
| 498 } |
| 499 |
| 500 |
| 501 bool ValidateEnum(const EnumDescriptorProto* proto); |
| 502 |
| 418 // ================================================================= | 503 // ================================================================= |
| 419 | 504 |
| 420 io::Tokenizer* input_; | 505 io::Tokenizer* input_; |
| 421 io::ErrorCollector* error_collector_; | 506 io::ErrorCollector* error_collector_; |
| 422 SourceCodeInfo* source_code_info_; | 507 SourceCodeInfo* source_code_info_; |
| 423 SourceLocationTable* source_location_table_; // legacy | 508 SourceLocationTable* source_location_table_; // legacy |
| 424 bool had_errors_; | 509 bool had_errors_; |
| 425 bool require_syntax_identifier_; | 510 bool require_syntax_identifier_; |
| 426 bool stop_after_syntax_identifier_; | 511 bool stop_after_syntax_identifier_; |
| 427 string syntax_identifier_; | 512 string syntax_identifier_; |
| 428 | 513 |
| 429 // Leading doc comments for the next declaration. These are not complete | 514 // Leading doc comments for the next declaration. These are not complete |
| 430 // yet; use ConsumeEndOfDeclaration() to get the complete comments. | 515 // yet; use ConsumeEndOfDeclaration() to get the complete comments. |
| 431 string upcoming_doc_comments_; | 516 string upcoming_doc_comments_; |
| 432 | 517 |
| 518 // Detached comments are not connected to any syntax entities. Elements in |
| 519 // this vector are paragraphs of comments separated by empty lines. The |
| 520 // detached comments will be put into the leading_detached_comments field for |
| 521 // the next element (See SourceCodeInfo.Location in descriptor.proto), when |
| 522 // ConsumeEndOfDeclaration() is called. |
| 523 vector<string> upcoming_detached_comments_; |
| 524 |
| 433 GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Parser); | 525 GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Parser); |
| 434 }; | 526 }; |
| 435 | 527 |
| 436 // A table mapping (descriptor, ErrorLocation) pairs -- as reported by | 528 // A table mapping (descriptor, ErrorLocation) pairs -- as reported by |
| 437 // DescriptorPool when validating descriptors -- to line and column numbers | 529 // DescriptorPool when validating descriptors -- to line and column numbers |
| 438 // within the original source code. | 530 // within the original source code. |
| 439 // | 531 // |
| 440 // This is semi-obsolete: FileDescriptorProto.source_code_info now contains | 532 // This is semi-obsolete: FileDescriptorProto.source_code_info now contains |
| 441 // far more complete information about source locations. However, as of this | 533 // far more complete information about source locations. However, as of this |
| 442 // writing you still need to use SourceLocationTable when integrating with | 534 // writing you still need to use SourceLocationTable when integrating with |
| (...skipping 25 matching lines...) Expand all Loading... |
| 468 pair<const Message*, DescriptorPool::ErrorCollector::ErrorLocation>, | 560 pair<const Message*, DescriptorPool::ErrorCollector::ErrorLocation>, |
| 469 pair<int, int> > LocationMap; | 561 pair<int, int> > LocationMap; |
| 470 LocationMap location_map_; | 562 LocationMap location_map_; |
| 471 }; | 563 }; |
| 472 | 564 |
| 473 } // namespace compiler | 565 } // namespace compiler |
| 474 } // namespace protobuf | 566 } // namespace protobuf |
| 475 | 567 |
| 476 } // namespace google | 568 } // namespace google |
| 477 #endif // GOOGLE_PROTOBUF_COMPILER_PARSER_H__ | 569 #endif // GOOGLE_PROTOBUF_COMPILER_PARSER_H__ |
| OLD | NEW |