Browse Source

[ObjC] Set up a stateless test for the WKTs.

Also wire it into the regeneration script.

PiperOrigin-RevId: 508751290
pull/11908/head
Protobuf Team Bot 1 year ago
committed by Copybara-Service
parent
commit
e2aa06eaa8
3 changed files with 123 additions and 0 deletions
  1. +54
    -0
      objectivec/BUILD.bazel
  2. +68
    -0
      objectivec/defs.bzl
  3. +1
    -0
      regenerate_stale_files.sh

+ 54
- 0
objectivec/BUILD.bazel View File

@ -1,6 +1,60 @@
load("@rules_cc//cc:defs.bzl", "objc_library")
load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
load("@upb//cmake:build_defs.bzl", "staleness_test")
load("//conformance:defs.bzl", "conformance_test")
load(":defs.bzl", "objc_proto_camel_case_name")
# The WKTs have to be checked in to support the CocoaPods and Xcode builds. This
# generule and test ensure the source are current.
#
# TODO: Improve the bazel build so it uses these generated headers so it is
# always current, and only the builds that can't easily build protoc and
# generate the files rely on the checked in ones.
_WELL_KNOWN_TYPES = [
"any",
"api",
"duration",
"empty",
"field_mask",
"source_context",
"struct",
"timestamp",
"type",
"wrappers",
]
_OBJC_WKT_NAMES = [objc_proto_camel_case_name(x) for x in _WELL_KNOWN_TYPES]
_OBJC_EXTS = [
".pbobjc.h",
".pbobjc.m",
]
genrule(
name = "gen_wkt_sources",
srcs = ["//src/google/protobuf:well_known_type_protos"],
outs = ["wkt/GPB" + wkt + ext for wkt in _OBJC_WKT_NAMES for ext in _OBJC_EXTS],
cmd = " && ".join([
"$(execpath //:protoc) --objc_out=$(RULEDIR)/wkt --proto_path=src $(SRCS)",
] + [
"mv $(RULEDIR)/wkt/google/protobuf/" + wkt + ext + " $(RULEDIR)/wkt/GPB" + wkt + ext
for wkt in _OBJC_WKT_NAMES
for ext in _OBJC_EXTS
]),
exec_tools = ["//:protoc"],
)
staleness_test(
name = "well_known_types_staleness_test",
outs = ["GPB" + wkt + ext for wkt in _OBJC_WKT_NAMES for ext in _OBJC_EXTS],
generated_pattern = "wkt/%s",
tags = ["manual"],
)
################################################################################
# Objective-C Runtime Library
################################################################################
objc_library(
name = "objectivec",


+ 68
- 0
objectivec/defs.bzl View File

@ -0,0 +1,68 @@
"""Starlark helpers for Objective-C protos."""
# State constants for objc_proto_camel_case_name.
_last_was_other = 0
_last_was_lowercase = 1
_last_was_uppercase = 2
_last_was_number = 3
def objc_proto_camel_case_name(name):
"""A Starlark version of the ObjC generator's CamelCase name transform.
This needs to track
src/google/protobuf/compiler/objectivec/names.cc's UnderscoresToCamelCase()
NOTE: This code is written to model the C++ in protoc's ObjC generator so it
is easier to confirm that the algorithms between the implementations match.
The customizations for starlark performance are:
- The cascade within the loop is reordered and special cases "_" to
optimize for google3 inputs.
- The "last was" state is handled via integers instead of three booleans.
The `first_capitalized` argument in the C++ code is left off this code and
it acts as if the value were `True`.
Args:
name: The proto file name to convert to camel case. The extension should
already be removed.
Returns:
The converted proto name to camel case.
"""
segments = []
current = ""
last_was = _last_was_other
for c in name.elems():
if c.islower():
# lowercase letter can follow a lowercase or uppercase letter.
if last_was != _last_was_lowercase and last_was != _last_was_uppercase:
segments.append(current)
current = c.upper()
else:
current += c
last_was = _last_was_lowercase
elif c == "_": # more common than rest, special case it.
last_was = _last_was_other
elif c.isdigit():
if last_was != _last_was_number:
segments.append(current)
current = ""
current += c
last_was = _last_was_number
elif c.isupper():
if last_was != _last_was_uppercase:
segments.append(current)
current = c
else:
current += c.lower()
last_was = _last_was_uppercase
else:
last_was = _last_was_other
segments.append(current)
result = ""
for x in segments:
if x in ("Url", "Http", "Https"):
result += x.upper()
else:
result += x
return result

+ 1
- 0
regenerate_stale_files.sh View File

@ -15,6 +15,7 @@ readonly BazelBin="${BAZEL:-bazel} ${BAZEL_STARTUP_FLAGS}"
# Run and fix all staleness tests.
${BazelBin} test src:cmake_lists_staleness_test "$@" || ./bazel-bin/src/cmake_lists_staleness_test --fix
${BazelBin} test src/google/protobuf:well_known_types_staleness_test "$@" || ./bazel-bin/src/google/protobuf/well_known_types_staleness_test --fix
${BazelBin} test objectivec:well_known_types_staleness_test "$@" || ./bazel-bin/objectivec/well_known_types_staleness_test --fix
# Generate C# code.
# This doesn't currently have Bazel staleness tests, but there's an existing


Loading…
Cancel
Save