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 // https://developers.google.com/protocol-buffers/ | 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. |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 #include <google/protobuf/descriptor.h> | 50 #include <google/protobuf/descriptor.h> |
51 #include <google/protobuf/io/zero_copy_stream.h> | 51 #include <google/protobuf/io/zero_copy_stream.h> |
52 #include <google/protobuf/compiler/command_line_interface.h> | 52 #include <google/protobuf/compiler/command_line_interface.h> |
53 #include <google/protobuf/compiler/code_generator.h> | 53 #include <google/protobuf/compiler/code_generator.h> |
54 #include <google/protobuf/testing/file.h> | 54 #include <google/protobuf/testing/file.h> |
55 #include <google/protobuf/compiler/mock_code_generator.h> | 55 #include <google/protobuf/compiler/mock_code_generator.h> |
56 #include <google/protobuf/compiler/subprocess.h> | 56 #include <google/protobuf/compiler/subprocess.h> |
57 #include <google/protobuf/io/printer.h> | 57 #include <google/protobuf/io/printer.h> |
58 #include <google/protobuf/unittest.pb.h> | 58 #include <google/protobuf/unittest.pb.h> |
59 #include <google/protobuf/testing/file.h> | 59 #include <google/protobuf/testing/file.h> |
| 60 #include <google/protobuf/stubs/stringprintf.h> |
60 #include <google/protobuf/stubs/strutil.h> | 61 #include <google/protobuf/stubs/strutil.h> |
61 #include <google/protobuf/stubs/substitute.h> | 62 #include <google/protobuf/stubs/substitute.h> |
62 | 63 |
63 #include <google/protobuf/testing/file.h> | 64 #include <google/protobuf/testing/file.h> |
64 #include <google/protobuf/testing/googletest.h> | 65 #include <google/protobuf/testing/googletest.h> |
65 #include <gtest/gtest.h> | 66 #include <gtest/gtest.h> |
66 | 67 |
67 | 68 |
68 namespace google { | 69 namespace google { |
69 namespace protobuf { | 70 namespace protobuf { |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
210 // The result of Run(). | 211 // The result of Run(). |
211 int return_code_; | 212 int return_code_; |
212 | 213 |
213 // The captured stderr output. | 214 // The captured stderr output. |
214 string error_text_; | 215 string error_text_; |
215 | 216 |
216 // The captured stdout. | 217 // The captured stdout. |
217 string captured_stdout_; | 218 string captured_stdout_; |
218 | 219 |
219 // Pointers which need to be deleted later. | 220 // Pointers which need to be deleted later. |
220 vector<CodeGenerator*> mock_generators_to_delete_; | 221 std::vector<CodeGenerator*> mock_generators_to_delete_; |
221 | 222 |
222 NullCodeGenerator* null_generator_; | 223 NullCodeGenerator* null_generator_; |
223 }; | 224 }; |
224 | 225 |
225 class CommandLineInterfaceTest::NullCodeGenerator : public CodeGenerator { | 226 class CommandLineInterfaceTest::NullCodeGenerator : public CodeGenerator { |
226 public: | 227 public: |
227 NullCodeGenerator() : called_(false) {} | 228 NullCodeGenerator() : called_(false) {} |
228 ~NullCodeGenerator() {} | 229 ~NullCodeGenerator() {} |
229 | 230 |
230 mutable bool called_; | 231 mutable bool called_; |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
284 } | 285 } |
285 | 286 |
286 // Delete all the MockCodeGenerators. | 287 // Delete all the MockCodeGenerators. |
287 for (int i = 0; i < mock_generators_to_delete_.size(); i++) { | 288 for (int i = 0; i < mock_generators_to_delete_.size(); i++) { |
288 delete mock_generators_to_delete_[i]; | 289 delete mock_generators_to_delete_[i]; |
289 } | 290 } |
290 mock_generators_to_delete_.clear(); | 291 mock_generators_to_delete_.clear(); |
291 } | 292 } |
292 | 293 |
293 void CommandLineInterfaceTest::Run(const string& command) { | 294 void CommandLineInterfaceTest::Run(const string& command) { |
294 vector<string> args = Split(command, " ", true); | 295 std::vector<string> args = Split(command, " ", true); |
295 | 296 |
296 if (!disallow_plugins_) { | 297 if (!disallow_plugins_) { |
297 cli_.AllowPlugins("prefix-"); | 298 cli_.AllowPlugins("prefix-"); |
298 #ifndef GOOGLE_THIRD_PARTY_PROTOBUF | 299 #ifndef GOOGLE_THIRD_PARTY_PROTOBUF |
299 string plugin_path; | 300 string plugin_path; |
300 #ifdef GOOGLE_PROTOBUF_TEST_PLUGIN_PATH | 301 #ifdef GOOGLE_PROTOBUF_TEST_PLUGIN_PATH |
301 plugin_path = GOOGLE_PROTOBUF_TEST_PLUGIN_PATH; | 302 plugin_path = GOOGLE_PROTOBUF_TEST_PLUGIN_PATH; |
302 #else | 303 #else |
303 const char* possible_paths[] = { | 304 const char* possible_paths[] = { |
304 // When building with shared libraries, libtool hides the real executable | 305 // When building with shared libraries, libtool hides the real executable |
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
646 "--test_opt=foo3 " | 647 "--test_opt=foo3 " |
647 "--proto_path=$tmpdir foo.proto"); | 648 "--proto_path=$tmpdir foo.proto"); |
648 | 649 |
649 ExpectNoErrors(); | 650 ExpectNoErrors(); |
650 ExpectGenerated( | 651 ExpectGenerated( |
651 "test_generator", "bar,foo1,foo2,foo3", "foo.proto", "Foo", "a"); | 652 "test_generator", "bar,foo1,foo2,foo3", "foo.proto", "Foo", "a"); |
652 ExpectGenerated( | 653 ExpectGenerated( |
653 "test_generator", "baz,foo1,foo2,foo3", "foo.proto", "Foo", "b"); | 654 "test_generator", "baz,foo1,foo2,foo3", "foo.proto", "Foo", "b"); |
654 } | 655 } |
655 | 656 |
| 657 TEST_F(CommandLineInterfaceTest, ExtraPluginParameters) { |
| 658 // Test that generator parameters specified with the option flag are |
| 659 // correctly passed to the code generator. |
| 660 |
| 661 CreateTempFile("foo.proto", |
| 662 "syntax = \"proto2\";\n" |
| 663 "message Foo {}\n"); |
| 664 // Create the "a" and "b" sub-directories. |
| 665 CreateTempDir("a"); |
| 666 CreateTempDir("b"); |
| 667 |
| 668 Run("protocol_compiler " |
| 669 "--plug_opt=foo1 " |
| 670 "--plug_out=bar:$tmpdir/a " |
| 671 "--plug_opt=foo2 " |
| 672 "--plug_out=baz:$tmpdir/b " |
| 673 "--plug_opt=foo3 " |
| 674 "--proto_path=$tmpdir foo.proto"); |
| 675 |
| 676 ExpectNoErrors(); |
| 677 ExpectGenerated( |
| 678 "test_plugin", "bar,foo1,foo2,foo3", "foo.proto", "Foo", "a"); |
| 679 ExpectGenerated( |
| 680 "test_plugin", "baz,foo1,foo2,foo3", "foo.proto", "Foo", "b"); |
| 681 } |
| 682 |
| 683 TEST_F(CommandLineInterfaceTest, UnrecognizedExtraParameters) { |
| 684 CreateTempFile("foo.proto", |
| 685 "syntax = \"proto2\";\n" |
| 686 "message Foo {}\n"); |
| 687 |
| 688 Run("protocol_compiler --plug_out=TestParameter:$tmpdir " |
| 689 "--unknown_plug_opt=Foo " |
| 690 "--proto_path=$tmpdir foo.proto"); |
| 691 |
| 692 ExpectErrorSubstring("Unknown flag: --unknown_plug_opt"); |
| 693 } |
| 694 |
656 TEST_F(CommandLineInterfaceTest, Insert) { | 695 TEST_F(CommandLineInterfaceTest, Insert) { |
657 // Test running a generator that inserts code into another's output. | 696 // Test running a generator that inserts code into another's output. |
658 | 697 |
659 CreateTempFile("foo.proto", | 698 CreateTempFile("foo.proto", |
660 "syntax = \"proto2\";\n" | 699 "syntax = \"proto2\";\n" |
661 "message Foo {}\n"); | 700 "message Foo {}\n"); |
662 | 701 |
663 Run("protocol_compiler " | 702 Run("protocol_compiler " |
664 "--test_out=TestParameter:$tmpdir " | 703 "--test_out=TestParameter:$tmpdir " |
665 "--plug_out=TestPluginParameter:$tmpdir " | 704 "--plug_out=TestPluginParameter:$tmpdir " |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
712 "syntax = \"proto2\";\n" | 751 "syntax = \"proto2\";\n" |
713 "message Foo {}\n"); | 752 "message Foo {}\n"); |
714 | 753 |
715 Run("protocol_compiler --test_out=$tmpdir\\ " | 754 Run("protocol_compiler --test_out=$tmpdir\\ " |
716 "--proto_path=$tmpdir\\ foo.proto"); | 755 "--proto_path=$tmpdir\\ foo.proto"); |
717 | 756 |
718 ExpectNoErrors(); | 757 ExpectNoErrors(); |
719 ExpectGenerated("test_generator", "", "foo.proto", "Foo"); | 758 ExpectGenerated("test_generator", "", "foo.proto", "Foo"); |
720 } | 759 } |
721 | 760 |
| 761 TEST_F(CommandLineInterfaceTest, Win32ErrorMessage) { |
| 762 EXPECT_EQ("The system cannot find the file specified.\r\n", |
| 763 Subprocess::Win32ErrorMessage(ERROR_FILE_NOT_FOUND)); |
| 764 } |
| 765 |
722 #endif // defined(_WIN32) || defined(__CYGWIN__) | 766 #endif // defined(_WIN32) || defined(__CYGWIN__) |
723 | 767 |
724 TEST_F(CommandLineInterfaceTest, PathLookup) { | 768 TEST_F(CommandLineInterfaceTest, PathLookup) { |
725 // Test that specifying multiple directories in the proto search path works. | 769 // Test that specifying multiple directories in the proto search path works. |
726 | 770 |
727 CreateTempFile("b/bar.proto", | 771 CreateTempFile("b/bar.proto", |
728 "syntax = \"proto2\";\n" | 772 "syntax = \"proto2\";\n" |
729 "message Bar {}\n"); | 773 "message Bar {}\n"); |
730 CreateTempFile("a/foo.proto", | 774 CreateTempFile("a/foo.proto", |
731 "syntax = \"proto2\";\n" | 775 "syntax = \"proto2\";\n" |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
779 "syntax = \"proto2\";\n" | 823 "syntax = \"proto2\";\n" |
780 "message Foo {}\n"); | 824 "message Foo {}\n"); |
781 | 825 |
782 Run("protocol_compiler --test_out=$tmpdir " | 826 Run("protocol_compiler --test_out=$tmpdir " |
783 "--proto_path=bar=$tmpdir bar/foo.proto"); | 827 "--proto_path=bar=$tmpdir bar/foo.proto"); |
784 | 828 |
785 ExpectNoErrors(); | 829 ExpectNoErrors(); |
786 ExpectGenerated("test_generator", "", "bar/foo.proto", "Foo"); | 830 ExpectGenerated("test_generator", "", "bar/foo.proto", "Foo"); |
787 } | 831 } |
788 | 832 |
| 833 TEST_F(CommandLineInterfaceTest, PathWithEqualsSign) { |
| 834 // Test setting up a search path which happens to have '=' in it. |
| 835 |
| 836 CreateTempDir("with=sign"); |
| 837 CreateTempFile("with=sign/foo.proto", |
| 838 "syntax = \"proto2\";\n" |
| 839 "message Foo {}\n"); |
| 840 |
| 841 Run("protocol_compiler --test_out=$tmpdir " |
| 842 "--proto_path=$tmpdir/with=sign foo.proto"); |
| 843 |
| 844 ExpectNoErrors(); |
| 845 ExpectGenerated("test_generator", "", "foo.proto", "Foo"); |
| 846 } |
| 847 |
789 TEST_F(CommandLineInterfaceTest, MultipleGenerators) { | 848 TEST_F(CommandLineInterfaceTest, MultipleGenerators) { |
790 // Test that we can have multiple generators and use both in one invocation, | 849 // Test that we can have multiple generators and use both in one invocation, |
791 // each with a different output directory. | 850 // each with a different output directory. |
792 | 851 |
793 CreateTempFile("foo.proto", | 852 CreateTempFile("foo.proto", |
794 "syntax = \"proto2\";\n" | 853 "syntax = \"proto2\";\n" |
795 "message Foo {}\n"); | 854 "message Foo {}\n"); |
796 // Create the "a" and "b" sub-directories. | 855 // Create the "a" and "b" sub-directories. |
797 CreateTempDir("a"); | 856 CreateTempDir("a"); |
798 CreateTempDir("b"); | 857 CreateTempDir("b"); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
844 "message Foo {}\n" | 903 "message Foo {}\n" |
845 "service Bar {}\n"); | 904 "service Bar {}\n"); |
846 | 905 |
847 Run("protocol_compiler --test_out=$tmpdir " | 906 Run("protocol_compiler --test_out=$tmpdir " |
848 "--proto_path=$tmpdir foo.proto"); | 907 "--proto_path=$tmpdir foo.proto"); |
849 | 908 |
850 ExpectNoErrors(); | 909 ExpectNoErrors(); |
851 ExpectGenerated("test_generator", "", "foo.proto", "Foo"); | 910 ExpectGenerated("test_generator", "", "foo.proto", "Foo"); |
852 } | 911 } |
853 | 912 |
| 913 TEST_F(CommandLineInterfaceTest, DirectDependencies_Missing_EmptyList) { |
| 914 CreateTempFile("foo.proto", |
| 915 "syntax = \"proto2\";\n" |
| 916 "import \"bar.proto\";\n" |
| 917 "message Foo { optional Bar bar = 1; }"); |
| 918 CreateTempFile("bar.proto", |
| 919 "syntax = \"proto2\";\n" |
| 920 "message Bar { optional string text = 1; }"); |
| 921 |
| 922 Run("protocol_compiler --test_out=$tmpdir --proto_path=$tmpdir " |
| 923 "--direct_dependencies= foo.proto"); |
| 924 |
| 925 ExpectErrorText( |
| 926 "foo.proto: File is imported but not declared in --direct_dependencies: " |
| 927 "bar.proto\n"); |
| 928 } |
| 929 |
| 930 TEST_F(CommandLineInterfaceTest, DirectDependencies_Missing) { |
| 931 CreateTempFile("foo.proto", |
| 932 "syntax = \"proto2\";\n" |
| 933 "import \"bar.proto\";\n" |
| 934 "import \"bla.proto\";\n" |
| 935 "message Foo { optional Bar bar = 1; optional Bla bla = 2; }"); |
| 936 CreateTempFile("bar.proto", |
| 937 "syntax = \"proto2\";\n" |
| 938 "message Bar { optional string text = 1; }"); |
| 939 CreateTempFile("bla.proto", |
| 940 "syntax = \"proto2\";\n" |
| 941 "message Bla { optional int64 number = 1; }"); |
| 942 |
| 943 Run("protocol_compiler --test_out=$tmpdir --proto_path=$tmpdir " |
| 944 "--direct_dependencies=bla.proto foo.proto"); |
| 945 |
| 946 ExpectErrorText( |
| 947 "foo.proto: File is imported but not declared in --direct_dependencies: " |
| 948 "bar.proto\n"); |
| 949 } |
| 950 |
| 951 TEST_F(CommandLineInterfaceTest, DirectDependencies_NoViolation) { |
| 952 CreateTempFile("foo.proto", |
| 953 "syntax = \"proto2\";\n" |
| 954 "import \"bar.proto\";\n" |
| 955 "message Foo { optional Bar bar = 1; }"); |
| 956 CreateTempFile("bar.proto", |
| 957 "syntax = \"proto2\";\n" |
| 958 "message Bar { optional string text = 1; }"); |
| 959 |
| 960 Run("protocol_compiler --test_out=$tmpdir --proto_path=$tmpdir " |
| 961 "--direct_dependencies=bar.proto foo.proto"); |
| 962 |
| 963 ExpectNoErrors(); |
| 964 } |
| 965 |
| 966 TEST_F(CommandLineInterfaceTest, DirectDependencies_NoViolation_MultiImports) { |
| 967 CreateTempFile("foo.proto", |
| 968 "syntax = \"proto2\";\n" |
| 969 "import \"bar.proto\";\n" |
| 970 "import \"bla.proto\";\n" |
| 971 "message Foo { optional Bar bar = 1; optional Bla bla = 2; }"); |
| 972 CreateTempFile("bar.proto", |
| 973 "syntax = \"proto2\";\n" |
| 974 "message Bar { optional string text = 1; }"); |
| 975 CreateTempFile("bla.proto", |
| 976 "syntax = \"proto2\";\n" |
| 977 "message Bla { optional int64 number = 1; }"); |
| 978 |
| 979 Run("protocol_compiler --test_out=$tmpdir --proto_path=$tmpdir " |
| 980 "--direct_dependencies=bar.proto:bla.proto foo.proto"); |
| 981 |
| 982 ExpectNoErrors(); |
| 983 } |
| 984 |
| 985 TEST_F(CommandLineInterfaceTest, DirectDependencies_ProvidedMultipleTimes) { |
| 986 CreateTempFile("foo.proto", |
| 987 "syntax = \"proto2\";\n"); |
| 988 |
| 989 Run("protocol_compiler --test_out=$tmpdir --proto_path=$tmpdir " |
| 990 "--direct_dependencies=bar.proto --direct_dependencies=bla.proto " |
| 991 "foo.proto"); |
| 992 |
| 993 ExpectErrorText( |
| 994 "--direct_dependencies may only be passed once. To specify multiple " |
| 995 "direct dependencies, pass them all as a single parameter separated by " |
| 996 "':'.\n"); |
| 997 } |
| 998 |
854 TEST_F(CommandLineInterfaceTest, CwdRelativeInputs) { | 999 TEST_F(CommandLineInterfaceTest, CwdRelativeInputs) { |
855 // Test that we can accept working-directory-relative input files. | 1000 // Test that we can accept working-directory-relative input files. |
856 | 1001 |
857 SetInputsAreProtoPathRelative(false); | 1002 SetInputsAreProtoPathRelative(false); |
858 | 1003 |
859 CreateTempFile("foo.proto", | 1004 CreateTempFile("foo.proto", |
860 "syntax = \"proto2\";\n" | 1005 "syntax = \"proto2\";\n" |
861 "message Foo {}\n"); | 1006 "message Foo {}\n"); |
862 | 1007 |
863 Run("protocol_compiler --test_out=$tmpdir " | 1008 Run("protocol_compiler --test_out=$tmpdir " |
(...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1431 "syntax = \"proto2\";\n" | 1576 "syntax = \"proto2\";\n" |
1432 "message MockCodeGenerator_HasJsonName {\n" | 1577 "message MockCodeGenerator_HasJsonName {\n" |
1433 " optional int32 value = 1;\n" | 1578 " optional int32 value = 1;\n" |
1434 "}\n"); | 1579 "}\n"); |
1435 | 1580 |
1436 Run("protocol_compiler --plug_out=$tmpdir --proto_path=$tmpdir foo.proto"); | 1581 Run("protocol_compiler --plug_out=$tmpdir --proto_path=$tmpdir foo.proto"); |
1437 | 1582 |
1438 ExpectErrorSubstring("Saw json_name: 1"); | 1583 ExpectErrorSubstring("Saw json_name: 1"); |
1439 } | 1584 } |
1440 | 1585 |
| 1586 TEST_F(CommandLineInterfaceTest, PluginReceivesCompilerVersion) { |
| 1587 CreateTempFile("foo.proto", |
| 1588 "syntax = \"proto2\";\n" |
| 1589 "message MockCodeGenerator_ShowVersionNumber {\n" |
| 1590 " optional int32 value = 1;\n" |
| 1591 "}\n"); |
| 1592 |
| 1593 Run("protocol_compiler --plug_out=$tmpdir --proto_path=$tmpdir foo.proto"); |
| 1594 |
| 1595 ExpectErrorSubstring( |
| 1596 StringPrintf("Saw compiler_version: %d %s", |
| 1597 GOOGLE_PROTOBUF_VERSION, |
| 1598 GOOGLE_PROTOBUF_VERSION_SUFFIX)); |
| 1599 } |
| 1600 |
1441 TEST_F(CommandLineInterfaceTest, GeneratorPluginNotFound) { | 1601 TEST_F(CommandLineInterfaceTest, GeneratorPluginNotFound) { |
1442 // Test what happens if the plugin isn't found. | 1602 // Test what happens if the plugin isn't found. |
1443 | 1603 |
1444 CreateTempFile("error.proto", | 1604 CreateTempFile("error.proto", |
1445 "syntax = \"proto2\";\n" | 1605 "syntax = \"proto2\";\n" |
1446 "message Foo {}\n"); | 1606 "message Foo {}\n"); |
1447 | 1607 |
1448 Run("protocol_compiler --badplug_out=TestParameter:$tmpdir " | 1608 Run("protocol_compiler --badplug_out=TestParameter:$tmpdir " |
1449 "--plugin=prefix-gen-badplug=no_such_file " | 1609 "--plugin=prefix-gen-badplug=no_such_file " |
1450 "--proto_path=$tmpdir error.proto"); | 1610 "--proto_path=$tmpdir error.proto"); |
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1705 } | 1865 } |
1706 } | 1866 } |
1707 | 1867 |
1708 return result; | 1868 return result; |
1709 } | 1869 } |
1710 | 1870 |
1711 enum Type { TEXT, BINARY }; | 1871 enum Type { TEXT, BINARY }; |
1712 enum ReturnCode { SUCCESS, ERROR }; | 1872 enum ReturnCode { SUCCESS, ERROR }; |
1713 | 1873 |
1714 bool Run(const string& command) { | 1874 bool Run(const string& command) { |
1715 vector<string> args; | 1875 std::vector<string> args; |
1716 args.push_back("protoc"); | 1876 args.push_back("protoc"); |
1717 SplitStringUsing(command, " ", &args); | 1877 SplitStringUsing(command, " ", &args); |
1718 args.push_back("--proto_path=" + TestSourceDir()); | 1878 args.push_back("--proto_path=" + TestSourceDir()); |
1719 | 1879 |
1720 google::protobuf::scoped_array<const char * > argv(new const char* [args.siz
e()]); | 1880 google::protobuf::scoped_array<const char * > argv(new const char* [args.siz
e()]); |
1721 for (int i = 0; i < args.size(); i++) { | 1881 for (int i = 0; i < args.size(); i++) { |
1722 argv[i] = args[i].c_str(); | 1882 argv[i] = args[i].c_str(); |
1723 } | 1883 } |
1724 | 1884 |
1725 CommandLineInterface cli; | 1885 CommandLineInterface cli; |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1825 "google/protobuf/no_such_file.proto: File not found.\n"); | 1985 "google/protobuf/no_such_file.proto: File not found.\n"); |
1826 } | 1986 } |
1827 | 1987 |
1828 } // anonymous namespace | 1988 } // anonymous namespace |
1829 | 1989 |
1830 #endif // !GOOGLE_PROTOBUF_HEAP_CHECK_DRACONIAN | 1990 #endif // !GOOGLE_PROTOBUF_HEAP_CHECK_DRACONIAN |
1831 | 1991 |
1832 } // namespace compiler | 1992 } // namespace compiler |
1833 } // namespace protobuf | 1993 } // namespace protobuf |
1834 } // namespace google | 1994 } // namespace google |
OLD | NEW |