Skip to content

Commit 1cdbba7

Browse files
dvyukovcopybara-github
authored andcommitted
Provide information about types of all flags.
PiperOrigin-RevId: 717986118 Change-Id: Ib962482b66e1eac09165767d4a36a91ad49e8fc8
1 parent 45dab59 commit 1cdbba7

File tree

8 files changed

+44
-17
lines changed

8 files changed

+44
-17
lines changed

absl/flags/commandlineflag.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
namespace absl {
2525
ABSL_NAMESPACE_BEGIN
2626

27+
absl::string_view CommandLineFlag::TypeName() const { return ""; }
2728
bool CommandLineFlag::IsRetired() const { return false; }
2829
bool CommandLineFlag::ParseFrom(absl::string_view value, std::string* error) {
2930
return ParseFrom(value, flags_internal::SET_FLAGS_VALUE,

absl/flags/commandlineflag.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,13 @@ class CommandLineFlag {
200200
// Checks that flags default value can be converted to string and back to the
201201
// flag's value type.
202202
virtual void CheckDefaultValueParsingRoundtrip() const = 0;
203+
204+
// absl::CommandLineFlag::TypeName()
205+
//
206+
// Returns string representation of the type of this flag
207+
// (the way it is spelled in the ABSL_FLAG macro).
208+
// The default implementation returns the empty string.
209+
virtual absl::string_view TypeName() const;
203210
};
204211
#if defined(__GNUC__) && !defined(__clang__)
205212
#pragma GCC diagnostic pop

absl/flags/flag.h

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -204,12 +204,14 @@ ABSL_NAMESPACE_END
204204

205205
#if ABSL_FLAGS_STRIP_NAMES
206206
#define ABSL_FLAG_IMPL_FLAGNAME(txt) ""
207+
#define ABSL_FLAG_IMPL_TYPENAME(txt) ""
207208
#define ABSL_FLAG_IMPL_FILENAME() ""
208209
#define ABSL_FLAG_IMPL_REGISTRAR(T, flag) \
209210
absl::flags_internal::FlagRegistrar<T, false>(ABSL_FLAG_IMPL_FLAG_PTR(flag), \
210211
nullptr)
211212
#else
212213
#define ABSL_FLAG_IMPL_FLAGNAME(txt) txt
214+
#define ABSL_FLAG_IMPL_TYPENAME(txt) txt
213215
#define ABSL_FLAG_IMPL_FILENAME() __FILE__
214216
#define ABSL_FLAG_IMPL_REGISTRAR(T, flag) \
215217
absl::flags_internal::FlagRegistrar<T, true>(ABSL_FLAG_IMPL_FLAG_PTR(flag), \
@@ -261,16 +263,17 @@ ABSL_NAMESPACE_END
261263
// Note: Name of registrar object is not arbitrary. It is used to "grab"
262264
// global name for FLAGS_no<flag_name> symbol, thus preventing the possibility
263265
// of defining two flags with names foo and nofoo.
264-
#define ABSL_FLAG_IMPL(Type, name, default_value, help) \
265-
extern ::absl::Flag<Type> FLAGS_##name; \
266-
namespace absl /* block flags in namespaces */ {} \
267-
ABSL_FLAG_IMPL_DECLARE_DEF_VAL_WRAPPER(name, Type, default_value) \
268-
ABSL_FLAG_IMPL_DECLARE_HELP_WRAPPER(name, help) \
269-
ABSL_CONST_INIT absl::Flag<Type> FLAGS_##name{ \
270-
ABSL_FLAG_IMPL_FLAGNAME(#name), ABSL_FLAG_IMPL_FILENAME(), \
271-
ABSL_FLAG_IMPL_HELP_ARG(name), ABSL_FLAG_IMPL_DEFAULT_ARG(Type, name)}; \
272-
extern absl::flags_internal::FlagRegistrarEmpty FLAGS_no##name; \
273-
absl::flags_internal::FlagRegistrarEmpty FLAGS_no##name = \
266+
#define ABSL_FLAG_IMPL(Type, name, default_value, help) \
267+
extern ::absl::Flag<Type> FLAGS_##name; \
268+
namespace absl /* block flags in namespaces */ {} \
269+
ABSL_FLAG_IMPL_DECLARE_DEF_VAL_WRAPPER(name, Type, default_value) \
270+
ABSL_FLAG_IMPL_DECLARE_HELP_WRAPPER(name, help) \
271+
ABSL_CONST_INIT absl::Flag<Type> FLAGS_##name{ \
272+
ABSL_FLAG_IMPL_FLAGNAME(#name), ABSL_FLAG_IMPL_TYPENAME(#Type), \
273+
ABSL_FLAG_IMPL_FILENAME(), ABSL_FLAG_IMPL_HELP_ARG(name), \
274+
ABSL_FLAG_IMPL_DEFAULT_ARG(Type, name)}; \
275+
extern absl::flags_internal::FlagRegistrarEmpty FLAGS_no##name; \
276+
absl::flags_internal::FlagRegistrarEmpty FLAGS_no##name = \
274277
ABSL_FLAG_IMPL_REGISTRAR(Type, FLAGS_##name)
275278

276279
// ABSL_RETIRED_FLAG

absl/flags/flag_test.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,9 +149,9 @@ using uint128 = absl::uint128;
149149
#define DEFINE_CONSTRUCTED_FLAG(T, dflt, dflt_kind) \
150150
constexpr flags::FlagDefaultArg f1default##T{ \
151151
flags::FlagDefaultSrc{dflt}, flags::FlagDefaultKind::dflt_kind}; \
152-
constexpr absl::Flag<T> f1##T{"f1", "file", help_arg, f1default##T}; \
152+
constexpr absl::Flag<T> f1##T{"f1", #T, "file", help_arg, f1default##T}; \
153153
ABSL_CONST_INIT absl::Flag<T> f2##T { \
154-
"f2", "file", \
154+
"f2", #T, "file", \
155155
{flags::FlagHelpMsg(&TestHelpMsg), flags::FlagHelpKind::kGenFunc}, \
156156
flags::FlagDefaultArg { \
157157
flags::FlagDefaultSrc(&TestMakeDflt<T>), \

absl/flags/internal/flag.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,8 @@ void FlagImpl::StoreValue(const void* src, ValueSource source) {
342342

343343
absl::string_view FlagImpl::Name() const { return name_; }
344344

345+
absl::string_view FlagImpl::TypeName() const { return type_name_; }
346+
345347
std::string FlagImpl::Filename() const {
346348
return flags_internal::GetUsageConfig().normalize_filename(filename_);
347349
}

absl/flags/internal/flag.h

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -582,10 +582,12 @@ class FlagState;
582582
#endif
583583
class FlagImpl final : public CommandLineFlag {
584584
public:
585-
constexpr FlagImpl(const char* name, const char* filename, FlagOpFn op,
586-
FlagHelpArg help, FlagValueStorageKind value_kind,
585+
constexpr FlagImpl(const char* name, const char* type_name,
586+
const char* filename, FlagOpFn op, FlagHelpArg help,
587+
FlagValueStorageKind value_kind,
587588
FlagDefaultArg default_arg)
588589
: name_(name),
590+
type_name_(type_name),
589591
filename_(filename),
590592
op_(op),
591593
help_(help.source),
@@ -698,6 +700,7 @@ class FlagImpl final : public CommandLineFlag {
698700

699701
// CommandLineFlag interface implementation
700702
absl::string_view Name() const override;
703+
absl::string_view TypeName() const override;
701704
std::string Filename() const override;
702705
std::string Help() const override;
703706
FlagFastTypeId TypeId() const override;
@@ -731,6 +734,10 @@ class FlagImpl final : public CommandLineFlag {
731734

732735
// Flags name passed to ABSL_FLAG as second arg.
733736
const char* const name_;
737+
738+
// Flags type passed to ABSL_FLAG as first arg.
739+
const char* const type_name_;
740+
734741
// The file name where ABSL_FLAG resides.
735742
const char* const filename_;
736743
// Type-specific operations vtable.
@@ -789,9 +796,9 @@ class FlagImpl final : public CommandLineFlag {
789796
template <typename T>
790797
class Flag {
791798
public:
792-
constexpr Flag(const char* name, const char* filename, FlagHelpArg help,
793-
const FlagDefaultArg default_arg)
794-
: impl_(name, filename, &FlagOps<T>, help,
799+
constexpr Flag(const char* name, const char* type_name, const char* filename,
800+
FlagHelpArg help, const FlagDefaultArg default_arg)
801+
: impl_(name, type_name, filename, &FlagOps<T>, help,
795802
flags_internal::StorageKind<T>(), default_arg),
796803
value_() {}
797804

absl/flags/internal/private_handle_accessor.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@ bool PrivateHandleAccessor::ParseFrom(CommandLineFlag& flag,
5959
return flag.ParseFrom(value, set_mode, source, error);
6060
}
6161

62+
absl::string_view PrivateHandleAccessor::TypeName(const CommandLineFlag& flag) {
63+
return flag.TypeName();
64+
}
65+
6266
} // namespace flags_internal
6367
ABSL_NAMESPACE_END
6468
} // namespace absl

absl/flags/internal/private_handle_accessor.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ class PrivateHandleAccessor {
5252
static bool ParseFrom(CommandLineFlag& flag, absl::string_view value,
5353
flags_internal::FlagSettingMode set_mode,
5454
flags_internal::ValueSource source, std::string& error);
55+
56+
// Access to CommandLineFlag::TypeName.
57+
static absl::string_view TypeName(const CommandLineFlag& flag);
5558
};
5659

5760
} // namespace flags_internal

0 commit comments

Comments
 (0)