Przeglądaj źródła

Add prefix to php reserved keywords.

Bo Yang 8 lat temu
rodzic
commit
e5d000cbb7

+ 4 - 0
Makefile.am

@@ -686,6 +686,10 @@ php_EXTRA_DIST=                                                       \
   php/tests/proto/test_no_namespace.proto                             \
   php/tests/proto/test_php_namespace.proto                            \
   php/tests/proto/test_prefix.proto                                   \
+  php/tests/proto/test_reserved_enum_lower.proto                      \
+  php/tests/proto/test_reserved_enum_upper.proto                      \
+  php/tests/proto/test_reserved_message_lower.proto                   \
+  php/tests/proto/test_reserved_message_upper.proto                   \
   php/tests/proto/test_service.proto                                  \
   php/tests/proto/test_service_namespace.proto                        \
   php/tests/test.sh                                                   \

+ 27 - 3
php/ext/google/protobuf/def.c

@@ -30,8 +30,23 @@
 
 #include "protobuf.h"
 
-const char* const kReservedNames[] = {"Empty", "ECHO", "ARRAY"};
-const int kReservedNamesSize = 3;
+const char *const kReservedNames[] = {
+    "abstract",   "and",        "array",        "as",           "break",
+    "callable",   "case",       "catch",        "class",        "clone",
+    "const",      "continue",   "declare",      "default",      "die",
+    "do",         "echo",       "else",         "elseif",       "empty",
+    "enddeclare", "endfor",     "endforeach",   "endif",        "endswitch",
+    "endwhile",   "eval",       "exit",         "extends",      "final",
+    "for",        "foreach",    "function",     "global",       "goto",
+    "if",         "implements", "include",      "include_once", "instanceof",
+    "insteadof",  "interface",  "isset",        "list",         "namespace",
+    "new",        "or",         "print",        "private",      "protected",
+    "public",     "require",    "require_once", "return",       "static",
+    "switch",     "throw",      "trait",        "try",          "unset",
+    "use",        "var",        "while",        "xor",          "int",
+    "float",      "bool",       "string",       "true",         "false",
+    "null",       "void",       "iterable"};
+const int kReservedNamesSize = 73;
 
 // Forward declare.
 static void descriptor_init_c_instance(Descriptor* intern TSRMLS_DC);
@@ -774,12 +789,21 @@ static const char *classname_prefix(const char *classname,
     return prefix_given;
   }
 
+  char* lower = ALLOC_N(char, strlen(classname) + 1);
+  i = 0;
+  while(classname[i]) {
+    lower[i] = (char)tolower(classname[i]);
+    i++;
+  }
+  lower[i] = 0;
+
   for (i = 0; i < kReservedNamesSize; i++) {
-    if (strcmp(kReservedNames[i], classname) == 0) {
+    if (strcmp(kReservedNames[i], lower) == 0) {
       is_reserved = true;
       break;
     }
   }
+  FREE(lower);
 
   if (is_reserved) {
     if (package_name != NULL && strcmp("google.protobuf", package_name) == 0) {

+ 16 - 2
php/src/Google/Protobuf/Internal/GPBUtil.php

@@ -252,9 +252,23 @@ class GPBUtil
             return $prefix;
         }
 
-        $reserved_words = array("Empty", "ECHO", "ARRAY");
+        $reserved_words = array(
+            "abstract", "and", "array", "as", "break", "callable", "case",
+            "catch", "class", "clone", "const", "continue", "declare",
+            "default", "die", "do", "echo", "else", "elseif", "empty",
+            "enddeclare", "endfor", "endforeach", "endif", "endswitch",
+            "endwhile", "eval", "exit", "extends", "final", "for", "foreach",
+            "function", "global", "goto", "if", "implements", "include",
+            "include_once", "instanceof", "insteadof", "interface", "isset",
+            "list", "namespace", "new", "or", "print", "private", "protected",
+            "public", "require", "require_once", "return", "static", "switch",
+            "throw", "trait", "try", "unset", "use", "var", "while", "xor",
+            "int", "float", "bool", "string", "true", "false", "null", "void",
+            "iterable"
+
+        );
         foreach ($reserved_words as $reserved_word) {
-            if ($classname === $reserved_word) {
+            if (strtolower($classname) === $reserved_word) {
                 if ($file_proto->getPackage() === "google.protobuf") {
                     return "GPB";
                 } else {

+ 222 - 0
php/tests/generated_class_test.php

@@ -691,6 +691,228 @@ class GeneratedClassTest extends TestBase
         $m = new \Foo\PBEmpty();
         $m = new \PrefixEmpty();
         $m = new \Foo\PBARRAY();
+
+        $m = new \Lower\PBabstract();
+        $m = new \Lower\PBand();
+        $m = new \Lower\PBarray();
+        $m = new \Lower\PBas();
+        $m = new \Lower\PBbreak();
+        $m = new \Lower\PBcallable();
+        $m = new \Lower\PBcase();
+        $m = new \Lower\PBcatch();
+        $m = new \Lower\PBclass();
+        $m = new \Lower\PBclone();
+        $m = new \Lower\PBconst();
+        $m = new \Lower\PBcontinue();
+        $m = new \Lower\PBdeclare();
+        $m = new \Lower\PBdefault();
+        $m = new \Lower\PBdie();
+        $m = new \Lower\PBdo();
+        $m = new \Lower\PBecho();
+        $m = new \Lower\PBelse();
+        $m = new \Lower\PBelseif();
+        $m = new \Lower\PBempty();
+        $m = new \Lower\PBenddeclare();
+        $m = new \Lower\PBendfor();
+        $m = new \Lower\PBendforeach();
+        $m = new \Lower\PBendif();
+        $m = new \Lower\PBendswitch();
+        $m = new \Lower\PBendwhile();
+        $m = new \Lower\PBeval();
+        $m = new \Lower\PBexit();
+        $m = new \Lower\PBextends();
+        $m = new \Lower\PBfinal();
+        $m = new \Lower\PBfor();
+        $m = new \Lower\PBforeach();
+        $m = new \Lower\PBfunction();
+        $m = new \Lower\PBglobal();
+        $m = new \Lower\PBgoto();
+        $m = new \Lower\PBif();
+        $m = new \Lower\PBimplements();
+        $m = new \Lower\PBinclude();
+        $m = new \Lower\PBinclude_once();
+        $m = new \Lower\PBinstanceof();
+        $m = new \Lower\PBinsteadof();
+        $m = new \Lower\PBinterface();
+        $m = new \Lower\PBisset();
+        $m = new \Lower\PBlist();
+        $m = new \Lower\PBnamespace();
+        $m = new \Lower\PBnew();
+        $m = new \Lower\PBor();
+        $m = new \Lower\PBprint();
+        $m = new \Lower\PBprivate();
+        $m = new \Lower\PBprotected();
+        $m = new \Lower\PBpublic();
+        $m = new \Lower\PBrequire();
+        $m = new \Lower\PBrequire_once();
+        $m = new \Lower\PBreturn();
+        $m = new \Lower\PBstatic();
+        $m = new \Lower\PBswitch();
+        $m = new \Lower\PBthrow();
+        $m = new \Lower\PBtrait();
+        $m = new \Lower\PBtry();
+        $m = new \Lower\PBunset();
+        $m = new \Lower\PBuse();
+        $m = new \Lower\PBvar();
+        $m = new \Lower\PBwhile();
+        $m = new \Lower\PBxor();
+        $m = new \Lower\PBint();
+        $m = new \Lower\PBfloat();
+        $m = new \Lower\PBbool();
+        $m = new \Lower\PBstring();
+        $m = new \Lower\PBtrue();
+        $m = new \Lower\PBfalse();
+        $m = new \Lower\PBnull();
+        $m = new \Lower\PBvoid();
+        $m = new \Lower\PBiterable();
+
+        $m = new \Upper\PBABSTRACT();
+        $m = new \Upper\PBAND();
+        $m = new \Upper\PBARRAY();
+        $m = new \Upper\PBAS();
+        $m = new \Upper\PBBREAK();
+        $m = new \Upper\PBCALLABLE();
+        $m = new \Upper\PBCASE();
+        $m = new \Upper\PBCATCH();
+        $m = new \Upper\PBCLASS();
+        $m = new \Upper\PBCLONE();
+        $m = new \Upper\PBCONST();
+        $m = new \Upper\PBCONTINUE();
+        $m = new \Upper\PBDECLARE();
+        $m = new \Upper\PBDEFAULT();
+        $m = new \Upper\PBDIE();
+        $m = new \Upper\PBDO();
+        $m = new \Upper\PBECHO();
+        $m = new \Upper\PBELSE();
+        $m = new \Upper\PBELSEIF();
+        $m = new \Upper\PBEMPTY();
+        $m = new \Upper\PBENDDECLARE();
+        $m = new \Upper\PBENDFOR();
+        $m = new \Upper\PBENDFOREACH();
+        $m = new \Upper\PBENDIF();
+        $m = new \Upper\PBENDSWITCH();
+        $m = new \Upper\PBENDWHILE();
+        $m = new \Upper\PBEVAL();
+        $m = new \Upper\PBEXIT();
+        $m = new \Upper\PBEXTENDS();
+        $m = new \Upper\PBFINAL();
+        $m = new \Upper\PBFOR();
+        $m = new \Upper\PBFOREACH();
+        $m = new \Upper\PBFUNCTION();
+        $m = new \Upper\PBGLOBAL();
+        $m = new \Upper\PBGOTO();
+        $m = new \Upper\PBIF();
+        $m = new \Upper\PBIMPLEMENTS();
+        $m = new \Upper\PBINCLUDE();
+        $m = new \Upper\PBINCLUDE_ONCE();
+        $m = new \Upper\PBINSTANCEOF();
+        $m = new \Upper\PBINSTEADOF();
+        $m = new \Upper\PBINTERFACE();
+        $m = new \Upper\PBISSET();
+        $m = new \Upper\PBLIST();
+        $m = new \Upper\PBNAMESPACE();
+        $m = new \Upper\PBNEW();
+        $m = new \Upper\PBOR();
+        $m = new \Upper\PBPRINT();
+        $m = new \Upper\PBPRIVATE();
+        $m = new \Upper\PBPROTECTED();
+        $m = new \Upper\PBPUBLIC();
+        $m = new \Upper\PBREQUIRE();
+        $m = new \Upper\PBREQUIRE_ONCE();
+        $m = new \Upper\PBRETURN();
+        $m = new \Upper\PBSTATIC();
+        $m = new \Upper\PBSWITCH();
+        $m = new \Upper\PBTHROW();
+        $m = new \Upper\PBTRAIT();
+        $m = new \Upper\PBTRY();
+        $m = new \Upper\PBUNSET();
+        $m = new \Upper\PBUSE();
+        $m = new \Upper\PBVAR();
+        $m = new \Upper\PBWHILE();
+        $m = new \Upper\PBXOR();
+        $m = new \Upper\PBINT();
+        $m = new \Upper\PBFLOAT();
+        $m = new \Upper\PBBOOL();
+        $m = new \Upper\PBSTRING();
+        $m = new \Upper\PBTRUE();
+        $m = new \Upper\PBFALSE();
+        $m = new \Upper\PBNULL();
+        $m = new \Upper\PBVOID();
+        $m = new \Upper\PBITERABLE();
+
+        $m = \Lower_enum\NotAllowed::PBabstract;
+        $m = \Lower_enum\NotAllowed::PBand;
+        $m = \Lower_enum\NotAllowed::PBarray;
+        $m = \Lower_enum\NotAllowed::PBas;
+        $m = \Lower_enum\NotAllowed::PBbreak;
+        $m = \Lower_enum\NotAllowed::PBcallable;
+        $m = \Lower_enum\NotAllowed::PBcase;
+        $m = \Lower_enum\NotAllowed::PBcatch;
+        $m = \Lower_enum\NotAllowed::PBclass;
+        $m = \Lower_enum\NotAllowed::PBclone;
+        $m = \Lower_enum\NotAllowed::PBconst;
+        $m = \Lower_enum\NotAllowed::PBcontinue;
+        $m = \Lower_enum\NotAllowed::PBdeclare;
+        $m = \Lower_enum\NotAllowed::PBdefault;
+        $m = \Lower_enum\NotAllowed::PBdie;
+        $m = \Lower_enum\NotAllowed::PBdo;
+        $m = \Lower_enum\NotAllowed::PBecho;
+        $m = \Lower_enum\NotAllowed::PBelse;
+        $m = \Lower_enum\NotAllowed::PBelseif;
+        $m = \Lower_enum\NotAllowed::PBempty;
+        $m = \Lower_enum\NotAllowed::PBenddeclare;
+        $m = \Lower_enum\NotAllowed::PBendfor;
+        $m = \Lower_enum\NotAllowed::PBendforeach;
+        $m = \Lower_enum\NotAllowed::PBendif;
+        $m = \Lower_enum\NotAllowed::PBendswitch;
+        $m = \Lower_enum\NotAllowed::PBendwhile;
+        $m = \Lower_enum\NotAllowed::PBeval;
+        $m = \Lower_enum\NotAllowed::PBexit;
+        $m = \Lower_enum\NotAllowed::PBextends;
+        $m = \Lower_enum\NotAllowed::PBfinal;
+        $m = \Lower_enum\NotAllowed::PBfor;
+        $m = \Lower_enum\NotAllowed::PBforeach;
+        $m = \Lower_enum\NotAllowed::PBfunction;
+        $m = \Lower_enum\NotAllowed::PBglobal;
+        $m = \Lower_enum\NotAllowed::PBgoto;
+        $m = \Lower_enum\NotAllowed::PBif;
+        $m = \Lower_enum\NotAllowed::PBimplements;
+        $m = \Lower_enum\NotAllowed::PBinclude;
+        $m = \Lower_enum\NotAllowed::PBinclude_once;
+        $m = \Lower_enum\NotAllowed::PBinstanceof;
+        $m = \Lower_enum\NotAllowed::PBinsteadof;
+        $m = \Lower_enum\NotAllowed::PBinterface;
+        $m = \Lower_enum\NotAllowed::PBisset;
+        $m = \Lower_enum\NotAllowed::PBlist;
+        $m = \Lower_enum\NotAllowed::PBnamespace;
+        $m = \Lower_enum\NotAllowed::PBnew;
+        $m = \Lower_enum\NotAllowed::PBor;
+        $m = \Lower_enum\NotAllowed::PBprint;
+        $m = \Lower_enum\NotAllowed::PBprivate;
+        $m = \Lower_enum\NotAllowed::PBprotected;
+        $m = \Lower_enum\NotAllowed::PBpublic;
+        $m = \Lower_enum\NotAllowed::PBrequire;
+        $m = \Lower_enum\NotAllowed::PBrequire_once;
+        $m = \Lower_enum\NotAllowed::PBreturn;
+        $m = \Lower_enum\NotAllowed::PBstatic;
+        $m = \Lower_enum\NotAllowed::PBswitch;
+        $m = \Lower_enum\NotAllowed::PBthrow;
+        $m = \Lower_enum\NotAllowed::PBtrait;
+        $m = \Lower_enum\NotAllowed::PBtry;
+        $m = \Lower_enum\NotAllowed::PBunset;
+        $m = \Lower_enum\NotAllowed::PBuse;
+        $m = \Lower_enum\NotAllowed::PBvar;
+        $m = \Lower_enum\NotAllowed::PBwhile;
+        $m = \Lower_enum\NotAllowed::PBxor;
+        $m = \Lower_enum\NotAllowed::PBint;
+        $m = \Lower_enum\NotAllowed::PBfloat;
+        $m = \Lower_enum\NotAllowed::PBbool;
+        $m = \Lower_enum\NotAllowed::PBstring;
+        $m = \Lower_enum\NotAllowed::PBtrue;
+        $m = \Lower_enum\NotAllowed::PBfalse;
+        $m = \Lower_enum\NotAllowed::PBnull;
+        $m = \Lower_enum\NotAllowed::PBvoid;
+        $m = \Lower_enum\NotAllowed::PBiterable;
     }
 
     #########################################################

+ 79 - 0
php/tests/proto/test_reserved_enum_lower.proto

@@ -0,0 +1,79 @@
+syntax = "proto3";
+
+package lower_enum;
+
+enum NotAllowed {
+  abstract = 0;
+  and = 1;
+  array = 2;
+  as = 3;
+  break = 4;
+  callable = 5;
+  case     = 6;
+  catch    = 7;
+  class    = 8;
+  clone    = 9;
+  const    = 10;
+  continue = 11;
+  declare  = 12;
+  default  = 13;
+  die      = 14;
+  do       = 15;
+  echo     = 16;
+  else     = 17;
+  elseif   = 18;
+  empty    = 19;
+  enddeclare = 20;
+  endfor     = 21;
+  endforeach = 22;
+  endif      = 23;
+  endswitch = 24;
+  endwhile = 25;
+  eval = 26;
+  exit = 27;
+  extends = 28;
+  final = 29;
+  for = 30;
+  foreach = 31;
+  function = 32;
+  global = 33;
+  goto = 34;
+  if = 35;
+  implements = 36;
+  include = 37;
+  include_once = 38;
+  instanceof = 39;
+  insteadof = 40;
+  interface = 41;
+  isset = 42;
+  list = 43;
+  namespace = 44;
+  new = 45;
+  or = 46;
+  print = 47;
+  private = 48;
+  protected = 49;
+  public = 50;
+  require = 51;
+  require_once = 52;
+  return = 53;
+  static = 54;
+  switch = 55;
+  throw = 56;
+  trait = 57;
+  try = 58;
+  unset = 59;
+  use = 60;
+  var = 61;
+  while = 62;
+  xor = 63;
+  int = 64;
+  float = 65;
+  bool = 66;
+  string = 67;
+  true = 68;
+  false = 69;
+  null = 70;
+  void = 71;
+  iterable = 72;
+}

+ 79 - 0
php/tests/proto/test_reserved_enum_upper.proto

@@ -0,0 +1,79 @@
+syntax = "proto3";
+
+package upper_enum;
+
+enum NotAllowed {
+  ABSTRACT = 0;
+  AND = 1;
+  ARRAY = 2;
+  AS = 3;
+  BREAK = 4;
+  CALLABLE = 5;
+  CASE     = 6;
+  CATCH    = 7;
+  CLASS    = 8;
+  CLONE    = 9;
+  CONST    = 10;
+  CONTINUE = 11;
+  DECLARE  = 12;
+  DEFAULT  = 13;
+  DIE      = 14;
+  DO       = 15;
+  ECHO     = 16;
+  ELSE     = 17;
+  ELSEIF   = 18;
+  EMPTY    = 19;
+  ENDDECLARE = 20;
+  ENDFOR     = 21;
+  ENDFOREACH = 22;
+  ENDIF      = 23;
+  ENDSWITCH = 24;
+  ENDWHILE = 25;
+  EVAL = 26;
+  EXIT = 27;
+  EXTENDS = 28;
+  FINAL = 29;
+  FOR = 30;
+  FOREACH = 31;
+  FUNCTION = 32;
+  GLOBAL = 33;
+  GOTO = 34;
+  IF = 35;
+  IMPLEMENTS = 36;
+  INCLUDE = 37;
+  INCLUDE_ONCE = 38;
+  INSTANCEOF = 39;
+  INSTEADOF = 40;
+  INTERFACE = 41;
+  ISSET = 42;
+  LIST = 43;
+  NAMESPACE = 44;
+  NEW = 45;
+  OR = 46;
+  PRINT = 47;
+  PRIVATE = 48;
+  PROTECTED = 49;
+  PUBLIC = 50;
+  REQUIRE = 51;
+  REQUIRE_ONCE = 52;
+  RETURN = 53;
+  STATIC = 54;
+  SWITCH = 55;
+  THROW = 56;
+  TRAIT = 57;
+  TRY = 58;
+  UNSET = 59;
+  USE = 60;
+  VAR = 61;
+  WHILE = 62;
+  XOR = 63;
+  INT = 64;
+  FLOAT = 65;
+  BOOL = 66;
+  STRING = 67;
+  TRUE = 68;
+  FALSE = 69;
+  NULL = 70;
+  VOID = 71;
+  ITERABLE = 72;
+}

+ 77 - 0
php/tests/proto/test_reserved_message_lower.proto

@@ -0,0 +1,77 @@
+syntax = "proto3";
+
+package lower;
+
+message abstract {}
+message and {}
+message array {}
+message as {}
+message break {}
+message callable {}
+message case {}
+message catch {}
+message class {}
+message clone {}
+message const {}
+message continue {}
+message declare {}
+message default {}
+message die {}
+message do {}
+message echo {}
+message else {}
+message elseif {}
+message empty {}
+message enddeclare {}
+message endfor {}
+message endforeach {}
+message endif {}
+message endswitch {}
+message endwhile {}
+message eval {}
+message exit {}
+message extends {}
+message final {}
+message for {}
+message foreach {}
+message function {}
+message global {}
+message goto {}
+message if {}
+message implements {}
+message include {}
+message include_once {}
+message instanceof {}
+message insteadof {}
+message interface {}
+message isset {}
+message list {}
+message namespace {}
+message new {}
+message or {}
+message print {}
+message private {}
+message protected {}
+message public {}
+message require {}
+message require_once {}
+message return {}
+message static {}
+message switch {}
+message throw {}
+message trait {}
+message try {}
+message unset {}
+message use {}
+message var {}
+message while {}
+message xor {}
+message int {}
+message float {}
+message bool {}
+message string {}
+message true {}
+message false {}
+message null {}
+message void {}
+message iterable {}

+ 77 - 0
php/tests/proto/test_reserved_message_upper.proto

@@ -0,0 +1,77 @@
+syntax = "proto3";
+
+package upper;
+
+message ABSTRACT {}
+message AND {}
+message ARRAY {}
+message AS {}
+message BREAK {}
+message CALLABLE {}
+message CASE {}
+message CATCH {}
+message CLASS {}
+message CLONE {}
+message CONST {}
+message CONTINUE {}
+message DECLARE {}
+message DEFAULT {}
+message DIE {}
+message DO {}
+message ECHO {}
+message ELSE {}
+message ELSEIF {}
+message EMPTY {}
+message ENDDECLARE {}
+message ENDFOR {}
+message ENDFOREACH {}
+message ENDIF {}
+message ENDSWITCH {}
+message ENDWHILE {}
+message EVAL {}
+message EXIT {}
+message EXTENDS {}
+message FINAL {}
+message FOR {}
+message FOREACH {}
+message FUNCTION {}
+message GLOBAL {}
+message GOTO {}
+message IF {}
+message IMPLEMENTS {}
+message INCLUDE {}
+message INCLUDE_ONCE {}
+message INSTANCEOF {}
+message INSTEADOF {}
+message INTERFACE {}
+message ISSET {}
+message LIST {}
+message NAMESPACE {}
+message NEW {}
+message OR {}
+message PRINT {}
+message PRIVATE {}
+message PROTECTED {}
+message PUBLIC {}
+message REQUIRE {}
+message REQUIRE_ONCE {}
+message RETURN {}
+message STATIC {}
+message SWITCH {}
+message THROW {}
+message TRAIT {}
+message TRY {}
+message UNSET {}
+message USE {}
+message VAR {}
+message WHILE {}
+message XOR {}
+message INT {}
+message FLOAT {}
+message BOOL {}
+message STRING {}
+message TRUE {}
+message FALSE {}
+message NULL {}
+message VOID {}
+message ITERABLE {}

+ 21 - 3
src/google/protobuf/compiler/php/php_generator.cc

@@ -49,8 +49,23 @@ const std::string kDescriptorMetadataFile =
     "GPBMetadata/Google/Protobuf/Internal/Descriptor.php";
 const std::string kDescriptorDirName = "Google/Protobuf/Internal";
 const std::string kDescriptorPackageName = "Google\\Protobuf\\Internal";
-const char* const kReservedNames[] = {"ARRAY", "Empty", "ECHO"};
-const int kReservedNamesSize = 3;
+const char* const kReservedNames[] = {
+    "abstract",   "and",        "array",        "as",           "break",
+    "callable",   "case",       "catch",        "class",        "clone",
+    "const",      "continue",   "declare",      "default",      "die",
+    "do",         "echo",       "else",         "elseif",       "empty",
+    "enddeclare", "endfor",     "endforeach",   "endif",        "endswitch",
+    "endwhile",   "eval",       "exit",         "extends",      "final",
+    "for",        "foreach",    "function",     "global",       "goto",
+    "if",         "implements", "include",      "include_once", "instanceof",
+    "insteadof",  "interface",  "isset",        "list",         "namespace",
+    "new",        "or",         "print",        "private",      "protected",
+    "public",     "require",    "require_once", "return",       "static",
+    "switch",     "throw",      "trait",        "try",          "unset",
+    "use",        "var",        "while",        "xor",          "int",
+    "float",      "bool",       "string",       "true",         "false",
+    "null",       "void",       "iterable"};
+const int kReservedNamesSize = 73;
 const int kFieldSetter = 1;
 const int kFieldGetter = 2;
 const int kFieldProperty = 3;
@@ -125,8 +140,11 @@ std::string ClassNamePrefix(const string& classname,
 
   bool is_reserved = false;
 
+  string lower = classname;
+  transform(lower.begin(), lower.end(), lower.begin(), ::tolower);
+
   for (int i = 0; i < kReservedNamesSize; i++) {
-    if (classname == kReservedNames[i]) {
+    if (lower == kReservedNames[i]) {
       is_reserved = true;
       break;
     }

+ 13 - 9
tests.sh

@@ -346,15 +346,19 @@ generate_php_test_proto() {
   # Generate test file
   rm -rf generated
   mkdir generated
-  ../../src/protoc --php_out=generated   \
-    proto/test.proto                     \
-    proto/test_include.proto             \
-    proto/test_no_namespace.proto        \
-    proto/test_prefix.proto              \
-    proto/test_php_namespace.proto       \
-    proto/test_empty_php_namespace.proto \
-    proto/test_service.proto             \
-    proto/test_service_namespace.proto   \
+  ../../src/protoc --php_out=generated      \
+    proto/test.proto                        \
+    proto/test_include.proto                \
+    proto/test_no_namespace.proto           \
+    proto/test_prefix.proto                 \
+    proto/test_php_namespace.proto          \
+    proto/test_empty_php_namespace.proto    \
+    proto/test_reserved_enum_lower.proto    \
+    proto/test_reserved_enum_upper.proto    \
+    proto/test_reserved_message_lower.proto \
+    proto/test_reserved_message_upper.proto \
+    proto/test_service.proto                \
+    proto/test_service_namespace.proto      \
     proto/test_descriptors.proto
   pushd ../../src
   ./protoc --php_out=../php/tests/generated google/protobuf/empty.proto