Try to move towards the Google style guide declaration order. (#221)

This patch tries to make everything adhere to the Google declaration
order. This is tricky as there doesn't appear to be a `clang-tidy` check
that helps us here at all.

One of the complex cases are the `enum`-wrapping classes we use. These
need to have a *public* conversion operator to the nested `enum` type to support
`switch` statements and the like. However, this makes it impossible to
fully respect the Google declaration order. We need to define the enum
type before the public API in order to use it in contexts like the
conversion operator. Even defining out-of-line won't help avoid this. It
is weird to have a type in the public API that is private, but again
this is only intended to be used for implicit conversions within
a `switch` statement or a `case` label. In one case, we had the
non-conforming order of declaration. I've added a comment to explain why
there. In the other case, the conversion operator is actually *private*
rather than public, which doesn't actually work in practice. I've made
this public and moved the declaration order to match with a matching
comment.
This commit is contained in:
Chandler Carruth
2020-12-08 15:35:26 -08:00
committed by GitHub
parent 03f77d7b25
commit c3d951599d
6 changed files with 38 additions and 34 deletions
+10 -8
View File
@@ -24,6 +24,13 @@ namespace Carbon {
// member functions. These instances are designed specifically to be usable in
// `case` labels of `switch` statements just like an enumerator would.
class ParseNodeKind {
// Note that this must be declared earlier in the class so that its type can
// be used, for example in the conversion operator.
enum class KindEnum : uint8_t {
#define CARBON_PARSE_NODE_KIND(Name) Name,
#include "parser/parse_node_kind.def"
};
public:
// The formatting for this macro is weird due to a `clang-format` bug. See
// https://bugs.llvm.org/show_bug.cgi?id=48320 for details.
@@ -47,20 +54,15 @@ class ParseNodeKind {
// Gets a friendly name for the token for logging or debugging.
[[nodiscard]] auto GetName() const -> llvm::StringRef;
private:
enum class KindEnum : uint8_t {
#define CARBON_PARSE_NODE_KIND(Name) Name,
#include "parser/parse_node_kind.def"
};
constexpr explicit ParseNodeKind(KindEnum k) : kind(k) {}
// Enable conversion to our private enum, including in a `constexpr` context,
// to enable usage in `switch` and `case`. The enum remains private and
// nothing else should be using this.
// NOLINTNEXTLINE(google-explicit-constructor)
constexpr operator KindEnum() const { return kind; }
private:
constexpr explicit ParseNodeKind(KindEnum k) : kind(k) {}
KindEnum kind;
};