diff --git a/lib/tapioca/dsl/compilers/protobuf.rb b/lib/tapioca/dsl/compilers/protobuf.rb index 0ca13d984..21d57805b 100644 --- a/lib/tapioca/dsl/compilers/protobuf.rb +++ b/lib/tapioca/dsl/compilers/protobuf.rb @@ -95,7 +95,18 @@ def decorate case descriptor when Google::Protobuf::EnumDescriptor descriptor.to_h.each do |sym, val| - klass.create_constant(sym.to_s, value: val.to_s) + # For each enum value, create a namespaced constant on the root rather than an un-namespaced + # constant within the class. This is because un-namespaced constants might conflict with reserved + # Ruby words, such as "BEGIN." By namespacing them, we avoid this problem. + # + # Invalid syntax: + # class Foo + # BEGIN = 3 + # end + # + # Valid syntax: + # Foo::BEGIN = 3 + root.create_constant("#{constant}::#{sym}", value: val.to_s) end klass.create_method( diff --git a/spec/tapioca/dsl/compilers/protobuf_spec.rb b/spec/tapioca/dsl/compilers/protobuf_spec.rb index 174d541a8..e1bef6865 100644 --- a/spec/tapioca/dsl/compilers/protobuf_spec.rb +++ b/spec/tapioca/dsl/compilers/protobuf_spec.rb @@ -193,11 +193,11 @@ def lookup(number); end sig { params(symbol: Symbol).returns(T.nilable(Integer)) } def resolve(symbol); end end - - FIXED_AMOUNT = 1 - NULL = 0 - PERCENTAGE = 2 end + + Cart::VALUE_TYPE::FIXED_AMOUNT = 1 + Cart::VALUE_TYPE::NULL = 0 + Cart::VALUE_TYPE::PERCENTAGE = 2 RBI assert_equal(expected_enum_rbi, rbi_for("Cart::VALUE_TYPE"))