Skip to content

Commit

Permalink
stop requiring extension fields to have a synthetic oneof
Browse files Browse the repository at this point in the history
  • Loading branch information
ericsalo authored and copybara-github committed Oct 3, 2022
1 parent 5732824 commit 0f585c6
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 4 deletions.
31 changes: 31 additions & 0 deletions BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -637,6 +637,25 @@ upb_proto_library(
deps = [":msg_test_proto"],
)

proto_library(
name = "proto3_test_proto",
testonly = 1,
srcs = ["upb/proto3_test.proto"],
deps = ["@com_google_protobuf//:descriptor_proto"],
)

upb_proto_library(
name = "proto3_test_upb_proto",
testonly = 1,
deps = [":proto3_test_proto"],
)

upb_proto_reflection_library(
name = "proto3_test_upb_proto_reflection",
testonly = 1,
deps = [":proto3_test_proto"],
)

upb_proto_reflection_library(
name = "msg_test_upb_proto_reflection",
testonly = 1,
Expand Down Expand Up @@ -685,6 +704,18 @@ cc_test(
],
)

cc_test(
name = "proto3_test",
srcs = ["upb/proto3_test.cc"],
copts = UPB_DEFAULT_CPPOPTS,
deps = [
":proto3_test_upb_proto",
":proto3_test_upb_proto_reflection",
":reflection",
"@com_google_googletest//:gtest_main",
],
)

cc_test(
name = "test_cpp",
srcs = ["upb/test_cpp.cc"],
Expand Down
37 changes: 37 additions & 0 deletions upb/proto3_test.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/*
* Copyright (c) 2009-2021, Google LLC
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Google LLC nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#include "gtest/gtest.h"
#include "upb/proto3_test.upb.h"
#include "upb/proto3_test.upbdefs.h"
#include "upb/reflection/def.hpp"

TEST(Proto3Test, SyntheticOneofExtension) {
upb::DefPool defpool;
upb::MessageDefPtr md(upb_test_TestMessage3_getmsgdef(defpool.ptr()));
ASSERT_EQ(md.field_count(), 6);
}
22 changes: 22 additions & 0 deletions upb/proto3_test.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
syntax = "proto3";

package upb.test;

import "google/protobuf/descriptor.proto";

extend google.protobuf.MessageOptions {
optional string my_option = 51235;
}

message MyMessage3 {
option (my_option) = "Hello world!";
}

message TestMessage3 {
optional int32 i32 = 1;
repeated int32 r_i32 = 2;
optional string str = 3;
repeated string r_str = 4;
optional TestMessage3 msg = 5;
repeated TestMessage3 r_msg = 6;
}
13 changes: 9 additions & 4 deletions upb/reflection/field_def.c
Original file line number Diff line number Diff line change
Expand Up @@ -648,10 +648,6 @@ static void _upb_FieldDef_Create(upb_DefBuilder* ctx, const char* prefix,

bool ok = _upb_OneofDef_Insert(oneof, f, name.data, name.size, ctx->arena);
if (!ok) _upb_DefBuilder_OomErr(ctx);
} else if (f->proto3_optional_) {
_upb_DefBuilder_Errf(ctx,
"field with proto3_optional was not in a oneof (%s)",
f->full_name);
}

UBP_DEF_SET_OPTIONS(f->opts, FieldDescriptorProto, FieldOptions, field_proto);
Expand Down Expand Up @@ -694,6 +690,15 @@ static void _upb_FieldDef_CreateNotExt(
_upb_FieldDef_Create(ctx, prefix, field_proto, m, f);
f->is_extension_ = false;

if (!google_protobuf_FieldDescriptorProto_has_oneof_index(field_proto)) {
if (f->proto3_optional_) {
_upb_DefBuilder_Errf(
ctx,
"non-extension field (%s) with proto3_optional was not in a oneof",
f->full_name);
}
}

_upb_MessageDef_InsertField(ctx, m, f);

if (!ctx->layout) return;
Expand Down

0 comments on commit 0f585c6

Please sign in to comment.