mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-27 22:02:33 +01:00
Most of these were fixed automatically (including things like adding `[[nodiscard]]` and such). A number of others required manual edits. I think all of them were pretty nice improvements. There were a few places where the issues really stem from external constraints and I've disabled the checks: GoogleTest macros or the specific LibFuzzer entry points. The only other places I disabled are the implicit conversions to a private `enum` in the classes wrapping those `enum`s. These implicit conversions are necessarily implicit to serve their only purpose: enabling their use in `switch` statements and `case` labels. When these were highlighted, it showed that one of these was actually converting to an *`int`*. I've switched that to use the private `enum` instead as doing so is important to enable warnings on non-covering `switch` statements over than `enum`. And indeed, there is a `switch` that was was implicitly relying on falling through in this way, so I've added the explicit documentation of the intentional pattern to address that warning. Sorry this is so large, all of this somewhat fell out of enabling the `clang-tidy` checks. If it is too difficult to review as lump, I can work on breaking it apart as needed. Just let me know.
73 lines
2.5 KiB
C++
73 lines
2.5 KiB
C++
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
|
|
// Exceptions. See /LICENSE for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
|
|
#ifndef PARSER_PARSE_NODE_KIND_H_
|
|
#define PARSER_PARSE_NODE_KIND_H_
|
|
|
|
#include <cstdint>
|
|
#include <iterator>
|
|
|
|
#include "llvm/ADT/StringRef.h"
|
|
|
|
namespace Carbon {
|
|
|
|
// A class wrapping an enumeration of the different kinds of nodes in the parse
|
|
// tree.
|
|
//
|
|
// Rather than using a raw enumerator for each distinct kind of node produced by
|
|
// the parser, we wrap the enumerator in a class to expose a more rich API
|
|
// including bidirectional mappings to string spellings of the different kinds
|
|
// and any relevant classification.
|
|
//
|
|
// Instances of this type should always be created using the `constexpr` static
|
|
// member functions. These instances are designed specifically to be usable in
|
|
// `case` labels of `switch` statements just like an enumerator would.
|
|
class ParseNodeKind {
|
|
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.
|
|
#define CARBON_PARSE_NODE_KIND(Name) \
|
|
static constexpr auto Name()->ParseNodeKind { \
|
|
return ParseNodeKind(KindEnum::Name); \
|
|
}
|
|
#include "parser/parse_node_kind.def"
|
|
|
|
// The default constructor is deleted as objects of this type should always be
|
|
// constructed using the above factory functions for each unique kind.
|
|
ParseNodeKind() = delete;
|
|
|
|
auto operator==(const ParseNodeKind& rhs) const -> bool {
|
|
return kind == rhs.kind;
|
|
}
|
|
auto operator!=(const ParseNodeKind& rhs) const -> bool {
|
|
return kind != rhs.kind;
|
|
}
|
|
|
|
// 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; }
|
|
|
|
KindEnum kind;
|
|
};
|
|
|
|
// We expect the parse node kind to fit compactly into 8 bits.
|
|
static_assert(sizeof(ParseNodeKind) == 1, "Kind objects include padding!");
|
|
|
|
} // namespace Carbon
|
|
|
|
#endif // PARSER_PARSE_NODE_KIND_H_
|